Skip to content

docs: refresh documentation; fix robots, env schema and Claude fetchers - #139

Merged
danielheene merged 30 commits into
developfrom
docs/refresh-docs
Nov 12, 2026
Merged

danielheene merged 30 commits into
developfrom
docs/refresh-docs

Conversation

@danielheene

@danielheene danielheene commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

Summary

Started as a documentation refresh and grew into the fixes and cleanups that turned up along the way: crawler rules and production detection, the Claude fetchers, a dependency and tooling round, and a rework of how pages, posts and resume documents are loaded by slug. 26 commits.

Changes

Docs

  • README, AGENTS.md and llms.txt rewritten against the code: CI section (the ci.yml it described no longer exists), scripts, env variable table, routes, project structure, known issues.
  • AGENTS.md no longer claims the preview route checks a session; it only checks PREVIEW_SECRET.

Crawlers and production detection

  • robots.txt serves one rule for every crawler on production and Disallow: / everywhere else. This opens production to all crawlers, AI training crawlers included.
  • New required env variable PRODUCTION_HOST. isProductionHost() compares it with SERVER_HOST; robots.ts and the PDF draft watermark use it instead of a hardcoded host.
  • robots.ts, manifest.ts and global-error.tsx stay at the root of app/: Next ignores all three inside a route group. manifest.ts was inside (frontend), which is why /manifest.webmanifest returns 404 on production today. sitemap.ts moves into app/(frontend)/, where it works.
  • global-error.tsx loads the stylesheet and fonts itself (it rendered unstyled).

Environment

  • OPENAI_API_KEY removed (nothing read it); STATUS_PAGE_WORKER_HEARTBEAT_PUSH_URL declared as optional.
  • process.env is typed from the Zod schema in global.d.ts instead of a hand-kept list.
  • next.config.ts splits env parsing and the dev tunnel into functions and writes the parsed values back to process.env; empty optional variables are unset.

Claude calls (src/lib/anthropic/)

  • Meta descriptions were generated from the page URL alone by a model that cannot fetch. They are now generated from the document's own title and text, and clamped to 160 characters.
  • One shared helper: claude-haiku-5-5 at low effort, output limit, timeout, and an error instead of a truncated or declined answer. Resume translation uses claude-sonnet-5-5.
  • Prompts reworked; alt text sees a 1024px image instead of 512px.
  • The two "generate" actions in the admin check the session; the alt-text one only fetches same-origin media.
  • A failed alt-text generation no longer fails the image upload.
  • Removed the meta description hook that was never wired to the field.

Content loading

  • fetchPostBySlug and fetchDocumentBySlug join fetchPageBySlug; the blog post and resume routes use them and render inside a <Suspense> shell like /[slug] already did.
  • Published reads filter on _status, preview reads do not. Resume documents have no drafts and are not filtered.
  • The default language is English everywhere; fetchPageBySlug no longer defaults to German (German is only used for the PDF).
  • /resume/latest resolves through fetchDocumentBySlug; resume pages get a canonical URL pointing at the real slug.
  • The resume download button is a plain <a download> instead of next/link, and is skipped when a document has no URL (this crashed the prerender of /resume).

Payload

  • generatorFlags defaults to and reads as an empty array; GeneratorFlag / GeneratorFlags are shared JSON-schema definitions in the generated types. The normalizeIncomingFlags hook is removed.
  • Deleting a topic is allowed only when the references collection holds no row pointing at it.
  • The PDF generator settings JSON field is required.
  • The initial migration creates its pages through the migration's own payload and transaction.

