{"id":13406682,"url":"https://github.com/fonoster/routr","last_synced_at":"2025-05-13T21:04:32.692Z","repository":{"id":38027482,"uuid":"79303627","full_name":"fonoster/routr","owner":"fonoster","description":"⚡ The future of programmable SIP servers.","archived":false,"fork":false,"pushed_at":"2025-04-24T21:22:02.000Z","size":163618,"stargazers_count":1509,"open_issues_count":18,"forks_count":155,"subscribers_count":44,"default_branch":"main","last_synced_at":"2025-04-28T12:09:31.456Z","etag":null,"topics":["asterisk","docker","fonoster","freepbx","freeswitch","fusionpbx","ims","instant-messaging","intercom","kamailio","kubernetes","opensips","scaip","server","sip","twilio","voip","webrtc"],"latest_commit_sha":null,"homepage":"https://routr.io","language":"TypeScript","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/fonoster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":["fonoster"]}},"created_at":"2017-01-18T04:34:29.000Z","updated_at":"2025-04-28T07:05:58.000Z","dependencies_parsed_at":"2023-09-28T22:32:23.327Z","dependency_job_id":"c8bd4240-0cf8-47bf-bfa2-a1b5c32f72de","html_url":"https://github.com/fonoster/routr","commit_stats":{"total_commits":2707,"total_committers":14,"mean_commits":"193.35714285714286","dds":0.6265238271148874,"last_synced_commit":"978336c7e0625fa5cb36a4db57acbf45b977c900"},"previous_names":[],"tags_count":177,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fonoster%2Froutr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fonoster%2Froutr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fonoster%2Froutr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fonoster%2Froutr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fonoster","download_url":"https://codeload.github.com/fonoster/routr/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251311331,"owners_count":21569009,"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","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":["asterisk","docker","fonoster","freepbx","freeswitch","fusionpbx","ims","instant-messaging","intercom","kamailio","kubernetes","opensips","scaip","server","sip","twilio","voip","webrtc"],"created_at":"2024-07-30T19:02:36.405Z","updated_at":"2025-04-28T12:10:06.594Z","avatar_url":"https://github.com/fonoster.png","language":"TypeScript","readme":"\u003cdiv align=\"center\"\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://routr.io\" target=\"_blank\" rel=\"noopener\"\u003e\n      \u003cimg src=\"https://raw.githubusercontent.com/fonoster/routr/main/etc/assets/banner.png\" /\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003ca href=\"https://gitpod.io/#https://github.com/fonoster/routr\"\u003e \u003cimg src=\"https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod\" alt=\"Contribute with Gitpod\" /\u003e\n\u003c/a\u003e [![Sponsor this](https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026link=https://github.com/sponsors/fonoster)](https://github.com/sponsors/fonoster) [![Discord](https://img.shields.io/discord/1016419835455996076?color=5865F2\u0026label=Discord\u0026logo=discord\u0026logoColor=white)](https://discord.com/invite/4QWgSz4hTC) ![GitHub](https://img.shields.io/github/license/fonoster/routr?color=%2347b96d) ![Twitter Follow](https://img.shields.io/twitter/follow/fonoster?style=social)\n\nRoutr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators.\n\n## Content\n\n* [Community](#community)\n* [Should you try Routr?](#should-you-try-routr)\n* [Contact us](#contact-us)\n* [Features](#features)\n* [The official handbook](#the-official-handbook)\n* [Deployment](#deployment)\n    * [Docker](#instant-server-deployment-with-docker-and-compose)\n    * [Kubernetes](#kubernetes)  \n    * [Gitpod](#development-mode-with-gitpod)\n* [Getting started with the CTL](#getting-started-with-the-ctl)\n* [First steps with the NodeSDK](#first-steps-with-the-nodesdk)\n* [Custom Processors and Middleware](#building-custom-processors-and-middleware)\n* [Documentation](https://routr.io/docs)\n* [Bugs and feedback](#bugs-and-feedback)\n* [Sponsors](#sponsors)\n* [Contributing](#contributing)\n* [License](#license)\n\n## Community\n\nWe are building Routr in the open. The best to communicate with us is via [GitHub Discussions.](https://github.com/fonoster/routr/discussions)\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003csup\u003eSpecial Announcement:\u003c/sup\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://discord.gg/mpWSRUhG7e\"\u003e\n    \u003cimg width=\"70px\" src=\"https://assets-global.website-files.com/6257adef93867e50d84d30e2/625e5fcef7ab80b8c1fe559e_Discord-Logo-Color.png\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003csub\u003e\u003cb\u003eWe now have a Discord Channel\u003c/b\u003e\u003c/sub\u003e\n  \u003cbr\u003e\n  \u003csub\u003eThere we plan to discuss roadmaps, feature requests, and more\u003cbr\u003e\u003ca href=\"https://discord.com/invite/4QWgSz4hTC\"\u003eJoin us today\u003c/a\u003e\u003c/sub\u003e\n\u003c/p\u003e\n\n---\n\n## Should you try Routr?\n\n\u003e Routr's architecture and design is fantastic. A breath of fresh air. Being Docker and Kubernetes ready is a huge win over a more traditional SIP server setup.\n\u003e\n\u003e [Phil Jones](https://www.linkedin.com/in/phil-jones-4346884a/), VP of Web Architecture at VQ Communications\n\n\u003e I came across Routr, which seems to be the one and only cloud-first Kubernetes-ready SIP server on the planet!\n\u003e \n\u003e [Jessie Wadman](https://www.jessiewadman.se/), Cloud Architect @ Camanio AB\n\n\u003e Awesome and one of the best open-source software in 2023.\n\u003e \n\u003e [no-championship-s368](https://www.reddit.com/r/linux/comments/11xdvo5/routr_v2_the_future_of_programmable_sip_servers/), Check conversation @ Reddit\n\n\u003e I think this project has a great promise to become a transformative technology.\n\u003e \n\u003e [jbwill36](https://github.com/orgs/fonoster/discussions/209), Check conversation @ GitHub\n\n## Contact us\n\nMeet our sales team for any commercial inquiries.\n\n\u003ca href=\"https://cal.com/psanders\"\u003e\u003cimg src=\"https://cal.com/book-with-cal-dark.svg\" alt=\"Book us with Cal.com\"\u003e\u003c/a\u003e\n\n## Features\n\nRoutr's main features are:\n\n- [x] Common SIP Server functions; Proxy, Registrar, Location Service\n- [x] Programmable routing\n- [x] Load balancing strategies against Media Servers like Asterisk and FreeSWITCH\n- [x] Session Affinity \n- [x] Multi-Tenant/Multi-Domain with Domain level Access Control List\n- [ ] Region-based routing\n- [x] Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress, and Peer Egress\n- [x] No single point of failure\n- [x] Transport: TCP, UDP, TLS, WS, WSS\n- [x] In-memory and Redis Location Service \n- [x] JSON and YAML files as a data source\n- [x] Postgres as a data source\n- [x] Server management with the gRPC API\n- [x] NodeSDK\n- [x] Command-Line Tool\n- [x] RTPEngine Middleware\n- [x] Helm Chart for  Kubernetes Deployments\n- [x] Endpoint Authentication with JWT (For web phones)\n- [ ] Support for STIR/SHAKEN\n- [ ] Web Application\n\nTo learn more, read the [documentation](https://routr.io/docs) :books:\n\n## The official handbook\n\n\u003ca href=\"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/psanders/psanders/master/book.png\" width=\"300px\"\u003e\u003c/a\u003e\n\nThis handbook offers a detailed information about of the innovative features, challenges, and opportunities associated with using Routr.\n\nGet the eBook.\n\n* [Programmable, cloud-ready, open source](https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers)\n\n## Give a star! ⭐\n\nIf you want to support this project, please give it a star. Thanks 🙏\n\n## Deployment\n\n### Instant server deployment with Docker and Compose\n\nFirst, create a directory named \"routr\". Navigate into the new folder, and then copy the content below:\n\nFilename: _compose.yaml_\n\n```yaml\nversion: \"3\"\n\nservices:\n  routr:\n    image: fonoster/routr-one:latest\n    environment:\n      EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n    ports:\n      - 51908:51908\n      - 5060:5060/udp\n    volumes:\n      - shared:/var/lib/postgresql/data\n\nvolumes:\n  shared:\n```\n\nThen, start the server with:\n\n```bash\n# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n```\n\nAlternatively, you can use the following command:\n\n```bash\n# Be sure to replace with your IP address\ndocker run \\\n  -p 51908:51908 \\\n  -p 5060:5060/udp \\\n  -e EXTERNAL_ADDRS=192.168.1.3 \\\n  fonoster/routr-one:latest\n```\n\nWait a few seconds for the containers to initialize. Afterward, you can verify the status of the containers using:\n\n```bash\ndocker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n```\n\nYou should see a container with the status \"Up.\" It should look like the one below:\n\n```bash\nCONTAINER ID  IMAGE                                     STATUS\n6c63fd573768  fonoster/routr-one:latest                 Up About a minute\n```\n\nIf the status of your services is \"Up,\" you are ready to go.\n\n### Kubernetes\n\nRoutr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running. \n\n\u003e You can use Minikube or Docker Desktop to create a local Kubernetes cluster.\n\nFirst, add the Helm repository:\n\n```bash\nhelm repo add routr https://routr.io/charts\nhelm repo update\n```\n\nThen, create a namespace for Routr:\n\n```bash\nkubectl create namespace routr\n```\n\nNext, install Routr with the following command:\n\n```bash\nhelm install my-release routr/routr-connect --namespace routr\n```\n\nFinally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:\n\n```bash\nkubectl get pods -n routr\n```\n\nYou should see a list of pods and their status. If the status is Running, then you are ready to go.\n\nFor more details, please refer to the chart's [README](https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md).\n\n### Development mode with Gitpod\n\nRoutr's one-click interactive deployment will familiarize you with the server in development mode.\n\n[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/fonoster/routr)\n\nTo connect to your instance, follow these steps:\n\nFirst, add your public SSH keys to your Gitpod account by going to [Gitpod account keys](https://gitpod.io/user/keys) and adding your public key.\n\nNext, find your [Gitpod workspace](https://gitpod.io/workspaces) and click on the \"More\" button. Then, select \"Connect via SSH.\"\n\nFinally, copy the SSH Command and run it in your terminal by pasting it and pressing Enter. The command should look like this:\n\n```bash\nssh -L 5060:localhost:5060 \u003cworkspace-ssh-connection\u003e\n```\n\nReplace \u003cworkspace-ssh-connection\u003e with your own workspace SSH connection.\n\nFor example, your command might look like this:\n\n```bash\nssh -L 5060:localhost:5060 fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io\n```\n\nThis command forwards traffic from your local port 5060 to your Gitpod workspace's port 5060, allowing you to access your instance.\n\n## Getting started with the CTL\n\nRegadles of the deployment method, you can use the command-line tool to manage your server.\n\nTo install the command-line tool, run the following command:\n\n```bash\nnpm install --location=global @routr/ctl\n```\n\nWe are using the flag `--location=global` to tell npm to install the command-line tool globally. If you don't have npm installed, you can follow the instructions here: https://nodejs.org/en/download/.\n\nHere is an example of how to create a domain:\n\n```bash\nrctl domains create --insecure\n```\n\nThe `--insecure` flag, in the last example, is required because no certificate was provided to secure the API. \n\nFollow the prompts to create the domain.\n\nThe output should look like this:\n\n```bash\nThis utility will help you create a new Domain.\nPress ^C at any time to quit.\n? Friendly Name Local Domain\n? SIP URI sip.local\n? IP Access Control List None\n? Ready? Yes\nCreating Domain Local Domain... a27e9fb2-a71a-4cf3-9b1d-dccf373f9777\n```\n\nFor additional examples, refer to the command line [documentation.](https://www.npmjs.com/package/@routr/ctl)\n\n## First steps with the NodeSDK\n\nTo begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK.\n\n```bash\nmkdir my-project\ncd my-project\nnpm init -y\n```\n\nNext, install the SDK:\n\n```bash\nnpm install --save @routr/sdk\n```\n\nNow, create a new file called `index.js` and add the following code:\n\n```javascript\nconst SDK = require(\"@routr/sdk\");\n\nconst domains = new SDK.Domains();\n\nconst request = {\n  name: \"Local domain\",\n  domainUri: \"sip.local\",\n  accessControlListRef: \"4671371b-ff5d-48b1-aabe-d3c5ca5317a3\", \n  egressPolicies: [{\n    rule: \".*\",\n    numberRef: \"4671371b-ff5d-48b1-aabe-d3c5ca5317a3\"\n  }],\n  extended: {\n    \"key\": \"value\"\n  } \n};\n\ndomains.createDomain(request) \n  .then(console.log)\n  .catch(console.error); // an error occurred\n```\n\n\u003e In the example above, we assume that the ACL and Number already exist.\n\nNow, go ahead and run the code:\n\n```bash\nnode index.js\n```\n\nFor complete documentation, please visit the npm page for `@routr/sdk` at https://www.npmjs.com/package/@routr/sdk\n\n## Building custom Processors and Middleware\n\nOne of Routr's most significant advantages is that it is highly extensible. It enables you to create new Processors and Middleware to extend the functionality of your server.\n\nProcessors and Middleware services are responsible for modifying the SIP messages as they pass through the server. However, while both share the same interface, they serve different purposes.\n\nProcessors hold feature logic; Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc.\n\nThe simplest possible Processor looks like this:\n\n```javascript\nconst Processor = require(\"@routr/processor\").default\nconst { MessageRequest, Response } = require(\"@routr/processor\")\n\nnew Processor({ bindAddr: \"0.0.0.0:51904\", name: \"echo\" }).listen(\n  (req: MessageRequest, res: Response) =\u003e {\n    console.log(\"got new request: \")\n    console.log(JSON.stringify(req, null, \" \"))\n    res.sendOk()\n  }\n)\n```\n\nThe previous example is for a Processor that waits for a SIP message and then sends a 200 OK response. You can find the complete code [here](https://github.com/fonoster/routr/tree/main/mods/echo).\n\nIn addition to the previous example, you can check the following modules:\n\n- [RTPRelay Middleware](https://github.com/fonoster/routr/tree/main/mods/rtprelay)\n- [Simple Auth Middleware](https://github.com/fonoster/routr/tree/main/mods/simpleauth)\n- [Processor Template](https://github.com/fonoster/nodejs-processor/tree/main)\n- [Connect Processor](https://github.com/fonoster/routr/tree/main/mods/connect)\n\nFor more information about building Processors and Middleware, please refer to the [documentation.](https://routr.io/docs)\n\n## Bugs and feedback\n\nFor bugs, questions, and discussions, please use the [Github Issues](https://github.com/fonoster/routr/issues)\n\n## Contributing\n\nFor contributing, please see the following links:\n\n - [Contribution Documents](https://github.com/fonoster/routr/blob/master/CONTRIBUTING.md)\n - [Contributors](https://github.com/fonoster/routr/contributors)\n\n\u003c!--contributors:start--\u003e\n\n\u003ctable\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/psanders\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/539774?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=Pedro Sanders/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003ePedro Sanders\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/Hannarong98\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/42358864?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=Hannarong/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eHannarong\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/efraa\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/40646537?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=Efrain Peralta/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eEfrain Peralta\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/vitalyster\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/1052407?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=vitalyster/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003evitalyster\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/kanimaru\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/1733697?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=Kani/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eKani\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/SemiConscious\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/1754942?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=SemiConscious/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eSemiConscious\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/BROWT190\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/141766680?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=Timmy/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eTimmy\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" style=\"word-wrap: break-word; width: 150.0; height: 150.0\"\u003e\n        \u003ca href=https://github.com/luzpaz\u003e\n            \u003cimg src=https://avatars.githubusercontent.com/u/4140247?v=4 width=\"100;\"  style=\"border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px\" alt=luzpaz/\u003e\n            \u003cbr /\u003e\n            \u003csub style=\"font-size:14px\"\u003e\u003cb\u003eluzpaz\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Sponsors\n\nWe're glad to be supported by respected companies and individuals from several industries.\n\nFind all our supporters [here](https://github.com/sponsors/fonoster)\n\n\u003e [Become a Github Sponsor](https://github.com/sponsors/fonoster)\n\n## Authors\n\n - [Pedro Sanders](https://github.com/psanders)\n\n## License\n\nCopyright (C) 2024 by [Fonoster Inc](https://fonoster.com). MIT License (see [LICENSE](https://github.com/fonoster/fonoster/blob/master/LICENSE) for details).\n","funding_links":["https://github.com/sponsors/fonoster","https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026link=https://github.com/sponsors/fonoster"],"categories":["TypeScript","Interconnect","PBX Servers","Apps"],"sub_categories":["SBC, IMS","Communication"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffonoster%2Froutr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffonoster%2Froutr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffonoster%2Froutr/lists"}