Plan projects, run a Kanban board, track bugs, write markdown notes, and watch your productivity in analytics — in a calm, fast, light/dark interface inspired by Linear, Notion and GitHub Projects.
Note
Language. ProjectHub's interface and codebase are written in English. A complete Romanian (🇷🇴) translation is bundled and can be switched instantly from the top bar — no reload, no rebuild. See Languages & i18n.
- Features
- Screenshots
- Tech stack
- Quick start (local)
- Running on a Raspberry Pi
- Telegram bot
- Languages & internationalization
- Install as an app (PWA)
- Health, monitoring & backups
- Scripts
- Keyboard shortcuts
- Project structure
- Switching to PostgreSQL
- Roadmap
- Contributing
- License
- Dashboard — active projects, open tasks/bugs, completed work, productivity chart, weekly review, recent activity feed (with filters) and upcoming deadlines.
- Projects — statuses, priorities, progress %, tags (with filtering), milestones, start/due dates, saved views and an elegant Active / Archived split.
- Tasks — Kanban board with drag-to-reorder + list view, subtasks, recurring tasks, time tracking, bulk actions, search & filters, saved views.
- Calendar — month view of tasks and project deadlines; click a day to add, drag to reschedule.
- Bugs — severity & status workflow, link to projects, reproduction steps and fix notes.
- Notes — markdown editor with live preview, interactive checkboxes, pinning, project-scoped or personal, saved views.
- Analytics — completion rate, weekly throughput, 14-day activity, status distributions, open vs. resolved bugs.
- Weekly review — a dedicated tab summarizing momentum, what shipped, what slipped and loose ends.
- Activity log — a filterable, chronological record of everything across the workspace.
- ⌘K command palette — global search, navigate anywhere, create a task in any project, toggle theme.
- Undo everywhere — deletes surface a centralized "… deleted — Undo" toast.
- Reminders & notifications, elegant empty states, fully responsive / mobile-friendly, light & dark themes.
- Self-hosted, single-file SQLite database, JSON export/import from Settings.
- Account — profile, password change, theme, language.
- Installable PWA + Telegram companion bot + health endpoint for uptime monitoring.
| Layer | Choice |
|---|---|
| Framework | Next.js 15 (App Router) · React 18 · TypeScript 5 |
| Styling | Tailwind CSS · shadcn-style UI · Radix primitives |
| Data | Prisma ORM · SQLite (swappable to PostgreSQL) |
| Auth | Auth.js v5 / NextAuth (credentials, JWT sessions) |
| Mutations | Server Actions |
| Charts | Recharts |
| Companion | Telegram bot (zero-dependency, long-polling ESM) |
| i18n | Cookie-based dictionaries — English & Romanian |
The goal was simple to run on a Raspberry Pi. PostgreSQL means a separate database server to install, configure and keep alive. SQLite is a single file — zero configuration, tiny memory footprint, rock-solid on ARM. Because everything goes through Prisma, switching to Postgres later is a two-line change.
Requires Node.js 18.18+ (Node 20 LTS recommended).
# 1. Clone
git clone https://github.com/VIK-DD/ProjectHub.git
cd ProjectHub
# 2. Install dependencies
npm install
# 3. Create the SQLite database + demo data (one command)
npm run setup # prisma generate + db push + seed
# 4. Run the dev server
npm run devOpen http://localhost:3000 and sign in with the demo account:
Email: demo@projecthub.local
Password: demo1234
Important
Before exposing ProjectHub publicly, set a real NEXTAUTH_SECRET in .env
(openssl rand -base64 32).
Tested on a Pi 4 / Pi 5 running 64-bit Raspberry Pi OS.
1. Install Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs2. Get the app onto the Pi & install
cd projecthub
npm install3. Configure environment
Edit .env, set a strong secret, and point NEXTAUTH_URL at how you'll reach the app:
NEXTAUTH_SECRET="<paste output of: openssl rand -base64 32>"
NEXTAUTH_URL="http://192.168.1.50:3000" # or your Tailscale / domain URL4. Initialise the database & build
npm run setup # creates prisma/dev.db and seeds it
npm run buildLow-memory Pi (512 MB – 1 GB)? The Next.js build can be memory-hungry. Give Node more headroom and/or add swap:
NODE_OPTIONS=--max-old-space-size=1024 npm run build
5. Run it & keep it alive (PM2)
sudo npm install -g pm2
pm2 start npm --name projecthub -- start
pm2 save
pm2 startup # follow the printed instructions to start on bootBrowse to http://<pi-ip>:3000 from any device on your network.
💡 Tip from the trenches: when redeploying, only delete the old
.nextafter the new build/upload has finished successfully — otherwise a failed transfer can leave the Pi with no production build to serve.
A premium, zero-dependency long-polling bot (no public webhook — perfect behind
Tailscale). Each Telegram chat is linked to one ProjectHub account; unlinked chats can
only /start, /link, /help. Everything else is inline-keyboard driven.
What it does
- 📊 Dashboard at a glance · 🙋 My Tasks (Today / Overdue / This week)
- ✅ Guided task creation (project → title → priority → due → confirm)
- 📁 Browse & create projects · 🐛 Bugs (change status & severity) · 📝 Notes
- 💬 Comments with @mentions (reply or button) · 🔎 Extended search ·
◀️ ▶️ pagination - ☀️ Automatic morning digest + 🌙 nightly JSON backup to your chat
# 1. Create a bot with @BotFather, then put the token in .env:
# TELEGRAM_BOT_TOKEN="123456:ABC..."
# 2. Run it under PM2
pm2 start bot/bot.mjs --name projecthub-bot && pm2 saveThen, in ProjectHub: Settings → Telegram → Connect Telegram to get a code, and send
it to the bot: /link ABC123. Done — the bot now acts as you.
ProjectHub ships fully translated in English and Romanian (🇷🇴).
- The source language is English — code, comments and the primary dictionary.
- Switch language anytime from the globe icon in the top bar; the choice is stored in a cookie (no reload needed).
- Translations live in
lib/i18n/dictionaries.ts; the default locale is set inlib/i18n/config.ts. Adding a language is just another dictionary entry.
ProjectHub ships a web manifest, generated icons and a service worker, so you can Add to Home Screen on a phone or tablet and launch it full-screen. (Android Chrome needs HTTPS for full install; iOS Safari works over your LAN.)
-
GET /api/health→ JSON{ status, db, uptime }(200 healthy, 503 when the DB is down) — point an uptime monitor at it. -
/status→ a simple human-readable status page. -
Backups — the whole database is one file (
prisma/dev.db).scripts/backup-db.shmakes a safe online copy and prunes old ones:chmod +x scripts/backup-db.sh crontab -e # daily at 3am, keep the newest 14: 0 3 * * * /home/pi/projecthub/scripts/backup-db.sh >> /home/pi/projecthub/backups/backup.log 2>&1
You can also export/import a portable JSON backup from Settings → Data & backup.
| Script | Description |
|---|---|
npm run dev |
Start the dev server |
npm run build |
Production build (runs prisma generate first) |
npm start |
Start the production server |
npm run bot |
Run the Telegram bot |
npm test |
Run the unit tests |
npm run lint |
Lint with ESLint (Next.js config) |
npm run setup |
generate + push schema + seed (first-time setup) |
npm run db:push |
Apply the Prisma schema to the database |
npm run db:seed |
Seed demo data + demo account |
npm run db:studio |
Open Prisma Studio to browse the database |
npm run db:reset |
Reset the database and re-seed |
- ⌘K / Ctrl-K — open the command palette (search, navigate, create a task in any project, toggle theme) -
app/
(auth)/ # login & register
(app)/ # authenticated shell (sidebar + topbar)
dashboard/ today/ projects/[id]/ tasks/[id]/
bugs/ notes/ calendar/ analytics/ settings/ trash/
api/ # auth, health, search, backup, projects, tasks,
# comments, attachments, client-errors, icon
status/ # human-readable status page
components/
ui/ # shadcn-style primitives
layout/ # sidebar, topbar, command menu, mobile sidebar
dashboard/ projects/ tasks/ bugs/ notes/ analytics/ settings/ charts/
lib/
actions/ # server actions (projects, tasks, bugs, notes, views, auth…)
i18n/ # dictionaries (EN/RO), config, server & client helpers
data.ts # dashboard & analytics queries
auth.ts session.ts prisma.ts rate-limit.ts markdown.ts
bot/
bot.mjs # the Telegram bot (long-polling)
pure.mjs # side-effect-free helpers (shared, unit-tested)
prisma/
schema.prisma # 14 models: User, Project, Milestone, Task, Subtask,
# Bug, Note, Comment, Attachment, TimeEntry,
# ProjectMember, Notification, TelegramLinkToken, ActivityLog
seed.ts
tests/ # unit tests (bot helpers, rate-limit)
-
In
prisma/schema.prisma, change the datasource provider:datasource db { provider = "postgresql" url = env("DATABASE_URL") }
-
In
.env, setDATABASE_URLto your Postgres connection string. -
Run
npm run db:push(andnpm run db:seedfor demo data).
Nothing else changes — the app code is database-agnostic.
- 🤖 Claude AI assistant — natural-language task & project actions in-app.
- 📦 One-command
deploy.sh— build → upload → restart, safely (no half-deploys). - More languages (the i18n layer is ready for them).
Issues and PRs are welcome! For substantial changes, open an issue first to discuss what
you'd like to change. Run npm run lint and npm test before submitting.
Licensed under the Apache License 2.0 — see LICENSE for details.
Copyright © 2026 VIK-DD
Made to be calm, fast, and yours · Made in Moldova 🇲🇩