# Open-SEO Dependencies: Complete Guide to the Tech Stack and Package.json

> Explore the Open-SEO tech stack including React, TanStack, Tailwind, Drizzle ORM, Better-Auth, and AI SDK. Discover all production dependencies in this comprehensive guide.

- Repository: [Every App/open-seo](https://github.com/every-app/open-seo)
- Tags: internals
- Published: 2026-08-02

---

**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)](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

- **`react`** and **`react-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`](https://github.com/every-app/open-seo/blob/main/src/client/features/domain/hooks/useDomainOverviewQuery.ts):

```typescript
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`](https://github.com/every-app/open-seo/blob/main/src/db/schema.ts), Drizzle defines tables that work identically in Cloudflare D1 (SQLite) or local Postgres:

```typescript
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`](https://github.com/every-app/open-seo/blob/main/src/lib/auth.ts) enables both Cloudflare Access and local "no-auth" development:

```typescript
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-chat`** and **`@cloudflare/think`** — Cloudflare Workers AI integration for edge-deployed inference.

Content generation hooks follow this pattern, as seen in onboarding components:

```typescript
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`](https://github.com/every-app/open-seo/blob/main/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)](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`, and `knip` replace 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)](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`](https://github.com/every-app/open-seo/blob/main/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.