ZSTATION-CORE // EMBEDDABLE ISOLATED-WEBVIEWS ENGINE

// pure-Rust service catalog · tile board model · session-isolation registry — the core behind zstation, embeddable in any host

Engineering Report Source

zstation-core is the embeddable engine behind zstation, a from-scratch port of the defunct station.app: one window that arranges your web apps (Slack, Gmail, Discord, Notion, Linear, Claude, …) as Trello-like draggable tiles, each running in its own isolated session so logging into one never leaks cookies or storage into another. The crate owns the service catalog, the tile board model and its on-disk persistence, and exposes them through one command surface (Engine::invoke) so every host drives identical behaviour. It ships a mountable Trello-board view built entirely from zgui-core widgets. It carries no GUI and no platform UI deps, so the standalone app and every embed share the exact same code. The crate builds as rlib for native Rust/Tauri hosts and as staticlib/cdylib. This project is in active development.

Embeddable

One command surface — Engine::invoke(cmd, args_json) — drives every host identically: native Rust, or a Tauri v2 app command (zst_invoke) behind the tauri feature.

Real session isolation

The engine stays host-agnostic; the mountable view drives the host's native, separately-partitioned webviews through a small shim (window.__stationHost) — never an iframe, which cannot isolate sessions.

Pure Rust

Foundational, vendorable deps only — serde, serde_json, thiserror, dirs. No system stack, no copyleft, no native UI toolkit; cargo test runs headless.

Honest Status

Engine commands and tests are derived from source. Current state: what exists is implemented and tested; the rest is on the roadmap, not faked.

Quick start

use zstation_core::Engine;
use serde_json::json;

let mut engine = Engine::new()?;

// One dotted command surface for every host.
let info = engine.invoke("version", &json!({}))?;
let services = engine.invoke("service.catalog", &json!({}))?;

// Add an isolated tile, then persist the board layout.
let tile = engine.invoke("tile.add", &json!({ "service": "slack", "partition": "slack:work" }))?;
engine.invoke("layout.save", &json!({ "tiles": [] }))?;

Surfaces

Depend on the rlib and call Engine directly, or go through Engine::invoke with JSON for parity across hosts. Enable the tauri feature to register the engine as an ordinary Tauri v2 app command. The mountable view (frontend/zstation.js) drives the engine through zst_invoke and drives the host's native isolated webviews through the window.__stationHost shim.

Where it goes next

See the engineering report for the module map, command surface, dependency footprint and test status, and the MenkeTechnologiesMeta umbrella for the wider stack this engine plugs into.