Skip to content

feat(web): add Recall website foundation - #1

Merged
sabahattink merged 7 commits into
mainfrom
feat/recall-web-foundation
Aug 5, 2026
Merged

feat(web): add Recall website foundation#1
sabahattink merged 7 commits into
mainfrom
feat/recall-web-foundation

Conversation

@sabahattink

Copy link
Copy Markdown
Owner

Implements the initial Recall website foundation including the production Hero, documentation shell, and design system.

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).
@sabahattink
sabahattink merged commit 904a961 into main Aug 5, 2026
3 checks passed
@sabahattink
sabahattink deleted the feat/recall-web-foundation branch August 5, 2026 20:11
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