Skip to content

Port Allocation Registry ​

This document is the single source of truth for every host port consumed by Crow itself, by bundles in bundles/, and reserved by the MVP roadmap. Any new bundle PR that introduces a port binding must amend this file in the same PR. CI enforces that:

  1. Every host port in any bundles/**/docker-compose.yml is listed here.
  2. No two bundles map the same host port.

Conventions ​

  • All bundle ports bind to 127.0.0.1 unless the bundle is explicitly a reverse proxy (Caddy) or uses network_mode: host (browser, companion, coturn, plex, tailscale, crowdsec-firewall-bouncer).
  • "Existing" rows are bundles already shipped before this registry was introduced — they are recorded here so future bundles avoid them.
  • "Reserved" rows are claimed by upcoming Phase 2 bundles; do not consume them for unrelated work.
  • "MVP" rows are claimed by the bundles in the current MVP plan.
  • This doc alone is not authoritative. A port is only actually free when it's free across all three registries: this table, every docker-compose.yml under crow-addons/ AND crow/bundles/ (not just the one you're editing), and live listeners on the host. A same-port/different-bind-address pair (e.g. 127.0.0.1:4210 vs. the tailnet IP on 4210) can pass both check-port-allocation.js and a naive "is anything listening?" check, then show up later as a silent double-allocation — check all three before claiming a number.
  • Docker subnets: crow-workspace pins 10.89.70.0/24 (scratch: 10.89.71.0/24 smoke, 10.89.72.0/24 restore). Do not reuse.

