Open-SEO Dependencies: Complete Guide to the Tech Stack and Package.json
Open-SEO depends on 30+ production packages across seven categories: React UI with TanStack, Tailwind styling, Drizzle ORM for databases, Better-Auth for authentication, AI SDK for LLM features, and utility libraries for parsing and validation.
Open-SEO is an open-source SEO platform built by Every App. Understanding its dependencies reveals how the application handles data fetching, database operations, authentication, and AI-powered features. This guide breaks down every major package in the [package.json](https://github.com/every-app/open-seo/blob/main/package.json#L73-L115) and shows how each one is used in actual source code.
UI and State Management Dependencies
Open-SEO follows a TanStack-first architecture for all client-side state and data synchronization.
Core React Packages
reactandreact-dom— Foundation of the component tree.@tanstack/react-router— File-based, type-safe routing with nested layouts.@tanstack/react-query— Server state caching, background refetching, and optimistic updates.@tanstack/react-form— Headless form handling with validation integration.@tanstack/react-table— Powerful data tables for SEO reports and domain lists.
The project uses @tanstack/query-core on the server and wraps it with @tanstack/react-query hooks throughout feature files. For example, in src/client/features/domain/hooks/useDomainOverviewQuery.ts:
import { useQuery } from "@tanstack/react-query";
import { fetchDomainOverview } from "@/client/api";
export function useDomainOverview(domain: string) {
return useQuery(["domain", domain], () => fetchDomainOverview(domain));
}
Styling Dependencies
The visual layer relies on utility-first CSS with pre-built component patterns.
| Package | Purpose |
|---|---|
tailwindcss |
Core utility-first CSS framework. |
daisyui |
Pre-built, themeable components that extend Tailwind. |
lucide-react |
Consistent, lightweight icon library. |
These dependencies enable rapid UI development without custom CSS files for every component.
Data and ORM Dependencies
Database operations abstract across SQLite/D1 and Postgres through a unified layer.
Primary Data Packages
drizzle-orm— Type-safe SQL query builder with migration support.@pg— Postgres-specific driver integration.postgres— High-performance Postgres client for Node.js and Edge environments.dataforseo-client— Official client for DataForSEO API, the platform's primary SEO data source.
In src/db/schema.ts, Drizzle defines tables that work identically in Cloudflare D1 (SQLite) or local Postgres:
import { integer, text, sqliteTable } from "drizzle-orm/sqlite-core";
export const projects = sqliteTable("projects", {
id: integer("id").primaryKey(),
name: text("name").notNull(),
createdAt: integer("created_at").notNull(),
});
Authentication Dependencies
User sessions and access control support multiple deployment modes.
| Package | Role |
|---|---|
better-auth |
Unified authentication framework with multiple adapter support. |
@cloudflare/workers-oauth-provider |
Cloudflare Access integration for enterprise deployments. |
jose |
JWT signing and verification for session tokens. |
The auth configuration in src/lib/auth.ts enables both Cloudflare Access and local "no-auth" development:
import { createAuth } from "better-auth";
export const auth = createAuth({
adapter: "cloudflare",
secret: process.env.AUTH_SECRET,
});
AI and LLM Dependencies
AI-assisted features use a provider-agnostic SDK with multiple backend options.
AI SDK Stack
@ai-sdk/react— React hooks for streaming chat and completion UIs.@openrouter/ai-sdk-provider— Access to 100+ models through OpenRouter.@cloudflare/ai-chatand@cloudflare/think— Cloudflare Workers AI integration for edge-deployed inference.
Content generation hooks follow this pattern, as seen in onboarding components:
import { useChat } from "@ai-sdk/react";
export function useSeoSummary() {
const chat = useChat({ model: "gpt-4o-mini" });
return chat;
}
Utility Dependencies
Supporting libraries handle parsing, validation, and data transformation.
| Package | Function |
|---|---|
cheerio |
Server-side HTML parsing for scraping and analysis. |
fast-xml-parser |
Sitemap and RSS feed processing. |
papaparse |
CSV import/export for bulk operations. |
remeda |
Functional programming utilities (faster, tree-shakeable alternative to Lodash). |
tldts |
Reliable top-level domain and subdomain extraction. |
zod |
Runtime schema validation for API inputs and environment variables. |
Observability Dependencies
Analytics and performance tracking use Posthog:
posthog-js— Client-side event capture and session recording.posthog-node— Server-side analytics for background jobs and API routes.
The billing module in src/shared/billing.ts demonstrates server-side usage.
Development and Testing Dependencies
Quality assurance relies on modern, fast tooling:
| Package | Purpose |
|---|---|
vitest |
Unit and integration testing with native ESM support. |
playwright |
End-to-end browser testing. |
oxlint |
High-performance JavaScript/TypeScript linter (Rust-based, 50-100x faster than ESLint). |
knip |
Detects unused dependencies and exports. |
portless |
Local development server with automatic HTTPS. |
Summary
- Open-SEO dependencies are organized across seven functional categories in [
package.json](https://github.com/every-app/open-seo/blob/main/package.json#L73-L115). - TanStack packages (
react-query,react-router,react-table,react-form) form the core architectural pattern. - Drizzle ORM enables portable database code across SQLite/D1 and Postgres environments.
- Better-Auth provides flexible authentication with Cloudflare Access or local development modes.
- AI SDK supports multiple LLM providers without code changes.
- Development tooling prioritizes speed:
vitest,oxlint, andknipreplace slower alternatives.
Frequently Asked Questions
Where are all Open-SEO dependencies listed?
All production and development dependencies are declared in [package.json](https://github.com/every-app/open-seo/blob/main/package.json), specifically lines 73-115 for runtime dependencies. The repository uses pnpm as its package manager.
Does Open-SEO use Prisma or Drizzle ORM?
Open-SEO uses Drizzle ORM, not Prisma. The choice enables edge-compatible query execution without a separate binary engine. Schema definitions in src/db/schema.ts compile to raw SQL that runs directly in Cloudflare Workers.
What authentication methods does Open-SEO support?
Through Better-Auth, Open-SEO supports Cloudflare Access for enterprise SSO, email/password with secure session cookies, and a "no-auth" development mode. The @cloudflare/workers-oauth-provider package handles OAuth flows when deployed to Cloudflare's infrastructure.
How does Open-SEO handle AI model switching?
The @ai-sdk ecosystem abstracts provider differences. Changing from OpenRouter to Cloudflare AI requires only a provider import swap—the useChat hook and streaming interface remain identical. This is implemented across AI-driven components like the onboarding chat flow.
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 →