{"id":19898342,"url":"https://github.com/peterldowns/localias","last_synced_at":"2026-03-09T23:35:52.699Z","repository":{"id":79220605,"uuid":"605657219","full_name":"peterldowns/localias","owner":"peterldowns","description":"custom local domain aliases for local dev servers","archived":false,"fork":false,"pushed_at":"2025-11-07T17:38:27.000Z","size":716,"stargazers_count":1339,"open_issues_count":3,"forks_count":13,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-12-18T17:29:49.126Z","etag":null,"topics":["cli","cli-app","cli-application","cli-tool","cli-tools","devtools","devtools-team","golang","golang-application","golang-tool","golang-tools","proxies","proxy-server","webdev","webdevelopment"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peterldowns.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-02-23T16:14:26.000Z","updated_at":"2025-12-18T09:24:54.000Z","dependencies_parsed_at":"2023-12-29T19:38:17.700Z","dependency_job_id":"bd6f811c-226a-40b3-9c83-163bcf2e8272","html_url":"https://github.com/peterldowns/localias","commit_stats":null,"previous_names":["peterldowns/pfpro"],"tags_count":71,"template":false,"template_full_name":null,"purl":"pkg:github/peterldowns/localias","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterldowns%2Flocalias","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterldowns%2Flocalias/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterldowns%2Flocalias/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterldowns%2Flocalias/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peterldowns","download_url":"https://codeload.github.com/peterldowns/localias/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterldowns%2Flocalias/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30316772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T20:05:46.299Z","status":"ssl_error","status_checked_at":"2026-03-09T19:57:04.425Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["cli","cli-app","cli-application","cli-tool","cli-tools","devtools","devtools-team","golang","golang-application","golang-tool","golang-tools","proxies","proxy-server","webdev","webdevelopment"],"created_at":"2024-11-12T19:01:38.337Z","updated_at":"2026-03-09T23:35:52.682Z","avatar_url":"https://github.com/peterldowns.png","language":"Go","funding_links":[],"categories":["Go","Related"],"sub_categories":[],"readme":"# 🏠 localias\n\n![Latest Version](https://badgers.space/badge/latest%20version/v3.0.0/blueviolet?corner_radius=m)\n![Golang](https://badgers.space/badge/golang/1.21+/blue?corner_radius=m)\n\nLocalias is a tool for developers to securely manage local aliases for development servers.\n\nUse Localias to redirect `https://server.test` \u0026rarr; `http://localhost:3000` in your browser and on your command line. \n\n\u003cimg width=\"464\" alt=\"iTerm showing the most basic usage of Localias\" src=\"https://github.com/peterldowns/localias/assets/824173/5b0121df-237e-47e7-92b8-d09017fcf95f.png\"\u003e\n\n### Major Features\n- Use convenient names, without ports, in your URLs\n- Serve your development website behind TLS, minimizing differences between development and production.\n  - No more CORS problems!\n  - Set secure cookies!\n- Works on MacOS, Linux, and even WSL2 (!)\n- Automatically provisions and installs TLS certificates for all of your aliases\n  by default.\n- Automatically updates `/etc/hosts` as you add and remove aliases, so that they\n  work with all of your tools.\n- Runs in the foreground or as a background daemon process, your choice.\n- Supports shared configuration files so your whole team can use the same\n  aliases for your development services.\n- Proxies requests and generates TLS certs with\n  [`caddy`](https://caddyserver.com/) so it's fast and secure by default.\n- Serves `.local` domains over mDNS, so you can visit your development\n  servers from your phone or any other device connected to the same network.\n\n\n# Install\n\n#### Homebrew:\n```bash\n# install it\nbrew install peterldowns/tap/localias\n```\n\n#### Golang:\n```bash\n# run it\ngo run github.com/peterldowns/localias/cmd/localias@latest --help\n# install it\ngo install github.com/peterldowns/localias/cmd/localias@latest\n```\n\n#### Nix (flakes):\n```bash\n# run it\nnix run github:peterldowns/localias -- --help\n# install it\nnix profile install --refresh github:peterldowns/localias\n```\n\n#### Manually download binaries\nVisit [the latest Github release](https://github.com/peterldowns/localias/releases/latest) and pick the appropriate binary. Or, click one of the shortcuts here:\n- [darwin-amd64](https://github.com/peterldowns/localias/releases/latest/download/localias-darwin-amd64)\n- [darwin-arm64](https://github.com/peterldowns/localias/releases/latest/download/localias-darwin-arm64)\n- [linux-amd64](https://github.com/peterldowns/localias/releases/latest/download/localias-linux-amd64)\n- [linux-arm64](https://github.com/peterldowns/localias/releases/latest/download/localias-linux-arm64)\n\n# How does it work?\n\nLocalias has two parts:\n- the configuration file\n- the proxy server\n\nThe configuration file is where Localias keeps track of your aliases, and to which local ports they should be pointing. The proxy server then runs and actually proxies requests based on the configuration.\n\n### configuration file\nEvery time you run `localias`, it looks for a config file in the following places, using the first one that it finds:\n\n- If you pass an explicit `--configfile \u003cpath\u003e`, it will attempt to use `\u003cpath\u003e`\n- If you set an environment variable `LOCALIAS_CONFIGFILE=\u003cpath\u003e`, it will attempt to use `\u003cpath\u003e`\n- If your current directory has `.localias.yaml`, it will use `$pwd/.localias.yaml`\n- If you are in a git repository and there is a `.localias.yaml` at the root of the repository, use `$repo_root/.localias.yaml`\n- Otherwise, use `$XDG_CONFIG_HOME/localias.yaml`, creating it if necessary.\n  - On MacOS, this defaults to `~/Library/Application\\ Support/localias.yaml`\n  - On Linux or on WSL, this defaults to `~/.config/localias.yaml`\n\nThis means that your whole dev team can share the same aliases by adding `.localias.yaml` to the root of your git repository.\n\nTo show the configuration file currently in use, you can run\n\n```bash\n# Print the path to the current configuration file\nlocalias debug config\n# Print the contents of the current configuration file\nlocalias debug config --print\n```\n\nThe following commands all interact directly with the configuration file:\n\n```shell\n# add or edit an alias\nlocalias set \u003calias\u003e \u003cport\u003e\n# clear all aliases\nlocalias clear\n# list all aliases\nlocalias list\n# remove an alias\nlocalias remove \u003calias\u003e\n# import all the aliases from another config file\nlocalias import path/to/another/config/localias.yaml\n```\n\nThe configuration file is just a YAML map of `\u003calias\u003e: \u003cport\u003e`! For example, this is a valid configuration file:\n\n```yaml\nbareTLD: 9003 # serves over https and http\nimplicitly_secure.test: 9002 # serves over https and http\nhttps://explicit_secure.test: 9000 # serves over https and http\nhttp://explicit_insecure.test: 9001 # serves over http only\n```\n\n### proxy server\n\nWhen you execute `localias run` or `localias start` to run the proxy server, Localias performs the following operations:\n\n- Reads the current Localias configuration file to find all the current aliases and the ports to which they're pointing.\n- Checks the `/etc/hosts` file to make sure that every alias is present\n  - Adds any new aliases that aren't already present\n  - Removes any old aliases that are no longer in the Localias config\n  - Only updates the file if any changes were made, since this requires `sudo` privileges.\n- Runs the Caddy proxy server\n  - If Caddy has not already generated a local root certificate:\n    - Generate a local root certificate to sign TLS certificates\n    - Install the local root certificate to the system's trust stores, and the Firefox certificate store if it exists and an be accessed.\n  - Generate a Caddy configuration telling it how to redirect each alias to the correct local port.\n  - Generate and sign TLS certificates for each of the aliases currently in use\n  - Bind to ports 80/443 in order to proxy requests\n\nLocalias requires elevated privileges to perform these actions as part of running the proxy server:\n- Edit `/etc/hosts`\n- Install the locally generated root certificate to your system store\n- Bind to ports 80/443 in order to run the proxy server\n\nWhen you run Localias, each time it needs to do these things, it will open a subshell using `sudo` to perform these actions, and this will prompt you for your password. Localias *does not read or interact with your password*.\n\nLocalias is entirely local and performs no telemetry.\n\n# Quickstart\n\n## Running the server for the first time\n\nAfter installing `localias`, you will need to configure some aliases. For this quickstart example, we'll assume that you're running a local http frontend devserver on `http://localhost:3000`, and that you'd like to be able to access it at `https://frontend.test` in your browser and via tools like `curl`.\n\nFirst, create the alias:\n\n```console\n$ localias set frontend.test 3000\n[added] frontend.test -\u003e 3000\n```\n\nYou can check to see that it was added correctly:\n\n```console\n$ localias list\nfrontend.test -\u003e 3000\n```\n\nThat's it in terms of configuration!\n\nNow, start the proxy server. You can do this in the foreground with `localias run` (and stop it with `ctrl-c`) or you can start the server in the background with `localias start`. For the purposes of this quickstart, we'll do it in the foreground.\n\n```console\n$ localias run\n# some prompts to authenticate as root\n# ... lots of server logs like this:\n2023/05/02 23:12:58.218 INFO    tls.obtain      acquiring lock  {\"identifier\": \"frontend.test\"}\n2023/05/02 23:12:58.229 INFO    tls.obtain      lock acquired   {\"identifier\": \"frontend.test\"}\n2023/05/02 23:12:58.230 INFO    tls.obtain      obtaining certificate   {\"identifier\": \"frontend.test\"}\n2023/05/02 23:12:58.230 INFO    tls.obtain      certificate obtained successfully       {\"identifier\": \"frontend.test\"}\n2023/05/02 23:12:58.230 INFO    tls.obtain      releasing lock  {\"identifier\": \"frontend.test\"}\n# process is now waiting for requests\n```\n\nThis will prompt you to authenticate at least once. Each time Localias runs, it will\n\n- Automatically edit your `/etc/hosts` file and add entries for each of your aliases.\n- Sign TLS certificates for your aliases, and generate+install a custom root certificate to your system if it hasn't done so already. \n\nEach of these steps requires sudo access. But starting/stopping Localias will only prompt for sudo when it needs to, so if you hit `control-C` and restart the process you won't get prompted again:\n\n```console\n^C\n$ localias run\n# ... lots of server logs\n# ... but no sudo prompts!\n```\n\nCongratulations, you're done! Start your development servers (or just one of them) in another console. You should be able to visit [`https://frontend.test`](https://frontend.test) in your browser, or make a request with `curl`, and see everything work perfectly\\*.\n\n\\* *are you using Firefox, or are you on WSL? See the notes below for how to do the one-time install of the localias root certificate*\n\n## Running as a daemon\n\nInstead of explicitly running the proxy server as a foreground process with `localias run`, you can also run Localias in the background with `localias start`. You can interact with this daemon with the following commands:\n\n```shell\n# Start the proxy server as a daemon process\nlocalias start\n# Show the status of the daemon process\nlocalias status\n# Apply the latest configuration to the proxy server in the daemon process\nlocalias reload\n# Stop the daemon process\nlocalias stop\n```\n\nWhen running as a daemon process, if you make any changes to your configuration you\nwill need to explicitly reload the daemon:\n\n```shell\n# Start with frontend.test -\u003e 3000\nlocalias set frontend.test 3000\nlocalias start\n# Update frontend.test -\u003e 4004. \nlocalias set frontend.test 4004\n# The daemon will still be running with frontend.test -\u003e 3000, so\n# to apply the new changes you'll need to reload it\nlocalias reload\n```\n\n# Using the CLI \n\n`localias` has many different subcommands, each of which is documented\n(including usage examples). To see the available subcommands, run `localias`. To\nsee help on any command, you can run `localias help $command` or\n`localias $command --help`. \n\n```console\n$ localias\nsecurely manage local aliases for development servers\n\nUsage:\n  localias [flags]\n  localias [command]\n\nExamples:\n  # Add an alias forwarding https://secure.test to http://127.0.0.1:9000\n  localias set secure.test 9000\n  # Update an existing alias to forward to a different port\n  localias set secure.test 9001\n  # Remove an alias\n  localias rm secure.test\n  # List all aliases\n  localias list\n  # Clear all aliases\n  localias clear\n  # Import aliases from another config file\n  localias import path/to/another/config/localias.yaml\n  \n  # Start the proxy server as a daemon process\n  localias start\n  # Show the status of the daemon process\n  localias status\n  # Apply the latest configuration and relaunch the daemon process\n  localias reload\n  # Stop the daemon process\n  localias stop\n  # Run the proxy server in the foreground\n  localias run\n\nAvailable Commands:\n  clear       clear all aliases\n  help        Help about any command\n  import      import all aliases from another config file\n  list        list all aliases\n  rm          remove an alias\n  run         run the proxy server in the foreground\n  set         add or edit an alias\n  start       start the proxy server as a daemon process\n  status      show the status of the daemon process\n  stop        stop the daemon process\n  version     show the version of this binary\n\nFlags:\n  -c, --configfile string   path to the configuration file to edit\n  -h, --help                help for localias\n  -v, --version             version for localias\n\nUse \"localias [command] --help\" for more information about a command.\n```\n\n# Errata\n\n## Why build this?\n\nLocalias is the tool I've always wanted to use for local web development. After years of just visiting `localhost:8080`, I finally got around to looking for a solution, and came across [hotel](https://github.com/typicode/hotel) (unmaintained) and its fork [chalet](https://github.com/jeansaad/chalet) (maintained). These are wonderful projects that served as inspiration for Localias, but I think Localias is implemented in a better and more useful way.\n\nFinally, [my friend Justin wanted this to exist, too](https://twitter.com/jmduke/status/1628034461605539840?s=20):\n\n\u003e I swear there's a tool that lets me do:\n\u003e \n\u003e localhost:8000 → application.local  \n\u003e localhost:3000 → marketing.local  \n\u003e localhost:3002 → docs.local  \n\u003e \n\u003e But I can't for the life of me remember the name of it. Does anyone know what I'm talking about?\n\n## Why not hotel/chalet?\nLocalias is designed to replace alternative tools like [hotel](https://github.com/typicode/hotel)/[chalet](https://github.com/jeansaad/chalet). Hotel is no longer maintained, and Chalet is a fork of Hotel with basically the same features. I think Localias compares favorably:\n\n  - Localias is a single binary. Hotel requires a working NodeJS runtime.\n  - Localias works by modifying `/etc/hosts` (and the windows equivalent), which makes it easy to observe and debug. Hotel requires you to configure itself as a proxy in your browser or in your operating system.\n    - Aliases configured with Localias will also work in command-line scipts or requests sent by programs like `curl`. Hotel aliases only work in your browser.\n  - Localias allows you to create any number of aliases on different TLDs at the same time. Hotel only allows you to use one TLD.\n  - Localias will generate a root certificate and any necessary certificates for each alias, and install the root certificate in your system store so you do not see any warnings about invalid self-signed certificates. Hotel does not do any TLS signing.\n  - Localias will automatically discover configuration files committed to your git repository, which makes it easy to share a configuration with you development team. Hotel does not allow for shared configuration files.\n  - Localias does not attempt to do any kind of process management or launching, leaving that entirely up to you. Hotel attemps to run and manage processes for you.\n\n\n## Domain conflicts and HSTS\n\nWhen using Localias, you **should not** create aliases with the same name as existing websites. For instance, if you're working on a website hosted in production at `https://example.com`, you really do not want to create a local alias for `example.com` to point to your development server. If you do,\nyour browser may do things you don't expect:\n\n- Your development cookies will be included in requests to production, and vice-versa. If you are turning localias off/on and switching between\n  development and production, these cookies will conflict with each other and generally make you and your website extremely confused.\n- If your production website uses [HSTS / certificate pinning](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security), you will see\n  very scary errors when trying to use it as a local alias for a development server. This is because localias will be serving content with a different\n  private key, but HSTS explicitly tells your browser to disallow this.\n\nIn general, it's best to avoid this problem entirely and use aliases that end in [`.test`](https://en.wikipedia.org/wiki/.test), [`.example`](https://en.wikipedia.org/wiki/.example), [`.localhost`](https://en.wikipedia.org/wiki/.localhost), or some other TLD that is not in use.\n\n## `.local` domains\nThanks to [\"mDNS\", or \"multicast\ndns\"](https://en.wikipedia.org/wiki/Multicast_DNS), any aliases that you create\nthat end in `.local` will be broadcast to your entire network. This makes it\neasy to visit a development server from any other device, including your phone,\nwhich makes testing responsive websites really easy. All you need to do is create\nan alias ending in `.local`:\n\n```console\n$ localias add frontend.local 8080\n[added] frontend.local -\u003e 8080\n$ localias add http://insecure.local 8080\n[added] http://insecure.local 8080\n```\n\nWhen you visit a secure local alias from another device, you may be prompted with\na certificate warning. You should feel free to accept the warning and continue\non to the site, which is just your local development site.\n\n### WSL2 support for mDNS\n\nBy default, WSL2 environments are behind a NAT layer that breaks mDNS support. This means\nthat when you run localias inside WSL2 and have an alias configured for `frontend.local`:\n\n- programs inside your WSL2 container can access `frontend.local`\n- programs in your Windows environment (like your browser) can access `frontend.local`\n- other devices on your network (like your phone's browser) **cannot access** `frontend.local`.\n\nThis is frustrating, and I'm sorry that it doesn't work better by default. As of\nWindows 11, there seems to be a [Mirrored Mode Networking\noption](https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking)\nthat claims \"multicast support\", but I'm not sure if this will fix the problem.\nLocalias has [an open Github\nIssue](https://github.com/peterldowns/localias/issues/36) for this problem,\nplease comment there if you have been able to make this work.\n\n## The Localias Root Certificate and System Trust Stores\nLocalias's proxy server, Caddy, automatically generates certificates for any\nsecure aliases you'd like to make. When Localias runs it will make sure that\nits root signing certificate is installed in the system store on Mac and Linux.\nIf your browser reads from the system store to determine which certificate\nauthorities to trust, this means that everything will work nicely for you out\nof the box.\n\nThis means that if you're using Safari/Edge/Chrome on MacOS/Linux, you're good\nto go, and you will see a nice \"verified\" or \"secure\" status when you visit one\nof your secure aliases in your browser.\n\n### WSL\nWhen you run Localias inside of WSL, so basically inside of a Linux virtual\nmachine with a Windows host, Caddy will generate certificates and install them\nto the Linux VM's trust store, but not to the parent Windows host. This means\nthat if you're using a browser running in Windows, you will see a certificate\nwarning if you visit a secure alias.\n\nYou can fix this by explicitly installing the Localias root certificate to your\nWindows machine's certificate store. You can do this with the following\ncommand, which will prompt you to authorize it as an administrator:\n\n```bash\nlocalias debug cert --install\n```\n\n### Firefox\nFirefox [does not trust the system certificate store by\ndefault](https://blog.mozilla.org/security/2019/02/14/why-does-mozilla-maintain-our-own-root-certificate-store/).\nThis means that unfortunately, if you visit you secure alias, you will see a\nwarning that the certificate is invalid.\n\nOn MacOS/Linux, Firefox can be configured to trust the system store by changing\na configuration setting.\n\n1. Open Firefox\n1. Visit `about:config`\n1. Set\n   ```\n   security.enterprise_roots.enabled = true\n   ```\n1. Quit and re-open Firefox\n\nAltenately, or if you're using Firefox on Windows to try to browse to a server\nrunning in WSL, you can manually add the Localias root certificate to Firefox.\nYou will need to do this if you're using WSL, since Firefox on Windows does not\nread from the system trust store.\n\n1. Find the path to the root certificate being used by Localias. If you're on MacOS or Linux, run:\n\n   ```console\n   $ localias debug cert\n   /Users/pd/Library/Application Support/localias/caddy/pki/authorities/local/root.crt\n   ```\n   to print the path to the certificate.\n\n   In WSL, you'll need to convert this to a Windows file path using the `wslpath` tool:\n\n   ```console\n   $ wslpath -w $(localias debug cert)\n   \\\\wsl$\\Ubuntu-20.04\\home\\pd\\.local\\state\\localias\\caddy\\pki\\authorities\\local\\root.crt\n   ```\n   Copy this path to the clipboard.\n1. In Firefox, visit *Settings \u003e Privacy \u0026 Security \u003e Security \u003e Certificates*,\n   or visit *Settings* and search for \"certificates\".\n1. Click *View Certificates*\n1. Under the *Authorities* tab, click *Import...*. This will open a filepicker dialog.\n\n   - On MacOS: hit \"Cmd+Shift+G\" to open a filepath dialog. Paste the path you copied earlier to select the `root.crt`.\n   - On Windows: in the \"Name\" field, paste the path to the root certificate that you copied earlier.\n\n   Click *Open*.\n1. Check the box next to *Trust this CA to identify websites.* then click *OK*.\n\nYou should now see \"localias\" listed as a certificate authority. If you visit a\nsecure alias, you should see that the certificate is trusted and no errors or\nwarnings are displayed.\n\n\n## Allow Localias to bind to ports 443/80 on Linux\nLocalias works by proxying requests from ports 80 and 443 to your development\nservers. When you run Localias, it therefore will attempt to listen on ports 80\nand 443. On Linux you may not be allowed to do this by default -- you may see an\nerror like:\n\n```console\n$ localias run\n# ... some informational output\nerror: loading new config: http app module: start: listening on :443: listen tcp :443: bind: permission denied\n```\n\nor you may notice that starting the daemon does not result in a running daemon\n```console\n$ localias start\n$ localias status\ndaemon is not running\n```\n\nTo fix this, after installing or upgrading Localias, you can use capabilities\nto grant the `localias` binary permission to bind on these privileged ports:\n\n```bash\nsudo setcap CAP_NET_BIND_SERVICE=+eip $(which localias)\n```\n\nFor more information, view the [arch man pages for `capabilities`](https://man.archlinux.org/man/capabilities.7#CAP_NET_BIND_SERVICE) and [this Stackoverflow answer](https://stackoverflow.com/a/414258).\n\n## error: localias could not start successfully\n\nIf you've tried running `localias run` and see this error:\n\n```console\n$ localias run\nerror: localias could not start successfully. Most likely there is another instance of\nlocalias or some other kind of proxy or server listening to ports 443/80, which\nis preventing another instance from starting. Common causes:\n\n- You have another instance of localias running in a different terminal\n- You have a proxy server like Caddy, Nginx, or Apache running\n- There is a bug in localias\n\nPlease see the https://github.com/peterldowns/localias README for some\ndiagnostics and ideas for how to debug this.\n```\n\nOr you've tried to start the daemon `localias start` but no daemon gets started:\n\n```console\n$ localias start\n$ localias status\ndaemon is not running\n```\n\nThen most likely some other process is bound to ports 443/80, preventing\nlocalias from starting up correctly. The only way localias will start is if it\nis able to bind to these ports, which it needs to do to act as a proxy.\n\nTo find out if there are any other instances of localias running, use `ps`. In\nthis example, the first result is an instance of localias, and the second result\nis the `grep` process itself.\n\n```console\n$ ps aux | grep -i localias\npd               39020   0.0  0.1 409289408  38736 s003  S+    1:42PM   0:00.09 localias run\npd               39198   0.0  0.0 407965536    624 s005  R+    1:47PM   0:00.00 grep -i localias\n```\n\nYou can find out what services are listening on your ports by using `lsof`. In this example,\nthere the results show that there is an instance of localias bound to both port 80 and port 443:\n\n```console\n$  lsof -Pn | grep -E '\\*:443|\\*:80'\nlocalias  39020   pd    9u     IPv6 0xb3abbd50442d943f       0t0                 TCP *:443 (LISTEN)\nlocalias  39020   pd   11u     IPv6 0xb3abbd4b78f6ba3f       0t0                 UDP *:443\nlocalias  39020   pd   12u     IPv6 0xb3abbd50442da23f       0t0                 TCP *:80 (LISTEN)\n```\n\nIn order for localias to start, you'll have to kill the process that is\ninterfering and binding to these ports.\n\n## Using Localias in GitHub Actions\n\nRunning Localias in GitHub Actions CI environments enables testing with URLs that mirror production setups. While Localias works well in CI, there are some Ubuntu-specific quirks around self-signed SSL certificate handling that require special attention.\n\nFor a complete, working implementation including certificate warming procedures and chromium testing with backoff mechanisms, see the community-maintained [github-action-localias](https://github.com/iloveitaly/github-action-localias) action. This action handles the edge cases around certificate installation and NSS databases in GitHub Actions runners.\n\n# General reading / links / sources\n\n- https://blog.mozilla.org/security/2019/02/14/why-does-mozilla-maintain-our-own-root-certificate-store/\n- https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox\n- https://wiki.mozilla.org/CA/AddRootToFirefox#Windows_Enterprise_Support\n- https://adamtheautomator.com/windows-certificate-manager/\n- https://stackoverflow.com/a/49553299\n- https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/certutil\n- https://github.com/christian-korneck/firefox_add-certs\n- https://rud.is/b/2021/04/24/making-macos-universal-apps-with-universal-golang-static-libraries/\n- https://caddyserver.com/docs/automatic-https#overview\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterldowns%2Flocalias","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeterldowns%2Flocalias","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterldowns%2Flocalias/lists"}