External ports (not Crow's to allocate) ​

  • 4200/4201, pool 4101-4139 — the standalone lab pi-hub service (upstream, not a Crow bundle, not gateway-supervised, runs outside this repo's control). Do not "tidy" a future bundle onto these numbers.

Known conflicts in current bundles/ ​

These predate this registry and need follow-up resolution outside the MVP scope:

PortConflict
—none. The 8080 LocalAI/Nextcloud collision was resolved 2026-10-02 (the nextcloud bundle no longer deploys; Crow Workspace uses 3070/3071).

Allocation table ​

PortBindingBundle / ServiceStatus
22hosthost sshdreserved (system)
25—mail SMTPreserved (Phase 2 mail)
53hosthost DNS / systemd-resolvedreserved (system)
800.0.0.0Caddy (reverse proxy + ACME HTTP-01)MVP PR 0.5
143—mail IMAPreserved (Phase 2 mail)
4430.0.0.0CaddyMVP PR 0.5
465—mail SMTPSreserved (Phase 2 mail)
587—mail submissionreserved (Phase 2 mail)
993—mail IMAPSreserved (Phase 2 mail)
2222—(avoid: common host anti-scan sshd port)avoid
2019127.0.0.1Caddy admin API (host-local)MVP PR 0.5
2223127.0.0.1gitea (SSH)MVP PR 5
2224127.0.0.1forgejo (SSH)MVP PR 5
2283127.0.0.1immich (existing — verify in compose)existing
3001127.0.0.1Crow gateway (HTTPS)core
3002127.0.0.1Crow gateway (alt)core
3004127.0.0.1Crow gateway (alt)core
3005127.0.0.1sdxl (overridable via SDXL_PORT; companion reaches it at localhost over host networking)existing
3007127.0.0.1uptime-kumaMVP PR 1
3008127.0.0.1Crow gateway (alt)core
3020127.0.0.1adguard-home (admin UI)MVP PR 3
3030127.0.0.1homepageMVP PR 1
3040127.0.0.1gitea (web)MVP PR 5
3050127.0.0.1forgejo (web)MVP PR 5
3061127.0.0.1rookery (OpenScience reviewer)PR #157
3065127.0.0.1 (host network)phone (crow-phone-runner, assistant calls; binds loopback only)Phone plan A
3070127.0.0.1workspace (Crow Workspace: Nextcloud web; tailnet via Serve :8456)W1 2026-10
3071127.0.0.1workspace (Crow Workspace: ONLYOFFICE Docs; tailnet via Serve :8457)W1 2026-10
3080127.0.0.1romm (existing)existing
3090127.0.0.1Crow Artifacts: main instance artifact origin (CROW_ARTIFACT_ORIGIN_PORT=3090). A gateway-internal listener, not a compose port; reached through its own sidecar Tailscale node's Serve (443 on its own hostname), never FunnelArtifacts step 1
3091127.0.0.1Crow Artifacts: second co-hosted instance artifact origin (CROW_ARTIFACT_ORIGIN_PORT=3091). A gateway-internal listener, not a compose portArtifacts step 1
3092127.0.0.1 (container publish)Crow Artifacts: household container instance artifact origin (CROW_ARTIFACT_ORIGIN_PORT=3092); behind the same DOCKER-USER fence rule as that container's other published ports. A gateway-internal listener, not a compose portArtifacts step 1
3093127.0.0.1Crow Artifacts: main instance public-link listener (later step; the only artifacts port ever mapped to Funnel, through the sidecar node's own 8443). A gateway-internal listener, not a compose portreserved (Artifacts step 6)
3456127.0.0.1vikunja (existing)existing
4533127.0.0.1navidrome (existing)existing
5000127.0.0.1kavita (existing)existing
5006127.0.0.1actual-budget (existing)existing
5010127.0.0.1changedetectionMVP PR 1
5042—rotki (web/API)reserved (Phase 2 finance)
5080—plausiblereserved (Phase 2 analytics)
5335127.0.0.1adguard-home (DNS, TCP+UDP)MVP PR 3
5336—pi-hole (DNS)reserved (Phase 2 DNS)
5337—technitium (DNS)reserved (Phase 2 DNS)
6080127.0.0.1browser (noVNC, existing) — overridable via CROW_BROWSER_VNC_PORT; RFB 5900 via CROW_BROWSER_RFB_PORT, CDP 9222 via CROW_BROWSER_CDP_PORT. Secondary instances on one host pick +1 offsets (6081/5901/9223), and MUST also set a distinct X display number via CROW_BROWSER_DISPLAY (default 99, secondary 98) — under network_mode: host two instances on the same display collideexisting
6875127.0.0.1bookstack (existing)existing
8000127.0.0.1paperless (existing)existing
8002tailscale IPed-jobs-scraper backend — freed 2026-07-26 (stack migrated to grackle :8002)external, freed
8004127.0.0.1faster-whisper-server (local STT)existing
8004tailscale IPllamacpp-vulkan-qwen3-embed (crow-embed; same port as faster-whisper, different interface)existing
8007127.0.0.1llamacpp-cpu-qwen3-embed (CPU embeddings)PR #111
8011tailscale IPvllm-rocm-qwen35-4b (crow-voice classifier / fast route)existing
8018127.0.0.1design-kit (renderer door: Vega-Lite / Mermaid / D2 → SVG; the render container itself sits on an internal-only Docker network with no egress; no ufw rule)Design kit v1
8080127.0.0.1localai (existing)existing
8081127.0.0.1calibre-server (existing)existing
8083127.0.0.1calibre-web (existing)existing
8084127.0.0.1wallabag (existing)existing
8085127.0.0.1miniflux (existing)existing
8086127.0.0.1shiori (existing)existing
8088127.0.0.1trilium (existing)existing
8088127.0.0.1nominatim default (NOMINATIM_PORT) — collides with trilium; set NOMINATIM_PORT if you run bothexisting
8089127.0.0.1 + tailscale IPedjobs nominatim (external, ~/ed-jobs-scraper) — R4 GIS tools + grackle scraper stack (ufw-scoped)external
8090127.0.0.1(reserved — a private bundle maintained outside this repo)reserved
8091127.0.0.1crowdsec (LAPI)MVP PR 4
8092127.0.0.1stirling-pdfMVP PR 1
8094127.0.0.1gatusMVP PR 2
8095127.0.0.1dozzleMVP PR 2
8096127.0.0.1jellyfin (existing)existing
8097127.0.0.1vaultwardenMVP PR 5
8098127.0.0.1searxngMVP PR 5
8456tailnet (Serve)Tailscale Serve HTTPS → 127.0.0.1:3070 (Workspace; never Funnel)W1 2026-10
8457tailnet (Serve)Tailscale Serve HTTPS → 127.0.0.1:3071 (Workspace editor; never Funnel). Plus one Serve PATH on the same port, no new port: /crow-live → http://127.0.0.1:<gateway port>/api/workspace/live (W2 K5 live-edit plugin; set up by the operator from Office › For the admin)W1 2026-10, W2 path
8010100.64.20.1 (tailscale)llamacpp-vulkan-qwen36-27b-copilot — co-resident critic refute/probe model, 65536 ctx, text-only (crow-addons)existing (2026-07-06)
8530127.0.0.1adguard-home (DNS-over-TLS)MVP PR 3
8554127.0.0.1frigate (RTSP restream)existing
8555127.0.0.1frigate (WebRTC)existing
8765127.0.0.1motioneyeexisting
8880127.0.0.1kokoro-tts (local TTS)existing
8971127.0.0.1frigate (authenticated UI)existing
9000127.0.0.1minio (S3 API, existing)existing
9001127.0.0.1minio (console, existing)existing
9090127.0.0.1linkding (existing)existing
11434127.0.0.1ollama (existing)existing
13378127.0.0.1audiobookshelf (existing)existing
18018127.0.0.1design-kit renderer SMOKE instance (scripts/design-kit/smoke-renderer.sh; transient, tests only, never left running)Design kit v1
18100-18199gateway-internal loopbacknative model servers (per-CROW_HOME dynamic range, not bundle ports — managed by servers/gateway/models/state.js)informational
18789127.0.0.1openclaw-old-docker (pre-existing external process)existing
19999127.0.0.1netdataMVP PR 2
32400hostplex (host networking, existing)existing

Host-networked bundles (no 127.0.0.1 binding — uses host stack directly) ​

These bundles use network_mode: host. They consume whatever ports their upstream service expects directly on the host:

  • browser (Chrome DevTools — verify ports)
  • companion (verify)
  • coturn (3478 UDP, plus turnserver listen ports)
  • plex (32400, plus discovery ports)
  • tailscale (MagicDNS, peer connections)
  • crowdsec-firewall-bouncer (deferred to PR 4.5 — upstream does not publish a Docker image; needs a custom Dockerfile and a tested unwind command verified on a throwaway host) — will need host network to manipulate iptables/nftables

Process for amending this file ​

  1. Pick an unallocated port in a sensible range (admin UIs in 3000-3099, backend APIs in 8000-8099, metrics in 19000-19999).
  2. Add a row to the table with bundle name and PR/status.
  3. CI port-collision check (the static-checks job in .github/workflows/test.yml) verifies your new port doesn't clash.
  4. Reference this file in your bundle's PR description.

Second host: raven ​

Raven (10.0.0.203, raven.example.ts.net) is the second Strix Halo box. Its ports live in their own namespace. The first column is raven:<port>, not a bare number, because scripts/check-port-allocation.js reads bare numbers in the first cell as crow allocations; rows starting raven: are skipped. A raven port is verified only by checking raven (ss -ltn). Making the checker host-aware is follow-up work.

portbindwhatstatus
raven:3009127.0.0.1Crow gateway (user unit crow-gateway.service, CROW_DISABLE_MODEL_ORCHESTRATION=1); reached only through Tailscale Serve raven:8444planned
raven:8444tailnet (Serve)Tailscale Serve HTTPS → 127.0.0.1:3009 (fleet :8444 convention; never Funnel)planned
raven:80300.0.0.0 (ufw: crow + grackle only)halogen Flash-Next production (flash-next.service), an external engine Crow never manageslive
raven:8031–80330.0.0.0two-box masters (window mode, pi-lab)reserved
raven:13305127.0.0.1Lemonade server (lemond, installed but disabled since the 2026-09-24 NPU spike)disabled
raven:9000127.0.0.1Lemonade websocketdisabled

Released under the MIT License.