tracker: single-binary project tracker with auth, api keys, and json api
Go + SQLite web app, server-rendered, hackerman theme. Projects with descriptions, searchable notes, todo/doing/done task tracking. Bcrypt login sessions, hashed api keys, full /api/v1 crud. Deploys on straylight via configs/tracker.nix (prebuilt binary).
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# tracker
|
||||
|
||||
Single-binary project tracker with a Hackerman/terminal aesthetic. Go + SQLite,
|
||||
server-rendered — no runtime dependencies, no build step, no JS.
|
||||
|
||||
## Features
|
||||
|
||||
- **Auth required** — username/passphrase login (bcrypt), server-side sessions
|
||||
- **API keys** for remote/CLI access, managed from the web UI
|
||||
- **Full JSON API** under `/api/v1/`
|
||||
- **Projects** with name + description
|
||||
- **Notes** per project, searchable via the global `grep the grid…` bar
|
||||
- **Tasks** per project with `todo → doing → done` cycling (click the badge)
|
||||
- **Global search** across project names, descriptions, notes, and task titles
|
||||
- SQLite storage, WAL mode, everything in one file
|
||||
|
||||
## Setup
|
||||
|
||||
```
|
||||
go build -o tracker .
|
||||
./tracker -adduser kyle # prompts for a passphrase (min 8 chars)
|
||||
./tracker
|
||||
```
|
||||
|
||||
Non-interactive variant: `TRACKER_PASSWORD=... ./tracker -adduser kyle`.
|
||||
|
||||
Defaults: listens on `:8420` (all interfaces, so it's reachable over Tailscale),
|
||||
database at `~/.local/share/tracker/tracker.db`.
|
||||
|
||||
```
|
||||
./tracker -addr :9000 -db /path/to/tracker.db
|
||||
```
|
||||
|
||||
## API keys
|
||||
|
||||
Log in, go to **keys**, generate a key. It's shown once (only a SHA-256 hash is
|
||||
stored). Keys grant full API access and track last-used time; revoke anytime.
|
||||
|
||||
## API
|
||||
|
||||
Authenticate with `X-API-Key: <key>`, `Authorization: Bearer <key>`,
|
||||
`Authorization: Basic`, or just your browser session cookie.
|
||||
|
||||
```
|
||||
GET /api/v1/projects list
|
||||
POST /api/v1/projects {"name": "...", "description": "..."}
|
||||
GET /api/v1/projects/{id}
|
||||
PATCH /api/v1/projects/{id} partial update (name/description)
|
||||
DELETE /api/v1/projects/{id} cascades tasks + notes
|
||||
|
||||
GET /api/v1/projects/{id}/notes
|
||||
POST /api/v1/projects/{id}/notes {"body": "..."}
|
||||
GET /api/v1/notes/{id}
|
||||
PATCH /api/v1/notes/{id} {"body": "..."}
|
||||
DELETE /api/v1/notes/{id}
|
||||
|
||||
GET /api/v1/projects/{id}/tasks
|
||||
POST /api/v1/projects/{id}/tasks {"title": "...", "status": "todo"}
|
||||
GET /api/v1/tasks/{id}
|
||||
PATCH /api/v1/tasks/{id} {"title": "...", "status": "doing"}
|
||||
DELETE /api/v1/tasks/{id}
|
||||
|
||||
GET /api/v1/search?q=term
|
||||
```
|
||||
|
||||
```
|
||||
curl -H "X-API-Key: trk_..." http://host:8420/api/v1/projects
|
||||
curl -u kyle -X PATCH -d '{"status":"done"}' http://host:8420/api/v1/tasks/3
|
||||
```
|
||||
|
||||
## Autostart (systemd user unit)
|
||||
|
||||
```
|
||||
cp tracker.service ~/.config/systemd/user/
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable --now tracker
|
||||
```
|
||||
|
||||
Reach it from any device on your tailnet at `http://<tailscale-ip>:8420`.
|
||||
|
||||
## Theme
|
||||
|
||||
Palette lifted from omarchy's Hackerman theme (`hackerman.nvim`):
|
||||
|
||||
| token | hex |
|
||||
|--------|-----------|
|
||||
| bg | `#0B0C16` |
|
||||
| panel | `#080911` |
|
||||
| line | `#1a1d2b` |
|
||||
| fg | `#ddf7ff` |
|
||||
| muted | `#6a6e95` |
|
||||
| neon | `#50f872` |
|
||||
| cyan | `#7cf8f7` |
|
||||
Reference in New Issue
Block a user