{"id":32693381,"url":"https://github.com/gosuda/portal","last_synced_at":"2026-03-09T08:01:48.607Z","repository":{"id":319824645,"uuid":"1079713761","full_name":"gosuda/portal","owner":"gosuda","description":"Public Open Relay To Access Localhost","archived":false,"fork":false,"pushed_at":"2026-03-03T09:51:49.000Z","size":60874,"stargazers_count":202,"open_issues_count":10,"forks_count":21,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-03T09:52:44.575Z","etag":null,"topics":["e2ee","go","nat","nat-traversal","relay","self-hosted","self-hosting","tunneling"],"latest_commit_sha":null,"homepage":"https://portal.gosuda.org","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/gosuda.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-20T09:14:19.000Z","updated_at":"2026-02-27T09:25:58.000Z","dependencies_parsed_at":"2025-10-29T09:28:43.617Z","dependency_job_id":null,"html_url":"https://github.com/gosuda/portal","commit_stats":null,"previous_names":["gosuda/relaydns","gosuda/portal"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/gosuda/portal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gosuda%2Fportal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gosuda%2Fportal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gosuda%2Fportal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gosuda%2Fportal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gosuda","download_url":"https://codeload.github.com/gosuda/portal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gosuda%2Fportal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30287446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"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":["e2ee","go","nat","nat-traversal","relay","self-hosted","self-hosting","tunneling"],"created_at":"2025-11-01T17:00:47.559Z","updated_at":"2026-03-09T08:01:48.597Z","avatar_url":"https://github.com/gosuda.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# PORTAL — Public Open Relay To Access Localhost\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/portal.png\" alt=\"Portal logo\" width=\"540\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eExpose your local application to the public internet — no port forwarding, no NAT, no DNS setup.\u003cbr /\u003ePortal is a self-hosted relay network. You can connect to any relay or run your own.\u003c/p\u003e\u003cbr /\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"800\" alt=\"Portal Demo\" src=\"./portal.gif\" /\u003e\u003c/p\u003e\n\n## Why Portal?\n\nPublishing a local service to the internet is often complicated.\nIt usually requires opening inbound ports, configuring NAT or firewalls, managing DNS, and terminating TLS.\n\nPortal removes this complexity by inverting the connection model.\nApplications establish outbound connections to a relay, which exposes the service to the public internet and routes incoming traffic back to the application while preserving end-to-end TLS.\n\nUnlike other tunneling services, Portal is self-hosted and permissionless. You can run your own relay on your domain or connect to any relay.\n\n## Features\n\n- **NAT-friendly connectivity**: Works behind NAT or firewalls without opening inbound ports\n- **Automatic subdomain routing**: Gives each app its own subdomain (`your-app.\u003cbase-domain\u003e`)\n- **End-to-end encryption**: Supports TLS passthrough with relay keyless certificates\n- **Permissionless Hosting**: Anyone can run their own Portal — no approval needed\n- **One-Command Setup**: Expose any local app with a single command\n\n## Components\n\n- **Relay**: A server that routes public requests to the right connected app.\n- **Tunnel**: A CLI agent that proxies your local app through the relay.\n\nFor details, see [docs/glossary.md](docs/glossary.md).\n\n## Quick Start\n\n### Run Portal Relay\n\n```bash\ngit clone https://github.com/gosuda/portal\ncd portal\ndocker compose up\n```\n\nFor deployment to a public domain, see [docs/deployment.md](docs/deployment.md).\n\n### Expose Local Service via Tunnel\n\n1. Run your local service.\n2. Open the Portal relay site.\n3. Click `Add your server` button.\n4. Use the generated command to connect your local service.\n\n### Use the Go SDK (Advanced)\n\nSee [portal-toys](https://github.com/gosuda/portal-toys) for more examples.\n\n## Architecture\n\nSee [docs/architecture.md](docs/architecture.md).\nFor architecture decisions, see [docs/adr/README.md](docs/adr/README.md).\n\n## Examples\n\n| Example | Description |\n|---------|-------------|\n| [nginx reverse proxy](docs/examples/nginx-proxy/) | Deploy Portal behind nginx with L4 SNI routing and TLS termination |\n| [nginx + multi-service](docs/examples/nginx-proxy-multi-service/) | Run Portal alongside other web services behind a single nginx instance |\n\n## Contributing\n\nWe welcome contributions from the community!\n\n1. Fork the repository\n2. Create a feature branch (git checkout -b feature/amazing-feature)\n3. Commit your changes (git commit -m 'Add amazing feature')\n4. Push to the branch (git push origin feature/amazing-feature)\n5. Open a Pull Request\n\n## License\n\nMIT License — see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgosuda%2Fportal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgosuda%2Fportal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgosuda%2Fportal/lists"}