Roadmap
May 31, 2026 · View on GitHub
Design notes and future directions for the Awsum compiler.
Development Tracks
Soundness Track
S1. Compiler fuzzing
A generator of well-typed Awsum programs that compiles each across all five backends and checks for output divergence, surfacing cross-target equivalence bugs the fixed test corpus cannot reach.
S2. Effects expressed in the type system
A granular effect system that replaces the single catch-all IO type: every effect a function performs is named in its type, rather than collapsed into one IO.
S3. Type classes
Type classes, with do-notation generalised beyond its current hard-coding to Either.
S4. Concurrency and parallelism
Primitives for concurrent and parallel execution, exposed through the effect system.
S5. Specification, accessibility, trustworthy delivery, and 1.0 release
Language reference specification (machine-checkable EBNF grammar and semantic specification, published under CC-BY-4.0); WCAG 2.2 AA accessibility audit and remediation across the five editor integrations; a trustworthy delivery pipeline (SLSA provenance, Sigstore signing, reproducible builds, SBOMs); and the coordinated Awsum 1.0 release.
Practicality Track
P1. AI tooling
An MCP server exposing the compiler's typecheck, build, diagnostics, and symbol queries to AI assistants — the same capabilities the LSP server already serves to editors; and a set of packaged agent skills — instructions plus worked examples that teach an assistant the language's idioms — so an assistant writes idiomatic Awsum instead of rediscovering the rules from compile errors.
P2. Module system and project tooling
Modules; private and public declarations, with a mechanism for testing private declarations; partial incremental compilation (compilation stays whole-program, but intermediate results are cached so unchanged inputs are not recompiled); multiple source directories; a project configuration file; and dependencies fetched from arbitrary git repositories with integrity pinned to the commit hash.
P3. Test and benchmark tooling
A test runner (unit testing, property-based testing, effect testing and integration testing); and awsum benchmark, reporting compile time and program run time as separate measurements.
P4. Numeric types and collections.
Remaining operations on the existing Int32 / UInt8 / UInt32; unbounded integers; exact unbounded rationals; literal syntax for sequence collections; Set (unbounded) and Map (both a bounded Int-keyed form and an unbounded form).
P5. Networking
TCP connections and an HTTP server, exposed as platform effects gated to the appropriate program type.
P6. Browser-application program type
A browser-application program type modelled on The Elm Architecture, with Elm-style ports for typed interop with JavaScript.
P7. Mobile targets
iOS and Android as separate compilation targets with separate effect namespaces (IOS.* / Android.*), gated at compile time — Android via the existing JVM target (Kotlin/Java interop), iOS via the existing LLVM target (Swift interop over the C ABI). Detailed below.
Mobile Targets: Platform Effects as Separate Targets
Mobile platforms (iOS, Android) should be treated as separate compilation targets with separate effect namespaces, not as one abstract "mobile" target with two implementations.
IOS.GetPhoto -- compiles only under iOS target
Android.GetPhoto -- compiles only under Android target
Rationale
-
iOS and Android APIs diverge over time. A unified abstraction (like React Native's
Platform.select) pushes platform differences into runtime checks. Awsum should catch these at compile time, consistent with the existing effect model (Windowunavailable in CLI target). -
Forces good architecture. Shared business logic lives in pure functions (no platform effects, compiles to any target). Platform-specific UI/integration code is isolated per target. The type checker enforces the separation — not convention, not linting.
-
Avoids maintaining a lowest-common-denominator abstraction. Two platforms requesting "a photo" return different result types, have different permission models, and follow different lifecycle rules. Pretending they're the same creates leaky abstractions.
Practical implications
- Android is covered by the existing JVM target (Kotlin/Java interop is natural).
- iOS is covered by the existing LLVM target (Swift interop via C ABI).
- No need for a Dart/Flutter target. Flutter's value proposition is "one codebase, both platforms" — the opposite of what Awsum enforces. Dart adds no new habitat that JVM + LLVM don't already cover.
Code structure this enables
src/
Core.aww -- pure functions, compiles to any target
ios/App.aww -- uses IOS.* effects, iOS target only
android/App.aww -- uses Android.* effects, Android target only
The compiler rejects IOS.GetPhoto in an Android build and Android.GetPhoto in an iOS build — at type-checking time, not runtime.