- Node.js 20+
- pnpm
- A DataForSEO account/API credentials
pnpm install
# Run once per fresh local DB
pnpm run db:migrate:localConfigure .env.local:
-
cp .env.example .env.local -
Add
DATAFORSEO_API_KEYas a base64-encodedlogin:passwordvalue:printf '%s' 'YOUR_LOGIN:YOUR_PASSWORD' | base64
Run locally:
# Option 1
pnpm run dev
# Option 2 (Recommended)
# This log file makes it easier for your coding agent to debug.
mkdir .logs
touch .logs/dev-server.log
# This command uses portless, which is great for worktrees. It also pipes logs to that fixed file, which is helpful for agent debugging output.
pnpm dev:agentspnpm dev:agents runs through portless at http://open-seo.localhost:1355 by default.
When using a git worktree, portless prefixes the branch name, for example http://feature-name.open-seo.localhost:1355.
Generate migration:
pnpm run db:generateMigrate local DB:
pnpm run db:migrate:localAUTH_MODE=cloudflare_access(default): validates Cloudflare Access JWTs (cf-access-jwt-assertion) usingTEAM_DOMAIN+POLICY_AUD.AUTH_MODE=local_noauth: local trusted mode, no auth check, injectsadmin@localhost.AUTH_MODE=hosted: Better Auth-backed email/password mode. Requires Better Auth schema generation plusBETTER_AUTH_SECRETandBETTER_AUTH_URL.
Local scripts (pnpm dev and pnpm dev:agents) set AUTH_MODE=local_noauth automatically.
Use AUTH_MODE=cloudflare_access pnpm dev when you specifically want to test Access validation locally.
For Cloudflare deployments, ensure Cloudflare Access is enabled on your Worker route/domain and provide TEAM_DOMAIN + POLICY_AUD in environment variables.