boarddown-cli-0.1.5 is not a library.
BoardDown
Local-first, file-based Kanban storage engine with sync capabilities
Think "Markdown meets Kanban" — version controlled, offline-capable, and programmable.
Table of Contents
- Philosophy
- Quick Start
- Architecture
- The BoardDown Specification
- Rust API
- TypeScript API
- Storage Backends
- Multi-File Workspaces
- Roadmap
Philosophy
Why BoardDown?
Existing Kanban tools lock your data in proprietary cloud databases. BoardDown treats your project management data as code:
- Git-compatible: Boards are Markdown, diff them in PRs
- Offline-first: Local SQLite with optional cloud sync
- Programmable: Rust/TS APIs for custom automation
- Human-readable: Edit in any text editor, render in any app
Use Cases:
- Personal task management in
~/tasks/synced via Git - Team sprints with conflict-free replicated data types (CRDTs)
- Embedded Kanban in IDEs (VSCode, Neovim extensions)
- CI/CD pipeline visualization (
/.boarddown/ci.board.md)
Quick Start
Installation
# CLI tool
# Or add to your Rust project (single dependency)
# For Node.js projects
The 30-Second Tutorial
Create a file sprint-42.board.md:
id: "sprint-42"
board: "Sprint 42: Auth Refactor"
id-prefix: "TICKET"
- -
- -
Then interact with it:
use ;
use Arc;
async
Or in TypeScript:
import { Workspace, Status } from '@boarddown/core'
const ws = await Workspace.open('./sprints')
const board = await ws.getBoard('sprint-42')
// Subscribe to changes (local or remote)
board.onChange((event) => {
console.log(`Task ${event.taskId} moved to ${event.to}`)
})
// Create task programmatically
const task = await board.createTask({
title: 'Fix edge case',
column: 'Todo',
metadata: {
priority: 'High',
estimate: 3
}
})
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Applications │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ CLI Tool │ │ Tauri App│ │ VSCode │ │ Web App │ │
│ │ │ │ (Desktop)│ │ Extension│ │ (Next.js)│ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼──────────────┼─────────────┼──────────────┼────────┘
│ │ │ │
└──────────────┴──────┬──────┴──────────────┘
│
┌──────────▼──────────┐
│ boarddown-napi │ ◄── Node.js bindings
│ (napi-rs) │ via napi-rs
└──────────┬──────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌───────▼───────┐ ┌──────────▼──────────┐ ┌──────▼───────┐
│ Core Types │ │ Core Engine │ │ Sync │
│ (Schema) │ │ (Parse/Query/CRDT) │ │ (CRDT/OT) │
└───────┬───────┘ └──────────┬──────────┘ └──────┬───────┘
│ │ │
└─────────────────────┼────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌───────▼───────┐ ┌──────────▼──────────┐ ┌──────▼───────┐
│ FS Backend │ │ SQLite Backend │ │ Cloud │
│ (.board.md) │ │ (high-perf cache) │ │ (optional) │
└───────────────┘ └─────────────────────┘ └──────────────┘
Crate Structure (crates/)
| Crate | Description | Dependencies |
|---|---|---|
boarddown |
Unified API (re-exports all types) | all crates below |
boarddown-core |
Parser, AST, validation engine, CRDT types | serde, serde_yaml, chrono |
boarddown-fs |
Filesystem storage backend, git integration | boarddown-core, tokio, notify |
boarddown-db |
SQLite backend, indexing, full-text search | boarddown-core, sqlx, rusqlite |
boarddown-sync |
Conflict resolution, operational transforms | boarddown-core, automerge (optional) |
boarddown-napi |
Node.js FFI bindings | napi, napi-derive, boarddown-core |
boarddown-cli |
Command-line interface | clap, boarddown-fs, boarddown-db |
boarddown-server |
Optional WebSocket sync server | axum, boarddown-sync |
The BoardDown Specification
File Format (.board.md)
BoardDown files are CommonMark compliant with YAML frontmatter and task syntax:
board: "Sprint 42"
id-prefix: "BD"
default-tags: ["sprint-42"]
storage: sqlite
autosync: true
- --
-
-
- -
Syntax Reference
Task Status:
| Syntax | Status | Emoji |
|---|---|---|
- [ ] |
Todo | ⬜ |
- [~] |
In Progress | 🔄 |
- [>] |
Ready/Review | 👀 |
- [x] |
Done | ✅ |
- [?] |
Blocked/Icebox | 🧊 |
- [!] |
Urgent | 🔥 |
Task IDs:
{BD-001}→ Auto-linking, unique per workspace- Auto-generated if omitted:
{board-prefix}-{timestamp}
Metadata (YAML inline):
# Standard fields
Assign: string | string[] # Email or username
Tags: string[] # Categorization
Priority: Low | Medium | High | Critical
Estimate: number # Story points or hours
Due: ISO-8601 date
Started: ISO-8601 datetime
Closed: ISO-8601 datetime
# Extensible custom fields
Epic: string # Grouping
Branch: string # Git association
PR: url # Pull request link
Refs: id[] # Related (non-blocking)
Depends: id[] # Blocking dependencies
Multi-File Workspaces
For large projects, split boards across files:
my-project/
├── .boarddown/ # Workspace config
│ ├── config.toml # Global settings
│ ├── templates/ # Task templates
│ └── hooks/ # Git hooks
├── product/
│ ├── roadmap.board.md # High-level roadmap
│ └── backlog.board.md # Unsorted ideas
├── sprints/
│ ├── sprint-42.board.md # Current sprint
│ └── sprint-43.board.md # Next sprint
├── teams/
│ ├── backend.board.md # Team-specific board
│ └── frontend.board.md
└── archive/
└── 2023/ # Completed boards
Workspace Config (.boarddown/config.toml):
[]
= "My Project"
= "TICKET-{board}-{seq}"
= "sqlite"
[]
= ".boarddown/cache.db"
= true # Full-text search
[]
= true # Auto-reload on file changes
= false # Commit changes automatically
[]
= true
= "crdt" # "crdt", "git", or "custom"
= "last-write-wins"
[]
= "scripts/notify.sh"
= "git add ."
# Schema validation
[]
= { = "enum", = ["low", "medium", "high"] }
= { = "number", = 0, = 100 }
Rust API
Quick Start
use ;
use Arc;
async
Event System
// Subscribe to changes (cross-process safe)
let mut rx = ws.subscribe;
spawn;
Storage Traits
Implement custom backends:
use ;
TypeScript API
Via boarddown-napi (Node.js native addon):
import {
Workspace,
Board,
Status,
Priority,
QueryBuilder
} from '@boarddown/core'
// Async initialization
const ws = await Workspace.open('./project', {
storage: 'sqlite',
watch: true // Hot-reload on file changes
})
// Type-safe board access
const board: Board = await ws.getBoard('sprint-42')
// Reactive queries (auto-update on changes)
const tasks = board.query({
status: [Status.Todo, Status.InProgress],
metadata: {
priority: Priority.High,
assign: 'alice@example.com'
},
orderBy: 'due',
limit: 20
}).subscribe((tasks) => {
console.log('Tasks updated:', tasks.length)
})
// Task manipulation
const task = await board.createTask({
title: 'New feature',
column: 'Todo',
status: Status.Todo,
metadata: {
estimate: 5,
tags: ['backend', 'urgent']
},
dependencies: ['BD-001'] // Auto-validates existence
})
// Move with business logic hooks
await board.moveTask(task.id, 'In Progress', {
validate: (t) => t.dependencies.every(d => d.isResolved()),
onSuccess: (t) => console.log(`Started ${t.id}`)
})
// Sync across devices
const sync = ws.enableSync({
provider: 'crdt',
url: 'wss://sync.boarddown.dev',
auth: process.env.BOARDDOWN_TOKEN
})
sync.on('conflict', (conflict) => {
console.log('Merge conflict:', conflict.resolve('local')) // or 'remote', 'manual'
})
React/Vue Integration
// React hook
import { useBoard, useTasks } from '@boarddown/react'
function SprintBoard({ boardId }: { boardId: string }) {
const { board, loading, error } = useBoard(boardId)
const { tasks, moveTask } = useTasks(boardId, {
status: Status.InProgress
})
if (loading) return <Spinner />
return (
<Kanban
columns={board.columns}
onCardMove={(cardId, dest) => moveTask(cardId, dest)}
/>
)
}
Storage Backends
Filesystem (Git-Optimized)
- One file per board
- Line-oriented diff for tasks
- Frontmatter for metadata
- Attachments in
.boarddown/attachments/{board-id}/
SQLite (High Performance)
- Indexed queries (< 1ms for 10k tasks)
- Full-text search (SQLite FTS5)
- JSON metadata column for schemaless fields
- WAL mode for concurrent access
Hybrid Mode (Recommended)
[]
= "hybrid"
= "sqlite"
= "filesystem"
= "30s" # Auto-sync FS <-> SQLite
Roadmap
Phase 1: Core (v0.1.0) - Current
- Parser (markdown to AST)
- FS storage backend
- SQLite backend with FTS5
- Basic TypeScript bindings (napi-rs)
- Hybrid storage mode
- Full-text search (FTS5)
- Custom fields validation
- Hook execution system
- CLI with init, add, list, move commands
- WebSocket sync server
- CRDT conflict resolution
Phase 2: Ecosystem (v0.2.0)
- React integration hooks
- Vue integration
- VSCode extension
- CLI TUI (ratatui)
- GitHub Actions integration
Phase 3: Enterprise (v0.3.0)
- RBAC (Role-based access control)
- Audit logging
- Attachment support
- Template system
Contributing
We welcome contributions! See CONTRIBUTING.md.
License
MIT