What Is the OpenSEO Frontend Framework? A Complete Technical Breakdown
OpenSEO's frontend is a React 19 application built on TanStack React Start, combining type-safe routing via TanStack Router, data fetching with TanStack React-Query, Vite for builds, and Tailwind CSS for styling.
The OpenSEO codebase demonstrates a modern, full-stack React architecture optimized for edge deployment on Cloudflare Workers. This article examines the specific technologies, file structures, and implementation patterns that define the framework.
Core Technology Stack
The OpenSEO frontend framework relies on seven integrated technologies working together. Each serves a distinct architectural purpose:
| Component | Purpose | Source Location |
|---|---|---|
| React 19 | UI component library and rendering engine | package.json dependencies |
| @tanstack/react-start | Full-stack framework with SSR and server functions | src/start.ts |
| @tanstack/react-router | Type-safe routing with generated route tree | src/routeTree.gen.ts |
| @tanstack/react-query | Data fetching, caching, and state synchronization | src/serverFunctions/*.ts |
| Vite | Build tool, dev server, and bundler | web/vite.config.ts |
| Tailwind CSS | Utility-first styling system | Configured in Vite plugins |
| MDX | Markdown-plus-React content authoring | web/vite.config.ts |
This stack enables server-side rendering, type-safe navigation, and edge-ready deployment without sacrificing developer experience.
TanStack React Start: The Foundation
@tanstack/react-start provides the full-stack backbone. In src/start.ts, the framework exposes a createStart helper that wires together routing, server functions, and rendering:
// src/start.ts
import { createStart } from "@tanstack/react-start";
// Creates the application instance combining router, SSR, and server functions
export const app = createStart({
// Configuration connects to TanStack Router and server function layer
});
This file serves as the central integration point. It consumes the router from src/router.tsx and processes server-side calls through the createServerFn pattern seen throughout src/serverFunctions/.
Type-Safe Routing with TanStack Router
Routing in OpenSEO is file-system based and fully typed. The src/router.tsx file instantiates the router using an auto-generated route tree:
// src/router.tsx
import { createRouter as createTanStackRouter } from "@tanstack/react-router";
import { routeTree } from "./routeTree.gen";
import { NotFound } from "@/components/not-found";
export function getRouter() {
return createTanStackRouter({
routeTree,
defaultPreload: "intent",
scrollRestoration: true,
defaultNotFoundComponent: NotFound,
});
}
The routeTree.gen.ts file is auto-generated from files in src/routes/. Each file becomes a type-safe route automatically. For example, adding src/routes/_app/example.tsx creates a route at /example:
// src/routes/_app/example.tsx
import { createFileRoute } from "@tanstack/react-router";
export const Route = createFileRoute("/example")({
component: () => (
<div className="p-4 max-w-2xl mx-auto">
<h1 className="text-2xl font-bold mb-2">Example Page</h1>
<p className="text-gray-700">
This page demonstrates a simple TanStack Router file route.
</p>
</div>
),
});
The underscore in _app indicates a layout route, wrapping child routes with shared UI components.
Data Fetching with TanStack React-Query
Server functions in OpenSEO expose createServerFn hooks that integrate directly with useQuery. Components fetch data declaratively:
// src/components/project-list.tsx
import { useQuery } from "@tanstack/react-query";
import { fetchProjects } from "@/api/project";
export function ProjectList() {
const { data, isLoading, error } = useQuery(["projects"], fetchProjects);
if (isLoading) return <p>Loading…</p>;
if (error) return <p>Error loading projects.</p>;
return (
<ul className="space-y-2">
{data?.map((proj) => (
<li key={proj.id} className="p-2 border rounded">
{proj.name}
</li>
))}
</ul>
);
}
The server function implementations—found in src/serverFunctions/projects.ts, src/serverFunctions/keywords.ts, and similar files—handle API calls to external services like DataForSEO and Google Search Console. React-Query manages caching, background refetching, and optimistic updates automatically.
Styling with Tailwind CSS
OpenSEO uses utility-first CSS throughout its component layer. The Vite configuration applies Tailwind globally, enabling rapid styling without custom CSS files:
// src/components/button.tsx
export function PrimaryButton({ children, ...props }) {
return (
<button
className="bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded"
{...props}
>
{children}
</button>
);
}
Components like site-footer.tsx and newsletter-signup.tsx follow this pattern, combining Tailwind utilities for responsive, maintainable designs.
Build and Deployment Pipeline
Vite in web/vite.config.ts orchestrates the entire toolchain:
// web/vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import { cloudflare } from "@cloudflare/vite-plugin";
import mdx from "@fumadocs/mdx/vite";
export default defineConfig({
plugins: [
react(), // React 19 fast refresh
tailwindcss(), // Tailwind CSS processing
mdx(), // Markdown+React content
cloudflare(), // Cloudflare Workers deployment
// TanStack Start integration
],
});
The Cloudflare Vite plugin enables edge deployment. The app runs as a Cloudflare Worker, with worker-configuration.d.ts defining the edge runtime environment. This produces a server-rendered React application deployed globally across Cloudflare's network.
Content Authoring with MDX
Documentation and help pages use MDX via fumadocs-mdx. This allows mixing Markdown prose with interactive React components—ideal for technical documentation that needs embedded UI examples or live code demos.
Summary
- OpenSEO's frontend framework combines React 19 with TanStack React Start for full-stack type safety.
- File-based routing via TanStack Router generates a type-safe
routeTreefromsrc/routes/files. - Data fetching uses TanStack React-Query with server functions defined in
src/serverFunctions/*.ts. - Styling relies entirely on Tailwind CSS utilities, configured through Vite.
- Deployment targets Cloudflare Workers through the Cloudflare Vite plugin, enabling edge rendering.
Frequently Asked Questions
What makes OpenSEO's frontend "type-safe"?
TanStack Router generates TypeScript definitions for every route in routeTree.gen.ts. This means navigation methods, URL parameters, and route state are all statically typed—compile-time errors catch broken links or invalid data shapes before runtime.
How does OpenSEO handle server-side rendering?
@tanstack/react-start in src/start.ts orchestrates SSR. Server functions execute on the edge via Cloudflare Workers, streaming HTML to browsers while hydrating to interactive React on the client. The createStart helper manages the server/client boundary automatically.
Can I use OpenSEO's frontend stack for non-SEO applications?
Yes. The TanStack React Start architecture is application-agnostic. Any project needing type-safe routing, server functions, and edge deployment can adopt this pattern—simply replace the SEO-specific server functions in src/serverFunctions/ with your own API integrations.
Why does OpenSEO use Vite instead of Next.js or Remix?
Vite with TanStack Start provides granular control over the build pipeline and lighter abstractions. The Cloudflare-specific integration in web/vite.config.ts enables direct Worker deployment without framework-specific adapters, while file-based routing and server functions remain fully typed and testable.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →