A minimal self-hosted project manager to organize projects, tasks, and notes in one place.
Built with SvelteKit (frontend) and FastAPI (backend), running in Docker.
Clone this repo:
git clone https://github.com/HugoOuwerkerk/ProjectBoard.git
cd projectboard
Build and start the containers:
docker compose up -d
Open in browser: http://localhost:8080
cd frontend
npm install
npm run dev
Runs on http://localhost:5173
cd backend
poetry install
poetry run uvicorn app.main:app --reload
Runs on http://localhost:8000
Before launching in development or production, copy backend/.env.example to backend/.env and set a strong DEFAULT_ADMIN_PASSWORD that meets the signup password policy (≥10 chars, upper, lower, digit, special). The first time the API starts, init_db() will automatically create the user/session tables and seed the admin account if none exists (any legacy projects are assigned to that admin during the migration), so make sure the backend runs at least once after configuring your environment file.
When shipping to production, flip SESSION_COOKIE_SECURE=true in .env, run behind HTTPS, and consider adding reverse-proxy rate limiting and basic monitoring to keep the public signup endpoint healthy.
GET /getProjects → List all projects
GET /getProject/{id} → Get project by ID
POST /addProject/ → Add a new project
PATCH /projects/{id} → Update a project
DELETE /projects/{id} → Delete a project
POST /login → Authenticate with username/password
POST /signup → Create a new user account
POST /logout → Clear the active session
GET /me → Inspect the current session user
POST /projects/{id}/tasks → Add a task
PATCH /projects/{id}/tasks/{taskId} → Update a task
DELETE /projects/{id}/tasks/{taskId} → Delete a task
POST /projects/{id}/notes → Add a note
PATCH /projects/{id}/notes/{noteId} → Update a note
DELETE /projects/{id}/notes/{noteId} → Delete a note
ProjectBoard
├── backend
│ ├── app
│ │ └── main.py
│ ├── Dockerfile
│ ├── poetry.lock
│ ├── projects.db
│ └── pyproject.toml
├── docker-compose.yml
├── frontend
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── package.json
│ ├── package-lock.json
│ ├── src
│ │ ├── app.d.ts
│ │ ├── app.html
│ │ ├── lib
│ │ │ ├── assets
│ │ │ │ ├── favicon.png
│ │ │ │ └── logo.png
│ │ │ ├── components
│ │ │ │ └── Modal.svelte
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ └── routes
│ │ ├── +layout.svelte
│ │ ├── +page.svelte
│ │ └── project
│ │ └── [id]
│ │ ├── +layout.svelte
│ │ └── +page.svelte
│ ├── static
│ │ └── robots.txt
│ ├── svelte.config.js
│ ├── tsconfig.json
│ └── vite.config.ts
├── package.json
├── package-lock.json
└── README.md
MIT — do whatever you want, but attribution is appreciated.
Made by Hugo Ouwerkerk Inspired by the need for a simple, self-hosted project tracker.