A practice tracker I built for myself to manage my piano repertoire.
https://pianoter.notarock.lol
- TypeScript 77.3%
- Go 21.1%
- JavaScript 0.5%
- Makefile 0.3%
- HTML 0.3%
- Other 0.5%
Co-authored-by: notarock-s-renovate[bot] <265181468+notarock-s-renovate[bot]@users.noreply.github.com> |
||
|---|---|---|
| .github/workflows | ||
| cmd/server | ||
| internal | ||
| web | ||
| .gitignore | ||
| .tuyauterie.yaml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| Makefile | ||
| README.md | ||
| renovate.json | ||
Pianoter
A practice tracker I built for myself to manage my piano repertoire. Keeps track of what I'm working on, logs sessions, and shows how long it takes to get through each learning stage.
Mode Screenshots
What it does
- Register / login with JWT auth
- Manage pieces with statuses: wishlist, learning, active, shelved
- Log practice sessions with notes and a playing level
- Track progression through stages (hands separate → performance ready)
- Timeline showing how long each stage took
- Dashboard with piece counts and a "to revisit" table (7 / 14 / 30 / 60 days)
- 50+ pre-seeded classical composers with per-composer listings and search
- English and French UI with a language switcher in the nav
- Works on mobile too
Stack
- Backend: Go, Chi v5, GORM, MariaDB, Goose for migrations, JWT
- Frontend: React, TypeScript, Vite, Mantine, react-router-dom, i18next
- Database: MariaDB 11
Running locally
You'll need Go 1.25+, Node.js 20+, and Docker for the database.
# Start MariaDB
make db
# Run backend + frontend at the same time
make dev
Backend runs on port 8080, frontend dev server on 5173 (proxies /api to the backend).
Environment variables
Copy .env.example to .env or just set these in your shell:
| Variable | Default | Description |
|---|---|---|
JWT_SECRET |
changeme |
Secret used to sign JWTs |
DB_HOST |
localhost |
MariaDB host |
DB_PORT |
3306 |
MariaDB port |
DB_USER |
pianoter |
Database user |
DB_PASSWORD |
pianoter |
Database password |
DB_NAME |
pianoter |
Database name |
PORT |
8080 |
Backend port |
Migrations run on startup automatically. If you need to manage them manually:
make migrate-up # apply pending migrations
make migrate-down # roll back the last one
make migrate-status # see what's applied
Docker Compose
To spin up the whole stack (MariaDB + backend + frontend):
docker compose up
Frontend ends up on port 80, API on 8080.
Tests
make test # backend + frontend
make test-backend # go test ./...
make test-frontend # vitest
make cy # Cypress e2e (headless)
make cy-open # Cypress e2e (interactive)