Commit Graph

21 Commits

Author SHA1 Message Date
shitratgit[bot] 4e7d6ec353 fix(web): remove undeployable local dependencies 2026-07-29 22:24:12 -07:00
Joel Hooks 42d5c4a61f feat(convex): custody transferred to joelclaw-api — apps/web is now a client
convex/ (schema, functions, deploy role for :3210) moved to
joelclaw-api; apps/web consumes generated api/types via link:.
sessions schema is a deliberate temporary v.union (auth + call
telemetry shapes) — separation chartered. All four readback checks
pass: deploy clean, tsc clean, no old-path refs, live read works.
Worker-authored, steering-verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 09:25:54 -07:00
Joel Hooks aae6ab0c8c Degrade apps/web Convex static generation when env is missing, seed placeholder slug params for Cache Components, and no-op client Convex providers during prerender 2026-03-10 09:15:07 -07:00
Joel Hooks 26c7614233 Sanitize Convex env reads and keep dynamic slug helper routes out of static build collection so Vercel production builds pass 2026-03-09 13:36:49 -07:00
Joel Hooks 9ce664c877 fix: getPost() supports all content types, not just article
Sequentially tries article/tutorial/essay/note resourceId prefixes.
Removes article-only type guard. Uses matched resourceId in diagnostics.
2026-03-02 10:52:41 -08:00
Joel Hooks 0e1a4ba629 fix: query all content types in getAllPosts/getPostSlugs
getAllPosts() and getPostSlugs() were hardcoded to type='article'.
Now queries article, tutorial, essay, note via Promise.all and merges.
2026-03-02 10:46:16 -08:00
Joel Hooks afd050a722 fix: getPost cacheLife 'max' → 'minutes' so tag revalidation actually works 2026-03-01 11:52:17 -08:00
Joel Hooks 8805397dbb fix: move notFound() outside 'use cache' boundary
notFound() is a runtime API that requires workUnitAsyncStorage context.
Calling it inside 'use cache' causes InvariantError during prerendering.

CachedArticleContent now returns null when post not found, and the
caller (StaticArticleShell) handles notFound() in request context.
Also uses cacheLife('minutes') so new articles appear without deploy.
2026-03-01 10:48:03 -08:00
Joel Hooks 4619e71e2d fix: use cacheLife('minutes') for getPost to enable deploy-free publishing
getPost() now caches for minutes instead of max, so new articles
appear within minutes of Convex upsert. Explicit tag revalidation
makes them appear instantly. 404 check moved outside cache boundary
in [slug]/page.tsx so stale null results don't block new content.
2026-03-01 10:43:57 -08:00
Joel Hooks a1d3d5bd36 fix: move 404 check outside cache boundary for deploy-free publishing
getPost() no longer uses 'use cache' — null results were cached
indefinitely, blocking new articles until a redeploy.

Now: getPost() fetches from Convex on every request (uncached).
CachedArticleContent receives post as prop, caches only MDX rendering.
New articles appear immediately after Convex upsert + tag revalidation.
2026-03-01 10:35:57 -08:00
Joel Hooks 8248fa59c5 fix: strip frontmatter from Convex content at read + write layers
- posts.ts: strip leading frontmatter/metadata before rendering
- content-review.ts: normalize content on fetch/persist to prevent
  future writes from reintroducing raw frontmatter
- seed-articles.ts: defensive strip on seed path

Fixes frontmatter metadata rendering as visible article body text.
2026-02-28 12:23:43 -08:00
Joel Hooks 4deaf73474 feat(ADR-0168): Vault→Convex direct pipeline, remove repo content
Phase 2 of ADR-0168 (Convex-canonical content lifecycle):

- Rewrite content-sync: Vault→Convex direct, no file copy/git commit/push
- Add content-verify function: diffs Vault sources vs Convex records
- Add content/seed.requested and content/verify.requested events
- Add joelclaw content seed/verify CLI commands
- Fix post frontmatter: store type, tags, source, channel, duration, updated
- Update Convex postFieldsValidator to accept full frontmatter
- Remove 175 ADR .md files and 22 post .mdx files from apps/web/content/
- Remove filesystem fallback from adrs.ts and posts.ts (Convex-only reads)
- Add .gitignore + README to apps/web/content/ skeleton
- Reseed Convex with complete frontmatter (175 ADRs, 21 posts)
2026-02-28 11:21:56 -08:00
Joel Hooks ec33ac1235 web: harden article rendering + source diagnostics 2026-02-28 06:37:17 -08:00
Joel Hooks e0e1b0d257 delete: remove dogfooding discovery — exposes sensitive materials
Removed discovery note that referenced internal egghead infrastructure,
private Loom recording, and internal PR details.
2026-02-27 21:47:17 -08:00
Joel Hooks a5914ece57 feat: joelclaw webhook provider for Inngest event proxy
- /webhooks/joelclaw with HMAC-SHA256 signature verification
- Forwards events to self-hosted Inngest at localhost:8288
- Submit route signs requests with x-joelclaw-signature
- Removed duplicate /webhooks/inngest-event endpoint
- Added post:slug cacheTag for revalidation (FBP-4)
2026-02-27 16:45:11 -08:00
Joel Hooks 923381353e feat(CFP-2): Read articles from Convex instead of filesystem
Codex implement step completed — tsc clean, build passes.
Committed manually because codex didn't commit (prompt strengthened).
Also: stronger commit requirement in story-pipeline implement prompt.
2026-02-27 09:49:47 -08:00
Joel Hooks 1077942d50 revert(CFP-2): restore filesystem article reads — async Convex breaks PPR prerender
CFP-2 made getPost/getAllPosts async for Convex reads, but Next.js 16
with PPR rejects uncached async data access outside <Suspense>.
ALL article pages failed prerender with 'Uncached data was accessed
outside of <Suspense>'.

CFP-2 and CFP-3 need to land together — Convex reads require
'use cache' boundaries first.
2026-02-27 09:21:43 -08:00
Joel Hooks 561b636f52 fix(story-pipeline): retries: 2 for transient SDK failures (ADR-0156)
retries: 0 made worker restarts fatal — Inngest couldn't retry
the step on the new worker. With retries: 2, the 1s restart window
is covered by Inngest's built-in retry backoff.

ADR-0156 rewritten: blue/green port swap > drain-then-restart.
Inngest is step-level stateless — we don't need to wait for runs,
just for the current in-flight step.
2026-02-27 09:19:32 -08:00
Joel Hooks c82474bf47 OG images from post frontmatter: image field → openGraph + twitter cards
- Added image? to PostMeta
- [slug]/page.tsx wires image into og:image and twitter:image
- MineClaw post with hero image + OG
2026-02-27 07:28:36 -08:00
Joel Hooks e7f36114c5 web: stabilize cache components build and route dynamic islands 2026-02-22 13:59:37 -08:00
Joel Hooks 016dccc295 redesign: cool finds index — full titles, readable descriptions, compact cards
- Titles wrap fully instead of truncating
- Relevance text shows complete (no line-clamp)
- Date shown as relative time (2d ago) above title, not stealing width
- Single type badge (repo/article/video) replaces full tag list
- Source URL removed from index (shown on detail page)
- Tighter card spacing for better scan density
- Re-removed duplicate self-hosting discovery (also from Vault source)
2026-02-22 08:07:35 -08:00