Task tracker for AI agents. Stores data outside your repo so it doesn't pollute your codebase.
Warning
Early alpha. Things will break.
Prerequisites:
# Rust Things
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
cargo install wasm-pack
# System deps (Fedora/RHEL)
sudo dnf install gcc make pkg-config openssl-devel containerd buildah nodejs npm
sudo systemctl enable --now containerd
# System deps (Ubuntu/Debian)
sudo apt-get install build-essential pkg-config libssl-dev containerd buildah nodejs npm
sudo systemctl enable --now containerd
# GUI bundling deps
npm install marked highlight.jsInstall binnacle:
cargo install --git https://github.com/hbeberman/binnacle --tag v0.0.1-alpha.10 --all-features # from git
# Initialize Binnacle on your system (and build its default containers)
bn system host-init
bn container build default # Minimal Binnacle base layer of bn + copilot
# Go to your GIT project
cd your-project
cp ~/repos/binnacle/.binnacle . # Yoink Binnacle's container definition
# Initialize (creates data store outside your repo)
bn session init --auto-global
bn container build worker # We just copied binnacle's for now
# Create your first task
bn task create "Build the thing" -s "build thing" -p 1
# See what's ready to work on
bn ready -H
# Work on it
bn task update bn-xxxx --status in_progress
# Done? Close it
bn task close bn-xxxx --reason "shipped it"What just happened?
bn session init --auto-globalcreated~/.local/share/binnacle/<repo-hash>/to store your tasks (not in your repo!)- Tasks get IDs like
bn-a1b2— use these to reference them -Hmeans "human readable" — without it you get JSON (great for scripts/agents)-s "short name"gives tasks a scannable label
Visual dashboard?
bn gui # Opens http://localhost:3030 with a live task graphModel dependencies?
bn link add bn-xxxx bn-yyyy --type depends_on # xxxx depends on yyyy
bn blocked -H # See what's waitingThat's it. Everything else is refinement. Run bn --help when you need more.
Once you have tasks, let an AI agent work through them.
Get a GitHub PAT with Copilot access:
- Go to https://github.com/settings/personal-access-tokens
- Click "Generate new token"
- Name it (e.g., "binnacle"), set expiration (default is fine)
- Repository access: select your target repos or "All repositories"
- No additional permissions are needed to run Copilot CLI.
- Click "Generate token" and copy it
# One-time setup
#bn system host-init --token <your-token> # Interactive — validates token, installs host files, builds containers
#bn system host-init --token <your-token> --install-copilot --install-bn-agent # Non-interactive — just Copilot + bn-agent
# Setup Your PAT somewhere, for just a session or persist it, up to you.
export COPILOT_GITHUB_TOKEN=<PAT>
# Create some work
bn task create "Add user authentication" -s "auth" -p 1
bn task create "Write API tests" -s "api tests" -p 2
# Let the agent pick a task and work on it
bn-agent --once --host auto # On host (direct access to filesystem)
bn-agent --once auto # In container (isolated, merges on success)The agent will:
- Run
bn orientto understand the project - Pick a ready task from
bn ready - Implement it, commit changes locally
- Close the task with
bn task close - Exit gracefully with
bn goodbye
Agent modes:
bn-agent auto # Run in container (isolated, auto-merges to main)
bn-agent --host auto # Run on host, (shared with system, auto-merges to main)
bn-agent --once --host auto # Run once and exit
bn-agent buddy # Interactive — add tasks/bugs/ideas via chat
bn-agent do "fix the bug" # One-off task without creating a bn task firstDefine your own Containers: More likely than not your project wont need Binnacle's build deps to compile, so binnacle supports a layered container approach where it ships a built-in minimal fedora container, then a project can define a .binnacle/containers/worker/ structure (see binnacle itself as a reference), to bring their own custom build tools. Currently bn-agent is hardcoded to look for the worker container Set all that up (i.e. just copy it from binnacle itself), then run the following in your session:
bn container list-definitions -H
cp -r ~/repos/binnacle/.binnacle ~/repos/your-project
bn container list-definitions -HBinnacle has two administrative namespaces:
bn system- Host-global operations (first-time setup, copilot management)bn session- Repo-specific operations (store, migrate, hooks)
bn system init # first-time setup (once per machine)
bn session init # set up in your project
bn task create "Do the thing" # create a task
bn ready # see what's actionable
bn task close bn-xxxx # mark doneFor AI agents:
bn orient # get up to speed on project state
bn goodbye "summary" # graceful exitBinnacle can manage GitHub Copilot CLI binaries to provide version stability for agent workflows:
bn system copilot install --upstream # Install binnacle-preferred version
bn system copilot install v0.0.396 # Install specific version
bn system copilot path # Show active binary location
bn system copilot version # List installed versionsVersion Pinning:
- Binnacle ships with a preferred Copilot version (embedded at build time)
- Agents use
--no-auto-updateflag to prevent runtime updates - Containers pre-install the pinned version during image build
- Host agents resolve binaries via
bn system copilot path
This prevents unexpected behavior from automatic Copilot updates mid-workflow.
bn-agent auto # pick highest priority task and work on it
bn-agent --once auto # run once without looping
bn-agent buddy # helper for adding tasks interactively
bn-agent --container buddy # run buddy in container mode (isolated)
bn-agent prd # plan features and create PRDs
bn-agent --container prd # run PRD agent in container mode
bn-agent qa # interactive Q&A for exploring the codebase (read-only)Note: bn-agent automatically resolves the Copilot binary via bn system copilot path and runs it with --no-auto-update to prevent mid-workflow updates. Install a pinned version with bn system copilot install --upstream before running agents.
- Tasks (
bn-xxxx) with priorities, dependencies, tags - Bugs (
bn-xxxx) with severity levels - Ideas (
bn-xxxx) that can be promoted to tasks - Milestones (
bn-xxxx) with progress tracking - Tests (
bnt-xxxx) linked to tasks, auto-reopen on regression - Docs (
bn-xxxx) for attached documentation - Queue (
bnq-xxxx) for agent prioritization
bn # status summary
bn ready # actionable tasks
bn blocked # what's waiting on dependencies
bn show <id> # details on any entity
bn task create/list/update/close
bn bug create/list/update/close
bn link add <src> <tgt> --type depends_on
bn queue show # see prioritized work
bn gui # web interface (needs --features gui)
bn mcp serve # MCP server for agentsRun bn --help for everything else.
Run a WebSocket server that provides real-time graph updates and accepts remote commands:
bn session serve # Start on localhost:3030
bn session serve --public # Bind to all interfaces for network access
bn session serve --tunnel # Create a public URL via devtunnelCommands:
bn session serve- Start the WebSocket serverbn session status- Check if the server is runningbn session stop- Stop the server
The session server enables live updates for the GUI and TUI, allowing multiple clients to observe and interact with the task graph simultaneously.
Note: For containerized agent management, use bn container run directly. See container/README.md for details.
The web interface requires the gui feature flag:
# Install to ~/.local/bin with GUI enabled (recommended)
just install
# Or build manually
cargo build --release --features gui
cargo install --path . --features guiHow bundling works:
- During
cargo build --features gui, the build script (build.rs) automatically runsscripts/bundle-web.sh - Web assets from
web/are minified and compressed intotarget/web-bundle.tar.zst - The bundle is embedded into the binary at compile time
- Bundle is cached using a hash of
web/contents - only rebuilds when files change - Development builds can skip bundling with
--devflag to serve directly from filesystem
Option 1: Using bn gui (direct command)
bn gui # Start on default port (3030)
bn gui -p 8080 # Start on custom port
bn gui --readonly # Start in read-only mode
bn gui --tunnel # Create public URL via devtunnel (read-only)
bn gui --archive data.bng # Load a .bng archive file (read-only snapshot)The server will start and print the URL to access the interface. Open it in your browser:
http://localhost:3030
Note: The --archive flag must be specified before any subcommand (e.g., bn gui --archive file.bng serve). It appears in bn gui --help but not in bn gui serve --help because it's a top-level option.
Option 2: Using just gui (with hot reload)
For development, use the justfile recipe which provides hot restart:
just gui # Build, install, and launch with hot restart
just gui nobuild # Launch without rebuilding (uses existing binary)The just gui recipe offers faster iteration during development:
- Starts immediately with the existing binary
- Rebuilds in the background
- Automatically restarts with the new build
Option 3: Development mode (for frontend work)
When working on JavaScript/CSS changes, use development mode for instant updates:
just dev-gui # Serves from web/ directory, no bundle neededDevelopment mode (--dev flag):
- Serves assets directly from
web/directory - Edit files and refresh browser to see changes instantly
- No bundling/rebuilding required for frontend changes
- Uses
cargo run --features gui -- gui --devunder the hood
Environment Variables:
BN_GUI_PORT: Override default port (default: 3030)BN_GUI_HOST: Override bind address (default: 0.0.0.0)BN_GUI_READONLY: Start in read-only modeBN_GUI_TUNNEL: Enable tunnel mode (see below)
(Currently out of commission)
Share your GUI publicly without port forwarding using Microsoft Dev Tunnels:
bn gui --tunnel # Start with a public URLThis spawns a devtunnel process that creates a temporary public URL (e.g., https://abc123-3030.use.devtunnels.ms) proxying to your local GUI.
Requirements:
- Install devtunnel:
just install-devtunnel - Authenticate (one-time):
devtunnel user login
The authentication step is required before first use and supports GitHub, Microsoft, or Azure AD accounts.
Security:
- Tunnel mode automatically enables read-only mode to prevent remote modifications
- The URL is randomly generated and not easily guessable
- Tunnel terminates when the GUI server stops
Use cases:
- Share project status with remote collaborators
- Demo your task graph without exposing your network
- Quick reviews without VPN setup
bn gui status # Check if GUI is running
bn gui stop # Gracefully stop the GUI (SIGTERM)
bn gui kill # Force kill the GUI immediatelyYou can create a static HTML bundle of your project's current state for hosting on GitHub Pages or any static site host:
# Export to default location (target/static-viewer/)
bn gui export
# Export to custom location
bn gui export -o docs/viewer
# Export with specific archive
bn gui export --archive path/to/snapshot.bngThe exported bundle includes:
- A standalone web viewer (all HTML, CSS, JS assets)
- A
.bngarchive snapshot of your project - Auto-load script that opens the archive on page load
Hosting on GitHub Pages:
-
Export to a directory that will be committed:
bn gui export -o docs/viewer -
Commit the exported files:
git add docs/viewer git commit -m "Add static project viewer" git push -
Enable GitHub Pages in your repository settings:
- Go to Settings → Pages
- Set source to your branch (e.g.,
main) - Set folder to
/docs(or root if you exported to root)
-
Visit your viewer at:
https://<username>.github.io/<repo>/docs/viewer/
Remote Archive URLs:
The viewer can also load archives from remote URLs. Share a viewer URL with an archive parameter:
https://<username>.github.io/<repo>/viewer/?url=https://example.com/snapshot.bng
This allows you to:
- Host multiple snapshots and switch between them
- Share project state with collaborators
- Create time-based archives for project history
-
Launch the GUI:
just gui
-
Open in browser:
http://localhost:3030 -
Verify features:
- Graph visualization displays tasks and their relationships
- Nodes are color-coded by status (pending, in_progress, done, blocked)
- Click nodes to see details in the info panel
- Use the search bar to filter nodes
- Use filters to show/hide node and edge types
- Live updates reflect changes made via CLI
-
Test live updates:
# In another terminal, make changes bn task create "Test task" bn task update bn-xxxx --status in_progress
The GUI should update automatically without refresh.
-
Test connection recovery:
- Stop the server:
bn gui stop - Restart it:
bn gui - The viewer should automatically reconnect
- Stop the server:
Port already in use:
# Use a different port
BN_GUI_PORT=8080 bn guiCan't connect from another machine:
- Ensure the server is bound to 0.0.0.0 (default)
- Check firewall settings
- Use
bn gui --host 0.0.0.0explicitly if needed
GUI won't stop:
# Force kill
bn gui killExport your task graph and view it in any browser—no server needed:
just build-viewer # build the standalone viewer
bn session store export data.bng # export your project data
# open target/viewer/viewer.html, drop in data.bngThe viewer supports two modes via URL parameters:
- Archive mode:
viewer.html?archive=./data.bng- Load exported.bngfile (read-only) - Live mode:
viewer.html?ws=localhost:3030- Connect to runningbn guiserver
Add #bn-xxxx to focus on a specific entity: viewer.html?archive=./data.bng#bn-a1b2
Serve the viewer locally with a pre-loaded archive:
just serve-wasm # serve on port 8080
just serve-wasm 3000 # serve on custom port
just serve-wasm 8080 path/to/data.bng # serve with pre-loaded archiveThen open http://localhost:8080 in your browser. If you provided an archive path, it will be auto-loaded via URL parameter.
See docs/embedding-viewer.md for embedding in web pages.
just install # recommended, includes GUI
cargo build --release # without GUIMIT
