TweetDeck-style GitHub explorer — browse repos and releases in columns
GitDeck is a client-side Svelte 5 SPA that displays GitHub repositories in a horizontal column layout inspired by TweetDeck. No backend required — everything runs in the browser with fetch() calls to the public GitHub REST API.
- Column layout — Each user or repo opens in its own full-height vertical column, scrollable independently
- User view — Browse all public repos for any GitHub user, sorted by last update
- Repo view — See repo details, latest release, README (rendered as markdown) inline
- Editable columns — Click the column title to change the query (user or user/repo format)
- Persistence — Column layout survives page refresh via localStorage
- Auto-refresh — Columns silently refresh every 60 seconds
- Zero backend — Pure
fetch()calls to the GitHub REST API (unauthenticated, rate-limited) - Dark theme — GitHub-inspired dark design
docker compose up --buildOpen http://localhost:8088.
GHCR_OWNER=macedot IMAGE_TAG=latest docker compose up| Variable | Default | Description |
|---|---|---|
GHCR_OWNER |
macedot |
GHCR image namespace |
IMAGE_TAG |
latest |
Image tag (e.g. 0.1.0, latest) |
- Click New Tab (center when empty,
+button on the right when columns exist) - Type a GitHub username (e.g.
torvalds) or a user/repo (e.g.torvalds/linux) - Press Enter — the column loads
- Click the title to edit, X to remove
- Node.js 22+
- npm
npm install
npm run dev
# → http://localhost:5173npm run build # production build → dist/
npm run preview # preview production build locally┌──────────────────────────────────────────────────────────┐
│ Container (gitdeck) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ nginx:alpine :8080 │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Svelte 5 SPA (static files) │ │ │
│ │ │ GitHub REST API → fetch() │ │ │
│ │ │ Column state → localStorage │ │ │
│ │ │ Auto-refresh → 60s │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
How it works:
- API layer (
src/lib/github.js) — Fetches repos (/users/{user}/repos), single repo (/repos/{owner}/{repo}), latest release (/repos/{owner}/{repo}/releases/latest), and README (/repos/{owner}/{repo}/readme) from the public GitHub REST API. Rate limit tracking via response headers. - State — Svelte 5
$staterunes manage columns, editing, and data.$effectrunes handle localStorage persistence and auto-refresh intervals. - Rendering —
markedlibrary renders README markdown to HTML. Repo cards show language, stars, forks, and relative dates. - Container — Multi-stage Docker build:
node:22-alpinebuilds the SPA with Vite,nginx:alpineserves static files with gzip compression and SPA routing.
The project ships as a single Docker container with the Svelte SPA served by nginx:
| Service | Base Image | Notes |
|---|---|---|
gitdeck |
nginx:alpine |
Runs as non-root (nginx user) on port 8080. Published to ghcr.io/macedot/gitdeck |
GitHub Actions builds and pushes Docker images to GHCR on every published release (prereleases excluded). Images are tagged with both the release version and latest.
This project is licensed under the GNU Affero General Public License v3.0.