Dependencies and tooling

  • Bumps: Next 16.4.6, React 19.3.1, tailwind-variants 4, tailwindcss 4.3.5, takumi-js 2.20, Playwright 1.65, oxlint 1.93, oxfmt 0.78. tailwind-merge removed (no longer imported).
  • syncpack pins each package family (Payload, Storybook, Vitest, Playwright, React) with pinVersion. sameRange compares one dependency across packages, so in this single-package repo it never caught a mismatch such as react next to an older react-dom.
  • Scripts renamed deps:* to packages:*; package.json scripts are sorted by syncpack; the separate format script is gone (lint:fix covers it).
  • @next/bundle-analyzer wired into next.config.ts; bun run analyze runs a build with ANALYZE=true. No CI job, no budget.
  • e2e-docker.sh derives its image tag from the installed @playwright/test.

CI

  • actions/cache and actions/upload-artifact pinned to commit SHAs.
  • build-and-deploy.yml restores .next/cache between builds.
  • .github/actionlint.yaml (only configured the removed ci.yml) is deleted.

Before merging

  • PRODUCTION_HOST must be set in the Dokploy app and worker environments. It exists in the GitHub environments. Without it production serves Disallow: / and PDFs carry the DRAFT watermark.
  • The OPENAI_API_KEY secret can be deleted from GitHub and Doppler.
  • tailwind-variants 4 is a major version; the UI has not been checked by eye after the bump.

Testing

  • bun run lint, bun run typecheck, bun run test (948 tests), bun run packages:lint and a local production build (bun run build, 95 static pages) pass.
  • Not run: the E2E suite, the changed migration, and any live Claude call. The new prompts and model IDs are untested against real output.
  • Not verified at runtime: the topic-deletion check, and whether unknown slugs still answer 404 now that notFound() runs inside a <Suspense> shell.
  • Type-aware linting (typeAware) stays off until a separate strict-mode pass.

README: CI section described a ci.yml that no longer exists; rewritten for lint-and-test.yml (incl. Semgrep, disabled E2E) and build-and-deploy.yml (boot checks, single build). Fixed dev/generate/build/seed scripts, env variable table (NEXT_PUBLIC_SERVER_URL, NEXT_PUBLIC_STATUS_PAGE_URL, RESUME_REDIRECT_URL_BASE), API routes and the project structure tree.

AGENTS: dev no longer starts Storybook, all four authenticated SSE channel prefixes, Semgrep convention, plugins/stories/llms.txt notes, and a refreshed Known Issues list (pdfjs-dist pin replaces the removed postcss-merge-rules one).

llms.txt: removed references to src/access, the heartbeat route and the next.config env block.
Also drops .github/actionlint.yaml, whose only entry configured the removed ci.yml, and updates README and AGENTS for the new paths.

global-error.tsx stays at the app root: Next only resolves it there.
global-error replaces the root layout, so the frontend CSS and font variables its classes rely on were never loaded and the page rendered unstyled.
Drops the per-bot split that limited everything except search engines and link-preview bots to /llms.txt. Tests follow the single rule.
…cpack

@playwright/test was on ~1.63.0 while playwright was on ~1.64.1 and the Docker image on v1.62.1. The sameRange group never caught it: syncpack compares one dependency across packages, not two dependencies with each other. pinVersion does. e2e-docker.sh now reads the image tag from the installed @playwright/test.
Nothing read it; all AI calls go through src/lib/anthropic. Removed from the env schema, global.d.ts, .env.test, the deploy workflow and the docs.
…schema

The heartbeatPing handler already read it; it is optional, so an unset or empty value still passes validation.
robots.txt only opens the site when SERVER_HOST is daniel.heene.io, the same signal the PDF draft watermark uses. NODE_ENV is production in every deployed image, so it cannot tell the environments apart.
robots.txt and the PDF draft watermark compared SERVER_HOST with a hardcoded daniel.heene.io. Both now go through isProductionHost(), which compares it with the new required PRODUCTION_HOST variable and treats an unset value as not production.
…s, move to Haiku 5.5

The meta description fetcher sent only the page URL to a model that cannot fetch, so the text was invented from the slug. It now sends the document's own title and text and clamps the result to 160 characters.

