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%
Find a file
notarock-s-renovate[bot] 376bec564e
Update npm Dependencies (#27)
Co-authored-by: notarock-s-renovate[bot] <265181468+notarock-s-renovate[bot]@users.noreply.github.com>
2026-05-07 14:04:19 -04:00
.github/workflows No need to run e2e on tagging 2026-03-29 00:32:01 -04:00
cmd/server Readme updates, minor refactors 2026-03-25 19:34:18 -04:00
internal Add Opus and Number fields to Piece 2026-05-03 21:42:11 -04:00
web Update npm Dependencies (#27) 2026-05-07 14:04:19 -04:00
.gitignore Initialize Go module with dependencies 2026-03-14 16:16:30 -04:00
.tuyauterie.yaml Set gitops deployment in tuyauterie 2026-03-29 00:30:50 -04:00
docker-compose.yml Update mariadb Docker tag to v12 (#12) 2026-03-22 19:03:47 -04:00
Dockerfile Migrate SQLite to MariaDB with internal/config package 2026-03-16 13:14:02 -04:00
go.mod Update module github.com/pressly/goose/v3 to v3.27.1 (#26) 2026-04-28 22:54:45 -04:00
go.sum Update module github.com/pressly/goose/v3 to v3.27.1 (#26) 2026-04-28 22:54:45 -04:00
LICENSE Initial commit 2026-03-14 16:13:35 -04:00
main.go Main.go at root directory 2026-03-15 20:54:11 -04:00
Makefile Kill background processes on any exit in dev target 2026-03-20 00:20:29 -04:00
README.md Fix typo in README regarding classical composers 2026-03-25 19:44:38 -04:00
renovate.json Add renovate.json 2026-03-14 20:13:57 +00:00

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.

image
Mode Screenshots image image

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)