Headscale is a self-hosted control server for Tailscale clients that provides private WireGuard mesh networking without external coordination clouds.
Tailscale Corporate requires routing your network metadata, machine keys, and node maps through a proprietary cloud service with escalating per-user pricing. Headscale implements that same coordination protocol on your own Linux server, keeping network maps and device keys entirely under your infrastructure control while working directly with official Tailscale clients.
Headscale fits infrastructure workflows where network topology is managed as code rather than clicked in a web portal. Tailscale Corporate manages device onboarding and access rules through a centralized web dashboard designed for enterprise IT. Headscale replaces that control plane with a standalone Go binary exposing a scriptable command-line interface and gRPC API. DevOps teams can generate pre-authenticated registration keys inside Terraform or Ansible, declare Access Control Lists in Git-versioned HuJSON files, and connect ephemeral CI runners without interactive browser logins. Because Headscale speaks the standard Tailscale client protocol, workstations and servers establish direct peer-to-peer WireGuard tunnels using official client software.
The trade-off is operational ownership. While Tailscale Corporate provides turnkey browser logins and enterprise user provisioning, Headscale requires manual node enrollment or an OpenID Connect provider, with clients specifying a custom server flag or registry override. Headscale also omits Tailscale Funnel and Serve for public ingress, and identity provider group claims cannot yet populate access rules directly. For teams building automated delivery pipelines, driving mesh networking through declarative files and local APIs eliminates third-party telemetry while keeping node keys entirely internal.
Can official Tailscale clients connect to Headscale? Yes. Official Tailscale clients across Linux, macOS, Windows, iOS, and Android work with Headscale by configuring the custom server URL during initial login.
Headscale vs Tailscale Corporate — how do they differ? Tailscale Corporate is a commercial managed SaaS providing multi-organization tenancy, SCIM provisioning, and a hosted web console. Headscale is a self-hosted Go binary that replaces the coordination server for a single network, giving teams complete privacy and scriptable control.
Is Headscale free for commercial and team use? Yes. Headscale is open-source software with no node quotas, seat limits, or paid enterprise editions.
Headscale is the right choice when you want Tailscale's peer-to-peer WireGuard mesh without delegating coordination keys or recurring subscription budgets to a hosted vendor. Active development on GitHub and a BSD-3-Clause license ensure full freedom to deploy, modify, or embed the coordination daemon across internal enterprise infrastructure without commercial constraints.
Commands from the official package registries. Each package is matched to Headscale through the registry's own link to its source code or website.
sudo pacman -S headscaleWe started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Headscale's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p headscale && cd headscale
curl -fsSL https://open-source.store/tools/headscale/compose.yml -o compose.ymlcat > .env <<EOF
HEADSCALE_SERVER_URL=http://localhost:8080
EOFHEADSCALE_SERVER_URL — Public URL where Headscale is reached (e.g. https://<your-domain>); set this to your server's public URL.docker compose up -dservices:
headscale:
image: headscale/headscale:0.29.7
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- headscale-data:/var/lib/headscale
tmpfs:
- /var/run/headscale
environment:
HEADSCALE_SERVER_URL: ${HEADSCALE_SERVER_URL}
HEADSCALE_LISTEN_ADDR: 0.0.0.0:8080
HEADSCALE_METRICS_LISTEN_ADDR: 127.0.0.1:9090
HEADSCALE_GRPC_LISTEN_ADDR: 127.0.0.1:50443
HEADSCALE_NOISE_PRIVATE_KEY_PATH: /var/lib/headscale/noise_private.key
HEADSCALE_PREFIXES_V4: 100.64.0.0/10
HEADSCALE_PREFIXES_V6: fd7a:115c:a1e0::/48
HEADSCALE_DATABASE_TYPE: sqlite
HEADSCALE_DATABASE_SQLITE_PATH: /var/lib/headscale/db.sqlite
HEADSCALE_DNS_OVERRIDE_LOCAL_DNS: "false"
HEADSCALE_DNS_BASE_DOMAIN: tailnet.internal
HEADSCALE_DERP_URLS: "https://controlplane.tailscale.com/derpmap/default"
HEADSCALE_DISABLE_CHECK_UPDATES: "true"
command: serve
healthcheck:
test: ["CMD", "headscale", "health"]
interval: 5s
timeout: 5s
retries: 10
start_period: 5s
volumes:
headscale-data:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Headscale is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 15 s: headscale/headscale:0.29.7.
Based on the upstream setup. Official container setup pinned to 0.29.7 with SQLite on a named volume. Differs from upstream: configured entirely via environment variables (no config.yaml), override_local_dns is false with no global nameservers, the embedded DERP/STUN (3478/udp) is off so the Tailscale public DERP map is used, metrics 9090 is not published, and the server is plain HTTP on 8080 (HTTPS needs a reverse proxy).
headscale-1 | 2026-11-01T01:03:43.678136254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008375 method=GET path=/MicroStrategyWS/happyaxis.jsp proto=HTTP/1.1 remote=192.168.64.109:50986 status=404 headscale-1 | 2026-11-01T01:03:43.678138837Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:50990 status=404 headscale-1 | 2026-11-01T01:03:43.678143171Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:50994 headscale-1 | 2026-11-01T01:03:43.678145962Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.03425 method=GET path=/api/v1/artifact/getArtifact proto=HTTP/1.1 remote=192.168.64.109:50994 status=401 headscale-1 | 2026-11-01T01:03:43.678148254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007625 method=GET path=/ESPEasy proto=HTTP/1.1 remote=192.168.64.109:51010 status=404 headscale-1 | 2026-11-01T01:03:43.678150587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007625 method=GET path=/wp-admin/admin-ajax.php proto=HTTP/1.1 remote=192.168.64.109:51022 status=404 headscale-1 | 2026-11-01T01:03:43.678152879Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007333 method=GET path=/tweb/ft.php proto=HTTP/1.1 remote=192.168.64.109:51038 status=404 headscale-1 | 2026-11-01T01:03:43.678155004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007875 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51040 status=404 headscale-1 | 2026-11-01T01:03:43.678157129Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007459 method=GET path=/../../../../../../../../../../../../etc/passwd proto=HTTP/1.1 remote=192.168.64.109:51056 status=404 headscale-1 | 2026-11-01T01:03:43.678159379Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007792 method=GET path=/admin.html proto=HTTP/1.1 remote=192.168.64.109:51064 status=404 headscale-1 | 2026-11-01T01:03:43.678161462Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007334 method=GET path=/ESPEasy proto=HTTP/1.1 remote=192.168.64.109:51072 status=404 headscale-1 | 2026-11-01T01:03:43.678163671Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00775 method=GET path=/../../../../../../../../../../../../etc/passwd proto=HTTP/1.1 remote=192.168.64.109:50890 status=404 headscale-1 | 2026-11-01T01:03:43.678165962Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007542 method=GET path=/filezilla.xml proto=HTTP/1.1 remote=192.168.64.109:51074 status=404 headscale-1 | 2026-11-01T01:03:43.678168171Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.0075 method=GET path=/gsearch.php.en proto=HTTP/1.1 remote=192.168.64.109:51088 status=404 headscale-1 | 2026-11-01T01:03:43.678170296Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.021 method=GET path=/module/smartblog/archive proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.678177754Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003334 method=GET path=/MicroStrategyWS/happyaxis.jsp proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.678180504Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:51076 headscale-1 | 2026-11-01T01:03:43.678182962Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.038833 method=GET path=/api/experimental/latest_runs proto=HTTP/1.1 remote=192.168.64.109:51076 status=401 headscale-1 | 2026-11-01T01:03:43.678452629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.026708 method=GET path=/wp-content/plugins/localize-my-post/ajax/include.php proto=HTTP/1.1 remote=192.168.64.109:51246 status=404 headscale-1 | 2026-11-01T01:03:43.678684629Z 2026-11-01T01:03:43Z INF http request bytes=123 elapsed=0.034417 method=GET path=/ proto=HTTP/1.1 remote=192.168.64.109:51088 status=200 headscale-1 | 2026-11-01T01:03:43.678979004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.015709 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51234 status=404 headscale-1 | 2026-11-01T01:03:43.679221921Z 2026-11-01T01:03:43Z INF http request bytes=123 elapsed=0.009541 method=GET path=/ proto=HTTP/1.1 remote=192.168.64.109:50890 status=200 headscale-1 | 2026-11-01T01:03:43.679387837Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.019375 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51230 status=404 headscale-1 | 2026-11-01T01:03:43.679590629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.011708 method=GET path=/staging/auth.json proto=HTTP/1.1 remote=192.168.64.109:51222 status=404 headscale-1 | 2026-11-01T01:03:43.679978587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010375 method=GET path=/user/register proto=HTTP/1.1 remote=192.168.64.109:51206 status=404 headscale-1 | 2026-11-01T01:03:43.680170796Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00975 method=GET path=/configs/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51190 status=404 headscale-1 | 2026-11-01T01:03:43.680192837Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010083 method=GET path=/sphinxsearch/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51202 status=404 headscale-1 | 2026-11-01T01:03:43.680381962Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.04975 method=GET path=/resources/qmc/fonts/../../../qrs/ReloadTask proto=HTTP/1.1 remote=192.168.64.109:51178 status=404 headscale-1 | 2026-11-01T01:03:43.680485254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.009208 method=GET path=/p/user/ftoken/activate/user/guest/ proto=HTTP/1.1 remote=192.168.64.109:51164 status=404 headscale-1 | 2026-11-01T01:03:43.680653296Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008541 method=GET path=/wp-content/plugins/wp-advanced-search/class.inc/autocompletion/autocompletion-PHP5.5.php proto=HTTP/1.1 remote=192.168.64.109:51160 status=404 headscale-1 | 2026-11-01T01:03:43.680713504Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008958 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51146 status=404 headscale-1 | 2026-11-01T01:03:43.680870796Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008458 method=GET path=/module/smartblog/archive proto=HTTP/1.1 remote=192.168.64.109:51130 status=404 headscale-1 | 2026-11-01T01:03:43.680943379Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007625 method=GET path=/wp-admin/admin-ajax.php proto=HTTP/1.1 remote=192.168.64.109:51124 status=404 headscale-1 | 2026-11-01T01:03:43.680999337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008667 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51134 status=404 headscale-1 | 2026-11-01T01:03:43.683705212Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006 method=GET path=/sitemanager.xml proto=HTTP/1.1 remote=192.168.64.109:51056 status=404 headscale-1 | 2026-11-01T01:03:43.684235004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.004334 method=GET path=/opencms/cmisatom/cmis-online/type proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.684680087Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.076833 method=GET path=/staging/auth.json proto=HTTP/1.1 remote=192.168.64.109:51092 status=404 headscale-1 | 2026-11-01T01:03:43.684685296Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.0125 method=GET path=/user/resend-activation proto=HTTP/1.1 remote=192.168.64.109:51108 status=404 headscale-1 | 2026-11-01T01:03:43.686460171Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.016541 method=GET path="/theme/META-INF/����/����/����/����/����/����/����/����/����/����/etc/passwd" proto=HTTP/1.1 remote=192.168.64.109:51360 status=404 headscale-1 | 2026-11-01T01:03:43.686672379Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010625 method=GET path="/theme/META-INF/����/����/����/����/����/����/����/����/����/����/etc/passwd" proto=HTTP/1.1 remote=192.168.64.109:51344 status=404 headscale-1 | 2026-11-01T01:03:43.686875754Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.01375 method=GET path=/comment/api/index.php proto=HTTP/1.1 remote=192.168.64.109:51320 status=404 headscale-1 | 2026-11-01T01:03:43.686956754Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.011333 method=GET path=/search/configs/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51288 status=404 headscale-1 | 2026-11-01T01:03:43.687000504Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.008458 method=GET path=/wp-content/plugins/mypixs/mypixs/downloadpage.php proto=HTTP/1.1 remote=192.168.64.109:51328 status=404 headscale-1 | 2026-11-01T01:03:43.687044921Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010958 method=GET path=/wp-content/plugins/mypixs/mypixs/downloadpage.php proto=HTTP/1.1 remote=192.168.64.109:51308 status=404 headscale-1 | 2026-11-01T01:03:43.687253087Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.009458 method=GET path=/opencms/cmisatom/cmis-online/type proto=HTTP/1.1 remote=192.168.64.109:51302 status=404 headscale-1 | 2026-11-01T01:03:43.687320046Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.1005 method=GET path=/prod/auth.json proto=HTTP/1.1 remote=192.168.64.109:51274 status=404 headscale-1 | 2026-11-01T01:03:43.687497254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.009375 method=GET path=/SecurityGateway.dll proto=HTTP/1.1 remote=192.168.64.109:51260 status=404 headscale-1 | 2026-11-01T01:03:43.687767254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010375 method=GET path=/SecurityGateway.dll proto=HTTP/1.1 remote=192.168.64.109:51252 status=404 headscale-1 | 2026-11-01T01:03:43.688313754Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003792 method=GET path="/<style onload=alert`document.domain`;>../../" proto=HTTP/1.1 remote=192.168.64.109:51092 status=404 headscale-1 | 2026-11-01T01:03:43.688442629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002458 method=GET path=/wp-content/plugins/members-list/admin/view/user.php proto=HTTP/1.1 remote=192.168.64.109:51108 status=404 headscale-1 | 2026-11-01T01:03:43.688626712Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003834 method=GET path=/comment/api/index.php proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.688935629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002708 method=GET path="/<style onload=alert`document.domain`;>../../" proto=HTTP/1.1 remote=192.168.64.109:51056 status=404 headscale-1 | 2026-11-01T01:03:43.689243629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.010875 method=GET path=/prod/auth.json proto=HTTP/1.1 remote=192.168.64.109:51536 status=404 headscale-1 | 2026-11-01T01:03:43.689279296Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006583 method=GET path=/FileZilla.xml proto=HTTP/1.1 remote=192.168.64.109:51378 status=404 headscale-1 | 2026-11-01T01:03:43.689413587Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:51518 headscale-1 | 2026-11-01T01:03:43.689450296Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.2145 method=GET path=/api/v1/auto_login proto=HTTP/1.1 remote=192.168.64.109:51518 status=401 headscale-1 | 2026-11-01T01:03:43.689571629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006708 method=GET path=/install proto=HTTP/1.1 remote=192.168.64.109:51534 status=404 headscale-1 | 2026-11-01T01:03:43.689671004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.123875 method=GET path=/user/register proto=HTTP/1.1 remote=192.168.64.109:51444 status=404 headscale-1 | 2026-11-01T01:03:43.689747629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.09525 method=GET path=/WebMstr7/servlet/mstrWeb proto=HTTP/1.1 remote=192.168.64.109:51428 status=404 headscale-1 | 2026-11-01T01:03:43.689861337Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:51434 headscale-1 | 2026-11-01T01:03:43.690057712Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.005375 method=GET path=/install proto=HTTP/1.1 remote=192.168.64.109:51456 status=404 headscale-1 | 2026-11-01T01:03:43.690107254Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:51440 headscale-1 | 2026-11-01T01:03:43.690209837Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.218167 method=GET path=/api/v1/auto_login proto=HTTP/1.1 remote=192.168.64.109:51440 status=401 headscale-1 | 2026-11-01T01:03:43.690321171Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006333 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51412 status=404 headscale-1 | 2026-11-01T01:03:43.690449046Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.088167 method=GET path=/wp-content/plugins/members-list/admin/view/user.php proto=HTTP/1.1 remote=192.168.64.109:51468 status=404 headscale-1 | 2026-11-01T01:03:43.690496337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006625 method=GET path=/index.php proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.690616629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.007084 method=GET path=/WebMstr7/servlet/mstrWeb proto=HTTP/1.1 remote=192.168.64.109:51484 status=404 headscale-1 | 2026-11-01T01:03:43.690722254Z 2026-11-01T01:03:43Z ERR home/runner/work/headscale/headscale/hscontrol/app.go:486 > missing "Bearer " prefix in "Authorization" header client_address=192.168.64.109:51500 headscale-1 | 2026-11-01T01:03:43.690785296Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.184875 method=GET path=/api/snapshots/:key proto=HTTP/1.1 remote=192.168.64.109:51500 status=401 headscale-1 | 2026-11-01T01:03:43.690845837Z 2026-11-01T01:03:43Z INF http request bytes=12 elapsed=0.197125 method=GET path=/api/snapshots/:key proto=HTTP/1.1 remote=192.168.64.109:51434 status=401 headscale-1 | 2026-11-01T01:03:43.690962379Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006083 method=GET path=/sitemanager.xml proto=HTTP/1.1 remote=192.168.64.109:51448 status=404 headscale-1 | 2026-11-01T01:03:43.690999754Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006458 method=GET path="/theme/META-INF/prototype��..��..��..��..��..��..��..��..��..��..��..��..��windows/win.ini" proto=HTTP/1.1 remote=192.168.64.109:51396 status=404 headscale-1 | 2026-11-01T01:03:43.691067004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001583 method=GET path=/production/auth.json proto=HTTP/1.1 remote=192.168.64.109:51108 status=404 headscale-1 | 2026-11-01T01:03:43.691185046Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006042 method=GET path=/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51384 status=404 headscale-1 | 2026-11-01T01:03:43.691244921Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001458 method=GET path="/theme/META-INF/prototype��..��..��..��..��..��..��..��..��..��..��..��..��windows/win.ini" proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.691481129Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003458 method=GET path=/umbraco/management/api/v1/server/status proto=HTTP/1.1 remote=192.168.64.109:51412 status=404 headscale-1 | 2026-11-01T01:03:43.691613587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002041 method=GET path=/production/auth.json proto=HTTP/1.1 remote=192.168.64.109:51468 status=404 headscale-1 | 2026-11-01T01:03:43.691717421Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00175 method=GET path=/user/resend-activation proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.691833671Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.019667 method=GET path=/umbraco/management/api/v1/server/status proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.692502629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.009042 method=GET path=/includes/auth.json proto=HTTP/1.1 remote=192.168.64.109:51468 status=404 headscale-1 | 2026-11-01T01:03:43.692800837Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002708 method=GET path=/sphinx/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51500 status=404 headscale-1 | 2026-11-01T01:03:43.692920587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002583 method=GET path=/dashboard/snapshot/:key proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.693207129Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002334 method=GET path=/includes/auth.json proto=HTTP/1.1 remote=192.168.64.109:51500 status=404 headscale-1 | 2026-11-01T01:03:43.693358921Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002167 method=GET path=/dashboard/snapshot/:key proto=HTTP/1.1 remote=192.168.64.109:51076 status=404 headscale-1 | 2026-11-01T01:03:43.693486546Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001917 method=GET path=/FileZilla.xml proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.693617004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002208 method=GET path=/sphinxsearch/sphinx.conf proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.693730671Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002334 method=GET path=/include/auth.json proto=HTTP/1.1 remote=192.168.64.109:51500 status=404 headscale-1 | 2026-11-01T01:03:43.693944671Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002083 method=GET path=/include/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.694130296Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002125 method=GET path=/lib/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.694369546Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001916 method=GET path=/lib/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.694399712Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002333 method=GET path=/libs/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.694704879Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.004083 method=GET path=/libs/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.694829337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002417 method=GET path=/library/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.695152337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003042 method=GET path=/vendor/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.695157004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001666 method=GET path=/library/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.695289337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.004167 method=GET path=/vendor/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.695537921Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003459 method=GET path=/vendors/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.695634796Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002083 method=GET path=/vendors/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.696052254Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.006041 method=GET path=/node_modules/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.696383462Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.0025 method=GET path=/node_modules/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.696423587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002125 method=GET path=/storage/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.696779171Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.0025 method=GET path=/storage/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.696932921Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002042 method=GET path=/database/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.697192337Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00375 method=GET path=/database/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.697195629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00225 method=GET path=/db/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.697389629Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002583 method=GET path=/db/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.697447754Z 2026-11-01T01:03:43Z ERR user msg: invalid auth id error="parsing auth_id from URL: auth ID has invalid prefix: expected prefix \"hskey-authreq-\"" code=400 headscale-1 | 2026-11-01T01:03:43.697544254Z 2026-11-01T01:03:43Z INF http request bytes=16 elapsed=0.089042 method=GET path=/auth/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=400 headscale-1 | 2026-11-01T01:03:43.697858046Z 2026-11-01T01:03:43Z ERR user msg: invalid auth id error="parsing auth_id from URL: auth ID has invalid prefix: expected prefix \"hskey-authreq-\"" code=400 headscale-1 | 2026-11-01T01:03:43.698066046Z 2026-11-01T01:03:43Z INF http request bytes=16 elapsed=0.1365 method=GET path=/auth/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=400 headscale-1 | 2026-11-01T01:03:43.698086546Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002792 method=GET path=/authentication/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.698685837Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003 method=GET path=/oauth/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.698867379Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00275 method=GET path=/authentication/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.698915587Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.0015 method=GET path=/keys/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.698939962Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.000958 method=GET path=/oauth/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.699094004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.002292 method=GET path=/credentials/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.699311879Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001458 method=GET path=/keys/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.699316671Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.00125 method=GET path=/creds/auth.json proto=HTTP/1.1 remote=192.168.64.109:51408 status=404 headscale-1 | 2026-11-01T01:03:43.699359212Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.001041 method=GET path=/credentials/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404 headscale-1 | 2026-11-01T01:03:43.699506004Z 2026-11-01T01:03:43Z INF http request bytes=19 elapsed=0.003166 method=GET path=/creds/auth.json proto=HTTP/1.1 remote=192.168.64.109:51470 status=404