riversidefm/riverside
Riverside podcast and recording platform. Browse recordings, search transcripts, manage content, and publish clips to YouTube, TikTok, and Instagram.
Changelog
All notable changes to the Riverside plugin are documented in this file.
Release process
The plugin declares an explicit "version" in .claude-plugin/plugin.json.
Because the version is explicit rather than derived from git metadata,
installed users only pick up a new release when that field is bumped —
the Claude plugin directory and Cursor marketplace treat an unchanged
version as "nothing new to install," even if the underlying skills, docs, or
MCP wiring changed underneath it.
Practical consequence: bump version on every release, including
docs-only or packaging-only changes, following semver:
- patch (
0.2.0→0.2.1) — typo/doc fixes, no behavior change - minor (
0.2.0→0.3.0) — new skills, new sections of functionality, backwards-compatible tool/skill changes - major (
0.x.y→1.0.0) — breaking changes to skill names, required inputs, or the plugin's public shape
Also keep .cursor-plugin/plugin.json's "version" in sync with the Claude
manifest — the two packages ship from the same repo and are expected to move
together.
[0.6.4] - 2026-08-16
Makes every skill description readable by naive frontmatter parsers.
- All four descriptions were YAML folded block scalars (
description: >). A parser that reads the value off thedescription:line — rather than gathering the indented lines beneath it — sees the literal>and nothing else. cursor.directory's repository auto-detect does exactly that, so all four skills arrived at its submission form with>as their description and had to be filled in by hand. This repo already knew the hazard:validate_cursor_package.pycarries a comment explaining that a block scalar "carries its value in the indented lines" because it had to special-case it. - They are now single-line plain scalars. Verified against a YAML parser:
each parsed value is identical to what it was before, except that the block
scalar's trailing newline is gone — an artifact of the format, not content.
No wording changed. Plain (unquoted) form is deliberate: a naive
split(":", 1)recovers the exact text with no quote artifacts to strip. Checked that none of the four contains a": "or" #"sequence, or a leading YAML indicator character, so all four are valid plain scalars. - Costs four long lines in the source files, which is the trade for the descriptions surviving every parser that reads them.
[0.6.3] - 2026-08-13
Corrects the repository URL advertised by every vendor manifest.
- All four manifests pointed at
riversidefm/riverside-mcp, which is private. Any external reader — including a directory reviewer following the link from a listing — resolved it to a 404. They now point atriversidefm/riverside-mcp-public, the published entry point that actually serves this bundle. - No skill, tool, or MCP wiring changes; packaging metadata only.
[0.6.2] - 2026-08-13
Refactors the bundled skills for structural progressive disclosure while preserving current live-authority and safety behavior.
- Smaller always-loaded entrypoints. The content-discovery, social-publishing, and video-editing entrypoints retain their routing and safety contracts while moving workflow-specific detail out of the always-loaded surface. Setup remains self-contained.
- Ten conditionally routed, one-hop references. Content discovery routes to three references, social publishing to two, and video editing to five.
- Deterministic selective loading. Before the first workflow call and after each response, the operational skills evaluate every routing condition, load every matching reference, and avoid unrelated references. Edit creation now has one owner: discovery resolves identifiers and video editing performs the mutation from the live creation schema.
- Context budgets are regression-tested. Every ordinary one-reference route, setup, and the compound social scheduling-and-recovery route load fewer instruction bytes than their 0.6.1 monolithic entrypoint.
- Live authority and safety gates remain in control. Current MCP schemas and guide tools remain authoritative, while ambiguity handling, revision threading, mutation readiness, unchanged returned payloads, and final publishing confirmation remain enforced. Keep/reorder and cross-source assembly requests no longer route to a write that production has delisted.
- Batch tool name corrected to
editing_batch. The skills instructed callers to useediting_editing_batchand stated thatediting_batchwas not callable. editing-mcp-v2 ENG-640 registers the tool asbatch, so the gateway'sediting_namespace servesediting_batchand the doubled-prefix name resolves to nothing. Every batch call, and everyediting_validate_edit_planpreflight that feeds one, previously failed with tool-not-found. The reviewed live-surface snapshot and its validator allowlist were corrected to match. - An unavailable operation is no longer a dead end. Keep/reorder and cross-source assembly previously refused outright and forbade "clone, batch, or cuts" — but the live guide names exactly those as its supported fallbacks for the same unavailability, so the skills contradicted the source they had just declared authoritative. They now fail closed on the direct operation and offer only a fallback the live response or the guide actually names, described as what it does rather than as an equivalent. Inventing a substitute, guessing a stale tool name, and inverting a keep selection into cuts all remain barred.
- The guide is fetched by section.
editing_get_editing_guidetakessectionandcategory, and its default section is larger than the whole video-editing skill. The entrypoint now tells callers to read the current section names off the schema and request the narrowest one that covers the task, which is worth more context than this refactor's own restructuring. - One phrasing of the live-authority rule. All ten references opened with the same "live schemas decide, the main skill file's rules still apply" point written ten different ways; they now share one. Measured saving is small (179 bytes); the intent is that one rule reads the same everywhere.
- The compound-route trade is now tested, not assumed. A request matching three or more video-editing routing rows loads more than the 0.6.1 monolith did. That is the accepted cost of progressive disclosure — one- and two-reference routes, which dominate, each save 7-11 KB — and a new test pins the crossover so it cannot drift without review.
- No runtime performance claim. This release establishes structural progressive disclosure; it does not claim measured runtime token or latency savings. The compound-route figures above are byte counts, not measurements.
[0.6.1] - 2026-08-12
Pre-submission corrections ahead of the Claude and ChatGPT directory listings. Documentation, packaging metadata, and CI only — no skill guidance about tools changed, and no tool name moved.
- Removed
.app.json. A ChatGPT app id is workspace-scoped: committing one binds the package to a single workspace, and the value is world-readable in a public repository. The directory path does not consume it either — a Skills-only upload removes it, and an MCP-backed submission uses "With MCP" and submits the MCP server directly.validate_openai_package.pynow asserts its absence, in both halves: noappsfield in the manifest and no.app.jsonin the tree. The app-id and placeholder checks went with the file, including the--allow-placeholderflag. shortDescriptionshortened to 28 characters ("Search, edit & publish video"). It is the listing subtitle, and OpenAI's submission step rejects one over 30 — a failure that surfaces only at submission time, long after CI is green. The validator now asserts caps onshortDescription,displayName,longDescription, anddeveloperNameso it cannot regress.- Added
interface.supportURL, pointing at the public "Connect to Riverside MCP" help article. Both directories ask for a reachable support destination and OpenAI requires an HTTPS one, which an email address does not satisfy. The validator now requires the field and checks that the URL fields arehttps://. - The
setupskill documents the ChatGPT/Codex lane. It previously described only the Claude Code and Cursor first-tool-call flow. It now covers the current custom connection steps and the future directory path. In either case the plugin supplies skills while the separately managed Riverside connection supplies tools, so the two fail independently. Removing the plugin does not disconnect Riverside. Troubleshooting now names the right control point for each host rather than only Claude Code's/mcpand Cursor's settings panel. - Corrected the session lifetime in the README from 12 hours to 7 days, and recorded that there is no silent token refresh — re-consent is required through the browser when a connection expires and cannot happen silently.
- Fixed the authentication wording. The README described
https://riverside.com/authas "the consent screen"; that URL is the OAuth issuer identifier and returns 404 to a browser. It is now named as the issuer, with the real flow described: the client discovers it and opens Riverside's hosted sign-in, and the grant prompt belongs to the host client rather than to Riverside, which has no consent UI of its own. - Replaced the support instruction with a link. The README pointed readers at the homepage to go hunting for Help / Support; it now links the Riverside Help Center and the per-client connection article directly.
- Stated the plan requirement without under-claiming. "Grow or above" is
narrower than the live entitlement and told eligible customers on other paid
plans that they were excluded. The README, the
setupskill, and the OpenAIlongDescriptionnow say a qualifying paid plan is required and that Free and Pro accounts cannot use the MCP, and thesetupskill points at the informational pricing page rather than instructing the reader to upgrade. - Trimmed internal engineering detail out of the shipped bundle.
expected-tools.txt's header keeps what it is, why it is a snapshot, how to refresh it, and the capture date and counts, and drops the incident narrative, infrastructure commands, and internal repository references. The docstrings invalidate_tool_names.py,validate_release.py, andvalidate_mcp_config.py, and a comment in the CI workflow, now state the defect class each gate closes without the dated incident reports. The 61 tool names are byte-for-byte unchanged.
Tool names are unchanged. expected-tools.txt still lists the same 61 tools
across 5 namespaces captured on 2026-08-09.
[0.6.0] - 2026-08-11
Adds the OpenAI (ChatGPT / Codex) packaging lane. No skill text changes — the same four skills are now installable on a third host family.
- New OpenAI package.
.codex-plugin/plugin.jsondeclares the plugin for ChatGPT and Codex,.app.jsoncarries the app binding, andagents/openai.yamlsupplies plugin-level display metadata.content-discovery,video-editing, andsocial-publishingeach declare the Riverside MCP as atransport: streamable_httpdependency so ChatGPT makes the server available to them.setupdeliberately declares no dependency: it troubleshoots the very connection that would otherwise be its prerequisite. mcpServersis declared inline rather than as a path. This repo's.mcp.jsonis the Claude plugin shape — a bare{"<server>": {...}}map — while every plugin in OpenAI's registry wraps.mcp.jsonin a top-levelmcpServerskey. Pointing OpenAI at the unwrapped file would hand it a shape no registry plugin uses, so.codex-plugin/plugin.jsoninlines the server andvalidate_openai_package.pyasserts that copy agrees with.mcp.jsonandmcp.jsonon both server name and URL.- New gate:
scripts/validate_openai_package.py. Checks manifest and interface shape,defaultPromptlimits, asset existence, path containment, the MCP wrapper trap above, and the per-skill dependency declarations. It does not validate the app id against a prefix allowlist — OpenAI issues more than one prefix — but it does reject an unresolved placeholder id, and it rejects an id that keeps theplugin_URL route segment, which the browser shows after registration but which no stored id carries. - The release gate now covers the new files.
.codex-plugin/plugin.jsonjoined the version-parity set, and.app.json,.codex-plugin/plugin.json, andagents/count as shipped, so a change to any of them requires a version bump like every other shipped file.
The app id in .app.json is a ChatGPT Developer Mode registration. It is package
metadata rather than a credential — OpenAI's own plugin registry publishes these
ids — but it is account-scoped, so a different workspace needs its own id.
[0.5.1] - 2026-08-10
Closes a coverage hole in the tool-name gate added in 0.5.0. No shipped skill text changes — this is a fix to what CI is able to see.
- The tool-name gate now validates bare namespace globs. It claimed to check
prefix globs, but only ever looked at the two characters following a matched
token, and a token had to end in an alphanumeric.
editing_remove_*was therefore checked (tokenediting_remove, trailing_*) while a bareediting_*matched no token at all and was skipped silently — so a whole namespace could go unverified. - A dedicated glob parser now recognises any identifier ending in
_*, validates its prefix againstexpected-tools.txt, and records its span so the plain-token scan cannot report the same glob twice. Requiring that trailing underscore is also what keeps markdown emphasis (*editing_batch*) out of the glob parser. - Added
NOT_A_TOOL_GLOBS, a reason-bearing allowlist for glob-shaped prose that names no callable namespace. It has one entry:list_*incontent-discovery, describing the shared pagination envelope. Real namespaces are not allowlistable — verifying them is the point of the gate. - Failures name the file, the line, and the live namespace the stale one most
likely came from (
platform-mcp-mcp_*→ "Did you meanplatform_*?").
expected-tools.txt is untouched: still the 61 tools across 5 namespaces
captured on 2026-08-09. A snapshot refresh stays a separate reviewed change.
[0.5.0] - 2026-08-09
Agent Plugins v1.0 conformance, and CI that can actually fail.
- Added the Agent Plugins manifest at the repo root (
plugin.json). It is the specification's one hard MUST (§4.1.2): without it a conforming client rejects the plugin and runs none of its components. Note it deliberately carries nodisplayName,logo,skills, ormcpServers— the AP schema is closed, and those fields belong to.cursor-plugin/plugin.json. - Made root
mcp.jsonconform: added$schemaand the requiredtype: "streamable-http"discriminator. The URL is unchanged. - Kept the existing package layout:
.claude-plugin/,.cursor-plugin/,.mcp.json, andskills/retain their established paths. The vendor manifest versions andcontent-discoveryguidance change as described in this release; the locations do not. Claude Code and Cursor read those exact paths, and renaming them to reverse-domain form would break both clients to satisfy a spec that does not ask for it. - Added four CI gates covering what green CI did not: every tool name in
skills/**andREADME.mdmust exist on the live surface (expected-tools.txt);.mcp.jsonmust be valid and agree withmcp.json; the Agent Plugins files must validate against the official schemas; and a change to any shipped file must come with a version bump and a changelog entry. - Fixed an unprefixed tool reference in
content-discovery— the new tool-name gate found it on its first run.
[0.4.0] - 2026-08-09
Corrects the documented plan requirement and moves the package's web links to the canonical domain.
- Corrected the required plan from Pro to Grow in the
setupskill (requirement and troubleshooting row). The README carried this correction already; it shipped without a version bump, so it is recorded here. - Moved the package's web URLs to the canonical
riverside.comdomain: the privacy-policy link, both manifests'homepage, the author URL, and the links in thesetupskill. Contact addresses remain onriverside.fm. - Added the terms and conditions link to the README alongside the privacy
policy. Both directory submissions ask for one, and the canonical path is
/terms-conditions—/termsand five other obvious spellings 404. - Made the README's Authentication section client-neutral rather than Claude-specific.
- Dropped the withdrawn "deprecated search alias" guidance from
content-discovery; those aliases were removed from the gateway on 2026-07-30 and no alias is served today. - Corrected
platform_get_transcriptguidance to describe sentence-level timestamps, the word-level timing handoff, and the per-speaker no-offset caveat. - Removed an internal task assignment from
docs/cursor-testing.md.
Tool names are unchanged from 0.3.0. The 13 hierarchy tools keep their
platform_* names. The gateway's platform target was deployed and verified
on 2026-08-09 before this release.
[0.3.0] - 2026-07-29
Re-aligned every skill with the live tool surface, tool by tool.
- Documented the two search tools (
search_recording_transcripts_exactandsearch_riverside) incontent-discovery, and replaced the old transcript-by-transcript discovery strategy with a search-first one. The skill had previously stated that no search tool existed on this surface. - Corrected the batch tool's name to
editing_editing_batchthroughoutvideo-editing; the name the skill used did not resolve at the gateway. - Added a "Time axes" section to
video-editingcovering which tools take source time and which take playable time, and how to convert between{n,d}fractions and milliseconds. - Documented
editing_get_asset_metadataandediting_list_edit_recording_asset_sessions, the two editing tools that had no coverage. - Fixed required and missing parameters:
editing_insert_overlay'sdurationMs,editing_insert_audio'sdB/multiplier(there is novolumeparameter),editing_resolve_transcript_selection's requiredintentplus itsreadyToApply/payloadcontract,editing_create_edit_from_segments's fraction times and requiredtype, andediting_set_visual_crop's target/crop shape. - Corrected tool behavior throughout
video-editing, includingediting_remove_fillers' transcript-based classification and duration-basedSmartmode, the third field returned byediting_get_captions_presets,editing_apply_brand's applied/skipped result,editing_reorder_timeline's content duplication on overlapping ranges, andediting_restore_audio_cleanupalso requiring a transcript. content-discovery: filter soft-deleted edits, preferplatform_get_projectas a single fan-out, keep unscoped requests unscoped, documentplatform_get_recording's opt-inincludePreviewUrl, and stop presenting areadyexport as proof that a clip can publish.social-publishing: never inferyoutubeData.privacyStatus, X character weighting, thecomposeSettingsfield names andqualityvalues, and that publish-readiness cannot be checked in advance.- README: documented the search capability under "What You Can Do", and added Cursor to the title, the intro, and the requirements list.
[0.2.0] - 2026-07-19
This release adds Claude plugin-directory metadata, Cursor marketplace packaging, validation CI, and release documentation.
- Rewrote all skills for the current gateway tool surface (
platform_*,editing_*,social_*prefixes), replacing the alpha's skills which referenced outdated tool names. - Added two new skills:
video-editingandsetup(previously onlycontent-discoveryandsocial-publishingexisted). - Added Cursor marketplace packaging (
.cursor-plugin/plugin.json, rootmcp.json) alongside the existing Claude plugin packaging. - Added packaging compliance for the Claude plugin directory:
LICENSE, this changelog, a plugin logo,displayName/keywordsmetadata, and README sections required for review (Authentication, Support & Security, Privacy). - Added a validation CI workflow that runs
claude plugin validate --strictfor the Claude manifest and a lightweight custom check (scripts/validate_cursor_package.py) for the Cursor package (version parity, path containment, skill frontmatter), on every PR and push tomain.
The plugin logo (assets/logo.png) is Riverside's public site icon.
[0.1.0] - 2026-04
Initial alpha release of the Riverside plugin.
- Initial plugin scaffold wrapping the Riverside remote MCP server
(
https://mcp.riverside.com/mcp). - Two skills:
content-discoveryandsocial-publishing.