Roadmap
Milestones delivered so far, and what's next. Each shipped milestone is compiled, clippy-clean, and tested (SQLite for the DB layer; GUI/OS integrations are launch-smoked, with visual/side-effecting steps called out as unverified).
Delivered
- M0 — tao + wry +
elyra://custom protocol + one#[command]end to end over MessagePack; container; assets from memory with a fallback page. - M1 —
EventBus+channel()+ per-flush batching; async custom protocol (noblock_on). Both frontends include a latency probe. - M2 — specta codegen (
rata codegen) → TS types + typedapi.*; the CLI (dev,codegen,build). - M3 — providers (
register/boot), the middleware pipeline,Resultcommands, window options. - M4 — multi-window + the
Windowshandle,rata newscaffolding,rata bundle(macOS.app+ ad-hoc signing). - M5 —
elyra-db(SQLite/MySQL/Postgres via sqlxAny) +rata migrate(batched, reversible, status). - M6 — system tray (
tray-icon, clicks → event bus) and the auto-updater (manifest + semver + ed25519 verification; HTTP fetch + staged download). - M7 —
#[derive(Model)]Active Record: CRUD + typed query builder, per-driver placeholders, injection-safe column identifiers. - M8 — model extras:
bool↔INTEGER mapping,#[model(column)], and#[model(timestamps)]. - M9 — model relations (
has_many/has_one/belongs_to) andwhere_infor eager-load queries. - M10 — eager loading: each relation gets a
load_<name>batch method (oneWHERE fk IN (..)query, grouped into aHashMap) to avoid N+1. - UI components (v0.1.0) — a built-in About dialog
(
App::about) and an auto-update toast (App::updater), both rendered by@elyra/runtime; the updater now applies + relaunches (Updater::apply_and_relaunch). - Codegen serde support — types export through
specta-serde, sorename/rename_all, tagged / untagged enums,flatten, andskipare reflected in the generated TypeScript. - Database CI — model CRUD runs against real MySQL and Postgres
service containers in CI (
framework/tests/model_servers.rs), covering per-driver placeholders and key retrieval; skipped locally unless theELYRA_TEST_*_URLenv vars are set.
Next / open
- Codegen — optional
biginttransport for integers beyond 2^53 (MessagePack already carriesi64on the wire; this is a TS-typing opt-in). - Models — composite (multi-column) primary keys. (Single non-
i64keys, relation auto-hydration into struct fields, and column-aware relation FKs have shipped.) - Dogfood — port a real app to pressure-test the DX.
Out of scope
Elyra is a framework, not a release pipeline. It deliberately does not handle
code signing, Apple ID / Developer ID, notarization, or building and shipping
binaries — those belong to each application's own release process. rata bundle
produces a local, ad-hoc-signed .app for development; producing a signed,
notarized, distributable build is the app's responsibility.
The updater is the same: it provides verified download + apply primitives, but generating keys, signing artifacts, and hosting the manifest are the app's job, not the framework's.
Known sharp edges
- Events use HTTP-style long-poll over the custom protocol (wry's async responder is one-shot). One connection is multiplexed across channels.
- macOS requires the webview on the main thread; the tokio runtime is kept separate and every request is spawned onto it.
- The
#[command]macro handles neither generics norOption<Ctx>— deliberate. rata devrelies on cross-schemefetch(http origin →elyra://); CORS is set, but platform behavior there is unverified.