- Vue 54.3%
- TypeScript 41.1%
- JavaScript 3.1%
- CSS 1%
- HTML 0.3%
- Other 0.2%
|
All checks were successful
Build and Push Docker Image / build (push) Successful in 30s
Previously any push failure (401, unreachable, or a plain rejection from PocketBase) aborted the entire drain pass, leaving the failing entry at the head of the queue and stalling every other queued lesson/exercise/image behind it on every future pass. Now only auth failures (401) and unreachable-server errors stop the pass early, since nothing else can succeed in those cases either. An entry actively rejected by the server is left queued for retry but no longer blocks the rest of the pass. Sync status still reports 'error' for the pass if any entry failed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| docs | ||
| pb_migrations | ||
| public | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| .nvmrc | ||
| .prettierrc | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.js | ||
| index.html | ||
| LICENSE | ||
| nginx.conf | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| SETUP.md | ||
| tailwind.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
Judo Lesplanner
A lesson planning tool for judo trainers. Build and manage lesson plans with exercises from a pre-seeded library, export to PDF, and save plans locally in the browser.
Features
- Build lesson plans with 4 sections: Inleiding, Kern 1, Kern 2, Slot
- Exercise library pre-seeded with 75 exercises
- Add, edit, and delete custom exercises
- Upload and manage custom images for exercises
- Save and reopen lesson plans (stored in IndexedDB)
- Export and import lesson plans as
.lesplanfiles (versioned JSON, schema-validated on import, includes embedded custom images); export individual lessons or all lessons at once for sharing between users - Export lesson plans to PDF (A4 portrait)
- Export exercises to Excel (.xlsx)
- Import exercises from Excel
- Markdown support in exercise descriptions (rendered safely via DOMPurify)
- Fully offline — no backend required; all data lives in browser IndexedDB
- Installable as a PWA (service worker pre-caches the full app shell)
- Optional account system: sign up to sync exercises, lessons, and custom images across devices via PocketBase; the app works fully without an account
Tech stack
- Vue 3 + TypeScript (Composition API)
- Vite
- Tailwind CSS v3
- Pinia — state management
- Dexie v4 — IndexedDB wrapper
- vue-router v5 — client-side routing
- html2pdf.js — PDF export (lazy-loaded)
- ExcelJS — Excel import/export (lazy-loaded)
- marked — Markdown rendering
- DOMPurify — HTML sanitisation
- Zod —
.lesplanfile schema validation - vite-plugin-pwa — service worker + web app manifest
- PocketBase SDK — optional cloud sync client
Development
npm install
npm run dev
App runs at http://localhost:5173.
With sync enabled (optional)
Start PocketBase locally, then set VITE_PB_URL so the frontend can reach it:
docker compose up -d # starts PocketBase at http://localhost:8090
VITE_PB_URL=http://localhost:8090 npm run dev
See SETUP.md for first-time PocketBase configuration (admin account and collections). Without VITE_PB_URL set, sync is disabled and the app behaves exactly as before.
npm run type-check # TypeScript check
npm run build # type-check + production build
npm run seed:extract # re-extract exercises from source spreadsheet
ESLint and Prettier run as pre-commit/pre-push hooks via the lint-staged configuration in package.json.
Docker
docker build -t judo-lesplanner .
docker run -p 8080:80 judo-lesplanner
App runs at http://localhost:8080.
CI/CD
Forgejo Actions workflow (.forgejo/workflows/build-deploy.yaml) triggers on push to master, builds a Docker image, and pushes it to the Forgejo registry with latest and SHA tags.