Convention question: parallel _app Dioxus crates and island-*-native features — finish, repurpose, or deprecate? #190

Open
opened 2026-04-26 18:41:06 +00:00 by sameh-farouk · 1 comment
Member

What's the question

Across the hero_* services, there's an inconsistent pattern for how a service's UI integrates with hero_os: some have a _server + _ui (JS) + _app (Dioxus WASM) split with an island-*-native Cargo feature in hero_os_app; some have only one or the other; some have neither. What's the convention going forward, and what's the right fate of the in-flight parallel mirrors that nobody is finishing?

How we got here

mik-tf rolled out a "100% SPA migration" in hero_collab 8579db4 (sessions 17-18 — native dioxus islands, new URL routing) and equivalent commits across ~18 services in early April 2026. Goal stated in the commit: replace every JS UI with a native Dioxus island. The migration created _app crates in many services and island-*-native features in hero_os_app/Cargo.toml (lines 79-95). It hasn't been completed.

State today (verified across 9 services)

Service _app crate Last _app commit Notes
hero_collab half-finished admin only — no canvases / huddles / federation / pins 2026-04-12 chat_view.rs is 403 lines that re-declare the chat HTML scaffold in rsx!{} and dynamically load the same chat-app.js (4,597 LOC). Plus 3,383 LOC of Dioxus admin tabs duplicating dashboard.js (1,905 LOC).
hero_whiteboard duplicates dashboard.js admin tabs drift since Apr 12 feature-gated, default off
hero_agent partial overlap (8 JS tabs vs 6 Dioxus) drift since Apr 12
hero_voice clean — different scope from JS UI (8 RPCs vs 13, no destructive ops) actively shipped reference for "two UIs, different jobs"
hero_proxy clean — Dioxus-only, no JS mirror actively shipped reference for "pick one path"
hero_osis server-side Askama templates only n/a no Dioxus
hero_proc server-side Askama templates only n/a no Dioxus
hero_archipelagos 30+ native crates + 19 embed/ iframe wrappers actively shipped mixed; office crate (below) is the cleanest pattern

In hero_os_app/Cargo.toml: 16 island-*-native features, all OFF in the default web feature (line 11), only enabled under web-native (lines 142-154). Whether web-native is built/deployed anywhere is unclear — the audit didn't surface a release flow that uses it.

What works (concrete references)

The cost of the status quo

For services with parallel mirrors that nobody is finishing, every JS feature added is invisible to the Dioxus snapshot. In hero_collab specifically: ~5,700 LOC of parallel surface area, last Dioxus-side commit on 2026-04-12, every chat/admin feature shipped since lives in JS only. Whoever's currently on an _app crate's iframe path is paying for the duplicate that they didn't sign up for.

Questions

  1. Is web-native used in any deployed build? If yes, the stale _app crates are load-bearing and need active owners. If no, they're carrying cost for nothing.

  2. For the three services with stale parallel mirrors (hero_collab, hero_whiteboard, hero_agent), what's the right fate per service? Three options:

    • Finish — same scope as JS, become canonical, delete the JS counterpart afterward. (Requires committed ownership for each.)
    • Repurpose — give the _app a different scope from the JS (focused widget, embedded compose, activity feed). hero_voice's pattern.
    • Deprecate — delete the _app crate, remove the island-*-native feature, keep iframe as the sole integration path. (hero_slides already operates this way.)
  3. For new services: convention should be _server + (_ui JS / Askama / Dioxus — pick ONE), or always-three? If the answer depends on the service shape, what's the rubric?

No emergency, but every service that ships locks in another answer.

