diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..01e741d --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": ["next/core-web-vitals"], + "ignorePatterns": [".next/", "node_modules/", "public/"] +} diff --git a/.gitignore b/.gitignore index b3bbe81..05c8407 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,9 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# playwright e2e +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/ARTICLES.md b/ARTICLES.md new file mode 100644 index 0000000..76adb00 --- /dev/null +++ b/ARTICLES.md @@ -0,0 +1,506 @@ +# ARTICLES.md — Content Concept Backlog + +Running list of article/content concepts, each upgraded to its best shippable version. Format: + +``` +**Hook:** ← the working title / headline (stands alone to a cold reader; outcome-led where possible) +**Description:** ← what the article covers, including the takeaway artifact it ships +**Value:** ← one sentence: WHO it's for + HOW it helps them +**Deliverable:** ← the concrete free artifact to ship + the funnel CTA (this is the lever made real) +**Value Score:** ← 1–5 (see scale); set to the realistic ceiling for this concept +**From:** ← internal sourcing only (never surfaced in the published piece) +``` + +**Value Score scale:** 5 = flagship; broad reach, strong proof, dead-on strategy. 4 = strong, clear single audience, real receipts. 3 = solid but niche (its honest ceiling). 2 = needs fact-clearing first. 1 = weak/risky. + +**The funnel the deliverables run (from the `referances/` teardowns).** Every reference company (Every, pm-world, Tenex) runs the same move: *teach something genuinely useful, and make the teaching double as proof, product, and positioning.* The content never opens with "buy our thing" — it opens with a lesson, and the lesson sets up the product or the consulting conversation. The levers each `Deliverable:` draws on: +- **L1 — Ship a takeaway artifact** (template / checklist / prompt-pack / calculator). A read becomes a saved tool → SEO, shares, lead magnet. *(Every's guides, Tenex's playbooks, pm-world's free prompts.)* +- **L2 — Embed the product as the payoff** ("…or the skill does this in one command"). *(pm-world: every post is the product changelog.)* +- **L3 — Lead with the outcome + real receipts.** *(pm-world's outcome headlines; Tenex's specific-mechanic testimonials.)* +- **L4 — Use our own label as proof** (real Gatsby Grace numbers — unfakeable). *(Every's "how we run a company on agents.")* +- **L5 — Coin the vocabulary** so readers adopt our word for it. *(Tenex's "AI-absent → AI-native.")* +- **L6 — End on the right funnel rung:** free `npx skills add recoupable/skills` → newsletter/membership → qualified "run this for your roster" label call. +- **L7 — Earn the expert conversation:** frame so a label finishes reading thinking "I want them to run this for us." + +**Editorial rules:** +- **One reader per article** (sections are grouped by audience). +- **No naked jargon in a hook;** expand acronyms once; cut tool names from titles unless the audience is engineers. +- **No internal references in reader-facing text** (PR/issue IDs, file paths, codenames stay in `From:`). +- **⚠ = a pre-publish gate:** state the timeframe/subject and confirm it's cleared to share before shipping. +- **Name competitors only on purpose:** Every / pm-world / Tenex are our reference teardowns — name + link them only when the article is explicitly about them. + +**Glossary (defined once):** +- **Gatsby Grace** — the artist we run in-house as our live testbed; most "build-in-public" pieces are her campaigns. +- **"Dead" / retired song** — a song with low engagement we've stopped actively promoting (vs. a proven winner we lean into). +- **Skill** — an installable AI-agent capability pack; users add ours with `npx skills add recoupable/skills`. +- **Scroll-stopper (video hook)** vs. **the musical hook (best 15s of a song)** — two different "hooks"; never use the bare word for both. +- **The reference trio** — Every, pm-world, Tenex: companies whose funnels we tore down as models for selling AI expertise. + +--- + +## Build-in-Public — Running a Label on Agents *(flagship series)* + +**Hook:** How we run a record label on AI agents +**Description:** The anchor + hub for the whole series: one artist (Gatsby Grace) operated end-to-end by AI agents — video creation, scheduling, analytics, captions, monthly reporting. Real prompts and workflows, not just the story, with each subsystem linking to its own deep-dive below. +**Value:** For music founders and label operators curious about AI — proves "agent-run label ops" is real with a working example they can copy. +**Deliverable:** A one-page "AI label org chart" diagram showing which agent owns which job (L1), kept updated like a changelog (pm-world); closes with the free skills repo *and* a "want this set up for your roster?" label call (L6/L7). +**Value Score:** 5 +**From:** PROGRESS 2026-06-08 → 2026-06-11 Gatsby Grace thread; `referances/every/COPY.md` (the "run a company on agents" format — keep the comparison internal unless deliberately cited). + +--- + +**Hook:** A month of TikToks, 30 different openings, zero repeats — built by one agent +**Description:** How we went from one static "sit and stare" template to 30+ distinct scroll-stoppers (a rain-streaked window, a sparkler macro, confetti frozen mid-air) in a month. Each scene is a reusable prompt recipe; we name and share the recipe format so readers can build their own library. +**Value:** For artists and content marketers — shows how to escape same-y AI video and generate a month of varied content from one system. +**Deliverable:** A free "scene recipe" starter pack — the prompt format + 10 worked examples to copy (L1, L5 vocabulary); closes with "the content skill generates these for your artist" (L2/L6). +**Value Score:** 5 +**From:** PROGRESS 2026-06-11 "viral hook engine". Scene codenames → plain descriptions; `hook-plan.json` stays internal. + +--- + +**Hook:** We found the catchiest 15 seconds of each of our songs — by watching the data +**Description:** We fingerprinted a month of our own posts, matched them to performance, and found each song had ONE section we kept reusing because it worked. How "which 15 seconds do we clip?" became a data decision instead of a guess — with the real before/after engagement lift on our own songs. ⚠ scope the claim to *our* songs; state the sample size. +**Value:** For artists and managers — a repeatable way to find the most clippable moment of a song instead of guessing. +**Deliverable:** A "find your clip section" checklist (L1) + the real Gatsby Grace before/after as proof (L3/L4); closes with the song-hook skill as the automated version (L2). +**Value Score:** 5 +**From:** PROGRESS 2026-06-09 "top-3-song batch pipeline + section audit". Song shorthand → real or anonymized titles. + +--- + +**Hook:** A third of our posting queue was promoting the wrong songs — so we cancelled it +**Description:** We audio-fingerprinted 56 scheduled posts to see which songs they actually promoted and found ~21 pushing songs we'd already retired, while our best-performing song had zero posts queued. Queue hygiene as a recurring habit, not a one-off. +**Value:** For label content teams — a check that stops you spending reach on the wrong songs. +**Deliverable:** A "content-queue audit" checklist readers run on their own calendar (L1); embeds the audit skill (L2). Hook now leads with the outcome (L3). +**Value Score:** 4 +**From:** PROGRESS 2026-06-08 "brainrot bedroom video + queued-post song audit". Drop "fpcalc"; "retired song" per glossary. + +--- + +**Hook:** The monthly report our agent writes about its own content +**Description:** The full reporting loop: collect every post's live stats across TikTok/Instagram/YouTube, aggregate, and auto-generate a shareable performance report — no analyst in the loop — leading with the real report and the platform-split finding that changed where we post. ⚠ confirm the headline view count + platform %s are cleared, with timeframe + artist stated. +**Value:** For label operators — shows how to replace manual monthly reporting with an agent that compiles it for you. +**Deliverable:** The real report embedded as the artifact (sample/screenshot) (L3/L4); offers "get this report for your artist" via the weekly-brief skill or a label call (L2/L7). +**Value Score:** 5 +**From:** PROGRESS 2026-06-08 "monthly social progress report". Cut the vendor name from reader copy. + +--- + +**Hook:** Our strategy meeting is just a transcript — the agent does the rest +**Description:** We record the human strategy call, then an agent turns the transcript into a content plan: which songs to concentrate on, which to retire, the template to lock, and who owns what. The thinking stays human; the synthesis and execution are automated. The pattern generalizes to any ops meeting. +**Value:** For founders and managers — a concrete pattern for turning meetings into executed plans without manual note-wrangling. +**Deliverable:** The actual "transcript → plan" prompt as a copy-paste artifact (L1/L2) + the real meeting-to-plan example (L4). +**Value Score:** 5 +**From:** PROGRESS 2026-06-08 "next-month content plan"; 2026-04-02 "Two new skills from Alexis x Sid meeting transcript". Introduce participants with one-line roles or anonymize. + +--- + +**Hook:** A month posted on autopilot, 5 a day, zero double-posts +**Description:** The scheduling system that keeps an existing queue intact, fills the open daily gaps to hit 5/day, never double-posts, spaces posts apart, and won't re-post the old archive. The unglamorous reliability work that makes "set it and forget it" actually safe. +**Value:** For social/content managers — a blueprint for reliable automated scheduling that won't embarrass you. +**Deliverable:** A scheduling-rules checklist (cadence, spacing, dedupe) as the takeaway (L1); embeds the scheduler skill (L2). Hook leads with the outcome (L3). +**Value Score:** 4 +**From:** PROGRESS 2026-06-11 "interleave full month of new content to 5/day". Replace "idempotent" with "never double-posts." + +--- + +**Hook:** The 2-second cut: why faster camera changes hold attention +**Description:** We re-edit AI-generated clips into a fast A/B/A/B alternating cut (no regeneration, just pacing) and it became our default because it held viewers longer — with the real retention before/after. ⚠ the retention number is the whole piece; get it or this stays a hypothesis. +**Value:** For short-form video creators — a one-change editing tweak that measurably improves watch-through. +**Deliverable:** The exact cut pattern as a copyable recipe (L1) + the real retention before/after (L3/L4). +**Value Score:** 4 +**From:** PROGRESS 2026-06-08 "faster bedroom cross-cut". "ffmpeg" → "stitched together" for a creator audience. + +--- + +## For Artists & Managers — Growth, Craft & Content + +**Hook:** What it actually costs to get an artist to 1,000 monthly Spotify listeners +**Description:** Real campaign benchmarks for the first milestone that unlocks Spotify's own promo tools — playlist-pitch spend, cost per click, click-to-listen rate — plus the three paths (playlist pitching, social-to-DSP ads, organic) and when to use each. ⚠ confirm the dollar figures are real and cleared. +**Value:** For new/early artists and their managers — a budgeted, no-fluff plan to hit the first threshold that matters. +**Deliverable:** A downloadable budget calculator/template — enter your numbers, get a plan (L1, a high-intent ranking lead magnet); ends with the streaming-growth skill + newsletter (L6). +**Value Score:** 5 +**From:** PROGRESS 2026-04-02 "artist-growth-threshold skill" + `skills/skills/streaming-growth/SKILL.md`. Define Showcase/Marquee/Popularity in-line. + +--- + +**Hook:** Spotify gates its best growth tools behind these exact numbers +**Description:** The threshold ladder: 1,000 monthly listeners unlocks Showcase (in-app ads), 5,000 unlocks Marquee (full-screen recs), and a Popularity score of ~50 is where the algorithm starts boosting you for free. The goal isn't "more streams" — it's clearing the next gate. +**Value:** For independent artists — turns vague "grow my streams" into specific, unlockable targets. +**Deliverable:** The canonical reference table + a "where am I / what's my next gate" self-locator readers place themselves on (L1/L5 — name the ladder); links to the growth skill (L2). Evergreen SEO asset. +**Value Score:** 5 +**From:** `skills/skills/streaming-growth/SKILL.md`. Reconcile the exact numbers with the sibling growth articles. + +--- + +**Hook:** Anatomy of a $500 playlist push +**Description:** One real campaign, fully itemized up front: the spend, playlists pitched, how many added the track, combined follower reach, and where the Popularity score landed — plus what a pitch brief needs (specific subgenre, 3 comparables, the mood/moment, one differentiator). ⚠ state whose campaign + when; confirm shareable. +**Value:** For DIY artists deciding whether to pay for playlist pitching — real receipts to set expectations. +**Deliverable:** A fill-in pitch-brief template (L1); the full itemized result leads the piece (L3 — receipts are the entire draw). +**Value Score:** 5 +**From:** `skills/skills/streaming-growth/SKILL.md` (Path 1 benchmarks, Q1 2026). + +--- + +**Hook:** The playlists similar artists are on — and you aren't +**Description:** The gap-analysis move, as a do-it-by-hand walkthrough you can finish today: list artists slightly bigger than you, pull their current placements, and target the playlists hosting two or more of them — your warmest pitches. Plus how to spot a song that's playlisted but not converting to streams. +**Value:** For artists and managers planning a pitch — a concrete target list instead of cold-emailing curators. +**Deliverable:** The step-by-step gap-analysis the reader runs manually (L1), then "the playlist-intelligence skill builds this target list for you" (L2/L6). +**Value Score:** 5 +**From:** `skills/plugins/recoup-research/skills/recoup-playlist-intelligence/SKILL.md`. + +--- + +**Hook:** Turn a trend into a song in 72 hours +**Description:** The reverse-engineering pipeline: spot a cultural moment, distill the emotion driving it, generate a song around it, and run a small test campaign on real artist pages to see if it sticks. With one real trend→song run and its outcome. ⚠ distribution uses real pages/test ads — never burner accounts (reconcile with the ethics piece). +**Value:** For artists/managers chasing cultural relevance — a framework for riding a moment before it passes. +**Deliverable:** The named trend→song framework as a repeatable artifact (L1/L5) + one real worked example (L3/L4). +**Value Score:** 4 +**From:** PROGRESS 2026-04-02 "trend-to-song skill". Resolve the burner-pages contradiction; attribute or anonymize the quote. + +--- + +**Hook:** Stop spraying songs across your whole catalog. Concentrate fire. +**Description:** The pivot from posting a little about everything to going all-in on 3–4 proven winners and formally shelving the ones that aren't landing — "concentrate fire" as a named discipline — using engagement-per-song as the call, balanced against gut conviction on small samples. +**Value:** For managers running an artist's content — a focus discipline that compounds reach instead of diluting it. +**Deliverable:** The engagement-per-song scoring method as a template (L1) + "concentrate fire" as the coined term (L5); our own roster pivot as proof (L4). +**Value Score:** 5 +**From:** PROGRESS 2026-06-08 content plan + 2026-06-09 engagement analysis. + +--- + +**Hook:** Run your lyrics through the 7 C's before you record +**Description:** A songwriting checklist — Concept, Clever, Clear, Concise, Catchy, Consistent, Conversational — with quick tests (can someone sing the chorus back after one listen? would you actually say this line out loud?). Draft, score against the 7, revise the failures. ⚠ note whether the 7 C's are ours or established. +**Value:** For songwriters — a fast, repeatable rubric to pressure-test a song before studio time. +**Deliverable:** A printable/saveable 7 C's card as the artifact (L1 — evergreen SEO + shares); notes the songwriting skill scores a draft against all 7 for you (L2). +**Value Score:** 5 +**From:** `skills/skills/song-writing/SKILL.md`. + +--- + +**Hook:** AI captions that actually sound like the artist +**Description:** The trick isn't "make it engaging" — it's feeding the model the artist's real voice: their saved brand guide plus their actual recent posts, then writing in that register. Voice as data, not adjectives — with a generic-vs-voiced before/after on a real post. +**Value:** For artists and social managers — stops AI captions from sounding generic and off-brand. +**Deliverable:** A fill-in "voice profile" template (L1) + the before/after example (L3); embeds the caption skill as the doer (L2). +**Value Score:** 5 +**From:** `skills/plugins/recoup-content/skills/recoup-brand-voice-caption/SKILL.md`. + +--- + +**Hook:** 15–30 posts per song: the clip-family playbook +**Description:** Modern release pushes need volume that still feels cohesive: a mix of short videos, lyric/quote cards, a carousel, and a Spotify Canvas loop — all one consistent "family," biased toward where the song's actual fans are. The recipe, the ratios, and a real release as the worked example. +**Value:** For artists/managers planning a release — a concrete content plan that scales without looking spammy. +**Deliverable:** An asset-mix template/ratios release planner (L1) + a real Gatsby Grace release walkthrough (L4); embeds the content-pack skill that generates the family (L2). +**Value Score:** 5 +**From:** `skills/plugins/recoup-content/skills/recoup-content-pack/SKILL.md`. Define "Canvas" (Spotify). + +--- + +**Hook:** Only trend-jack with receipts +**Description:** Trend-jacking — hijacking a current moment for content — works best when it's tied to a *real* trigger: the artist just crossed a streaming milestone, landed a flagship playlist, got a TV/film sync, or entered a chart, not a vibe. How to gate reactive content on a verifiable event ("trigger-gated content"). +**Value:** For social managers — keeps "react fast" content credible and on-brand instead of forced. +**Deliverable:** A trigger checklist (L1) + "trigger-gated content" as the coined term (L5); embeds the trend-jack skill that watches for the trigger and drafts the reaction (L2). +**Value Score:** 4 +**From:** `skills/plugins/recoup-content/skills/recoup-trend-jack/SKILL.md`. Gloss "trend-jack" in the first line. + +--- + +**Hook:** The Monday brief that actually gets opened +**Description:** One-shot research dumps die unread; a short weekly brief that leads with *what changed since last week* gets opened every time. How we build the "what's new with this artist" update by comparing this week's numbers to last week's — with an anonymized real sample. +**Value:** For managers tracking an artist — a recurring artifact that replaces dashboards nobody checks. +**Deliverable:** A brief template + the anonymized real sample (L1/L4); embeds the weekly-brief skill that writes it every Monday (L2/L6). +**Value Score:** 5 +**From:** `skills/plugins/recoup-research/skills/recoup-weekly-brief/SKILL.md`. Translate "diffed/delta" to "what changed." + +--- + +**Hook:** How to read TikTok data honestly (and spot the vendors who fake it) +**Description:** Nobody can give you a true per-song TikTok stream count — the data isn't exposed. So instead of inventing a number, we build a *signal* view from the activity that IS visible and label it as such. A buyer's guide to what TikTok data can and can't tell you — and how to catch a vendor who pretends otherwise. +**Value:** For artists/managers (and anyone buying music data) — sets honest expectations and positions us as the trustworthy source. +**Deliverable:** A "signals to actually track" checklist (L1); the honesty frame positions us as the expert worth trusting (L7). +**Value Score:** 4 +**From:** `skills/plugins/recoup-research/skills/recoup-tiktok-per-song/SKILL.md`. + +--- + +**Hook:** Find the A&R, enrich the contact, draft the pitch — in one workflow +**Description:** A&R = the label scouts who sign artists. The full outreach loop: search for the right person, pull their role/tenure/recent signings from the web, and draft a pitch grounded in the artist's real numbers — replacing a CRM subscription with an agent. +**Value:** For managers and indie artists pitching themselves — research and reach decision-makers without paid contact databases. +**Deliverable:** A "research a contact in 5 minutes" mini-guide + an outreach template (L1); embeds the people-outreach skill that does search→enrich→draft (L2). +**Value Score:** 4 +**From:** `skills/plugins/recoup-research/skills/recoup-people-outreach/SKILL.md`. Expand A&R. + +--- + +## For Labels & Catalog Buyers — Deals, Valuation & Release Ops + +**Hook:** What's that catalog worth? You don't need the seller's books to find out +**Description:** A defensible valuation from public streaming data alone: measure real streams, convert to the owner's actual keep (Net Label Share — what's left after distribution and artist royalties), apply a market multiple, and label every assumption. Each real royalty statement you later get tightens the estimate. +**Value:** For catalog buyers/investors doing early diligence — a pre-deal value range before the seller shares anything. +**Deliverable:** A valuation worksheet/calculator as the artifact (L1 — our highest-intent lead magnet); ends with the estimator skill + "want us to run diligence on a live deal?" (L7). +**Value Score:** 5 +**From:** `skills/skills/catalog-value-estimator/SKILL.md` + `references/methodology.md`. Define NLS once. + +--- + +**Hook:** Don't just multiply last year's royalties: the quality-of-earnings bridge +**Description:** "Trailing revenue × multiple" overpays. The bridge to *sustainable* earnings strips one-time syncs, viral/playlist spikes, accounting catch-ups, and non-repeating performance-org (PRO) bonuses, then adjusts for unrecouped balances and missing registrations. A worked example. +**Value:** For catalog acquirers and financiers — a discipline that prevents overpaying on inflated headline numbers. +**Deliverable:** The bridge as a fill-in worked spreadsheet template (L1); positions Recoup as the diligence experts who run it for you (L7). +**Value Score:** 5 +**From:** `skills/plugins/recoup-deals/skills/recoup-deal-analysis/SKILL.md` (Required bridge). Expand LTM, PRO on first use. + +--- + +**Hook:** Track count is not diversification: 9 ways a music catalog looks better than it is +**Description:** A buyer's gotcha list: 500 tracks but one income driver; accounts that look profitable only because the artist hasn't recouped yet; fragile threshold-based bonuses; one-time sync fees treated as baseline; income the rights paperwork can't actually support. +**Value:** For catalog buyers — a fast risk checklist to run before trusting a catalog's numbers. +**Deliverable:** The 9 as a printable due-diligence checklist (L1 — share-bait listicle + saved tool); links to the deal-analysis skill that runs the checks (L2). Pairs with the valuation flagship. +**Value Score:** 5 +**From:** `skills/plugins/recoup-deals/skills/recoup-deal-analysis/SKILL.md` (Critical gotchas). + +--- + +**Hook:** The one-page record deal +**Description:** How we shrank an artist agreement from a 14-section label term sheet to a one-page "platform + shopping" deal: the creator keeps ownership, we automate their content and pitch ("shop") their music to partners. Why promising management you can't deliver is the real risk in artist deals. +**Value:** For indie labels and creators structuring deals — a lightweight alternative to heavy, obligation-laden contracts. +**Deliverable:** The actual one-page template, published free (L1 — like Every publishing its own guidelines; huge trust + lead magnet); positions Recoup as the modern-deal experts (L7). ⚠ legal review before publishing a contract template. +**Value Score:** 5 +**From:** PROGRESS 2026-03-31 "Deals template — Platform & Shopping Agreement". Gloss "shop the IP." + +--- + +**Hook:** The whole album campaign lives in one document +**Description:** One file per release as the single source of truth — from identifiers (ISRCs/UPCs) to DSP (streaming service) pitch, press one-sheet, and tour routing — with tags marking which sections are safe to share externally vs. internal-only. Deliverables get generated from it, and blank beats fabricated. +**Value:** For label/release managers — a single-source-of-truth system that kills scattered campaign docs. +**Deliverable:** The release-doc template, free to download (L1); embeds the release skills that generate the DSP pitch / one-sheet from it (L2). +**Value Score:** 4 +**From:** `skills/skills/release-management/SKILL.md` + `skills/plugins/recoup-releases/skills/recoup-release-doc/SKILL.md`. Gloss ISRC/DSP; explain it's a plain text file. + +--- + +**Hook:** One command runs the whole release: brief → schedule → pitch → monitoring +**Description:** What "agent-run release ops" looks like, walked through a real Gatsby Grace release with the actual generated outputs shown — a single command scaffolds the release, writes a data-grounded creative brief, builds a dated rollout schedule counted back from release day, assembles the master doc and DSP pitch, ranks playlist targets, and watches the launch. ⚠ state where the command runs. +**Value:** For label operators — shows the end-to-end release workflow an agent can drive instead of a project manager. +**Deliverable:** The real release walkthrough with outputs as proof (L4); ends with "want us to run your next release on this?" (L7). +**Value Score:** 5 +**From:** `skills/plugins/recoup-releases/skills/recoup-release-start/SKILL.md` (+ campaign/marketing-brief siblings). + +--- + +**Hook:** One audio file in, a label's release paperwork out +**Description:** Drop in a track and an AI that listens to it returns the admin layer of a release: catalog metadata (tempo, key, genre, mood), a sectioned lyric sheet, a playlist pitch, and mix notes — generated from the waveform itself, shown as a real before/after (raw track → filled sheets). +**Value:** For labels and distributors — automates the tedious metadata/admin work that gates every release. +**Deliverable:** The real raw-track → filled-metadata before/after as proof (L3/L4); embeds the song-analysis skills; closes with a distributor/label CTA (L2/L7). +**Value Score:** 5 +**From:** `skills/plugins/recoup-song-analysis/` (metadata, lyrics, playlist-pitch, mix-feedback). Spell out "audio language model." + +--- + +**Hook:** A sync brief from an audio file — and why "sample detected" is a flag, not a clearance +**Description:** Sync = licensing a song for TV/film/ads. An AI listens and returns a supervisor-ready brief: scene fit, emotional arc with timestamps, brand-safety notes, and sample/interpolation risk with confidence levels. The guardrail: the AI flags risk; a human still clears the rights. +**Value:** For sync teams and music supervisors — a fast first-pass brief with honest risk flags. +**Deliverable:** A sync-brief template + a brand-safety checklist (L1); the "flag, not a clearance" honesty positions us as the careful experts supervisors trust (L7). +**Value Score:** 4 +**From:** `skills/plugins/recoup-song-analysis/skills/recoup-song-sync-brief/SKILL.md`. + +--- + +## For AI Builders & Engineers + +**Hook:** We staffed our engineering team with AI agents — reviewer, senior dev, QA +**Description:** The agent org chart: one agent implements, another reviews the pull request, a third runs tests against the live preview deploy — handing back and forth until it's approved. What worked, what we had to constrain, and the real review threads. ⚠ keep issue/PR IDs internal. +**Value:** For engineering leaders experimenting with agents — a working multi-agent dev workflow to copy or critique. +**Deliverable:** The agent role definitions/prompts as a copyable starter (L1); links recoupable/skills (L6). +**Value Score:** 5 +**From:** PROGRESS 2026-03-24/25 (REC-4/8/9/10, PR #341→#342). Decide on the Every comparison. + +--- + +**Hook:** We made our AI developers do test-driven development +**Description:** We required our coding agents to follow TDD — write the failing test first, reproduce a bug before fixing it, commit in phases — and PR quality measurably improved. Why the discipline that helps human devs transfers to agents. ⚠ include the real before/after on quality or rework rate. +**Value:** For teams running coding agents — a concrete guardrail that improves agent output. +**Deliverable:** The agent TDD rules as a copy-paste snippet (L1) + the before/after proof point (L3). +**Value Score:** 5 +**From:** PROGRESS 2026-03-25 "TDD mandate for SR Dev (REC-11)". Expand TDD/red-green-refactor on first use. + +--- + +**Hook:** An agent wrote profiles for our whole roster in a day — and we made it admit what it couldn't verify +**Description:** Bulk web-research onboarding for 40+ artists, and the rule that mattered most: when the agent couldn't confirm which "Jada" or "Neek" was ours, it wrote an honest placeholder instead of inventing a bio. AI honesty as an operational policy. +**Value:** For anyone deploying research agents — a pattern for preventing confident fabrication at scale. +**Deliverable:** The "honesty guardrail" prompt pattern as a reusable snippet (L1) — fabrication-prevention is a broad, hot agent-builder topic, so the snippet travels. +**Value Score:** 5 +**From:** PROGRESS 2026-03-26 "Web-researched artist.md profiles". Use "40+"; frame names as "artists we couldn't verify." + +--- + +**Hook:** Your AI agents need a memory file +**Description:** Every agent run starts cold and forgets the last one — so work duplicates and context dies. We keep a single running log (date, task, status, what changed, links) that agents read before working and write after. The format, the discipline, and how this very content backlog was mined from it. +**Value:** For developers building with agents — a dead-simple persistence pattern that stops repeated work. +**Deliverable:** The memory-file template as a copy-paste starter (L1); "this backlog was mined from it" is the proof (L4). +**Value Score:** 5 +**From:** PROGRESS.md itself + AGENTS.md "PROGRESS File (MANDATORY)". + +--- + +**Hook:** Our AI generated the wrong scene in production — and the build tool was to blame +**Description:** A debugging war story: template files silently failed to load once bundled for production, so the agent produced a bright outdoor shot instead of the dark bedroom look — output that looked fine but was wrong. The root cause (the bundler rewriting a path at build time) and the fix. +**Value:** For JavaScript/Node engineers — a specific silent-failure trap (and fix) when bundling apps that read local files. +**Deliverable:** A 3-line "silent failures when bundling apps that read local files" checklist (L1). Inherently niche topic → honest ceiling of 3; keep it as SEO bait for the exact error. +**Value Score:** 3 +**From:** PROGRESS 2026-03-31 "Fix template files not loading in production". Lead with the symptom; keep esbuild/`__dirname` in the body. + +--- + +**Hook:** Author once, run anywhere: making AI skills portable across Claude, Codex, and Cursor +**Description:** How we made 40+ skills run identically on every agent runtime ("harness"): each skill is fully self-contained, shared files are duplicated and drift-checked to stay byte-identical, and a CI gate enforces it. Why the obvious Claude-only path broke on other runtimes. +**Value:** For skill/plugin authors — a portability blueprint so one skill works across every agent platform. +**Deliverable:** The portability checklist + the open-sourced drift-check script (L1/L6) — positions recoupable/skills as the reference implementation (L7); the script earns stars and trust. +**Value Score:** 5 +**From:** PROGRESS 2026-06-02 "make every skill cross-harness portable" + packaging-landscape research. Define "harness." + +--- + +**Hook:** Your AI skills are a UX problem: why we folded 14 into 6 +**Description:** Users only ever ran the first skill (the orchestrator) and ignored the rest — so we collapsed 14 skills into 6 workflow stages, keeping all the capability as modes and bundled references. The universal insight first ("users only run the first thing"), with a before/after of the skill tree. +**Value:** For skill/product designers — a lesson in shaping agent tooling around how people actually use it. +**Deliverable:** A "should you split or fold?" decision rule (L1) + the before/after tree (L3). Generalizes beyond music. +**Value Score:** 4 +**From:** PROGRESS 2026-06-03 "Deal skills: fold 14 → 6". Define "orchestrator skill." + +--- + +**Hook:** We made our API admit when it doesn't know — instead of faking data +**Description:** Mid-migration between two music-data providers, we chose to return an honest "not supported here" error rather than fabricate a plausible number, and added a caching layer so slow upstream calls return a "still loading" response instead of timing out. Honesty and resilience as API design. +**Value:** For API and backend engineers — design principles for honest, resilient pass-through APIs over slow third parties. +**Deliverable:** A short, quotable "honest API design" principles list as the artifact (L1) — lead with the principle, keep the music context as the example; HTTP/caching specifics in the body. +**Value Score:** 5 +**From:** PROGRESS 2026-06-03 SongStats migration (PR #635) + "research metrics cache refresh layer". Identify the providers on first mention. + +--- + +**Hook:** You're probably using a third of your data provider +**Description:** A utilization audit of our music-data vendor found we exposed only ~⅓ of what it offered (no time-series, collaborators, events, or location data). The repeatable method: audit the provider's full surface, then test live which endpoints actually return data vs. accept the call and return nothing. +**Value:** For engineers integrating any third-party API — a method to find capability you're already paying for but not using. +**Deliverable:** The "API utilization audit" as a checklist any dev runs against their own vendor (L1); the music vendor is just the example. +**Value Score:** 4 +**From:** PROGRESS 2026-06-07 "Songstats data-utilization audit". Generalize the hook. + +--- + +**Hook:** Teaching an agent to hear: finding a song's catchiest moment with audio AI +**Description:** Pointing an audio AI model at a track to rank its most clip-worthy 5–15 second windows from energy, structure, and lyric timing — shown on a known song. Plus the architecture lesson: the module that *understands* audio finds the moment; the module that *makes* content only consumes it. (The *musical* hook — distinct from the video scroll-stopper.) +**Value:** For AI/audio engineers — a concrete audio-model use case and a clean separation-of-concerns lesson. +**Deliverable:** A real ranked-windows output on a known song (L3/L4); embeds the song-hook skill (L2). Audio-AI audience is niche → ceiling 4. +**Value Score:** 4 +**From:** PROGRESS 2026-06-06 "Move hook-finding from content → song-analysis" + Flamingo skills. Explain/link the audio model. + +--- + +**Hook:** We hired 5 AI personas to roast our website +**Description:** We ran five AI "customers" (a catalog buyer, a rights owner, a platform lead, a label GM, a cold visitor) through every page, had each score the experience and file real bugs, and watched the journey score climb across three rounds. A free, repeatable conversion-optimization (CRO) loop. ⚠ state the scoring scale. +**Value:** For founders/marketers — a no-cost way to stress-test a site's UX with diverse "users" before launch. +**Deliverable:** The persona-prompt pack + scoring rubric as a free template anyone runs on their own site (L1 — one of the most portable artifacts here); the 5.0→8.1 arc is the proof (L3). +**Value Score:** 5 +**From:** PROGRESS 2026-06-01/02 userjourney v1→v3. Expand CRO. + +--- + +**Hook:** Agent-operated repos need their own hygiene rules +**Description:** Empty placeholder folders are lies — they pretend structure exists where there's no content, and they confuse the agents working in the repo. The rules we settled on for repos that agents operate in, including "nothing gets created until there's something real to put in it." (YAGNI = You Aren't Gonna Need It.) +**Value:** For engineers structuring agent-operated repos — a small rulebook that keeps workspaces honest and navigable. +**Deliverable:** A short "agent repo hygiene" rules list (L1). Niche, single-note topic → honest ceiling of 3; broadened from "empty folders" so it can stand alone. +**Value Score:** 3 +**From:** PROGRESS 2026-03-25 "Purge YAGNI scaffolding". Expand YAGNI; reconcile the 40+ count. + +--- + +**Hook:** Skill descriptions are SEO for agents +**Description:** An agent only ever sees a skill's name and description by default, so the description is the trigger — write it vague and the skill never fires. How to write one (what it does + when to use it + the exact phrases a user would say), and why each domain needs one "front door" skill that routes to the rest. +**Value:** For people authoring agent skills/tools — practical rules so your skills actually get invoked. +**Deliverable:** A "skill description formula" with good/bad examples as the artifact (L1); positions recoupable/skills as the reference for skill authors (L7). +**Value Score:** 4 +**From:** `skills/AGENTS.md` (How Skills Load + Portable Skill Contract). Define "frontmatter"/"harness" once. + +--- + +**Hook:** Our signup flow is a conversation inside the coding agent +**Description:** No web form: the setup skill confirms your email in-session, emails a 6-digit code, verifies it, issues a real API key, stores it securely, and seeds the agent's memory so future music questions route through us automatically. Onboarding as a skill, inside Claude Code (Anthropic's coding agent). +**Value:** For agent/product builders — a novel in-terminal onboarding pattern instead of a web signup. +**Deliverable:** The in-terminal onboarding pattern as a reusable snippet (L1); the "signup with no website" novelty is the hook. Modest reach ceiling. +**Value Score:** 4 +**From:** `skills/plugins/recoup-essentials/skills/recoup-setup/SKILL.md`. Identify Claude Code; move "chmod 600" to the body. + +--- + +**Hook:** Every agent product needs a 60-second demo path +**Description:** Our two biggest plugins each ship a demo that runs the full pipeline on built-in fake data — a catalog deal to a finished dashboard in about a minute — so a first-time user sees the payoff before connecting anything real. Synthetic-data demos as an adoption tactic. ⚠ confirm the ~60s claim. +**Value:** For agent/product builders — an onboarding pattern that proves value before any setup friction. +**Deliverable:** The "demo skill" pattern as a template (L1) + our own demos as proof (L4). +**Value Score:** 4 +**From:** `recoup-deals/skills/recoup-deal-demo` + `recoup-releases/skills/recoup-release-demo`. Name the two plugins. + +--- + +**Hook:** Agents that spend money need a confirm step +**Description:** Before an agent runs an action that costs real credits (like generating 30 assets at once), it should estimate the cost, show the plan, and wait for a yes — and when funds run out, surface a checkout link instead of failing silently. UX rules for agents with wallets. +**Value:** For developers building agents that transact — a safety/UX pattern that prevents surprise spend. +**Deliverable:** The estimate-and-confirm UX pattern as a snippet (L1); "agents with wallets" is a timely topic (agent payments) → reach. Generalized past music. +**Value Score:** 4 +**From:** `skills/plugins/recoup-content/skills/recoup-content-pack/SKILL.md` (credit gate) + `references/content-api.md`. Gloss "fan-out." + +--- + +**Hook:** Docs first, tests second, code third: how our agents ship GitHub issues +**Description:** The house workflow encoded as a skill: write the API contract/docs first, then failing-to-passing tests that match the docs, then the implementation — verified against the live preview deploy and reported back on the tracking issue. How long-lived issues coordinate multi-PR, multi-repo work. +**Value:** For engineering teams using coding agents — a disciplined delivery workflow that keeps docs, tests, and code in sync. +**Deliverable:** The issue/skill workflow as a template (L1); "docs → tests → code" leads as the memorable frame (L5). +**Value Score:** 4 +**From:** `skills/skills/issue-implementation/SKILL.md` + `skills/skills/issue-management/SKILL.md`. Expand OpenAPI once. + +--- + +**Hook:** We'll make the content. We won't run the farm. +**Description:** The ethics line we built into the product itself: we generate legitimate creative volume and target it with real audience data, but we won't build fake/burner-account networks, evade bans, or mass-post. A trust manifesto that pairs the "won't" with the "will" — the legit volume + targeting we DO offer — so it converts, not just signals. +**Value:** For AI builders and buyers — a trust-building stance on responsible automation that doubles as positioning. +**Deliverable:** A clear "what we will / won't automate" stance (L7) + the legit alternative spelled out so labels can act on it. Brand-defining, labels-can-trust-us cornerstone. +**Value Score:** 5 +**From:** `skills/plugins/recoup-content/skills/recoup-content-pack/SKILL.md` (The boundary). Use this to fix the "burner pages" line in the trend-to-song piece. + +--- + +**Hook:** The AI captions kept ignoring the lyrics — here's what was actually wrong +**Description:** A debugging story for AI builders: the lyrics *were* reaching the prompt — the template's style rules were just overpowering them. Not a code bug, a prompt-weighting issue. A small taxonomy of "soft bugs" where AI output is wrong but nothing errors. +**Value:** For prompt/AI engineers — names a failure class (correct plumbing, wrong weighting) and how to diagnose it. +**Deliverable:** The "soft bug" taxonomy as a coined name people reuse (L5) + a diagnosis checklist (L1). +**Value Score:** 4 +**From:** PROGRESS 2026-04-02 "Content creation V2 plan + caption bug investigation". + +--- + +## Strategy & Industry Essays *(for founders & operators)* + +**Hook:** Three companies, one funnel: how Every, pm-world, and Tenex sell AI expertise +**Description:** A teardown of three businesses that all teach publicly to sell something — at three price points: a ~$99 self-serve plugin (pm-world), a content+software membership (Every), and enterprise services (Tenex). The shared engine on top, the three monetization floors underneath, and the map any expertise business can copy. Each company gets a one-line intro + link. ⚠ verify the pricing/model claims are publicly sourced. +**Value:** For founders monetizing expertise — a strategic template for choosing how to package and price what you know. +**Deliverable:** A downloadable "expertise-monetization map" (L1); quietly positions Recoup as the company running all three tiers at once (L4/L7). +**Value Score:** 5 +**From:** PROGRESS 2026-06-11 teardown entries; `referances/{pm-world,tenex,every}/TEARDOWN.md`. + +--- + +**Hook:** We're packaging a record label as a plugin +**Description:** A recurring build-in-public series on productizing operational know-how: turning the skills, workflows, and agent tools we use to run a label into a paid, versioned bundle — while the open-source skills stay the free top of the funnel. Each installment doubles as the product changelog. The model, the pricing logic, and the build. +**Value:** For founders productizing a service — a live case study in turning operations into a sellable product. +**Deliverable:** A series where each post is also the changelog and CTAs straight to the plugin (L2/L6, pm-world's content=changelog=funnel); the anchor for the self-serve launch. Highest direct-conversion potential in the backlog. +**Value Score:** 5 +**From:** PROGRESS 2026-06-11 pm-world teardown (paid zip, free repo as top-of-funnel). Define the free→paid funnel; gloss "MCP." + +--- + +**Hook:** How to study any company's content corpus at scale +**Description:** The tactical how-to behind a competitive teardown: a dependency-free scraper that crawls a full newsletter/blog archive, pulls clean text and metadata, detects paywalled posts, and re-runs safely — fast. Framed as a general method (any corpus), which removes the optics of publicizing scraping a specific named competitor. +**Value:** For founders/marketers doing competitive research — a reusable method to study a rival's content corpus at scale. +**Deliverable:** The scraper/method as the artifact (L1). Anonymizing to "any corpus" lifts educational value and drops the risk; honest ceiling ~3 — fix the framing or shelve. +**Value Score:** 3 +**From:** PROGRESS 2026-06-11 "Every.to newsletter reference archive". diff --git a/IA-PLAN.md b/IA-PLAN.md new file mode 100644 index 0000000..a4d54a2 --- /dev/null +++ b/IA-PLAN.md @@ -0,0 +1,163 @@ +# Site IA Restructure Plan — Offerings & Navigation + +> Status: IMPLEMENTED (2026-06-14). Reorganizes the marketing site around three +> offerings with a "learn → build/use → done-for-you" funnel. Supersedes the +> header-nav rationale in `lib/nav.ts` and the bundled `/platform` page. +> +> Shipped defaults: dropdown-only Products (no `/products` page), `/developers` +> kept standalone, `/blog` URL kept (nav labeled "Resources"), Recoup OS priced +> at $99/year. `/platform` 301-redirects to `/skills`. + +--- + +## 1. The model + +**Three offerings, one funnel:** + +``` +Resources → Products → Consulting + (learn) (build it yourself OR use the hosted version) (have us do it) +``` + +The "build vs. use" fork lives **inside Products** (this is the real choice a +buyer makes), which is what removes the old "Platform vs. Chat" confusion: + +``` +Products +├── Skills → install & run it yourself +│ └── Recoup OS → the flagship paid mega-plugin (all skills, one download) +└── Chat → the hosted web app, nothing to install +``` + +**Value ladder (low commitment → high):** +free individual skills → **Recoup OS** (paid bundle) → **Chat** (hosted) → +**Consulting** (done for you). + +--- + +## 2. Naming decisions (locked) + +| Decision | Choice | Why | +|---|---|---| +| Web app name | **Chat** | Concrete, matches `chat.recoupable.com`; "Platform" was umbrella fog. | +| Products umbrella | **Products** | Now unambiguous because Chat is *inside* it, not a sibling. | +| Flagship SKU | **Recoup OS** | One downloadable mega-plugin = all skills bundled (PM-OS analogy). Gets its own page. | +| Content hub | **Resources** | "Learn" tier of the funnel. | +| Retire | **"Platform"** as a label | It was an umbrella, never a single offering. | + +--- + +## 3. Route map + +### New / changed routes + +| Route | Page | Source today | Action | +|---|---|---|---| +| `/` | Home | `app/page.tsx` | Reframe around 3 offerings + funnel | +| `/resources` | Resources hub | `/blog` | Label as Resources; keep `/blog` working (alias or rename) | +| `/products` | Products overview | — | **New** — splits into Skills + Chat | +| `/skills` | Skills index | half of `/platform` | **New** — open skills, plugins, MCP, API; features Recoup OS | +| `/recoup-os` | Recoup OS product page | — | **New** — flagship paid download, launch-style | +| `/chat` | Chat (web app) landing | half of `/platform` + `appUrl` | **New** — hosted workspace, CTAs into `chat.recoupable.com` | +| `/consulting` | Consulting | `app/consulting/page.tsx` | Keep | + +### Migrations / redirects +- `/platform` → split. Redirect `/platform` → `/products` (301). Salvage its + copy: engine/Chat half → `/chat`; skills/plugins/MCP/API half → `/skills`. +- `/developers` → fold into `/skills` (API/MCP section) **or** keep as the deep + API-docs entry linked from `/skills`. (Decision below.) +- `/partners` → keep; link from `/consulting` (partnerships are a consulting + motion). Secondary nav. + +### Unchanged (secondary) +`/pricing`, `/trust`, `/audit`, `/diligence`, `/company`, `/company/about`, +`/company/vision`, `/company/recoup-records`, `/privacy-policy`, +`/terms-of-use`. + +--- + +## 4. Navigation spec + +Header is now a hamburger menu (all breakpoints). Proposed grouped structure: + +``` +Resources +Products + ├─ Recoup OS (/recoup-os) ← featured + ├─ Skills (/skills) + └─ Chat (/chat) +Consulting +Pricing +Trust +``` + +**Footer** keeps: Company/About/Vision/Recoup Records, Developers/API Docs, +Partners, Audit, Privacy, Terms, socials, newsletter. + +`lib/nav.ts` changes from a flat list to a grouped structure (items may have +`children`). Header renders groups as labeled sections inside the menu panel. + +--- + +## 5. Page specs + +### `/recoup-os` (flagship, launch-style) +- Hero: what Recoup OS is (all skills, one install), price, primary CTA (Buy / + Download), secondary CTA (see what's inside). +- "What's inside" — the skill categories it bundles. +- How it installs (one command / download) + supported hosts (Claude, Cursor, Codex). +- Proof: we run it on our own label (link `/company/recoup-records`). +- Pricing block + FAQ (JSON-LD). +- Close: mantra + CTA. + +### `/skills` (Products → Skills index) +- Lead: the open/free individual skills (current skills strip content). +- **Recoup OS** feature band → links to `/recoup-os`. +- Plugins (individual, à la carte) + marketplace. +- API / MCP developer surface at the bottom → link to `/developers` docs. + +### `/chat` (Products → Chat) +- The hosted workspace value prop (no install), screenshots/usage. +- Pull the "one engine / Ask anything" demo content from today's `/platform`. +- Primary CTA → `chat.recoupable.com`; pricing link. + +### `/products` (overview, optional) +- Two-card fork: **Skills** (build it yourself) vs **Chat** (use it hosted), + with Recoup OS called out under Skills. Mostly a router; could be a dropdown + only and skip a standalone page (decision below). + +### `/resources` (= today's `/blog`) +- No structural change; relabel + ensure nav/footer point here. Beats, per-post + covers, newsletter all stay. + +### `/` (home) +- Reframe the "How we work" section to the 3 offerings + funnel. +- Add a Products fork (Skills/Recoup OS vs Chat). +- Keep stats, proof, mantra, objections. + +--- + +## 6. Open decisions (need a call before build) + +1. **`/products` page or dropdown-only?** Recommend dropdown-only at first + (Skills + Chat are the real pages); add `/products` overview later if needed. +2. **`/developers`**: keep as standalone API-docs entry, or fully fold into + `/skills`? Recommend keep standalone, link from `/skills`. +3. **`/resources` vs keep `/blog` URL**: rename with redirect, or keep `/blog` + and just relabel nav to "Resources"? Recommend keep `/blog`, relabel nav + (no SEO/link churn). +4. **Recoup OS pricing**: needed for `/recoup-os` + `/pricing`. Placeholder vs real number? + +--- + +## 7. Build phases (atomic tickets) + +- **IA-01** `lib/nav.ts` → grouped structure (Products → Recoup OS/Skills/Chat); update Header menu to render groups. +- **IA-02** Create `/recoup-os` page (flagship) + copy in `lib/copy/`. +- **IA-03** Create `/skills` page; migrate skills/plugins/MCP/API copy from `/platform`; feature Recoup OS. +- **IA-04** Create `/chat` page; migrate hosted-app + engine demo copy from `/platform`. +- **IA-05** Redirect `/platform` → `/products` (or `/skills`); update internal links + sitemap + footer. +- **IA-06** Relabel Resources in nav/footer; confirm `/blog` funnel framing. +- **IA-07** Home: reframe "How we work" to 3 offerings + Skills/Chat fork. +- **IA-08** Pricing: add Recoup OS SKU. +- **IA-09** e2e: update nav test (grouped menu), add `/recoup-os`, `/skills`, `/chat` smoke tests; sitemap entries. diff --git a/app/advisory/book/BookingForm.tsx b/app/advisory/book/BookingForm.tsx deleted file mode 100644 index 9ed818a..0000000 --- a/app/advisory/book/BookingForm.tsx +++ /dev/null @@ -1,292 +0,0 @@ -"use client"; - -import { useState, useEffect, type FormEvent } from "react"; -import { useSearchParams } from "next/navigation"; -import { ArrowRight, CheckCircle, Loader2 } from "lucide-react"; - -const packages = [ - { - id: "strategy-session", - name: "Strategy Session", - price: "$2,500", - desc: "One 90-minute deep dive with Sidney", - }, - { - id: "ai-transformation", - name: "AI Transformation", - price: "$10,000", - desc: "Full strategy + 90-day implementation", - popular: true, - }, - { - id: "retained-advisor", - name: "Retained Advisor", - price: "$5,000/mo", - desc: "Ongoing strategic partnership", - }, -] as const; - -const roles = [ - "Label Owner / GM", - "Artist Manager", - "Head of Marketing", - "A&R", - "Distributor", - "Catalog Owner", - "Other", -]; - -const rosterSizes = [ - "1-5 artists", - "6-20 artists", - "21-50 artists", - "50-200 artists", - "200+ artists", -]; - -type PackageId = (typeof packages)[number]["id"]; - -export function BookingForm() { - const searchParams = useSearchParams(); - const [selectedPkg, setSelectedPkg] = useState("strategy-session"); - - useEffect(() => { - const p = searchParams.get("package"); - if (p && packages.some((pkg) => pkg.id === p)) { - setSelectedPkg(p as PackageId); - } - }, [searchParams]); - const [name, setName] = useState(""); - const [email, setEmail] = useState(""); - const [company, setCompany] = useState(""); - const [role, setRole] = useState(""); - const [rosterSize, setRosterSize] = useState(""); - const [message, setMessage] = useState(""); - const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle"); - const [errorMsg, setErrorMsg] = useState(""); - - async function handleSubmit(e: FormEvent) { - e.preventDefault(); - setStatus("loading"); - setErrorMsg(""); - - try { - const res = await fetch("/api/book", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - name, - email, - company, - role, - package: selectedPkg, - rosterSize, - message, - }), - }); - - if (!res.ok) { - const data = await res.json(); - throw new Error(data.error || "Something went wrong"); - } - - setStatus("success"); - } catch (err) { - setStatus("error"); - setErrorMsg(err instanceof Error ? err.message : "Something went wrong"); - } - } - - if (status === "success") { - return ( -
- -

- Request received -

-

- Sidney will review your info and get back to you within 24 hours to - schedule your{" "} - {packages.find((p) => p.id === selectedPkg)?.name?.toLowerCase() || - "session"} - . -

-
- ); - } - - return ( -
- {/* Package selection */} -
- -
- {packages.map((pkg) => ( - - ))} -
-
- - {/* Contact info */} -
-
- - setName(e.target.value)} - className="w-full px-4 py-3 rounded-lg bg-white/5 border border-[var(--border)] focus:border-white focus:outline-none transition-colors" - placeholder="Jane Smith" - /> -
-
- - setEmail(e.target.value)} - className="w-full px-4 py-3 rounded-lg bg-white/5 border border-[var(--border)] focus:border-white focus:outline-none transition-colors" - placeholder="jane@label.com" - /> -
-
- -
-
- - setCompany(e.target.value)} - className="w-full px-4 py-3 rounded-lg bg-white/5 border border-[var(--border)] focus:border-white focus:outline-none transition-colors" - placeholder="Acme Records" - /> -
-
- - -
-
- -
- - -
- -
- -