All four fetchers share generateAnthropicText(): claude-haiku-5-5 at low effort, an output limit, a timeout, and an error instead of a truncated or declined answer. Prompts wrap their input in tags and state language, voice and what to leave untranslated; alt text sees a 1024px image instead of 512px.

The inline generate actions check the session, the alt action only fetches same-origin media, and a failed alt generation no longer fails the image upload. The fetcher modules drop 'use server'. Removes the never-wired meta description hook.
Translation is read closely and runs rarely, so it gets the stronger model; alt text, excerpts and meta descriptions stay on Haiku 5.5.
Adds the Claude helpers, session check, production detection, CI workflows, Dockerfile and release config; gives every list item a single link; moves secondary material into the Optional section.
Next ignores robots.ts and manifest.ts inside a route group: neither route was compiled, so /robots.txt would have 404ed after the earlier move, and /manifest.webmanifest already does on production. sitemap.ts is unaffected and stays in app/(frontend).
bun run analyze builds in compile mode with @next/bundle-analyzer and runs scripts/check-bundle-size.mjs, which reports the gzipped first-load JavaScript of every public route.

The new PR job "Build & Bundle Size" runs the same build with .env.test, publishes the table to the job summary, uploads the analyzer reports and fails above 265 kB. 170 kB, the usual recommendation, is reported as a warning: the framework chunks alone are 189 kB, so no route can meet it today (largest route: 251 kB).
@kilo-code-bot

kilo-code-bot Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Code Review Summary

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
Issue Details (click to expand)

CRITICAL

File Line Issue
src/migrations/00000001_initialize_basic_site.ts 200 payload.update returns a single document, but the code destructures docs: [updated] — updated will always be undefined at runtime. Pre-existing; unchanged in this PR, re-verified at current HEAD.

WARNING

File Line Issue
next.config.ts 245 createTunnel can resolve to null, but the exit handler dereferences childProcess.killed/childProcess.kill without a null check. Pre-existing; unchanged in this PR, re-verified at current HEAD.
Files Reviewed (1 file)
  • oxlint.config.ts - no issues (enabled typescript/no-redundant-type-constituents warning)

Fix these issues in Kilo Cloud

Previous Review Summaries (9 snapshots, latest commit 29e004f)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 29e004f)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
Issue Details (click to expand)

CRITICAL

File Line Issue
src/migrations/00000001_initialize_basic_site.ts 200 payload.update returns a single document, but the code destructures docs: [updated] — updated will always be undefined at runtime. Pre-existing; unchanged in this PR, re-verified at current HEAD.

WARNING

File Line Issue
next.config.ts 245 createTunnel can resolve to null, but the exit handler dereferences childProcess.killed/childProcess.kill without a null check. Pre-existing; unchanged in this PR, re-verified at current HEAD.
Files Reviewed (4 files)
  • src/widgets/UmamiWidget/UmamiWidget.data.ts - no issues (added requireSession() to all exported server actions)
  • src/widgets/UmamiWidget/UmamiWidget.data.test.ts - no issues (added test for session rejection)
  • src/migrations/00000001_initialize_basic_site.ts - 1 pre-existing issue (CRITICAL)
  • next.config.ts - 1 pre-existing issue (WARNING)

Fix these issues in Kilo Cloud

Previous review (commit afe6036)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
Issue Details (click to expand)

CRITICAL

File Line Issue
src/migrations/00000001_initialize_basic_site.ts 200 payload.update returns a single document, but the code destructures docs: [updated] — updated will always be undefined at runtime. Pre-existing; unchanged in this PR, re-verified at current HEAD.

WARNING

