Borago Board logo Borago Board

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.

Desktop, LAN browser, cloud browser, phone

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.

All surfaces

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.

All surfaces

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.

All surfaces. File and folder reads need the desktop online

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.

All surfaces

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.

All surfaces

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.

All surfaces

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.

All surfaces. Screenshot and camera on the desktop

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.

Desktop on macOS, Windows and Linux, x64 and arm64

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.

All surfaces

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.

All surfaces

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.

Create anywhere. Runs on the desktop

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.

Desktop

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.

Desktop

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.

Desktop

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.

Desktop. Check and suggest via desktop

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.

Desktop, LAN browser, via desktop from cloud and phone

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.

Desktop. Via desktop from cloud and phone

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.

Link anywhere. Used on the desktop

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.

Desktop

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.

Desktop, LAN browser, via desktop from cloud and phone

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.

Desktop, via desktop from cloud and phone

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.

Desktop, LAN browser, via desktop from cloud and phone

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.

Desktop

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.

Desktop

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.

Desktop, via desktop from cloud and phone

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.

Desktop

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.

Desktop. The firewall rule via desktop from cloud and phone

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.

Keys entered on the desktop, or via desktop from cloud and phone

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.

All surfaces

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.

All surfaces

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.

Desktop

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.

Desktop

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.

All surfaces

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.

Runs on the desktop. Visible everywhere

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.

Desktop, LAN browser, via desktop from cloud and phone

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.

All surfaces

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.

All surfaces

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.

Desktop

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.

Desktop

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.

All surfaces

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.

All surfaces

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.

Desktop

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.

Desktop

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.

All surfaces

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.

All surfaces. Spending calls via 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.

All surfaces

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.

Runs on the desktop. Edited everywhere

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.

All surfaces

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.

Desktop, LAN browser

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.

Desktop, cloud browser, phone

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.

Phone

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.

Desktop, cloud browser, phone

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.

Cloud browser, desktop

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.

All surfaces

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.

Cloud browser, phone, desktop

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.

Desktop

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.

Desktop

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.

Desktop

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.

All surfaces

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.

Desktop

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.

Desktop

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.

Desktop

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.

Desktop

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.

Desktop

Get Borago Board

Linux, Windows and macOS. The desktop app is free. Your AI provider bills you directly.

Download