Roadmap
What's done, what's next, and where Aksa is headed.
- P0: scaffold, Makefile (native+wasm), test harness, CLI
aksa tokens - P1a: locale loader + lexer (id/en, Unicode idents, E001–E003) + wasm demo page
- P1b: parser → AST (recursive descent, panic-mode recovery,
aksa ast) - P1c: semantic checker (
aksa check; static E100–E111, runs before everyaksa run) - P1d: bytecode VM,
aksa run(tulis/tanya, functions, loops, localized runtime errors) - P1e: golden tests (40 ok + 36 error programs,
tests/golden.shinmake test) - P2a: browser run (console via WASM hooks, inline async
tanya, stop button, instruction-budget yield) - P2b: CodeMirror 6 editor (bun-bundled; locale-driven highlighting, live squiggles, error panel)
- P2c: turtle canvas (animated draw, live speed slider, reset, id color names)
- P3: hardware simulator (virtual board: 3 LEDs, button, slider, buzzer, fan; pin builtins + non-blocking tunggu; examples dropdown; headless CLI board for 10 golden tests)
- P4: C emitter (
aksa emit) + tiny value runtime + sim/esp32 HAL; differential tests (tests/diff.sh) prove emitted C compiles-Werrorand matches the VM on all golden ok/err programs (E109 depth excluded) - P5: compile server (Bun + arduino-cli in Docker, ESP32) + browser flasher (esptool-js) + serial monitor; flash path untested on a real board
- P5 deferred: test on real ESP32;
tanyaon device (serial read in HAL); Pico/UF2; per-IP rate limit; build+test Docker image (no Docker locally); flash.js: call requestPort() before compile (fail fast if no board + avoid user-gesture timeout) - P6g: reference-counted heap strings in emitted C (rt.c); loops that build text free per-iteration, no leak on device; tests/mem.sh (AK_LIVE=0) + ASan-clean corpus
- P6a (language only): IDE split into language page (lessons+turtle) and device page (board+flash); 15 graded lessons (id+en), basic→middle→advanced; share via URL hash
- P6c: drawing cursor renamed turtle→robot, arrow replaced with a robot character (rounded body, eyes, nose showing heading)
- P6d: lessons split into one file per locale (lessons.id.js/lessons.en.js), lessons.js just assembles the map
- P6e: all JS → strict TypeScript (web+server, bun-native); tsconfig +
make typecheck - P6f: auto-detect chip on flash (esptool-js CHIP_NAME → board); compile targets esp32c3/esp32c6, bootloader at 0x0; others rejected
- P6b: more locales; device lesson track after real-board testing; per-board GPIO pin map (C3 vs C6). Deliverable: Aksabot C6 pin map (named components → GPIO)
- P7: on-device runtime — ESP32-C3 is its own hotspot + editor + interpreter (
make device/device-flash); compiles at 78% flash; check off after real-board test (LED polarity, heap, both locales) - P8: Aksabot (closed kit, ESP32-C6) — reuse P7 AP+editor+on-chip VM; board profile (named components via generated
buat name = gpiopreamble); 3 new snake_case builtins (atur/pin_pwm,sudut/servo_write,baca_jarak/pin_read_distance) + HAL (esp32/sim); hardware lesson track (parallel to 15 screen lessons). v1 editor = text - Production order (Aksabot): 1 prototype from off-the-shelf modules → prove C6 software → prove curriculum with kids → PCB+casing → mass. No PCB before wiring+curriculum validated
- Block+text editor: drag-drop blocks that emit Aksa text side-by-side. Deferred until text editor v1 proves out
- Docs site (docs.aksabot.com): static bosia app in
docs/— en + /id, language guide, builtins/errors/CLI reference, 15 lessons, Aksabot section, search, llms.txt, Cloudflare deploy - Web redesign: playful kid theme (Lilita One/Nunito, sky bg, bouncy buttons); both pages, mobile stack <800px; brand + canvas cursor use favicon robot (antenna ball = pen color)
- Play deploy (play.aksabot.com): CI builds wasm (emsdk) + bundle, flattens play/+wasm/+locales/ into site/, Cloudflare Pages
aksa-play