File Line Issue
next.config.ts 245 createTunnel can resolve to null, but the exit handler dereferences childProcess.killed/childProcess.kill without a null check. Pre-existing; unchanged in this PR, re-verified at current HEAD.
Files Reviewed (7 files)
  • src/lib/umami/getToken.ts - new file, no issues (getToken moved here unchanged from UmamiWidget.data.ts)
  • src/lib/fetchers/fetchTrendingBlogPosts.ts - import updated to new getToken path, no issues
  • src/lib/fetchers/fetchTrendingBlogPosts.test.ts - mock updated to new path, no issues
  • src/widgets/UmamiWidget/UmamiWidget.data.ts - getToken removed, now imports from new path, no issues
  • src/widgets/UmamiWidget/UmamiWidget.data.test.ts - imports updated, no issues
  • src/migrations/00000001_initialize_basic_site.ts - 1 pre-existing issue (CRITICAL)
  • next.config.ts - 1 pre-existing issue (WARNING)

Fix these issues in Kilo Cloud

Previous review (commit 8ef687e)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
Issue Details (click to expand)

CRITICAL

File Line Issue
src/migrations/00000001_initialize_basic_site.ts 200 payload.update returns a single document, but the code destructures docs: [updated] — updated will always be undefined at runtime. Pre-existing; unchanged in this PR, re-verified at current HEAD.

WARNING

File Line Issue
next.config.ts 245 createTunnel can resolve to null, but the exit handler dereferences childProcess.killed/childProcess.kill without a null check. Pre-existing; unchanged in this PR, re-verified at current HEAD.
Files Reviewed (27 files)
  • src/blocks/ResumeAboutMeBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/ResumeContactBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/ResumeCustomersBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/ResumeDownloadsBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/ResumeExperienceBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/ResumeProjectsBlock/Renderer/Renderer.tsx - no issues
  • src/blocks/TrendingBlogPostsBlock/Renderer/Renderer.tsx - no issues
  • src/globals/PDFGeneratorSettings/hooks/sanitizeSkillSorting.ts - no issues
  • src/lib/fetchers/_fetchGlobalData.ts - no issues
  • src/lib/fetchers/fetchTrendingBlogPosts.ts - no issues
  • src/lib/generatePreviewPath.ts - no issues
  • src/lib/generateResumeId.ts - no issues
  • src/lib/mapbox/fetchAddressData.ts - no issues
  • src/lib/mapbox/fetchCoordinatesData.ts - no issues
  • src/lib/resolveRelation.ts - no issues
  • src/lib/umami/isTrackingSuppressed.server.ts - no issues
  • src/lib/umami/track.server.ts - no issues
  • src/pdf/lib/buildDocumentHeader.ts - no issues
  • src/pdf/lib/buildIntroductionSection.ts - no issues
  • src/pdf/lib/buildLanguageSection.ts - no issues
  • src/pdf/lib/buildResumeDocumentData.ts - no issues
  • src/pdf/lib/buildSkillSections.ts - no issues
  • src/pdf/lib/buildWorkExperienceSection.ts - no issues
  • src/widgets/ScheduledJobsWidget/ScheduledJobsWidget.data.ts - no issues
  • src/widgets/StatusBannersWidget/StatusBannersWidget.data.ts - no issues
  • src/migrations/00000001_initialize_basic_site.ts - 1 issue (pre-existing, re-verified)
  • next.config.ts - 1 issue (pre-existing, re-verified)

Fix these issues in Kilo Cloud

Previous review (commit 3066c09)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
Issue Details (click to expand)

CRITICAL

File Line Issue
src/migrations/00000001_initialize_basic_site.ts 200 payload.update returns a single document, but the code destructures docs: [updated] — updated will always be undefined at runtime

WARNING

