selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

crawlseo logo

Self-host crawlseo

v0.3.5

Open-source SEO dashboard: GSC, site crawler, Web Vitals

BetaOpen SourceMIT
Docker ComposeCompose file & guide
docker compose up -d
Updated13 hours ago
LanguageTypescript
Setup difficultyModerate
Stars
655
Port
3000 (Web app HTTP port (compose maps 3000:3000))
Requires
PostgreSQL
Docker
ghcr.io/crawlseo/crawlseo
Overview dashboard with sample site dataCrawl / Audit page with health score, issue breakdown and per-page dataAI & MCP setup page with connection config and available tools

What is crawlseo?

Should you self-host crawlseo?

crawlseo scores 46/100 on selfhost.directory (how scoring works) and ranks #31 of 41 in Search Engines. It has 655 GitHub stars.

It shipped 10 stable releases in the past year. The latest, v0.3.5, came out on 26 October 2026.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is MIT-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is openseo (72/100, 25 472 stars). It scores higher overall, so compare the two before you pick. See crawlseo vs openseo side by side.

Features

  • AlertsNothing is sent by email or chat yet; evaluation runs on demand, after syncs, or on the schedule.
  • Alert webhooks
  • Background job queue
  • Backlink Analysis
  • Core Web Vitals
  • CSV Export
  • Keyword Research
  • MCP Server
  • Rank Tracking
  • Read-only REST API
  • Scheduled syncs and crawlsScheduled crawls and vitals checks run on Docker (worker or inline app), not on Vercel.
  • Search Console analytics
  • SEO opportunity detection
  • Site crawler

crawlseo README

How to install crawlseo

Install crawlseo with Docker Compose

Environment variables
DATABASE_URL, NEXTAUTH_SECRET, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, POSTGRES_PASSWORD, CRAWLSEO_IMAGE
git clone https://github.com/crawlseo/crawlseo.git
cd crawlseo
cp .env.example .env
# Edit .env with your credentials
docker compose pull
docker compose up -d

Starts app, worker and db services; migrations run automatically at container start. Images support linux/amd64 and linux/arm64.

