gitextract_td0jbyuq/ ├── .dockerignore ├── .editorconfig ├── .envrc ├── .github/ │ ├── CODEOWNERS │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ ├── config.yml │ │ └── feature_request.yaml │ ├── label-response/ │ │ ├── needs-more-info.md │ │ └── support-request.md │ ├── pull_request_template.md │ ├── renovate.json │ └── workflows/ │ ├── build.yml │ ├── check-generated.yml │ ├── check-tests.yaml │ ├── docs-deploy.yml │ ├── docs-test.yml │ ├── gh-action-integration-generator.go │ ├── gh-actions-updater.yaml │ ├── integration-test-template.yml │ ├── lint.yml │ ├── needs-more-info-comment.yml │ ├── needs-more-info-timer.yml │ ├── nix-module-test.yml │ ├── release.yml │ ├── stale.yml │ ├── support-request.yml │ ├── test-integration.yaml │ ├── test.yml │ └── update-flake.yml ├── .gitignore ├── .golangci.yaml ├── .goreleaser.yml ├── .mcp.json ├── .mdformat.toml ├── .pre-commit-config.yaml ├── .prettierignore ├── AGENTS.md ├── CHANGELOG.md ├── CLAUDE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile.derper ├── Dockerfile.integration ├── Dockerfile.integration-ci ├── Dockerfile.tailscale-HEAD ├── LICENSE ├── Makefile ├── README.md ├── buf.gen.yaml ├── cmd/ │ ├── headscale/ │ │ ├── cli/ │ │ │ ├── api_key.go │ │ │ ├── auth.go │ │ │ ├── configtest.go │ │ │ ├── debug.go │ │ │ ├── dump_config.go │ │ │ ├── generate.go │ │ │ ├── health.go │ │ │ ├── mockoidc.go │ │ │ ├── nodes.go │ │ │ ├── policy.go │ │ │ ├── preauthkeys.go │ │ │ ├── pterm_style.go │ │ │ ├── root.go │ │ │ ├── root_test.go │ │ │ ├── serve.go │ │ │ ├── users.go │ │ │ ├── utils.go │ │ │ └── version.go │ │ ├── headscale.go │ │ └── headscale_test.go │ ├── hi/ │ │ ├── README.md │ │ ├── cleanup.go │ │ ├── docker.go │ │ ├── doctor.go │ │ ├── main.go │ │ ├── run.go │ │ └── stats.go │ └── mapresponses/ │ └── main.go ├── config-example.yaml ├── derp-example.yaml ├── docs/ │ ├── about/ │ │ ├── clients.md │ │ ├── contributing.md │ │ ├── faq.md │ │ ├── features.md │ │ ├── help.md │ │ ├── releases.md │ │ └── sponsor.md │ ├── index.md │ ├── ref/ │ │ ├── acls.md │ │ ├── api.md │ │ ├── configuration.md │ │ ├── debug.md │ │ ├── derp.md │ │ ├── dns.md │ │ ├── integration/ │ │ │ ├── reverse-proxy.md │ │ │ ├── tools.md │ │ │ └── web-ui.md │ │ ├── oidc.md │ │ ├── registration.md │ │ ├── routes.md │ │ ├── tags.md │ │ └── tls.md │ ├── requirements.txt │ ├── setup/ │ │ ├── install/ │ │ │ ├── community.md │ │ │ ├── container.md │ │ │ ├── official.md │ │ │ └── source.md │ │ ├── requirements.md │ │ └── upgrade.md │ └── usage/ │ ├── connect/ │ │ ├── android.md │ │ ├── apple.md │ │ └── windows.md │ └── getting-started.md ├── flake.nix ├── gen/ │ ├── go/ │ │ └── headscale/ │ │ └── v1/ │ │ ├── apikey.pb.go │ │ ├── auth.pb.go │ │ ├── device.pb.go │ │ ├── headscale.pb.go │ │ ├── headscale.pb.gw.go │ │ ├── headscale_grpc.pb.go │ │ ├── node.pb.go │ │ ├── policy.pb.go │ │ ├── preauthkey.pb.go │ │ └── user.pb.go │ └── openapiv2/ │ └── headscale/ │ └── v1/ │ ├── apikey.swagger.json │ ├── auth.swagger.json │ ├── device.swagger.json │ ├── headscale.swagger.json │ ├── node.swagger.json │ ├── policy.swagger.json │ ├── preauthkey.swagger.json │ └── user.swagger.json ├── go.mod ├── go.sum ├── hscontrol/ │ ├── app.go │ ├── assets/ │ │ ├── assets.go │ │ └── style.css │ ├── auth.go │ ├── auth_tags_test.go │ ├── auth_test.go │ ├── capver/ │ │ ├── capver.go │ │ ├── capver_generated.go │ │ ├── capver_test.go │ │ └── capver_test_data.go │ ├── db/ │ │ ├── api_key.go │ │ ├── api_key_test.go │ │ ├── db.go │ │ ├── db_test.go │ │ ├── ephemeral_garbage_collector_test.go │ │ ├── ip.go │ │ ├── ip_test.go │ │ ├── main_test.go │ │ ├── node.go │ │ ├── node_test.go │ │ ├── policy.go │ │ ├── preauth_keys.go │ │ ├── preauth_keys_test.go │ │ ├── schema.sql │ │ ├── sqliteconfig/ │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ └── integration_test.go │ │ ├── suite_test.go │ │ ├── testdata/ │ │ │ └── sqlite/ │ │ │ ├── failing-node-preauth-constraint_dump.sql │ │ │ ├── headscale_0.26.0-beta.1_dump.sql │ │ │ ├── headscale_0.26.0-beta.2_dump.sql │ │ │ ├── headscale_0.26.0_dump.sql │ │ │ ├── headscale_0.26.1_dump-litestream.sql │ │ │ ├── headscale_0.26.1_dump.sql │ │ │ ├── headscale_0.26.1_dump_schema-to-0.27.0-old-table-cleanup.sql │ │ │ └── request_tags_migration_test.sql │ │ ├── text_serialiser.go │ │ ├── user_update_test.go │ │ ├── users.go │ │ ├── users_test.go │ │ ├── versioncheck.go │ │ └── versioncheck_test.go │ ├── debug.go │ ├── derp/ │ │ ├── derp.go │ │ ├── derp_test.go │ │ └── server/ │ │ └── derp_server.go │ ├── dns/ │ │ └── extrarecords.go │ ├── grpcv1.go │ ├── grpcv1_test.go │ ├── handlers.go │ ├── mapper/ │ │ ├── batcher.go │ │ ├── batcher_bench_test.go │ │ ├── batcher_concurrency_test.go │ │ ├── batcher_scale_bench_test.go │ │ ├── batcher_test.go │ │ ├── batcher_unit_test.go │ │ ├── builder.go │ │ ├── builder_test.go │ │ ├── mapper.go │ │ ├── mapper_test.go │ │ ├── node_conn.go │ │ └── tail_test.go │ ├── metrics.go │ ├── noise.go │ ├── noise_test.go │ ├── oidc.go │ ├── oidc_template_test.go │ ├── oidc_test.go │ ├── platform_config.go │ ├── policy/ │ │ ├── matcher/ │ │ │ ├── matcher.go │ │ │ └── matcher_test.go │ │ ├── pm.go │ │ ├── policy.go │ │ ├── policy_autoapprove_test.go │ │ ├── policy_route_approval_test.go │ │ ├── policy_test.go │ │ ├── policyutil/ │ │ │ ├── reduce.go │ │ │ └── reduce_test.go │ │ ├── route_approval_test.go │ │ └── v2/ │ │ ├── filter.go │ │ ├── filter_test.go │ │ ├── main_test.go │ │ ├── policy.go │ │ ├── policy_test.go │ │ ├── tailscale_compat_test.go │ │ ├── tailscale_routes_compat_test.go │ │ ├── tailscale_ssh_data_compat_test.go │ │ ├── testdata/ │ │ │ └── ssh_results/ │ │ │ ├── SSH-A1.json │ │ │ ├── SSH-A2.json │ │ │ ├── SSH-A3.json │ │ │ ├── SSH-A4.json │ │ │ ├── SSH-A5.json │ │ │ ├── SSH-A6.json │ │ │ ├── SSH-A7.json │ │ │ ├── SSH-A8.json │ │ │ ├── SSH-B1.json │ │ │ ├── SSH-B2.json │ │ │ ├── SSH-B3.json │ │ │ ├── SSH-B5.json │ │ │ ├── SSH-B6.json │ │ │ ├── SSH-C1.json │ │ │ ├── SSH-C2.json │ │ │ ├── SSH-C3.json │ │ │ ├── SSH-C4.json │ │ │ ├── SSH-D10.json │ │ │ ├── SSH-D11.json │ │ │ ├── SSH-D12.json │ │ │ ├── SSH-D2.json │ │ │ ├── SSH-D3.json │ │ │ ├── SSH-D4.json │ │ │ ├── SSH-D5.json │ │ │ ├── SSH-D6.json │ │ │ ├── SSH-D7.json │ │ │ ├── SSH-D8.json │ │ │ ├── SSH-D9.json │ │ │ ├── SSH-E3.json │ │ │ ├── SSH-E4.json │ │ │ ├── SSH-E5.json │ │ │ ├── SSH-E6.json │ │ │ ├── SSH-F1.json │ │ │ ├── SSH-F2.json │ │ │ ├── SSH-F3.json │ │ │ ├── SSH-F4.json │ │ │ ├── SSH-F5.json │ │ │ ├── SSH-G1.json │ │ │ └── SSH-G2.json │ │ ├── types.go │ │ ├── types_test.go │ │ ├── utils.go │ │ └── utils_test.go │ ├── poll.go │ ├── poll_test.go │ ├── routes/ │ │ ├── primary.go │ │ └── primary_test.go │ ├── servertest/ │ │ ├── assertions.go │ │ ├── client.go │ │ ├── consistency_test.go │ │ ├── content_test.go │ │ ├── ephemeral_test.go │ │ ├── harness.go │ │ ├── issues_test.go │ │ ├── lifecycle_test.go │ │ ├── policy_test.go │ │ ├── poll_race_test.go │ │ ├── race_test.go │ │ ├── routes_test.go │ │ ├── server.go │ │ ├── stress_test.go │ │ └── weather_test.go │ ├── state/ │ │ ├── debug.go │ │ ├── debug_test.go │ │ ├── endpoint_test.go │ │ ├── ephemeral_test.go │ │ ├── maprequest.go │ │ ├── maprequest_test.go │ │ ├── node_store.go │ │ ├── node_store_test.go │ │ ├── ssh_check_test.go │ │ ├── state.go │ │ ├── tags.go │ │ └── test_helpers.go │ ├── tailsql.go │ ├── templates/ │ │ ├── apple.go │ │ ├── auth_success.go │ │ ├── auth_web.go │ │ ├── design.go │ │ ├── general.go │ │ └── windows.go │ ├── templates_consistency_test.go │ ├── types/ │ │ ├── api_key.go │ │ ├── change/ │ │ │ ├── change.go │ │ │ └── change_test.go │ │ ├── common.go │ │ ├── common_test.go │ │ ├── config.go │ │ ├── config_test.go │ │ ├── const.go │ │ ├── main_test.go │ │ ├── node.go │ │ ├── node_benchmark_test.go │ │ ├── node_tags_test.go │ │ ├── node_test.go │ │ ├── policy.go │ │ ├── preauth_key.go │ │ ├── preauth_key_test.go │ │ ├── routes.go │ │ ├── testdata/ │ │ │ ├── base-domain-in-server-url.yaml │ │ │ ├── base-domain-not-in-server-url.yaml │ │ │ ├── dns-override-true-error.yaml │ │ │ ├── dns-override-true.yaml │ │ │ ├── dns_full.yaml │ │ │ ├── dns_full_no_magic.yaml │ │ │ ├── minimal.yaml │ │ │ └── policy-path-is-loaded.yaml │ │ ├── types_clone.go │ │ ├── types_view.go │ │ ├── users.go │ │ ├── users_test.go │ │ └── version.go │ └── util/ │ ├── addr.go │ ├── addr_test.go │ ├── const.go │ ├── dns.go │ ├── dns_test.go │ ├── file.go │ ├── key.go │ ├── log.go │ ├── net.go │ ├── norace.go │ ├── prompt.go │ ├── prompt_test.go │ ├── race.go │ ├── string.go │ ├── string_test.go │ ├── test.go │ ├── util.go │ ├── util_test.go │ └── zlog/ │ ├── fields.go │ ├── hostinfo.go │ ├── maprequest.go │ ├── zf/ │ │ └── fields.go │ └── zlog_test.go ├── integration/ │ ├── README.md │ ├── acl_test.go │ ├── api_auth_test.go │ ├── auth_key_test.go │ ├── auth_oidc_test.go │ ├── auth_web_flow_test.go │ ├── cli_test.go │ ├── control.go │ ├── derp_verify_endpoint_test.go │ ├── dns_test.go │ ├── dockertestutil/ │ │ ├── build.go │ │ ├── config.go │ │ ├── execute.go │ │ ├── logs.go │ │ └── network.go │ ├── dsic/ │ │ └── dsic.go │ ├── embedded_derp_test.go │ ├── general_test.go │ ├── helpers.go │ ├── hsic/ │ │ ├── config.go │ │ └── hsic.go │ ├── integrationutil/ │ │ └── util.go │ ├── route_test.go │ ├── run.sh │ ├── scenario.go │ ├── scenario_test.go │ ├── ssh_test.go │ ├── tags_test.go │ ├── tailscale.go │ └── tsic/ │ └── tsic.go ├── mkdocs.yml ├── nix/ │ ├── README.md │ ├── example-configuration.nix │ ├── module.nix │ └── tests/ │ └── headscale.nix ├── packaging/ │ ├── README.md │ ├── deb/ │ │ ├── postinst │ │ ├── postrm │ │ └── prerm │ └── systemd/ │ └── headscale.service ├── proto/ │ ├── buf.yaml │ └── headscale/ │ └── v1/ │ ├── apikey.proto │ ├── auth.proto │ ├── device.proto │ ├── headscale.proto │ ├── node.proto │ ├── policy.proto │ ├── preauthkey.proto │ └── user.proto ├── swagger.go └── tools/ └── capver/ └── main.go