File Line Issue
next.config.ts 245 createTunnel can resolve to null, but the exit handler dereferences childProcess.killed/childProcess.kill without a null check
Files Reviewed (33 files)
  • next.config.ts - 1 issue
  • src/migrations/00000001_initialize_basic_site.ts - 1 issue
  • src/lib/typeGuards.ts - no issues
  • src/lib/RedisHandler.ts - no issues
  • src/collections/BlogTopics/index.ts - no issues
  • src/collections/References/index.ts - no issues
  • src/fields/GeneratorFlags/index.ts - no issues
  • src/globals/PDFGeneratorSettings/index.ts - no issues
  • src/lib/fetchers/fetchDocumentBySlug.ts - no issues
  • src/lib/fetchers/fetchPageBySlug.ts - no issues
  • src/lib/fetchers/fetchPostBySlug.ts - no issues
  • src/types/payload.ts - no issues
  • src/types/environment.ts - no issues
  • global.d.ts - no issues
  • oxlint.config.ts - no issues
  • package.json - no issues
  • syncpack.config.mjs - no issues
  • tsconfig.json - no issues
  • bun.lock - no issues
  • app/(frontend)/[slug]/opengraph-image.tsx - no issues
  • app/(frontend)/blog/post/[slug]/opengraph-image.tsx - no issues
  • app/(frontend)/blog/post/[slug]/page.tsx - no issues
  • app/(frontend)/resume/[slug]/opengraph-image.tsx - no issues
  • app/(frontend)/resume/[slug]/page.tsx - no issues
  • AGENTS.md - no issues
  • README.md - no issues
  • oxfmt.config.ts - no issues
  • .github/actions/setup/action.yml - no issues
  • .github/workflows/build-and-deploy.yml - no issues
  • .github/workflows/lint-and-test.yml - no issues

Fix these issues in Kilo Cloud

Previous review (commit bb0a381)

Status: No Issues Found | Recommendation: Merge

Incremental review of changes since 8931a21fab0aa12e960869c8282adb898b9ae5d2. The PR refactors Claude calls behind a shared generateAnthropicText helper, adds PRODUCTION_HOST env validation with isProductionHost(), makes generatorFlags required with schema definitions, removes the normalizeIncomingFlags hook, and wires requireSession() into paid-action Server Actions.

Files Reviewed (33 files)
  • app/(frontend)/sitemap.ts - no issues
  • app/global-error.tsx - no issues
  • app/robots.ts - no issues
  • lefthook.yml - no issues
  • next.config.ts - no issues
  • package.json - no issues
  • payload.config.ts - no issues
  • src/collections/MediaImages/components/AltField.tsx - no issues
  • src/collections/MediaImages/hooks/generateAlt.ts - no issues
  • src/fields/GeneratorFlags/index.ts - no issues
  • src/fields/Meta/MetaDescriptionField/FieldComponent.tsx - no issues
  • src/fields/Meta/MetaDescriptionField/index.ts - no issues
  • src/fields/Meta/index.ts - no issues
  • src/globals/SiteSettings/index.ts - no issues
  • src/jobs-queue/handlers/createResumeDocument.ts - no issues
  • src/lib/actions/enqueueBilingualTranslation.ts - no issues
  • src/lib/actions/requireSession.ts - no issues
  • src/lib/anthropic/fetchExcerpt.ts - no issues
  • src/lib/anthropic/fetchImageAltText.ts - no issues
  • src/lib/anthropic/fetchMetaDescription.ts - no issues
  • src/lib/anthropic/fetchTranslation.ts - no issues
  • src/lib/anthropic/generateAnthropicText.ts - no issues
  • src/lib/extractDocumentText.ts - no issues
  • src/lib/isProductionHost.ts - no issues
  • src/lib/resolveOwnMediaUrl.ts - no issues
  • src/lib/uploadHeroSlideMedia.ts - no issues
  • src/pdf/index.tsx - no issues
  • src/types/environment.ts - no issues
  • src/types/payload.ts - no issues
  • syncpack.config.mjs - no issues
  • Deleted: src/fields/GeneratorFlags/hooks/normalizeIncomingFlags.ts, src/fields/GeneratorFlags/hooks/normalizeIncomingFlags.test.ts, src/fields/Meta/MetaDescriptionField/hooks/generateMetaTitleHook.ts, .github/actionlint.yaml

Previous review (commit 8931a21)

Status: No Issues Found | Recommendation: Merge

