Releases: ashmere/NuinTalker
Release list
v0.2.2 — Imported boards render at native size
Imported OBF boards (e.g. Project Core, 6×6) now render at their author-specified dimensions instead of being forced through the user's gridSize setting. Gap-size scales down for dense imports so cells stay readable.
v0.2.1 — Project Core import fix
Bug fix release
Real-world OBF files (CoughDrop exports, the Project Core example from openboardformat.org/examples) use integer button ids, not strings. The v0.2.0 parser threw on these. This release coerces ids to strings and accepts `null` entries in `grid.order` as empty cells.
Cross-checked against the official OBF Ruby gem — the gem accepts whatever the JSON contains because Ruby is dynamically typed. Our string coercion brings parity with what real-world exporters produce.
The Project Core fixture (CC BY-SA, attributed in `NOTICE`) is now part of the test suite.
v0.2.0 — Open Board Format import
NuinTalker v0.2.0
Live at https://ashmere.github.io/NuinTalker/ once the deploy workflow finishes.
What's new
- OBF / OBZ vocabulary import: Carers can import a
.obfor.obzfile from any AAC tool that exports the Open Board Format — PrAACtical AAC samples, OpenAAC, CoughDrop public boards. From Settings → "Imported boards", click the file picker; the imported board joins the Vocabulary dropdown alongside the built-in YAMLs. - Inline data-URL images and ZIP-bundled images both work; everything stays on-device.
- Multi-board navigation (
load_boardlinks) is parsed but not yet auto-traversed on dwell-select — each.obzboard is selectable as its own vocabulary.
Implementation
- New ADR 0006-fflate-for-obz.md —
fflate(~12 KB MIT) for in-browser ZIP reading. - Pure parsers
obfImporter.ts(12 unit tests) andobzImporter.ts(7 unit tests) keep parsing logic side-effect-free. - IndexedDB persistence (
saveImportedBoard/getImportedBoard/listImportedBoards) survives offline reload. - Playwright e2e covers the upload → switch → speak path.
Privacy
Same posture as v0.1.0: imported files stay on your device. No upload, no telemetry.
v0.1.0 — first web release
NuinTalker v0.1.0
First public release of the web rewrite. Replaces the Flutter/Dart implementation (preserved at the v0-dart-archive tag).
Live site: https://ashmere.github.io/NuinTalker/
What's in this release
Tracking
- MediaPipe Tasks for Web FaceLandmarker (478 landmarks + iris) on-device
- Eye-corner-referenced iris position with One-Euro filter smoothing
- Head pitch + yaw from the facial transformation matrix as the dominant signal
- 9-point per-user affine calibration
- Dwell selector with configurable jitter tolerance, cool-down, and exit-grace
UI
- Flank-3x3 default layout: hardcoded "More" / "All Done" flank slots, paginated 9-cell centre
- Mulberry SVG symbols (CC BY-SA 4.0)
- Single ARASAAC pictogram for "stop" (CC BY-NC-SA 4.0 — see ADR 0005)
- Diagnostic HUD (
Cmd+D/Ctrl+D) - Carer-lock (
Cmd+S/Ctrl+S, or four-corner long-press) - Vocabulary tailored for tube-fed users (single "hunger" cell)
- Sentence bar with horizontal scroll keeps a stable height
Architecture
- Vite 7 + React 19 + TypeScript 6 strict
- Zustand stores, Tailwind v4, Web Speech API, idb-keyval, vite-plugin-pwa
- 106 Vitest units, Playwright e2e dwell-to-speak
Browser support
- Chrome / Edge: first-class
- Firefox: best-effort
- Safari: not supported (Web Speech voice quality,
getUserMediaconstraints)
Privacy
All face landmarking, gaze inference, dwell timing, TTS, and persistence happen in the browser on your device. No video, audio, transcript, gaze trace, or usage event leaves the device.
What this release does not do yet
- Open Board Format (OBF) import — drafted in
specs/002-obf-import, implementation comes next - Multi-profile UI (one profile per browser today)
- Word prediction
- Non-English voices beyond what Web Speech ships
Licence note
Shipping the ARASAAC stop.png symbol restricts the project to non-commercial use under CC BY-NC-SA 4.0. To enable a commercial path, replace that one file (the rest of the symbol set is Mulberry CC BY-SA 4.0). See NOTICE.