/install flux-kanban-agent
Flux
Flux is a kanban board management platform. Use this skill to build automations, manage cards, and organize work through the Flux REST API.
Setup
FLUX_API_KEY(required) — an API key beginning withflux_. Every request is authenticated with it.FLUX_BASE_URL(optional) — the origin of the Flux instance, e.g.https://flux.umin.ai. Defaults tohttps://flux.umin.ai.
Authentication
Send the key as a Bearer token on every request:
Authorization: Bearer flux_YOUR_KEY
API keys carry granular scopes, so a request may succeed for reads but be rejected for
writes if the key lacks the scope. A 401 means the key is missing or invalid; a 403
means the key is valid but not permitted for that action.
Core concepts
- Active workspace — most board/card endpoints operate on the active workspace tied
to the key. List workspaces with
GET /api/workspaces, change it withPOST /api/workspaces/switch. - Two ID formats — boards accept either a UUID or a short URL id (
shortId, e.g.av-tX6qQ). Cards have an internal UUID and a human id (humanId, e.g.TB-1) used in URLs. Use the UUID for write operations unless an endpoint says otherwise. - Cache key gotcha — a board is keyed by its
shortId, not bycard.boardId(which is a UUID). Don't assume the two are interchangeable when matching a card to its board. - Soft deletes — every
DELETEis reversible. Deleted records are hidden, not destroyed, and can be restored viaPOST /api/undo. - Idempotency — include
X-Idempotency-Key: \x3Cuuid>on every write (POST/PATCH/PUT/ DELETE). On retry, Flux returns the original result instead of duplicating the action. - Dates — all timestamps are ISO 8601.
Endpoints
Workspaces
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | /api/workspaces |
— | List your workspaces → { workspaces: [{ id, name, slug }] } |
| POST | /api/workspaces |
{ name } |
Create a workspace |
| POST | /api/workspaces/switch |
{ workspaceId } |
Set the active workspace |
Boards
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | /api/boards |
— | Boards in the active workspace → { boards: [{ id, shortId, title, columns }] } |
| GET | /api/boards/all |
— | Boards across all workspaces |
| POST | /api/boards |
{ title, workspaceId? } |
Create a board |
| GET | /api/boards/{boardId} |
accepts shortId or UUID | Full board → { board, cards: { [cardId]: card }, boardLabels, members } |
| PATCH | /api/boards/{boardId} |
{ title?, settings?, doneColumnId? } |
Update a board |
| DELETE | /api/boards/{boardId} |
— | Soft-delete a board |
Columns
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | /api/columns |
{ boardId, title } |
Create a column |
| PATCH | /api/columns |
{ columnId, title?, isDone? } |
Update a column |
| DELETE | /api/columns?columnId={id} |
— | Delete a column |
| PUT | /api/columns/reorder |
{ boardId, columnIds: [ordered UUIDs] } |
Reorder columns |
Cards
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | /api/cards |
{ boardId, columnId, title, description? } |
Create a card |
| PATCH | /api/cards |
{ cardId, title?, description?, columnId?, assignees?, dueDate?, coverUrl?, archivedAt? } |
Update a card. assignees is an array of user IDs and replaces the whole set. |
| DELETE | /api/cards?cardId={id} |
— | Soft-delete a card |
| GET | /api/cards/{cardId} |
— | Full detail: checklist, comments, attachments, labels, assignees |
| PUT | /api/cards/reorder |
{ boardId, moves: [{ cardId, columnId, position }] } |
Move/reorder cards |
Card sub-resources
Checklist
| Method | Path | Body / Query |
|---|---|---|
| POST | /api/cards/{cardId}/checklist |
{ text } |
| PATCH | /api/cards/{cardId}/checklist |
{ itemId, text?, done?, position? } |
| DELETE | /api/cards/{cardId}/checklist?itemId={id} |
— |
Comments
| Method | Path | Body / Query |
|---|---|---|
| POST | /api/cards/{cardId}/comments |
{ content, parentId? } |
| PATCH | /api/cards/{cardId}/comments |
{ commentId, content } |
| DELETE | /api/cards/{cardId}/comments?commentId={id} |
— |
Labels on a card (toggle a board-level label onto the card)
| Method | Path | Body / Query |
|---|---|---|
| POST | /api/cards/{cardId}/labels |
{ labelId } |
| DELETE | /api/cards/{cardId}/labels?labelId={id} |
— |
Attachments
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | /api/cards/{cardId}/attachments/upload-url |
{ fileName, mimeType } |
Returns a presigned S3 upload URL |
| POST | /api/cards/{cardId}/attachments |
{ fileName, fileUrl, s3Key?, mimeType? } |
Register the attachment after uploading |
| DELETE | /api/cards/{cardId}/attachments?attachmentId={id} |
— | Delete an attachment |
Labels (board-level definitions)
| Method | Path | Body / Query |
|---|---|---|
| POST | /api/boards/{boardId}/labels |
{ text, color } |
| PATCH | /api/boards/{boardId}/labels |
{ labelId, text?, color? } |
| DELETE | /api/boards/{boardId}/labels?labelId={id} |
— |
Search & undo
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | /api/search?q={query}&workspaceId={id?}&type={card|board?} |
— | Full-text search |
| POST | /api/undo |
{ boardId } |
Undo the last action on a board |
Common workflows
Create a card on a board
GET /api/boards— find the board by title, note itsshortId.GET /api/boards/{shortId}— readboard.columnsto pick the targetcolumnId.POST /api/cardswith{ boardId, columnId, title }.
Move a card to another column
GET /api/boards/{shortId}— find the source/targetcolumnIds and the card.PUT /api/cards/reorderwith{ boardId, moves: [{ cardId, columnId, position: 0 }] }(position: 0drops it at the top of the target column).
Assign members to a card
GET /api/boards/{shortId}— the responsemembersarray lists user IDs.PATCH /api/cardswith{ cardId, assignees: [userId1, userId2] }. Assignees are replaced wholesale — send the full desired list, not a delta. Note: the write field isassignees; board reads expose the same data asassigneeIds. SendingassigneeIdsto PATCH is silently ignored and returns422 "No updates provided".
Add a label to a card
GET /api/boards/{shortId}— the responseboardLabelsarray lists label IDs. (Create the label first withPOST /api/boards/{boardId}/labelsif it doesn't exist.)POST /api/cards/{cardId}/labelswith{ labelId }.
Notes & gotchas
- Always send
X-Idempotency-Key: \x3Cuuid>on writes to make retries safe. - All deletes are soft and reversible via
POST /api/undo. - Board IDs accept both UUID and
shortId; card IDs have a UUID and ahumanId(TB-1). - Resolve a board's columns and labels before creating or moving cards — you need their
IDs from
GET /api/boards/{shortId}. - A
403on a write usually means the API key lacks the required scope, not that the resource is missing.
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install flux-kanban-agent - After installation, invoke the skill by name or use
/flux-kanban-agent - Provide required inputs per the skill's parameter spec and get structured output
What is Flux Board?
Manage Flux kanban boards, cards, columns, and labels through the Flux REST API. Create and move cards, assign members, toggle labels, search, and build boar... It is an AI Agent Skill for Claude Code / OpenClaw, with 33 downloads so far.
How do I install Flux Board?
Run "/install flux-kanban-agent" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Flux Board free?
Yes, Flux Board is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Flux Board support?
Flux Board is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Flux Board?
It is built and maintained by uminai (@uminai-dev); the current version is v1.0.0.