Features
A plain Kanban board. An AI agent that works the cards inside a container on your machine. Everything else is in service of those two.
Each card has a short version and a full one. The full one names every surface the feature exists on: the desktop app, a browser on your network, the cloud board in a browser, and your phone. Where it says "via desktop", the control is on every surface and works while your desktop is online.
The board
Six columns
Planning, To Do, In Progress, Done, Blocked, Canceled. Drag a card to To Do and the agent picks it up.
How it works
Every task has one status. Planning holds tasks not yet ready to run, including tasks a run split off and tasks waiting on a review. To Do is the queue. In Progress is a running task or one paused on a question. Done, Blocked and Canceled are terminal. A move is the same operation on every surface. On a phone each column is a full-width page and a rail moves a card across columns.
Plain-language cards
Write the task the way you would tell a colleague. Markdown renders on the card.
How it works
Title and description are Markdown, rendered as elements rather than raw HTML, so pasted text cannot inject markup. The description is re-read by the agent on every turn of a run, so it should be self-contained. Lists, headings, code blocks and tables render.
Task numbers
Every task is #1, #2, #3 within its project. The same number on every device.
How it works
Numbers are per project and are what a mention like @#42 refers to. They stay the same on the desktop, the cloud and the phone. Search accepts a number.
Mentions
Type @#12 to point at a task, @~3 at a note, @/src/auth.ts at a file. The agent reads what you point at.
How it works
Seven forms. @#n a task, expanded into the prompt. @!id a notification. @~n a note. @=n an earlier chat conversation, in chat only. @:name a named knowledge area. @/path/file a file read from the project container. @/path/ a directory, listed but not read. A task mention also declares a prerequisite: your task waits until that one is Done.
Ordering without a graph
Mention a task and yours waits for it. The order is a chip on the card, visible and deletable.
How it works
A @#id mention in a task's title or description means it cannot start until that task is Done. Blocked does not count. When the chat proposes several tasks it declares their order the same way, so a suggested order is never a hidden rule.
Search and filters
Search by text or number. Show or hide closed tasks.
How it works
The filter bar searches the selected project's tasks and offers a visibility filter. Closed tasks are kept, never deleted. Cards can be multi-selected for batch moves.
Comments, questions, answers
The agent asks in the comments when it needs a decision. Answer from any device and a new run starts with your answer.
How it works
A question from the agent is a comment on the task. While it is unanswered the task is waiting on you, the queue will not start it, and it cannot be dragged to To Do. Answering puts the task back in To Do, and the next run receives the question and your answer. Things the agent could not do itself arrive as action comments with a flag that clears when you move the card.
Attachments, screenshots, drawings, photos
Paste an image, drop a file, screenshot the bug and circle it, sketch a layout, or take a photo.
How it works
Images, plain text and data files, source code and web files attach to a task or a comment and are passed to the run. Documents, executables, archives and media are refused unless the machine running the app is set to allow them. Source and markup files are served as plain text. On the desktop a screenshot button opens a paint editor for annotation, a paint modal draws shapes, arrows and text with a colour picker, and a camera modal takes a photo with a live preview. On the cloud, attachments are part of the Pro and Max plans and the trial, up to each plan's storage. The local desktop board is not gated.
Dictation
Speak your prompt into the chat or a note. Read what was heard. Press Enter.
How it works
Speech to text runs locally on the desktop, in the chat composer and the note editor. Audio never leaves the device and there is no cloud relay. Dictation never sends by itself. A recording can be up to 2 minutes and stops by itself at the limit. English only. It works in the desktop app and in a browser at its localhost address, not from another device on your network, the cloud board or a phone.
Notes
Free text beside the board. Not a task, not a chat. Readable on your phone with the desktop asleep.
How it works
Per-project notes with a title taken from the first line. Mentionable as @~n. They sync and have no AI attached, so they cost nothing and need no container.
Appearance, time, accessibility
Light, dark or system. 24-hour time by default. Works with a screen reader.
How it works
The theme is per device and restyles the desktop window and its LAN browsers live. Time and date format are account settings that sync. Every icon-only control carries a label. Timestamps are stored in UTC and formatted only on screen.
Projects and containers
A project is a repo or a folder with its own container
Point it at a repository or start fresh. The project gets a Docker container with the tools it needs.
How it works
A project holds a local path or a git URL, its AI settings, environment variables, ports, scripts and a generated Dockerfile and Compose file. The desktop builds and starts the container. A project created from the cloud board syncs to the desktop, which writes the Docker files, and the container can then be started from the browser. Creating one is a short wizard with tabs for Project Info, AI instructions, AI Auth, AI Roles, Environment Variables, Ports, Scripts, Containers, Docker Compose and Dockerfiles.
Generated Docker files, editable
No Dockerfile needed. Pick a base image and the app writes the rest. Edit it if you want.
How it works
The generated Dockerfile starts from Ubuntu 26.04 by default, with Ubuntu 24.04 and Debian 13 offered. A hand-edited Dockerfile or Compose file is used as written. The app still applies its rules on top: ports bound to localhost unless marked LAN, the startup script, the gVisor runtime on Linux where it is installed, the memory cap and the project's own network.
CPU architecture
Containers follow your machine. Pin one when a dependency needs it.
How it works
Containers are built for the Docker daemon's architecture by default, arm64 on Apple silicon and x64 on a PC. A project may pin an architecture, which syncs. On the other kind of machine it runs emulated, slower and never under gVisor. Combinations that cannot work are refused before a build starts.
Memory cap
Containers get a sensible RAM limit so your machine stays responsive. Change it or leave it automatic.
How it works
Automatic by default, derived from the host's total memory with a reserve kept for the host. A watcher reports a container that keeps dying and restarting, which Docker would otherwise hide.
Ports
Publish a port with a click. The app warns if another project already uses it, even a stopped one.
How it works
Host and container port pairs per project, bound to localhost unless the LAN flag is set, because a Docker-published port bypasses the host firewall. The app warns when another project already claims the port, even a stopped one, and when something on this machine is already using it. Each row after the first is filled with the next number.
Startup script and named scripts
Run your install once when the container starts. Save build and test commands and run them from any device.
How it works
The startup script runs once at container start. Named scripts run inside the container with the same environment a task run gets, stream their output live to the board, and can be run, stopped and tested from the browser and the phone while the desktop is online. A running script keeps going when the app closes, and after a restart the board picks it up again with its stop button and its most recent output. Output is not stored, so the panel has a copy button.
Environment variables
Add secrets once. They are injected when the agent runs and never written to a file. Masked on screen.
How it works
Values are encrypted at rest with AES-256-GCM and injected at the moment the agent's shell starts, never into Docker files. Two flags per variable: write-only, so the value never leaves the server once set, and device-local, so it stays on this machine and does not sync. Task runs, the terminal, scripts and flows all see the same variables.
Key vault
Keep each credential once and link it into projects.
How it works
Account-level credentials linked into projects rather than copied into them. Linking works from a browser or a phone, because the link is a name and not the credential. No screen ever shows a value. The key is used only on the machine that runs the container. A deleted key leaves the link in place so the failure is loud, not silent.
Connected projects
Connect a frontend to its backend. They share a private network and nothing else.
How it works
Each project has its own Docker network, once a project created on an older version has been moved onto it. Connecting two projects creates a pair network between them. The setting syncs. Moving a running project onto its network recreates the container, so it happens on start, restart, rebuild or an explicit move from Settings.
Container terminal
A shell into any project container, from the app, a browser or your phone. Tabs, links, copy and paste.
How it works
An interactive terminal in persistent per-project tabs. From the cloud board and the phone the shell runs on your desktop and is relayed to you. Links in the output open with Ctrl or Cmd click. Sessions end on tab close, End all, shell exit or app close.
Container file browser
Browse the container's folders from the chat composer to pick a file to mention.
How it works
Lists one directory of the project container at a time. Never the host filesystem, which no networked client can browse by design. Says why it cannot list rather than showing an empty folder.
Start, stop, restart, rebuild from anywhere
The container buttons work from the board, the browser and the phone. The button carries the spinner while it works.
How it works
Restart and rebuild recreate the container, which discards uncommitted work in a container-only workspace, and the same confirmation appears on every surface. A failed start is reduced to the one line that matters, such as a port conflict or a build error, and raises one notification that opens the tab holding the fix.
Disk hygiene
Old images are removed as new ones are built. Safe cleanup from Settings.
How it works
Every build removes the image it replaced unless something still uses it. Settings shows Docker disk usage and offers safe prunes only, dangling images and build cache. Deleting a project stops its containers. Destroying it from the recycle bin purges its containers, volumes, networks and images.
Git: clone, credentials, identity, pull request link
Give it a repo URL and a key. It clones into the container, commits as you, and offers a pull request link when a run makes a branch.
How it works
The repository is cloned into the container on first start. The credential and the commit identity ride the environment of every run, terminal, script and flow. When a run switched branch or committed, a manual step offers the pull request URL for GitHub, GitLab, Bitbucket or Gitea.
Connect a repository by signing in
Sign in to GitLab instead of pasting a key. The app creates a deploy key for that one repository and forgets the sign-in.
How it works
The sign-in is spent on one call that creates a per-repository deploy key with write access, then discarded. Nothing about the sign-in is stored. The result is an SSH key and SSH URL, the same as a hand-pasted setup. The link can be finished in any browser or on a phone. GitLab only. GitHub users paste a deploy key or a token instead.
gVisor and per-project networks
On Linux with gVisor installed, containers run under it, a second wall between the agent and your kernel.
How it works
With gVisor installed on Linux, project containers run with its runtime, a user-space kernel that intercepts system calls. On macOS and Windows, Docker Desktop's virtual machine provides the isolation and gVisor is not used. Each project is on its own network, once one created on an older version has been moved there.
Let the agent run containers of its own
A database or a test service beside the project, under rules you set.
How it works
Per-project opt-in. The agent reaches Docker only through a policy proxy that allows the sibling containers the agent created on the project's own network, holds them to the same localhost port rule, and refuses everything else. Before a run starts, the app checks that the container can reach the proxy, and pauses the queue with the firewall rule to add if it cannot. On Linux with ufw, that one rule is added under one administrator prompt.
AI providers, models and cost
Claude, OpenAI, Gemini, Grok, or your own hardware
Your own API key for any of the four. Or Ollama, vLLM, llama.cpp and LM Studio on your own machine. No markup, no middleman.
How it works
Runs call each provider's own API with your key, or any OpenAI-compatible server you run, on this machine or another on your network. Each key is stored encrypted and is sent only to its provider. Self-hosted servers are an account-level list with a per-device address, and the app shows whether each one is online. Using a local AI model.
A model per project, overridable per task
Pick a default for the project. Override it on any card.
How it works
Five roles per project each choose a service and model: the task runner, pre-run review, post-run review, chat and flows. A task may override the runner's service and model. Self-hosted lists the server's detected models. Reasoning effort is available per provider and guarded per model.
Cost per run and a budget per project
Every run records tokens, time, cache hits and an estimated cost. Set a budget and the queue pauses when it is reached.
How it works
Accounting records the model that actually served the run as the provider reported it, cache reads, web search and fetch counts, and an estimate from the provider's list price. A per-project spend cap pauses the auto-queue with a banner and a resume control. Review, chat and investigation calls are billed to the same total.
Web search, page reading, and an investigation tool
The agent can search the web, read a page, and send an investigation into the codebase that reports back only what it found.
How it works
Search uses each provider's own web search on Claude, OpenAI and Gemini, and every search is counted in the run's cost. Page reading is available on Claude and Gemini, capped per run. The investigation tool reads the repository and returns its conclusion. Grok has no web search. Full list on what the agent can do.
Enhanced accuracy mode
Higher effort plus a run checklist, per project.
How it works
An opt-in that raises reasoning effort and attaches a whole-run task checklist the model works through. Claude in full, OpenAI in part.
Sized for the model that will run it
The chat proposes fewer, larger tasks on a strong model and more, smaller ones on a weak one, and says which it did.
How it works
Every task starts a fresh run, so the right size depends on the model that will run it. A proposal can also carry a model chosen for that one task, shown on the row with a link back to the project default. One click re-asks for fewer-bigger or more-smaller.
Runs and the queue
The auto-queue
Drag to To Do and walk away. One task at a time per project, in the order you put them.
How it works
Per project. Runs To Do tasks in position order, honouring declared prerequisites and skipping a task that overlaps work a blocked task left half-done. One run per project. When the queue pauses it says why, in a sentence, with a Resume button where a press can fix it: credits, a plan refusal, retries exhausted, a failed task, a firewall block. A rate limit resumes by itself, a cost budget resumes when its spend is reset or raised, and a prerequisite when that task is done. The reason shows in the browser and on the phone too.
Run, retry, stop
Three controls on the card. Stop works from your phone.
How it works
Stop relays to the desktop and the stopped run is archived. A retry is told what the previous attempt did, so it does not assume that work landed. A second manual run while one is going is queued rather than started twice.
Live output and a run timer
Watch the agent work, live, on any device. See how long the run has been going.
How it works
Output streams to every open board. The browser and the phone see the same output. The run's start time is stored, so a reloaded page or a second device shows the true elapsed time.
Every run kept
The output of every run is archived. A retry reads only the latest one. Copy or download any task as Markdown.
How it works
A record per run with outcome, model, output and cost. Older transcripts never reach a model. The review after a run is told only that earlier runs happened and how they ended. Transcript history on the cloud is part of the Pro and Max plans and the trial. The task dialog's copy and download buttons turn a task into one Markdown document with its description, its comments and its last run.
A second model checks the work
Switched on per project. After a run, a reviewer reads what changed against what was asked and leaves a note if something is missing.
How it works
Off by default and enabled per project. The reviewer reads what the run changed and committed against what the task asked, in a separate call. A negative verdict is a comment. It never re-runs anything on its own.
Retries that remember, and that know when to stop
A retry inherits what the last attempt did. A task that cannot succeed stops instead of looping.
How it works
A run that goes back to To Do carries a record of what it did, stated as started rather than succeeded. When a failure repeats, the app judges whether another attempt can help and blocks the task with the reason when it cannot.
Questions, background waits, manual steps
The agent can pause to ask, wait for a long job to finish, or list what only you can do.
How it works
A question pauses the task and holds the queue until you answer. A wait keeps the task's place while the app checks for the awaited result, then runs it again first in line. Manual steps arrive as an action comment with a flag and a notification. A run that ends without saying how it ended is recorded honestly rather than assumed done.
Task breakdown
A big task can split itself into smaller cards, capped so it cannot run away.
How it works
A run may propose new tasks, created in Planning under the original with a per-run and per-family cap, then promoted. Breakdown is flat: a family is a root plus siblings, and opening the root lists every related task.
Nothing installed in secret
Tools a run installs are kept in the project's Dockerfile, whether or not the run reported them.
How it works
A run reports what it installed, and the report is added to the project's Dockerfile with a notification offering the restart that applies it. Every runner also records the commands it actually ran. An install that went unreported is picked out, rewritten for image-build time and added to the Dockerfile as lines to try. The next restart or rebuild builds them, and a build that fails removes them again and tells you. When the commands cannot be rewritten, you get them in an action comment to add yourself.
Is it them or is it us
When a run fails, the provider's status page is checked once and shown beside the error.
How it works
Claude and OpenAI publish machine-readable status. Google's covers a broader service and is shown with that caveat. xAI publishes none. Read once per failure, never polled.
Planning
Pre-run review
Tick "review" when you save a task and a cheap model reads it. Questions arrive as comments. The task saves at once either way.
How it works
Runs after the save, never before it, so it cannot block. Returns ok, questions that hold the queue until answered, a suggested rewrite or a duplicate warning. Costs a small fraction of a run. Per-project review instructions tune both reviewers and never the runner.
Chat to tasks
Talk through what you want. When it is clear, the chat proposes tasks. Approve the ones you want. Nothing is created without you.
How it works
A floating chat per project that does not block the board and can detach into its own window. Everything beyond the base prompt is granted by mentions: @/ lets the chat read the repository through read-only tools, @#n gives it a task's history, @=n an earlier conversation. Proposals carry a size, an effort and an order. From the cloud, conversations are readable with the desktop asleep, and the calls that spend go through the desktop.
AI instructions per project
Your coding standards, deployment rules and what not to touch, prepended to every run.
How it works
A free-text block on the project. Separate review instructions for the two reviewers, because review noise is project-shaped.
Flows
Scheduled steps in plain language
Describe a few steps. A model decides which are code and which need judgement. It runs on a schedule, in the container, guarded.
How it works
A flow is a small graph of steps. An analysis decides which steps can run as plain code, generated once and re-run for free, which need a model, and which only carry data. Generated code runs in the project container. No overlapping runs, a stale analysis blocks the run, per-step and per-run ceilings, disabled by default, and missed windows are never caught up. A run of failures warns you. A flow can also fire when a task reaches Done or Blocked.
Notifications
A bell in the app, a notification on your desktop
Read it anywhere and it clears everywhere.
How it works
Notices for a failed sign-in, a blocked task, a question, a manual step, a container error, a firewall block, a git credential error, a rate limit, a held queue, a task error, an update, a security alert, an account notice, and weak credential storage. They are stored and synced with a read mark. Repeats of the same condition fold into one row. Clicking one opens the task or the project tab that holds the fix. Desktop notifications are a per-device toggle.
Cloud and phone
The whole table of what works where is on Cloud, browser and phone.
Browser access on your network
Turn it on in Settings and open the board from any device on your network.
How it works
The desktop serves the same board over HTTP to the local network. Login-free by design, so keep it to networks you trust. Off by default.
Cloud sync
Two-way sync of the whole board. A toggle. Off until you turn it on.
How it works
Projects, tasks, comments, chat, notes, notifications and, on Pro, Max and the trial, attachments sync between the desktop and the cloud. Two devices editing the same task keep both edits. A deleted item is not brought back by a later edit made elsewhere. A task never disappears because two devices disagree. On reconnect only the difference is transferred.
The phone
Columns become pages you swipe between. Made for a thumb, not a shrunken desktop.
How it works
The same board at board.boragosoft.com in your phone's browser, laid out for a phone, with a rail for moving cards across columns and the project controls as labelled rows. Answer questions, create tasks, start containers and open a terminal while your desktop is online.
One account, one desktop, easy switching
Sign in from a phone that is already signed in. A second desktop must confirm a takeover.
How it works
The desktop shows a short code you approve in a signed-in browser or phone session, inheriting your password manager and 2FA. Each account links one desktop installation. Switching accounts on one machine keeps each account's database and project folders apart.
Business accounts
Members, verified domains, and shared credentials that no single person can read alone.
How it works
A business with two membership kinds, DNS-verified domains, and split-key shared credentials sealed so that the server alone cannot decrypt them.
Security and recovery
The full account is on the security page, including what is and is not end-to-end encrypted.
AES-256-GCM for every credential
API keys, environment variables, git keys and vault keys are encrypted at rest under a key the cloud never stores.
How it works
On the desktop the key is sealed by the operating system's keychain, where there is one. Signed in, secrets are encrypted under an account key that is itself wrapped under a key derived from your password. The cloud stores the wrapped key and never the password, so a copy of its database cannot open a credential.
Two-factor authentication and recovery
Authenticator app codes, recovery codes, and a 24-hour recovery hold with a cancel link.
How it works
TOTP with hashed recovery codes. Losing the authenticator has a password-gated recovery path with a 24-hour hold and an alert to the primary email. Deleting the account at once needs the password and a second factor.
A weak keychain is named, never hidden
If your Linux desktop has no keyring, the app says so once and carries on.
How it works
A missing or weak keyring produces one warning beside the cloud sign-in and one notice in the bell. Warn, never block.
Secret journal
A secret's recent values are kept in a file beside the database, restorable.
How it works
Earlier values are kept encrypted on this device only and never sync. A credential removed by a change from another device is held for a while rather than dropped, so it can be put back.
Recycle bin and restore points
Deleted projects come back for 30 days, with their tasks. A whole-board snapshot is taken before any upgrade that changes the database.
How it works
A deleted project waits in the recycle bin with its tasks, comments and attachments. Two restore points are kept. Restoring one is a press, applied at the next start.
No cookies, no trackers
The website sets no cookies and loads no third-party scripts. The board uses local storage for per-device preferences only.
How it works
The board client is served with a Content Security Policy and Subresource Integrity. Diagnostics are sent only when you press Report a problem, after a preview, with secrets scrubbed on both ends.
Setup and platform
Every step, per platform, is on what the app sets up for you. Which platforms are verified is on OS support.
Docker found, started and installed for you
One administrator prompt on Linux. A verified Docker Desktop download on Mac and Windows.
How it works
The app resolves the Docker command itself, reports whether the daemon is running, stopped or unreachable, and offers the fix for each in the app. On Linux one script installs the distribution's own Docker packages, adds you to the docker group, installs and verifies gVisor and grants access to the socket so no restart or log-out is needed. On Mac and Windows it downloads the official installer, checks it against Docker's published checksum and opens it.
Updates the way your platform does them
deb and rpm through your package manager. The AppImage and the Mac app update themselves. Windows tells you when a release is out.
How it works
The AppImage replaces itself and repoints your menu entry at once. The Mac app downloads an update in the background and installs it when you restart, when it runs from your Applications folder. Opened from the disk image or straight from Downloads, it tells you when a release is out instead. Every installer URL is unique per version.
Closes the way your desktop expects
Hides to the tray where there is one, minimises where there is none.
How it works
The app detects whether your desktop has a tray, so Ubuntu, Fedora, KDE and the rest each get the right behaviour. The setting is named for its effect: keep running when the window is closed.
Report a problem
A scrubbed log tail and system information, shown to you before it is sent.
How it works
No identifiers. Secrets scrubbed on your machine and again on receipt. Sent only when you press the button. Logs are kept per account so one account's report cannot carry another's work.
Uninstalling, documented
What each platform leaves behind and how to remove it, in the app and on the site.
How it works
The config directory, the projects directory and the containers are all left in place by an uninstall, on purpose. The guide names each path per platform.
Get Borago Board
Linux, Windows and macOS. The desktop app is free. Your AI provider bills you directly.
Download