Open source fax server. T.38 and G.711, fax to email, web dashboard. FreeSWITCH + ICTCore.
5.2K
Someone emails a PDF to [email protected] and it comes out of a fax machine in another country. That's the job ICTFax does, and it's the reason a 1980s protocol is still sitting in the middle of healthcare, legal and government workflows in 2026.
ICTFax is an open source fax server. It handles inbound and outbound faxing over T.38 and G.711 pass-through, bridges fax to email in both directions, and puts a web dashboard in front of the whole thing so nobody has to walk to a machine.
Built on FreeSWITCH for media and ICTCore for the communications logic, with an Angular front end. GPL-3.0.

docker run -d --name ictfax \
-p 8080:80 \
-p 5060:5060/tcp -p 5060:5060/udp \
-p 16384-16484:16384-16484/udp \
ictinnovations/ictfax:latest
Then open http://localhost:8080. First boot takes about two minutes while the database is created and the schema loads. After that you get the dashboard, and the REST API answers on /api/.
Publish the RTP range as shown. Skip it and your calls will connect with silence, which is the first thing everyone hits.
| Variable | Default | What it does |
|---|---|---|
DB_HOST | 127.0.0.1 | Point it at a real server and the bundled MariaDB never starts |
DB_PASS | generated | Required once DB_HOST is external |
ICTCORE_HOST | localhost | The hostname the API advertises |
FS_ESL_PASSWORD | ClueCon | FreeSWITCH event socket password. Change it |
Three volumes are worth mounting: /usr/ictcore/data for received faxes and uploaded documents, /usr/ictcore/log for application logs, and /var/lib/mysql if you're keeping the bundled database.
| Fax to email, email to fax, web to fax | Inbound and outbound |
| T.38 | Origination, termination |
| G.711 pass-through | Origination, termination, gateway |
| ATA support | Real fax machines, sending and receiving |
| PSTN and SS7 | Through your provider |
Plus the boring things that decide whether you can run it for real: DID management, extensions, contacts, document storage, multi-user accounts, and provider or trunk config.
Outbound jobs carry per-job status and a retry action on anything that failed:

Received documents can be viewed, downloaded or marked as read:

There's a hosted demo at demo.ictfax.org.
[email protected] / helloAdmin[email protected] / helloUserThis tag is rebuilt from the GitHub repository on every push, on Rocky Linux 8 with FreeSWITCH 1.10.12 and PHP 7.4. The build only publishes after a smoke test boots the container, confirms mod_spandsp loaded and checks the schema landed, so a tag that exists is a tag that started.
FreeSWITCH comes from Fedora Copr over HTTPS with GPG checking left on. SignalWire moved their own EL8 packages behind a paid token, and the mirror that used to fill that gap signs every package with a key it never publishes, so neither one can be verified.
It's still a single container with the database inside it. That's the right shape for evaluating and the wrong shape for production, so point DB_HOST at a real MariaDB before you put anything you care about through it.
Source, issues and the installation guide live on GitHub: ictinnovations/ictfax. Product site: ictfax.org.
Maintained by ICT Innovations, who've been shipping open source telephony since 2005.
Content type
Image
Digest
sha256:ae7af0d39…
Size
706.7 MB
Last updated
16 days ago
docker pull ictinnovations/ictfax