PrimoDev/ apps

LifeBoard

A modular personal dashboard that runs on your own server

  • Web
  • Self-hosted
  • Open source
View on GitHub

What is LifeBoard?

LifeBoard is a personal dashboard where each area of your life is a pluggable module: thoughts, tasks, money, calendar, goals, GitHub, files and mood. Home pulls in a widget from every module, Inbox handles quick capture, and ⌘K searches across all of them at once.

It's a web-only V1 for a single user, built for the author's personal use: there's no installer or published release, so you run it from source (pnpm + Postgres) or deploy it to Railway for about US$ 7 a month. The code is on GitHub, but the repository has no license.

What it does

  1. 018 working modules: Thoughts, Tasks, Money, Calendar, Goals, GitHub, File Board and Mood
  2. 02A Home that pulls in a widget from every module, plus an Inbox for quick capture
  3. 03⌘K search across modules, including GitHub PRs and files
  4. 04Links between tasks and thoughts, with a backlinks panel
  5. 05Money with accounts, categories, budgets, CSV import and subscriptions with a projected monthly cost
  6. 06Sign-in with email, password and a 6-digit PIN, no external provider
  7. 07GitHub token stored with AES-256-GCM encryption
  8. 08Light, dark or system theme, and an English or Portuguese interface

FAQ

Is LifeBoard free?
The code is public on GitHub and costs nothing, but the repository has no license. To run it you pay for hosting: the README estimates about US$ 7 a month on Railway (Postgres plus the app).
Is it ready to use?
It's a personal V1 built for one user. All 8 modules work, but AI, mobile apps, multi-device sync, offline mode and full data export are deferred to V2. The author says he'll only share it properly if the tool proves its worth.
How do I install it?
There's no installer. Clone the repo, run pnpm install, start a Postgres database (the README uses Docker with Postgres 16), set DATABASE_URL and LIFEBOARD_SECRET_KEY, push the schema and run pnpm dev. On first visit the app shows a setup form to create your user.
Where is my data stored?
In your own Postgres database. LifeBoard is self-hosted and single-user, with no ads and no data sales, and the GitHub token is stored encrypted with AES-256-GCM.
Is there a mobile app?
Not yet. V1 is web-only, and iOS and Android apps are on the V2 list.
Can I build my own modules?
Yes. Every module follows a contract (LifeBoardModule) with a view, a Home widget and optional search. Create the module folder, add it to registry.ts, and the shell puts it in the sidebar, on Home and in ⌘K.

Documentation

README from the lucianodiisouza/lifeboard repository, refreshed on every deploy.

Modular, personal life dashboard. The shell is the product. Modules plug into it.

V1 is a web-only, single-user personal tool. The architecture is shell-first: Home aggregates widgets from each module, Inbox is universal capture, ⌘K searches across modules, and every module is a pluggable app behind a contract.

V1 status (2026-07-27)

Modules in V1 Thoughts, Tasks, Money, Calendar, Goals, GitHub, File Board, Mood (8, fully working)
Money sub-modules Subscriptions (Netflix, Cursor, etc., with monthly equivalent projection)
Cross-module links ✅ tasks ↔ thoughts (the magic)
Code splitting ✅ initial bundle 76KB gzipped (modules lazy-loaded)
⌘K search ✅ cross-module (incl. GitHub PRs, File Boards)
Theme ✅ Light / Dark / System (persisted)
Settings ✅ theme, modules list, GitHub PAT (encrypted), export
AI 🔜 V2 (data model is AI-ready)
Mobile 🔜 V2
Sync / offline 🔜 V2
Auth ✅ email + password + 6-digit PIN, bootstrap installer pattern, server-side sessions
Deploy 🟡 railway.json + Vercel config in docs
Cost ~$7/mo (Railway Postgres + app)

Architecture: shell-first

