feat(web): add Recall website foundation - #1
Merged
Conversation
Adds apps/web (recall-web), a private, unpublished Next.js 16 App Router application inside the existing pnpm/Turborepo monorepo — no separate repository. Registered automatically via the existing pnpm-workspace.yaml apps/* glob. Foundation pieces in this commit: - package.json pinned to exact, mutually-compatible stable versions (verified via npm view before installing, no canary/beta/deprecated packages): next@16.3.0, react/react-dom@19.2.8, tailwindcss@4.3.3, fumadocs-core/ui@16.14.0, fumadocs-mdx@15.2.2, next-themes@0.4.6. - A standalone tsconfig.json (does not extend the repo's tsconfig.base.json — Next.js requires moduleResolution: "bundler", noEmit, and jsx: "preserve", which conflict with the base config's Node-library-oriented composite/declaration/NodeNext settings). - Semantic design tokens in globals.css (background/foreground/muted/ border/card/accent/code-background/ring) for light, dark, and system theming via next-themes, with dark as the default only when no preference is saved; visible :focus-visible outlines; a prefers-reduced-motion override. - Root layout, SEO metadata (factored into lib/metadata.ts so it's unit-testable without React/CSS/font imports), robots.ts, sitemap.ts, JSON-LD (SoftwareSourceCode, factual fields only). - Reusable layout primitives: SiteHeader, SiteFooter, MobileNavigation, ThemeToggle/ThemeProvider, Container, Section, Button — server components by default, "use client" only where interactivity is actually required (theme toggle, mobile nav, copy-to-clipboard). - A single typed site configuration (src/config/site.ts) and navigation configuration (src/config/navigation.ts) that components and metadata consume instead of duplicating literals. - Unit tests (vitest) asserting site config identity/URLs, navigation route validity, and metadata values/canonical URL. Monorepo integration: turbo.json's build task outputs now include .next/** (excluding .next/cache/**) alongside dist/**; the shared scripts/clean-package.mjs also removes .next/.source; .gitignore covers apps/web/.next, .source, and next-env.d.ts. No changes to apps/cli, its packaging, or any published package. Note: eslint-config-next (React/JSX/hooks/a11y rules) was deliberately not added in this sprint — the repository's config-protection hook blocks eslint.config.* edits, including composing a scoped override into the root config. apps/web currently lints under the existing repo-wide TypeScript rules only; layering Next's rules in is a documented follow-up.
Documentation (Fumadocs + MDX):
- source.config.ts, mdx-components.tsx, src/lib/source.ts wire
fumadocs-mdx's generated .source output into fumadocs-core's loader.
- content/docs/{index,getting-started,installation,commands,how-it-works}.mdx
— concise placeholder content adapted from the verified README.md and
docs/roadmap.md (quick start, commands table, .recall/ output shape,
task-focused ranking signals, safety guarantees). No unsupported
capability is claimed.
- app/docs/layout.tsx + app/docs/[[...slug]]/page.tsx give the docs
system sidebar navigation, previous/next navigation, a table of
contents, code highlighting, and copy buttons — all provided by
fumadocs-ui's DocsLayout/DocsPage.
- app/api/search/route.ts exposes fumadocs-core's static, in-process
search index — no paid/external search service.
- RootProvider (fumadocs-ui/provider/next) is layered inside the
existing next-themes ThemeProvider with its own theme integration
disabled, so /docs shares one theme source with the rest of the site.
Marketing route (`/`):
- HeroSection with the specified eyebrow/heading/description/CTAs/
command, CommandBlock (copy-to-clipboard), FeatureCard, and Section
primitives.
- The full required section set: header (via root layout), hero,
CLAUDE.md/AGENTS.md-vs-Recall comparison table, how-it-works steps,
feature grid, terminal example, supported-agents list, open-source
CTA, footer (via root layout). No fake logos, testimonials, download
counts, star counts, or benchmark claims.
Examples / changelog / roadmap:
- /examples: real recall-context CLI commands as CommandBlocks.
- /changelog and /roadmap render the repository's actual root
CHANGELOG.md and docs/roadmap.md at request time via a minimal,
dependency-free Markdown-to-JSX renderer (src/lib/simple-markdown.tsx)
— content is read directly from those files, never duplicated, so
the pages can't drift from the real release notes/roadmap.
apps/web/README.md: purpose, local development, build commands, directory structure (including why tsconfig.json is standalone), content-editing instructions, relationship to the Recall CLI, and explicit current-scope/non-goals (no final visual design yet, no analytics/tracking, no paid search, no blog content yet, no deployment/DNS performed). docs/web-deployment.md: the planned (not performed) Vercel deployment — repository, root directory (apps/web), framework preset, pnpm install/build commands, production domain (recall.sabahattinkalkan.com), expected DNS record, and "no environment variables required" for the initial release. Explicitly states no Vercel project, domain, or DNS record exists yet.
`tsc --noEmit` alone fails with "Cannot find module '../../.source/server'" whenever apps/web/.source (fumadocs-mdx's generated content index, gitignored and never committed) doesn't already exist — e.g. after `pnpm clean` or on a fresh checkout before `next dev`/`next build` has run once. Adds a `postinstall` script (`fumadocs-mdx`) so a plain `pnpm install` always produces .source, and defensively prefixes the `typecheck` script with the same regeneration step so `pnpm typecheck` never depends on `dev`/`build` having run first.
Rebuilds HeroSection per docs/design-system.md's token/typography/
spacing/motion/button/accessibility rules, using the two-column
layout, exact copy, and static terminal specified for this sprint —
no other marketing section touched, no routing changes, no other
documentation pages touched.
Left column: eyebrow, two-line headline (explicit break as specified),
supporting text, primary ("Get Started" -> /docs/getting-started) and
secondary ("GitHub", opens safely via target=_blank rel="noopener
noreferrer") CTAs using the existing Button variants, the existing
CommandBlock for `npx recall-context init`, and a plain-text "Works
with Claude Code, OpenAI Codex, Gemini CLI, Cursor." line — no cards,
per this sprint's explicit scope.
Right column: new HeroTerminal (apps/web/src/components/marketing/
hero-terminal.tsx), a static, factual rendering of real `recall
context` output (design-system.md §8: no fake window chrome, no
typing animation, no blinking cursor). It's a Server Component — no
interaction, so no "use client". Uses role="img" with a full
aria-label summarizing the output, and aria-hides the redundant
visual line items, so screen readers get one clear description instead
of a line-by-line list read.
Adds the `success` design token (light: 142 71% 35%, dark: 142 71%
55%) to globals.css — specified in docs/design-system.md's color
system but not yet wired into any component before this checklist's
checkmarks needed it. No other token, and no other part of
globals.css, changed.
CommandBlock (interactive, client component) is unchanged and reused
as-is. Grid collapses from two columns to one below the `lg` breakpoint
via `lg:grid-cols-2`, matching the Bible's "content never disappears,
only its arrangement changes" responsive rule — the terminal moves
below the content in DOM/visual order rather than being hidden.
Merge-readiness fixes found during a full apps/web review (code
quality, architecture, accessibility, SEO, Design Bible compliance).
No content, copy, layout, or visual hierarchy changed.
- Remove glassmorphism from SiteHeader: `backdrop-blur` + translucent
background on the sticky header directly violated docs/design-
system.md §16 ("no glassmorphism... no frosted/translucent blurred
panels"). Now an opaque bg-background with its existing border, per
§7's "surfaces are opaque and bordered."
- Remove dead code: the `Button`/`ButtonProps` export in ui/button.tsx
and the entire docs-link-card.tsx component had zero call sites
anywhere in the app (only `buttonVariants` is actually consumed,
applied directly to Link/anchor elements).
- Fix an internal link on /examples using a raw `<a href="/docs/...">`
instead of next/link — no client-side transition/prefetching for an
in-app route.
- Fix a naming inconsistency: root layout.tsx used the ambient
`React.ReactNode` type instead of an imported `ReactNode`, unlike
every other component in the app (including docs/layout.tsx).
- Deduplicate the changelog/roadmap page logic: both pages had
identical "read a repo-root file" implementations; extracted into
`lib/read-repo-markdown.ts`.
- Fix external-link inconsistency in MobileNavigation: it rendered
external nav items (GitHub) through next/link with a spread
target/rel, while SiteHeader and SiteFooter both use a plain `<a>`
for external links. Standardized on the plain-`<a>` pattern used
everywhere else, and dropped an unnecessary `cn()` call wrapping a
static string.
- Accessibility: CommandBlock's copy button changed its aria-label
silently on success with no live-region announcement, so screen
reader users got no confirmation a copy succeeded. Added a
visually-hidden `aria-live="polite"` status span.
- SEO: sitemap.ts listed only `/docs` as a single entry, omitting the
four actual documentation pages (`/docs/getting-started`,
`/docs/installation`, `/docs/commands`, `/docs/how-it-works`).
Now enumerates every page via the existing Fumadocs `source`.
Verified via `pnpm lint`, `pnpm typecheck`, `pnpm test`, `pnpm build`
(all 16 workspace tasks green) and a clean `npm pack --dry-run` from
apps/cli (unchanged: 4 files, 0.2.0-alpha.1, no apps/web leakage).
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.
Implements the initial Recall website foundation including the production Hero, documentation shell, and design system.