F5 StudioF5 Studio
Skip to main content

Features

F5 Board is a full corkboard / chalkboard / whiteboard system with in-world placement, multi-tool editor, ownership and sharing, public-edit toggle, per-board editor whitelist, preview camera, blip map system, and an admin panel.

Board Types

Nine board variants ship out of the box, grouped by visual style:

VariantUse case
Cork boardClassic detective / investigation board — notes, photos, red strings
Chalkboard (wall + standing)Briefings, meetings, school RP
Planning boards (3 variants)Project planning, ops briefings, gang strategy
Whiteboard / Grey / BrownOffice, mechanic shop, courtroom, anywhere clean

All variants share the same editor and feature set — only the visual background and prop model differ.

Placement Flow

  1. Player uses a board item from the inventory, or opens /board and selects a model.
  2. The placer opens — a ghost preview attached to the player's aim.
  3. Player positions, rotates and adjusts depth, then confirms.
  4. The board spawns in-world for all players within Config.SyncRadius.
  5. A modal pops up asking for a name for the new board (used on the blip and in the admin panel).

Placer Controls

ActionDefault key
Move / aimMouse
RotateScroll wheel
Depth (push forward/back)Alt + scroll
Height (up/down)↑ / ↓
Slide sideways← / →
Toggle snap to surfaceF
Toggle 15° rotation snapG (configured but bound internally)
Reset rotationR
PlaceMouse Left
CancelMouse Right

Controls are fully remappable — see Config.Controls.ids in Configuration.

Snap to Surface

When F is toggled on, the board automatically aligns to whatever surface it's pointed at (wall, floor, vehicle). When off, the player keeps full free rotation.

Snap to 15°

When 15° snap is on, rotation locks to 15-degree increments — useful for clean wall alignment.

Editor

The editor opens when the owner (or any whitelisted editor, or anyone if public edit is on) selects Edit board from the target menu.

Inside the editor the player has six tools:

ToolHotkeyWhat it does
Select(cursor)Move, resize, rotate, edit existing notes
Add note(toolbar)Create a sticky note (text, formatted)
Add image(toolbar)Create an image note from a URL
Connect(toolbar)Draw a string between two notes
Draw(toolbar)Freehand drawing with 6 brush styles
Erase(toolbar)Remove individual strokes

Sticky Notes

A note is a small movable card with formatted text content. Each note supports:

PropertyRange
ContentRich text — bold, italic, underline, bullet & numbered lists
Font familySans, serif, monospace, handwritten
Font sizeSmall, default, large, extra-large
Color (background)Yellow, blue, pink, green, white
PositionAnywhere on the board (UV coordinates)
SizeResizable, with optional auto-fit width
RotationAny angle

Keyboard shortcuts inside the note modal:

ShortcutAction
Ctrl + EnterSave
EscCancel
Ctrl + B / I / UBold / Italic / Underline

Image Notes

