[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"blog-forge-online-github-dashboard":3},{"excerpt":4,"private":5,"author":6,"slug":7,"featured":8,"date":9,"status":10,"title":11,"tags":12,"thumbnail":18,"load_readme_from_this_repo":19,"content":20,"body":21},"Sync your GitHub repos, track goals and next steps, and browse public repos as a guest — powered by Next.js and Netlify Blobs.",false,"Jovylle Bermudez","forge-online-github-dashboard",true,"2026-05-31","published","Forge Online: a GitHub project dashboard without a database",[13,14,15,16,17],"github","nextjs","netlify","devtools","side-project","","https://github.com/jovylle/forge-online","# Forge Online: a GitHub project dashboard without a database\n\nI 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.\n\n**Repo:** [github.com/jovylle/forge-online](https://github.com/jovylle/forge-online)\n\n## Why a personal repo dashboard\n\nGitHub 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:\n\n- **goal** — what this repo is for\n- **status** — active, wip, abandoned, or done (manual override)\n- **notes** and **nextStep** — free-form context GitHub never stored\n\nWhen 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.\n\n## Architecture: OAuth + Blobs, server-only GitHub\n\n| Layer | Choice |\n|-------|--------|\n| Framework | Next.js 16 App Router |\n| Language | TypeScript |\n| Styling | Tailwind CSS 4 |\n| Auth | Auth.js (next-auth) + GitHub provider |\n| Storage | Netlify Blobs (`@netlify/blobs`) — per-user keys |\n| Validation | Zod |\n| Deploy | Netlify (`netlify.toml`, `@netlify/plugin-nextjs`) |\n\nDesign choices I wanted to ship with:\n\n- **No database server** — blob storage plus GitHub as the source of truth for repo lists.\n- **Server-only GitHub API** — OAuth tokens never reach the client.\n- **Multi-tenant by GitHub user id** — each login gets isolated metadata keys.\n\n`proxy.ts` gates pages and APIs; signed-out visitors land on `/login`.\n\n## Signed-in: sync, search, three views\n\nAfter GitHub OAuth (repo scope for private repos), **Sync** pulls your owned repositories. The dashboard supports:\n\n- **Search** across name, description, topics, language, goal, notes, and more\n- **Filters** by status and visibility (public / private)\n- **Sort** by created, pushed, updated, name, or status — with **newest or oldest** for date fields\n- **Views:** editable **cards**, compact **list**, read-only **table**\n- Summary cards plus a manual **Sync** button\n\nAuto status when you have not overridden:\n\n- Pushed/updated within **30 days** → active\n- Within **90 days** → wip\n- Older → abandoned\n- **Archived** on GitHub → abandoned\n\n## Guest mode (no sign-in)\n\nFrom `/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.\n\n## What it is not\n\n- Not a replacement for GitHub Issues or Projects\n- Not team collaboration — one GitHub account per login\n- Guest mode does not store data or show private repos\n\n## Routes (quick map)\n\n| Route | Purpose |\n|-------|--------|\n| `/login` | GitHub sign-in + guest username entry |\n| `/dashboard` | Authenticated dashboard |\n| `/guest/[username]` | Public-repo browser |\n| `GET /api/dashboard` | Dashboard payload |\n| `POST /api/sync` | Trigger GitHub sync |\n| `GET/PUT /api/repos/[repoId]/metadata` | Read/write per-repo metadata |\n| `/api/auth/[...nextauth]` | Auth.js |\n\n## Recent ship log\n\n- Guest browsing (`/guest/{username}` + login form)\n- Dashboard view modes: cards, list, table\n- Ascending/descending sort for created / pushed / updated dates\n\n---\n\n*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.*\n","---\ntitle: \"Forge Online: a GitHub project dashboard without a database\"\ndate: 2026-05-31T12:00:00Z\ndescription: \"Sync your GitHub repos, track goals and next steps, and browse public repos as a guest — powered by Next.js and Netlify Blobs.\"\ncategories: [\"projects\"]\ntags: [\"github\", \"nextjs\", \"netlify\", \"devtools\", \"side-project\"]\nfeatured: true\ndraft: false\nauthor: \"Jovylle Bermudez\"\n---\n",1783435413719]