Skip to content

About

Dashboard and pdash CLI for managing thirty-odd concurrent projects

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Project Dashboard

A dashboard and CLI for running thirty-odd side projects without losing track of any of them.

Stack: TypeScript · Node.js · Express · Vite · SQLite · vitest

What it does

Every project carries a .dashboard/board.json — Kanban cards, current phase, next step, quickstart commands. This aggregates all of them into one view and joins them against live git activity, so a project's real state and its claimed state sit side by side.

The pdash CLI works from inside any project directory and edits that project's board, so tracking happens where the work happens instead of in a separate app you forget to open. Cards can be owned by me or by an AI agent, which is what makes it a coordination tool rather than a to-do list.

It also tracks per-project token usage and can attach a browser terminal to a running Claude Code session.

Running it

npm install
npm run install:cli    # puts `pdash` on your PATH
npm run dev:server -w @dashboard/web
npm run dev:ui -w @dashboard/web

Status

In daily use — this is the tool I actually manage my projects with, including the repo you're reading it in.


Setup

npm install
npm run install:cli                                    # put `pdash` on your PATH
cp projects.config.example.json projects.config.json   # edit roots if needed

install:cli symlinks bin/pdash into ~/.local/bin, so pdash works from any project directory (operating on that project's .dashboard/board.json). Re-run it if you move this repo.

Run

Two terminals (dev):

npm run dev:server -w @dashboard/web   # API on 127.0.0.1:4317
npm run dev:ui -w @dashboard/web       # Vite UI on 5173, proxies /api

Production-style (single server serving the built UI):

npm run build && npm start             # http://127.0.0.1:4317

Browser Claude Sessions

The dashboard can open a claude session per project in a slideover terminal (xterm.js over WebSocket, backed by node-pty + tmux).

Requirements: tmux must be installed on the host.

How it works:

  • Each session runs in a named tmux window (pdash-<slug>) so sessions persist across dashboard restarts — you can detach from the terminal and return later.
  • The default launch command is claude --dangerously-skip-permissions. Override it per-project or globally via actions.claude in projects.config.json.
  • Projects with a live session show an active badge on their card.

Security: The server binds to 127.0.0.1 only; no external access.

GitHub sync

Each project tile shows one derived state — synced, N ahead, uncommitted changes, no remote, or blocked — from local git plus the last secret scan. Projects with nothing to do show nothing, so the grid stays quiet.

Sync commits outstanding work and pushes it, per project or across the out-of-sync set. Nothing syncs on a timer. Every write to GitHub sits behind a click, because the point of the secrets gate is that a human decision precedes it; a scheduler removes exactly that.

The gate: gitleaks scans the full history and the working tree before anything is staged. Any match stops that repo — nothing is committed, nothing is pushed — and files a card in "Waiting on you" naming file, line, and rule. Secret values are redacted, so a leak report never becomes a second copy of the leak. The same standard applies to private repos: git history is permanent, and a private repo can be made public later.

The working-tree scan is restricted to what git add -A would actually commit. Without that, every gitignored .env — where real credentials are supposed to live — would flag, and every project would sit permanently blocked.

Projects with no remote get Publish, which creates a private repo and pushes. There is no code path that can produce a public repo; making one public is a decision taken on GitHub.

Boards are gitignored in their own repos (they carry internal hosts and next-steps) and back up instead to a single private pdash-boards repo, laid out as <project>/board.json.

CLI (pdash)

After npm run install:cli, run pdash inside any project directory:

pdash init
pdash add "fix login bug" -t bug
pdash show <id>            # full card, including notes
pdash move <id> doing
pdash done <id>
pdash next "where I left off"
pdash list --open

Without the global install, invoke it directly: npx tsx <repo>/packages/cli/src/pdash.ts init.

About

Dashboard and pdash CLI for managing thirty-odd concurrent projects

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages