Move to TanStack Start and add personal learning#16

merged20
security/secret-scanning
feat/tanstack-start
opened21d agobySScreen
View on GitHubTwo-way sync enabledPR last imported 21d ago

Middle of the stack: #15 → #16 → #17

Merge order: #15, then #16, then #17. delete_branch_on_merge is off, so click Delete branch after each merge; that makes GitHub retarget the next PR to main.

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 to main.

Summary

Replaces the Next.js app with Vite + TanStack Start, then builds the personal learning app on it.

text
1build Next.js -> Vite 8 + TanStack Start, served by server.mjs (Node)
2routing app/ directory -> src/routes/ file routes + server functions
3features + Scout: free-resource discovery, transcripts, LLM plan, SQLite job queue, MCP bridge
4 + Today, Library, EPUB reader, reviews (FSRS), Pomodoro, manual roadmaps
5 + optional owner-only Convex sync (convex/, scripts/prepare-convex-auth.mjs)
6 + service worker for offline use
7removed password gate, ui-analysis module

The last commit (Add personal learning, the reader and optional Convex sync) was uncommitted work in the local checkout until now.

Evidence

  • Before: main is the Next.js app. After: on this branch:
    • npm run typecheck: exit 0
    • npm run typecheck:convex: exit 0
    • npm test: 12 files, 50 tests passed
    • npm run lint: 0 errors, 32 warnings
    • npm run build: built
  • gitleaks git over this PR's commits with .gitleaks.toml from #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

Checks

2 successful
All checks passed
7aaa13a

Added 20 commits

  • Remove the unused ui-analysis module116ad21
  • Move the build from Next.js to Vite and TanStack Start24c96a3
  • Let studio screens fill the full width3b1b377
  • Move the studio to a true-black flat theme4979bba
  • Ship the Scout wizard, its API and the MCP bridge4f5d4e7
  • Add the Scout data layer, LLM client and prompt pack5a29af3
  • Document Scout and test its parsing and queue63555cc
  • Serve the production build from a small Node host669ba12
  • Document the new toolchain and ship the static social image72b9429
  • Add personal learning, the reader and optional Convex sync7aaa13a
  • Surface Scout on the dashboard and in settings8a6deea
  • Add the client, server and router entry points8e16ab0
  • Port every page and API route to TanStack Router file routes8f691d1
  • Move shared source into src/ and swap Next navigation for TanStack Router91611af
  • Rework the studio screens on the true-black themec47b6c8
  • Remove the password gatecc6a2d5
  • Settle the studio's language around Roadmaps, focus and Todaycd8c814
  • Discover free resources and fetch their textd111b71
  • Run the Scout pipeline and publish approved packsfbad1ee
  • Add server functions and the access-gate middlewarefbde523
Synced from GitHub

Important

Review skipped

Too 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
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 796fe565-c249-4f8e-9fae-3e8a67e7ff89
šŸ“„ Commits

Reviewing files that changed from the base of the PR and between d1556fe02343eca5a69f711b82718d1b20a4b44d and 7aaa13a53767f48955af7e6f128501f5fc5a6fdc.

ā›” Files ignored due to path filters: 3
  • package-lock.json is excluded by !**/package-lock.json
  • public/favicon.svg is excluded by !**/*.svg
  • public/og.png is excluded by !**/*.png
