No description
  • Vue 54.3%
  • TypeScript 41.1%
  • JavaScript 3.1%
  • CSS 1%
  • HTML 0.3%
  • Other 0.2%
Find a file
Werring c8191ade3f
All checks were successful
Build and Push Docker Image / build (push) Successful in 30s
Don't let one rejected sync entry block the whole queue
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>
2026-09-20 09:43:29 +02:00
.forgejo/workflows Add workflow_dispatch trigger and pass VITE_PB_URL build arg in CI 2026-06-02 16:21:44 +02:00
docs Persist saved-lessons tag filter across navigation and reloads 2026-08-30 15:58:59 +02:00
pb_migrations feature/account-sync (#1) 2026-06-02 13:58:03 +00:00
public Regenerate PWA icons from current pwa-icon.svg 2026-06-02 21:53:22 +02:00
scripts Initial commit: Vue 3 + Tailwind judo lesplanner 2026-05-31 17:33:23 +02:00
src Don't let one rejected sync entry block the whole queue 2026-09-20 09:43:29 +02:00
.dockerignore Initial commit: Vue 3 + Tailwind judo lesplanner 2026-05-31 17:33:23 +02:00
.gitignore feature/account-sync (#1) 2026-06-02 13:58:03 +00:00
.nvmrc Initial commit: Vue 3 + Tailwind judo lesplanner 2026-05-31 17:33:23 +02:00
.prettierrc Add Prettier & ESLint with pre-commit and pre-push hooks 2026-06-01 07:56:43 +02:00
CLAUDE.md Fix duplicate saved lessons caused by lost sync link on edit 2026-08-30 10:48:17 +02:00
docker-compose.yml feature/account-sync (#1) 2026-06-02 13:58:03 +00:00
Dockerfile Add workflow_dispatch trigger and pass VITE_PB_URL build arg in CI 2026-06-02 16:21:44 +02:00
eslint.config.js feature/account-sync (#1) 2026-06-02 13:58:03 +00:00
index.html Add PWA support with offline service worker and app manifest 2026-06-01 13:44:13 +02:00
LICENSE Initial commit: Vue 3 + Tailwind judo lesplanner 2026-05-31 17:33:23 +02:00
nginx.conf Enable gzip compression in nginx container config 2026-06-01 08:12:30 +02:00
package-lock.json Fix npm audit vulnerabilities 2026-08-29 12:36:08 +02:00
package.json Fix npm audit vulnerabilities 2026-08-29 12:36:08 +02:00
postcss.config.js Initial commit: Vue 3 + Tailwind judo lesplanner 2026-05-31 17:33:23 +02:00
README.md Detect stale/rejected sessions during background sync and surface connectivity status 2026-08-30 10:24:14 +02:00
SETUP.md Fix service worker intercepting PocketBase admin and API paths 2026-06-02 16:08:23 +02:00
tailwind.config.js Add dark mode with auto/light/dark toggle 2026-05-31 23:10:33 +02:00
tsconfig.json Migrate codebase from JavaScript to TypeScript 2026-05-31 17:33:44 +02:00
vite.config.ts Reduce initial bundle size via lazy loading and chunk splitting 2026-08-29 12:31:50 +02:00

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 .lesplan files (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

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.