{"id":13826757,"url":"https://github.com/getoutreach/localizer","last_synced_at":"2026-02-06T15:09:51.629Z","repository":{"id":37103591,"uuid":"289633912","full_name":"getoutreach/localizer","owner":"getoutreach","description":"⛵ A no-frills local development tool for service developers working in Kubernetes","archived":false,"fork":false,"pushed_at":"2026-01-17T00:53:14.000Z","size":1155,"stargazers_count":150,"open_issues_count":10,"forks_count":11,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-01-17T12:55:39.203Z","etag":null,"topics":["developer-tools","hacktoberfest","kubernetes"],"latest_commit_sha":null,"homepage":"https://blog.jaredallard.me/localizer-an-adventure-in-creating-a-reverse-tunnel-and-tunnel-manager-for-kubernetes/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getoutreach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-08-23T07:01:42.000Z","updated_at":"2026-01-17T00:41:39.000Z","dependencies_parsed_at":"2023-02-14T16:45:54.465Z","dependency_job_id":"fe95e03f-93ce-4d1a-a1f1-b9207ae5a39d","html_url":"https://github.com/getoutreach/localizer","commit_stats":null,"previous_names":["jaredallard/localizer"],"tags_count":60,"template":false,"template_full_name":null,"purl":"pkg:github/getoutreach/localizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getoutreach%2Flocalizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getoutreach%2Flocalizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getoutreach%2Flocalizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getoutreach%2Flocalizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getoutreach","download_url":"https://codeload.github.com/getoutreach/localizer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getoutreach%2Flocalizer/sbom","scorecard":{"id":424518,"data":{"date":"2025-08-11","repo":{"name":"github.com/getoutreach/localizer","commit":"fc6c13e39b91b1e9eb75b6df6f8d5f2d7f1cb650"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":7,"reason":"9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pull_request-shared-actions.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/pull_request-shared-actions.yaml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/getoutreach/localizer/pull_request-shared-actions.yaml/main?enable=pin","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.15.13 not signed: https://api.github.com/repos/getoutreach/localizer/releases/239535938","Warn: release artifact v1.15.12 not signed: https://api.github.com/repos/getoutreach/localizer/releases/222807174","Warn: release artifact v1.15.11 not signed: https://api.github.com/repos/getoutreach/localizer/releases/213168538","Warn: release artifact v1.15.10 not signed: https://api.github.com/repos/getoutreach/localizer/releases/201572046","Warn: release artifact v1.15.9 not signed: https://api.github.com/repos/getoutreach/localizer/releases/178034370","Warn: release artifact v1.15.13 does not have provenance: https://api.github.com/repos/getoutreach/localizer/releases/239535938","Warn: release artifact v1.15.12 does not have provenance: https://api.github.com/repos/getoutreach/localizer/releases/222807174","Warn: release artifact v1.15.11 does not have provenance: https://api.github.com/repos/getoutreach/localizer/releases/213168538","Warn: release artifact v1.15.10 does not have provenance: https://api.github.com/repos/getoutreach/localizer/releases/201572046","Warn: release artifact v1.15.9 does not have provenance: https://api.github.com/repos/getoutreach/localizer/releases/178034370"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":5,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Info: codeowner review is required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3540"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T01:57:39.091Z","repository_id":37103591,"created_at":"2025-08-19T01:57:39.092Z","updated_at":"2025-08-19T01:57:39.092Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29166009,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T14:37:12.680Z","status":"ssl_error","status_checked_at":"2026-02-06T14:36:22.973Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","hacktoberfest","kubernetes"],"created_at":"2024-08-04T09:01:43.624Z","updated_at":"2026-02-06T15:09:51.611Z","avatar_url":"https://github.com/getoutreach.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# localizer\n[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go\u0026logoColor=white)](https://pkg.go.dev/github.com/getoutreach/localizer)\n[![Generated via Bootstrap](https://img.shields.io/badge/Outreach-Bootstrap-%235951ff)](https://github.com/getoutreach/bootstrap)\n[![Coverage Status](https://coveralls.io/repos/github/getoutreach/localizer/badge.svg?branch=main)](https://coveralls.io/github//getoutreach/localizer?branch=main)\n\u003c!-- \u003c\u003cStencil::Block(extraBadges)\u003e\u003e --\u003e\n\n\u003c!-- \u003c\u003c/Stencil::Block\u003e\u003e --\u003e\n\nA no-frills local development approach for Kubernetes powered Developer Environments.\n\n## Contributing\n\nPlease read the [CONTRIBUTING.md](CONTRIBUTING.md) document for guidelines on developing and contributing changes.\n\n## High-level Overview\n\n\u003c!-- \u003c\u003cStencil::Block(overview)\u003e\u003e --\u003e\n\nTools such as; Telepresence, Skaffold, and others all attempt to solve the problem of getting users\nused to using Kubernetes. This is a pretty big task given that Kubernetes has a gigantic surface\narea. From my experience (**keyword**: _my experience_), developers have no interest in what\nplatform they are deploying to. All they care about is it's easy to work with and that local development is\nnot complicated or different from what they are used to. I, also, firmly believe that the best dev-tool is\na tool that requires no configuration, and is self-explanatory. Which these tools tend... to not be.\n\nGiven the above, localizer attempts to solve this problem with a few rules:\n\n- A kubernetes cluster should be able to be run locally, but applications should be accessible as if\n  they were running \"locally\" (**Note**: Only on Linux do containers _actually_ run locally, the rest are VMs pretending)\n- There should be little-to-no DSL to interact with services running in Kubernetes locally.\n- No assurances of code working locally will just \"work\" in Kubernetes. (Let's face it, what you're running locally will never match your production clusters 100%, and if we need to test Kubernetes manifests/etc we should be deploying things into our local cluster and be used to debugging whatever way you do that).\n\n## What does `localizer` actually do?\n\nGiven the context of why this was created, and the constraints listed therein, localizer solves these issues\nby emulating services running locally. It, essentially, can be considered a fancy wrapper around `kubectl port-forward`\nin it's basic operation. Services in a cluster are automatically discovered and tunnels are created. While running\nan entry will be added to your local dns resolver that will also allow the service to be looked up by its Kubernetes\nservice name. This allows a thin emulation layer of Kubernetes, without the caveats of a real Kubernetes cluster.\n\n### Example: PostgreSQL\n\nLet's take an example of having a PostgreSQL pod in the `postgres` namespace, when `localizer` is run the `postgres`\nservice will be found, port 5432 will be forwarded and accessible via `localhost:5432` and `postgres.postgres[.svc.cluster.local]` will be added to `/etc/hosts`. You could then run `psql` or some other tooling locally and transparently access\nresources in your Kubernetes cluster as if they were running outside of the cluster.\n\n### Example: Letting services inside of Kubernetes talk to a local service\n\nWhen running `localizer expose \u003cserviceName\u003e` your local machine will look for an existing service in your\nKubernetes cluster, and if it exists it will create a container that will proxy traffic sent to it to your local machine\nallowing remote resources to access your local machine as if they were also running locally.\n\n## Install `localizer`\n\nYou can install the (OSX/LINUX) binary directly into /usr/local/bin:\n\n```\n$ curl -Ls https://github.com/getoutreach/localizer/releases/download/v1.9.0/localizer_1.9.0_$(uname)_amd64.tar.gz | tar -xzC /usr/local/bin localizer\n```\n\nOr manually download a release from [Github Releases](../../releases/latest) and unpack it into your `PATH`.\n\n## How do I run `localizer`?\n\nEasy, just run the following:\n\n```\n$ sudo -E localizer\n```\n\nThis will attempt to proxy all services in Kubernetes to your local machine under their respective ports.\n\n## FAQ\n\n### Does `localizer` support Windows?\n\nWSL2 should work, and I'd consider it supported. I wrote most of this on WSL2, but I will likely maintain it on `macOS`.\nOutside of WSL? Not currently. PRs are welcome!\n\n## License\n\nApache-2.0\n\n\u003c!-- \u003c\u003c/Stencil::Block\u003e\u003e --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetoutreach%2Flocalizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetoutreach%2Flocalizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetoutreach%2Flocalizer/lists"}