Skip to content

fonoster/fonoster

Folders and files

NameName
Last commit message
Last commit date
Mar 8, 2025
Mar 8, 2025
Mar 4, 2025
Apr 24, 2024
Dec 22, 2024
Mar 14, 2025
Sep 12, 2024
Mar 14, 2025
Jan 13, 2025
Mar 4, 2025
Mar 13, 2025
Mar 8, 2025
Dec 15, 2024
Apr 17, 2024
Apr 17, 2024
Dec 21, 2024
Apr 17, 2024
Mar 14, 2025
Mar 1, 2025
Feb 12, 2025
Mar 4, 2025
Mar 6, 2025
Mar 14, 2025
Mar 14, 2025
Mar 14, 2025
Mar 1, 2025
Mar 1, 2025

Repository files navigation

Fonoster: The open-source alternative to Twilio

Fonoster is researching an innovative Programmable Telecommunications Stack that will allow businesses to connect telephony services with the Internet entirely through a cloud-based utility.

Fonoster community banner

build release Discord Code Of Conduct GitHub Twitter Follow

Features

The most notable features of Fonoster are:

  • Multitenancy
  • Easy deployment of PBX functionalities
  • Programmable Voice Applications
  • NodeJS SDK
  • Support for Amazon Simple Storage Service (S3)
  • Secure API endpoints with Let's Encrypt
  • Authentication with OAuth2
  • Authentication with JWT
  • Role-Based Access Control (RBAC)
  • Plugins-based Command-line Tool
  • Support for Google Speech APIs

Code Examples

A Voice Application is a server that controls a call's flow. A Voice Application can use any combination of the following verbs:

  • Answer - Accepts an incoming call
  • Hangup - Closes the call
  • Play: Takes a URL with a media file and streams the sound back to the calling party
  • PlayDtmf - Takes a DTMF sequence and plays it back to the calling party
  • Say - Takes a text, synthesizes the text into audio, and streams back the result
  • Gather - Waits for DTMF or speech events and returns back the result
  • SGather - Returns a stream for future DTMF and speech results
  • Stream - Creates a bidirectional stream to send and receive audio from a caller
  • Dial - Passes the call to an Agent or a Number at the PSTN
  • Record - It records the voice of the calling party and saves the audio on the Storage sub-system
  • Mute - It tells the channel to stop sending media, effectively muting the channel
  • Unmute - It tells the channel to allow media flow

Voice Application Example:

const VoiceServer = require("@fonoster/voice").default;
const { 
  GatherSource, 
  VoiceRequest, 
  VoiceResponse 
} = require("@fonoster/voice");

new VoiceServer().listen(async (req: VoiceRequest, voice: VoiceResponse) => {
  const { ingressNumber, sessionRef, appRef } = req;

  await voice.answer();

  await voice.say("Hi there! What's your name?");

  const { speech: name } = await res.gather({
    source: GatherSource.SPEECH
  });

  await voice.say("Nice to meet you " + name + "!");

  await voice.say("Please enter your 4 digit pin.");

  const { digits } = await voice.gather({
    maxDigits: 4,
    finishOnKey: "#"
  });

  await voice.say("Your pin is " + digits);

  await voice.hangup();
});

// Your app will live at tcp://127.0.0.1:50061 
// and you can easily publish it to the Internet with:
// ngrok tcp 50061

Everything in Fonoster is an API first, and initiating a call is no exception. You can use the SDK to start a call with a few lines of code.

Example of originating a call with the SDK:

const SDK = require("@fonoster/sdk");

async function main(request) {
  const apiKey = "your-api-key";
  const apiSecret = "your-api-secret"
  const accessKeyId = "WO00000000000000000000000000000000";

  const client = SDK.Client({ accessKeyId });
  await client.loginWithApiKey(apiKey, apiSecret);

  const calls = new SDK.Calls(client);
  const response = await calls.createCall(request);

  console.log(response); // successful response
}

const request = {
  from: "+18287854037",
  to: "+17853178070",
  appRef: "3e61ecb7-a1b6-4a93-84c3-4f1979165bca"
};

main(request).catch(console.error);

Getting Started

To get started with Fonoster, use the following resources:

Give a Star! ⭐

Please give it a star if you like this project or plan to use it. Thanks πŸ™

Bugs and Feedback

For bugs, questions, and discussions, please use the Github Issues

Contributing

For contributing, please see the following links:

Pedro
Pedro Sanders
Angel
Angel M. Bencosme
Efrain
Efrain Peralta
Obruche
Obruche Wilfred Oghenechohwo
Wandy
Wandy Hernandez
Wardner
Wardner Lara
Richard
Richard HC
Nageswari/
Nageswari
Hoan
Hoan Luu Huu
Speedy
Speedy Monster
harry_dev/
harry_dev
Kanishka
Kanishka Chowdhury
Brayan
Brayan Munoz V.
Dede
Dede kurniawan
gabriel
gabriel duncan
Prasurjya
Prasurjya Pran Borah
Jordan/
Jordan
Hector
Hector Ventura
0xflotus/
0xflotus
Manish/
Manish
Osama
Osama Sehgol
Paul
Paul SΓΌtterlin
Riad
Riad Vargas
Shailendra
Shailendra Paliwal
The
The Gitter Badger
Yuri/
Yuri
cdrsociate/
cdrsociate
pavan/
pavan
nrjchnd/
nrjchnd
Salami
Salami Bashir
Shivam
Shivam Deepak Chaudhary
Yossef
Yossef Haim
telenautical/
telenautical
Wisdom
Wisdom Elendu
Judge
Judge Godwins
Jon
Jon Chin
Harish
Harish Chander
Gary
Gary Barnes
Fidal
Fidal Mathew
Enmanuel
Enmanuel Toribio
Dung
Dung Duc Huynh (Kaka)
Ciprian/
Ciprian
Christopher
Christopher Adigun
Bruno
Bruno Gomes
Bruno
Bruno Arueira
Antonius
Antonius Ostermann
Ali
Ali Firat ARI
Alex/
Alex
Albert
Albert E. Hidalgo Taveras

Sponsors

We're glad to be supported by respected companies and individuals from several industries.

Find all our supporters here

Become a Github Sponsor

Authors

License

Copyright (C) 2025 by Fonoster Inc. MIT License (see LICENSE for details).