Make the site deployable, and finish the OpenRouter migration - #8
Merged
Conversation
…ration podflow.cc has served a 404 since the day it was first deployed on 27 June. Both production deployments before today reported READY with zero output files, so nothing ever flagged it. The cause was a chain of four separate problems. Vercel was building the wrong thing - The project had no Root Directory set, so it built the repo root, whose build script compiles the CLI. No website was produced, an empty deployment shipped, and Vercel called it READY. Root Directory is now set to `web`. The site depended on a directory outside the repo - web/package.json declared "@totalaudiopromo/ui": "file:../../newsjack/packages/ui", a path to a sibling checkout. It resolved on one machine and nowhere else. web/ was also the only directory missing from pnpm-workspace.yaml, which is why it reached outside instead of using the workspace. Both fixed: web is a workspace member and the dependency is workspace:*. packages/ui had never been built - It declared "build": "tsup" with no config and no entry, so dist/ did not exist and nothing importing the package could resolve it. Added a tsup config with the two entries the exports map already promised, splitting them so only the client barrel carries the 'use client' banner and ./app stays RSC-safe. The package had diverged into two copies - newsjack and podflow both contained @totalaudiopromo/ui@0.1.0 with different contents. newsjack's is the superset (GlassCard, GradientButton, PricingTable, CrossSell, LeadCaptureForm) and is what web/ was written against. Synced podflow up to it and migrated apps/web to the newer component APIs: PageHeader's subtitle/action/badge became description/actions plus a SectionLabel, StatCard takes a LucideIcon rather than an element and folds its delta into the limit line, ActionTile's description became subtitle. Also - pnpm-workspace.yaml carried two literal "set this to true or false" placeholders for core-js and sharp, so pnpm treated the decision as unmade and failed every install. Resolved: sharp needs its native build, core-js does not. - react and react-dom resolved to 19.2.4 and 19.2.8, which React refuses to run. Pinned together via workspace overrides. - Finished the 27 July OpenRouter migration, which landed in the other seven repos but never got committed here: default provider and model move to openrouter and deepseek/deepseek-v4-flash. Both slugs verified live against the OpenRouter /models API today. Verified: packages/ui, web and apps/web all build; root typecheck clean; 39 tests pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeYoJmE6BUfw9AZJxoK9Fx
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
CI pinned pnpm 9 while the repo is developed on pnpm 11. pnpm 9 reads overrides from package.json; pnpm 10+ reads them from pnpm-workspace.yaml. A lockfile written by 11 therefore looked like a config mismatch to 9 and failed the frozen install. pnpm-workspace.yaml already used pnpm 10+ syntax (allowBuilds), so CI was running an older resolver than the repo was written for. Pin the version in packageManager and let action-setup follow it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeYoJmE6BUfw9AZJxoK9Fx
pnpm 11 requires the node:sqlite builtin, which Node 20 does not provide, so it cannot run on the CI matrix. pnpm 10 reads overrides from pnpm-workspace.yaml like 11 does, supports allowBuilds, writes the same lockfile format, and is already what Vercel uses for this project. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeYoJmE6BUfw9AZJxoK9Fx
chrisschouk
added a commit
that referenced
this pull request
Sep 5, 2026
The OpenRouter migration landed in #8 but the README still documented Anthropic as the default provider and model. Config example, provider table, and the --provider flag list now match src/config/index.ts and src/ai/extractor.ts. Adds the ui and import commands and the --rss flag, which were registered in the CLI but absent from the docs. Claude-Session: https://claude.ai/code/session_01P6r6zJqVcZR61FeWH7ZvGi Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The headline
podflow.cc has served a 404 since 27 June, the day it was first deployed. Both production deployments before today reported
READYwith zero output files, so nothing ever flagged it.Four separate problems were stacked on top of each other.
1. Vercel was building the CLI, not the site
The project had no Root Directory set, so it built the repo root — whose build script is
tsup src/cli.ts. That produces a Node bundle, not a website. Vercel shipped an empty deployment and marked it READY.Root Directory is now set to
web(changed in the Vercel dashboard, not in this PR).2. The site depended on a directory outside the repo
web/package.jsondeclared:That is a path to a sibling checkout. It resolves on the machine that has newsjack cloned next to podflow, and nowhere else — including CI and Vercel.
web/was also the only directory missing frompnpm-workspace.yaml, which is why it reached outside instead of using the workspace. Both fixed:webis now a workspace member and the dependency isworkspace:*.web/package-lock.jsonis removed so pnpm owns the install.3.
packages/uihad never been builtIt declared
"build": "tsup"with no config and no entry, sodist/did not exist — and theexportsmap pointed at./dist/index.js. Anything importing the package failed to resolve it, includingapps/web.Added
tsup.config.tswith the two entries the exports map already promised, split so that only the client barrel carries the'use client'banner and./appstays RSC-safe.4. The package had diverged into two copies
newsjack and podflow both contained
@totalaudiopromo/ui@0.1.0with different contents and the same version number. Every shared file differed, and newsjack had five components podflow did not.newsjack's is the superset and is what
web/was written against, so podflow is synced up to it. That required migratingapps/webto the newer component APIs:PageHeadersubtitle,action,badgedescription,actions; badge becomes aSectionLabelaboveStatCardtitle/subtitle, icon element,change/trendlabel/value,LucideIconcomponent, delta folded intolimitActionTiledescription,badgesubtitleNo content is dropped — the badges and deltas are preserved in the nearest equivalent slot.
Also fixed along the way
pnpm-workspace.yamlhad two literalset this to true or falseplaceholders forcore-jsandsharp. pnpm treated the decision as unmade and failed every install. Resolved: sharp needs its native build, core-js does not.pnpmfield frompackage.json— overrides belong inpnpm-workspace.yaml.)openrouter/deepseek/deepseek-v4-flash. Both that slug andinclusionai/ling-2.6-flashwere verified live against the OpenRouter/modelsAPI today, per the standing rule about not trusting a model slug from memory.Verification
packages/uibuilds —dist/index.js,dist/app.jsand both.d.tsfiles emitted.webbuilds — 6 HTML pages, 700K of output.apps/webbuilds — Next.js compiles and prerenders.pnpm typecheckclean.pnpm test— 39 passing.Follow-up worth doing separately
The two
@totalaudiopromo/uicopies will drift again. The real fix is publishing it once and depending on the published version, rather than keeping a copy per repo. Out of scope here.Also:
web/index.htmlreferences%VITE_GA_MEASUREMENT_ID%, which is not defined in any env file, so the analytics tag renders with a literal placeholder.🤖 Generated with Claude Code
https://claude.ai/code/session_01AeYoJmE6BUfw9AZJxoK9Fx