Terminal-native · Local-first · Open Source

Your second brain,
right in the terminal.

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 — Today
  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
🔒

Local-First, Private

Your data lives in ~/.canopy/, nowhere else. No cloud, no accounts, no tracking. Works fully offline.

📄

Files Are Truth

Plain markdown is the source of truth. The SQLite index is derived and disposable. Edit with any tool, anywhere.

Single Binary

Pure Go, zero CGO dependencies. Download one binary and you're running. No install scripts, no Docker, no npm.

🔎

SQL Queries

Query your entire life with SQL. Save queries, parameterize them, embed them in templates. No query builder limitations.

Everything you need to
stay on top of everything.

Canopy packs a full productivity system into a keyboard-driven TUI.

Triage

Today Dashboard

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
"""
Organize

Tags & Attributes

Hierarchical tags like #people/sarah and inline attributes like @due:friday and @p:1. Filter, sort, and slice any way you need.

Automate

Templates

Generate meeting notes, daily logs, and project kickoffs from templates. Auto-embed live query results, variables, and smart dates.

Reflect

Weekly Review

A 6-step guided workflow: triage overdue items, clean stale focus, celebrate completions, check in on projects and people, then prep for next week.

Extend

Lua Scripting

Build advanced dashboards with Lua. Conditional logic, computed summaries, custom grouping — all sandboxed and safe with a 5-second timeout.

Watch

Live File Sync

Edit files in Vim, VS Code, or Obsidian — Canopy detects changes instantly via fsnotify and refreshes the index. No manual rebuild.

Scale

Workspaces

Isolate work and personal contexts with separate workspaces. Each has its own index, templates, queries, and notes. Switch with -w name.

Link

Backlinks

Connect notes with [[wiki-links]]. Canopy tracks every reference and shows backlinks in note previews. Query links with /backlinks or raw SQL.

Repeat

Recurring Tasks

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.

Meet

Meetings

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.

Focus

Focus Mode

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.

Markdown you already know,
with superpowers.

Canopy extends familiar markdown with a lightweight bracket notation. No proprietary format — files remain perfectly readable everywhere.

Entity Types

[ ] Open todo
[x] Completed todo
[-] Cancelled todo
[!] Important note
[g] Active goal
[?] Open question
[>] Action item
[p] PTO / time off

Attributes & Tags

[ ] 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

Frontmatter

---
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.

Smart Dates

# 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

Nine views.
One keystroke each.

Press a number key (or ?) to switch instantly. Every view is keyboard-driven with contextual actions.

Today Dashboard

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.

  • d Mark done
  • x Cancel
  • r Reschedule
  • F Focus today
  • n Quick-add
  • e Edit in $EDITOR
  • [ Previous day
  • ] Next day
  • t Return to today

Todos

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.

  • d Mark done
  • x Cancel
  • r Reschedule
  • F Focus today
  • n Quick-add
  • f Fuzzy filter
  • e Edit in $EDITOR

Goals

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.

  • d Mark achieved
  • x Cancel goal
  • r Reschedule target
  • F Focus today
  • f Fuzzy filter
  • e Edit in $EDITOR

Notes

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.

  • Enter Preview file
  • e Open in $EDITOR
  • f Fuzzy filter
  • /grep Content search

Query

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.

  • /query SQL Run raw SQL
  • /query name Run saved query
  • /save name Save last query
  • f Fuzzy filter
  • F Focus today
  • e Edit in $EDITOR

Dashboards

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.

  • Enter Select dashboard
  • f Fuzzy filter
  • /dashboard name Open by name
  • Esc Back to list

Tags

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.

  • Enter View tag contents
  • f Fuzzy filter
  • e Open file in $EDITOR
  • Esc Back to list

Templates

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.

  • Enter Preview template
  • e Edit template
  • f Fuzzy filter
  • /new-template Create new

Help

Built-in documentation and quick references. Browse help topics covering entity syntax, keybindings, commands, templates, and more — without leaving the TUI.

  • Enter Preview topic
  • f Filter topics
  • j/k Navigate
  • Esc Back to list

20 slash commands.
Type / and go.

Create notes, run queries, filter views, generate from templates — all without reaching for the mouse. Tab-completion built in.

Create

/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

/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

Navigate

/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

Configure

/configOpen config.toml in editor
/save [name]Save last query
/quitExit Canopy

Dashboards that
actually compute.

Build custom views with TOML for simple layouts, or Lua for full programmatic control.

TOML Dashboard

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}%'
"""

Lua Dashboard

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},
}

Built on principles
that respect your data.

01

Files Are Truth

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.

02

Elm Architecture

The TUI follows the Elm pattern via Bubbletea: Model, Update, View. Async commands and messages keep the UI responsive. State is predictable and debuggable.

03

Action Chain

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.

04

Pure Go

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.

Data Flow
📄
Markdown
Files
Parser
🗃
SQLite
Index
🖥
TUI
$EDITOR
File watcher closes the loop — external edits are detected and re-indexed automatically.

Define your own
entity types.

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

A weekly review
that actually works.

Six guided steps to close loops, catch dropped balls, and plan the week ahead.

1

Overdue Items

Triage everything past due. Reschedule, complete, or cancel.

2

Stale Focus

Clean up items focused in the past that were never addressed.

3

Completed

Celebrate wins. See everything you shipped in the last 7 days.

4

Project Check-in

Review each tracked project's open items and recent activity.

5

People Check-in

See recent meetings and open items for each person you manage.

6

Next Week Prep

Preview upcoming deadlines, meetings, and focus items.

Ready to grow your
second brain?

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

Also from programmingjosh.com

Fractal Hierarchical project management in your terminal