https://github.com/danjdewhurst/easy-pm
Lightweight, self-hosted project management with Kanban boards. Three interfaces: web UI, REST API, and CLI. Zero external dependencies — just Bun + SQLite.
https://github.com/danjdewhurst/easy-pm
bun cli developer-tools kanban kanban-board open-source project-management react rest-api self-hosted sqlite tailwindcss typescript
Last synced: 2 months ago
JSON representation
Lightweight, self-hosted project management with Kanban boards. Three interfaces: web UI, REST API, and CLI. Zero external dependencies — just Bun + SQLite.
- Host: GitHub
- URL: https://github.com/danjdewhurst/easy-pm
- Owner: danjdewhurst
- License: mit
- Created: 2026-02-28T18:54:37.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-02-28T19:43:19.000Z (4 months ago)
- Last Synced: 2026-02-28T21:42:50.787Z (4 months ago)
- Topics: bun, cli, developer-tools, kanban, kanban-board, open-source, project-management, react, rest-api, self-hosted, sqlite, tailwindcss, typescript
- Language: TypeScript
- Homepage: https://github.com/danjdewhurst/easy-pm#readme
- Size: 183 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# easy-pm
**A lightweight project management tool with a Kanban board, REST API, and CLI.**
Built with [Bun](https://bun.sh), SQLite, React, and Tailwind CSS.
[](https://github.com/danjdewhurst/easy-pm/actions/workflows/ci.yml)
[](LICENSE)
[](https://bun.sh)
[](https://www.typescriptlang.org/)
[](https://react.dev)
[](https://sqlite.org)
---
## Features
- **Kanban board** — drag-and-drop cards between columns
- **Three interfaces** — React frontend, REST API, and CLI
- **Full-text search** — FTS5-powered search with `Cmd+K` / `Ctrl+K`
- **Labels & time estimates** — organise and track work
- **Dark mode** — system-aware with manual toggle
- **Zero external services** — SQLite database, no Docker required
- **Auth built in** — email/password with session tokens
- **AI/agent-friendly** — first-party CLI designed for agentic workflows; AI tools can create projects, manage cards, and search via structured commands and JSON output
## Quick Start
```bash
bun install
bun run dev
# → http://localhost:3000
```
That's it. The server serves both the API (`/api/`) and the frontend (`/`).
## CLI
```bash
bun run cli -- [options]
```
```bash
# Authenticate
bun run cli -- auth register --email you@example.com --password secret
bun run cli -- auth login --email you@example.com --password secret
# Create a project → board → columns → card
bun run cli -- project create --name "My Project"
bun run cli -- board create --project-id 1 --name "Sprint 1"
bun run cli -- column create --board-id 1 --name "To Do"
bun run cli -- card create --column-id 1 --title "Build login page"
# Move, label, search
bun run cli -- card move --id 1 --column-id 2
bun run cli -- label create --project-id 1 --name "Bug" --colour red
bun run cli -- search "login" --format json
```
Resources: `auth` · `project` · `board` · `column` · `card` · `label` · `search`
Global flags: `--format json|table` · `--api-url` · `--token`
## API
All responses follow `{ ok, data?, error? }`. Auth required via `Authorization: Bearer `.
| Resource | Endpoints |
|----------|-----------|
| Auth | `POST /api/auth/register` · `login` · `logout` · `GET /api/auth/me` |
| Projects | `GET/POST /api/projects` · `GET/PUT/DELETE /api/projects/:id` |
| Boards | `GET/POST /api/projects/:id/boards` · `GET/PUT/DELETE /api/boards/:id` |
| Columns | `POST /api/boards/:id/columns` · `PUT/DELETE /api/columns/:id` · `PUT /api/boards/:id/columns/reorder` |
| Cards | `GET/POST /api/columns/:id/cards` · `GET/PUT/DELETE /api/cards/:id` · `PUT /api/cards/:id/move` · `PUT /api/cards/:id/labels` |
| Labels | `GET/POST /api/projects/:id/labels` · `PUT/DELETE /api/labels/:id` |
| Search | `GET /api/search?q=term&projectId=1` |
`GET /api/boards/:id` returns the full board with nested columns, cards, and labels in one request.
## Architecture
```
src/
shared/ Types, validation, DB schema, error classes
server/ Bun.serve() REST API
cli/ CLI (talks to API over HTTP)
frontend/ React + Tailwind SPA
test/
server/ API integration tests
cli/ CLI integration tests
```
**Data model:** Projects → Boards → Columns → Cards. Labels belong to a Project and can be assigned to any Card within it.
**Database:** SQLite with WAL mode, foreign keys, CASCADE deletes, and FTS5 full-text search.
## Scripts
| Command | Description |
|---------|-------------|
| `bun run dev` | Dev server with hot reload |
| `bun run start` | Production server |
| `bun run cli -- ` | Run CLI commands |
| `bun test` | Run tests |
| `bun run typecheck` | Type-check the codebase |
## Configuration
| Variable | Default | Description |
|----------|---------|-------------|
| `PORT` | `3000` | Server port |
| `EASY_PM_API_URL` | `http://localhost:3000` | CLI: server URL |
## Documentation
See [`docs/`](docs/) for detailed docs:
[API Reference](docs/api.md) · [CLI Reference](docs/cli.md) · [Database](docs/database.md) · [Frontend](docs/frontend.md) · [Architecture](docs/architecture.md) · [Design System](docs/design-system.md)
## License
[MIT](LICENSE) — Daniel Dewhurst ([@danjdewhurst](https://github.com/danjdewhurst))