- db.rs: fix fresh-PVC startup crash by using SqliteConnectOptions with create_if_missing(true) and foreign_keys(true); drops after_connect - Dockerfile: switch to Node 22 + pnpm (corepack), run pnpm check before build, copy backend/demo/ for TT_TEST_MODE support, non-root app user, add HEALTHCHECK, remove baked-in JWT_SECRET - .dockerignore: exclude node_modules, build artifacts, data/, logs - deploy/: new Helm chart replacing k8s/ — Deployment, Service, HTTPRoute (Gateway API), PVC (hcloud-volumes), CronJob backup, ServiceAccount, VPA; JWT_SECRET sourced from pre-provisioned K8s Secret - k8s/: removed (superseded by deploy/) - ci.yml: replaces test.yml — Node 20->22, same test steps, adds no-push Docker build; triggers on non-main pushes and PRs - release.yml: new tag-driven workflow (v*.*.*) — runs tests, pushes image to registry.itsh.dev/s0wlz/tutortool, deploys via helm upgrade https://claude.ai/code/session_01N1kWaQJkz1fC7mUippdQR5
TutorTool
Attendance tracker for tutoring sessions. Tutors manage courses, rooms, and slots; students check in via a public QR code link. Live at tutor.puchstein.dev.
Quickstart
make dev
# Backend: http://localhost:3000
# Frontend: http://localhost:5173
Demo credentials: admin@tutortool.com / admin
Stack
- Backend: Rust + Axum + SQLite (via SQLx), JWT auth
- Frontend: SvelteKit 5 (Svelte runes), TypeScript, adapter-static (SPA)
- Build: Vite + Cargo; 3-stage Docker build for production
Documentation
| Doc | Contents |
|---|---|
CLAUDE.md |
Agent guidance: commands, architecture, conventions |
GEMINI.md |
Same, with Gemini-specific context |
docs/testing.md |
E2E test pipeline (Playwright + test daemon) |
docs/specs/ |
Feature specs |
docs/plans/ |
Implementation plans |
docs/design_handoff/ |
UI design mocks |
Deployment
Kubernetes via k8s/ manifests on ITSH Cloud (tenant-5, Hetzner). CI via Gitea Actions at .gitea/workflows/test.yml.
Description
Languages
Svelte
44.9%
Rust
43.9%
TypeScript
6%
CSS
2.2%
Makefile
1.2%
Other
1.8%