Incremental review of changes since 8dbf241a8658ed3f0ca012136790c3d951725f76 (2 files). The download button now guards on document_*?.url and uses a plain <a download> with an accessible label instead of next/link, which is appropriate for file downloads.

Files Reviewed (2 files)
  • src/blocks/ResumeDownloadsBlock/Renderer/Renderer.client.tsx - incremental change, no issues
  • src/blocks/ResumeDownloadsBlock/Renderer/ResumeDownloadButton.tsx - incremental change, no issues

Previous review (commit 8dbf241)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (33 files)
  • AGENTS.md
  • README.md
  • llms.txt
  • next.config.ts
  • package.json
  • scripts/check-bundle-size.mjs (deleted)
  • scripts/e2e-docker.sh
  • src/collections/MediaImages/components/AltField.tsx
  • src/collections/MediaImages/hooks/generateAlt.ts
  • src/fields/Meta/MetaDescriptionField/FieldComponent.tsx
  • src/fields/Meta/MetaDescriptionField/hooks/generateMetaTitleHook.ts (deleted)
  • src/fields/Meta/MetaDescriptionField/index.ts
  • src/fields/Meta/index.ts
  • src/lib/actions/enqueueBilingualTranslation.ts
  • src/lib/actions/requireSession.ts
  • src/lib/anthropic/fetchExcerpt.test.ts
  • src/lib/anthropic/fetchExcerpt.ts
  • src/lib/anthropic/fetchImageAltText.ts
  • src/lib/anthropic/fetchMetaDescription.test.ts
  • src/lib/anthropic/fetchMetaDescription.ts
  • src/lib/anthropic/fetchTranslation.test.ts
  • src/lib/anthropic/fetchTranslation.ts
  • src/lib/anthropic/generateAnthropicText.test.ts
  • src/lib/anthropic/generateAnthropicText.ts
  • src/lib/extractDocumentText.test.ts
  • src/lib/extractDocumentText.ts
  • src/lib/isProductionHost.test.ts
  • src/lib/isProductionHost.ts
  • src/lib/resolveOwnMediaUrl.test.ts
  • src/lib/resolveOwnMediaUrl.ts
  • src/pdf/index.tsx
  • src/types/environment.ts
  • syncpack.config.mjs

Previous review (commit c01ef27)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (4 files)
  • .github/workflows/lint-and-test.yml - removed the compile-only Build & Bundle Size PR job
  • AGENTS.md - updated bundle budget notes to reflect local-only checks
  • README.md - updated PR CI steps to remove the Build & Bundle Size stage
  • llms.txt - updated build/deployment description to reflect local-only bundle budget

Previous review (commit 8ccfb80)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (43 files)
  • .env.test
  • .github/workflows/build-and-deploy.yml
  • .github/workflows/lint-and-test.yml
  • AGENTS.md
  • README.md
  • app/(frontend)/sitemap.ts
  • app/global-error.tsx
  • app/manifest.ts
  • app/robots.test.ts
  • app/robots.ts
  • bun.lock
  • global.d.ts
  • llms.txt
  • next.config.ts
  • package.json
  • scripts/check-bundle-size.mjs
  • scripts/e2e-docker.sh
  • src/collections/MediaImages/components/AltField.tsx
  • src/collections/MediaImages/hooks/generateAlt.ts
  • src/fields/Meta/MetaDescriptionField/FieldComponent.tsx
  • src/fields/Meta/MetaDescriptionField/hooks/generateMetaTitleHook.ts
  • src/fields/Meta/MetaDescriptionField/index.ts
  • src/fields/Meta/index.ts
  • src/lib/actions/enqueueBilingualTranslation.ts
  • src/lib/actions/requireSession.ts
  • src/lib/anthropic/fetchExcerpt.test.ts
  • src/lib/anthropic/fetchExcerpt.ts
  • src/lib/anthropic/fetchImageAltText.ts
  • src/lib/anthropic/fetchMetaDescription.test.ts
  • src/lib/anthropic/fetchMetaDescription.ts
  • src/lib/anthropic/fetchTranslation.test.ts
  • src/lib/anthropic/fetchTranslation.ts
  • src/lib/anthropic/generateAnthropicText.test.ts
  • src/lib/anthropic/generateAnthropicText.ts
  • src/lib/extractDocumentText.test.ts
  • src/lib/extractDocumentText.ts
  • src/lib/isProductionHost.test.ts
  • src/lib/isProductionHost.ts
  • src/lib/resolveOwnMediaUrl.test.ts
  • src/lib/resolveOwnMediaUrl.ts
  • src/pdf/index.tsx
  • src/types/environment.ts
  • syncpack.config.mjs

