You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Catalog cards now show which platforms an app supports while you browse, so "does this work on my phone?" is answered without opening the listing. All 59 packaged listings now declare a per-surface support level - full, limited, list, commands, or none - and the card and detail page render the same labels from the same data.
Core derives the platform list from each manifest's surfaces map and publishes it on the catalog entry, and the public index projects it into a flat surfaces array. An explicit "none" is filtered out rather than advertised, while an absent key keeps its meaning of "not declared, runs everywhere."
Listings can now say how finished they are, and the store shows it on the card and in the detail header. Alpha, beta, rc, nightly, and canary are all valid today.
The label is a free-form string carried in the published index, so a listing graduates out of beta by flipping a value and re-mirroring, with no Core release. An unrecognised value renders title-cased rather than disappearing, and a listing that declares nothing renders no badge at all.
Affected packages: ryu-core, @ryu/marketplace
Per-version history for listings
The Versions tab on a store listing now expands to the manifest and README read from the repository at that exact tag, so a row shows what the listing actually was at that release - description, licence, engines, and surfaces - not just the tag, date, and notes.
Rows load lazily when expanded, since a listing can carry up to 20 versions. Only repo-resident signals are claimed as historical: stars, issues, and activity are current-state, and every expanded row says so explicitly rather than presenting them as the state at that tag.
In the desktop app the reader is bound to the active node through CatalogHost, and a tag with no packaged manifest renders "No manifest published at this tag" rather than an error.
Storage settings can now copy your current profile's data into another profile - dev, canary, nightly, or beta - complete with the master key, so the destination boots able to decrypt everything. Release is deliberately not offered as a target, and an already-populated target is refused rather than merged.
The key travels first and any failure aborts before a file is written, so a copy never leaves ciphertext nothing can read. Node identity, sign-in state, saved nodes, and downloaded binaries are excluded, and Core is stopped during the copy so the snapshot is not torn.
A new Danger Zone action, deep clean, removes what Reset node never touches: shadow captures, ghost state, gateway config, and the data-path pointer that live outside the data folder. Every path is checked for $HOME containment before deletion, and the dialog warns that shadow and ghost are shared across all profiles.
The mail app's manifest now declares a support level for each platform it targets. (8636db8)
@ryu/marketplace@0.1.0
Minor changes
Added a shared stabilityLabel helper and rendered the badge on store cards and in the detail header; unknown values fall back to a title-cased verbatim rendering. (2774575)
The Versions tab now expands each row to the manifest and README read at that tag, lazy on expand; a tag with no readable manifest renders a notice, and surfaces without a reader hide the expander entirely. (87a1914)
Made the ReviewsPanel realm a prop defaulting to plugin and documented that non-plugin realms must also pass scorecard null, so skills and models are never graded against plugin-manifest signals. (2905cb9)
Extracted the detail tabs into ListingDetailTabs with an optional overview and controlled tab state, and added installedAppAsEntry, which synthesises only the five fields CatalogEntry requires. (0dde100)
Added a compact platform row to store cards and moved surfaceLabel into its own module shared with the detail strip, pinned so the label map can no longer drift onto non-surfaces. (109542b)
Corrected SURFACE_LABELS to the real surface set - dropping browser and tui, adding gateway, core, and extension - and pinned it with satisfies Record<Surface, string>. (1a6a489)
Patch changes
Switched the detail dialog's tab row from line to pill styling, removed the TabsIndicator that would cancel the solid pill, and let the row wrap for the seven-tab layout. (e371903)
Added assessNode, which returns belowFloor, channelMismatch, or nodeIsNewer, and prefers the channel a node reports on /api/health over deriving it; it warns rather than blocks and fails soft on unknown versions. (6627eec)
Regenerated the generated plugin-manifest type to match the tolerant Surface and SurfaceSupport definitions. (1a6a489)
Browser extension@0.1.0
Patch changes
The extension now sends X-Ryu-Surface on plugin requests, so Core filters its plugin set by what the extension supports. (bb0d8bd)
Desktop app@0.1.0
Minor changes
Added a Danger Zone action wired to the deep-clean command, with a confirm dialog warning that shadow and ghost state are shared across all profiles. (683c20c)
Added a per-version detail reader on the catalog host, bound to the active node, so the desktop can fetch a listing's manifest and README at a specific tag. (87a1914)
The installed view now fetches catalog detail and renders the shared listing tabs below its own lifecycle header, so installed apps keep their README, versions, and health; the fetch is lazy and local-only apps render nothing extra. (0dde100)
Added a Storage setting that copies the current profile's data into another profile, stopping Core first and passing --from-profile explicitly; release is not offered as a target. (f011b71)
node-compat.ts now re-exports the shared node assessment from core-client, keeping its call sites and its 16 tests unchanged. (6627eec)
Added channelOf and channelMismatch to node-compat so a stable desktop driving a canary node is detected; the result is advisory only, and unknown versions fail soft to no mismatch. (f116b7b)
The updater now resolves each channel's feed from the rolling tag's own release instead of /releases/latest, so canary and nightly users are offered that channel's build rather than stable. (e4e4b41)
Unified the desktop bundle id on ai.amajor.ryu.* across both tauri configs and added a one-time migration that copies the old identifier's app-data directory, running before the Builder and never overwriting an existing copy. (4389cfa)
Patch changes
The backup caption and restore dialog now state that a backup zip cannot be restored without this machine's key, since the master key lives in the OS keychain and is not included in the zip. (d9ba447)
Mirrored the per-profile port-offset table and made the desktop fall back to release's offset rather than dev's for an unknown profile name. (e2d6ec0)
Island@0.1.0
Patch changes
The island now sends X-Ryu-Surface on plugin requests, so Core filters its plugin set by what the island supports. (bb0d8bd)
plugin: advisor@0.1.0
Minor changes
The advisor plugin's manifest now declares a surfaces map with per-platform support levels. (8636db8)
plugin: agentbrowser@0.1.0
Minor changes
The agentbrowser plugin's manifest now carries a surfaces map naming where it runs. (8636db8)
plugin: brave@0.1.0
Minor changes
The brave plugin's manifest now specifies per-surface support levels. (8636db8)
plugin: bytebot@0.1.0
Minor changes
The bytebot plugin's manifest gained a surfaces map with support levels per platform. (8636db8)
plugin: chat-title@0.1.0
Minor changes
The chat-title plugin's manifest now declares which surfaces it supports. (8636db8)
plugin: double-check@0.1.0
Minor changes
The double-check plugin's manifest now includes a surfaces map for the store's platform badges. (8636db8)
plugin: exa@0.1.0
Minor changes
The exa plugin's manifest now advertises a support level for each platform it runs on. (8636db8)
plugin: firecrawl@0.1.0
Minor changes
The firecrawl plugin's manifest now declares per-platform support through a surfaces map. (8636db8)
plugin: firewall@0.1.0
Minor changes
The firewall plugin's manifest now carries per-surface support declarations. (8636db8)
plugin: ghost@0.1.0
Minor changes
The ghost plugin's manifest gained a surfaces map stating its supported platforms. (8636db8)
plugin: goal@0.1.0
Minor changes
The goal plugin's manifest now specifies a support level for each surface. (8636db8)
plugin: headroom@0.1.0
Minor changes
The headroom plugin's manifest now declares where it runs and at what level. (8636db8)
plugin: honcho@0.1.0
Minor changes
The honcho plugin's manifest now includes a surfaces map feeding the store's platform display. (8636db8)
plugin: hook-observers@0.1.0
Minor changes
The hook-observers plugin's manifest now declares per-surface support levels. (8636db8)
plugin: hook-session-context@0.1.0
Minor changes
The hook-session-context plugin's manifest gained a surfaces map naming its supported platforms. (8636db8)
plugin: mem0@0.1.0
Minor changes
The mem0 plugin's manifest now advertises per-platform support levels. (8636db8)
plugin: proof@0.1.0
Minor changes
The proof plugin's manifest now carries a surfaces map for its supported surfaces. (8636db8)
plugin: rtk@0.1.0
Minor changes
The rtk plugin's manifest now declares which surfaces it supports and how fully. (8636db8)
plugin: sample@0.1.0
Minor changes
The sample plugin's manifest gained per-surface support declarations. (8636db8)
plugin: sample-widget@0.1.0
Minor changes
The sample-widget plugin's manifest now includes a surfaces map with per-platform support levels. (8636db8)
plugin: scrapling@0.1.0
Minor changes
The scrapling plugin's manifest now specifies its supported platforms via a surfaces map. (8636db8)
plugin: security-guidance@0.1.0
Minor changes
The security-guidance plugin's manifest now declares a support level for each surface. (8636db8)
plugin: serper@0.1.0
Minor changes
The serper plugin's manifest now carries a surfaces map stating where it runs. (8636db8)
plugin: shadow@0.1.0
Minor changes
The shadow plugin's manifest now declares per-surface support levels. (8636db8)
plugin: spider@0.1.0
Minor changes
The spider plugin's manifest gained a surfaces map naming its supported platforms. (8636db8)
plugin: spidercloud@0.1.0
Minor changes
The spidercloud plugin's manifest now advertises per-platform support. (8636db8)
plugin: tavily@0.1.0
Minor changes
The tavily plugin's manifest now includes a surfaces map with support levels per surface. (8636db8)
plugin: tool-firewall@0.1.0
Minor changes
The tool-firewall plugin's manifest now declares which surfaces it supports and at what level. (8636db8)
ryu-core@0.1.0
Minor changes
Added channel listing and version-detail endpoints so a listing's release channels are resolvable end to end: channels reports only channels that actually publish and the tag each resolves to, and version-detail can read a build on a named channel. Resolution reuses the same pick_version_for_channel rule Core applies to its own builds, and an empty channel is a 404 rather than a fallback to stable. (361742e)
Added channel-based build resolution to the update module: a channel selects only its own builds, an empty channel never falls back, stable means no prerelease suffix, and the semver maximum within the channel wins. Tested against an out-of-order release list. (3961520)
Catalog entries now carry a free-form stability label from the manifest, so a listing can be marked alpha, beta, rc, nightly, or canary; an absent or explicit stable value renders nothing. (2774575)
Both catalog readers - plugins_as_items and flatten_plugins - now filter listings whose published index entry is marked hidden; an absent flag means visible, so older indexes are unaffected. (73bf147)
Added a data-path deep-clean subcommand that removes the shadow captures, ghost state, gateway config, and data-path pointer living outside the data folder, re-checking $HOME containment before each deletion. (683c20c)
Added a version-detail endpoint that returns a listing as it stood at a named tag, restricted to repo-resident signals plus atRef; repository health is excluded because it is current-state and cannot be reconstructed for a past tag. (736e2ca)
Added copy-profile, which copies a profile's data to another profile without touching either pointer file, moving the master key first and excluding node identity, sign-in state, saved nodes, and downloaded binaries by exact top-level name. (cf3c602)
Core now flattens a manifest's surfaces map onto the catalog entry, filtering an explicit none and omitting the key when nothing is declared. (109542b)
Extended plugin-manifest validation to parse the surfaces map, scoped the old permissive nothing-declared behaviour to manifests declaring neither form, and added a guard that every declared map reaches at least one human-facing surface. (8636db8)
Unknown surface and support-level values now parse as Unknown instead of failing the whole manifest, and a manifest targeting only unknown surfaces renders nowhere; /api/version now reports the Gateway's observed version rather than Core's own, and /api/health gained a channel field. (1a6a489)
Patch changes
Fixed copy_profile leaving an empty target directory behind when a refusal came after the writability probe; cleanup now removes only a directory the copy created and left empty. (165ebff)
Replaced the boolean port-offset rule with a per-profile table giving dev, canary, nightly, and beta their own offsets, and made an unrecognised profile name a startup error in resolve. (e2d6ec0)
Added an explicit copy operation for a profile's master key with three refusals - source missing, destination occupied, keychain unavailable - and tests proving the copied key opens the source's ciphertext while a freshly minted one does not. (a69c2de)
ryu-gateway@0.1.0
Patch changes
Mirrored the per-profile port-offset table so the Gateway binds the same ports Core expects for each profile. (e2d6ec0)
The plugin-manifest schema and Rust model now tolerate unknown Surface and SurfaceSupport values via catch-alls. (1a6a489)
Website (ryuhq.com)@0.1.0
Minor changes
The web shell's tauri config now uses ai.amajor.ryu.*, matching the desktop, island, and browser identifiers. (4389cfa)
Patch changes
Moved the shared Logo out of the device and OAuth pages into the portal chrome that now renders it, and tweaked the slide-to-unlock control in the device approval flow. (7d42670)
Repository & tooling
Minor changes
The mirror script now honours RYU_MARKETPLACE_HIDE_ALL and publishes every listing with hidden: true, so a catalog can ship before the store is ready. (d44043e)
The marketplace generator now emits a stability key into the published index when a manifest declares one. (2774575)
The generator now writes hidden: true when --hide-all is passed or a manifest declares it, and a test pins that an index with nothing hidden stays byte-identical. (73bf147)
Added a channel-feed assembler that builds each rolling release's signed updater feed from that run's artifacts, stamped the arch into the macOS bundle name so both legs survive upload, and added the script to the public mirror allowlist. (e4e4b41)
The wipe script gained a --legacy option that clears directories under bundle ids Ryu no longer ships, labelled to stay distinct in the plan. (4389cfa)
Added an interactive wipe command that plans a per-profile clean of data, config, client app dirs, and keychain slots, with supervisor-first teardown and account-exact keychain deletes; the planner is pure and covered by tests. (02edb84)
Patch changes
The generator now projects a manifest's surfaces and targets into a flat surfaces array in the published index, filtering explicit none and omitting the key when empty; the previous drop behaviour is now pinned by a test. (fb7016b)
Added the new profile port pairs to the free-ports helper so every stack's ports are covered. (e2d6ec0)
Fixed wipe's 'all' to union both canonical profile stacks with whatever was discovered, so it can no longer silently narrow to release, and labelled the release desktop's dev.ryu.desktop bundle id in plans. (9f775f6)