## What's the question Across the hero_* services, there's an inconsistent pattern for how a service's UI integrates with `hero_os`: some have a `_server` + `_ui` (JS) + `_app` (Dioxus WASM) split with an `island-*-native` Cargo feature in `hero_os_app`; some have only one or the other; some have neither. **What's the convention going forward, and what's the right fate of the in-flight parallel mirrors that nobody is finishing?** ## How we got here `mik-tf` rolled out a "100% SPA migration" in [hero_collab `8579db4` (sessions 17-18 — native dioxus islands, new URL routing)](https://forge.ourworld.tf/lhumina_code/hero_collab/commit/8579db4) and equivalent commits across ~18 services in early April 2026. Goal stated in the commit: replace every JS UI with a native Dioxus island. The migration created `_app` crates in many services and `island-*-native` features in [`hero_os_app/Cargo.toml`](https://forge.ourworld.tf/lhumina_code/hero_os/src/branch/development/crates/hero_os_app/Cargo.toml) (lines 79-95). It hasn't been completed. ## State today (verified across 9 services) | Service | `_app` crate | Last `_app` commit | Notes | |---|---|---|---| | [hero_collab](https://forge.ourworld.tf/lhumina_code/hero_collab) | half-finished admin only — no canvases / huddles / federation / pins | 2026-04-12 | [`chat_view.rs`](https://forge.ourworld.tf/lhumina_code/hero_collab/src/branch/development/crates/hero_collab_app/src/chat_view.rs) is 403 lines that re-declare the chat HTML scaffold in `rsx!{}` and dynamically load the same `chat-app.js` (4,597 LOC). Plus 3,383 LOC of Dioxus admin tabs duplicating `dashboard.js` (1,905 LOC). | | [hero_whiteboard](https://forge.ourworld.tf/lhumina_code/hero_whiteboard) | duplicates `dashboard.js` admin tabs | drift since Apr 12 | feature-gated, default off | | [hero_agent](https://forge.ourworld.tf/lhumina_code/hero_agent) | partial overlap (8 JS tabs vs 6 Dioxus) | drift since Apr 12 | | | [hero_voice](https://forge.ourworld.tf/lhumina_code/hero_voice) | **clean** — different scope from JS UI (8 RPCs vs 13, no destructive ops) | actively shipped | reference for "two UIs, different jobs" | | [hero_proxy](https://forge.ourworld.tf/lhumina_code/hero_proxy) | **clean** — Dioxus-only, no JS mirror | actively shipped | reference for "pick one path" | | [hero_osis](https://forge.ourworld.tf/lhumina_code/hero_osis) | server-side Askama templates only | n/a | no Dioxus | | [hero_proc](https://forge.ourworld.tf/lhumina_code/hero_proc) | server-side Askama templates only | n/a | no Dioxus | | [hero_archipelagos](https://forge.ourworld.tf/lhumina_code/hero_archipelagos) | 30+ native crates + 19 `embed/` iframe wrappers | actively shipped | mixed; office crate (below) is the cleanest pattern | In `hero_os_app/Cargo.toml`: 16 `island-*-native` features, all OFF in the default `web` feature (line 11), only enabled under `web-native` (lines 142-154). **Whether `web-native` is built/deployed anywhere is unclear** — the audit didn't surface a release flow that uses it. ## What works (concrete references) - [hero_archipelagos `01fa4b6` `feat(office): native Dioxus file browser + iframe-only OnlyOffice editor`](https://forge.ourworld.tf/lhumina_code/hero_archipelagos/commit/01fa4b6) — native Dioxus chrome + iframe for the heavy embed. Wired into hero_os via [PR #88](https://forge.ourworld.tf/lhumina_code/hero_os/pulls/88), replacing the prior inline iframe. - `hero_voice_app` (linked above) — `_app` and `_ui` at different scopes (one is the focused embedded surface, one is the full standalone management UI). Not mirrors. ## The cost of the status quo For services with parallel mirrors that nobody is finishing, every JS feature added is invisible to the Dioxus snapshot. In hero_collab specifically: ~5,700 LOC of parallel surface area, last Dioxus-side commit on 2026-04-12, every chat/admin feature shipped since lives in JS only. Whoever's currently on an `_app` crate's iframe path is paying for the duplicate that they didn't sign up for. ## Questions 1. **Is `web-native` used in any deployed build?** If yes, the stale `_app` crates are load-bearing and need active owners. If no, they're carrying cost for nothing. 2. **For the three services with stale parallel mirrors** (hero_collab, hero_whiteboard, hero_agent), what's the right fate per service? Three options: - **Finish** — same scope as JS, become canonical, delete the JS counterpart afterward. (Requires committed ownership for each.) - **Repurpose** — give the `_app` a *different* scope from the JS (focused widget, embedded compose, activity feed). hero_voice's pattern. - **Deprecate** — delete the `_app` crate, remove the `island-*-native` feature, keep iframe as the sole integration path. (hero_slides already operates this way.) 3. **For new services**: convention should be `_server` + (`_ui` JS / Askama / Dioxus — pick ONE), or always-three? If the answer depends on the service shape, what's the rubric? No emergency, but every service that ships locks in another answer.
Owner

Good points.

So Kristof is aware of the web-native/100% SPA version. And in the end we want to have 100% SPA, but he said many times that it is not the time now to do it. I did the web-native in a way that does not stop the development of the non web-native versions (called just web). So it should not interfere. In the best scenario we can have 100% SPA quickly so we can have a stronger Hero OS for all platforms.

@despiegk If you change your mind and think we should do 100% let us know. Otherwise as I see it the latest direction was to not focus on this (yet).

I hope it helps @sameh-farouk . Curious to hear the feedback on this.

Note: Any time we want to go web-native, it does not take me too long to update it so it is in line with latest features from web version, but with 100% SPA. (I tested the whole thing in Hero OS live).

Good points. So Kristof is aware of the web-native/100% SPA version. And in the end we want to have 100% SPA, but he said many times that it is not the time now to do it. I did the web-native in a way that does not stop the development of the non web-native versions (called just web). So it should not interfere. In the best scenario we can have 100% SPA quickly so we can have a stronger Hero OS for all platforms. @despiegk If you change your mind and think we should do 100% let us know. Otherwise as I see it the latest direction was to not focus on this (yet). I hope it helps @sameh-farouk . Curious to hear the feedback on this. Note: Any time we want to go web-native, it does not take me too long to update it so it is in line with latest features from web version, but with 100% SPA. (I tested the whole thing in Hero OS live).
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/home#190
No description provided.