Skip to content

docs: combined overhaul — brand, MCP, content cleanup, onboarding, skills, nav (PRs #168, #170-174)#189

Open
sidneyswift wants to merge 49 commits intomainfrom
docs/full-overhaul
Open

docs: combined overhaul — brand, MCP, content cleanup, onboarding, skills, nav (PRs #168, #170-174)#189
sidneyswift wants to merge 49 commits intomainfrom
docs/full-overhaul

Conversation

@sidneyswift
Copy link
Copy Markdown
Contributor

@sidneyswift sidneyswift commented May 5, 2026

Summary

Combines the six related April 27 docs PRs into a single coordinated landing, with several rounds of cleanup and customer-driven fixes layered on top:

  • 6 source PRs (docs: brand and theme refresh #168, docs: MCP tool catalog rewrite #170-174) — brand refresh, MCP rewrite, content cleanup, onboarding overhaul, Skills system, nav restructure
  • Main-alignment fixes — every endpoint addition/removal main shipped while these PRs sat (docs(docs): migrate GET /api/accounts/{id}/catalogs #153docs(ai/models): document context_window + cost fields #188)
  • Skills tab overhaul — collapsed to 2 groups, added recoup-api, dropped chart-metric, documented the npx skills install path
  • New Plugins tab with music-catalog-diligence — Cowork install path verified end-to-end
  • New Credits reference page — what's billed, how to check balance, subscription model
  • Homepage positioning broadened beyond "record labels" to the full music business
  • Customer-feedback fixes from sweetman's agent review — dangling endpoint references, a non-existent /api/comments endpoint live on prod, base URL standardization

Source PR consolidation

# Branch Scope
#168 feat/docs-brand Brand & theme refresh — sequoia theme, achromatic colors, theme-aware favicon, Geist Pixel + Geist fonts
#170 feat/docs-mcp MCP tool catalog rewrite
#171 feat/docs-content-cleanup OpenAPI hygiene + page title disambiguation + Content Agent slimming
#172 feat/docs-onboarding Agent-first onboarding overhaul
#173 feat/docs-skills New Skills system + 10 skill playbooks
#174 feat/docs-nav Navigation restructure (9-tab agent-task layout)

Skills tab

Collapsed to two groups (down from 5 — two were singletons that read as visual bugs):

  • Setup: recoup-api, getting-started, setup-sandbox, artist-workspace, create-artist
  • Playbooks: music-industry-research, song-writing, content-creation, release-management, streaming-growth, trend-to-song

Every skill page now has a per-skill npx skills add recoupable/skills --skill <name> install command. The Skills landing leads with the universal CLI install path (works with Claude Code, Codex, OpenCode, Cursor, 50+ agents) — strictly better than the Claude-Code-only /plugin marketplace add we previously led with.

create-artist is new in this PR — converted from workflows/create-artist.mdx (deleted) into a proper skill. The "Workflows" concept is retired in this PR; if we add more guided procedures, they live as skills (matches the structure shipped earlier in this PR).

chart-metric removed entirely — both nav entry and MDX file deleted.

Plugins tab (new)

New top-level tab placed right after Skills:

  • /plugins — landing covering what plugins are vs skills, install paths for Claude Code, Cowork, Codex, and Cursor
  • /plugins/music-catalog-diligence — comprehensive page with deal workspace structure, 9 skills, 6 commands, QC philosophy

Cowork install path verified end-to-end by pasting https://github.com/recoupable/plugins into Customize → Plugins → + → Create plugin → Add marketplace → Sync.

Required a parallel fix on recoupable/plugins (already pushed) to switch the marketplace.json source from a relative submodule path to a github source object — the relative path failed because Cowork doesn't recurse submodules during sync. Same fix applied to the Codex marketplace file with its url-source schema.

Credits reference page (new)

/credits placed in Overview > Start here group right after Authentication. Covers:

  • What's billed (4-row category table — research, content generation, streaming chat, and "everything else" free at the API layer)
  • Check your balance (GET /api/credits/get curl + response shape)
  • Subscription tiers (Free / Pro), upgrade flow, 30-day trial, and GET /api/subscription/status for tier check
  • "One-time top-ups: Coming soon" callout
  • FAQ on scheduled tasks billing

Specific per-endpoint credit numbers intentionally not asserted — the page directs readers to /api/credits/get as the source of truth for both balance and per-call cost. Robust to the engineering inconsistencies we discovered (signup credit value disagrees between API code and chat code; new content endpoints aren't yet wired into the deduction system). Full research findings in .local/plans/credit-check.md in the mono repo (not part of this PR).

Customer feedback fixes

Addresses 3 of 4 friction points raised in the customer review last night:

Customer's issue Status Commits
URLs returning null (fans / social posts / Instagram / comments) Fixed dde5524, f896bc7, 318a555
OpenAPI YAML verbose, no JSON examples Punted to follow-up
Credits inconsistent, no reference table Fixed 237b621908dd1d17bf22a
Only one workflow guide Fixed structurally (Skills tab IS the workflow library) 56902ba

f896bc7 removed the non-existent GET /api/comments endpoint that's currently live on production docs. Verified across five independent tests:

  • Control: known-fake endpoint returns identical 404 (rules out auth-then-404 pattern)
  • Comparison: real protected endpoints return 401, not 404
  • OpenAPI param check: tested with the spec's required artist_account_id param
  • Source grep: zero route.ts files in api/app/api/ mention "comments"
  • Multi-domain: 404 on both api.recoupable.com and recoup-api.vercel.app

The OpenAPI spec has been advertising a 74-line endpoint definition for a route that was never built (or has been removed). Plausibly one of the "URLs returned null" friction points the customer's agent reported.

dde5524 cleaned up the social.json description text on /api/apify/runs/{runId} that referenced the deleted Instagram Comments and Instagram Profiles endpoints by name — agents derived those URLs from the description and got 404s.

Homepage positioning broadened

description: "Infrastructure for agents to run record labels"description: "Infrastructure for agents to operate the music business".

Lead paragraph now names the 5 audience types (indie artist, label, distributor, catalog company, management firm) and adds the workflows layer ("not just the context — your catalog, artists, releases, fans — but the domain expertise and workflows that operate it day-to-day, built by people who've done it").

Core concepts table moved off the homepage to /authentication — the natural home since the page already references account_id/organization_id/artist_account_id under Access Control. The Organization definition was also broadened to match (label / distributor / catalog company / management firm / team that groups multiple accounts).

Base URL standardization

Replaced 27 occurrences of recoup-api.vercel.app with api.recoupable.com across 8 files (index.mdx 3x, agents.mdx 8x, quickstart.mdx 9x, authentication.mdx 2x, content-agent.mdx 1x, skills/recoup-api.mdx 1x, plus 2 OpenAPI specs). Aligns the branch with main #180.

Final audit

Endpoint sets match main on all 7 OpenAPI specs:    PASS
Total nav entries:                                  151
Nav entries that 404:                               0  PASS
Orphan pages (on disk, no nav):                     0  PASS

Companion-repo commits (already pushed, not part of this PR)

  • recoupable/skills 7993be6 — added skills/create-artist/SKILL.md, updated artist-workspace/SKILL.md to defer
  • recoupable/plugins f048522 — fixed .claude-plugin/marketplace.json source (Cowork sync)
  • recoupable/plugins 062bce6 — fixed .agents/plugins/marketplace.json (Codex), rewrote README

Open items for follow-up PRs

  1. JSON example responses on every OpenAPI endpoint — customer's Sweetmantech/myc 3899 docs mintlify first test doc get tasks #2 feedback item. Real work; needs test API responses captured per endpoint
  2. Sync recoupable/skills/skills/recoup-api/SKILL.md with the api.recoupable.com base URL change (still references recoup-api.vercel.app)
  3. Engineering: align signup credit allocation — API initializes new accounts with 25 credits; chat code expects 333 free / 1000 pro. New free users hit a credit cliff for ~30 days until the first monthly reset
  4. Engineering: POST /api/chat/generate doesn't deduct credits in the source code — bug or intentional, needs product call

Original source PRs

All six (#168, #170-174) left open — they serve as the per-scope review surface, and humans can close them once this lands.

sidneyswift and others added 20 commits April 28, 2026 10:55
Pure visual update — no content or navigation changes.

- theme: mint → sequoia
- colors: green palette → achromatic (primary #0a0a0a, light #ededed)
- background: light #f3f3f3 / dark #171717 (matches Mintlify's
  gray-50 / gray-900 chrome so the page bg blends with the tab bar)
- fonts: Geist (body), Geist Pixel Square (headings); also adds
  GeistMono, Instrument Serif, Plus Jakarta Sans for use in MDX
- appearance: default system (respects OS dark/light pref)
- styling: eyebrows as breadcrumbs, codeblocks dark by default
- icons: lucide library
- logo: replace dark.png + light.svg with wordmark-lightmode.svg /
  wordmark-darkmode.svg (full wordmark) plus icon-only variants

Adds the woff2/ttf font files in fonts/ and the new SVG logos in
logo/. Removes the old PNG/SVG logos.

navigation, navbar, footer, and metatags are byte-identical to main —
this PR intentionally does not change content surface or info
architecture. Those land in subsequent stack PRs.

Made-with: Cursor
Brings mcp.mdx in line with what's actually registered in the
production MCP server (api/lib/mcp/tools/). The previous page
documented 2 tools; the actual server registers 43 across 11
domains.

Replaces the previous 2-tool description with a real tool catalog
grouped by activity:

- Artists (4 tools)        - Spotify (4)
- Catalog (3)              - YouTube (5)
- Chats (2)                - Tasks (5)
- Content — image, video,  - Pulses (2)
  audio (8)                - Sandbox (1)
- Research (4)             - Utilities (3)

Tool names and descriptions extracted directly from the
register*Tool.ts source files for accuracy.

Also fixes:
- Removes the fictional `run_sandbox_command` tool (never existed
  in the registered tool set).
- Drops the "Beta" framing — 43 working tools is just under-
  marketed production, not beta.
- Trims the overpromise in the opening line to match the actual
  capability surface.

Made-with: Cursor
Three classes of fixes to the API reference and content-agent docs.
All fixes were verified against the OpenAPI spec — no fictional
endpoints or paths remain.

OpenAPI hygiene (api-reference/openapi/*.json):
- research.json: replace internal "memories" wording with "messages"
  in chat endpoint descriptions and schema fields. Database tables
  remain named `memories` internally; this only affects what API
  consumers see in docs.
- releases.json: align PATCH /api/tasks summary "Update scheduled
  task" → "Update Task" so it matches the visible MDX page title in
  the sidebar.
- content.json: surface legacy framing in operation descriptions for
  POST /api/content/create, GET /api/image/generate, and POST
  /api/transcribe — explains what each does, why it predates the
  current /api/content/* primitives, and links to the recommended
  modern endpoint. Avoids breaking the AGENTS.md "api-reference MDX
  pages must be frontmatter-only" rule (which a previous attempt at
  inline <Note> blocks would have violated).

API reference page titles:
- api-reference/research/search.mdx: "Search" → "Artist Search"
- api-reference/spotify/search.mdx: "Search" → "Spotify Search"
- api-reference/image/generation.mdx: "Generate Image" →
  "Generate Image (Legacy)"
- api-reference/transcribe/audio.mdx: "Transcribe Audio" →
  "Transcribe Audio (Legacy)"

These four pages previously had titles that were either duplicates
of other pages (Search, Generate Image, Transcribe Audio) or didn't
indicate the legacy status. Renames disambiguate them in the sidebar
and in autocomplete.

Content Agent page (content-agent.mdx):
- Refactored the architecture and data-flow sections to match the
  current Slack-bot implementation.
- Endpoint table updated to use the canonical short paths from the
  OpenAPI spec (POST /api/content/image, /video, /caption,
  /transcribe; PATCH /api/content; POST /api/content/analyze) rather
  than the descriptive variants that don't actually exist in the
  spec.
- Marked POST /api/content/create as legacy inline.
- Standardized the "Endpoints it uses" heading to match the
  convention used on every skills/* page.

Made-with: Cursor
Rewrites the onboarding surface so AI agents landing on the docs
can self-serve API access in two unauthenticated curl calls instead
of being routed to a browser-based dashboard signup. The four pages
in this PR form one coherent narrative — index → quickstart →
authentication → agents — and they're now consistent with each
other.

index.mdx (homepage):
- New <Info> box at the top dedicated to agents, with the base URL,
  auth model, and one-step signup decision tree.
- Reorganized into three reader paths: REST API, MCP Server, CLI.
- New "What's in the API" card group organized by what agents do
  (Chat, Research, Artists, Catalog, Content, Automation, Accounts)
  rather than by HTTP verb or resource shape.
- New "For AI agents" footer section with a domain → OpenAPI spec
  table, root-relative paths so the links don't 404 if served from
  a non-prod domain.

quickstart.mdx:
- Two-call agent-signup flow as the primary path (signup → ask user
  for verification code → verify → API key in env var).
- Tabbed code samples (cURL / Python / JavaScript) all pull the API
  key from RECOUP_API_KEY env var consistently — no literal
  YOUR_API_KEY placeholders.
- Removed the fictional `recoup research "Drake"` CLI snippet.

authentication.mdx:
- Honest, scoped access-control rules: account_id, organization_id,
  and artist_account_id each documented separately with allow/deny
  conditions.
- Single source of truth for the HMAC-SHA256 storage note (was
  previously duplicated in two places).
- Note that BOTH /agents/signup and /agents/verify are
  unauthenticated, so readers don't wonder which header to send to
  /verify before they have a key.

agents.mdx:
- Reframes as the "operating manual for AI agents using the Recoup
  API" — explicit, ordered steps an agent should follow on first
  contact: authenticate → understand the roster → know the
  filesystem → decide what to do.
- Documents the artist-workspace filesystem convention
  (orgs/{org}/artists/{slug}/RECOUP.md, context/, songs/, etc.)
  so agents know how to persist context across runs.
- Sandbox upload example uses the correct request shape
  ({path, files: [{url, name}]}) per the OpenAPI spec.

These changes don't touch nav structure or content reference pages
— those concerns ship in the other stack PRs.

Made-with: Cursor
The page used $API_KEY in 5 curl examples but quickstart.mdx (and the
rest of the docs) document RECOUP_API_KEY as the env var to set after
signup. Rename all 5 occurrences for consistency, and add a one-line
note in step 1 explaining how to set the env var after receiving the
api_key from /agents/verify, so the variable used in subsequent
examples isn't undefined.

Caught by cubic-dev-ai on PR #172.

Made-with: Cursor
Bash interprets `<value>` as input redirection from a file named
"value", so the previous example failed with "no such file or
directory" when copy-pasted. Use `your-api-key` instead, matching
the convention already in cli.mdx.

Caught by cubic-dev-ai on PR #172.

Made-with: Cursor
Adds a new "Skills" surface to the docs — a set of markdown
playbooks that teach AI agents how to do music industry work.
Skills complement the API: the API tells an agent HOW to take
action, Skills tell it WHEN and WHY.

New pages:
- skills.mdx — overview of what skills are, the structure of a
  SKILL.md file, and how to install via Claude Code's plugin
  marketplace or `git clone`.
- skills/getting-started.mdx — install CLI, get API key, connect
  via MCP/REST.
- skills/setup-sandbox.mdx — provision a sandbox for an account.
- skills/artist-workspace.mdx — manage artist directories
  (RECOUP.md, context/, songs/, releases/).
- skills/streaming-growth.mdx — grow a new artist past streaming
  milestones.
- skills/chart-metric.mdx — query and analyze Chartmetric data.
- skills/music-industry-research.mdx — analytics, people search,
  competitive analysis.
- skills/song-writing.mdx — songwriting workflow.
- skills/trend-to-song.mdx — reverse-engineer a song from a
  cultural moment.
- skills/content-creation.mdx — compose social videos via the
  content endpoints.
- skills/release-management.mdx — plan and track release campaigns.

Each page summarizes when the agent uses the skill, what it
produces, and which API endpoints it depends on. The canonical
skill instructions live in github.com/recoupable/skills, where
each skill is a directory with a SKILL.md root file plus
optional references/, scripts/, and assets/.

This PR adds content only — it does NOT add a Skills tab to the
sidebar nav. That nav integration ships in the navigation
restructure PR (PR 7 of the stack), which makes these pages
visible alongside the existing reference docs.

Made-with: Cursor
Reorganizes the docs sidebar into a tab structure organized around
what agents actually do, rather than around HTTP verbs or resource
shapes. Pure docs.json change — no MDX content modified, no brand
fields touched.

New tab structure:

  Overview     - Start here / Interfaces / Skills entry points
  Chat         - AI Chat conversation endpoints
  Research     - Artist discovery + 9 sub-groups
                 (metrics, audience, playlists, charts, web, ...)
  Artists      - Artist Management + Fans & Posts
  Catalog      - Songs + Catalogs
  Content      - Generate / Edit / Analyze / Templates / Legacy /
                 Content Agent (verb-based, matches Research style)
  Automation   - Scheduled Tasks / Pulses / Notifications
  Accounts     - Agent Onboarding + Accounts/Orgs/Sandboxes/...
  Skills       - 10 skill playbooks

Within each tab, groups use single-verb or short-phrase names
(Generate, Edit, Analyze) rather than the previous
"Content Endpoints" / "Pipeline Endpoints" pattern. This matches the
naming convention Research already uses (Artist discovery,
Metrics & insights, Charts & radio).

Also touches:
- navbar: GitHub moved from sidebar global anchors to navbar links;
  Launch App removed (redundant with primary "Get API Key" CTA);
  Blog and Support kept.
- global anchors: emptied (no more competing CTAs at the top of the
  sidebar; the navbar handles it).
- contextual: enables copy/view/chatgpt/claude/perplexity/mcp/cursor/
  vscode export options on every page.

This PR depends on the Skills system (PR 6 of the stack) and the
agent-first onboarding pages (PR 5) for its referenced page slugs to
exist. If this lands before those, several nav entries will 404
until they merge — recommend reviewing/landing 5 and 6 first.

Made-with: Cursor
The favicon was still pointing at the legacy default favicon.ico
(15KB, dated April 18) — never updated when the rest of the brand
was. This PR's docs.json kept the same `favicon: "/favicon.ico"`
reference as main.

Three fixes:

1. Replace the bloated logo/icon-lightmode.svg (457KB — was a
   base64-embedded raster) with a clean 871-byte vector. The path
   data comes from icon-darkmode.svg with the fill swapped from
   white to #0a0a0a (the brand primary).

2. Switch docs.json to Mintlify's theme-aware favicon syntax so
   light-mode browsers use the dark-colored icon and dark-mode
   browsers use the white-on-transparent variant:

     "favicon": {
       "light": "/logo/icon-lightmode.svg",
       "dark":  "/logo/icon-darkmode.svg"
     }

3. Delete the now-unused root favicon.ico. Mintlify auto-generates
   /favicons/favicon-16x16.png, /favicon-32x32.png,
   /apple-touch-icon.png, and /favicon.ico from whatever's in the
   docs.json favicon config — keeping a stale .ico at the root just
   creates confusion.

Verified by curl-ing the dev server's auto-generated favicon
endpoints — sizes changed (15406 → 33310 bytes for favicon.ico),
confirming the new SVG is the source.

Made-with: Cursor
…rning

Helps agents pick the right auth path BEFORE they authenticate, and
warns them away from creating persistent records under throwaway
accounts.

agents.mdx — new "## 0. Choose your path" section:

A decision-tree table mapping each scenario to the right auth path:

  - Research/content output, no persistent state
    → throwaway agent+...@recoupable.com signup
    → DON'T create artists
  - Has account, work with existing roster
    → sign in with real email
    → list /api/artists
  - Has account, add a new artist
    → sign in with real email
    → run /workflows/create-artist
  - No account but wants persistent state
    → sign in with real email
    → run /workflows/create-artist after auth

Followed by an explicit "key distinction" callout:

  agent+ emails create isolated, unrecoverable accounts. Use them
  ONLY for one-shot work where losing the API key has no cost. For
  persistent records, use the user's real email.

This sits BEFORE step 1 so agents make the choice up front instead
of falling through to the default flow.

workflows/create-artist.mdx — new <Warning> at the top:

  Don't run this workflow under a throwaway agent+ account. Artist
  data is permanently isolated to that account and can't be
  recovered if the API key is lost. See /agents#0-choose-your-path
  for guidance.

Why this matters:

The signup endpoint takes three paths (verified against
api/lib/agents/agentSignupHandler.ts):

  1. Existing account → always sends verification code, returns
     api_key: null
  2. Brand-new agent+ email → creates isolated account, returns key
     instantly. No recovery mechanism.
  3. Brand-new normal email → sends verification code

Path 2 is the throwaway path. Each unique agent+xyz creates a
separate account; data created on one is unreachable from another.
If the API key is lost, the data is permanently orphaned (the email
recovery code goes to a Recoupable inbox nobody monitors).

Without this guidance, a literal-minded agent following the docs
could create artists under a throwaway account and silently produce
data that can't be retrieved later.

Made-with: Cursor
Adds an explicit "ask first" instruction with a verbatim question
template. The previous "Choose your path" section gave the scenarios
but assumed the agent could read the human's intent — which is
unreliable.

The new pattern:

  1. ASK the human up front (verbatim question template provided)
  2. Match their answer to the path table
  3. Skip the question only when context makes it obvious
     (explicit demo intent, explicit email already given, or
     autonomous agent with no human in the loop)

Why this matters:

The previous text relied on the agent inferring whether the human
wants persistence. Real-world prompts like "build me a content
campaign" don't reliably indicate intent — half the users want
account-based persistence, half are just trying a demo. If the
agent silently picks throwaway and the user re-prompts later, their
roster is orphaned and they didn't know to expect that.

A 5-second clarifying question is cheaper than that surprise.

The verbatim template surfaces the trade-off (persist vs one-shot)
in language a human can actually answer, and gives the agent a
ready-made script so it doesn't have to invent the question itself.

The "skip the question" clause preserves the easy-demo path: a
human who says "just try the platform" or already provides their
email gets straight to work without an extra round-trip.
Editorial pass on the prose I added in the previous commit. Three
issues to address:

1. Lead instruction was self-referential ("Agents are unreliable at
   guessing intent...") and used softer "Always ask... unless..."
   framing. Switched to a direct imperative ("Ask the human which
   path they want before authenticating.") with the consequence
   stated in concrete terms ("creates records under a throwaway
   account that can't be recovered if the API key is lost").

2. Question template had three weaknesses:
   - "Quick question before we start" — fluff opener that agents
     reproduce verbatim, padding every interaction with the same
     wind-up phrase
   - "share your email and I'll send a verification code" — the
     agent doesn't send the code (the API does); small accuracy
     bug that agents would propagate
   - "spin up a temporary one for one-shot use" — colloquial jargon
     that doesn't surface the actual consequence

   Rewritten to be tighter, accurate, and to surface the trade-off
   in the question itself: "...I'll create a temporary account —
   but you won't be able to save artists, releases, or scheduled
   tasks under it." The human now has enough to make an informed
   choice in one round-trip instead of asking a follow-up.

3. "Use this as your default opener (paraphrase as appropriate to
   context)" let the agent paraphrase away the trade-off. Changed
   to "paraphrase if needed, but keep the trade-off explicit" which
   gates the paraphrasing on preserving the key information.

Net change: 3 lines, same structure, tighter language, accurate
description of who does what.
The four onboarding pages (index, quickstart, agents, authentication)
were each trying to be self-contained, which produced contradictions:

- Three different "first call after auth" instructions:
    index.mdx     -> GET /accounts and /organizations
    quickstart    -> GET /research?q=Drake
    agents.mdx    -> GET /artists and /organizations
- Three different "agent loop" descriptions on three pages
- "Filesystem" introduced as a Core Concept on the homepage but
  only explained on agents.mdx
- The signup curl duplicated 4x across pages, drifting subtly
- Throwaway vs real-email path mentioned on agents.mdx but
  invisible on index/quickstart, leaving readers with mismatched
  mental models

Fix: give each page one job and link elsewhere for everything else.

index.mdx — now a router, not a tutorial:
- Removed the "How it works" 5-step agent loop (third version of
  the agent flow, conflicted with quickstart and agents)
- Removed the "Get an API key" section with inline curl (now lives
  in quickstart, the natural home for that snippet)
- Removed Filesystem from Core Concepts (it's an agent-specific
  implementation detail, not a top-level concept)
- New "Get started" routing block links to Quickstart, Agents, and
  Authentication with one-sentence descriptions of each

quickstart.mdx — now explicitly the demo path:
- New <Note> at top: "Building an AI agent that acts on a user's
  behalf? See /agents instead — it covers throwaway-vs-account,
  the roster, and the persistent filesystem."
- Page intro reframes as "5-minute hello-world"

agents.mdx — now explicitly the production manual:
- New <Note> at top: "Just trying the API yourself? See /quickstart
  for a 5-minute hello-world."
- Frames itself as the operating manual for production agents

authentication.mdx — now pure reference:
- Trimmed "Create a key" section: removed the inline signup curl
  (links to quickstart#1-get-your-api-key instead) and condensed
  the dashboard option to one line
- Other sections (use a key, org access, Bearer tokens, access
  control rules, errors, security) stay as reference material

After this change, each page has exactly one job:
  index           - homepage router (no operational steps)
  quickstart      - 5-min demo flow, one canonical scenario
  agents          - production agent operating manual
  authentication  - pure auth reference

The signup curl now lives in exactly two places (quickstart and
agents.mdx), each appropriate to its page's role. Other pages link.

Made-with: Cursor
- Update favicon.ico
- Replace legacy logo/dark.png and logo/light.svg with new icon/wordmark variants
  (icon-darkmode, icon-lightmode, wordmark-darkmode, wordmark-lightmode)
- Add Geist, GeistMono, GeistPixel, InstrumentSerif, and PlusJakartaSans
  font families under fonts/ for the new brand system

Sets the asset baseline for the upcoming brand and theme refresh PRs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	favicon.ico
#	logo/icon-lightmode.svg
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	api-reference/openapi/content.json
#	content-agent.mdx
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	agents.mdx
#	authentication.mdx
#	index.mdx
#	quickstart.mdx
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs.json
@sidneyswift sidneyswift requested a review from sweetmantech as a code owner May 5, 2026 23:58
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 5, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Reworks documentation and OpenAPI specs for an agent-first experience: replaces single-call signup with a two-step /api/agents/signup/api/agents/verify flow and emphasizes x-api-key usage, migrates API host to https://recoup-api.vercel.app, adds Skills/Plugins/Content Agent docs, updates multiple OpenAPI schemas (new fields/endpoints/deprecations), and restructures the docs manifest/navigation and assets.

Changes

Docs + API / Agent onboarding

Layer / File(s) Summary
API surface / Data shape
api-reference/openapi/content.json, api-reference/openapi/releases.json, api-reference/openapi/research.json, api-reference/openapi/social.json
Root server URLs updated to https://recoup-api.vercel.app; added audio_url to SongAnalyzeRequest; added profileUrls to UpdatedArtist; added chat compaction schemas and ChatRoom fields; added GET /api/apify/runs/{runId}; POST /api/content/create marked deprecated; various 4xx/5xx response descriptions normalized.
Authentication & onboarding narrative
agents.mdx, authentication.mdx, quickstart.mdx
Rewrote agent onboarding to an agent-centric flow with two-step signup/verify and explicit x-api-key examples; reorganized authentication doc (API keys, Privy bearer tokens, key creation/usage, access control, errors).
Core docs / index & site wiring
index.mdx, docs.json
Updated site intro, Info block and canonical Base URL to https://recoup-api.vercel.app/api; large docs.json manifest rewrite (theme, appearance, fonts, navigation, logo/navbar, new tabs: Content, Skills, Plugins, Accounts, etc.).
Agent tooling & examples
content-agent.mdx, mcp.mdx
Rebranded and expanded Content Agent doc (parameters, endpoints used, architecture, setup/troubleshooting); renamed MCP doc to "MCP Server", added bearer-token example and expanded tool catalog and calling workflow.
Skills & Plugins docs
skills.mdx, skills/*, plugins.mdx, plugins/*
New Skills system doc and many skill pages (artist-workspace, content-creation, getting-started, release-management, etc.); added plugins guide and example plugin spec (music-catalog-diligence).
Minor docs, labels, assets
api-reference/image/generation.mdx, api-reference/transcribe/audio.mdx, api-reference/research/search.mdx, api-reference/spotify/search.mdx, workflows/create-artist.mdx, fonts/InstrumentSerif/OFL.txt, credits.mdx, .gitignore
Title tweaks marking legacy pages; added warning in create-artist workflow; added SIL OFL license for Instrument Serif; new credits/costs doc; .gitignore adds superpowers/.

Sequence Diagram(s)

sequenceDiagram
    participant Agent as AI Agent
    participant SignupAPI as /api/agents/signup
    participant VerifyAPI as /api/agents/verify
    participant RecoupAPI as Recoup API
    participant Skills as Skills System

    Agent->>SignupAPI: POST email
    SignupAPI-->>Agent: verification code
    Agent->>VerifyAPI: POST code
    VerifyAPI-->>Agent: x-api-key
    Agent->>RecoupAPI: Authenticated requests (Header: x-api-key)
    RecoupAPI-->>Agent: account/roster/filesystem data
    Agent->>Skills: Load SKILL.md (triggers, endpoints)
    Skills-->>Agent: parsed skill metadata
    Agent->>RecoupAPI: Execute skill workflows (content, research, etc.)
    RecoupAPI-->>Agent: operation results / task callbacks
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • sweetmantech

"I hopped through docs, a tidy trail I wove,
Agents now have paths to sign, verify, and rove.
From signup codes to skills that hum,
Docs and specs align — the work is done.
🥕🐇"

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the pull request as a comprehensive documentation overhaul covering brand refresh, MCP updates, content cleanup, onboarding changes, new Skills system, and navigation restructure. It accurately reflects the main changes across multiple related PRs being consolidated.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/full-overhaul

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

PR #174's nav structure was written Apr 27, before three pages were
added to main:

- api-reference/ai/models       (added by #177 on May 1)
- api-reference/sessions/create (added by #186 on May 3)
- api-reference/sessions/get    (added by #185 on May 4)

These pages exist on disk but had no nav entry in the combined PR,
which would orphan them once #189 lands. Adding them in:

- Accounts tab → new "Sessions" group placed after "Sandboxes"
  (matches main's grouping of sessions with sandboxes)
- Chat tab → new "Models" group at the end
  (closest semantic fit; main grouped this under "Tools & Reference"
  which doesn't exist in our restructured 9-tab layout)

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

7 issues found across 47 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="mcp.mdx">

<violation number="1" location="mcp.mdx:2">
P2: Custom agent: **Enforce Clear Code Style and Maintainability Practices**

mcp.mdx exceeds the rule’s 100-line file limit, so it should be split or reduced for maintainability.</violation>
</file>

<file name="docs.json">

<violation number="1" location="docs.json:171">
P2: Custom agent: **Flag AI Slop and Fabricated Changes**

Navigation references docs routes that do not exist in the repository, creating broken doc links.</violation>
</file>

<file name="agents.mdx">

<violation number="1" location="agents.mdx:2">
P2: Custom agent: **Enforce Clear Code Style and Maintainability Practices**

`agents.mdx` exceeds the rule’s <100 line limit and combines multiple responsibilities into one page.</violation>

<violation number="2" location="agents.mdx:46">
P2: The authentication steps are written as if every signup requires email-code verification, which contradicts the documented throwaway `agent+...@recoupable.com` path and can misroute onboarding.</violation>
</file>

<file name="skills/music-industry-research.mdx">

<violation number="1" location="skills/music-industry-research.mdx:16">
P2: Use a consistent endpoint prefix: this line incorrectly references `/research/*` instead of `/api/research/*`.</violation>
</file>

<file name="api-reference/openapi/content.json">

<violation number="1" location="api-reference/openapi/content.json:619">
P2: `POST /api/content/create` description now documents `{run_id}`, but the actual documented response shape uses `runIds` (array). Update the description to match the response schema.</violation>
</file>

<file name="authentication.mdx">

<violation number="1" location="authentication.mdx:11">
P2: Bearer token guidance is too narrow: it says Bearer is only for Privy JWTs, but MCP docs require API keys in the Bearer header.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread mcp.mdx
@@ -1,78 +1,161 @@
---
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Custom agent: Enforce Clear Code Style and Maintainability Practices

mcp.mdx exceeds the rule’s 100-line file limit, so it should be split or reduced for maintainability.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At mcp.mdx, line 2:

<comment>mcp.mdx exceeds the rule’s 100-line file limit, so it should be split or reduced for maintainability.</comment>

<file context>
@@ -1,78 +1,161 @@
 ---
-title: "MCP"
-description: "Connect AI agents to the Recoup platform using the Model Context Protocol (MCP) server."
+title: "MCP Server"
+description: "Connect any AI agent to Recoup via the Model Context Protocol — Claude, ChatGPT, Cursor, and 40+ Recoup tools natively."
 ---
</file context>

Comment thread docs.json Outdated
Comment thread agents.mdx
@@ -1,96 +1,172 @@
---
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Custom agent: Enforce Clear Code Style and Maintainability Practices

agents.mdx exceeds the rule’s <100 line limit and combines multiple responsibilities into one page.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At agents.mdx, line 2:

<comment>`agents.mdx` exceeds the rule’s <100 line limit and combines multiple responsibilities into one page.</comment>

<file context>
@@ -1,96 +1,172 @@
 ---
-title: 'Agents'
-description: 'Programmatic agent onboarding — sign up and obtain API keys in one call, no dashboard, no human in the loop.'
+title: "Agent Onboarding"
+description: "The operating manual for AI agents using the Recoup API."
 ---
</file context>


## What it produces

A structured research output answering the user's question — usually a synthesis across multiple `/research/*` calls (e.g. profile + metrics + audience + similar artists), formatted for either the agent's continued reasoning or direct delivery to the user.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Use a consistent endpoint prefix: this line incorrectly references /research/* instead of /api/research/*.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At skills/music-industry-research.mdx, line 16:

<comment>Use a consistent endpoint prefix: this line incorrectly references `/research/*` instead of `/api/research/*`.</comment>

<file context>
@@ -0,0 +1,24 @@
+
+## What it produces
+
+A structured research output answering the user's question — usually a synthesis across multiple `/research/*` calls (e.g. profile + metrics + audience + similar artists), formatted for either the agent's continued reasoning or direct delivery to the user.
+
+## Endpoints it uses
</file context>

"post": {
"description": "Trigger the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` — an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).",
"deprecated": true,
"description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: POST /api/content/create description now documents {run_id}, but the actual documented response shape uses runIds (array). Update the description to match the response schema.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At api-reference/openapi/content.json, line 619:

<comment>`POST /api/content/create` description now documents `{run_id}`, but the actual documented response shape uses `runIds` (array). Update the description to match the response schema.</comment>

<file context>
@@ -610,7 +615,8 @@
       "post": {
-        "description": "Trigger the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` — an array of run IDs that can each be polled via [GET /api/tasks/runs](/api-reference/tasks/runs).",
+        "deprecated": true,
+        "description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
         "security": [
           {
</file context>
Suggested change
"description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
"description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `runIds` (an array of run IDs) for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",

Comment thread authentication.mdx

Providing both headers in the same request will result in a `401` error.
| API Key | `x-api-key` | Servers, scripts, CLI, AI agents |
| Bearer Token | `Authorization: Bearer <jwt>` | Frontend apps via Privy |
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Bearer token guidance is too narrow: it says Bearer is only for Privy JWTs, but MCP docs require API keys in the Bearer header.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At authentication.mdx, line 11:

<comment>Bearer token guidance is too narrow: it says Bearer is only for Privy JWTs, but MCP docs require API keys in the Bearer header.</comment>

<file context>
@@ -1,115 +1,94 @@
-
-Providing both headers in the same request will result in a `401` error.
+| API Key | `x-api-key` | Servers, scripts, CLI, AI agents |
+| Bearer Token | `Authorization: Bearer <jwt>` | Frontend apps via Privy |
 
 <Note>
</file context>

Comment thread agents.mdx
```
</Step>
<Step title="Ask the human for the code">
A 6-digit code was sent to their inbox. Ask them: *"Check your email for a verification code and share it with me."*
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The authentication steps are written as if every signup requires email-code verification, which contradicts the documented throwaway agent+...@recoupable.com path and can misroute onboarding.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At agents.mdx, line 46:

<comment>The authentication steps are written as if every signup requires email-code verification, which contradicts the documented throwaway `agent+...@recoupable.com` path and can misroute onboarding.</comment>

<file context>
@@ -1,96 +1,172 @@
+    ```
+  </Step>
+  <Step title="Ask the human for the code">
+    A 6-digit code was sent to their inbox. Ask them: *"Check your email for a verification code and share it with me."*
+  </Step>
+  <Step title="Call verify with the code">
</file context>
Suggested change
A 6-digit code was sent to their inbox. Ask them: *"Check your email for a verification code and share it with me."*
If signup returned an `api_key`, use it immediately. Otherwise, ask the human for the 6-digit verification code sent to their inbox.

PR #174's nav was written Apr 27. On Apr 28, main #163 ("docs: remove
instagram scrape endpoints") deleted these two MDX files entirely:

- api-reference/instagram/comments.mdx
- api-reference/instagram/profiles.mdx

The combined PR's nav still pointed at them, which would 404 in
production. Removing the nav entries to match main's intent.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
api-reference/openapi/content.json (1)

3575-3586: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Require prompt or composition_plan in the music request schemas.

All three schemas describe “provide either a text prompt or a composition plan,” but none of them require either field. Generated clients and validators will therefore accept {} as valid input even though the prose says otherwise. Please encode that rule in the schema instead of leaving it only in descriptions.

Also applies to: 3609-3619, 3700-3710

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api-reference/openapi/content.json` around lines 3575 - 3586, The
MusicComposeDetailedRequest schema currently lists "prompt" and
"composition_plan" as optional properties but must require at least one; update
MusicComposeDetailedRequest to enforce this by adding an anyOf with
[{"required":["prompt"]},{"required":["composition_plan"]}] (or equivalent JSON
Schema construct) alongside the existing properties so {} is invalid; apply the
same change to the other two music compose request schemas that declare "prompt"
and "composition_plan" (the schemas in the other two ranges) so all compose
endpoints require either prompt or composition_plan.
🧹 Nitpick comments (3)
index.mdx (1)

6-8: ⚡ Quick win

Split the top Info block into scannable bullets.

Line 7 packs multiple actions into one long sentence, which is hard to scan quickly for onboarding-critical steps.

Proposed refactor
 <Info>
-**AI agent?** Base URL: `https://recoup-api.vercel.app/api`. Use `x-api-key` if your human has a key. Otherwise, `POST /api/agents/signup` with their email — ask them for the verification code from their inbox, then `POST /api/agents/verify` to get a key. [Agent guide →](/agents) | [Endpoint map ↓](`#for-ai-agents`)
+**AI agent?**
+- Base URL: `https://recoup-api.vercel.app/api`
+- If your human already has a key, send `x-api-key`.
+- Otherwise:
+  1. `POST /api/agents/signup` with their email
+  2. Ask for the inbox verification code
+  3. `POST /api/agents/verify` to get a key
+- [Agent guide →](/agents) | [Endpoint map ↓](`#for-ai-agents`)
 </Info>

As per coding guidelines, "Keep documentation content concise and scannable".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@index.mdx` around lines 6 - 8, Split the single Info block into scannable
bullets: break the long sentence inside the <Info> block into separate bullet
lines for Base URL (https://recoup-api.vercel.app/api), authentication with
x-api-key, the signup flow (POST /api/agents/signup with email → request
verification code), the verify step (POST /api/agents/verify to obtain a key),
and keep the two links as distinct inline items (“Agent guide →” and “Endpoint
map ↓”) so readers can quickly scan onboarding steps and links.
agents.mdx (1)

37-56: ⚡ Quick win

Extract signup/verify steps into a shared snippet to prevent doc drift.

This flow is duplicated across onboarding/auth pages. Centralizing it will keep behavior changes consistent.

As per coding guidelines, "Follow DRY principle - don't duplicate content across pages, use snippets instead".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@agents.mdx` around lines 37 - 56, Extract the duplicated signup/verify flow
(the Steps/Step block that shows the POST to /api/agents/signup and
/api/agents/verify and the instruction to store the returned api_key) into a
single shared MDX snippet (e.g., a reusable snippet named
"agents-signup-verify") and replace the duplicated blocks on onboarding/auth
pages with an include/import of that snippet; ensure the snippet contains the
exact curl examples and the note about exporting RECOUP_API_KEY and that pages
reference the snippet (instead of copying Steps/Step) so future changes to the
signup or verify flow are made in one location.
content-agent.mdx (1)

40-56: ⚡ Quick win

This section overstates what the agent actually calls today.

The heading says “Endpoints it uses” and the copy says “You orchestrate them,” but the data-flow section below still says the agent triggers legacy POST /api/content/create. Renaming this to something like “Available content primitives” or collapsing it into links would avoid duplicating seven API descriptions and drifting from the actual flow.

As per coding guidelines, **/*.mdx: Follow DRY principle - don't duplicate content across pages, use snippets instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@content-agent.mdx` around lines 40 - 56, Rename the section titled "Endpoints
it uses" to something like "Available content primitives" and change the wording
from "You orchestrate them" to neutral phrasing that reflects these are
available primitives (e.g., "The content API exposes the following primitives").
Remove or de-emphasize the duplicated endpoint descriptions by collapsing them
into concise links or including a reusable snippet reference, and update the
data-flow text that still references legacy POST /api/content/create to clearly
state that the agent currently triggers the legacy POST /api/content/create
pipeline (or call out the preferred approach) to avoid contradiction; ensure the
MDX follows the DRY guideline for **/*.mdx by replacing the inline table with a
snippet/include and keeping only a short summary in this page.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@api-reference/openapi/content.json`:
- Line 1345: The API docs list a text-only "prompt" video mode but the request
schema ContentCreateVideoRequest still requires image_url (and notes prompt-only
is unsupported), causing a contract mismatch; fix by either removing "prompt"
from the mode enumeration in the description string (the block listing modes in
api-reference/openapi/content.json) or by updating the ContentCreateVideoRequest
schema to allow prompt-only requests (make image_url optional and adjust
validation/comments), and ensure the description and schema consistently reflect
the chosen behavior.
- Around line 618-619: The description for the legacy content pipeline
incorrectly says it returns `{run_id}` while the 202 response/schema expose
`runIds` (an array); update the description text in the legacy create docs to
state that the endpoint returns `runIds` (array) and use `runIds` consistently
across the legacy pipeline doc (replace any `{run_id}` occurrences, including
the other occurrence noted nearby) so the intro, response example, and schema
match the `runIds` field name used in the 202 response.

In `@api-reference/openapi/releases.json`:
- Around line 3532-3537: The schema for profileUrls currently allows arbitrary
keys/strings but the description mandates only specific uppercase platform keys;
update the schema to enforce that contract by replacing additionalProperties
with explicit properties for SPOTIFY, INSTAGRAM, TIKTOK, TWITTER, YOUTUBE,
APPLE, FACEBOOK, and THREADS (each with type: string) and set
additionalProperties: false on the profileUrls object, or if you prefer not to
enforce it in the schema, remove the normative language from the description;
locate the profileUrls object in the OpenAPI JSON and modify the
additionalProperties/properties there to implement one of these two options.

In `@docs.json`:
- Around line 459-462: Update the primary CTA object (the "primary" button with
label "Get API Key") in docs.json so its href uses the canonical app URL
"https://chat.recoupable.com" instead of the "/keys" subpath, and while you’re
there verify and correct other branding entries in docs.json to match the spec:
support email agent@recoupable.com, app URL https://chat.recoupable.com, website
https://recoupable.com, and the official social URLs for X, GitHub, and
LinkedIn.
- Around line 168-174: Remove the known-broken Instagram sidebar entries by
updating the "Instagram" nav block: either delete the entire object with
"group": "Instagram" or remove the two page strings
"api-reference/instagram/comments" and "api-reference/instagram/profiles" from
its "pages" array (or replace them with existing Instagram doc paths); ensure
the "pages" array only lists pages that actually exist so the published sidebar
has no dead links.
- Around line 5-9: Update the branded primary color in the JSON by replacing the
"colors.primary" value (currently "#0a0a0a") with the Recoup brand hex "#345A5D"
so the docs' primary accent matches Recoup-Chat; ensure the "colors" object
still contains "light" and "dark" keys unchanged and that only the "primary"
property is modified.

In `@mcp.mdx`:
- Around line 14-25: The documentation example uses
https://api.recoupable.com/mcp for the MCP client (created via
StreamableHTTPClientTransport and the URL passed to its constructor) while other
onboarding docs reference the REST/OpenAPI host
https://recoup-api.vercel.app/api; add an explicit note near the example (or
change the example host if that was a mistake) clarifying that MCP (used by
StreamableHTTPClientTransport) and REST/OpenAPI are different endpoints and must
not be interchanged, and reference the RECOUP_API_KEY usage so readers know the
same API key is used but the base URL differs.

In `@quickstart.mdx`:
- Around line 21-23: The curl + jq command that sets RECOUP_API_KEY uses "jq -r
.api_key" which silently returns null on error responses; change it to use jq
with the -e flag so jq exits nonzero when .api_key is missing or null (i.e.,
replace the jq invocation that extracts .api_key with one that includes -e), and
ensure the shell command checks the exit status so RECOUP_API_KEY is not
exported on failed verification; reference the RECOUP_API_KEY assignment and the
jq invocation in your update.

In `@skills/artist-workspace.mdx`:
- Line 2: Update the frontmatter title in the MDX file so it uses human-readable
title casing instead of kebab-case: change the title value currently set as
"artist-workspace" to a proper title like "Artist Workspace" (the frontmatter
key is title in skills/artist-workspace.mdx and this value is used to render the
page H1 and browser tab).

In `@skills/getting-started.mdx`:
- Line 2: Update the frontmatter title value from the kebab-case string
("getting-started") to a human-readable, title-cased form (e.g., "Getting
Started") so the page H1 and browser tab show a readable title; edit the title
field in the frontmatter of the getting-started page (the title key in the
file's frontmatter) and ensure it follows title-casing and documentation style
guidelines.

In `@skills/release-management.mdx`:
- Line 2: The frontmatter title currently uses kebab-case ("release-management")
and must be changed to human-readable casing; update the title value in the
frontmatter (the line with title: "release-management") to a properly cased,
spaced string such as "Release Management" so the page H1 renders correctly and
follows the documentation casing guidelines.

---

Outside diff comments:
In `@api-reference/openapi/content.json`:
- Around line 3575-3586: The MusicComposeDetailedRequest schema currently lists
"prompt" and "composition_plan" as optional properties but must require at least
one; update MusicComposeDetailedRequest to enforce this by adding an anyOf with
[{"required":["prompt"]},{"required":["composition_plan"]}] (or equivalent JSON
Schema construct) alongside the existing properties so {} is invalid; apply the
same change to the other two music compose request schemas that declare "prompt"
and "composition_plan" (the schemas in the other two ranges) so all compose
endpoints require either prompt or composition_plan.

---

Nitpick comments:
In `@agents.mdx`:
- Around line 37-56: Extract the duplicated signup/verify flow (the Steps/Step
block that shows the POST to /api/agents/signup and /api/agents/verify and the
instruction to store the returned api_key) into a single shared MDX snippet
(e.g., a reusable snippet named "agents-signup-verify") and replace the
duplicated blocks on onboarding/auth pages with an include/import of that
snippet; ensure the snippet contains the exact curl examples and the note about
exporting RECOUP_API_KEY and that pages reference the snippet (instead of
copying Steps/Step) so future changes to the signup or verify flow are made in
one location.

In `@content-agent.mdx`:
- Around line 40-56: Rename the section titled "Endpoints it uses" to something
like "Available content primitives" and change the wording from "You orchestrate
them" to neutral phrasing that reflects these are available primitives (e.g.,
"The content API exposes the following primitives"). Remove or de-emphasize the
duplicated endpoint descriptions by collapsing them into concise links or
including a reusable snippet reference, and update the data-flow text that still
references legacy POST /api/content/create to clearly state that the agent
currently triggers the legacy POST /api/content/create pipeline (or call out the
preferred approach) to avoid contradiction; ensure the MDX follows the DRY
guideline for **/*.mdx by replacing the inline table with a snippet/include and
keeping only a short summary in this page.

In `@index.mdx`:
- Around line 6-8: Split the single Info block into scannable bullets: break the
long sentence inside the <Info> block into separate bullet lines for Base URL
(https://recoup-api.vercel.app/api), authentication with x-api-key, the signup
flow (POST /api/agents/signup with email → request verification code), the
verify step (POST /api/agents/verify to obtain a key), and keep the two links as
distinct inline items (“Agent guide →” and “Endpoint map ↓”) so readers can
quickly scan onboarding steps and links.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f6e31ddb-556b-42ac-a384-a067ff1a7b61

📥 Commits

Reviewing files that changed from the base of the PR and between fd3e389 and 356ad69.

⛔ Files ignored due to path filters (20)
  • favicon.ico is excluded by !**/*.ico
  • fonts/Geist/Geist-Variable.woff2 is excluded by !**/*.woff2
  • fonts/Geist/Geist-VariableItalic.woff2 is excluded by !**/*.woff2
  • fonts/GeistMono/GeistMono-Variable.woff2 is excluded by !**/*.woff2
  • fonts/GeistMono/GeistMono-VariableItalic.woff2 is excluded by !**/*.woff2
  • fonts/GeistPixel/GeistPixel-Circle.woff2 is excluded by !**/*.woff2
  • fonts/GeistPixel/GeistPixel-Grid.woff2 is excluded by !**/*.woff2
  • fonts/GeistPixel/GeistPixel-Line.woff2 is excluded by !**/*.woff2
  • fonts/GeistPixel/GeistPixel-Square.woff2 is excluded by !**/*.woff2
  • fonts/GeistPixel/GeistPixel-Triangle.woff2 is excluded by !**/*.woff2
  • fonts/InstrumentSerif/InstrumentSerif-Italic.ttf is excluded by !**/*.ttf
  • fonts/InstrumentSerif/InstrumentSerif-Regular.ttf is excluded by !**/*.ttf
  • fonts/PlusJakartaSans/PlusJakartaSans-Variable.ttf is excluded by !**/*.ttf
  • fonts/PlusJakartaSans/PlusJakartaSans-VariableItalic.ttf is excluded by !**/*.ttf
  • logo/dark.png is excluded by !**/*.png
  • logo/icon-darkmode.svg is excluded by !**/*.svg
  • logo/icon-lightmode.svg is excluded by !**/*.svg
  • logo/light.svg is excluded by !**/*.svg
  • logo/wordmark-darkmode.svg is excluded by !**/*.svg
  • logo/wordmark-lightmode.svg is excluded by !**/*.svg
📒 Files selected for processing (27)
  • agents.mdx
  • api-reference/image/generation.mdx
  • api-reference/openapi/content.json
  • api-reference/openapi/releases.json
  • api-reference/openapi/research.json
  • api-reference/research/search.mdx
  • api-reference/spotify/search.mdx
  • api-reference/transcribe/audio.mdx
  • authentication.mdx
  • content-agent.mdx
  • docs.json
  • fonts/InstrumentSerif/OFL.txt
  • index.mdx
  • mcp.mdx
  • quickstart.mdx
  • skills.mdx
  • skills/artist-workspace.mdx
  • skills/chart-metric.mdx
  • skills/content-creation.mdx
  • skills/getting-started.mdx
  • skills/music-industry-research.mdx
  • skills/release-management.mdx
  • skills/setup-sandbox.mdx
  • skills/song-writing.mdx
  • skills/streaming-growth.mdx
  • skills/trend-to-song.mdx
  • workflows/create-artist.mdx

Comment on lines +618 to +619
"deprecated": true,
"description": "**Legacy pipeline.** Runs the full content-creation pipeline (image, video, caption, edit, upscale) in a single call. Powers the Content Agent Slack bot. New integrations should compose the individual primitives ([`POST /api/content/image`](/api-reference/content/generate-image), [`POST /api/content/video`](/api-reference/content/generate-video), [`POST /api/content/caption`](/api-reference/content/generate-caption), and so on) for finer-grained control.\n\nTriggers the content creation pipeline for an artist. Provide `artist_account_id` to identify the target artist. Validates the artist has all required files (face guide, songs) unless overridden via `songs` URLs or `images`, then triggers a background task that generates a short-form video. Returns `{run_id}` for polling progress via [`GET /api/tasks/runs`](/api-reference/tasks/runs).",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use runIds consistently in the legacy create docs.

The intro still says this endpoint returns {run_id}, but the 202 response and schema expose runIds as an array. That mismatch will push readers toward parsing the wrong field name.

Also applies to: 640-641

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api-reference/openapi/content.json` around lines 618 - 619, The description
for the legacy content pipeline incorrectly says it returns `{run_id}` while the
202 response/schema expose `runIds` (an array); update the description text in
the legacy create docs to state that the endpoint returns `runIds` (array) and
use `runIds` consistently across the legacy pipeline doc (replace any `{run_id}`
occurrences, including the other occurrence noted nearby) so the intro, response
example, and schema match the `runIds` field name used in the 202 response.

"/api/content/video": {
"post": {
"description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` create a video from a text description\n- `animate` animate a still image\n- `reference` use an image as a style/subject reference (not the first frame)\n- `extend` continue an existing video\n- `first-last` generate a video that transitions between two images\n- `lipsync` sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",
"description": "Generate a video. Set `mode` to control what kind of video you get:\n\n- `prompt` \u2014 create a video from a text description\n- `animate` \u2014 animate a still image\n- `reference` \u2014 use an image as a style/subject reference (not the first frame)\n- `extend` \u2014 continue an existing video\n- `first-last` \u2014 generate a video that transitions between two images\n- `lipsync` \u2014 sync face movement to an audio clip\n\nIf `mode` is omitted, it's inferred from the inputs you provide.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't document a text-only video mode that the schema rejects.

The endpoint description says prompt mode creates a video from text alone, but ContentCreateVideoRequest still requires image_url and even says prompt-only is unsupported. Right now the published contract contradicts itself. Either remove text-only prompt from the mode list or relax the schema so those requests are actually valid.

Also applies to: 2675-2704

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api-reference/openapi/content.json` at line 1345, The API docs list a
text-only "prompt" video mode but the request schema ContentCreateVideoRequest
still requires image_url (and notes prompt-only is unsupported), causing a
contract mismatch; fix by either removing "prompt" from the mode enumeration in
the description string (the block listing modes in
api-reference/openapi/content.json) or by updating the ContentCreateVideoRequest
schema to allow prompt-only requests (make image_url optional and adjust
validation/comments), and ensure the description and schema consistently reflect
the chosen behavior.

Comment on lines 3532 to 3537
"profileUrls": {
"type": "object",
"description": "Map of uppercase platform identifier to social profile URL. Each entry replaces the existing social for that platform; platforms not included are preserved. Recognized keys: SPOTIFY, INSTAGRAM, TIKTOK, TWITTER, YOUTUBE, APPLE, FACEBOOK, THREADS. Keys are matched case-sensitively lowercase keys will create duplicate socials instead of replacing the existing entry.",
"description": "Map of uppercase platform identifier to social profile URL. Each entry replaces the existing social for that platform; platforms not included are preserved. Recognized keys: SPOTIFY, INSTAGRAM, TIKTOK, TWITTER, YOUTUBE, APPLE, FACEBOOK, THREADS. Keys are matched case-sensitively \u2014 lowercase keys will create duplicate socials instead of replacing the existing entry.",
"additionalProperties": {
"type": "string"
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Encode the profileUrls contract in the schema.

The description now makes uppercase platform keys and social-profile URLs part of the public API, but the schema still accepts any property name and any string value. That means generated clients/docs won't catch instagram: "foo" and users only discover the duplicate-social behavior at runtime. Either model those constraints here or remove the normative validation language from the description.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api-reference/openapi/releases.json` around lines 3532 - 3537, The schema for
profileUrls currently allows arbitrary keys/strings but the description mandates
only specific uppercase platform keys; update the schema to enforce that
contract by replacing additionalProperties with explicit properties for SPOTIFY,
INSTAGRAM, TIKTOK, TWITTER, YOUTUBE, APPLE, FACEBOOK, and THREADS (each with
type: string) and set additionalProperties: false on the profileUrls object, or
if you prefer not to enforce it in the schema, remove the normative language
from the description; locate the profileUrls object in the OpenAPI JSON and
modify the additionalProperties/properties there to implement one of these two
options.

Comment thread docs.json
Comment on lines 5 to +9
"colors": {
"primary": "#345A5D",
"light": "#4A7A7D",
"dark": "#1E3A3D"
"primary": "#0a0a0a",
"light": "#ededed",
"dark": "#0a0a0a"
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restore the branded primary color.

#0a0a0a changes the docs’ primary accent away from the required Recoup brand color, so buttons, links, and other primary UI affordances will render off-brand.

Suggested fix
   "colors": {
-    "primary": "#0a0a0a",
+    "primary": "#345A5D",
     "light": "#ededed",
     "dark": "#0a0a0a"
   },

As per coding guidelines, docs.json: Use primary color #345A5D from Recoup-Chat tailwind.config.ts for branding consistency.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"colors": {
"primary": "#345A5D",
"light": "#4A7A7D",
"dark": "#1E3A3D"
"primary": "#0a0a0a",
"light": "#ededed",
"dark": "#0a0a0a"
},
"colors": {
"primary": "#345A5D",
"light": "#ededed",
"dark": "#0a0a0a"
},
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 5 - 9, Update the branded primary color in the JSON
by replacing the "colors.primary" value (currently "#0a0a0a") with the Recoup
brand hex "#345A5D" so the docs' primary accent matches Recoup-Chat; ensure the
"colors" object still contains "light" and "dark" keys unchanged and that only
the "primary" property is modified.

Comment thread docs.json
Comment thread mcp.mdx
Comment on lines +14 to +25
Pass your API key as a Bearer token when connecting:

You can get a key from the [API Keys page](https://chat.recoupable.com/keys).
```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

## Tools
const RECOUP_API_KEY = process.env.RECOUP_API_KEY;

### prompt_sandbox
const transport = new StreamableHTTPClientTransport(
new URL("https://api.recoupable.com/mcp"),
{ requestInit: { headers: { Authorization: `Bearer ${RECOUP_API_KEY}` } } },
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Clarify MCP host vs REST host to avoid misconfiguration.

Line 23 uses https://api.recoupable.com/mcp, while other onboarding pages use https://recoup-api.vercel.app/api for REST. Add an explicit note that these are different endpoints (or align if not intentional), otherwise users can wire the wrong base URL.

Proposed clarification
 const client = new Client({ name: "my-agent", version: "1.0.0" });
 await client.connect(transport);

+
+MCP uses https://api.recoupable.com/mcp. REST/OpenAPI calls use https://recoup-api.vercel.app/api.
+

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @mcp.mdx around lines 14 - 25, The documentation example uses
https://api.recoupable.com/mcp for the MCP client (created via
StreamableHTTPClientTransport and the URL passed to its constructor) while other
onboarding docs reference the REST/OpenAPI host
https://recoup-api.vercel.app/api; add an explicit note near the example (or
change the example host if that was a mistake) clarifying that MCP (used by
StreamableHTTPClientTransport) and REST/OpenAPI are different endpoints and must
not be interchanged, and reference the RECOUP_API_KEY usage so readers know the
same API key is used but the base URL differs.


</details>

<!-- fingerprinting:phantom:poseidon:hawk -->

<!-- 4e71b3a2 -->

<!-- This is an auto-generated comment by CodeRabbit -->

Comment thread quickstart.mdx Outdated
@@ -0,0 +1,25 @@
---
title: "artist-workspace"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Title should use human-readable casing, not kebab-case.

"artist-workspace" will render as the page H1 and browser tab title verbatim. It should read as a proper title.

✏️ Proposed fix
-title: "artist-workspace"
+title: "Artist Workspace"

As per coding guidelines: "Use clear, self-documenting titles and descriptions in documentation."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title: "artist-workspace"
title: "Artist Workspace"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/artist-workspace.mdx` at line 2, Update the frontmatter title in the
MDX file so it uses human-readable title casing instead of kebab-case: change
the title value currently set as "artist-workspace" to a proper title like
"Artist Workspace" (the frontmatter key is title in skills/artist-workspace.mdx
and this value is used to render the page H1 and browser tab).

@@ -0,0 +1,23 @@
---
title: "getting-started"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Title should use human-readable casing, not kebab-case.

"getting-started" renders verbatim as the page H1 and browser tab title. This is the first page many users will land on in the Skills section.

✏️ Proposed fix
-title: "getting-started"
+title: "Getting Started"

As per coding guidelines: "Use clear, self-documenting titles and descriptions in documentation."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title: "getting-started"
title: "Getting Started"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/getting-started.mdx` at line 2, Update the frontmatter title value
from the kebab-case string ("getting-started") to a human-readable, title-cased
form (e.g., "Getting Started") so the page H1 and browser tab show a readable
title; edit the title field in the frontmatter of the getting-started page (the
title key in the file's frontmatter) and ensure it follows title-casing and
documentation style guidelines.

@@ -0,0 +1,27 @@
---
title: "release-management"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Title should use human-readable casing, not kebab-case.

Same issue as skills/artist-workspace.mdx"release-management" renders verbatim as the page H1.

✏️ Proposed fix
-title: "release-management"
+title: "Release Management"

As per coding guidelines: "Use clear, self-documenting titles and descriptions in documentation."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title: "release-management"
title: "Release Management"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/release-management.mdx` at line 2, The frontmatter title currently
uses kebab-case ("release-management") and must be changed to human-readable
casing; update the title value in the frontmatter (the line with title:
"release-management") to a properly cased, spaced string such as "Release
Management" so the page H1 renders correctly and follows the documentation
casing guidelines.

sidneyswift and others added 2 commits May 5, 2026 21:48
Reorganize the Skills sidebar around what skills actually do, not how
"creative" they are. Earlier grouping mixed pure craft (song-writing)
with marketing/distribution work (content-creation, release-management)
under one "Creative work" header — that obscured that content production
is marketing, not art.

New 5-group structure:

  Overview            - landing page
  Foundations         - recoup-api, getting-started, setup-sandbox,
                        artist-workspace
                        (everything that gets an agent integrated and
                        operating inside a Recoup sandbox)
  Research            - music-industry-research
                        (information gathering — distinct mode)
  Songwriting         - song-writing
                        (pure craft, no platform dependency)
  Marketing & growth  - content-creation, release-management,
                        streaming-growth, trend-to-song
                        (everything around getting music out and growing
                        the artist post-release)

Adds a new docs page for the recoup-api skill (the meta-client that
teaches an agent how to authenticate inside a sandbox using the short-
lived RECOUP_ACCESS_TOKEN, scope to RECOUP_ORG_ID, and reach external
services through Recoup's connector actions).

Drops chart-metric entirely — both the nav entry and the .mdx file.
It's not part of the canonical "use what we ship" flow; the same data
is reachable through the Recoup-wrapped /api/research/* endpoints.

Verified locally: all 11 active skill pages return HTTP 200, zero
nav 404s, zero orphan pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
Earlier sidebar over-grouped 10 skills into 5 sections, two of which
(Research, Songwriting) were singletons and looked broken. The genre-
flavored groupings (Songwriting vs Marketing & growth) also forced
debates about where boundary skills like trend-to-song belong.

The only distinction that genuinely matters is do-this-first vs
do-this-when-you-need-it. New 2-group structure:

  Overview    landing page
  Setup       recoup-api, getting-started, setup-sandbox,
              artist-workspace
  Playbooks   research → song-writing → trend-to-song →
              release-management → content-creation →
              streaming-growth (ordered by artist workflow stage)

"Playbooks" matches the language already used in skills.mdx ("markdown
playbooks that teach AI agents..."). Drops "& growth" naming, which
was redundant — all marketing in this context is growth.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs.json (1)

492-498: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Footer GitHub URL should match the canonical organization in navbar.

Navbar links to https://github.com/recoupable (line 467), but footer uses https://github.com/recoupable-com (line 495). Per the branding guidelines for canonical social URLs, the footer should use the same organization namespace as the navbar.

🔧 Proposed fix
   "footer": {
     "socials": {
       "x": "https://x.com/recoupai",
-      "github": "https://github.com/recoupable-com",
+      "github": "https://github.com/recoupable",
       "linkedin": "https://www.linkedin.com/company/recoupable"
     }
   },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 492 - 498, The footer's GitHub URL in
footer.socials.github is inconsistent with the navbar's canonical org; update
footer.socials.github to match the navbar value (replace
"https://github.com/recoupable-com" with "https://github.com/recoupable") so
both navbar and footer use the same canonical GitHub organization.
♻️ Duplicate comments (3)
docs.json (3)

5-9: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restore the branded primary color.

primary is still #0a0a0a in this revision. As per coding guidelines, docs.json must use #345A5D from Recoup-Chat's tailwind config; otherwise primary buttons, links, and accents will render off-brand.

🎨 Proposed fix
   "colors": {
-    "primary": "#0a0a0a",
+    "primary": "#345A5D",
     "light": "#ededed",
     "dark": "#0a0a0a"
   },

As per coding guidelines, Use primary color #345A5D from Recoup-Chat tailwind.config.ts for branding consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 5 - 9, The primary color in docs.json is incorrect:
update the "primary" value inside the "colors" object from "#0a0a0a" to the
branded value "#345A5D" so that entries using colors.primary (the "colors"
object and its "primary" key) match Recoup-Chat's tailwind.config.ts branding.

474-478: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Primary CTA still points at /keys and label was not updated.

Two issues on the same block:

  1. href still targets https://chat.recoupable.com/keys. As per coding guidelines, the canonical app URL is https://chat.recoupable.com. If this is the main app entrypoint, drop the /keys subpath.
  2. The AI summary states the label was changed from "Get API Key" to "Dashboard", but the file still shows "Get API Key". Either the summary or the code is stale — please reconcile.
🔗 Proposed fix (matches the AI summary intent)
     "primary": {
       "type": "button",
-      "label": "Get API Key",
-      "href": "https://chat.recoupable.com/keys"
+      "label": "Dashboard",
+      "href": "https://chat.recoupable.com"
     }

As per coding guidelines, Reference correct branding values: support email agent@recoupable.com, app URL https://chat.recoupable.com, website https://recoupable.com, and social URLs (X, GitHub, LinkedIn).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 474 - 478, The primary CTA object currently has an
incorrect href and stale label; update the "primary" object's href to the
canonical app URL "https://chat.recoupable.com" (remove the "/keys" path) and
change the "label" from "Get API Key" to "Dashboard" to match the AI summary,
and while editing confirm branding values in this block use the canonical app
URL and support email "agent@recoupable.com" (also ensure website and social
links elsewhere follow https://recoupable.com and the approved social URLs).

174-177: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the empty Instagram group from the navigation.

The pages array was emptied to drop broken Instagram entries, but the group object remains. Mintlify will still render an empty "Instagram" header in the sidebar with no child pages. Either remove the entire group object or repopulate it with real pages.

🧹 Proposed fix (drop the empty group)
           {
             "group": "Web intelligence",
             "pages": [
               "api-reference/research/instagram-posts",
               "api-reference/research/web",
               "api-reference/research/deep",
               "api-reference/research/people",
               "api-reference/research/extract",
               "api-reference/research/enrich"
             ]
           },
           {
             "group": "Spotify",
             "pages": [
               "api-reference/spotify/search",
               "api-reference/spotify/artist",
               "api-reference/spotify/artist-albums",
               "api-reference/spotify/artist-top-tracks",
               "api-reference/spotify/album"
             ]
           },
-          {
-            "group": "Instagram",
-            "pages": []
-          },
           {
             "group": "Social Scraping",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 174 - 177, Remove the empty navigation group object
for "Instagram" in docs.json (the object with "group": "Instagram" and an empty
"pages" array) so Mintlify won't render an empty sidebar header; alternatively,
if you intend to keep it, populate its "pages" array with valid page
entries—also ensure the surrounding JSON remains syntactically valid (no
dangling commas) after removing or updating the group.
🧹 Nitpick comments (1)
skills/recoup-api.mdx (1)

23-23: ⚡ Quick win

Add links to the referenced OpenAPI spec areas.

The sentence points readers to five spec areas (accounts, social, releases, research, content) but provides no links, leaving them to navigate elsewhere without guidance.

✏️ Suggested improvement
-For internal Recoup calls, see the OpenAPI specs grouped by area: accounts, social, releases, research, content.
+For internal Recoup calls, see the OpenAPI specs grouped by area:
+[accounts](/api-reference/accounts), [social](/api-reference/social), [releases](/api-reference/releases), [research](/api-reference/research), [content](/api-reference/content).

Adjust the paths to match the actual nav routes if they differ.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/recoup-api.mdx` at line 23, Add inline links for the five referenced
OpenAPI spec areas so readers can jump directly to each spec: update the
sentence that lists "accounts, social, releases, research, content" to convert
each area name into a link to its OpenAPI nav route (use the actual nav routes
for your docs site), e.g., link "accounts" -> accounts OpenAPI page, "social" ->
social OpenAPI page, etc.; ensure the anchor text matches the existing area
names and verify the paths resolve in the site navigation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs.json`:
- Around line 492-498: The footer's GitHub URL in footer.socials.github is
inconsistent with the navbar's canonical org; update footer.socials.github to
match the navbar value (replace "https://github.com/recoupable-com" with
"https://github.com/recoupable") so both navbar and footer use the same
canonical GitHub organization.

---

Duplicate comments:
In `@docs.json`:
- Around line 5-9: The primary color in docs.json is incorrect: update the
"primary" value inside the "colors" object from "#0a0a0a" to the branded value
"#345A5D" so that entries using colors.primary (the "colors" object and its
"primary" key) match Recoup-Chat's tailwind.config.ts branding.
- Around line 474-478: The primary CTA object currently has an incorrect href
and stale label; update the "primary" object's href to the canonical app URL
"https://chat.recoupable.com" (remove the "/keys" path) and change the "label"
from "Get API Key" to "Dashboard" to match the AI summary, and while editing
confirm branding values in this block use the canonical app URL and support
email "agent@recoupable.com" (also ensure website and social links elsewhere
follow https://recoupable.com and the approved social URLs).
- Around line 174-177: Remove the empty navigation group object for "Instagram"
in docs.json (the object with "group": "Instagram" and an empty "pages" array)
so Mintlify won't render an empty sidebar header; alternatively, if you intend
to keep it, populate its "pages" array with valid page entries—also ensure the
surrounding JSON remains syntactically valid (no dangling commas) after removing
or updating the group.

---

Nitpick comments:
In `@skills/recoup-api.mdx`:
- Line 23: Add inline links for the five referenced OpenAPI spec areas so
readers can jump directly to each spec: update the sentence that lists
"accounts, social, releases, research, content" to convert each area name into a
link to its OpenAPI nav route (use the actual nav routes for your docs site),
e.g., link "accounts" -> accounts OpenAPI page, "social" -> social OpenAPI page,
etc.; ensure the anchor text matches the existing area names and verify the
paths resolve in the site navigation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b921a00b-a819-4378-ba40-c62bb8c24c24

📥 Commits

Reviewing files that changed from the base of the PR and between 356ad69 and 848b665.

📒 Files selected for processing (2)
  • docs.json
  • skills/recoup-api.mdx

Adds the vercel-labs/add-skill CLI as the primary install method on
the Skills landing page. Works with Claude Code, Codex, OpenCode,
Cursor, and 50+ other agents — strictly better than the Claude-Code-
only `/plugin marketplace add` we had as the lead command.

Landing page (skills.mdx) Install section now reads:

  Install everything:   npx skills add recoupable/skills
  Install one skill:    npx skills add recoupable/skills --skill <name>
  Preview before:       npx skills add recoupable/skills --list

Plus flags (`-a claude-code`, `--global`, `-y`) and a link to the
full CLI reference. Marketplace and git-clone paths kept as
alternatives below.

Each skill page also gets a tiny `## Install` block right above
`## Source` with the per-skill command, so a reader who lands on
e.g. /skills/recoup-api can grab just that one.

Co-authored-by: Cursor <cursoragent@cursor.com>
sidneyswift and others added 5 commits May 5, 2026 22:08
A plugin is a different abstraction from a skill — it bundles multiple
skills + commands + agents into one installable workflow. The skills
repo and the plugins repo are distinct distribution surfaces (skills
install via `npx skills add`, plugins via `/plugin marketplace add`),
so they earn distinct nav surfaces.

New tab structure (placed right after Skills):

  Plugins
  ├── Overview ────────────── plugins (landing — what plugins are,
  │                            install paths for Claude/Codex/Cursor,
  │                            list of available plugins, how to build
  │                            and contribute)
  └── Available plugins
      └── music-catalog-diligence
                              (comprehensive single page — value prop,
                              audience, deal workspace structure, all
                              9 skills with trigger descriptions, all
                              6 slash commands, QC philosophy, source
                              link)

Plugin's internal skills (catalog-ingest, rights-diligence, royalty-
audit, etc.) are deliberately NOT listed in the main /skills tab.
Those are music-INVESTMENT skills (M&A diligence audience) and would
pollute the music-MAKING playbook navigation.

Verified: both new pages return HTTP 200, zero nav 404s, zero orphans.
Co-authored-by: Cursor <cursoragent@cursor.com>
content-creation.mdx had `title: "Content Creation"` while every other
skill page uses kebab-case matching its URL slug
(e.g. `title: "song-writing"`, `title: "music-industry-research"`).
That made it the visual outlier in the Skills sidebar — every other
entry rendered as kebab-case, "Content Creation" as Title Case.

Standardize on the existing pattern.

Co-authored-by: Cursor <cursoragent@cursor.com>
…le commands

The previous Install section had hand-wavy "add to your config" copy
for Codex and Cursor that I cannot find documented anywhere. The user
caught it: docs read by agents need literal commands or literal click
sequences, not config-talk.

Researched and documented the actually correct paths for each runtime:

- Claude Code: `/plugin marketplace add` + `/plugin install` (slash
  commands inside a session). Already correct, kept.
- Claude Cowork (NEW section): UI-only install via Claude Desktop's
  Cowork tab → Customize → Browse plugins → Install. Plugins save
  locally; require a paid Claude plan. No CLI path exists.
- Codex: `codex plugin marketplace add recoupable/plugins` is
  scriptable. The plugin install step itself currently goes through
  the interactive `codex /plugins` UI — no headless one-shot install.
- Cursor: marketplace UI for human-in-the-loop, OR scriptable manual
  install via `git clone` into `~/.cursor/plugins/local/<name>`. Note
  that Cursor doesn't follow symlinks there — must be a real copy.
  Reload the window after.

Lead-in to the section now also says explicitly that these are written
for the agent, with each path ending in a verifiable installed state.

Plugin page (music-catalog-diligence.mdx) gets a compact one-row-per-
agent table for the same four runtimes, linking back to the landing
page for prerequisites.

Sources:
- developers.openai.com/codex/plugins/build (Codex marketplace add)
- support.claude.com/en/articles/13837440-use-plugins-in-cowork
- code.claude.com/docs/en/plugin-marketplaces (Claude Code)
- cursor.com/docs/plugins (Cursor marketplace + local install)

Co-authored-by: Cursor <cursoragent@cursor.com>
…sor is manual-only

Real install paths verified against the published Cowork tutorial,
not against marketing claims of being in any curated marketplace.

Cowork (corrected — was completely wrong before):
- Path is Customize → Plugins → Add → paste the GitHub URL
- For us: https://github.com/recoupable/music-catalog-diligence
- Cowork pulls the folder, parses .claude-plugin/plugin.json, and
  installs. Updates auto-sync when we push to that repo.
- Source: https://claude.com/resources/tutorials/how-to-customize-plugins-in-cowork

Cursor (corrected — removed false marketplace claim):
- recoupable/music-catalog-diligence is NOT in cursor.com/marketplace
  (which is curated by the Cursor team)
- Only path today is `git clone` into ~/.cursor/plugins/local/<name>
  followed by a window reload
- Symlinks still don't work — must be a real copy
- Added a note on how to pull updates later (`git pull` + reload)

Claude Code and Codex sections unchanged — those use GitHub-shorthand
syntax against the registry repo, which works regardless of any
curated marketplace listing.

Lead-in clarified: the plugin is hosted at recoupable/music-catalog-
diligence on GitHub; each agent reads from that source differently.

Co-authored-by: Cursor <cursoragent@cursor.com>
Tested live end-to-end against Claude Cowork tonight. The actual UI
flow is:

  Customize > Plugins > [+] > Create plugin > Add marketplace
  > paste https://github.com/recoupable/plugins > Sync

(Earlier copy described an "Add" button and a single-plugin URL paste
that don't exist — the real menu has "Add marketplace", "Upload plugin",
and "Create with Claude". And the URL must point at a marketplace repo
with .claude-plugin/marketplace.json, not at a standalone plugin repo.)

The fix that made the install actually work landed on
recoupable/plugins/main as f048522: switched the music-catalog-
diligence source from a relative submodule path ("./music-catalog-
diligence") to a github source object ({"source":"github","repo":
"recoupable/music-catalog-diligence"}). Cowork doesn't recurse
submodules during marketplace sync, so the relative path resolved
to an empty folder and sync failed.

Per-plugin install table also updated to point at the marketplace
URL (not the standalone repo URL).

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
docs.json (2)

5-9: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restore the branded primary color.

#0a0a0a changes the site-wide primary accent away from the required Recoup brand color, so buttons, links, and other primary UI elements will render off-brand.

As per coding guidelines, docs.json: Use primary color #345A5D from Recoup-Chat tailwind.config.ts for branding consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 5 - 9, The primary color value in the colors block
(property "primary" inside the "colors" object) is incorrect; update the
"primary" entry from "#0a0a0a" back to the Recoup brand color "#345A5D" so that
buttons, links and other primary UI elements use the branded color specified in
Recoup-Chat's tailwind.config.ts.

481-485: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Point the primary CTA at the canonical app URL.

The navbar’s main CTA still targets /keys, but the branding spec defines https://chat.recoupable.com as the canonical app URL.

As per coding guidelines, docs.json: Reference correct branding values: support email agent@recoupable.com, app URL https://chat.recoupable.com, website https://recoupable.com, and social URLs (X, GitHub, LinkedIn).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 481 - 485, The primary CTA object ("primary" with
label "Get API Key") currently points to /keys; update its href to the canonical
app URL "https://chat.recoupable.com". While editing docs.json, also verify and
correct the branding entries to the required values: support email
"agent@recoupable.com", app URL "https://chat.recoupable.com", website
"https://recoupable.com", and the social URLs for X, GitHub, and LinkedIn to
match the branding spec.
🧹 Nitpick comments (2)
skills/trend-to-song.mdx (1)

2-2: ⚡ Quick win

Replace the slug-style title with a readable page title.

trend-to-song will surface as-is in the page header and search UI. A title like Trend to Song is clearer for readers.

As per coding guidelines, **/*.mdx: Use clear, self-documenting titles and descriptions in documentation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/trend-to-song.mdx` at line 2, The page frontmatter title is using a
slug-style value "trend-to-song" which appears verbatim in the header and search
UI; update the title in skills/trend-to-song.mdx frontmatter (the title field)
to a readable, self-documenting string such as "Trend to Song" so the page
header and search display a human-friendly title.
skills/streaming-growth.mdx (1)

2-2: ⚡ Quick win

Use a reader-facing title instead of the slug.

streaming-growth reads like an internal identifier in the page heading and search results. Prefer a human-facing title such as Streaming Growth.

As per coding guidelines, **/*.mdx: Use clear, self-documenting titles and descriptions in documentation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/streaming-growth.mdx` at line 2, Replace the reader-unfriendly
slug-style frontmatter title "streaming-growth" with a human-facing title (e.g.,
"Streaming Growth") in the file's frontmatter; update the title key value so the
page heading and search index use the clear, self-documenting string instead of
the slug.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/music-industry-research.mdx`:
- Line 2: Update the frontmatter title value to a human-readable, title-cased
string: replace title: "music-industry-research" with a title-cased label such
as title: "Music Industry Research" so the H1/tab label is clear and
self-documenting (look for the frontmatter `title` key in this file).

In `@skills/recoup-api.mdx`:
- Line 2: Update the frontmatter title value "title: \"recoup-api\"" to a
human-readable, title-cased string (e.g., "Recoup API") so the page label is
clear and self-documenting; locate the frontmatter title line in the
skills/recoup-api.mdx file and replace the kebab-case value with the title-cased
version.

---

Duplicate comments:
In `@docs.json`:
- Around line 5-9: The primary color value in the colors block (property
"primary" inside the "colors" object) is incorrect; update the "primary" entry
from "#0a0a0a" back to the Recoup brand color "#345A5D" so that buttons, links
and other primary UI elements use the branded color specified in Recoup-Chat's
tailwind.config.ts.
- Around line 481-485: The primary CTA object ("primary" with label "Get API
Key") currently points to /keys; update its href to the canonical app URL
"https://chat.recoupable.com". While editing docs.json, also verify and correct
the branding entries to the required values: support email
"agent@recoupable.com", app URL "https://chat.recoupable.com", website
"https://recoupable.com", and the social URLs for X, GitHub, and LinkedIn to
match the branding spec.

---

Nitpick comments:
In `@skills/streaming-growth.mdx`:
- Line 2: Replace the reader-unfriendly slug-style frontmatter title
"streaming-growth" with a human-facing title (e.g., "Streaming Growth") in the
file's frontmatter; update the title key value so the page heading and search
index use the clear, self-documenting string instead of the slug.

In `@skills/trend-to-song.mdx`:
- Line 2: The page frontmatter title is using a slug-style value "trend-to-song"
which appears verbatim in the header and search UI; update the title in
skills/trend-to-song.mdx frontmatter (the title field) to a readable,
self-documenting string such as "Trend to Song" so the page header and search
display a human-friendly title.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 323b940b-40f0-4fe1-bd3e-2af5db621ad2

📥 Commits

Reviewing files that changed from the base of the PR and between 848b665 and 77f404c.

📒 Files selected for processing (14)
  • docs.json
  • plugins.mdx
  • plugins/music-catalog-diligence.mdx
  • skills.mdx
  • skills/artist-workspace.mdx
  • skills/content-creation.mdx
  • skills/getting-started.mdx
  • skills/music-industry-research.mdx
  • skills/recoup-api.mdx
  • skills/release-management.mdx
  • skills/setup-sandbox.mdx
  • skills/song-writing.mdx
  • skills/streaming-growth.mdx
  • skills/trend-to-song.mdx
🚧 Files skipped from review as they are similar to previous changes (3)
  • skills/setup-sandbox.mdx
  • skills/song-writing.mdx
  • skills/content-creation.mdx

@@ -0,0 +1,30 @@
---
title: "music-industry-research"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use a human-readable title in frontmatter.

title: "music-industry-research" should be title-cased for a clearer H1/tab label.

✏️ Suggested fix
-title: "music-industry-research"
+title: "Music Industry Research"

As per coding guidelines, "Use clear, self-documenting titles and descriptions in documentation."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title: "music-industry-research"
title: "Music Industry Research"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/music-industry-research.mdx` at line 2, Update the frontmatter title
value to a human-readable, title-cased string: replace title:
"music-industry-research" with a title-cased label such as title: "Music
Industry Research" so the H1/tab label is clear and self-documenting (look for
the frontmatter `title` key in this file).

Comment thread skills/recoup-api.mdx
@@ -0,0 +1,33 @@
---
title: "recoup-api"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use a human-readable title in frontmatter.

title: "recoup-api" should be title-cased for clearer page labeling.

✏️ Suggested fix
-title: "recoup-api"
+title: "Recoup API"

As per coding guidelines, "Use clear, self-documenting titles and descriptions in documentation."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title: "recoup-api"
title: "Recoup API"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/recoup-api.mdx` at line 2, Update the frontmatter title value "title:
\"recoup-api\"" to a human-readable, title-cased string (e.g., "Recoup API") so
the page label is clear and self-documenting; locate the frontmatter title line
in the skills/recoup-api.mdx file and replace the kebab-case value with the
title-cased version.

Per-plugin install table was missing the 'Create plugin' submenu step
that the landing page already documents. Aligns the two surfaces so
both describe the actual UI flow: Customize > Plugins > + > Create
plugin > Add marketplace > paste URL > Sync.

Co-authored-by: Cursor <cursoragent@cursor.com>
@cubic-dev-ai
Copy link
Copy Markdown

cubic-dev-ai Bot commented May 6, 2026

You're iterating quickly on this pull request. To help protect your rate limits, cubic has paused automatic reviews on new pushes for now—when you're ready for another review, comment @cubic-dev-ai review.

sidneyswift and others added 4 commits May 5, 2026 23:45
…scription

A customer's agent reviewing prod docs hit null URLs trying to fetch
"Instagram Comments" and "Instagram Profiles" — the description text on
the apify scraper endpoint named them as if they were dedicated pages,
but main #163 deleted those pages on Apr 28.

Three lines in social.json mentioned them by name:

1. Endpoint description for /api/apify/runs/{runId}: now lists the
   actual surviving trigger endpoints (POST /api/social/scrape, POST
   /api/artist/socials-scrape) instead of legacy named endpoints.

2. runId parameter description: same fix.

3. Result-array description: clarified that the Apify "scraper type"
   (Instagram profile scraper, Instagram comments scraper, TikTok
   scraper) is what determines the response shape — these are upstream
   Apify scraper identifiers, not Recoup endpoint pages.

Fixes the customer's friction point #1: "A few endpoint URLs returned
null specifically the fans, social posts, and Instagram." The fans/
social/posts endpoints still exist (api-reference/fans/get,
api-reference/posts/get) — only the description text was misleading.

Co-authored-by: Cursor <cursoragent@cursor.com>
Customer-agent feedback called out "Credit costs were inconsistent —
one endpoint mentioned '5 credits per request' inline, but I had no
overall picture of the cost model. A credits reference table somewhere
in the index would be useful when evaluating which calls are cheap
to make frequently versus which should be cached."

New page at /credits, placed in the Overview > Start here group right
after Authentication so agents bootstrapping integration find it
immediately. Researched all costs against the api/ source code (full
findings + open questions in .local/plans/credit-check.md):

- Most research GET endpoints: 5 credits per successful call
- Research POST: web/people 5; extract 5×URLs; enrich 5/10/25 by
  processor; deep 25
- /api/image/generate: 15 credits (from $0.15 x402 price)
- POST /api/chat (streaming): variable, min 1 credit, computed as
  max(1, round(usage_usd × 100))
- Everything else free at the API layer (content, tasks, etc.)

Page also covers:
- How to check balance (GET /api/credits/get)
- Caching guidance (cheap vs expensive calls)
- How balance changes (success-only deduction; new-account starting
  credits intentionally not asserted because the API/chat values
  conflict in code — page directs readers to /api/credits/get for
  truth instead)
- Top-up flow (chat app billing — no API-only top-up yet)
- FAQ covering failed-call deductions, content endpoint billing
  status, scheduled tasks, and the double-deduct edge case in
  resolveTrack

Verified: page returns HTTP 200, brand fields preserved, nav reads
cleanly.

Open product questions logged in credit-check.md include the
25 vs 333 vs 1000 starting-credit conflict between API and chat
constants — flagged but not surfaced publicly until product aligns.

Co-authored-by: Cursor <cursoragent@cursor.com>
Customer-agent feedback: only one workflow-level guide existed
(workflows/create-artist) and they wanted more. The right architectural
move is to surface that guide as a skill rather than maintain a
parallel "workflows" concept — skills are the canonical agent-readable
playbook format.

Companion commit on recoupable/skills/main (7993be6) created the new
create-artist skill with the full 8-step API playbook:
https://github.com/recoupable/skills/tree/main/skills/create-artist

This commit completes the docs-side migration:

- New skills/create-artist.mdx page following the standard skill-
  summary format (When to use it, What it produces, Endpoints it uses,
  Install, Source). Linked to the new skill repo URL.
- Added skills/create-artist to the Skills tab > Setup group,
  alongside artist-workspace (they're complementary: artist-workspace
  handles workspace files, create-artist drives the 8-call API chain).
- Deleted docs/workflows/create-artist.mdx (16,663 bytes, 324 lines).
  All substantive content was migrated to the create-artist SKILL.md
  in the skills repo.
- Removed the empty Workflows nav group from the Artists tab.
- Updated agents.mdx "Choose your path" decision tree: the two table
  rows that linked to /workflows/create-artist now link to
  /skills/create-artist (the new home).
- Removed the empty workflows/ directory from the docs tree.

Audit confirms 152 nav entries, 0 404s, 0 orphans on disk.

The "Workflows" concept is now retired in the docs site. If we add
more guided workflows in the future, they'll live as skills (matches
the structure shipped earlier in this PR).

Co-authored-by: Cursor <cursoragent@cursor.com>
Previous commit (56902ba) used `git add -A` and accidentally picked
up two .md files from the local superpowers/ directory — those are
agent workspace state, not docs content.

This commit:
- Removes the two files from git tracking (--cached, files stay on
  disk locally)
- Adds .gitignore with `superpowers/` to prevent it happening again

Files removed:
- superpowers/plans/2026-04-28-content-api-artist-launch-video.md
- superpowers/specs/2026-04-28-content-api-artist-launch-video-design.md

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs.json (1)

502-505: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Footer GitHub URL should use the canonical organization handle.

footer.socials.github currently points to https://github.com/recoupable-com, but the canonical Recoupable organization is https://github.com/recoupable (matching the navbar link at line 475). The recoupable-com handle is stale and should be corrected.

Suggested fix
   "footer": {
     "socials": {
       "x": "https://x.com/recoupai",
-      "github": "https://github.com/recoupable-com",
+      "github": "https://github.com/recoupable",
       "linkedin": "https://www.linkedin.com/company/recoupable"
     }
   },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 502 - 505, Update the footer social link so it uses
the canonical GitHub organization handle: change the value of the
footer.socials.github entry (the JSON property "github" inside the
footer/socials object in docs.json) from "https://github.com/recoupable-com" to
"https://github.com/recoupable" to match the navbar GitHub URL.
♻️ Duplicate comments (2)
docs.json (2)

482-486: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Primary CTA href and label inconsistent with PR direction.

The branding guideline pins the canonical app URL to https://chat.recoupable.com, and the AI summary for this PR notes the primary button label was supposed to change to "Dashboard". The current state still has "Get API Key" pointing at chat.recoupable.com/keys, which contradicts both. Decide which is intended and align label + href.

As per coding guidelines, docs.json: "Reference correct branding values: support email agent@recoupable.com, app URL https://chat.recoupable.com, website https://recoupable.com, and social URLs (X, GitHub, LinkedIn)".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 482 - 486, The primary CTA in docs.json uses an
outdated label and href; update the "primary" object's "label" to "Dashboard"
and change its "href" to the canonical app URL "https://chat.recoupable.com" so
the label and link are consistent with the PR direction and branding; while
here, verify other branding values in docs.json (support email
agent@recoupable.com, website https://recoupable.com and social URLs) remain
correct.

5-9: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Primary color still off-brand.

#0a0a0a doesn't match the Recoup brand primary, which the coding guideline pins to #345A5D. This was raised previously and the value is still #0a0a0a in the current state.

Suggested fix
   "colors": {
-    "primary": "#0a0a0a",
+    "primary": "#345A5D",
     "light": "#ededed",
     "dark": "#0a0a0a"
   },

As per coding guidelines, docs.json: "Use primary color #345A5D from Recoup-Chat tailwind.config.ts for branding consistency".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 5 - 9, Update the primary color value in docs.json so
the "colors" -> "primary" entry uses the Recoup brand hex; locate the "primary"
key in the "colors" object and replace "#0a0a0a" with "#345A5D" to match
Recoup-Chat's tailwind.config.ts branding, ensuring the file now reflects the
mandated primary color.
🧹 Nitpick comments (3)
credits.mdx (2)

6-8: 💤 Low value

Source-of-truth phrasing risks staleness.

"as of the latest deploy" makes this page authoritative without a refresh mechanism. If the credits source changes (e.g., processor tiers shift in /api/research/enrich, chat formula changes, content endpoints become billed), this page silently lies. Consider either (a) linking to the source-of-truth file/repo for cost constants, or (b) adding a "Last verified: " line so consumers know the cadence.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@credits.mdx` around lines 6 - 8, The wording "as of the latest deploy" is
risky because it implies the page is authoritative without a refresh mechanism;
update credits.mdx to either link to the canonical source-of-truth (the
repo/file that holds the credit constants or the API endpoints like
/api/research/enrich and billing logic) or add a visible "Last verified: <date>"
line and a short note about verification cadence so readers know freshness;
locate and edit the paragraph that currently contains "as of the latest deploy"
and replace it with the chosen approach (link to source-of-truth file/repo or a
Last verified date and verification instructions).

100-114: ⚡ Quick win

Add an OpenAPI-backed reference for /api/credits/get.

This is the only documented credits endpoint and it's defined inline here rather than in api-reference/openapi/*.json. That's fine for narrative docs, but agents/users navigating from the API Reference tab won't find it. Consider adding it to the appropriate OpenAPI spec so it appears in the sidebar like the other endpoints, then linking from this page.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@credits.mdx` around lines 100 - 114, The /api/credits/get endpoint is only
documented inline in credits.mdx and must be added to the OpenAPI spec so it
appears in the API Reference; add an operation object for path
"/api/credits/get" in the appropriate OpenAPI JSON under api-reference/openapi
(include method GET, security requirements for x-api-key/Authorization,
request/response content types, and a response schema with properties
remaining_credits (integer) and account_id (string)), then update credits.mdx to
reference or link to that OpenAPI operation (or include an x-ref) so the
endpoint appears in the sidebar like other endpoints.
docs.json (1)

175-178: 💤 Low value

Remove the empty Instagram nav group.

A navigation group with no pages serves no purpose in the sidebar. Either drop the Instagram group entirely and reintroduce it when pages are ready, or if you want to preserve it as a placeholder, use "hidden": true instead.

Suggested fix
-          },
-          {
-            "group": "Instagram",
-            "pages": []
-          },
           {
             "group": "Social Scraping",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 175 - 178, Remove the empty navigation group entry
that has "group": "Instagram" with an empty "pages" array from the docs.json;
either delete that entire object or, if you want to keep a placeholder, add
"hidden": true to the same object so it doesn't appear in the sidebar (look for
the object containing "group": "Instagram" and "pages": [] to locate it).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@credits.mdx`:
- Line 140: Remove or replace the sentence that references the non-existent GET
/api/subscription/status endpoint and the isPro field in credits.mdx; either
delete that line or update it to reference the actual subscriptions flow (e.g.,
mention POST /api/subscriptions/sessions for creating a checkout session) or
point to the real status-check mechanism if one exists, ensuring you remove the
`isPro` claim and any endpoint that isn't present in the codebase.

---

Outside diff comments:
In `@docs.json`:
- Around line 502-505: Update the footer social link so it uses the canonical
GitHub organization handle: change the value of the footer.socials.github entry
(the JSON property "github" inside the footer/socials object in docs.json) from
"https://github.com/recoupable-com" to "https://github.com/recoupable" to match
the navbar GitHub URL.

---

Duplicate comments:
In `@docs.json`:
- Around line 482-486: The primary CTA in docs.json uses an outdated label and
href; update the "primary" object's "label" to "Dashboard" and change its "href"
to the canonical app URL "https://chat.recoupable.com" so the label and link are
consistent with the PR direction and branding; while here, verify other branding
values in docs.json (support email agent@recoupable.com, website
https://recoupable.com and social URLs) remain correct.
- Around line 5-9: Update the primary color value in docs.json so the "colors"
-> "primary" entry uses the Recoup brand hex; locate the "primary" key in the
"colors" object and replace "#0a0a0a" with "#345A5D" to match Recoup-Chat's
tailwind.config.ts branding, ensuring the file now reflects the mandated primary
color.

---

Nitpick comments:
In `@credits.mdx`:
- Around line 6-8: The wording "as of the latest deploy" is risky because it
implies the page is authoritative without a refresh mechanism; update
credits.mdx to either link to the canonical source-of-truth (the repo/file that
holds the credit constants or the API endpoints like /api/research/enrich and
billing logic) or add a visible "Last verified: <date>" line and a short note
about verification cadence so readers know freshness; locate and edit the
paragraph that currently contains "as of the latest deploy" and replace it with
the chosen approach (link to source-of-truth file/repo or a Last verified date
and verification instructions).
- Around line 100-114: The /api/credits/get endpoint is only documented inline
in credits.mdx and must be added to the OpenAPI spec so it appears in the API
Reference; add an operation object for path "/api/credits/get" in the
appropriate OpenAPI JSON under api-reference/openapi (include method GET,
security requirements for x-api-key/Authorization, request/response content
types, and a response schema with properties remaining_credits (integer) and
account_id (string)), then update credits.mdx to reference or link to that
OpenAPI operation (or include an x-ref) so the endpoint appears in the sidebar
like other endpoints.

In `@docs.json`:
- Around line 175-178: Remove the empty navigation group entry that has "group":
"Instagram" with an empty "pages" array from the docs.json; either delete that
entire object or, if you want to keep a placeholder, add "hidden": true to the
same object so it doesn't appear in the sidebar (look for the object containing
"group": "Instagram" and "pages": [] to locate it).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 60242eff-994e-4024-9f7f-148578de639b

📥 Commits

Reviewing files that changed from the base of the PR and between 77f404c and 237b621.

📒 Files selected for processing (4)
  • api-reference/openapi/social.json
  • credits.mdx
  • docs.json
  • plugins/music-catalog-diligence.mdx

Comment thread credits.mdx Outdated
…umbers

The previous version (237b621) listed exact credit costs per endpoint
(5 for research, 15 for image, etc.) which couples the docs to current
pricing logic in code. Per product call, we don't want to commit to
maintaining that table while the credits system has known
inconsistencies (signup amount differs between API and chat code paths;
new content endpoints are not yet wired into deduction).

The slim version keeps the page in nav and addresses the customer's
"no overall picture of the cost model" friction point in a way that
won't drift:

- Categorical "what's billed" table: research family billed, content
  generation billed, streaming chat billed, everything else free at
  the API layer
- "Treat /api/credits/get as the source of truth for both balance AND
  cost" — directs agents to call it before/after a request and use
  the delta as the actual deduction. Future-proof against pricing
  changes in code.
- How to top up (chat dashboard subscription via Stripe)
- Three FAQ items: how to know a specific cost (call /api/credits/get
  bracketed), scheduled tasks billing model, double-deduct edge case

156 lines -> 66 lines. Page still answers the customer's question
("which calls are cheap to make frequently versus which should be
cached") at the family level — research and content are the two
categories to cache; everything else is free.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs.json (1)

462-500: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix broken GitHub social link in footer.

The footer social link on line 498 points to https://github.com/recoupable-com, which does not exist (returns 404). The navbar link on line 470 correctly references https://github.com/recoupable, which is the canonical organization (confirmed by the repository remote origin github.com/recoupable/docs.git and all other codebase references). Update the footer social link to use the canonical org:

Diff
      "x": "https://x.com/recoupai",
-     "github": "https://github.com/recoupable-com",
+     "github": "https://github.com/recoupable",
      "linkedin": "https://www.linkedin.com/company/recoupable"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 462 - 500, The footer socials object contains an
incorrect GitHub URL; update the "github" value inside the JSON "footer" ->
"socials" object (the "github" key) from "https://github.com/recoupable-com" to
the canonical "https://github.com/recoupable" so it matches the navbar GitHub
link and the org used across the repo.
♻️ Duplicate comments (4)
docs.json (3)

477-481: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Primary CTA href still points to /keys instead of the canonical app URL.

Coding guidelines specify https://chat.recoupable.com as the canonical app URL for branding references. The CTA target should align with that unless a deep-link to /keys is intentional and documented elsewhere (in which case keeping the label "Get API Key" is fine, but you should verify /keys is a stable, public route on chat.recoupable.com).

Suggested fix
     "primary": {
       "type": "button",
       "label": "Get API Key",
-      "href": "https://chat.recoupable.com/keys"
+      "href": "https://chat.recoupable.com"
     }

As per coding guidelines, docs.json: "Reference correct branding values: support email agent@recoupable.com, app URL https://chat.recoupable.com, website https://recoupable.com, and social URLs (X, GitHub, LinkedIn)".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 477 - 481, The CTA in the "primary" object currently
uses a deep-link href "/keys" which doesn't match the canonical app URL; update
the "primary" object's href from "https://chat.recoupable.com/keys" to the
canonical app URL "https://chat.recoupable.com" (or, if a deep-link is
intentional, confirm /keys is a stable public route and document that decision),
referencing the "primary" object and its "label": "Get API Key" to locate the
change.

5-9: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Primary brand color still off-brand.

Per coding guidelines, colors.primary must be #345A5D for branding consistency with Recoup-Chat. Current value #0a0a0a (and dark: #0a0a0a``) leaves all primary UI affordances rendering as near-black instead of the brand teal.

Suggested fix
   "colors": {
-    "primary": "#0a0a0a",
+    "primary": "#345A5D",
     "light": "#ededed",
-    "dark": "#0a0a0a"
+    "dark": "#345A5D"
   },

As per coding guidelines, docs.json: "Use primary color #345A5D from Recoup-Chat tailwind.config.ts for branding consistency".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 5 - 9, Update docs.json to use the Recoup-Chat brand
teal: change colors.primary to `#345A5D` and replace the near-black colors.dark
value with a brand-consistent darker teal (or the exact darker shade used in
tailwind.config.ts) so UI affordances render in the correct brand colors; modify
the colors.primary and colors.dark entries accordingly.

175-178: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Drop the empty Instagram group — it renders as a dead sidebar entry.

This group has "pages": [], which produces an empty section header in the Research tab with no destinations. Per the PR's audit ("0 nav entries that 404; 0 orphan pages"), an empty group is still user-facing noise; remove the entry until Instagram pages exist.

Suggested fix
-          {
-            "group": "Instagram",
-            "pages": []
-          },
           {
             "group": "Social Scraping",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs.json` around lines 175 - 178, Remove the empty "Instagram" group object
(the entry with "group": "Instagram" and "pages": []) from docs.json so it no
longer renders an empty Research sidebar section; if you plan to add Instagram
pages later, reintroduce the group only when "pages" contains at least one page
entry.
credits.mdx (1)

53-53: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reference to GET /api/subscription/status and isPro is still unbacked by any spec.

This was already flagged on the previous revision — no subscription/status endpoint and no isPro field exist in the OpenAPI specs (the only documented subscription surface is POST /api/subscriptions/sessions). Either remove the sentence or replace it with the actual mechanism (e.g., point to the Subscriptions sessions flow, or /api/credits/get for limit-relevant signal).

Suggested fix
-Subscription status is reflected via `GET /api/subscription/status` — if `isPro` is `true`, the account is on the paid tier with higher monthly limits.
+After checkout completes, the subscription is tied to the same account your API key authenticates against; current balance and usage are visible via `GET /api/credits/get`.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@credits.mdx` at line 53, The sentence referencing GET
/api/subscription/status and the isPro field is incorrect because those API
surfaces don't exist in the spec; update credits.mdx to either remove that
sentence or replace it with the real mechanism — for example point readers to
POST /api/subscriptions/sessions for the subscriptions flow or to
/api/credits/get for limit-relevant signals, and ensure you remove any mention
of the nonexistent isPro field.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@credits.mdx`:
- Around line 27-30: The curl example in the "Check your balance" snippet uses
the wrong hostname; update the request URL in credits.mdx to use the canonical
API base (https://recoup-api.vercel.app) instead of https://api.recoupable.com
so it matches agents.mdx and index.mdx; ensure the example remains otherwise
unchanged (keep the -H "x-api-key: $RECOUP_API_KEY" header and the same endpoint
path /api/credits/get).

---

Outside diff comments:
In `@docs.json`:
- Around line 462-500: The footer socials object contains an incorrect GitHub
URL; update the "github" value inside the JSON "footer" -> "socials" object (the
"github" key) from "https://github.com/recoupable-com" to the canonical
"https://github.com/recoupable" so it matches the navbar GitHub link and the org
used across the repo.

---

Duplicate comments:
In `@credits.mdx`:
- Line 53: The sentence referencing GET /api/subscription/status and the isPro
field is incorrect because those API surfaces don't exist in the spec; update
credits.mdx to either remove that sentence or replace it with the real mechanism
— for example point readers to POST /api/subscriptions/sessions for the
subscriptions flow or to /api/credits/get for limit-relevant signals, and ensure
you remove any mention of the nonexistent isPro field.

In `@docs.json`:
- Around line 477-481: The CTA in the "primary" object currently uses a
deep-link href "/keys" which doesn't match the canonical app URL; update the
"primary" object's href from "https://chat.recoupable.com/keys" to the canonical
app URL "https://chat.recoupable.com" (or, if a deep-link is intentional,
confirm /keys is a stable public route and document that decision), referencing
the "primary" object and its "label": "Get API Key" to locate the change.
- Around line 5-9: Update docs.json to use the Recoup-Chat brand teal: change
colors.primary to `#345A5D` and replace the near-black colors.dark value with a
brand-consistent darker teal (or the exact darker shade used in
tailwind.config.ts) so UI affordances render in the correct brand colors; modify
the colors.primary and colors.dark entries accordingly.
- Around line 175-178: Remove the empty "Instagram" group object (the entry with
"group": "Instagram" and "pages": []) from docs.json so it no longer renders an
empty Research sidebar section; if you plan to add Instagram pages later,
reintroduce the group only when "pages" contains at least one page entry.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 94022814-4501-4c80-b2bc-906c63585a50

📥 Commits

Reviewing files that changed from the base of the PR and between 237b621 and 908dd1d.

📒 Files selected for processing (6)
  • .gitignore
  • agents.mdx
  • credits.mdx
  • docs.json
  • skills/create-artist.mdx
  • workflows/create-artist.mdx
💤 Files with no reviewable changes (1)
  • workflows/create-artist.mdx
✅ Files skipped from review due to trivial changes (1)
  • .gitignore

Comment thread credits.mdx
sidneyswift and others added 13 commits May 6, 2026 14:57
…-ups coming soon

Two changes after reviewing the rendered page in production:

1. Cut redundancy. The "call /api/credits/get before and after"
   message appeared four times across the page (lead, Check your
   balance, FAQ #1). Now lives once, in the lead. Removed:

   - FAQ #1 ("How do I know what a specific call costs?") — fully
     redundant with the lead.
   - FAQ #3 ("Why might one logical action deduct twice?") — surfaces
     an internal `resolveTrack` quirk that customers shouldn't need
     to know about, and would become wrong if we ever fix it.
   - "(artist management, sandboxes, sessions, ...)" parenthetical
     in the lead — the table's "Everything else" row already covers it.
   - "Call this before any sequence... bail out cleanly" filler in
     Check your balance.

2. Replace "Top up" with "Subscription". Old name implied one-time
   purchases work today, which they don't — only subscription via
   Stripe is implemented. New section:

   - Two-tier table (Free / Pro), both refill monthly
   - Concrete upgrade flow: chat.recoupable.com > Billing > Subscribe,
     including the 30-day trial detail
   - GET /api/subscription/status command to check current tier
   - Explicit "One-time top-ups: Coming soon" callout so anyone
     looking for a per-request top-up path understands the timeline

Specific monthly credit numbers (e.g. "333 free / 1000 pro") are
intentionally not stated. Production has a separate signup-vs-monthly
inconsistency in code that would make those numbers misleading on day
one for a new free account. The page directs readers to their actual
balance via /api/credits/get instead.

66 lines -> 76 lines on disk, but with notably more substance per
line and zero repetition.

Co-authored-by: Cursor <cursoragent@cursor.com>
The homepage subheader and lead paragraph framed Recoup narrowly as
"infrastructure for record labels." That misses the actual customer
range — distributors, catalog companies, management firms, and
independent artists all use Recoup, and they self-select away when the
landing page sounds label-only.

Changes:

- Description: "Infrastructure for agents to run record labels" -->
  "Infrastructure for agents to operate the music business"
- Lead paragraph: rewrite to enumerate the five real audiences in the
  "whether you're..." clause (indie artist, label, distributor,
  catalog company, management firm) and replace the closing "perform
  the work of a major label" with the more universal "do the work
  that used to take an entire team"

Kept the H1 "What is Recoup?" — the question framing supports an
expansive answer naturally, and the title doubles as the sidebar
label so it has to stay short.

Co-authored-by: Cursor <cursoragent@cursor.com>
Previous paragraph had two issues:

1. Two back-to-back lists (work types + audience types) made it
   feel listy. Now there's one list (work types), and the audience
   identification is a tight "whether you're..." preamble.

2. The closing claim — "captures context... so agents can do the
   work" — undersold what Recoup actually ships. Recoup is two
   layers: structured context AND the domain expertise + workflows
   that music professionals actually use day-to-day. The new
   paragraph names both with "not just the context (your catalog,
   artists, releases, fans), but the domain expertise and workflows
   that operate it day-to-day."

Also reframes Recoup as "the agent harness for the music business,
built by people who've done it" — a credibility-anchored positioning
line that earns the claim instead of stating it abstractly.

Co-authored-by: Cursor <cursoragent@cursor.com>
Said it wrong. Claiming the work is "the same" across an indie artist
and a major distributor reads as condescending — those businesses
operate at radically different scales and the work isn't the same,
even if some categories overlap.

Reframe: describe what each audience is doing ("you're juggling
research, content, marketing...") without claiming they're all doing
the same thing. The juggle metaphor names the volume problem
without flattening the differences.

Co-authored-by: Cursor <cursoragent@cursor.com>
Core concepts (Account / Organization / Artist) was the first H2 on
the homepage, sitting between the lead paragraph and "Get started."
That's a textbook interruption — readers landing on the page want
"what is this -> how do I try it -> what can it do," not "here are
our entity primitives" first.

The natural home is /authentication. That page already references all
three IDs (account_id, organization_id, artist_account_id) under
"Access control" but doesn't define what the entities actually are
first — readers had to guess.

Changes:

- index.mdx: remove ## Core concepts and its table. Homepage now flows
  lead -> Get started -> Three interfaces -> What's in the API -> ...
  with no textbook-y interruption.
- authentication.mdx: add ## Concepts (with the same table) right
  before "Create a key" — readers see the entity types BEFORE learning
  to authenticate against them. Reading order: entities -> get a key
  -> use a key -> scope across organizations -> access control rules.
- Same change broadens the Organization definition from "A label or
  team that groups multiple accounts" to "A label, distributor,
  catalog company, management firm, or team that groups multiple
  accounts" — matches the audience framing on the new homepage lead.

Co-authored-by: Cursor <cursoragent@cursor.com>
The Base URL on the homepage still showed
https://recoup-api.vercel.app/api after main #180 ("default base URL
to api.recoupable.com") had already standardized the canonical
hostname. Most pages on the docs branch had been updated during the
PR #189 merge, but several stragglers still pointed at the Vercel
preview URL.

Replaced 27 occurrences across 8 files:

  index.mdx (3x)              — Base URL section, AI agent Info
                                callout, "For AI agents" footer
  authentication.mdx (2x)     — Use a key + Bearer tokens curl
                                examples
  agents.mdx (8x)             — Choose-your-path curls (signup,
                                verify, list artists, list orgs, list
                                sandboxes, file read, file upload,
                                Base URL footer)
  quickstart.mdx (9x)         — Every numbered curl example
  content-agent.mdx (1x)      — endpoint reference
  skills/recoup-api.mdx (1x)  — when-to-use trigger phrase
  api-reference/openapi/ai.json (1x)         — server URL
  api-reference/openapi/content.json (2x)    — server URLs

Validated: both touched OpenAPI specs still parse as valid JSON.
All 6 affected pages return HTTP 200.

Note: the recoup-api SKILL.md in recoupable/skills still references
the Vercel hostname. That's a parallel source-of-truth and per the
no-other-repo-changes constraint, not updated here. Worth a follow-up
PR on the skills repo to keep them aligned.

Co-authored-by: Cursor <cursoragent@cursor.com>
Verified across five independent tests today (OpenAPI param check,
control vs known-fake endpoint, comparison vs known-working endpoints,
wide source grep, multi-domain probe) that GET /api/comments has no
handler in the API source code. Both api.recoupable.com and
recoup-api.vercel.app return 404 — same response shape as a known-
fake endpoint, distinct from real protected endpoints which return
401 unauthenticated.

The page has been live on production docs (developers.recoupable.com/
api-reference/comments/get currently returns HTTP 200), advertising
an endpoint that doesn't exist. Plausibly one of the "URLs returned
null" friction points sweetman's agent reported in the customer
review last night — the agent saw "Get Comments" in the sidebar,
derived the URL pattern, hit it, got nothing back.

Three-location cleanup, all docs-only:

- api-reference/openapi/social.json: removed the /api/comments path
  entry from the spec
- api-reference/comments/get.mdx: deleted (was 5-line frontmatter-only
  stub auto-generating from the now-removed spec entry)
- docs.json: removed "api-reference/comments/get" from the Artists
  tab > Fans & Posts group

Sibling group entries Get Artist Fans (GET /api/artists/{id}/fans)
and Get Artist Posts (GET /api/artists/{id}/posts) verified working
and remain in the nav.

Audit: 151 nav entries, 0 404s, social.json + docs.json both
re-validated as parseable JSON, /api-reference/comments/get correctly
404s on dev (was 200 before).
Spotted by a rendered-page review. Two pages had outdated or
misleading content that needed correction:

index.mdx:

- "any of the 40+ endpoints" -> "130+ endpoints" (actual: 137 across
  all 7 OpenAPI specs)
- "running a label" -> "running a music business" (matches the
  homepage lead paragraph that was already broadened)
- Artists card: removed "and comments" — that endpoint was deleted
  in f896bc7 because it has no API handler. Card now reads "browse
  fans and posts"
- Artists / Catalog cards: "your label" -> "your roster" (consistent
  with broader audience framing)
- Content card: "7 endpoints" -> "11 endpoints" (7 primitives +
  create, estimate, validate, templates)
- Quickstart bullet vs Quickstart Guides card: now both say "Under
  a minute" (was inconsistent — one said "~5 minutes")
- For AI agents OpenAPI table: added rows for ai.json (added by
  main #177) and sessions.json (added by main #185-187). Was
  missing 2 of 7 specs.

mcp.mdx:

- Reframe the "Org-scoped keys can target any account... Personal
  API keys can only operate on their own data" callout. The phrasing
  implied two key types exist, which is wrong — there's only one
  key type, and access is determined by the OWNER ACCOUNT's
  organization membership. New phrasing matches /authentication's
  access rules and explicitly says there's no separate "org-scoped"
  key type. Links out to /authentication#access-control for the
  full ladder.
Numbers in cards just become things to maintain (and get wrong).
Several were already off when caught — "40+ endpoints" was actually
137; "7 endpoints" was actually 11. The number was never the
information a reader needed; what each section DOES is.

index.mdx:
- REST API card: "any of the 130+ endpoints" -> "any of them"
- Chat card: dropped "11 endpoints"
- Research card: dropped "31 endpoints"
- Content card: dropped "11 endpoints — 7 creative primitives plus
  full-pipeline..." structure; rewrote as a fluid description of
  what's available

mcp.mdx:
- Frontmatter description: "40+ Recoup tools" -> "the full Recoup
  tool catalog"
- Tool catalog intro: "exposes 40+ tools organized by domain" ->
  "Tools are organized by domain"

Net: descriptions lead with capability, not arithmetic.
…search

Followup to ff66c3b. Sweep caught more endpoint-count claims in
quickstart.mdx and skills/music-industry-research.mdx that weren't
in the previous round.

quickstart.mdx (4 places):
- "The research API has 30+ endpoints" -> dropped
- "all 40+ endpoints" -> "the full Recoup tool catalog"
- Research card: "30+ endpoints — metrics across..." -> "Metrics
  across..."
- Content card: "7 endpoints for images, videos..." -> "Images,
  videos..."

skills/music-industry-research.mdx (1 place):
- "All of [Research] (31 endpoints)" -> "All of [Research]"

Final sweep returns zero remaining count claims across all .mdx files.
Two cuts:

1. The "Treat GET /api/credits/get as the source of truth..." paragraph
   was over-explaining. The "Check your balance" section already shows
   the curl — readers don't need a meta-paragraph telling them to
   "treat" something as the source of truth. They'll just use it. The
   sentence about hard-coded numbers drifting was author-side editorial
   that doesn't help the reader.

2. The "Common questions" section only had one entry (scheduled tasks
   billing) — and that's not actually a common question. Cut it.

Page is now 76 lines -> 65 lines, one fewer section header, no
redundant lead-in. Reader path is: what's billed -> check your balance
-> subscription. Done.
Earlier in this PR (56902ba) we deleted docs/workflows/create-artist.mdx
and converted the content into a sibling skill at /skills/create-artist.
That worked architecturally — but the recoup-api SKILL.md in
recoupable/skills (already shipped, in production) hard-codes the URL
https://developers.recoupable.com/workflows/create-artist as the
canonical "fetch this for the full curl-by-curl playbook" reference
when an agent is creating a new artist.

When this PR lands, that link 404s, breaking every agent that loads
the recoup-api skill. Per the no-other-repo-changes constraint we set
this morning, the right fix is to restore the docs page rather than
update the skill.

Restored docs/workflows/create-artist.mdx verbatim from origin/main
(319 lines — the canonical 8-step curl playbook with throwaway-account
warning, RECOUP.md scaffold, resume pattern, and platform key
reference). Added a "Workflows" group at the top of the Artists tab
in docs.json so the page is also discoverable from the sidebar.

Both pages now coexist by design:

- /workflows/create-artist — full curl playbook (the URL the
  recoup-api skill points at; backward-compat surface for agents)
- /skills/create-artist — skill-summary page in the Skills tab
  (discovery surface for users browsing the Skills system; links to
  the recoupable/skills repo for the playbook source)

When/if recoup-api SKILL.md gets updated in the skills repo to point
at /skills/create-artist instead, this workflow page can be revisited.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant