Overview

Overview

Selfstack is a self-hosted dashboard builder for homelabs and teams — a lightweight alternative to heavier homelab dashboards, designed to deploy in a single Docker container. Users organise bookmarks, services and tools into boards made of categories, groups and tiles, with full control over layout, colours and access.

I built it end to end: data model, API, UI and deployment, as a real product rather than a demo.

What I built

  • Multiple boards per user with drag-and-drop reordering of categories, groups, tiles and boards
  • Two layout modes (auto-flow grid and free placement) with responsive fixed tile sizes
  • Per-tile / group / category colours, an icon picker (full Lucide library or custom uploads) and per-tile status-ping indicators
  • Public boards, per-board roles (owner / editor / viewer), organisations for teams, and session auth with two-factor authentication (TOTP)
  • An admin panel with user CRUD, org management, a system-health page and an SMTP configuration UI

Technical approach

Built on Next.js 16 (App Router, Turbopack, standalone output) and React 19, with Prisma 6 over SQLite for data. The UI uses shadcn/ui on Tailwind CSS 4, dnd-kit for drag-and-drop and Lucide for icons. Auth is session-based with JWT (jose) and bcrypt, 2FA via TOTP with QR enrolment, and transactional email through nodemailer. The whole app ships as one Docker container with an entrypoint that runs migrations on boot. UI is available in German and English, applied SSR-side to avoid flashes.

What I took away

Selfstack is my "own the whole stack" project — schema to deploy. Getting drag-and-drop, granular access control, 2FA and a clean single-container deployment to all work together taught me more about building a real product than any tutorial could.

Highlights

  • Drag-and-drop boards with categories, groups and tiles
  • Sharing, per-board roles and organisations for teams
  • Two-factor authentication (TOTP) with QR enrolment
  • Single-container Docker deployment with an admin panel
0Stars