Forge Online: a GitHub project dashboard without a database
I have too many GitHub repos and not enough context: which ones are active, which stalled, what the goal was, what to do next. Forge Online is a multi-user dashboard that syncs repos you own, layers lightweight “forge” metadata on top of GitHub data, and adds automatic status hints from push dates — with no Postgres, just Netlify Blobs per user.
Repo: github.com/jovylle/forge-online
Why a personal repo dashboard
GitHub is great for code and issues; it is weaker as a personal inventory across dozens of side projects. Forge Online centralizes owned repositories in one place and lets you record:
- goal — what this repo is for
- status — active, wip, abandoned, or done (manual override)
- notes and nextStep — free-form context GitHub never stored
When you do not set a status, the app infers one from pushed_at / updated_at (and treats archived repos as abandoned). Manual override always wins.
Architecture: OAuth + Blobs, server-only GitHub
| Layer | Choice |
|---|---|
| Framework | Next.js 16 App Router |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| Auth | Auth.js (next-auth) + GitHub provider |
| Storage | Netlify Blobs (@netlify/blobs) — per-user keys |
| Validation | Zod |
| Deploy | Netlify (netlify.toml, @netlify/plugin-nextjs) |
Design choices I wanted to ship with:
- No database server — blob storage plus GitHub as the source of truth for repo lists.
- Server-only GitHub API — OAuth tokens never reach the client.
- Multi-tenant by GitHub user id — each login gets isolated metadata keys.
proxy.ts gates pages and APIs; signed-out visitors land on /login.
Signed-in: sync, search, three views
After GitHub OAuth (repo scope for private repos), Sync pulls your owned repositories. The dashboard supports:
- Search across name, description, topics, language, goal, notes, and more
- Filters by status and visibility (public / private)
- Sort by created, pushed, updated, name, or status — with newest or oldest for date fields
- Views: editable cards, compact list, read-only table
- Summary cards plus a manual Sync button
Auto status when you have not overridden:
- Pushed/updated within 30 days → active
- Within 90 days → wip
- Older → abandoned
- Archived on GitHub → abandoned
Guest mode (no sign-in)
From /login, enter any GitHub username → /guest/{username}. That path uses the public GitHub API for that user’s public repos only: read-only, no saved forge metadata, CTA to sign in for private repos and notes.
What it is not
- Not a replacement for GitHub Issues or Projects
- Not team collaboration — one GitHub account per login
- Guest mode does not store data or show private repos
Routes (quick map)
| Route | Purpose |
|---|---|
/login |
GitHub sign-in + guest username entry |
/dashboard |
Authenticated dashboard |
/guest/[username] |
Public-repo browser |
GET /api/dashboard |
Dashboard payload |
POST /api/sync |
Trigger GitHub sync |
GET/PUT /api/repos/[repoId]/metadata |
Read/write per-repo metadata |
/api/auth/[...nextauth] |
Auth.js |
Recent ship log
- Guest browsing (
/guest/{username}+ login form) - Dashboard view modes: cards, list, table
- Ascending/descending sort for created / pushed / updated dates
Personal builder log entry. If you run many repos and want a forge layer without standing up a database, the source is on GitHub — deploy on Netlify when you are ready.