{"id":34250076,"url":"https://github.com/ozankasikci/unport","last_synced_at":"2025-12-16T09:10:38.759Z","repository":{"id":327449847,"uuid":"1109315258","full_name":"ozankasikci/unport","owner":"ozankasikci","description":"A port to URL registry daemon for local development, written in Rust.","archived":false,"fork":false,"pushed_at":"2025-12-05T19:45:47.000Z","size":1642,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-06T22:50:57.482Z","etag":null,"topics":["daemon","local-development","localhost","port-management","rust","web-development"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/ozankasikci.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-03T16:25:13.000Z","updated_at":"2025-12-06T17:18:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ozankasikci/unport","commit_stats":null,"previous_names":["ozankasikci/unport"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/ozankasikci/unport","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozankasikci%2Funport","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozankasikci%2Funport/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozankasikci%2Funport/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozankasikci%2Funport/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ozankasikci","download_url":"https://codeload.github.com/ozankasikci/unport/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozankasikci%2Funport/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27761705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-16T02:00:10.477Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["daemon","local-development","localhost","port-management","rust","web-development"],"created_at":"2025-12-16T09:10:38.125Z","updated_at":"2025-12-16T09:10:38.751Z","avatar_url":"https://github.com/ozankasikci.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Crates.io](https://img.shields.io/crates/v/unport-cli.svg)](https://crates.io/crates/unport-cli)\n[![Downloads](https://img.shields.io/crates/d/unport-cli.svg)](https://crates.io/crates/unport-cli)\n[![License](https://img.shields.io/crates/l/unport-cli.svg)](LICENSE)\n![Coverage](assets/coverage.svg)\n\u003cimg src=\"assets/banner.jpeg\" alt=\"Unport - Local Port Management Daemon\" width=\"100%\"\u003e\n\nLocal development port manager. Access your apps via clean domains like `http://api.localhost` instead of `localhost:3847`.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [How It Works](#how-it-works)\n- [Commands](#commands)\n- [HTTPS Support](#https-support)\n- [Config](#config)\n- [License](#license)\n\n## Installation\n\n```bash\ncargo install unport-cli\n```\n\nOr with Homebrew:\n\n```bash\nbrew tap ozankasikci/tap \u0026\u0026 brew install unport\n```\n\n## Quick Start\n\n```bash\n# 1. Start the daemon (needs sudo for port 80)\nsudo unport daemon start -d\n\n# 2. In your project directory, create unport.json\necho '{\"domain\": \"myapp\"}' \u003e unport.json\n\n# 3. Start your app\nunport start\n\n# Your app is now at http://myapp.localhost\n```\n\n## How It Works\n\nunport runs a reverse proxy on port 80 that routes requests based on the `Host` header.\n\n```\nBrowser: http://api.localhost/users\n    ↓\nunport daemon (port 80)\n    ↓ routes api.localhost → port 4000\nYour app (port 4000)\n```\n\nWhen you run `unport start`:\n\n1. Reads `domain` from `unport.json`\n2. Gets an available port from the daemon (4000-4999 range)\n3. Detects your framework and starts your app with that port\n4. Registers the domain→port mapping with the daemon\n\nThe daemon handles all routing. Your apps don't need to know about each other—just use stable domains like `http://api.localhost`.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `sudo unport daemon start -d` | Start daemon in background |\n| `sudo unport daemon start -d --https` | Start daemon with HTTPS support (ports 80 + 443) |\n| `unport daemon status` | Show daemon status (PID, uptime, services) |\n| `unport daemon stop` | Stop the daemon |\n| `unport start` | Start app in current directory |\n| `unport list` | Show all running services |\n| `unport stop \u003cdomain\u003e` | Stop a service |\n| `sudo unport trust-ca` | Add unport CA to system trust store (for HTTPS) |\n| `sudo unport trust-ca --remove` | Remove unport CA from system trust store |\n| `unport clean-certs` | Delete generated TLS certificates |\n| `unport regen-cert` | Regenerate TLS certificate for all domains |\n\n## Config\n\nCreate `unport.json` in your project:\n\n```json\n{\n  \"domain\": \"myapp\"\n}\n```\n\nMost frameworks are auto-detected (Next.js, Vite, Express, Django, Rails, Go, etc.). If detection fails, add a start command:\n\n```json\n{\n  \"domain\": \"myapp\",\n  \"start\": \"npm run serve\"\n}\n```\n\nYour app must read the port from the `PORT` environment variable:\n\n```js\n// Node.js\nconst port = process.env.PORT || 3000;\n```\n\n```go\n// Go\nport := os.Getenv(\"PORT\")\n```\n\n## HTTPS Support\n\nunport can serve your apps over HTTPS with automatically generated certificates.\n\n### Setup\n\n```bash\n# 1. Start daemon with HTTPS enabled\nsudo unport daemon start -d --https\n\n# 2. Trust the CA certificate (one-time setup)\nsudo unport trust-ca\n\n# 3. Start your app as usual\nunport start\n\n# Your app is now available at both:\n# - http://myapp.localhost\n# - https://myapp.localhost\n```\n\n### How it works\n\nWhen started with `--https`, unport:\n\n1. Generates a local CA certificate (stored in `~/.unport/ca.crt`)\n2. Creates TLS certificates for `*.localhost` domains\n3. Listens on both port 80 (HTTP) and port 443 (HTTPS)\n4. Automatically updates certificates when new domains are registered\n\nThe CA only needs to be trusted once. After that, all `*.localhost` domains will have valid HTTPS.\n\n### Certificate management\n\n```bash\n# Regenerate certificates (e.g., after adding many domains)\nunport regen-cert\n\n# Remove CA from trust store\nsudo unport trust-ca --remove\n\n# Delete all generated certificates\nunport clean-certs\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozankasikci%2Funport","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fozankasikci%2Funport","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozankasikci%2Funport/lists"}