A calm, bilingual (EN/DE) Progressive Web App for studying Aikidō: searchable techniques, glossary terms, exam guides, and local-first bookmarks.
Local-first: no accounts • bookmarks & preferences stay on your device
- What you can do
- Features
- Content model
- Tech stack
- Getting started
- Project structure
- Content workflow
- Feedback → GitHub Issues
- Contributing
- License
- Find techniques quickly (filters + spotlight search)
- Learn from a consistent technique layout: Steps, Uke, Common Mistakes, Context, Media
- Compare entries/stances/variants without splitting into dozens of pages
- Browse a clean glossary (terms, attacks, etiquette, philosophy)
- Save techniques/terms to bookmark collections for your training goals
- Use exam/program guides as a quick reference before class
- Technique library with filters (attack, level/grade, weapon, stance/hanmi, etc.)
- Technique pages with structured sections:
- Steps (by entry: irimi/tenkan/omote/ura)
- Uke role + safety notes
- Common Mistakes
- Context (when/why)
- Media (links, optional)
- Variant-friendly modeling (base + versions/lines + entry modes) to avoid duplicated pages
- Spotlight-style search overlay
- Weighted ranking across techniques, glossary, and collections
- Keyboard-friendly navigation
- Filterable term list + detail pages
- Short definitions + optional literal translation and longer notes
- EN/DE copy for every term
- Bookmark techniques and glossary terms
- Organize into collections
- Track personal progress over time
- Exam/program pages and matrices (kyū/dan and weapon basics)
- Roadmap view for structured progression
- Installable Progressive Web App
- Designed for fast, readable use on mobile before training
Enso is content-driven.
- Canonical content lives in
content/as JSON. - The app consumes typed content in
src/shared/types/.
Main content areas:
- Techniques:
content/techniques/*.json - Glossary terms:
content/glossary/*.json - Trainers / dojos:
content/trainers.json,content/dojos.json - Quotes / roadmap:
content/quotes.json,content/quotes-de.json,content/roadmap.json
Techniques are modeled around:
- Core metadata (name, category, attack, weapon, grade)
- Multiple versions (e.g., base + trainer/dojo interpretations)
- Steps grouped by entry mode (
irimi,tenkan,omote,ura)
See src/shared/types/content.ts (and related types) for the current canonical shape.
Glossary terms include:
romaji, optionaljp- short definition (EN/DE)
- optional literal translation and longer notes
- React + TypeScript + Vite
- Tailwind CSS
- Zustand (client state + local persistence via
storageService) - Framer Motion (subtle UI motion)
- PWA manifest + install support
- Vercel (hosting) + serverless API route for feedback
pnpm install
pnpm dev
# open http://localhost:5173Build + preview:
pnpm build
pnpm previewHigh-level layout:
src/features/technique/— library + technique pages + toolbarsearch/— indexer + scorer + overlay UIglossary/— glossary pages, filters, detail viewsbookmarks/— collections + bookmark UI + local progresshome/— landing, guides, roadmap, settings, feedback
shared/services/storageService.ts— local persistencestore/— app-wide statetypes/— content + app typescomponents/— reusable UI (modals, toasts, selects, layout)
content/— canonical JSON + assetsscripts/build-content.ts— content build/validation utilityapi/feedback.ts— serverless endpoint for feedback submissionspublic/— fonts, icons,manifest.json
- Edit JSON in
content/(techniques or glossary). - Validate/build content:
pnpm run build
# or run the content script directly if needed
# node scripts/build-content.tsNotes:
- Keep EN/DE fields in sync.
- Prefer concise, actionable steps (4–8 cues per entry).
- Media is link-based (no uploads).
Enso includes an in-app feedback flow that posts to /api/feedback.
- Payloads are validated server-side
- When GitHub credentials are configured, submissions can open a labeled GitHub Issue
Local dev without GitHub configured should still let you test the UX (the API can respond with a warning).
To enable issue creation, add a .env.local (git-ignored) and set:
GITHUB_TOKEN=***
GITHUB_OWNER=your-user-or-org
GITHUB_REPO=your-repoThen mirror the same variables in Vercel.
PRs and content improvements are welcome.
- Keep changes small and reviewable
- Follow existing TypeScript types (single source of truth)
- Prefer structured content (JSON) over freeform text
- If you add new glossary/technique files, keep IDs/slugs stable and unique
Original work by Kyle Brooks. See LICENSE and NOTICE.
