Convert Starpod into an installable Astro integration - #60
Conversation
Monorepo spike: packages/starpod is now an installable Astro integration that injects every route, adds the preact/sitemap/tailwind/rehype wiring, exposes the user's config via virtual:starpod/config, and applies the Vercel markdown content negotiation in astro:build:done. The root site consumes it via workspace:*. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tegration spike - tsconfig paths + vitest alias so starpod/src/* imports resolve for TS and tests (TS does not resolve the exports wildcard the way Vite does) - Vercel markdown negotiation moves to a process exit handler: the adapter's astro:build:done runs after the integration's and rewrites config.json - @astrojs/preact becomes a direct site dependency: Astro resolves the renderer client entrypoint from the project root, so the consumer must depend on it (matches how framework renderers are normally installed) - Tighten the vercel-md-negotiation type declarations to match its tests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ides, bundled assets - Vercel markdown negotiation now runs inside astro:build:done using the hook's own assets map (the adapter writes config.json before user hooks but copies static files after them, so the filesystem can't be scanned) - @astrojs/preact and preact become peerDependencies; the package ships a tsconfig.json (nearest-tsconfig JSX settings for installed copies) and widens the preset's JSX exclude so starpod's own .tsx transforms when it lives in node_modules - starpod(config, options): options.database gates the Drizzle/Turso guests+sponsors layer (default off; sections simply don't render), options.components overrides built-ins via virtual modules, and options.customCss loads site stylesheets after the built-in ones - Engine assets (player icons, platform logos, dots, avatars) move into the package and are bundled by Vite instead of expected in consumer public/; host/guest/sponsor image lookups fall back gracefully when a site has not provided photos yet - Normalize rss-to-json's dual CJS interop shape (externalized vs bundled) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
npm create starpod: prompts for name/RSS/database (or flags --name --rss --database --yes) and generates a ready-to-build consumer project: renderer deps declared directly, tsconfig with starpod/src/* paths for tests, content config, .env.example, optional db/ folder with empty data files, seed script, and drizzle config, plus the fast-xml-parser pin and sharp that real feeds need. Smoke-tested against the local package with a component override and customCss. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drops the separate create-starpod package: the starpod package now ships a bin, so `npx starpod new my-podcast` scaffolds a project with the same prompts and flags. One published package instead of two; the trade-off is losing the `npm create starpod` alias, which requires a package named create-starpod. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # packages/starpod/src/pages/contact.html.md.ts # packages/starpod/src/pages/index.html.md.ts # tests/unit/llms.test.ts
…-driven host order The sponsor page is no longer part of the engine — sponsorship pitches are bespoke marketing, so a consumer who wants one adds a normal Astro page to their own src/pages/ built from the package's exported Layout and components. whiskey.fm's page moves back into the site as the reference implementation, and the scaffolded README documents the pattern. - New optional `links` config renders extra nav entries after About and Contact (replaces the hardcoded whiskey.fund Store link) - CreatorsAndGuests sorts configured hosts first in config order instead of a hardcoded name list (past hosts recorded in the database follow, then guests alphabetically — old whiskey.fm episodes may order Chuck after Adam now) - AdPackageCard stays in the package as a generic building block Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
defineStarpodConfig now parses the config with valibot and throws a single readable error listing every problem with its field path; the integration validates too, so configs that skip the helper are still checked. Calling starpod() with no config — what `astro add starpod` generates — throws setup instructions instead of crashing mid-build. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
starpod/layout, starpod/components/AdPackageCard, and starpod/rss are the supported imports for site-authored pages (the reference sponsor page and scaffolded README now use them). starpod/src/* remains available for tests but is internal API with no stability guarantees. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The package README is the npm landing page: quickstart for new and existing projects, config reference, integration options, custom pages, transcripts, database setup, and the API stability policy (src/* is internal; the blessed subpath exports are the stable surface). The repo README keeps its ATProto and LLM discovery docs but replaces the fork-model getting-started with the integration story and documents the workspace layout. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The scaffold job builds a freshly generated consumer project against the local package on every push — covering the installed-from-npm code path (node_modules JSX transform, CJS interop, bundled assets, dependency pins) that the workspace build can't see, and asserting the agent endpoints and negotiation routes exist in the output. The release workflow publishes starpod to npm with provenance on a starpod@* tag or manual dispatch; it needs an NPM_TOKEN repository secret. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
npm handles the OIDC exchange natively (id-token: write stays; the workflow upgrades npm since Node 22 bundles 10.x and trusted publishing needs 11.5.1+), and provenance comes automatically with trusted-publisher releases. Requires the one-time trusted publisher setup on npmjs.com. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Generated by create-release-plan-setup: plan-release.yml opens and updates a Prepare Release PR (changelog + .release-plan.json) from labeled PRs, and publish.yml releases to npm via OIDC trusted publishing with provenance when that PR merges — no token secret. Replaces the hand-rolled tag-based release workflow. RELEASE.md documents the flow; every merged PR needs one of the changelog labels. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedToo many files! This PR contains 140 files, which is 40 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (26)
📒 Files selected for processing (140)
You can disable this status message by setting the 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. Comment |
What this is
Starpod becomes an npm package instead of a fork-me template.
packages/starpodis an Astro integration that generates the entire site — episode pages, player, search, transcripts, the LLM/agent endpoints, and the Vercel markdown content negotiation — from an RSS feed and astarpod.config.ts. The repo root is now whiskey.fm, the reference site, consuming the package viaworkspace:*. Sites built on the package update withpnpm updateinstead of merging a diverged fork.Consumer experience
npx starpod new my-podcastscaffolds a ready-to-deploy site (the CLI ships inside thestarpodpackage — one package on npm)pnpm add starpod @astrojs/preact preact, createstarpod.config.ts, addstarpod(starpodConfig)to integrations;astro add starpodusers get exact setup instructions instead of a crashdatabase(opt-in Turso/Drizzle guests & sponsors; off = those sections just don't render),components(Starlight-style overrides for 8 built-ins),customCss(theming via CSS custom properties)starpod/layout,starpod/components/AdPackageCard,starpod/rss) — whiskey.fm's sponsor page is the reference implementationstarpod/src/*stays importable for tests but is documented as internal APINotable engineering
virtual:starpod/configmodule; lib functions accept an optional config so tsx scripts (seed, ATProto publishing) work without Viteastro:build:doneusing the hook'sassetsmap (the adapter writesconfig.jsonbefore user hooks but copies static files after them)public/; missing host/guest/sponsor images fall back gracefullyscaffoldjob that builds a freshly generated consumer against the local package on every pushVerification
astro check0 errors · 170 unit tests · 51 e2e tests (chromium/firefox/webkit) · full Vercel build with all negotiation routes · scaffolded consumer builds end-to-end with database off and a component override + customCss exercisedBefore first release (manual, one-time)
starpod(GitHub Actions, reposhipshapecode/starpod, workflowpublish.yml)v0.0.0) — the changelog generator needs one to diff fromenhancement)🤖 Generated with Claude Code