A lightweight, self-hosted project management platform with CRM, double-entry financials, automation engine, and Telnyx telephony integration. Built with SvelteKit and SQLite for zero-dependency deployments.
- Kanban boards — Drag-and-drop task management with customizable columns
- Sprints — Sprint planning with burndown charts and velocity tracking
- Task management — Types (task, bug, feature, improvement), priorities, labels, checklists, time tracking
- Multiple views — Board, list, calendar, Gantt, and home views with saved view presets
- Task templates — Reusable templates for common task types
- Comments & reactions — Threaded discussions with emoji reactions
- File attachments — Attach files to tasks
- Companies & contacts — Full contact management with ownership and source tracking
- Pipeline — Drag-and-drop opportunity pipeline with customizable stages and probabilities
- Activities — Call, email, meeting, and note tracking with history
- Products & pricing — Product catalog with flexible pricing tiers (one-time, recurring, per-unit, tiered)
- Proposals — Generate and send proposals with line items and discount logic
- CRM tasks — Sales-specific task management
- One-click calling — Click any phone number in the CRM to dial via browser WebRTC
- Inbound calls — Receive calls in the browser with automatic caller lookup against CRM contacts
- Call recording — Optional call recording with in-app playback
- Auto call logging — Completed calls automatically create CRM activities with duration
- Multi-number rotation — Configure multiple caller IDs that rotate round-robin per call
- Floating dialer — Persistent dialer widget with keypad, mute, and call controls
- Admin toggle — Enable/disable from Admin > Telephony with API key configuration
- Double-entry bookkeeping — Chart of accounts, journal entries, posting
- Bank reconciliation — Match transactions against bank statements
- Recurring transactions — Automated recurring journal entries
- Budget management — Per-account budgets with period tracking
- Financial reports — Balance sheet, P&L, cash flow, trial balance
- CRM sync — Automatic revenue recognition when opportunities are won
- Automation engine — Rules with triggers (task created, status changed, assigned, etc.), conditions, and actions
- Webhooks — Outbound webhooks for task and comment events
- Real-time collaboration — WebSocket-powered live updates across all connected clients
- Push notifications — Browser push for assignments, comments, mentions, and due dates
- Email notifications — Via Resend with digest mode (immediate, daily, weekly)
- Themes — Built-in themes and custom theme import (dark/light modes)
- Invite-only auth — Admin-controlled registration via invite tokens
- Role-based access — Admin and member roles
- Audit log — Track all task actions by user, project, and action type
- Backup/restore — Download full SQLite database backups
- Keyboard shortcuts — Full keyboard navigation with customizable shortcuts
| Layer | Technology |
|---|---|
| Framework | SvelteKit 2 |
| Language | TypeScript |
| Frontend | Svelte 5 (runes) |
| Database | PostgreSQL 17 |
| ORM | Drizzle ORM |
| Cache/Pub-Sub | Redis 7 (optional) |
| Styling | Tailwind CSS 4 |
| Auth | Argon2 password hashing + session cookies |
| Real-time | WebSocket (ws) + Redis pub/sub |
| Push | Web Push API (VAPID) |
| Resend API | |
| Telephony | Telnyx WebRTC |
| Monitoring | Watchtower client |
| Runtime | Node.js 22+ |
# Clone
git clone https://github.com/thornebridge/pm.git
cd pm
# Install dependencies
pnpm install
# Configure environment
cp .env.example .env
# Edit .env — set PM_ADMIN_PASSWORD and generate VAPID keys:
# npx web-push generate-vapid-keys
# Run database migrations
pnpm drizzle-kit push
# Start development server
pnpm devThe app will be available at http://localhost:5173.
| Variable | Description | Required |
|---|---|---|
DATABASE_URL |
Path to SQLite database file | Yes |
PM_ADMIN_EMAIL |
Admin account email | Yes |
PM_ADMIN_PASSWORD |
Admin account password | Yes |
PM_VAPID_PUBLIC_KEY |
VAPID public key for push notifications | Yes |
PM_VAPID_PRIVATE_KEY |
VAPID private key for push notifications | Yes |
PM_VAPID_EMAIL |
Contact email for VAPID (mailto: format) | Yes |
RESEND_API_KEY |
Resend API key for email notifications | No |
The telephony integration is configured entirely in-app (Admin > Telephony). No environment variables needed.
- Create a Telnyx account
- Buy US phone number(s)
- Create a Credential Connection and note the Connection ID
- Create a Telephony Credential under that connection (via API or portal) and note the Credential ID
- Set the webhook URL on your connection to
https://your-domain.com/api/webhooks/telnyx(API v2) - In PM, go to Admin > Telephony, enable the integration, and enter your API Key, Connection ID, Credential ID, and phone numbers
docker build -t pm .
docker run -d \
--name pm \
-p 3000:3000 \
-v pm_data:/app/data \
--env-file .env \
pm