A personal dashboard for your projects folder

A self-hosted welcome board, select any directory where your work lives and it'll track git state, the stack, your AI usage and much more.

The mission-control board: fleet ledger with forge chips, alerts, and the My issues & pull requests feed
My board today, a real capture. The board picker in the masthead re-skins this whole site with the app's own picker.

You add the folder

Its immediate subdirectories become the projects, no recursion; the scanner reads them and never writes into your repos.

A per-project fingerprint (directory mtime, .git/HEAD, .git/index, a git status --porcelain hash) means a warm rescan re-reads only what moved.

one scan pass
~/workspace/kiln
  branch    forge-sqlite · 2 dirty
  last      2h ago
  remote    github.com:DimitriGilbert/kiln
  stack     node · pnpm
  alert     WRN stale-wip

The board fills in

Needs attention · 4 of 33 projects
  • ERRkeystoneDiverged: 4 ahead, 2 behind4 dirty2 days ago
  • WRNslopcadNo remote configured4 dirty22 hours ago
  • WRNstationioUncommitted changes sitting for 3+ weeks1 dirty10 days ago
  • INFdocs-dgafNo activity in 90+ days4 months ago
triagesample rows, the alert texts are the scanner's verbatim messages

Every project carries a recency LED that cools over roughly 90 days. The git state turns into seven health alerts (diverged, no-remote, unpushed, dirty, stale-wip, behind, dormant) with the loud ones rolled to the top.

Press / anywhere to filter by name, path, stack, branch, remote, or a note you left yourself.

Your forge work joins the board

Repos with a GitHub remote bring their open issues and PRs along, and the feed pulls yours from every repo, workspace or not. The fetch runs through your own gh CLI when you press Sync (five-minute floor per repo, one fetch at a time) and lands as a sqlite snapshot, so rendering never spends your rate limit.

My issues & pull requests
50+ · 11:31Sync
  • #142Shed-order guard keeps the ledger a table at every widthacme/kilnledger2h ago
  • #45Report MISSING state should link to the generatoracme/gitsnitch5h ago
  • #139Ideation: persist the interview under .ideadump/acme/kilnideationyesterday
  • #136Feed rows carry owner/repo attributionacme/forgeyesterday
  • #31Pinned vitals count drifts after a hideacme/kilntriage2d ago
  • #12Meadow digests: momentum + rhythm bandsacme/meadow6d ago

50+ shown, a list hit the page limit

forge feedsample rows, the real feed lists your open items, workspace repo or not

Open a project

A project page: git actions band, health and activity panels, commit log, and the files / artifacts / ideation tabs
One of mine, same folder one level down.

Any project opens into its own page: a note field for where you left off, fetch / pull / push, a branch switcher that probes before it clobbers anything, a file browser that cannot escape the project folder, build artifacts, an AI interview that writes a PRD and plan into docs/, and a browser IDE.

Ground rules

Local
Everything the app remembers sits in one sqlite file under your XDG data dir. No accounts, no cloud.
Your own gh
The only network the app does is forge sync, through the GitHub CLI you are already logged into. No embedded tokens, no proxy.
Sync is a button
Nothing polls or fetches on page load, and the server enforces the five-minute floor even if you hammer it.
No fake numbers
Counts render as 50+ at the page cap, Never synced before the first sync, stale after an hour. A repo with no data never renders as an empty one.
The board keeps growing
Panels ship over time; the ones you have drag, resize, and shed, and the arrangement persists.

Mine, today

I built this for a folder of thirty-odd repos, half of them with weeks-old uncommitted changes and three with no remote.

These are my real boards: I keep mission-control on dark, bento is the loose grid, meadow is the daylight scheme. Yours will carry your projects, arranged your way.

Install

sh
curl -fsSL https://welcome-workspace.dbuild.dev/install.sh | sh

Node 22+, git, and curl or wget. The script verifies the download against the release's SHA256SUMS.txt, installs to ~/.local/share/workspace-welcome, and starts a systemd user service on Linux; read it first if that is your habit.