Jovylle Bermudez

← Back to Blog

Forge Online: a GitHub project dashboard without a database

Jovylle Bermudez
githubnextjsnetlifydevtoolsside-project

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.