How to Configure and Run OpenSEO Locally for Development
To configure and run OpenSEO locally, enable Corepack to activate pnpm, install dependencies with frozen lockfile, migrate the local Cloudflare D1 database, configure your DataForSEO API key in .env.local, and launch the dev server using either pnpm run dev or pnpm dev:agents for agent-friendly access.
OpenSEO is a modern TypeScript-based SEO platform that uses Node.js 20+ and Cloudflare D1 (SQLite) for local development. Configuring the project requires specific environment variables for external APIs and authentication modes that mirror production while enabling rapid iteration. This guide walks through the exact steps to get a fully functional instance running locally, based on the official source code in the every-app/open-seo repository.
Prerequisites and System Requirements
Before cloning the repository, ensure your environment meets the baseline requirements. OpenSEO requires Node.js 20 or higher and uses pnpm (version 10.30.1 as pinned in package.json) as its package manager.
You must also obtain a DataForSEO account and generate a base-64 encoded token from your login:password credentials. This API key powers the platform's SEO data retrieval capabilities.
Project Setup and Package Manager Activation
The repository uses Corepack to enforce the exact pnpm version recorded in package.json, preventing dependency drift across environments.
First, enable Corepack to activate the pinned package manager:
corepack enable
Then install dependencies using the frozen lockfile to guarantee exact version matching:
pnpm install --frozen-lockfile
This command respects pnpm-lock.yaml and ensures consistent dependency trees across all developer machines.
Database Preparation and Migration
OpenSEO defaults to Cloudflare D1 (SQLite) for local development. Before running the application, you must initialize the local database schema using the provided migration script.
Run the local migration command from the project root:
pnpm run db:migrate:local
This command applies the Drizzle ORM migrations located in src/db/ to your local D1 instance. You only need to run this once per fresh clone or after schema changes. For PostgreSQL-backed setups, refer to the alternative configuration in docs/LOCAL_POSTGRES.md.
Environment Configuration
The application relies on environment variables defined in .env.local. Copy the example template to create your local configuration:
cp .env.example .env.local
Edit .env.local to include your DataForSEO API key and authentication mode:
# Required: Base64-encoded DataForSEO credentials
DATAFORSEO_API_KEY=$(printf 'your_login:your_password' | base64)
# Recommended for local development
AUTH_MODE=local_noauth
The AUTH_MODE variable controls user validation. Set it to local_noauth to bypass authentication and automatically inject an admin user (admin@localhost), which is ideal for rapid local development without configuring external identity providers.
Running the Development Server
OpenSEO provides two distinct methods to start the local development server, defined in package.json.
Standard Vite Development
For quick UI previews and standard development:
pnpm run dev
This launches the Vite development server in standard mode, suitable for manual browser testing.
Agent-Friendly Development Mode
For AI agent integration and enhanced logging:
mkdir -p .logs
pnpm dev:agents
This command starts the application through portless, a zero-config reverse proxy, and streams logs to .logs/dev-server.log. The server runs at http://open-seo.localhost:1355 and automatically prefixes URLs with the current git branch name when working in worktrees, making it the recommended entry point for automated tooling and agent-based workflows according to docs/LOCAL_DEVELOPMENT.md.
Understanding Authentication Modes
The AUTH_MODE environment variable determines how OpenSEO validates user sessions. The source code supports three distinct modes:
local_noauth– Bypasses authentication entirely, injecting a mock admin user. This is the default recommendation for local development to eliminate external dependency requirements.cloudflare_access– Validates Cloudflare Access JWTs, used in production deployments behind Cloudflare Zero Trust.hosted– Enables BetterAuth email/password authentication flow, requiring additional secrets for email providers and callback URLs.
Development scripts do not automatically set AUTH_MODE, so you must explicitly declare it in .env.local to experiment with non-default authentication flows.
Docker Self-Hosting Alternative
For containerized local development, OpenSEO includes a Docker Compose configuration:
docker compose up -d
The docker-compose.yaml automatically sets AUTH_MODE=local_noauth, providing a zero-config containerized environment that persists data and respects the same environment variable patterns as the native Node.js setup.
Summary
- Enable Corepack (
corepack enable) to activate the pinned pnpm version10.30.1declared inpackage.json. - Install dependencies using
pnpm install --frozen-lockfileto ensure reproducible builds. - Initialize the database by running
pnpm run db:migrate:localto set up the Cloudflare D1 schema. - Configure environment variables in
.env.local, including a base64-encodedDATAFORSEO_API_KEYandAUTH_MODE=local_noauth. - Start the server using either
pnpm run devfor standard development orpnpm dev:agentsfor AI-agent-friendly access athttp://open-seo.localhost:1355.
Frequently Asked Questions
What Node.js version does OpenSEO require?
OpenSEO requires Node.js 20 or higher. The project uses modern JavaScript features and relies on Corepack (bundled with Node.js 24, available separately in Node.js 20) to manage the pnpm package manager version.
Why does my DataForSEO API key need to be base64 encoded?
The DataForSEO API uses HTTP Basic Authentication, which requires the login:password string to be base64 encoded before being sent in the Authorization header. The application expects this pre-encoded value in the DATAFORSEO_API_KEY environment variable to match the API's authentication protocol.
Can I use PostgreSQL instead of Cloudflare D1 for local development?
Yes. While Cloudflare D1 is the default for local development, the repository includes PostgreSQL configuration instructions in docs/LOCAL_POSTGRES.md. The Drizzle ORM migrations in src/db/ support both SQLite (D1) and PostgreSQL dialects.
What is the difference between pnpm run dev and pnpm dev:agents?
pnpm run dev starts the standard Vite development server for manual browser testing. pnpm dev:agents launches the application through portless with automatic branch-based URL prefixing and logs streamed to .logs/dev-server.log, specifically designed for AI agent integration and automated development workflows.
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 →