Kanban

Perth.kanban — Function
Perth.kanban(; port = 8150, share = false, host = nothing,
             open_browser = true, data_dir = nothing) -> String

Start the collaborative kanban board and (optionally) open it in your browser. Returns the URL. Stop it with Perth.kanban_stop.

By default only this machine can open the board, like Perth.run. Pass share = true to let other machines on the local network open the same board: every change (dragging a card, editing, renaming a column) is broadcast live over a WebSocket, and each connected machine shows up as a labelled cursor with its name and IP address — pair-programming style.

Sharing is a live switch, not a startup-only decision: turn it on and off with the board running via kanban_share! or the UI (Board → Share / QR…). To that end the socket binds to 0.0.0.0 and every connection is checked against the current setting — with sharing off, requests from other machines are refused with 403. Pass host to bind a fixed address instead (which disables the live switch).

The board is a single shared entity, persisted as kanban.json in the Perth data directory (data_dir overrides it). The REPL operates on the same data: kanban_add_card!, kanban_move_card!, kanban_remove_card! and kanban_cards — REPL edits appear live in every connected browser.

Warning

With share = true there is no authentication: anyone on the local network who knows the port can edit the board. Never expose the port to the internet.

source
Perth.kanban_share! — Function
kanban_share!(on = true) -> Bool

Turn network sharing on or off on the running kanban server, live — no restart, no Perth.kanban_stop. With sharing on, other machines on the local network can open the same board (see Perth.kanban); with it off, only this machine can, and remote browsers already connected are disconnected immediately.

The same switch is in the UI (Board → Share / QR…), available only from the machine running the server. Sharing can only be toggled when the server was started without an explicit host.

source
Perth.kanban_key! — Function
kanban_key!(key = "") -> Bool

Set (or drop, with "") the access key of the running kanban board, live — no restart, no Perth.kanban_stop. Returns whether a key is required from now on. Twin of Perth.key! for the board: machines on the network must send the key (the links Perth prints carry it), the machine running the server never needs it, and changing it disconnects everyone on the network, who are then asked for the new key on screen. Dropping the key disconnects nobody.

The same control is in the UI (Board → Share / QR…), available only from the machine running the server.

source
Perth.kanban_add_card! — Function
kanban_add_card!(column, text) -> String

Add a card to column (id or name, case-insensitive) and return its id. Connected browsers update live.

source
Perth.kanban_move_card! — Function
kanban_move_card!(card_id, column; index = nothing) -> Bool

Move a card to column (id or name). index is 1-based within the target column; omit it to append at the end. Connected browsers animate the move.

source
Perth.kanban_cards — Function
kanban_cards() -> Vector{NamedTuple}

All cards on the shared kanban board as (column, id, text) rows — Tables.jl-compatible, so kanban_cards() |> DataFrame just works.

source
Perth.kanban_columns — Function
kanban_columns() -> Vector{NamedTuple}

Columns of the shared kanban board as (id, name, cards) rows.

source
Perth.kanban_from_project! — Function
kanban_from_project!(project; replace = false) -> Int

Populate the active kanban board from a Gantt Project (or a project name/id), creating one card per leaf task in backlog, doing or done according to its progress (0 / 1–99 / 100). Cards are linked to their tasks: dragging a linked card into the done column (or ticking it done) sets the task's progress to 100 in the Gantt — live, on every connected browser — and dragging it out reopens it.

Tasks that already have a linked card on the board are skipped, so the function is idempotent; pass replace = true to remove previously linked cards first. Returns the number of cards created.

The link holds across boards: editing a task in the Gantt updates its card even when that card sits on a board nobody has open — the board file is rewritten in place. Switching boards is not a way to lose the mirror.

source
Perth.kanban_board! — Function
kanban_board!(name) -> String

Switch the active board — for every connected browser at once (the board is one shared space, like a TV channel). Creates the board on first use. Also available in the UI (Board → Boards…) to the host.

source
Perth.kanban_boards — Function
kanban_boards() -> Vector{String}

Names of the boards found in the Perth data directory (plus the active one). Switch with kanban_board! or Perth.kanban("name").

source
Perth.kanban_alias! — Function
kanban_alias!(ip, name) -> Bool

Set the display name for a machine, keyed by its IP address — the host-side rename ("192.168.0.23" → "Paulo"). The mapping applies everywhere the machine appears: cursors, presence chips and the card creator stamp. Pass an empty name to remove the alias. Also available in the UI, but only to the browser running on the server machine.

source
Perth.kanban_log — Function
kanban_log(; limit = 50) -> Vector{NamedTuple}

Latest activity on the shared kanban board as (at, by, text) rows, newest first — every add, move, edit, completion, archive and rename, with the actor's IP (or "repl"). Tables.jl-compatible.

source
Perth.kanban_reset! — Function
kanban_reset!() -> Bool

Wipe the shared kanban board back to the default empty columns (backlog / doing / done), clearing cards and the archive. Host aliases survive — they describe machines, not cards. The reset is broadcast live and recorded in the activity log. Also available in the UI (Board → Reset board…) on the host machine only.

source