open-standards/aac/aac-rs
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science e58c42c2d7
Some checks failed
no-vanity-metrics / Scan committed Markdown for vanity metrics (push) Successful in 3s
standards workspaces build + test / eoc-rs (push) Successful in 1m50s
standards workspaces build + test / jouleclaw-rs (push) Successful in 2m43s
standards workspaces build + test / jcp-rs (push) Successful in 1m20s
standards workspaces build + test / aac-rs (push) Successful in 1m33s
standards workspaces build + test / proof-rs (push) Successful in 1m12s
standards workspaces build + test / joule-code-rs (push) Successful in 50s
standards workspaces build + test / joulecontract-rs (push) Successful in 46s
standards workspaces build + test / map-rs (push) Successful in 36s
standards workspaces build + test / sandbox-rs (push) Successful in 2m10s
standards workspaces build + test / mesh-rs (push) Successful in 32s
standards workspaces build + test / smart-byte-rs (push) Successful in 2m47s
standards workspaces build + test / openpay (push) Successful in 4m50s
standards workspaces build + test / joule-ui-rs (push) Has been cancelled
standards workspaces build + test / jouledesk-rs (push) Has been cancelled
standards workspaces build + test / joulehook-rs (push) Has been cancelled
standards workspaces build + test / sense-rs (push) Has been cancelled
standards workspaces build + test / macOS energy backend (jcp-energy) (push) Has been cancelled
standards workspaces build + test / arl-rs (push) Has been cancelled
fix(aac sentence helper): what review found before release
- A request superseded while the model loaded (more words, the row closed)
  no longer writes an answer for nobody: run() checks after the load.
- Space and Enter typed into a text field ("They said", text mode) are typing,
  not switch presses: scanning no longer selects cells behind it.
- Each install records its runtime directory: an app with a new runtime
  revision offers the new files (Update) instead of failing every request,
  and the older revision's files are pruned.
- Stop works from the first moment: install() claims its guard before it
  waits on anything.
- A first-run check has the model to itself: no suggestion starts during it
  or cancels it, and a load is never let go as idle.
- An install that cannot be recorded is not counted as installed for the
  session; the record is saved before the first-run check, so a page that
  dies during it still offers Try again.
- Settings reads free storage when it opens, counts stored runtime files of a
  stopped download, and says plainly when a download was not recorded.
- One ✨ in text mode; another tab's download or removal shows here; the row
  never reopens by itself.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 06:52:48 -04:00
..
crates fix(aac sentence helper): what review found before release 2026-10-01 06:52:48 -04:00
data feat(aac sentence helper): whole sentences and replies, suggested on the device 2026-10-01 06:52:48 -04:00
third_party feat(aac sentence helper): whole sentences and replies, suggested on the device 2026-10-01 06:52:48 -04:00
tools feat(aac sentence helper): whole sentences and replies, suggested on the device 2026-10-01 06:52:48 -04:00
Cargo.lock Merge branch 'aac/cores' into aac/integration 2026-09-30 01:47:23 -04:00
Cargo.toml fix(access-core): a clock that works in browsers, and a scan grid that follows the board 2026-09-28 16:25:49 -04:00
prerender-static.sh feat(aac sentence helper): whole sentences and replies, suggested on the device 2026-10-01 06:52:48 -04:00
README.md feat(aac sentence helper): whole sentences and replies, suggested on the device 2026-10-01 06:52:48 -04:00

aac-rs — the AAC reference implementation

Rust reference for the AAC open standard. Apache-2.0.

Crate What it is
access-core The shared access kernel: access methods, switch scanning with its response calibration (SPEC §5.2), dwell with two-way proposals (§5.3), gaze estimation, voice. Four dependencies (serde, serde_json, thiserror, web-time).
aac-core The engine: boards, symbols, vocabulary, motor planning, prediction, i18n with each language's core status (§4.1), the cascade, interchange.
aac-web Express, the reference communication app (Leptos → WASM, offline-first PWA). Live at aac.transaction.science.
aac-conformance The harness: C1–C7 against the published vectors in ../conformance/v1/.

Test and conform

cargo test --workspace
cargo run -p aac-conformance --bin aac-conformance     # C1–C7; any FAIL exits non-zero
cargo run -p aac-conformance --bin gen-vectors -- ../conformance/v1   # regenerate C5/C6 vectors

Build the app as a static site

bash prerender-static.sh        # → target/site/, ready to rsync; deploy with no_cache_bust

The script builds with the wasm-bindgen CLI version the crate pins (installing a private copy if the machine's differs), prerenders the SSR shell, content-hashes pkg/, and writes a service worker that precaches the shell and every file it loads, so the installed app opens with no network.

Two optional downloads ship beside the app, each built outside git and checked against a catalogue committed here. Each is offered to the person, never fetched by itself, and runs on their device:

  • Better voices (tools/voices/): neural text-to-speech.
  • The sentence helper (tools/ai/): an on-device language model that turns a few chosen words into whole sentences, and suggests replies. It runs on the graphics chip only, and only in the languages it was tested in.

Set AAC_VOICES=none or AAC_AI=none to build without them.

Host it under your own site

Express reads four build-time variables (set them for both the cargo-leptos build and the prerender):

Variable Default Use
AAC_BASE_PATH "" Mount path, e.g. /app. Also set LEPTOS_SITE_PKG_DIR=app/pkg for the prerender.
AAC_SW_URL /sw.js The service worker to register (a host usually runs one for its whole site).
AAC_APP_TITLE AAC — aac.transaction.science The document title.
AAC_HIDE_ENERGY unset Set to hide the energy meter.

aac.aurasense.ai builds it this way at /app (build-app.sh).

Two rules the app keeps

  • The first frame is the same on the server and in the browser. Saved state is restored only after hydration, behind a brief starting screen. Reading it earlier made a returning user's first frame differ from the prerendered page, and hydration aborted.
  • Timing belongs to the person (SPEC §5.1). Settings → Timing sets scan speed and dwell, shows proposals from the person's own responses to accept or decline, and adjusts automatically only if they turn that on.