Files
mirotalk/README.md
T
2026-04-09 13:13:09 +02:00

29 KiB
Raw Blame History

MiroTalk P2P

Open Source WebRTC P2P Video Conferencing You Can Self-Host in Minutes

Free, Secure, Fast Real-Time Communication - up to 8K, 60fps. Works in All Browsers and Platforms.


GitHub Stars GitHub Forks

License: AGPLv3 Docker Pulls Last Commit Discord Author


MiroTalk P2P is a self-hosted, open-source video conferencing platform using direct peer-to-peer WebRTC connections for fast, secure, real-time communication. Deploy on your own server in minutes. Enjoy unlimited rooms, no time limits, end-to-end privacy, and a rich feature set - all under your control.

Try Live Demo   Documentation   Discord   Sponsor


MiroTalk P2P - Open Source Video Conferencing


If you find MiroTalk P2P useful, please Star it on GitHub - it helps others discover this project!

Proudly sponsored by


Recall.ai - API for meeting recording

Recall.ai an API for recording Zoom, Google Meet, Microsoft Teams, and in-person meetings.


Why MiroTalk P2P?
MiroTalk P2P Other Solutions
💰 Cost Free & Open Source (AGPLv3). One-time fee licenses available Paid plans
🏠 Self-hosted Full control over your data Cloud only
🔒 Privacy Your server, your rules Third-party data processing
⏱️ Time limits Unlimited 40-60 min on free tiers
🏢 Rooms Unlimited concurrent rooms Limited
🎥 Resolution Up to 8K @ 60fps Up to 1080p
🌍 Languages 133 languages ~30-80
🔌 API Full REST API included Paid add-on
🤖 AI Features ChatGPT (OpenAI) integration Paid AI add-ons
🧩 Customization Full source code, white-label ready Limited branding options
📦 Deployment Docker, Node.js, one-click install N/A (SaaS only)
🚀 Features

Core Platform

  • 100% Free · Open Source (AGPLv3) · Self-Hosted · PWA
  • No downloads, plugins, or logins required - completely browser-based
  • Unlimited conference rooms with no time limits
  • Compatible with all major browsers, desktop, and mobile devices
  • Translated into 133 languages

Video & Audio

  • Video quality up to 8K with webcam streaming (front & rear camera on mobile)
  • Crystal-clear audio with speaking detection and volume indicators
  • Screen sharing for presentations
  • Video/Document Picture-in-Picture (PiP)
  • Snapshot video frames as PNG images
  • Push-to-talk (walkie-talkie mode)
  • Choose audio input, output, and video source

Recording

  • Record screen, audio, and video

Collaboration

  • Chat with emoji picker, private messages, Markdown support, and conversation export
  • Advanced collaborative whiteboard
  • Real-time YouTube embeds, video files (MP4, WebM, OGG), and audio (MP3)
  • File sharing with drag-and-drop

AI-Powered

  • ChatGPT (OpenAI) for Q&A, information, and resource discovery
  • Speech recognition - control the app with your voice

Security & Access

  • OpenID Connect (OIDC) authentication
  • Host protection & user auth to prevent unauthorized access
  • JWT-based credential management
  • Room password protection
  • Direct peer-to-peer connections for low-latency communication through WebRTC

Developer & Integration

  • Full REST API
  • Slack and Mattermost integrations
  • Sentry error reporting
  • Customizable UI themes
  • Meeting duration control (HH:MM:SS)
  • Embeddable via iframe & widget
  • And much more...
🔗 Direct Join

Note

The token parameter are optional when either HOST_PROTECTED or HOST_USER_AUTH is set to true in the .env file. The valid list of users is defined in the HOST_USERS configuration.

🛡️ Host Protection Configuration

When host protection or host user auth is enabled, the host/users must provide a valid username and password as specified in the .env file.

Params Value Description
HOST_PROTECTED true if protection is enabled, false if not (default false) Requires the host to provide a valid username and password during room initialization.
HOST_USER_AUTH true if user authentication is required, false if not (default false). Determines whether host authentication is required.
HOST_USERS JSON array with user objects: {"username": "username", "password": "password"} List of valid host users with their credentials.
Quick start

Start in 6 commands:

git clone https://github.com/miroslavpejic85/mirotalk.git
cd mirotalk
cp .env.template .env
cp app/src/config.template.js app/src/config.js
npm install
npm start

Open http://localhost:3000 - done!

🐳 Docker

docker