Reviewed by free · Input: 20K · Output: 1.2K · Cached: 69.6K

The job built against .env.test. The analyzer and the budget check stay as local tooling (bun run analyze).
Drops scripts/check-bundle-size.mjs, the bundle:check script and the size budget. bun run analyze is now a plain ANALYZE=true build.
next/link threw on an undefined href and failed the prerender of /resume when a resume document has no url. A file download is not a route, so the button is now an <a download>, and it is skipped when the document has no url.
Next 16.4.6, tailwind-variants 4, tailwindcss 4.3.5, takumi-js 2.20, oxlint 1.93, oxfmt 0.78, Playwright 1.65 (both packages, pin updated). syncpack now sorts scripts; the lefthook package-json step also matches bun.lock.
…a definitions

generatorFlags is required with an empty default and reads as [] when unset; GeneratorFlag and GeneratorFlags are JSON-schema definitions referenced by the generated types. The two create calls that omitted the field now pass an empty array.
generatorFlags no longer runs a beforeChange hook; the hook and its test are deleted.
Updates CI and docs for the new script names, trims syncpack config comments, removes unused tailwind-merge and bumps React.
sameRange compares one dependency across packages, so it never caught react 19.3.1 next to react-dom 19.3.0. Payload, Storybook, Vitest, Playwright and React are pinned with pinVersion instead; react-dom moves to ^19.3.1.
… config

global.d.ts derives ProcessEnv from the Zod schema. next.config.ts splits env parsing and the dev tunnel into functions and writes the parsed values back, unsetting empty optional variables instead of storing the string 'undefined'. tsconfig.json is valid JSON again. oxlint keeps typeAware off until the strict-mode refactor.
…g fetchers

fetchPostBySlug and fetchDocumentBySlug join fetchPageBySlug; the blog post and resume routes use them and render inside a Suspense shell. Published reads filter on _status, preview reads do not, and resume documents (no drafts) are not filtered at all. Topic deletion counts rows in the references collection. The initial migration creates its pages through the migration's own payload and transaction.
Comment thread next.config.ts
* replace Node's default signal behaviour and let the wrapper's own
* exit-code handling be pre-empted by a hardcoded `process.exit(0)`.
*/
process.once('exit', () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

WARNING: createTunnel can resolve to null (on error or non-zero exit), but the process.once('exit') handler dereferences childProcess.killed and childProcess.kill('SIGTERM') without a null check. If the tunnel fails and the process exits, this throws.

The directive turns every export of a module into a server action, a publicly callable endpoint. It was on 23 modules (block renderers, PDF builders, fetchers, Payload hooks, widget data loaders) and two functions that no client component calls. The 21 remaining directives mark functions a client component invokes or receives as a prop.
UmamiWidget.data.ts is a 'use server' module, so its getToken export was a callable endpoint returning the Umami bearer token. It now lives in src/lib/umami/getToken.ts, a plain server module.
fetchWebsite, fetchStats, fetchEvents, fetchPaths and fetchPageViews are server actions and returned analytics data to any caller. Each now calls requireSession() first.
@danielheene
danielheene merged commit b537d5f into develop Nov 12, 2026
5 checks passed
@danielheene
danielheene deleted the docs/refresh-docs branch November 12, 2026 07:59
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