LifeBoard (monorepo pnpm)
├── apps/
│   ├── web/                       Vite + React + Tailwind + TanStack Query + TipTap
│   │   ├── src/shell/             ← the PRODUCT
│   │   │   ├── ShellLayout        sidebar + main + ⌘K
│   │   │   ├── Sidebar            Home, Inbox, modules
│   │   │   ├── HomeView           aggregates module widgets
│   │   │   ├── InboxView          universal capture
│   │   │   ├── CommandPalette     ⌘K search
│   │   │   ├── SettingsView       theme, modules, GitHub PAT, data
│   │   │   └── theme.ts           zustand + localStorage
│   │   ├── src/modules/           ← PLUGGABLE
│   │   │   ├── registry.ts        MODULES array (single source of truth)
│   │   │   ├── thoughts/          View + HomeWidget + search
│   │   │   ├── tasks/             View + HomeWidget + search
│   │   │   ├── money/             View + HomeWidget + SubscriptionsManager
│   │   │   ├── calendar/          View + HomeWidget + search
│   │   │   ├── goals/             View + HomeWidget + search
│   │   │   ├── github/            View + HomeWidget + PAT connect + sync
│   │   │   ├── fileboard/         View + HomeWidget + upload
│   │   │   └── mood/              View + HomeWidget + daily check-in
│   │   ├── src/lib/
│   │   │   ├── module.ts          LifeBoardModule contract
│   │   │   └── links.ts           cross-module links API
│   │   └── src/components/        shared UI (shadcn-style)
│   └── api/                       Hono + Drizzle + Postgres
│       ├── src/index.ts           REST endpoints
│       ├── src/money.ts           Money module service
│       ├── src/subscriptions.ts   charge projection (pure fn)
│       ├── src/github.ts          GitHub sync + cache
│       ├── src/fileStorage.ts     local blob storage (V1)
│       ├── src/crypto.ts          AES-256-GCM seal/open (PAT)
│       └── src/links.ts           cross-module links resolver
├── packages/
│   └── db/                        Drizzle schema + client (shared)
└── docs/                          25+ design files

Module contract

Every module exports a LifeBoardModule (from apps/web/src/lib/module.ts):

interface LifeBoardModule {
  id: string;
  name: string;
  description: string;
  icon: LucideIcon;
  version: string;
  enabled: boolean;
  path: string;
  loadView: () => Promise<{ default: ComponentType<ModuleViewProps> }>;
  HomeWidget: ComponentType<ModuleHomeWidgetProps>;
  search?: (query: string) => Promise<ModuleSearchResult[]>;
}

To add a new module:

  1. Create apps/web/src/modules/<name>/ with a View and a HomeWidget
  2. Append to MODULES in registry.ts

The shell picks it up automatically: sidebar item, home widget, search provider.

Quick start

# 1. Install
pnpm install

# 2. Postgres (Docker)
docker run -d --name lifeboard-pg -p 5432:5432 \
  -e POSTGRES_PASSWORD=local -e POSTGRES_USER=local -e POSTGRES_DB=lifeboard \
  postgres:16

# 3. Set required env vars
cat >> apps/api/.env <<'EOF'
DATABASE_URL=postgresql://local:local@localhost:5432/lifeboard
LIFEBOARD_SECRET_KEY=$(openssl rand -base64 32)
# Optional in dev; required in production.
# LIFEBOARD_BOOTSTRAP_TOKEN=$(openssl rand -hex 32)
EOF

# 4. Push schema
pnpm --filter @lifeboard/db db:push

# 5. Run
pnpm dev
# web: http://localhost:5173
# api: http://localhost:3000

# 6. First-run setup
# Open http://localhost:5173 — the web app detects an empty users table
# and shows the Setup form. In dev you can skip the bootstrap token;
# in production set LIFEBOARD_BOOTSTRAP_TOKEN and pass it in the form.

Scripts

Script What
pnpm dev Run web + api in parallel
pnpm dev:web Web only (http://localhost:5173)
pnpm dev:api API only (http://localhost:3000)
pnpm typecheck TS check across all packages
pnpm build Build all apps
pnpm build:web Web only
pnpm --filter @lifeboard/db db:push Push Drizzle schema to Postgres

Bundle sizes (gzipped)

Chunk Size
main (shell + chrome) 76 KB
ThoughtsView (with TipTap) 96 KB
MoneyView 2 KB
TasksView 2 KB
LinkPicker 2 KB

Initial page load: ~76 KB gzipped (excluding the lazy module chunks). TipTap is only loaded when the user opens the Thoughts module.

What's NOT in V1 (deferred to V2+)

  • AI features (no assistant, no brief, no review)
  • Mobile (iOS / Android)
  • Desktop wrapper
  • Sync / multi-device
  • Offline / IndexedDB
  • Email-to-inbox
  • Voice memos
  • Browser extension
  • Real Clerk auth (dev-mode shim today) — ✅ done; email + password + 6-digit PIN, no external provider
  • Real Railway deploy (config in place, deploy not run)
  • Multi-currency
  • Plaid / Open Finance
  • Per-module disable in Settings
  • Public API / webhooks

Read order (docs/)

  1. Product Vision — north star
  2. Module Catalog — every module, with V1/V2 status
  3. MVP Roadmap — V1 scope, 2-4 week plan
  4. Architecture — V1 stack
  5. Information Architecture — V1 surface
  6. Data Model — V1 schema

Owner

Luciano lucianodiisouza@hotmail.com. Builds this for personal use. Will share when (if) the tool proves its worth.