Prerequisites: Install Docker Engine and Docker Compose - Image available on Docker Hub

git clone https://github.com/miroslavpejic85/mirotalk.git
cd mirotalk
cp .env.template .env
cp app/src/config.template.js app/src/config.js
cp docker-compose.template.yml docker-compose.yml
docker-compose pull    # optional: pull official image
docker-compose up      # add -d to run in background

Open http://localhost:3000 - done!

Note: Edit app/src/config.js, .env, and docker-compose.yml to customize your setup.

🖥️ Self-Hosting

setup

Requirements

  • A clean server running Ubuntu 22.04 or 24.04 LTS
  • Root access to the Server
  • A domain or subdomain pointing to your servers public IPv4

Note

When prompted, simply enter your domain or subdomain. Then wait for the installation to complete.

# Install MiroTalk P2P
wget -qO p2p-install.sh https://docs.mirotalk.com/scripts/p2p/p2p-install.sh && chmod +x p2p-install.sh && ./p2p-install.sh

# Uninstall MiroTalk P2P
wget -qO p2p-uninstall.sh https://docs.mirotalk.com/scripts/p2p/p2p-uninstall.sh && chmod +x p2p-uninstall.sh && ./p2p-uninstall.sh

# Update MiroTalk P2P
wget -qO p2p-update.sh https://docs.mirotalk.com/scripts/p2p/p2p-update.sh && chmod +x p2p-update.sh && ./p2p-update.sh
🔗 Embed a Meeting in Your App

iframe

To embed a meeting within your service or app using an iframe, you can use the following code:

<iframe
    allow="camera; microphone; speaker-selection; display-capture; fullscreen; clipboard-read; clipboard-write; web-share; autoplay; picture-in-picture"
    src="https://p2p.mirotalk.com/newcall"
    style="height: 100vh; width: 100vw; border: 0px;"
></iframe>

Widget

To quickly add a support widget to your site, include the script in your <head> and place the widget <div> at the end of your <body>. Your support widget will be ready instantly!

<!doctype html>
<html>
    <head>
        <script src="https://p2p.mirotalk.com/js/widget.js"></script>
    </head>
    <body>
        <div
            id="support-widget"
            data-mirotalk-auto
            data-domain="p2p.mirotalk.com"
            data-room="support-room"
            data-theme="dark"
            data-widget-type="support"
            data-widget-state="normal"
            data-position="bottom-right"
            data-check-online="false"
            data-expert-images="https://i.pravatar.cc/40?img=1,https://i.pravatar.cc/40?img=2,https://i.pravatar.cc/40?img=3"
            data-buttons="audio,video,screen,chat,join"
            data-heading="Need Help?"
            data-subheading="Get instant support from our expert team!"
            data-connect-text="connect in &lt; 5 seconds"
            data-online-text="We are online"
            data-offline-text="We are offline"
            data-powered-by="Powered by MiroTalk"
        ></div>
    </body>
</html>

Explore Integrations →

📚 Documentation
📡 API Examples

1. Get Server Statistics

curl -X GET "http://localhost:3000/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X GET "https://p2p.mirotalk.com/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X GET "https://mirotalk.up.railway.app/api/v1/stats" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"

2. Meetings Endpoint (Get active meetings)

curl -X GET "http://localhost:3000/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X GET "https://p2p.mirotalk.com/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X GET "https://mirotalk.up.railway.app/api/v1/meetings" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"

3. Create Meeting

curl -X POST "http://localhost:3000/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X POST "https://p2p.mirotalk.com/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"
curl -X POST "https://mirotalk.up.railway.app/api/v1/meeting" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json"

4. Join Meeting (Basic)

curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","avatar":false,"audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"duration":"unlimited"}'
curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","avatar":false,"audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"duration":"unlimited"}'
curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","avatar":false,"audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"duration":"unlimited"}'

5. Join Meeting with Token

curl -X POST "http://localhost:3000/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}'
curl -X POST "https://p2p.mirotalk.com/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}'
curl -X POST "https://mirotalk.up.railway.app/api/v1/join" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"room":"test","name":"random","audio":true,"video":true,"screen":false,"chat":false,"hide":false,"notify":true,"token":{"username":"username","password":"password","presenter":true,"expire":"1h"}}'

6. Generate Token

curl -X POST "http://localhost:3000/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}'
curl -X POST "https://p2p.mirotalk.com/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}'
curl -X POST "https://mirotalk.up.railway.app/api/v1/token" -H "authorization: mirotalkp2p_default_secret" -H "Content-Type: application/json" --data '{"username":"username","password":"password","presenter":true,"expire":"1h"}'

