Canopy turns plain markdown files into a powerful personal knowledge system. Manage todos, track goals, run meetings, and query everything with SQL — without ever leaving your terminal.
◆ canopy 1 Today 2 Todos 3 Goals 4 Notes 5 Query 6 Dash 7 Tags 8 Tmpl ? Help ■ FOCUS TODAY [ ] Ship auth service v2 @p:1 #auth-service @due:today [ ] Review Sarah's PR #482 @p:2 #code-review @focus:today [>] Follow up with design team @p:3 #project/atlas ■ OVERDUE [ ] Update API documentation @p:2 #docs @due:2026-02-09 ■ UPCOMING (7 DAYS) [ ] Prepare sprint retro slides @p:2 #engineering @due:fri [g] Launch beta to 100 users @p:1 #growth @due:2026-02-18 [ ] Onboard new hire (Jamie) @p:3 #people/jamie @due:2026-02-19 d:done x:cancel r:reschedule F:focus n:new e:edit /:command ?:help
Your data lives in ~/.canopy/, nowhere else. No cloud, no accounts, no tracking. Works fully offline.
Plain markdown is the source of truth. The SQLite index is derived and disposable. Edit with any tool, anywhere.
Pure Go, zero CGO dependencies. Download one binary and you're running. No install scripts, no Docker, no npm.
Query your entire life with SQL. Save queries, parameterize them, embed them in templates. No query builder limitations.
Canopy packs a full productivity system into a keyboard-driven TUI.
Start every day with a clear picture. Focus items, overdue tasks, upcoming deadlines, PTO, and meetings — all in one view. Fully customizable with SQL-powered sections.
# config.toml [[dashboard.widgets]] name = "overdue" title = "Overdue" style = "warning" query = """ SELECT * FROM entities WHERE status = 'open' AND due_date < date('now') ORDER BY due_date ASC """
Hierarchical tags like #people/sarah and inline attributes like @due:friday and @p:1. Filter, sort, and slice any way you need.
Generate meeting notes, daily logs, and project kickoffs from templates. Auto-embed live query results, variables, and smart dates.
A 6-step guided workflow: triage overdue items, clean stale focus, celebrate completions, check in on projects and people, then prep for next week.
Build advanced dashboards with Lua. Conditional logic, computed summaries, custom grouping — all sandboxed and safe with a 5-second timeout.
Edit files in Vim, VS Code, or Obsidian — Canopy detects changes instantly via fsnotify and refreshes the index. No manual rebuild.
Isolate work and personal contexts with separate workspaces. Each has its own index, templates, queries, and notes. Switch with -w name.
Connect notes with [[wiki-links]]. Canopy tracks every reference and shows backlinks in note previews. Query links with /backlinks or raw SQL.
Add @recur:weekly to any todo. On completion, a new instance is automatically created with the next due date. Supports daily, weekdays, monthly, custom intervals, and end dates.
Create meetings with /meeting or use /1on1 for structured 1-on-1s that auto-pull open items, previous notes, and goals per person. Meetings surface on the Today dashboard.
Type /focus to enter a distraction-free view showing only your focused items. The tab bar dims, progress is tracked, and it auto-exits when everything is done.
Canopy extends familiar markdown with a lightweight bracket notation. No proprietary format — files remain perfectly readable everywhere.
[ ] Open todo [x] Completed todo [-] Cancelled todo [!] Important note [g] Active goal [?] Open question [>] Action item [p] PTO / time off
[ ] Ship the feature @due:friday @p:1 [ ] Call the client @focus:today [g] Launch v2 @due:2026-03-01 [p] Vacation @start:2026-03-15 @due:2026-03-22 [ ] Weekly report @due:fri @recur:weekly # Tags — hierarchical with / [ ] Review PR #code-review [ ] 1-on-1 prep #people/sarah-jones
--- title: Sprint Planning type: meeting date: 2026-02-11 tags: [engineering, sprint] --- # Sprint 42 Planning [ ] Finalize scope @p:1 [ ] Assign tickets @p:2 [?] Do we need design? # Wiki-links for backlinks See [[Auth Service]] for details.
# Relative dates resolve on save @due:today → @due:2026-02-11 @due:tomorrow → @due:2026-02-12 @due:friday → @due:2026-02-13 @due:next-monday → @due:2026-02-16 @due:+3d → @due:2026-02-14 @due:+2w → @due:2026-02-25
Press a number key (or ?) to switch instantly. Every view is keyboard-driven with contextual actions.
Your daily command center. See focus items, overdue tasks, upcoming deadlines, PTO, and meetings at a glance. Sections are SQL-powered and fully customizable in your config.
All open todos across every file, sorted by priority and due date. Filter by tag, priority, or date with slash commands. Triage from here without opening a single file.
Track active goals with [g] markers. See progress, reschedule targets, mark done, or cancel. Goals are first-class citizens — not just tasks with a label.
Browse all indexed markdown files with a live preview pane. Search by title, full-text content, tags, or file type. Backlinks are shown at the bottom of each preview.
Run raw SQL against your entire knowledge base. Access entities, files, tags, and metadata. Save queries to files, parameterize them, and reuse across templates and dashboards. Use /query-help to see the full schema.
Custom views powered by TOML or Lua. Build 1-on-1 dashboards, project trackers, team overviews, or anything else. Variables, derived values, and conditional logic built in.
Browse every tag in your system with usage counts. Drill into any tag to see all files and entities. Hierarchical tags like #people/sarah keep things organized at scale.
Browse, preview, and run all templates — entity templates, file templates, and dashboards. Create meeting notes, daily logs, and project files from reusable patterns with auto-resolved variables and embedded queries.
Built-in documentation and quick references. Browse help topics covering entity syntax, keybindings, commands, templates, and more — without leaving the TUI.
Create notes, run queries, filter views, generate from templates — all without reaching for the mouse. Tab-completion built in.
/todayCreate/open today's daily note/note [name]Create or open a named note/from [template]Create file from template/meeting "title" #tagQuick-create a meeting note/1on1Start a 1-on-1 meeting/new-template [name]Create a new template/query [name|SQL]Run saved or raw SQL query/query-helpShow database schema reference/search [text]Full-text entity search/grep [text]Search file contents/filter [expr]Filter by tag, priority, date, recurrence/backlinks [name]Show files linking to a note/dashboard [name]Browse or open a dashboard/template [name]Browse and run templates/reviewStart weekly review/entitiesShow entity type reference/focusToggle distraction-free focus mode/configOpen config.toml in editor/save [name]Save last query/quitExit CanopyBuild custom views with TOML for simple layouts, or Lua for full programmatic control.
Declare SQL-powered sections with variables and derived values.
# dashboards/team-status.toml name = "Team Status" [[variables]] name = "team" prompt = "Team name" [[sections]] title = "Blocked Items" query = """ SELECT * FROM entities WHERE status = 'open' AND content LIKE '%blocked%' AND file_path LIKE '%{team}%' """
Full scripting for conditional logic, computed values, and dynamic grouping.
--- name: 1-on-1 --- var: name | Person | John Doe --- var: tag | derived | people/{name|slug} local tag = canopy.var("tag") local open = canopy.query_entities({ status = "open", tags = {tag} }) local recent = canopy.query_files({ tags = {tag, "core/minutes"}, limit = 5 }) return { {title = "Open for " .. canopy.var("name"), entities = open}, {title = "Recent Meetings", files = recent}, }
Your markdown files are the only source of truth. The SQLite database is a derived, disposable index that can be rebuilt from scratch at any time with canopy rebuild-index. No vendor lock-in, no proprietary formats.
The TUI follows the Elm pattern via Bubbletea: Model, Update, View. Async commands and messages keep the UI responsive. State is predictable and debuggable.
Every mutation follows the same path: user action → file edit → parse → refresh. The file is always written first, then re-indexed. If anything crashes, your data is safe on disk.
Zero CGO dependencies. Uses modernc.org/sqlite for a pure-Go SQLite implementation, gopher-lua for scripting, fsnotify for file watching, and cobra for the CLI. One binary, every platform.
Canopy ships with 8 built-in entity types, but you can define as many custom types as you need. Each gets its own bracket marker, status tracking, and state transitions.
Track decisions, refinements, risks, blockers — whatever your workflow demands.
# config.toml [[entity_types]] marker = "d" name = "decision" description = "A recorded decision" has_status = false [[entity_types]] marker = "r" name = "refinement" has_status = true default_status = "open" transition = "R" # [r] → [R] # Now use them in your notes: [d] We're going with PostgreSQL [r] Auth service API contract @p:1
Six guided steps to close loops, catch dropped balls, and plan the week ahead.
Triage everything past due. Reschedule, complete, or cancel.
Clean up items focused in the past that were never addressed.
Celebrate wins. See everything you shipped in the last 7 days.
Review each tracked project's open items and recent activity.
See recent meetings and open items for each person you manage.
Preview upcoming deadlines, meetings, and focus items.
Canopy is open source and free. Grab a prebuilt binary or build from source.
# Install with go (requires Go 1.25+) $ go install github.com/cochranjd/canopy@latest # Or build from source $ git clone https://github.com/cochranjd/canopy.git $ cd canopy && make build && make install # Initialize a workspace and launch $ canopy init work $ canopy