A special note variant that displays an image from a URL (http:// / https://).

The server pre-fetches each image URL once and ships it inline (base64) to other clients — this avoids CORS issues in the offscreen NUI render and works behind game-network restrictions. See Webhooks → Image Cache for the cache settings.

Connecting Strings

The "Connect" tool draws a line between two notes — the classic red-string detective look.

PropertyNotes
ColorPer-string (default red), free hex picker
LabelOptional center-text label (e.g. "alibi", "lie")
EndpointsSnap to note centers; follow notes when notes are moved

Drawing

Six brush styles:

BrushLook
MarkerThick, solid stroke (default)
PencilThin, soft line
SprayScattered dots
HighlighterTranslucent, wide line
CalligraphyVariable width — thicker on direction change
NeonGlowing line with soft halo

Per-brush options:

OptionRange
ColorFull hex picker with hue + saturation/brightness picker
Size0.001..0.05 (UV units)

Erasing

The eraser has two modes:

  • Partial erase — removes only the portion of the stroke under the cursor.
  • Whole-stroke erase — touching any part removes the entire stroke.

Eraser size is adjustable. The erase brush is throttled and batches deletions to keep network traffic low even on heavy boards.

Undo / Redo

Every editor action is fully undo/redo-able within the session:

ActionUndoable
Create / edit / move / remove noteYes
Create / edit / remove stringYes
Draw / erase strokeYes

Undo history is per-session and per-player — closing the editor clears it.

Ownership & Sharing

Every board has an owner (the citizen ID of the player who placed it). The owner gets a private set of target options:

OptionOwnerWhitelisted editorPublic-edit onStranger
Preview
Edit board
Rename
Toggle public edit
Manage editors✓ (only when public edit OFF)
Move board
Collect board

Public Edit

The owner can flip "Public edit" on — anyone within edit range can then open the editor and modify content. Switching back to off doesn't wipe anyone's work; it just removes their ability to edit going forward.

When public edit is off, the per-board editor whitelist is the way to grant access selectively.

Editor Whitelist

Owner picks Manage editors to open a modal that shows:

  • Players nearby — everyone within Config.Editors.nearbyRadius (default 10 m) that doesn't already have access.
  • With edit access — citizens who currently have a whitelist entry on this board.

Click "+" to grant, "×" to revoke. Maximum Config.Editors.maxPerBoard (default 10) editors per board.

Granted players get a notification:

You were granted edit access to board "X"

Revoked players get:

Your edit access to board "X" was revoked

The whitelist persists in the database (f5_board_editors table) — it survives restarts and player disconnects.

Why the toggle hides editors

"Manage editors" is hidden while public edit is ON because public edit overrides the whitelist — every nearby player can edit anyway. Turn public edit OFF to fall back to whitelist mode.

Renaming

The owner can rename the board at any time. The new name is reflected on the blip immediately for all online players. Renames are audit-logged (see Webhooks).

Moving

The owner can pick up the board and re-place it without losing content. Limits:

LimitDefaultConfigurable
Distance from player to original board to start a move5.0 mConfig.Move.maxDistFromOriginal
Distance from player to new placement point12.0 mConfig.Move.maxPlacementRange

The placer re-opens with the same board model. All notes, strings and drawings stay attached.

Collecting (Pickup)

The owner picks Collect board to remove the board from the world. The placement, notes, strings, strokes and editor whitelist are wiped from the database (cascade delete). The board item is refunded to the owner's inventory (one of the matching catalog item) — so collecting is a "pick it back up" action, not "destroy".

Force-removal via the admin panel (/badmin) does not refund the item — only the owner's voluntary collect does.

Preview Camera

The "Look at board" target option opens a smooth close-up camera view of the board, framed to fit the surface. Useful when:

  • The board is on a wall too high to read normally.
  • You want a clean screenshot of the content (no editor UI).
  • A non-editor wants to read the board without taking up an edit slot.

Press Esc / Backspace / Mouse Right to exit.

Map Blips

Every placed board gets a minimap blip:

  • Sprite: Config.BlipSprite (default 793 — a pinpoint sprite)
  • Color: random from Config.BlipPalette. The server prefers an unused color per owner, falling back to a wrap when the palette is exhausted.
  • Label: the board's name (set during placement, editable via Rename).
  • Display mode: Config.BlipDisplay (default 4 = map + minimap).

Blips spawn / despawn / update for all players in real time as boards are added, renamed, moved or collected.

Performance Architecture

A few things you probably want to know:

  • Spatial grid for sync: server broadcasts board events only to players in the same / adjacent 200 m grid cells. Adding more boards on the map does not increase per-tick server cost.
  • DUI render gate: each board's content is only drawn when the player is within Config.Dui.renderRadius (25 m). Beyond fadeBandEnd the prop is rendered without content.
  • Stroke batching: drawing fast packs many strokes into one network message (within StrokeBatchWindowMs), then enforces a cooldown.
  • Mutation cooldown: 150 ms minimum between any two content mutations per player to prevent spam from a misbehaving client.
  • Idle DUI sleep: boards that haven't been observed for Config.Dui.idleTimeoutMs (30 s) deactivate their offscreen render and free VRAM.

All limits are enforced server-side — a tampered client cannot bypass MaxNotesPerBoard, MaxBoardsPerPlayer, the edit distance, the whitelist, or the public-edit setting.

Admin Panel

The /badmin command opens the admin panel:

  • Map view — pan and zoom the world map; double-click a pin to open the corresponding board's preview.
  • Board list — left-side filterable list, search by owner name.
  • Preview — static render of the board content + owner details (name, citizen ID, source, Steam ID, Discord ID), online/offline status, model, coords.
  • Teleport — admin teleports in front of the board.
  • Delete one — confirms, then permanently removes the board and its content.
  • Delete all — double-confirms (with a count), then wipes every board on the server. Server-wide despawn is synchronized.

Every admin delete fires the delete webhook event with the admin: true flag, so the audit trail records who deleted what.

Discord Audit Trail

Four events are logged to Discord webhooks:

EventTrigger
createBoard placed
renameBoard renamed by owner
editEditor session ended with at least one mutation — embed includes a screenshot of the final state
deleteBoard collected by owner OR force-removed by admin

Each event embed includes player name + citizen ID + Steam + Discord, coords + street + zone, and the board's name and model. See Webhooks.

See Also