These commands should now work correctly with the MiroTalk P2P

Cloudron, Hetzner, Netcup, Hostinger & Contabo

Cloudron

MiroTalk integrates with Cloudron, enabling easy, secure, and self-managed video conferencing for organizations. Cloudron automates deployment, updates, backups, and user management, letting teams focus on collaboration instead of server maintenance. Install MiroTalk in one click from the Cloudron App Store and enjoy a reliable, enterprise-ready solution.


Hetzner

This application is running for demonstration purposes on Hetzner, one of the best cloud providers and dedicated root servers.


👉 Use our referral link to receive €⁠20 IN CLOUD CREDITS.


Netcup

Unlock enterprise-grade performance at a price you wont believe. Scalable, reliable, and built for businesses that demand more.

👉 Power Meets Value with Netcup Root Server


Hostinger

Fast, reliable hosting with 24/7 support and great performance. Start today!

👉 Check out Hostinger now


Contabo

Experience also top-tier German web hosting dedicated servers, VPS, and web hosting at unbeatable prices.

👉 Explore now here


To set up your own instance of MiroTalk P2P on a dedicated cloud server, please refer to our comprehensive self-hosting documentation. This guide will walk you through the process step by step, ensuring a smooth and successful deployment.

🙏 Credits
  • ianramzy (html template)
  • vasanthv (webrtc-logic)
  • fabric.js (whiteboard)
🤝 Contributing

Contributions are welcome and greatly appreciated! Whether it's bug fixes, features, or documentation - every contribution helps.

  1. Fork the repository
  2. Create your feature branch
  3. Run npm run lint before committing
  4. Submit a pull request

Have questions? Join our Discord community!

📄 License

AGPLv3

MiroTalk P2P is free and open-source under the terms of AGPLv3 (GNU Affero General Public License v3.0). Please respect the license conditions, In particular modifications need to be free as well and made available to the public. Get a quick overview of the license at Choose an open source license.

To obtain a MiroTalk P2P license with terms different from the AGPLv3, you can conveniently make your purchase on CodeCanyon. This allows you to tailor the licensing conditions to better suit your specific requirements.

Support the project

Do you find MiroTalk P2P indispensable for your needs? Join us in supporting this transformative project by becoming a backer or sponsor. By doing so, not only will your logo prominently feature here, but you'll also drive the growth and sustainability of MiroTalk P2P. Your support is vital in ensuring that this valuable platform continues to thrive and remain accessible for all. Make an impact - back MiroTalk P2P today and be part of this exciting journey!

Cloudron EffectsSDK QuestionPro
TestMuAI BrowserStack CrystalSound
Netcup
Past Sponsors

We are grateful to our past sponsors for their support!

Hetzner Kiquix BroadcastX
LuvLounge
Advertisers
Hostinger Contabo Rambox

EffectsSDK

EffectsSDK

Enhance your video conferencing experience with advanced virtual backgrounds and noise suppression. EffectsSDK offers powerful SDKs and plugins for fast integration.

Explore:


🌐 Diving into Additional MiroTalk Projects:

MiroTalk SFU

Try also MiroTalk SFU selective forwarding unit real-time video conferences, optimized for large groups. Unlimited time, unlimited concurrent rooms each having 8+ participants, up to ~ 100 per single CPU.

MiroTalk C2C

Try also MiroTalk C2C peer to peer real-time video conferences, optimized for cam 2 cam. Unlimited time, unlimited concurrent rooms each having 2 participants.

MiroTalk BRO

Try also MiroTalk BRO Live broadcast (peer to peer) live video, audio and screen stream to all connected users (viewers). Unlimited time, unlimited concurrent rooms each having a broadcast and many viewers.

MiroTalk WEB

Try also MiroTalk WEB a platform that allows for the management of an unlimited number of users. Each user must register with their email, username, and password, after which they gain access to their personal dashboard. Within the dashboard, users can manage their rooms and schedule meetings using the desired version of MiroTalk on a specified date and time. Invitations to these meetings can be sent via email, shared through the web browser, or sent via SMS.


This project is tested with BrowserStack.


Star History

If you like this project, please star it - every star helps more people discover this free Zoom alternative!

Star History Chart


Built with ❤️ by Miroslav and the open-source community

Star MiroTalk P2P on GitHub