How to configure crawlseo

  • ALERT_WEBHOOK_ALLOW_PRIVATEWebhooks go to public addresses only. true also allows private networks (10/8, 172.16/12, 192.168/16, 100.64/10, loopback, fc00::/7), for a receiver such as n8n on your own network. Link-local stays blocked.

    Webhooks go to public addresses only. true also allows private networks (10/8, 172.16/12, 192.168/16, 100.64/10, loopback, fc00::/7), for a receiver such as n8n on your own network. Link-local stays blocked.

  • ALERT_WEBHOOKS_ENABLED============ OPTIONAL: Alert webhooks ============ Users can send fired alerts to their own URL (Settings > Alert webhook). false turns webhooks off for the instance.

    ============ OPTIONAL: Alert webhooks ============ Users can send fired alerts to their own URL (Settings > Alert webhook). false turns webhooks off for the instance.

  • API_RATE_LIMIT_PER_MINUTE============ OPTIONAL: Read-only API (/api/v1) and MCP ============ Requests per minute per access key (default 60). Counted per process.

    ============ OPTIONAL: Read-only API (/api/v1) and MCP ============ Requests per minute per access key (default 60). Counted per process.

  • AUTH_SECRETAUTH_SECRET works as an alias (the Auth.js v5 name). If both are set, NEXTAUTH_SECRET wins. The same value encrypts stored API keys, so changing it makes them unreadable.

    AUTH_SECRET works as an alias (the Auth.js v5 name). If both are set, NEXTAUTH_SECRET wins. The same value encrypts stored API keys, so changing it makes them unreadable.

  • AUTH_TRUST_HOSTtrueRequired when running behind a reverse proxy such as Coolify

    Required when running behind a reverse proxy such as Coolify

  • CRAWL_MAX_MINUTES============ OPTIONAL: Crawler ============ A crawl stops after this many minutes (default 30). Mostly reached on sites whose robots.txt sets a Crawl-delay: the crawler then makes one request at a time on that host and reports the hosts it had to stop early.

    ============ OPTIONAL: Crawler ============ A crawl stops after this many minutes (default 30). Mostly reached on sites whose robots.txt sets a Crawl-delay: the crawler then makes one request at a time on that host and reports the hosts it had to stop early.

  • CRAWL_MAX_PAGESMost pages one crawl may fetch (default 2000). The server enforces it for every crawl, whatever page count the browser or the schedule asks for.

    Most pages one crawl may fetch (default 2000). The server enforces it for every crawl, whatever page count the browser or the schedule asks for.

  • CRAWLSEO_HIDE_CLOUD_PROMO============ OPTIONAL: crawlseo.cloud card ============ The sidebar shows one card linking to the crawlseo.cloud home page (a plain link, no request or analytics). Set to true to remove it for every user.

    ============ OPTIONAL: crawlseo.cloud card ============ The sidebar shows one card linking to the crawlseo.cloud home page (a plain link, no request or analytics). Set to true to remove it for every user.

  • CRAWLSEO_IMAGE============ DOCKER COMPOSE DB CREDENTIALS ============ These are referenced by docker-compose.yml; set your own for non-local deployments. :latest is the latest release. Override to pin a release (:0.3.4), follow main (:edge) or use an image built from a fork.

    ============ DOCKER COMPOSE DB CREDENTIALS ============ These are referenced by docker-compose.yml; set your own for non-local deployments. :latest is the latest release. Override to pin a release (:0.3.4), follow main (:edge) or use an image built from a fork.

  • CRAWLSEO_UPDATE_CHECK============ OPTIONAL: Update check ============ Once a day the server asks the GitHub releases API for the latest crawlseo release (only a User-Agent "crawlseo/<version>", no data about you) and the sidebar shows "Update available" when it is newer. Set to false to turn it off completely: no request is made.

    ============ OPTIONAL: Update check ============ Once a day the server asks the GitHub releases API for the latest crawlseo release (only a User-Agent "crawlseo/<version>", no data about you) and the sidebar shows "Update available" when it is newer. Set to false to turn it off completely: no request is made.

  • CRON_SECRETVercel only: protects /api/cron/tick. A random string of 16+ characters.

    Vercel only: protects /api/cron/tick. A random string of 16+ characters.

  • DATABASE_URL============ REQUIRED ============

    ============ REQUIRED ============

  • DISABLE_REGISTRATION============ OPTIONAL: Registration ============ Set to true after creating your admin account to prevent new registrations. Existing users keep signing in; a Google account that never signed in here is refused.

    ============ OPTIONAL: Registration ============ Set to true after creating your admin account to prevent new registrations. Existing users keep signing in; a Google account that never signed in here is refused.

  • GOOGLE_CLIENT_ID============ GOOGLE OAUTH (required for GSC data) ============ Get these from: https://console.cloud.google.com/ Required scopes: openid, email, profile, https://www.googleapis.com/auth/webmasters.readonly

    ============ GOOGLE OAUTH (required for GSC data) ============ Get these from: https://console.cloud.google.com/ Required scopes: openid, email, profile, https://www.googleapis.com/auth/webmasters.readonly

  • GOOGLE_CLIENT_SECRET
  • GOOGLE_PAGESPEED_KEYOptional: PageSpeed Insights API key (higher quota for Core Web Vitals)

    Optional: PageSpeed Insights API key (higher quota for Core Web Vitals)

  • JOB_RETENTION_DAYS
  • JOB_STALE_SECONDS
  • NEXTAUTH_SECRETGenerate with: openssl rand -hex 32. Keep it stable: it also encrypts stored API keys and Google tokens.

    Generate with: openssl rand -hex 32. Keep it stable: it also encrypts stored API keys and Google tokens.

  • NEXTAUTH_URLhttp://localhost:3000============ NEXTAUTH / AUTH.JS ============ The public base URL of the app. On a server, the https URL users open (https://seo.example.com).

    ============ NEXTAUTH / AUTH.JS ============ The public base URL of the app. On a server, the https URL users open (https://seo.example.com).

  • NODE_ENV============ NODE ENVIRONMENT ============

    ============ NODE ENVIRONMENT ============

  • POSTGRES_DBcrawlseo
  • POSTGRES_PASSWORD
  • POSTGRES_USERcrawlseo
  • SCHEDULE_BING_SYNC_HOURS
  • SCHEDULE_CRAWL_DAYS
  • SCHEDULE_GSC_SYNC_HOURS
  • SCHEDULER_ENABLEDThe schedule: syncs each day, crawls and vitals checks each week, per site. 0 turns one off; SCHEDULER_ENABLED=false turns all of them off.

    The schedule: syncs each day, crawls and vitals checks each week, per site. 0 turns one off; SCHEDULER_ENABLED=false turns all of them off.

  • SCHEDULE_VITALS_DAYS
  • WORKER_LONG_CONCURRENCY
  • WORKER_MODE============ OPTIONAL: Background jobs ============ Who runs queued crawls, vitals checks and syncs: inline (default, the app process), off (only queue them; a worker runs them) or worker (the worker process). docker-compose.yml sets off for the app and worker for the worker.

    ============ OPTIONAL: Background jobs ============ Who runs queued crawls, vitals checks and syncs: inline (default, the app process), off (only queue them; a worker runs them) or worker (the worker process). docker-compose.yml sets off for the app and worker for the worker.

  • WORKER_POLL_SECONDS
  • WORKER_SHORT_CONCURRENCY
  • WORKER_SHUTDOWN_GRACE_SECONDS

crawlseo releases & version history

FAQ

Is there a free plan?

Self-hosting is free; the cloud plans are paid and open in waves via a waitlist.

What is the difference between the open-source version and the cloud?

The open-source version is SEO monitoring you run on your own server under MIT; the cloud adds hosting, scheduled runs and AI-engine visibility measurement.

Why is Search Console required?

It confirms the site belongs to you, and its queries are the starting point for the prompts.

Who is it for?

Founders and small teams who want to see how their site performs in search and AI answers without becoming SEO specialists.

What does crawlseo do?

It reads your Search Console data, checks your site, and asks Perplexity the questions your customers ask, showing where your site is named and which sources are cited.

More in Search Engines

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…