Files
Reactive-Resume/knip.json
T
Amruth Pillai b399e289d6 feat(web): redesign the landing page as one scroll-driven story
"Everything you've done, on one page." A single resume page is assembled,
written, restyled, checked, tailored and shared as the visitor scrolls,
followed by live community numbers, languages, a support receipt, a
closing call to action and the footer. It replaces the previous homepage
and its playgrounds.

Motion: a small scroll engine (features/homepage/scroll.ts) writes each
section's progress as --p on every animation frame, and the scenes derive
their motion from it with CSS calc(). React only re-renders on coarse
steps held in a zustand store. Reduced motion collapses every pinned
scene to one screen at its end state and stops all ambient motion.

Server-rendered copy: the web build now prerenders the homepage once per
locale (Vite app builder, features/homepage/prerender.tsx) into
apps/web/dist-prerender, which the server sends for "/" by `?locale=`,
then the saved locale cookie. main.tsx waits for the route to load before
React replaces the prerendered page, so it never flashes a loading screen.
dist-prerender is added to turbo outputs, the Docker image and the Vercel
function files.

SEO: localized title and description, a canonical per locale, hreflang
alternates for every locale over `/?locale=` addresses (the app now reads
that parameter), and SoftwareApplication JSON-LD. The FAQ structured data
is dropped because the page shows no FAQ.

Also: self-hosted Anybody and Martian Mono (landing only) and Newsreader
italic, graphite doodles as WebP, new Material Symbols in the icon subset,
the pull-cord theme switch on the app's theme cookie, and new catalog
strings extracted for translation.
2026-09-29 22:34:16 +02:00

79 lines
1.6 KiB
JSON

{
"$schema": "https://unpkg.com/knip@6/schema.json",
"tags": ["-lintignore"],
"workspaces": {
".": {
"entry": ["api/index.mjs"]
},
"apps/web": {
"entry": ["lingui.config.ts", "vite.config.ts", "vitest.config.ts", "src/features/homepage/prerender.tsx"],
"vite": {
"config": []
},
"vitest": {
"config": []
}
},
"apps/server": {
"ignoreDependencies": [
"@ai-sdk/anthropic",
"@ai-sdk/cerebras",
"@ai-sdk/cohere",
"@ai-sdk/deepseek",
"@ai-sdk/fireworks",
"@ai-sdk/google",
"@ai-sdk/groq",
"@ai-sdk/mistral",
"@ai-sdk/openai",
"@ai-sdk/openai-compatible",
"@ai-sdk/perplexity",
"@ai-sdk/togetherai",
"@ai-sdk/xai",
"@aws-sdk/client-s3",
"@better-auth/api-key",
"@better-auth/drizzle-adapter",
"@better-auth/infra",
"@better-auth/passkey",
"@bramus/specificity",
"@formepdf/core",
"@formepdf/react",
"@orpc/experimental-ratelimit",
"@sindresorhus/slugify",
"@t3-oss/env-core",
"@uiw/color-convert",
"@vercel/blob",
"ai",
"bcrypt",
"cjk-regex",
"css-tree",
"drizzle-zod",
"fast-json-patch",
"fast-png",
"fflate",
"ioredis",
"jose",
"jsonrepair",
"node-html-parser",
"nodemailer",
"ollama-ai-provider-v2",
"react-email",
"react-reconciler",
"resumable-stream",
"sanitize-html",
"sharp",
"tokenx",
"ts-pattern",
"unique-names-generator",
"uuid"
]
},
"tooling": {
"entry": ["issue-labels.mjs"]
},
"packages/api": {
"ignoreDependencies": ["ioredis"]
}
},
"ignoreDependencies": ["@reactive-resume/config"]
}