Recipes for Ryu — parameterized, replayable native-desktop automations: record once with a frontier model, replay forever with a small one.
The public home of
ryu-recipes. Source, builds, and releases live here — binaries for every platform are attached to each release.This tree is generated from the Ryu monorepo, so commits pushed here directly are replaced on the next sync. Pull requests are welcome — open them here and they are ported into the monorepo, then flow back out. Ryu as a whole: https://github.com/amajorai/ryu
- Binary:
ryu-recipesfrom the Ryu releases. - Crate:
cargo install ryu-recipes.
Apache-2.0 — see LICENSE.
ghost-os parity for the workflow system. A recipe is a parameterized, replayable native-desktop automation: a frontier model records a UI action sequence once, and a small model replays it forever ("figure out the workflow once, run it forever").
backend/(ryu-recipes) — an extracted Core capability crate: the on-disk store surface (overghost-core'sRecipeStore), the replay/record engine wrapper, and the/api/recipes/*HTTP surface. Consumed by Core as a NON-optional path dependency: the workflow executor'sRecipe/GhostActionnodes callrunandextract_mcp_jsonunconditionally (they are kernel) in-process, so the impl compiles in every build — but the HTTP surface itself now moved out (there is norecipescargo feature and no in-processrecipes_routesmerge).- No companion UI. The record/parameterize/replay engine lives in
ghost-core/apps/ghost; this crate is the thin surface onto it.
Sidecar-ization status (2026-07-18): OUT-OF-PROCESS. The whole
/api/recipes/*surface (CRUD + run + record) is served by the standalone[[bin]] ryu-recipes(kind:local,public_mount /api/recipes, port 7999, lazy +idle_stop) via the generic ext-proxy loader; the in-processrecipes_routesmerge, the OpenAPI sub-doc, and therecipescargo feature were dropped. The two live-Ghost paths stay kernel-side: the sidecar'sRecipesHostis aCoreCallbackthat POSTs replay + record-start/status/stop back to Core's generic capability seam/api/host/capability/ghost.{replay,recordStart,recordStatus,recordStop}(ext-bearer authed,x-ryu-plugin-id, gated on the declaredghost:recordgrant), run againstCoreRecipesHost— the shared MCP registry + the ghost-recorder subprocess (McpSession) held in Core's process-global slot, sostart..status..stopacross separate sidecar calls reach the SAME session. The crate stays a path-dep only because the workflow executor still callsryu_recipes::runin-process against that same host (no HTTP round-trip on the executor path). Store stays at the shared~/.ghost/recipes(both the sidecar andapps/ghostopen it). The earlier double-register FLAG is resolved: the in-process merge was removed atomically with addingpublic_mount, so only the sidecar mount is live.
- Stateless ops (list / show / save / delete) read/write the recipe JSON directly via
ghost_core::store::RecipeStore— the SAME store and~/.ghost/recipes/path resolutionapps/ghostwrites through, so Core and ghost never disagree about where a recipe lives. - Replay (
run) and the recording session (record_start…record_stop) need the live ghost engine (input tap, accessibility tree, action synthesis). That kernel machinery (the shared MCP registry + a dedicated ghost subprocess held across start..stop) is inverted through theRecipesHosttrait —apps/coreimplements it and installs it once at boot viaset_global_host. The crate has zero dependency onapps/core.
- id
@ryu/recipes, no runnables, nopermission_grants. - requires app
ghost(>=1.0.0) — it is backed by Ghost'sRecipeStore, so the dependency graph refuses to disable Ghost out from under it.
/api/recipes (list) · per-recipe :name (show/delete) and :name/run · record/start,
record/status, record/stop.