Repository navigation
Move to TanStack Start and add personal learning - #16
Merged
Merged
Conversation
The app now builds with Vite and runs on TanStack Start while every route, component and localStorage key keeps its current behaviour. - package.json: drop Next/PostCSS, add @tanstack/react-start and @tanstack/react-router, Vite 8 and Tailwind's Vite plugin; scripts become dev/build/start/lint/typecheck/test - vite.config.ts: Tailwind plugin, React plugin and TanStack Start configured with srcDirectory "src" and routesDirectory "routes" - tsconfig.json: bundler resolution, "@/*" path alias, Vite client types - eslint.config.mjs: flat config that reproduces the six jsx-a11y rules plus the two react-hooks rules the previous next/core-web-vitals preset enforced, so the port does not smuggle in an accessibility or behaviour refactor - .gitignore: ignore dist/ and .tanstack/ instead of .next/, and stop ignoring .env.example - remove next.config.ts, proxy.ts, postcss.config.mjs, next-env.d.ts and the one-off migration helper scripts
…uter Components, hooks, lib, types and the stylesheet now live under src/ so the Vite root and the "@/*" alias have a single source directory. File contents change only where they touched Next.js APIs. - components/hooks/lib/types: relocated with git mv so history follows - router-nav.ts: usePathname/useSearchParams adapters over TanStack Router state, so call sites keep their shape - next/link -> @tanstack/react-router Link, next/navigation -> the adapters - next/image usages were already plain <img> elements; drop the stale @next/next disable comments that no longer refer to an installed plugin - app-url.ts: VITE_APP_URL-backed public origin helper - globals.css: import the self-hosted Fontsource Geist families and keep the "--font-geist-*" variables the theme tokens already referenced - roadmap-intake: read the body from a standard Request instead of NextRequest
Loaders run in the browser on client-side navigation, so anything that reads the in-memory store now crosses a server-function boundary explicitly. The password gate becomes request middleware instead of Next.js edge middleware. - fns.ts: listGalleryFn and getPublicWorkspaceFn wrap the existing store readers, so gallery and public workspace loaders keep the same data shape - gate.ts: reproduces proxy.ts behaviour with the same cookie, the same "/gate" and "/api/gate" exemptions, redirects to /gate?next=..., and the same fail-closed treatment of /share/* and /embed/*. Static asset prefixes and file extensions pass through so the bundle and /robots.txt load before the gate - start.ts: registers the gate as request middleware for every request
Each App Router page becomes a thin file route plus a view component that holds the body it already had. Every URL keeps its current path, so links, bookmarks and client fetches are unaffected. - routes/: route definitions only - path, search validation, per-page head() metadata and loaders; the former page bodies move to views/ unchanged apart from receiving their data as props instead of reading loader params from Next.js - views/: prop-driven page components (GalleryView, ShareView, EmbedView, WorkspaceView take their data as arguments), so the same markup renders on the server and on client-side navigation - /gallery keeps its q/mode/contentType search params through validateSearch and loaderDeps; /settings keeps its tab param - /api/* handlers keep their exact paths and response shapes - robots.txt and sitemap.xml become routes instead of metadata files - /notes rewrites to /workspaces the way next.config.ts did - routeTree.gen.ts is checked in, matching the generated-router convention - delete the app/ tree now that nothing imports it
TanStack Start needs three files that Next.js used to synthesise: the router
factory, the browser hydration entry and the server entry.
- router.tsx: single getRouter() with scroll restoration and intent
preloading, written side-effect free because both the client and the server
entries import it
- client.tsx: hydrateRoot over <StartClient /> in StrictMode
- server.ts: default-export the framework's { fetch } handler. The Vite dev
middleware calls `.default.fetch`, so exporting a bare function makes every
request fail with "(intermediate value).default.fetch is not a function"
`vite build` leaves dist/client (assets) and dist/server/server.js (a fetch handler). Without Nitro or srvx installed, this file is the whole production server: one process, one origin, no extra runtime dependency. - serves dist/client directly for existing files, with an immutable one-year cache on /assets/* and a one-hour cache on the rest - forwards every other request to the built handler as a web Request/Response, including multiple set-cookie headers, which a plain object would collapse - rejects path traversal outside dist/client - honours PORT and HOST (default 0.0.0.0:3000); `npm start` already points at this file from the tooling commit
- README: how to install, run the dev server and the production build, the gate password variable, and the in-memory store caveat that share and embed links do not survive a restart - .env.example: VITE_APP_URL, GATE_PASSWORD, optional PORT and the BYO model keys the app already read, with no real values committed - public/og.png: one static 1200x630 image referenced by the root head, replacing the opengraph-image and twitter-image routes that Next.js generated at request time
The analyzer, its validators, tests and config example were not imported by the app, the routes or the tests. Nothing references "ui-analysis" after this change, and the vitest suite still covers the modules the app does use.
Scout keeps packs, resources, sources and queue jobs in one SQLite file. Prompts are versioned markdown so a pack can record which versions built it.
YouTube discovery reads channel uploads or RSS, never search.list. Articles go through Jina Reader, and transcripts try the local helper before the hosted fallback.
One queue drives discovery, fetching, extraction and workspace builds. Approval copies the picks into an idempotent roadmap, and quiz cards keep their quotes and timestamps.
The wizard starts a pack, shows progress, and publishes approved picks into local storage. Agents reach the same SQLite library through a small stdio MCP server, and the research endpoint only accepts validated links.
The dashboard adds a Continue card, review count and reading shelf for the last published pack. Settings gains a sources panel, auto-check controls and copy-ready MCP configs for installed agents.
The README and env example list every key, fallback and agent path. Tests cover timestamp and chapter parsing, quote checks, RSS entries, agent output and the job queue.
The app is single-user and local-first, so the gate only got in the way. With no login in front of it, server.mjs now listens on 127.0.0.1 unless HOST is set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the zero-radius emerald/indigo look and the !important override layer with honest tokens: #000 page, #111 surfaces, white text and pill buttons, and a sky-blue accent kept for data marks. Components now use the tokens directly. The studio gets a left sidebar, noun titles, a KPI strip on Home, and no glows, gradients or pulsing dots. The accent and density settings apply on every studio page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fix primary buttons that rendered as blank pills: element styles in globals.css sat outside Tailwind's layers and beat every utility, so a Link's text colour was always inherited. Base and component styles now live in @layer base and @layer components. Workspaces becomes one list of rows with a segmented filter and sort. Create gets a compact parsing toggle and a single action row. Analytics uses the same KPI strip as Home, a heatmap that fills its panel, and plain lists for progress and milestones. Scout lists past goals with their status, and its sources panel uses switches and no longer scrolls inside itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds Today, Library, the EPUB reader, reviews with FSRS scheduling, Pomodoro and manual roadmaps, all stored in the browser. Convex functions and a setup script add optional owner-only sync. Scout gains free-web discovery and source evidence, and the PWA gets a service worker for offline use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 354 files, which is 254 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. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters: 3
📒 Files selected for processing: 354
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 |
This was referenced Oct 22, 2026
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.
Middle of the stack: #15 → #16 → #17
Merge order: #15, then #16, then #17.
delete_branch_on_mergeis off, so click Delete branch after each merge; that makes GitHub retarget the next PR tomain.This PR targets the branch of the PR below it, so GitHub ignores closing keywords (
Closes #n) here until #15 merges and its branch is deleted, which retargets this PR tomain.Summary
Replaces the Next.js app with Vite + TanStack Start, then builds the personal learning app on it.
The last commit (
Add personal learning, the reader and optional Convex sync) was uncommitted work in the local checkout until now.Evidence
mainis the Next.js app.After: on this branch:
npm run typecheck: exit 0npm run typecheck:convex: exit 0npm test: 12 files, 50 tests passednpm run lint: 0 errors, 32 warningsnpm run build: builtgitleaks gitover this PR's commits with.gitleaks.tomlfrom Security: fail CI when a commit adds a secret #15:no leaks found.Merge Danger
Door: two-way
Revertable, but it swaps the framework, so a revert means going back to the Next.js build.
Blast Radius: whole app
Every route, the build and the production host change. #14 (Next.js security patch) does not apply on top of this branch; there is no Next, sharp or React Server Components package left.
🤖 Generated with Claude Code