šŸ“’ Files selected for processing: 354
  • .env.example
  • .gitignore
  • CONTEXT.md
  • README.md
  • app/(marketing)/gallery/loading.tsx
  • app/(marketing)/layout.tsx
  • app/(marketing)/pricing/layout.tsx
  • app/(studio)/analytics/page.tsx
  • app/(studio)/create/layout.tsx
  • app/(studio)/create/page.tsx
  • app/(studio)/dashboard/loading.tsx
  • app/(studio)/dashboard/page.tsx
  • app/(studio)/layout.tsx
  • app/(studio)/notes/layout.tsx
  • app/(studio)/notes/page.tsx
  • app/(studio)/settings/layout.tsx
  • app/(studio)/workspaces/layout.tsx
  • app/(studio)/workspaces/page.tsx
  • app/api/credits/status/route.ts
  • app/api/dashboard/coaching/route.ts
  • app/api/dashboard/review/route.ts
  • app/api/gallery/fork/route.ts
  • app/api/gallery/list/route.ts
  • app/api/gallery/set-public/route.ts
  • app/api/gate/route.ts
  • app/api/parse-roadmap/route.ts
  • app/api/quiz/generate/route.ts
  • app/api/settings/delete/route.ts
  • app/api/settings/export/route.ts
  • app/api/settings/privacy/route.ts
  • app/api/srs/save/route.ts
  • app/create/page.d.ts
  • app/embed/[id]/layout.tsx
  • app/embed/[id]/page.tsx
  • app/gate/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/notes/page.d.ts
  • app/opengraph-image.tsx
  • app/page.d.ts
  • app/pricing/page.d.ts
  • app/robots.ts
  • app/settings/page.d.ts
  • app/share/[id]/layout.tsx
  • app/sitemap.ts
  • app/twitter-image.tsx
  • app/workspace/[id]/layout.tsx
  • app/workspaces/page.d.ts
  • components/layout/Header.tsx
  • components/layout/StudioSidebar.tsx
  • components/sharing/ViralBadge.tsx
  • components/ui/button.tsx
  • components/ui/input.tsx
  • components/ui/textarea.tsx
  • components/workspaces/WorkspaceLibraryCard.tsx
  • convex/auth.config.ts
  • convex/auth.ts
  • convex/cloud.ts
  • convex/fileIds.ts
  • convex/http.ts
  • convex/model.ts
  • convex/schema.ts
  • convex/tsconfig.json
  • docs/syllo-setup.md
  • eslint.config.mjs
  • lib/access-gate.ts
  • lib/ui-analysis/README.md
  • lib/ui-analysis/TASK-1-SUMMARY.md
  • lib/ui-analysis/TASK-2.1-SUMMARY.md
  • lib/ui-analysis/TASK-2.5-SUMMARY.md
  • lib/ui-analysis/TASK-3.1-SUMMARY.md
  • lib/ui-analysis/TASK-5.1-SUMMARY.md
  • lib/ui-analysis/TASK-6.1-SUMMARY.md
  • lib/ui-analysis/TASK-8.1-SUMMARY.md
  • lib/ui-analysis/__tests__/accessibility-checker.example.ts
  • lib/ui-analysis/__tests__/accessibility-checker.integration.test.ts
  • lib/ui-analysis/__tests__/accessibility-checker.test.ts
  • lib/ui-analysis/__tests__/analyzer.property.test.ts
  • lib/ui-analysis/__tests__/analyzer.test.ts
  • lib/ui-analysis/__tests__/config.test.ts
  • lib/ui-analysis/__tests__/design-system-validator.test.ts
  • lib/ui-analysis/__tests__/responsive-validator.integration.example.ts
  • lib/ui-analysis/__tests__/responsive-validator.test.ts
  • lib/ui-analysis/__tests__/test-components/absolute-no-pos.tsx
  • lib/ui-analysis/__tests__/visual-hierarchy-optimizer.test.ts
  • lib/ui-analysis/accessibility-checker.ts
  • lib/ui-analysis/analyzer.ts
  • lib/ui-analysis/config.ts
  • lib/ui-analysis/design-system-validator.ts
  • lib/ui-analysis/index.ts
  • lib/ui-analysis/responsive-validator.ts
  • lib/ui-analysis/types.ts
  • lib/ui-analysis/visual-hierarchy-optimizer.ts
  • mcp/server.mjs
  • next-env.d.ts
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • prompts/scout/book.v1.md
  • prompts/scout/extract.v1.md
  • prompts/scout/plan.v1.md
  • prompts/scout/quiz.v1.md
  • proxy.ts
  • public/manifest.json
  • public/sw.js
  • scripts/ensure-next-route-shims.mjs
  • scripts/prepare-convex-auth.mjs
  • scripts/render_logo.js
  • server.mjs
  • src/client.tsx
  • src/components/credits/CreditBadge.tsx
  • src/components/dashboard/AtRiskAlerts.tsx
  • src/components/dashboard/CoachingLog.tsx
  • src/components/dashboard/ModuleCompletionTable.tsx
  • src/components/dashboard/SkillHeatmap.tsx
  • src/components/dashboard/VelocityChart.tsx
  • src/components/gallery/GalleryCard.tsx
  • src/components/gallery/GalleryFilters.tsx
  • src/components/gallery/GalleryGrid.tsx
  • src/components/layout/Footer.tsx
  • src/components/layout/Header.tsx
  • src/components/layout/LearningLayout.tsx
  • src/components/layout/LearningSidebar.tsx
  • src/components/layout/LoadingExperience.tsx
  • src/components/layout/MarketingHeroShell.tsx
  • src/components/layout/SettingsSection.tsx
  • src/components/layout/StudioSidebar.tsx
  • src/components/learning/BookCover.tsx
  • src/components/learning/OfflineSupport.tsx
  • src/components/learning/Pomodoro.tsx
  • src/components/learning/ReviewComposer.tsx
  • src/components/learning/StudyVideo.tsx
  • src/components/scout/CostMeter.tsx
  • src/components/scout/ManualRoadmap.tsx
  • src/components/scout/PickList.tsx
  • src/components/scout/ScoutProgress.tsx
  • src/components/scout/SourcesPanel.tsx
  • src/components/seo/FaqSchema.tsx
  • src/components/seo/GallerySchema.tsx
  • src/components/seo/HowToSchema.tsx
  • src/components/seo/WebAppSchema.tsx
  • src/components/shared/ContentViewer.tsx
  • src/components/shared/EmptyState.tsx
  • src/components/shared/Logo.tsx
  • src/components/shared/Modal.tsx
  • src/components/shared/ProgressRing.tsx
  • src/components/shared/Providers.tsx
  • src/components/shared/SmartEmbed.tsx
  • src/components/shared/StatusBadge.tsx
  • src/components/shared/ThemeToggle.tsx
  • src/components/shared/VideoPlayer.tsx
  • src/components/sharing/ViralBadge.tsx
  • src/components/sync/CloudSync.tsx
  • src/components/sync/SyncSettings.tsx
  • src/components/ui/alert-dialog.tsx
  • src/components/ui/button.tsx
  • src/components/ui/card.tsx
  • src/components/ui/input.tsx
  • src/components/ui/segmented.tsx
  • src/components/ui/select.tsx
  • src/components/ui/separator.tsx
  • src/components/ui/switch.tsx
  • src/components/ui/textarea.tsx
  • src/components/workspace/ContextPanel.tsx
  • src/components/workspace/SectionRenderer.tsx
  • src/components/workspace/SettingsModal.tsx
  • src/components/workspace/ShareEmbedModal.tsx
  • src/components/workspace/SrsReviewModal.tsx
  • src/components/workspace/WorkspaceShell.tsx
  • src/components/workspace/WorkspaceSplitView.tsx
  • src/components/workspace/sections/CalendarSection.tsx
  • src/components/workspace/sections/CustomSection.tsx
  • src/components/workspace/sections/GlossarySection.tsx
  • src/components/workspace/sections/MilestonesSection.tsx
  • src/components/workspace/sections/ModuleSection.tsx
  • src/components/workspace/sections/NotesSection.tsx
  • src/components/workspace/sections/ProgressSection.tsx
  • src/components/workspace/sections/ResourcesSection.tsx
  • src/components/workspace/sections/SubmissionsSection.tsx
  • src/components/workspace/sections/TaskListSection.tsx
  • src/components/workspace/sections/VideosSection.tsx
  • src/components/workspaces/WorkspaceLibraryCard.tsx
  • src/hooks/useAchievements.ts
  • src/hooks/useLearningRoadmaps.ts
  • src/hooks/useProgress.ts
  • src/hooks/useRoadmap.ts
  • src/hooks/useStreak.ts
  • src/hooks/useTimeTracker.ts
  • src/lib/__tests__/epub-library.test.ts
  • src/lib/__tests__/learning-session.test.ts
  • src/lib/__tests__/navigation.test.ts
  • src/lib/__tests__/personal-learning.test.ts
  • src/lib/__tests__/private-mode.test.ts
  • src/lib/__tests__/roadmap-intake.test.ts
  • src/lib/__tests__/workspace-persistence.test.ts
  • src/lib/accent-theme.ts
  • src/lib/ai-config.ts
  • src/lib/ai-policy.ts
  • src/lib/aiClient.ts
  • src/lib/analytics.ts
  • src/lib/app-url.ts
  • src/lib/billing.ts
  • src/lib/constants.ts
  • src/lib/credits.ts
  • src/lib/export.ts
  • src/lib/gallery.ts
  • src/lib/learning-session.ts
  • src/lib/learning.ts
  • src/lib/navigation.ts
  • src/lib/openai.ts
  • src/lib/personal/books.ts
  • src/lib/personal/cloud-api.ts
  • src/lib/personal/files.ts
  • src/lib/personal/schema.ts
  • src/lib/personal/store.ts
  • src/lib/plans.ts
  • src/lib/private-api-fetch.ts
  • src/lib/reviews.ts
  • src/lib/router-nav.ts
  • src/lib/scout/__tests__/agent.test.ts
  • src/lib/scout/__tests__/format.test.ts
  • src/lib/scout/__tests__/jobs.test.ts
  • src/lib/scout/__tests__/source-evidence.test.ts
  • src/lib/scout/__tests__/youtube-feed.test.ts
  • src/lib/scout/agent-runner.ts
  • src/lib/scout/api-client.ts
  • src/lib/scout/client.ts
  • src/lib/scout/db.ts
  • src/lib/scout/digest.ts
  • src/lib/scout/discovery/combine.ts
  • src/lib/scout/discovery/exa.ts
  • src/lib/scout/discovery/free-web.ts
  • src/lib/scout/discovery/index.ts
  • src/lib/scout/discovery/youtube.ts
  • src/lib/scout/extract.ts
  • src/lib/scout/fetch/reader.ts
  • src/lib/scout/fetch/transcripts.ts
  • src/lib/scout/format.ts
  • src/lib/scout/http.ts
  • src/lib/scout/jobs.ts
  • src/lib/scout/library.ts
  • src/lib/scout/llm.ts
  • src/lib/scout/pack.ts
  • src/lib/scout/pipeline.ts
  • src/lib/scout/plan.ts
  • src/lib/scout/prompts.ts
  • src/lib/scout/runner.ts
  • src/lib/scout/schema.sql
  • src/lib/scout/settings.ts
  • src/lib/scout/sources.ts
  • src/lib/scout/spend.ts
  • src/lib/scout/types.ts
  • src/lib/server/access.ts
  • src/lib/server/ai.ts
  • src/lib/server/auth.ts
  • src/lib/server/credits.ts
  • src/lib/server/dashboard.ts
  • src/lib/server/fns.ts
  • src/lib/server/gallery.ts
  • src/lib/server/quiz.ts
  • src/lib/server/roadmap-intake.ts
  • src/lib/server/settings.ts
  • src/lib/server/srs.ts
  • src/lib/server/store.ts
  • src/lib/server/workspaces.ts
  • src/lib/spaced-repetition.ts
  • src/lib/srs.ts
  • src/lib/storage.ts
  • src/lib/submissions-api.ts
  • src/lib/userConfig.ts
  • src/lib/utils.ts
  • src/lib/versioning.ts
  • src/lib/video-utils.ts
  • src/lib/workspace-persistence.ts
  • src/lib/workspace-stats.ts
  • src/routeTree.gen.ts
  • src/router.tsx
  • src/routes/__root.tsx
  • src/routes/_marketing.tsx
  • src/routes/_marketing/contact.tsx
  • src/routes/_marketing/gallery.tsx
  • src/routes/_marketing/index.tsx
  • src/routes/_marketing/pricing.tsx
  • src/routes/_marketing/privacy.tsx
  • src/routes/_marketing/terms.tsx
  • src/routes/_studio.tsx
  • src/routes/_studio/analytics.tsx
  • src/routes/_studio/create.tsx
  • src/routes/_studio/dashboard.tsx
  • src/routes/_studio/learn.tsx
  • src/routes/_studio/library.tsx
  • src/routes/_studio/notes.tsx
  • src/routes/_studio/read.$id.tsx
  • src/routes/_studio/reviews.tsx
  • src/routes/_studio/scout.tsx
  • src/routes/_studio/settings.tsx
  • src/routes/_studio/workspaces.tsx
  • src/routes/api/credits/status.ts
  • src/routes/api/dashboard/coaching.ts
  • src/routes/api/dashboard/review.ts
  • src/routes/api/gallery/fork.ts
  • src/routes/api/gallery/list.ts
  • src/routes/api/gallery/set-public.ts
  • src/routes/api/parse-roadmap.ts
  • src/routes/api/quiz/generate.ts
  • src/routes/api/scout/agents.ts
  • src/routes/api/scout/digest.ts
  • src/routes/api/scout/packs.$id.approve.ts
  • src/routes/api/scout/packs.$id.ts
  • src/routes/api/scout/recent.ts
  • src/routes/api/scout/resources.ts
  • src/routes/api/scout/settings.ts
  • src/routes/api/scout/sources.ts
  • src/routes/api/scout/start.ts
  • src/routes/api/settings/delete.ts
  • src/routes/api/settings/export.ts
  • src/routes/api/settings/privacy.ts
  • src/routes/api/srs/save.ts
  • src/routes/embed.$id.tsx
  • src/routes/robots[.]txt.ts
  • src/routes/share.$id.tsx
  • src/routes/sitemap[.]xml.ts
  • src/routes/workspace.$id.tsx
  • src/server.ts
  • src/start.ts
  • src/styles/globals.css
  • src/styles/learning.css
  • src/types/index.ts
  • src/views/embed.tsx
  • src/views/marketing/contact.tsx
  • src/views/marketing/gallery.tsx
  • src/views/marketing/home.tsx
  • src/views/marketing/pricing.tsx
  • src/views/marketing/privacy.tsx
  • src/views/marketing/terms.tsx
  • src/views/share.tsx
  • src/views/studio/analytics.tsx
  • src/views/studio/create.tsx
  • src/views/studio/dashboard.tsx
  • src/views/studio/home.tsx
  • src/views/studio/learn.tsx
  • src/views/studio/library.tsx
  • src/views/studio/personal-settings.tsx
  • src/views/studio/reader.tsx
  • src/views/studio/reviews.tsx
  • src/views/studio/scout.tsx
  • src/views/studio/settings.tsx
  • src/views/studio/workspaces.tsx
  • src/views/workspace.tsx
  • tmp_fix.js
  • tsconfig.json
  • ui-analysis.config.example.json
  • vite.config.ts
  • vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix Ā· Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

ā¤ļø Share

Comment @coderabbitai help to get the list of available commands.