[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82694":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":14,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":15,"starSnapshotCount":15,"syncStatus":17,"lastSyncTime":36,"discoverSource":37},82694,"tuiboard","NazzarenoGiannelli\u002Ftuiboard","NazzarenoGiannelli","Terminal kanban on plain markdown, with optional Today\u002FTomorrow planner, 24h agenda + calendar, and a live Claude Code agent view. Use only the panels you want.",null,"TypeScript",80,7,1,3,0,28,2,47.01,"MIT License",false,"main",true,[24,25,26,27,28,29,30,31,32],"bun","kanban","markdown","obsidian","opentui","productivity","solidjs","terminal","tui","2026-06-12 04:01:38","# tuiboard\n\nA terminal dashboard that unifies **kanban**, a **Today\u002FTomorrow virtual\npanel**, a **24-hour agenda** (with a read-only Google \u002F Microsoft 365\ncalendar overlay), and a **live agent view** for Claude Code sessions — all\non top of plain markdown task files.\n\nBuilt with [OpenTUI](https:\u002F\u002Fopentui.com) + SolidJS on Bun. Cross-platform\n(Linux, macOS, Windows). No vendor lock-in: boards are CommonMark with\nthe Obsidian Tasks-plugin emoji vocabulary, so they open and edit fine in\nany markdown editor.\n\n![tuiboard — kanban board, Today\u002FTomorrow panel, 24h agenda with calendar overlay, and live Claude Code agents in one terminal dashboard](docs\u002Fscreenshot.png)\n\n## Install\n\nRequires [Bun](https:\u002F\u002Fbun.sh) ≥ 1.2 — tuiboard runs on the Bun runtime (it's\nnot a Node CLI). OpenTUI ships its own native renderer binaries; Bun picks the\nright one for your platform automatically. Pick whichever install fits:\n\n**Global, straight from GitHub** (no npm needed) — run `tuiboard` from anywhere:\n\n```bash\nbun install -g github:NazzarenoGiannelli\u002Ftuiboard\ntuiboard\n```\n\n**Global, from npm:**\n\n```bash\nbun install -g tuiboard      # or run once, no install: bunx tuiboard\n```\n\n**From source** (for hacking on it):\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FNazzarenoGiannelli\u002Ftuiboard.git\ncd tuiboard\nbun install\nbun run dev          # or: bun link  → then `tuiboard` globally, live-linked\n```\n\n## Quick start\n\nStarting fresh — no Obsidian, no special folders required:\n\n1. **Install Bun** ([bun.sh](https:\u002F\u002Fbun.sh)), then `bun install -g tuiboard`.\n2. **Make one or more board files.** A board is a plain `.md` file: every `##`\n   heading is a column, every `- [ ]` line is a task. The simplest board:\n   ```markdown\n   ## To Do\n   - [ ] My first task\n\n   ## In Progress\n\n   ## Done\n   ```\n   Create one file per tab you want (e.g. `Work.md`, `Personal.md`). Columns\n   named exactly `Done` and `Archive` are treated specially (hidden from the\n   board view but used by the done-stats and the archive action).\n3. **Point tuiboard at them.** Create `~\u002F.config\u002Ftuiboard\u002Fconfig.yaml` (found\n   from any directory) with **absolute** paths:\n   ```yaml\n   boards:\n     - path: \u002Fhome\u002Fyou\u002Fnotes\u002FWork.md\n       name: Work\n     - path: \u002Fhome\u002Fyou\u002Fnotes\u002FPersonal.md\n       name: Personal\n   ```\n   Or skip the config entirely and just run `tuiboard` inside a folder that\n   already contains `.md` files with `- [ ]` tasks — it auto-discovers them.\n4. **Run it:** `tuiboard` (or the short alias `tb`).\n\n**The Agent view needs zero setup.** tuiboard reads your local Claude Code\nsessions from `~\u002F.claude\u002F` automatically, so the live agent strip fills in as\nsoon as you've used Claude Code — nothing to connect or configure. (Tools that\ndon't write to `~\u002F.claude`, like Codex, won't show up there.)\n\nSee [Configure](#configure) for assignees, the done\u002Farchive column names, and\nthe optional custom \"open session in your terminal\" command.\n\n### Let an AI agent set it up for you\n\nPaste this into **Claude Code** (or Codex \u002F Cursor) from any directory — it\ninterviews you and wires everything up:\n\n```text\nI just installed `tuiboard` (a terminal kanban dashboard:\nhttps:\u002F\u002Fgithub.com\u002FNazzarenoGiannelli\u002Ftuiboard). Set it up for me from scratch:\n\n1. Ask me: (a) which directory should hold my board markdown files,\n   (b) how many boards\u002Ftabs I want and their names (e.g. Work, Personal),\n   (c) any assignee names I use.\n2. Create one markdown file per board in that directory. Each file: a few `##`\n   column headings — default `## To Do`, `## In Progress`, `## Done` — and no\n   tasks yet. Always include a `## Done` column (tuiboard treats columns named\n   `Done` and `Archive` specially and hides them from the board view).\n3. Create a global config at `~\u002F.config\u002Ftuiboard\u002Fconfig.yaml` (resolve the real\n   home path) with a `boards:` list pointing at those files by ABSOLUTE path,\n   plus `assignees: [...]`, `done_column: Done`, `archive_column: Archive`.\n4. Do NOT configure the Agent view — tuiboard reads `~\u002F.claude` automatically.\n5. Ask me whether I want to overlay my Google Calendar or Microsoft 365 events\n   on the Agenda. If yes, tell me to run `tuiboard calendar-setup google` (or\n   `microsoft`) — it interviews me, opens the browser, and prints the exact\n   `calendars:` YAML block to add. Don't try to do the OAuth yourself. If no,\n   skip it (it's optional and can be added later).\n6. Show me the final config, then tell me to run `tuiboard`, and how to add a\n   board later (create a new `.md` and append it to the `boards:` list).\n\nConfirm the directory and file names with me before writing any files.\n```\n\n## Configure\n\nCopy `.tuiboard\u002Fconfig.example.yaml` to a config location and edit the\n`boards:` list to point at your markdown files. tuiboard resolves the config\nin this order (first hit wins):\n\n1. **`$TUIBOARD_CONFIG`** — explicit path to a config file.\n2. **Project-local** — `.tuiboard\u002Fconfig.yaml`, walking up from the cwd. Drop\n   a `.tuiboard\u002F` folder at a project\u002Fvault root and it's used whenever you\n   launch from inside that tree.\n3. **Global** — `~\u002F.config\u002Ftuiboard\u002Fconfig.yaml` (or `~\u002F.tuiboard\u002Fconfig.yaml`).\n   Use **absolute** board paths here and `tuiboard` shows your boards from\n   *any* directory — the usual setup for a single-vault user.\n4. **Fallback** — scan the cwd for any `.md` file containing `- [ ]` tasks.\n\n```yaml\nboards:\n  - path: .\u002FWork.md\n    name: Work\n  - path: .\u002FPersonal.md\n    name: Personal\n\nassignees: [Alice, Bob]\ndone_column: Done\narchive_column: Archive\n\n# Optional: override Enter in the Agents zone. argv array, {cwd}\u002F{sessionId}\n# substituted, run directly (no shell — element 0 must be a real binary\u002Fabs\n# path, NOT a shell builtin or Windows App Execution Alias). Defaults to\n# opening a WezTerm tab with `claude --resume \u003Cid>`. For a custom layout:\n# resume_command: [\"nu\", \"C:\u002FUsers\u002Fyou\u002F.config\u002Ftuiboard\u002Fcode-resume.nu\", \"{cwd}\", \"{sessionId}\"]\n```\n\n## Calendars (Agenda overlay)\n\nThe **Agenda** zone (the 24h timeline) can overlay read-only events from Google\nCalendar and Microsoft 365 alongside your time-blocked tasks — rendered as\ncolored `📅` blocks you can't edit, so the day's real shape is visible at a\nglance. All-day events are skipped; each calendar keeps its own color. Events\nare cached 30 min on disk and refreshed every 5 min. **Bring your own\ncredentials** — there's nothing to sign up for and nothing leaves your machine.\n\nConnect a calendar with the built-in setup command:\n\n```bash\ntuiboard calendar-setup google      # opens your browser (read-only scope)\ntuiboard calendar-setup microsoft   # device-code flow, no redirect\n```\n\n**Google** needs a one-time OAuth client (free): Google Cloud Console → enable\n*Google Calendar API* → create an *OAuth client ID* (type **Desktop app**) →\ndownload the JSON to `~\u002F.config\u002Ftuiboard\u002Fgoogle_credentials.json`, then run the\ncommand above. **Microsoft** needs an Azure app registration (Public client,\n`Calendars.Read` delegated) whose client ID goes in\n`~\u002F.config\u002Ftuiboard\u002Fazure_config.json` — running `calendar-setup microsoft` with\nno config writes a template that walks you through it.\n\nAfter connecting, the command prints the exact YAML to paste into your config:\n\n```yaml\ncalendars:\n  google:\n    enabled: true\n    token: ~\u002F.config\u002Ftuiboard\u002Fgoogle_token.json\n  microsoft:\n    enabled: true\n    config: ~\u002F.config\u002Ftuiboard\u002Fazure_config.json\n    token_cache: ~\u002F.config\u002Ftuiboard\u002Fms_token.json\n```\n\nPaths support `~` and resolve against the config dir if relative. A missing,\nexpired, or unconfigured calendar never breaks the board — it just shows no\nevents. Set either provider's `enabled: false` (or drop the block) to turn it\noff; add a `color:` to override the fallback block color.\n\n## Markdown board format\n\n`tuiboard` reads and writes **plain CommonMark** with the Obsidian\nTasks-plugin emoji vocabulary. Any markdown editor renders these files\nsensibly; the Obsidian Kanban plugin renders them as a kanban; we render\nthem as a TUI.\n\n### Minimal example\n\n```markdown\n---\nkanban-plugin: board\n---\n\n## Today\n\n- [ ] Fix auth flow @nazza ⏳ 2026-05-27 ⌚ 09:00-10:30 #pr-followup\n- [x] Review PR #412 ✅ 2026-05-26\n\n## In Progress\n\n- [ ] Migrate timeline to OpenTUI @nazza\n\n## Done\n```\n\nThe `kanban-plugin: board` frontmatter is **optional** — it's only there so the\nfile also renders as a board in Obsidian's Kanban plugin. tuiboard itself needs\njust the `##` column headings and `- [ ]` task lines.\n\n### Metadata vocabulary\n\n| Symbol | Meaning | Notes |\n|---|---|---|\n| `## Heading` | Column name | One column per H2 heading |\n| `- [ ]` \u002F `- [x]` | Task (open \u002F done) | Standard markdown task list |\n| `@name` | Assignee | Configurable list in config.yaml |\n| `#tag` | Tag | Any hashtag; passed through verbatim |\n| `⏳ YYYY-MM-DD` | Scheduled date | Tasks-plugin convention |\n| `📅 YYYY-MM-DD` | Due date | Tasks-plugin convention |\n| `🛫 YYYY-MM-DD` | Start date | Tasks-plugin convention |\n| `✅ YYYY-MM-DD` | Done date | Tasks-plugin convention |\n| `⌚ HH:MM-HH:MM` | Time block | tuiboard-specific (Tasks plugin has no time-of-day) |\n| `🔺 ⏫ 🔼 🔽 ⏬` | Priority | Tasks-plugin convention |\n\nAnything else stays in the task text untouched on write-back. Roundtrip is\nbyte-for-byte preserving when a task hasn't been edited; structured fields\nare rebuilt only after an in-app mutation.\n\n## Layouts\n\nLaunch `tuiboard` with no flag for the default 4-zone dashboard.\n\n| Flag | View | Use case |\n|---|---|---|\n| (none) | **Dashboard** — all 4 zones | Default; everything in one terminal |\n| `--view=board` | Kanban + virtual panel only | Focus mode, or a single WezTerm pane |\n| `--view=timeline` | Timeline fullscreen | Wall-mounted \"what's now\" |\n| `--view=agents` | Agent view fullscreen | Cross-machine session monitor |\n\nThe dashboard auto-collapses optional zones on narrow terminals:\n\n| Terminal width | Default zones visible |\n|---|---|\n| ≥ 150 cols | virtual + board + timeline + agents |\n| 120–149 | virtual + board + agents |\n| 100–119 | virtual + board |\n| \u003C 100 | board only |\n\n`F1` \u002F `F2` \u002F `F3` toggles override the auto-collapse for the current\nsession (until the next terminal resize).\n\n## Keyboard\n\n### Navigation\n\n| Key | Action |\n|---|---|\n| `h j k l` \u002F arrows | Move cursor inside the active zone |\n| `Tab` | Cycle to next board |\n| `1`..`9` | Jump to board N |\n| `v` | Toggle Today\u002FTomorrow virtual panel focus |\n| `Shift-Tab` | Cycle active zone (virtual → board → timeline → agents) |\n| `F1` \u002F `F2` \u002F `F3` | Toggle visibility of Virtual \u002F Timeline \u002F Agents zones |\n| `z` | Zoom active zone to full screen |\n| `r` | Refresh everything — reload boards from disk, rescan agents, force-refetch the agenda calendar (bypasses the 30-min cache) |\n\n### Agenda (timeline zone)\n\n| Key | Action |\n|---|---|\n| `[` \u002F `]` | Previous \u002F next day — shows that day's tasks **and** calendar events (works from any zone) |\n| `\\` | Jump back to today |\n| `c` | Arm mode: click a task, then click a slot to schedule (works from any zone) |\n| `j` \u002F `k` | While armed: nudge the block ±15 min |\n| `+` \u002F `-` | While armed: resize the block's end ±15 min |\n\n### Task actions (work in board, virtual, AND timeline zones)\n\n| Key | Action |\n|---|---|\n| `Enter` | Toggle done |\n| `o` | Open detail view |\n| `e` | Edit task text |\n| `s` | Schedule date modal |\n| `t` | Set scheduled = today |\n| `m` | Set scheduled = tomorrow |\n| `.` | Schedule **now** — time block at the next 15-min slot |\n| `b` | Set time block modal |\n| `p` | Cycle priority (none → 🔺 → ⏫ → 🔼 → 🔽 → ⏬ → none) |\n| `a` | Set assignee |\n| `c` | Toggle calendar **arm mode** — then click a task, click a timeline slot, repeat |\n| `Shift-C` | Copy task to clipboard (markdown line — paste as context for Claude Code) |\n| `d` | Delete task (with confirm) |\n| `Shift-X` | Archive task → moves to Archive column |\n\n### Multi-select\n\n| Key | Action |\n|---|---|\n| `Space` | Mark \u002F unmark task — task actions then apply to ALL marked |\n| `Esc` | Clear marks (when no modal is open) |\n\n### Board-only \u002F bulk \u002F global\n\n| Key | Action |\n|---|---|\n| `n` | New task in current column (quick-add syntax) |\n| `Shift-T` | Reset ALL overdue tasks (any board) to today |\n| `Ctrl-Z` | Undo last mutation |\n| `?` | Help modal with the full reference |\n| `q` · `Ctrl-C` | Quit |\n\n## Status\n\n- **v0.6** — adds the Agenda calendar overlay (Google + Microsoft 365,\n  read-only, BYO credentials), day-navigation (`[` \u002F `]` \u002F `\\`) to page tasks\n  and events across days, and a manual full-refresh key (`r`).\n- **v0.5** — daily-driver ready. Kanban + virtual + timeline + agents\n  all functional, multi-select, undo, atomic file roundtrip, mouse click,\n  responsive layout. Tested on Windows with WezTerm; Linux\u002FmacOS should\n  work via the same OpenTUI binaries (untested).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","tuiboard 是一个基于终端的看板工具，它将 kanban、今日\u002F明日计划面板、24小时日程表（支持只读的 Google 或 Microsoft 365 日历覆盖）以及实时 Claude Code 代理视图集成在一个界面中。该项目使用 TypeScript 编写，并基于 OpenTUI 和 SolidJS 构建在 Bun 运行时之上，支持跨平台（Linux、macOS、Windows）。tuiboard 的核心优势在于其高度的灵活性和可定制性，用户可以根据需要选择使用哪些面板。此外，它不依赖特定供应商，所有看板数据均以通用 Markdown 格式存储，便于在任何 Markdown 编辑器中打开和编辑。适合需要高效管理任务和个人日程安排的技术人员或团队使用。","2026-06-11 04:08:58","CREATED_QUERY"]