Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Changed the definition of "analyze_schedule", "calibrate_program", "get_renderer_source" and 6 more
⟨37 unchanged words⟩ ready at 6pm?'. Pure computation. With `history` (run records) or `program_id`)it also predicts durations from recordedruns; see rhylthyme://guide/tools.runs.
⟨13 unchanged words⟩ default, P10 to P90 as the range,neveratnarrowerleast
Changed the definition of "analyze_schedule", "calibrate_program", "create_environment" and 16 more
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"finishAt":{"description": ⟨143 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"actorPeak" ⟨115 unchanged words⟩
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Changed the definition of "get_renderer_source", "import_from_source", "preview_timeline" and 3 more
Return the open-source timeline renderer's JavaScript (Apache-2.0,~9KBabout 90 KB, no dependencies) to paste into a <script> ⟨15 unchanged words⟩
⟨46 unchanged words⟩ : true` splits an import into parallel tracks.ThenReturnscallthevisualize_schedule.program.
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Added "review_program"; changed the definition of "analyze_schedule" (18 tools before, 19 now)
⟨28 unchanged words⟩ "description":"Recorded runs of this program (the `run` objectsfrom load_run).;Addsadds predicted durations.","items":{"additionalProperties":{ ⟨6 unchanged words⟩ ":{"additionalProperties":{},"description":"Optionalconditioning for the prediction: environmentId, userTags (variance factors, e.g. {turkeyKg: 7}), userId, programVersion, minIdentical, minModel, corrThreshold ⟨89 unchanged words⟩
Review an imported program — A model reads an imported program against its source and reports what looks wrong: a default duration on "simmer for an hour", a step the importer dropped, steps chained that could overlap, a total that disagrees with the source. Changes nothing; returns findings to show the user. Needs the user's Rhylthyme account.
Authorization not required, issuer https://pbqudpgkfhultuoqibem.supabase.co/auth/v1
Changed the definition of "analyze_schedule", "calibrate_program", "create_environment" and 15 more
ResolvePut aRhylthymeprogramontoon the clockand report what the live runner will do:everyeach step'sstart/end (seconds fromstart and,if you pass `finishAt` or `startAt`, ISO wall-clock times)end, totalmakespanlength, the critical path,`bindingConstraints`and
Certificate recorded, valid to 2026-11-10
Authorization not required
Changed the definition of "save_program" and "visualize_schedule"
⟨677 unchanged words⟩ :"array"},"type":{"description":"programStart: at t=0. programStartOffset: offsetSeconds after t=0. afterStep: when stepId ends (or starts, with event='start') plus offsetSeconds. afterStepWithBuffer: after stepId endsAsplusforbufferSeconds.amanual:singleusertrigger;taps\"compound\"toisstart.anonAbort:
Unknown → Live
First tool surface recorded: 18 tools (server version 1.3.0)
https://mcp.rhylthyme.com/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 21 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨6 unchanged words⟩ (Apache-2.0, about 90 KB, no dependencies)to paste into a <script> infor an HTML page or artifactwhosethatsandboxcannotblocksload external scripts;thenitcalldefines Rhylthyme.renderTimeline(container, program).
⟨24 unchanged words⟩ (.cook URL). action: search (nologinaccount needed), import (query = URL or id), random. import, random and benchling need the user's Rhylthyme account. `enrich: true` splits an import into ⟨5 unchanged words⟩
⟨26 unchanged words⟩ of the source span each step came from.Use when the user pastes the steps and no URLCappedimporterperfits.day. Needs the user's Rhylthyme account.Capped per day; you can instead author the program yourself and call validate_program.
⟨18 unchanged words⟩ For 'how long does this really take?'. Nologinaccount needed.PassTakes `program` or `program_hash`.
Open a public catalog entry by id: summary plus live-timelineURL (no visualize_schedule call needed).URL.
Return a static Gantt image of a program with a caption, for 'show me a preview' or 'a picture of the timeline'.Returns the image and a caption; theThe image ishostedservedthroughfrom a public sharelink, as visualize_schedule creates. visualize_schedule gives the live URL.link. Planned versus actual:passwith `run` (fromaload_runrun record)toitdrawdraws therealactual bars over the plan.
⟨16 unchanged words⟩ Returns ids, names, descriptions and URLs; nologin. Pass an id toaccountload_public_recipe.needed.
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"accept":{"anyOf": ⟨126 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"actors":{"description": ⟨69 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{},"type":"object"}
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"action":{"enum": ⟨84 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"deadline":{"description": ⟨86 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"token":{"description": ⟨16 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"limit":{"description": ⟨46 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program_id":{"description": ⟨26 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program_id":{"description": ⟨26 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program_id":{"description": ⟨10 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"run_id":{"description": ⟨26 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"token":{"description": ⟨21 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program":{"additionalProperties": ⟨35 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program":{"additionalProperties": ⟨55 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program":{"additionalProperties": ⟨29 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"environment":{"default": ⟨44 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"count" ⟨46 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"program":{"additionalProperties": ⟨100 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"errors" ⟨41 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","properties":{"allowInvalid":{"default": ⟨33 unchanged words⟩
{"$schema":"httphttps://json-schema.org/draft-07/schema#//json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"imageUrl" ⟨33 unchanged words⟩
⟨11 unchanged words⟩ a preview' or 'a picture of the timeline'.ImageReturns the image andcaptionaonly;caption;usethe image is hosted through a public share link, as visualize_scheduleforcreates. visualize_schedule gives the live URL. Planned versus actual: pass ⟨11 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint" ⟨5 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":true,"readOnlyHint" ⟨6 unchanged words⟩
⟨27 unchanged words⟩ has a code, a message and afix; apply the fixes and re-run untilsuggestedvalid.fix. Pure computation.
Publish a program as a live, shareable timeline (a public share link) and return itsURL.URL,ThiswithisantheASCIIdeliverableGanttforandANYan itinerary. For a scheduleyoutheproduceuser wants to follow or share ('plan this so it all finishes at 6', 'when do I start each thing'): never describe a schedule in prose.. Validates first and refuses an invalid program with fix hints.Also returns an ASCII Gantt and an itinerary to quote.
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint" ⟨6 unchanged words⟩
⟨4 unchanged words⟩ "finishAt":{"description":"ISO 8601 datetimethe whole programeverythingshouldmust END at,(e.g. '2026-11-26T18:00:00-05:00').00'. Start times arecomputedworked backwards from it.","type":"string"},"history":{"description":"Recorded runs of this program (`runs` schemathe0.1.0-alpha`run`documents,objectsasfrom load_runreturns them in `run`).Supplying them adds `predicted` per step and `predictedMakespan` / `predictedCriticalPath` to the result. Only runs that measure the executor count — completed, wall clock, speed 1 — and within them only steps a personAddsended,predictedunpaused.durations.","items":{"additionalProperties":{},"properties ⟨4 unchanged words⟩ predictionContext":{"additionalProperties":{},"description":"How to condition the prediction. Everything is optional; with none of it the lookup uses the program's own hash and the factors each run recorded.","properties":{"corrThreshold":{"description":"Minimum |PearsonOptionalr|conditioning fora factor to enterthemodel (default 0.3).","type":"number"},"environmentId":{"description":"Predict for this environment; runs recorded elsewhere are not \"identical\".","type":"string"},"minIdentical":{"description":"Identical-context runs needed before their median is used (default 3).","maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"minModel":{"description":"Measurements needed before a regression is fitted rather than a median (default 8).","maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"programVersion":{"description":"`sha256prediction:<hex>`of the exact program JSON being planned; defaults to the hash of `program`.","type":"string"}environmentId,"userId":{"description":"Preferthis person's own runs for the identical-context lookup before falling back to everyone's.","type":"string"},"userTags":{"additionalProperties":{},"description":"The(variance factorsof the run being planned, e.g. {\"turkeyKg\"turkeyKg: 7, \"oven\": \"gas\"}— the values the model is evaluated at.","properties":{},"type":"object"},"verdicts":{"additionalProperties":{}),"description":"Inferentialityverdicts per step (`rhylthyme runs report`);userId,aprogramVersion,stepminIdentical,markedminModel,executor-controlledcorrThreshold,getsverdicts.noSeeprediction.rhylthyme://guide/tools.","properties":{},"type":"object"}},"type":"object"},"program":{"additionalProperties":{},"description":"Rhylthyme program JSONProgram(anyJSON; shape— validation errors come back in the result, not as a schemaunderrejection).validate_program.","properties":{},"type":"object"},"program_id":{"description":"LibrarySaved program UUID:with `token` and no `history`,loads thecaller'suser's own recorded runsof this program are loaded and usedas the history.","type":"string"},"startAt":{"description":"ISO 8601datetime the program STARTSstartat.datetime. Ignoredwhen finishAt iswithgiven.finishAt.","type":"string"},"token":{"description":"Your Rhylthyme accessAccess token from the login tool.Only needed with `program_id`, to load your recorded runs;Omitanalysiswhenitselftheneedsaccountnoislogin.connected.","type":"string"},"useDurations":{"default":"planned","description":"Which duration set the makespan, wall-clock itinerary, critical path, conflicts and slack are computed from. \"planned\"planned (default):analysesanalyse the program asauthored; \"predicted\" analysesauthored.itpredicted: as the history says it willactuallyrun.Needs `history` (or `program_id` + `token`) to differ.","enum":["planned","predicted"], ⟨6 unchanged words⟩
⟨12 unchanged words⟩ items":{"additionalProperties":{},"properties":{"from":{"type":"string"},"kind":{"type":"string"},"to":{"type":"string"}},"required":["from","to","kind"],"type":"object"},"type":"array"},"criticalPath" ⟨3 unchanged words⟩ },"type":"array"},"durationsUsed":{"description":"\"planned\" or \"predicted\": which duration set the makespan, itinerary, critical path and conflicts above were computed from.","type":"string"},"inFlight":{"items ⟨92 unchanged words⟩
Proposenewdurations forone of the user'sa savedprogramsprogram from its recorded runs, with the evidence. For every non-fixed step with enough runs a person ended by hand:themedianbecomesas theproposeddefault,the 10th/90th percentiles the proposedP10min/max,towidenedP90soas theauthor's ownrangeis, nevernarrowed. A fixed step that consistently overruns gets a "consider variable" note and no number, becausenarroweronlythan theauthor can decide that. The result is a per-step table (n, median, IQR, current, proposedauthor's,delta) plus what acceptingwith thelot would do toevidencethepermakespanstep and thecriticaleffectpath.on**Ittotalneverlength.savesSavesanything**nothing: pass `accept` to get the calibrated programback — each changed duration carrying `calibratedFrom` — and, thensave_program if the user wants it kept. Requires a loginsave_program.token;Needs theruns are private to whoeveruser'sranRhylthymethem.account.
⟨16 unchanged words⟩ "Step ids to accept, or \"all\". The result then: alsocarriesreturns the calibratedprogram with `calibratedFrom` beside each written duration.program.NOTHINGNothingISisSAVEDsaved eitherway — pass that program to save_program if the user wants it kept.way."},"history":{"description":"Run records to use instead of theonesstoredagainst `program_id` (`runs` schema 0.1.0-alpha).ones.","items":{"additionalProperties":{},"properties ⟨5 unchanged words⟩ ":{"description":"Measurements a step needsbefore it getsfor a proposal (default 5).A step under it is reported as skipped with its statistics, not silently dropped.","maximum":9007199254740991,"minimum":1,"type":"integer"},"program":{"additionalProperties":{},"description":"The programProgram
CreateDescribe aRhylthyme environment definition with resource constraints forworkspace'saequipmentworkspacelimits (lab,onekitchenoven,bakerytwo centrifuges,etc.one stage).ReturnsasenvironmentresourceConstraintsJSON;to copyits resourceConstraintsintothea program,(orsoreferencestepsitthatbyshareenvironmentId)equipmentbeforearecallingscheduled**visualize_schedule**.around each other.
Returns the source code ofReturn the open-sourceRhylthymetimelinerendererrenderer's JavaScript (Apache-2.0, ~9KB,zerono dependencies).Usetothispastewhenintoyou'reabuilding<script> in an HTML artifactand the artifactwhose sandbox blocks externalscripts (e.g., Claude.ai's CSP only allows cdnjs.cloudflare.com). The returned text is plain JavaScript with a UMD wrapper — paste it verbatim inside a `<script>…</script>` block in your artifact,scripts; then call`Rhylthyme.renderTimeline(container, program)` where `program` is the Rhylthyme program JSON. After this call, the global `Rhylthyme` object exposes: `renderTimelineRhylthyme.renderTimeline(container, program)`, `renderTimelineSvg(program)`, `computeStepTimings(program)`, `parseSeconds(value)` and `stepDurationSeconds(step)`..
Import a recipe orlabprotocol fromanaexternalURLsourceor service into aRhylthymeprogram.Sourcessource: spoonacular(recipes,preferred),themealdb (recipes); protocolsio,fallback)opentrons,protocolsiobenchling (labprotocols),; cooklang (.cookrecipeURL— action must be 'import', query is the URL; GitHub blob URLs are auto-converted), opentrons (Opentrons Protocol API v2 .py — pass URL as query, or paste source via text; action must be 'import'), benchling (the user's connected library).Actionsaction: search (no loginneeded), importand random(need the user'squeryRhylthyme=tokenURLfromor**login**id).,Afterrandom. import,run therandomreturnedandprogrambenchlingthroughneed**visualize_schedule**.thePassaccount. `enrich: true`with action='import' to splitsplitsthean import into paralleltracks with cross-track triggers (onetracks.modelThen call,capped per day; inferred steps are marked `metadata.inferred`).visualize_schedule.
⟨10 unchanged words⟩ :"string"},"enrich":{"description":"SplitWith action='import': split the import into parallel tracks with cross-tracktriggers (action='import' only). Runs the relationship turn of the plan_schedule prompt server-side against the imported step list: steps, durations and resources are kept as imported, tracks and start triggers are inferred, and any step the model adds is marked `metadata.inferred`. Coststriggers.aOne model calland is, capped perday; if it fails you still get the un-enriched program.day.","type":"boolean"},"query":{"description":"Search keywordsKeywords (search), or the URL/or idto import(import).","type":"string"}," ⟨10 unchanged words⟩ :"string"},"text":{"description":"RawPasted sourcetext(an Opentrons .py)when the user pasted it
Turna block ofpasted text—(a recipe,a labprotocol,arunrun-of-show,sheetaor training plan—) into a validated multi-trackRhylthyme program. Use when the userprogrampasteson thesteps themselves and no structural importer fits (no URL, no supported service, a photo they transcribedserver,a PDF they copied out of). Runsin four model turnsserver-side: read-back,schema check,withstepaextractiontablewithof theexactsource span each step camefrom, then tracks andfrom.triggers.UseNeedswhen theuser's Rhylthyme token from **login**; costs a modelusercallpastespertheturnsteps andisnocappedURLperimporterday.fits.ReturnsNeeds theprogramuser'splusRhylthymeaaccount.step→spanCappedtable,persoday; you canshow the user which wordsinsteadeachauthorstepthecameprogramfromyourself andwhich steps werecallinferred.validate_program.
⟨8 unchanged words⟩ must be finished, if the user said:\"18'18:00\"00',\"dinner'dinner atsix\"six', an ISO datetime.","type":"string"},"environmentType":{"description":"Where the work happens:kitchen, lab, events, gym,or generic.Fills the scenario prompt's environment slot and becomes the program's environmentType.","type":"string"},"hints":{"description":"Equipment and people limits in the user'sownwords, e.g. 'one oven, two burners, one cook'.Used as the scenario prompt's environment and as the resource constraints to expect.","type":"string"},"text":{"description":"The source textitself: the recipe,protocol, run sheetallorofplanit, as the user wrote or pasted it.Paste all of it — turn 1 reads it back and a long source is extracted in chunks.","type":"string"},"token":{"description":"
Listyour saved Rhylthyme schedules. Requirestheauser'sloginsavedtokenprograms.fromNeeds theloginuser'stool.Rhylthyme account.
⟨3 unchanged words⟩ ,"properties":{"token":{"description":"Your Rhylthyme accessAccess token from the logintooltool. Omit when the account is connected.","type":"string"}},"required":["token"],"type":"object"}
Listtheanonymous runs other peoplehavecontributed for one exact program version:when each ran, how it ended,actual against plannedtotallength, andthe variance factors that run was recorded with. Contribution is opt-in per run and contributed records carry no user id and no step notes, so this is anonymous, aggregatetheirevidenceconditions.aboutForhow'how longadoesprogramthis reallytakes.take?'.**NoNo loginneeded.** Identify the program either by `program_hash` (`sha256:<hex>`, as `programVersion` in a run record) or by passingneeded.thePass `program`JSON, which is hashedorhere.`program_hash`.
⟨3 unchanged words⟩ ,"properties":{"limit":{"description":"How many contributed runsRuns to return, newest first (default 50). ⟨6 unchanged words⟩ program":{"additionalProperties":{},"description":"The programProgram JSON to look upinstead of a hash; it isinstead; hashedhere with the same canonical hash the runtimes record.here.","properties":{},"type":"object"},"program_hash":{"description":"Canonical programProgram hash,\"sha256'sha256:\"'plus+ 64 hexcharacters — the programVersion field of(a runrecord, orrecord'sprograms.program_hash.programVersion).","type":"string"}},"type":"object"}
Listtherecordedexecutionsruns ofonea saved program, newest first: whenit ran, how it ended,and theactualmakespanagainsttheplannedone. A run record is written whenever the live timeline is played (orlength.theForterminal'howrunnerlongisdidused);thisittakeislastwhattime?'.makesNeeds theplanned durations checkable against reality. Requires a login token; runs are private to whoeveruser'sranRhylthymethem.account.
⟨3 unchanged words⟩ ,"properties":{"program_id":{"description":"The programProgram UUID fromlist_my_programs or the program's URLlist_my_programs.","type":"string"},"token":{"description":"Your Rhylthyme accessAccess token from the logintooltool. Omit when the account is connected.","type":"string"}},"required": ⟨3 unchanged words⟩
Load aOpenspecificonesavedofprogramthebyuser'sID.savedReturnsprogramsabymarkdownid: summary plusalive-timeline URL. Needs the user's Rhylthyme account.
⟨3 unchanged words⟩ ,"properties":{"program_id":{"description":"The programProgram UUID fromlist_my_programslist_my_programs.","type":"string"},"token":{"description":"YourAccessRhylthymetokenaccessfromtokenthe login tool. Omit when the account is connected.","type":"string"}},"required":["token","program_id"],"type":"object"}
LoadOpen asinglepublicrecipe / protocol / workout / eventcatalogtemplateentry byid. Returns a markdownid: summary plusalive-timeline URL (no visualize_schedule call needed).
Open one recordedexecution byrunid: plannedversusagainst actualstart, end and duration fortimingeveryper step, what ended each step(a person,a timer, an abort), time the clock was paused, and the recorded variance factors. Use it topauses.seeShows where a plandrifts fromdrifts.reality.NeedsRequirestheauser'sloginRhylthymetoken.account.
⟨3 unchanged words⟩ ,"properties":{"run_id":{"description":"The runRun UUID fromlist_runslist_runs.","type":"string"},"token":{"description":"Your Rhylthyme accessAccess token from the logintooltool. Omit when the account is connected.","type":"string"}},"required": ⟨3 unchanged words⟩
Sign in to your Rhylthyme account so you can list andForsaveappsyourthatschedulescannotandconnectimportthefromRhylthymeexternalaccountsources.directly:Opensreturns abrowser page where you log in (Google,sign-inAppleURL,or email). After signing in,thencopyaccepts thetokenpasteddisplayedtoken.onOnly thepageuser'sandownprovidesaveditprograms,here.runsTokensandexpireimportsafterneedaboutit;aneverythinghour;publicifworksawithout.laterTokenscalllastreportsabout anauth error, call login again for a fresh one.hour.
⟨3 unchanged words⟩ ,"properties":{"token":{"description":"Paste the accessThe tokenshown onfrom the loginpage after you sign in.page. Leave empty on the first call to get theloginsign-in URL.","type":"string"}},"type":"object"}
Render a Rhylthyme program asReturn a staticGantt-chartGantt imageso the user can SEE what the live timeline looks like, without committing to opening the live URL. Use this when the user asks for a 'preview' or 'picture'ofthe timeline, or when you have just builtafreehandprogramand want to give the user a visual before they commit. The tool returns ONLY an image plus a one-line caption — no recipe prose,no ingredient list,forno'showcopyrightmeconcerns.aJustpreview'theorstructural'avisualizationpicture ofwhich step runs when on which track. Pair with **visualize_schedule** whentheuser wants the full shareabletimeline'.interactiveImageURLandtoo.captionThisonly;tooluseisvisualize_schedule for thevisual-only quicklivepreviewURL.case. **PlannedPlanned versusactual.** Pass `run` — a recorded run of the same program, as **load_run** returns it in `run` — and the picture becomes a comparisonactual:each step's real bar over a thin ghost bar at its planned position, outlined green where it finished early and amber where it ran late. That is the fastest way to show a person where a plan drifted. **Rendering option for HTML-artifact-capablepassclients`run` (Claude.ai etc.):** Claude.ai's artifact sandbox blocks external scriptsfromnon-cdnjs sources, so a `<script src="https://kitchen.rhylthyme.com/...">` tag will fail. To render the timeline yourself with the official Rhylthyme look, call **get_renderer_source** firstload_run) tofetchdraw therenderer's full source as a string, then embed that source verbatim inside a `<script>…</script>` block in your HTML artifact, followed by your program JSON and a call to `Rhylthyme.renderTimeline(document.getElementById('t'), program)`. The renderer isrealopen-sourcebars(Apache-2.0),overzero-dependency,the~9KB.plan.
⟨4 unchanged words⟩ program":{"additionalProperties":{},"description":"Rhylthyme program JSONProgram(sameJSON; shapevisualize_scheduleunderaccepts).validate_program.","properties":{},"type":"object"},"run":{"additionalProperties":{},"description":"OptionalA recorded run of theSAMEsame program (`runs` schema 0.1.0-alpha —the `run` object from load_run). Draws planned-vs-actual:the actual bars over ghost bars at thedraws plannedpositions, coloured by the sign of each step's endversusdeviation.actual.","properties":{},"type":"object" ⟨4 unchanged words⟩
Save aRhylthymeprogram toyourtheaccount.user'sIfaccounta('saveprogramthiswithfor later'); the same programIdalready exists, it willupdatesbeit.updated.NeedsRequirestheauser'sloginRhylthymetoken.account.
⟨4 unchanged words⟩ program":{"additionalProperties":{},"description":"Rhylthyme program JSON. Read rhylthyme://guide/authoring for the rules.","properties":{"actors":{"description":"How many people are available to work steps concurrently.","maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"description":{"type":"string"},"environment":{"description":"Optional environmentId whose resourceConstraints apply.","type":"string"},"environmentType":{"description":"kitchen | laboratory | event | gym | bakery | manufacturing | general …","type":"string"},"metadata":{"additionalProperties":{},"properties":{"attribution":{"type":"string"},"ingredients":{"items":{"additionalProperties":{},"properties":{"measure":{"type":"string"},"name":{"type":"string"}},"required":["name"],"type":"object"},"type":"array"},"serves":{"anyOf":[{"type":"string"},{"type":"number"}]},"sourceUrl":{"type":"string"},"thumbnail":{"type":"string"}},"type":"object"},"name":{"description":"Human-readable name","type":"string"},"programId":{"description":"Kebab-case identifier","type":"string"},"resourceConstraints":{"items":{"additionalProperties":{},"properties":{"description":{"type":"string"},"maxConcurrent":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"task":{"type":"string"}},"required":["task","maxConcurrent"],"type":"object"},"type":"array"},"schemaVersion":{"default":"0.1.0","type":"string"},"tracks":{"items":{"additionalProperties":{},"properties":{"description":{"type":"string"},"name":{"type":"string"},"replicates":{"additionalProperties":{},"properties":{"count":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"delay":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"mode":{"enum":["parallel","stagger","serial"],"type":"string"}},"required":["count"],"type":"object"},"steps":{"items":{"additionalProperties":{},"properties":{"canAbort":{"type":"boolean"},"choice":{"additionalProperties":{},"description":"Branch point: downstream steps with a matching choiceId only run for that option.","properties":{"options":{"items":{"additionalProperties":{},"properties":{"choiceId":{"type":"string"},"label":{"type":"string"}},"required":["choiceId"],"type":"object"},"minItems":2,"type":"array"},"prompt":{"type":"string"}},"required":["options"],"type":"object"},"description":{"type":"string"},"duration":{"additionalProperties":{},"properties":{"defaultSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"maxSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"minSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"seconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"triggerName":{"type":"string"},"type":{"description":"fixed: exact seconds. variable: min/max with a default, user can end early. indefinite: runs until the user ends it
Search the publicRhylthymecatalog ofcookablerecipes, lab protocols, event templates,andworkouts. Returns up to 50 matching programsworkouts(id,by name,description, view URL) — no sign-in required. The catalog is split by environment:orpasskeyword.environment='kitchen'Returns(default)ids,'laboratory'names,'event' or 'gym'descriptionstoandpickURLs;thenocollection.login. Pass an id to**load_public_recipe** for the full schedule (its result already includes the live URL).load_public_recipe.
⟨5 unchanged words⟩ "default":"kitchen","description":"Which catalogto search. Defaults to:\"kitchen\";kitchenuse(default),\"laboratory\"laboratory,\"event\"event or\"gym\" for the other collections.gym.","enum":["kitchen","laboratory"," ⟨14 unchanged words⟩ query":{"default":"","description":"Keyword to searchKeyword;(matches name anddescription).description. Empty returns themost recentnewest entries.","type":"string"}},"type":"object"}
Check aRhylthymeprogramfor structural and scheduling errors BEFOREbeforevisualizingpublishing or saving it:missing/duplicateids, danglingafterStep references,ordependencycycliccyclestriggers, stepsthat overlapoverlappingwithinin a track, tasks with no resourceConstraint,unparseabledurations,invalid choice references, and schema 0.3.0-alpha `instances`/`replicates` misuse (E_INSTANCES_ON_SINGLE, E_EACH_WITH_REPLICATES, E_EACH_COUNT_MISMATCH, E_INFLIGHT_GT_COUNT,replicates/instancesE_INFLIGHT_NO_CHAIN).misuse. Every finding has a`code`code, a`message`message and a`fix` hint —fix; apply the fixes and re-run until`valid` is true. Warnings (e.g. tracks that finish far apart, W_UNBARRIERED_CHAIN) are advisory; `info` notes (I_IMPLICIT_BARRIER: a replicated step referenced without `instances`) suggest making a barrier explicit.valid. Purecomputation: no network, no side effects, safe to call repeatedly.computation.
⟨4 unchanged words⟩ program":{"additionalProperties":{},"description":"Rhylthyme programProgram JSON: {programId, name, environmentType?, actors?, tracks: [{trackId, name, steps: [{stepId (anyuniqueshapeprogram-wide),—name,validationtask?,errorsduration,comestartTrigger,backreplicates?,inchoice?}]}],theresourceConstraints:result[{task,notmaxConcurrent}],as
⟨7 unchanged words⟩ items":{"additionalProperties":{},"properties":{"code":{"type":"string"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"},"where":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["code","message","where","fix"],"type":"object"},"type":"array"},"info":{"items":{"additionalProperties":{},"properties":{"code":{"type":"string"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"},"where":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["code","message","where","fix"],"type":"object"},"type":"array"},"stats" ⟨11 unchanged words⟩ items":{"additionalProperties":{},"properties":{"code":{"type":"string"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"},"where":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["code","message","where","fix"],"type":"object"},"type":"array ⟨7 unchanged words⟩
RenderPublish amulti-step parallel scheduleprogram as a live timeline(cooking,andlabreturnprotocols,itseventURL.run-of-show,Thistraining).is**Callthethisdeliverable for ANY schedule you produce—('planimported,thiscatalogsomatch,itorallbuiltfinishesfreehand.**atA6',schedule'whenbelongsdoinIastartvisualization,each thing'): neverindescribeprose.aThescheduleprograminisprose.validatedValidates first(same checksandasrefusesvalidate_program);an invalidprograms are refusedprogram with fixhints instead of being published. Returns a markdown preview (cover photo if any, equipmenthints.list,Alsoingredientreturnslist,an ASCII Gantttimeline, chronological itinerary, schedule check)anda shareable rhylthyme.com URL withantheitineraryinteractivetoview.quote.
⟨5 unchanged words⟩ ":{"default":false,"description":"Publisheven ifdespite validationreportserrors. Onlyusewhen the user explicitly wants an imperfect draftshared; the live page may show wrong timings.shared.","type":"boolean"},"program":{"additionalProperties":{},"description":"Rhylthyme program JSON. Read rhylthyme://guide/authoring for the rules.","properties":{"actors":{"description":"How many people are available to work steps concurrently.","maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"description":{"type":"string"},"environment":{"description":"Optional environmentId whose resourceConstraints apply.","type":"string"},"environmentType":{"description":"kitchen | laboratory | event | gym | bakery | manufacturing | general …","type":"string"},"metadata":{"additionalProperties":{},"properties":{"attribution":{"type":"string"},"ingredients":{"items":{"additionalProperties":{},"properties":{"measure":{"type":"string"},"name":{"type":"string"}},"required":["name"],"type":"object"},"type":"array"},"serves":{"anyOf":[{"type":"string"},{"type":"number"}]},"sourceUrl":{"type":"string"},"thumbnail":{"type":"string"}},"type":"object"},"name":{"description":"Human-readable name","type":"string"},"programId":{"description":"Kebab-case identifier","type":"string"},"resourceConstraints":{"items":{"additionalProperties":{},"properties":{"description":{"type":"string"},"maxConcurrent":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"task":{"type":"string"}},"required":["task","maxConcurrent"],"type":"object"},"type":"array"},"schemaVersion":{"default":"0.1.0","type":"string"},"tracks":{"items":{"additionalProperties":{},"properties":{"description":{"type":"string"},"name":{"type":"string"},"replicates":{"additionalProperties":{},"properties":{"count":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"delay":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"mode":{"enum":["parallel","stagger","serial"],"type":"string"}},"required":["count"],"type":"object"},"steps":{"items":{"additionalProperties":{},"properties":{"canAbort":{"type":"boolean"},"choice":{"additionalProperties":{},"description":"Branch point: downstream steps with a matching choiceId only run for that option.","properties":{"options":{"items":{"additionalProperties":{},"properties":{"choiceId":{"type":"string"},"label":{"type":"string"}},"required":["choiceId"],"type":"object"},"minItems":2,"type":"array"},"prompt":{"type":"string"}},"required":["options"],"type":"object"},"description":{"type":"string"},"duration":{"additionalProperties":{},"properties":{"defaultSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"maxSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"minSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"seconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"triggerName":{"type":"string"},"type":{"description":"fixed: exact seconds. variable: min/max with a default, user can end early. indefinite: runs until the user ends it (give defaultSeconds for planning).","enum":["fixed","variable","indefinite"],"type":"string"}},"required":["type"],"type":"object"},"name":{"type":"string"},"replicates":{"additionalProperties":{},"properties":{"count":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"delay":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Seconds as a number, or a time string like \"5m\", \"1h30m\", \"90s\"."},"mode":{"enum":["parallel","stagger","serial"],"type":"string"}},"required":["count"],"type":"object"},"startTrigger":{"additionalProperties":{},"properties":{"bufferSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"afterStepWithBuffer: gap after the referenced step ends."},"choiceId":{"description":"Only run this step if the user picked this option on the referenced step's choice.","type":"string"},"event":{"description":"afterStep anchor: the referenced step's end (default) or start.","enum":["start","end"],"type":"string"},"logic":{"description":"Compound trigger: wait for all / any of `triggers`.","enum":["all","any"],"type":"string"},"offsetSeconds":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Delay after the anchor. Negative values ('start 20m before X ends') require the referenced step to be indefinite."},"stepId":{"description":"Referenced step (afterStep
⟨25 unchanged words⟩ items":{"additionalProperties":{},"properties":{"code":{"type":"string"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"},"where":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["code","message","where","fix"],"type":"object"},"type":"array ⟨8 unchanged words⟩
⟨707 unchanged words⟩ :"array"},"type":{"description":"programStart: at t=0. programStartOffset: offsetSeconds after t=0. afterStep: when stepId ends (or starts, with event='start') plus offsetSeconds. afterStepWithBuffer: after stepId endsAsplusforbufferSeconds.amanual:singleusertrigger;taps\"compound\"toisstart.anonAbort:optionalonlylabelifforstepIdaislogic/triggersaborted.trigger.","enum":["programStart","programStartOffset","afterStep","afterStepWithBuffer","manual","onAbort","compound"],"type":"string"}},"type" ⟨61 unchanged words⟩