{"_id":"@deltachat/calls-webapp","_rev":"4-64e757044e25eec8eedebb01ba49720f","name":"@deltachat/calls-webapp","dist-tags":{"latest":"0.12.1-beta-debug"},"versions":{"0.10.0-beta-debug":{"name":"@deltachat/calls-webapp","version":"0.10.0-beta-debug","_id":"@deltachat/calls-webapp@0.10.0-beta-debug","maintainers":[{"name":"missytake","email":"missytake@systemli.org"},{"name":"simon-laux","email":"npm-package-manager@simonlaux.de"},{"name":"jikstra","email":"jikstra@disroot.org"},{"name":"link2xt","email":"link2xt@testrun.org"},{"name":"wofwca","email":"WofWca@protonmail.com"},{"name":"ncodher","email":"ndh@deltachat.de"}],"dist":{"shasum":"80ff68a2e5873d8c6c6c9f8dbce5edb75a09fe74","tarball":"https://registry.npmjs.org/@deltachat/calls-webapp/-/calls-webapp-0.10.0-beta-debug.tgz","fileCount":4,"integrity":"sha512-eErbULxmTN3YPCtjW+xXZzCFahtnblNM9gIohdwO837k2HbtkK6YbGw3G7rrkFenfTx4WBCxL636b/105TJmcg==","signatures":[{"sig":"MEYCIQCEp4qRPKxIkfX2XoZgZdyp2HZKp0mrKx4SGg1+8Ccy/AIhAOqZHzOZq1jvJjISzgjkAi12WroCJx+QePNFPb29uqHA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593806},"type":"module","_from":"file:deltachat-calls-webapp-0.10.0-beta-debug.tgz","scripts":{"fix":"prettier --write .","vite":"vite --port 3000","build":"tsc && vite build","check":"tsc && prettier --check .","start":"concurrently \"npm run vite\" \"webxdc-dev run http://localhost:3000\""},"_npmUser":{"name":"wofwca","email":"WofWca@protonmail.com"},"_resolved":"/tmp/a535d08e75341be945a508bb463017aa/deltachat-calls-webapp-0.10.0-beta-debug.tgz","_integrity":"sha512-eErbULxmTN3YPCtjW+xXZzCFahtnblNM9gIohdwO837k2HbtkK6YbGw3G7rrkFenfTx4WBCxL636b/105TJmcg==","_npmVersion":"10.8.2","description":"P2P videocalls via WebRTC for integration into Delta Chat clients.","directories":{},"_nodeVersion":"20.18.2","dependencies":{"preact":"^10.26.9"},"_hasShrinkwrap":false,"devDependencies":{"vite":"latest","prettier":"latest","@svgr/core":"^8.1.0","typescript":"latest","@types/react":"^19.1.8","concurrently":"^9.1.2","@iconify/json":"^2.2.350","unplugin-icons":"^22.1.0","@svgr/plugin-jsx":"^8.1.0","@webxdc/webxdc-dev":"latest","@preact/preset-vite":"^2.10.1","@webxdc/vite-plugins":"latest","vite-plugin-singlefile":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/calls-webapp_0.10.0-beta-debug_1760369890515_0.9953370730190394","host":"s3://npm-registry-packages-npm-production"}},"0.11.0-beta-debug":{"name":"@deltachat/calls-webapp","version":"0.11.0-beta-debug","_id":"@deltachat/calls-webapp@0.11.0-beta-debug","maintainers":[{"name":"missytake","email":"missytake@systemli.org"},{"name":"simon-laux","email":"npm-package-manager@simonlaux.de"},{"name":"jikstra","email":"jikstra@disroot.org"},{"name":"link2xt","email":"link2xt@testrun.org"},{"name":"wofwca","email":"WofWca@protonmail.com"},{"name":"ncodher","email":"ndh@deltachat.de"}],"dist":{"shasum":"640208be0dba657822cf14633909e5fe11955418","tarball":"https://registry.npmjs.org/@deltachat/calls-webapp/-/calls-webapp-0.11.0-beta-debug.tgz","fileCount":4,"integrity":"sha512-W8ZknzRKHIUSieJ20P7Tiyfqu0UuqiPW3phisS+3AmK+b9fUM4Uu7j3bZdH1Kgaf0zbEr5OutJji6CHgGKLIRg==","signatures":[{"sig":"MEYCIQDf5cbrtzYVTotETqtFmps75VH+f01YwxWpZF+s7V8rpwIhAMyFBoOMZth7Kkqy2nRwn+Wbb69c3IZePVdzZOa1U8XG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":594366},"type":"module","_from":"file:deltachat-calls-webapp-0.11.0-beta-debug.tgz","scripts":{"fix":"prettier --write .","vite":"vite --port 3000","build":"tsc && vite build","check":"tsc && prettier --check .","start":"concurrently \"npm run vite\" \"webxdc-dev run http://localhost:3000\""},"_npmUser":{"name":"wofwca","email":"WofWca@protonmail.com"},"_resolved":"/tmp/18badf3670501786aa8e6cb51afe9aec/deltachat-calls-webapp-0.11.0-beta-debug.tgz","_integrity":"sha512-W8ZknzRKHIUSieJ20P7Tiyfqu0UuqiPW3phisS+3AmK+b9fUM4Uu7j3bZdH1Kgaf0zbEr5OutJji6CHgGKLIRg==","_npmVersion":"10.8.2","description":"P2P videocalls via WebRTC for integration into Delta Chat clients.","directories":{},"_nodeVersion":"20.18.2","dependencies":{"preact":"^10.26.9"},"_hasShrinkwrap":false,"devDependencies":{"vite":"latest","prettier":"latest","@svgr/core":"^8.1.0","typescript":"latest","@types/react":"^19.1.8","concurrently":"^9.1.2","@iconify/json":"^2.2.350","unplugin-icons":"^22.1.0","@svgr/plugin-jsx":"^8.1.0","@webxdc/webxdc-dev":"latest","@preact/preset-vite":"^2.10.1","@webxdc/vite-plugins":"latest","vite-plugin-singlefile":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/calls-webapp_0.11.0-beta-debug_1762931248574_0.25102646687361396","host":"s3://npm-registry-packages-npm-production"}},"0.12.0-beta-debug":{"name":"@deltachat/calls-webapp","version":"0.12.0-beta-debug","_id":"@deltachat/calls-webapp@0.12.0-beta-debug","maintainers":[{"name":"missytake","email":"missytake@systemli.org"},{"name":"simon-laux","email":"npm-package-manager@simonlaux.de"},{"name":"jikstra","email":"jikstra@disroot.org"},{"name":"link2xt","email":"link2xt@testrun.org"},{"name":"wofwca","email":"WofWca@protonmail.com"},{"name":"ncodher","email":"ndh@deltachat.de"}],"dist":{"shasum":"4806bc4bee449c6e864021545dd2e90a277a507a","tarball":"https://registry.npmjs.org/@deltachat/calls-webapp/-/calls-webapp-0.12.0-beta-debug.tgz","fileCount":4,"integrity":"sha512-Fe7vCk3wlibxnupUjcew6F4eVVp6R20UaXNA3XAYwrZgquk4GKVJOUPonjBeMzMfDU3nzfmPyquhKuTZU/IZYQ==","signatures":[{"sig":"MEYCIQDoLnjrfYWYyObbAle7WPeo9+LSYy7oqTxgqtUkH319pwIhAKll/CVIFKW8sUO7mDygjAFltgMW7bX6Og1UKfG/rmus","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":601691},"type":"module","_from":"file:deltachat-calls-webapp-0.12.0-beta-debug.tgz","scripts":{"fix":"prettier --write .","vite":"vite --port 3000","build":"tsc && vite build","check":"tsc && prettier --check .","start":"concurrently \"npm run vite\" \"webxdc-dev run http://localhost:3000\""},"_npmUser":{"name":"wofwca","email":"WofWca@protonmail.com"},"_resolved":"/tmp/6c5344e706f4c26e70c8812b7f9aa87c/deltachat-calls-webapp-0.12.0-beta-debug.tgz","_integrity":"sha512-Fe7vCk3wlibxnupUjcew6F4eVVp6R20UaXNA3XAYwrZgquk4GKVJOUPonjBeMzMfDU3nzfmPyquhKuTZU/IZYQ==","_npmVersion":"11.6.2","description":"P2P videocalls via WebRTC for integration into Delta Chat clients.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"preact":"^10.28.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"latest","prettier":"latest","@svgr/core":"^8.1.0","typescript":"latest","@types/react":"^19.1.8","concurrently":"^9.1.2","@iconify/json":"^2.2.350","unplugin-icons":"^22.1.0","@svgr/plugin-jsx":"^8.1.0","@webxdc/webxdc-dev":"latest","@preact/preset-vite":"^2.10.1","@webxdc/vite-plugins":"latest","vite-plugin-singlefile":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/calls-webapp_0.12.0-beta-debug_1770221338139_0.2151267707080713","host":"s3://npm-registry-packages-npm-production"}},"0.12.1-beta-debug":{"name":"@deltachat/calls-webapp","version":"0.12.1-beta-debug","type":"module","devDependencies":{"@iconify/json":"^2.2.350","@preact/preset-vite":"^2.10.1","@svgr/core":"^8.1.0","@svgr/plugin-jsx":"^8.1.0","@types/react":"^19.1.8","@webxdc/vite-plugins":"latest","@webxdc/webxdc-dev":"latest","concurrently":"^9.1.2","prettier":"latest","typescript":"latest","unplugin-icons":"^22.1.0","vite":"latest","vite-plugin-singlefile":"^2.2.0"},"dependencies":{"preact":"^10.28.2"},"scripts":{"vite":"vite --port 3000","start":"concurrently \"npm run vite\" \"webxdc-dev run http://localhost:3000\"","fix":"prettier --write .","check":"tsc && prettier --check .","build":"tsc && vite build"},"_id":"@deltachat/calls-webapp@0.12.1-beta-debug","description":"P2P videocalls via WebRTC for integration into Delta Chat clients.","_integrity":"sha512-24ceQrtW3Jf7oCTrlAPY5h/pLoIybxiz/UgoiHn4sNjgIDYbhhp71zbdeQRCOS4oOmPrJoZftvB4lhpZurX9CQ==","_resolved":"/tmp/b6929859d154e9a91251531a63dc605b/deltachat-calls-webapp-0.12.1-beta-debug.tgz","_from":"file:deltachat-calls-webapp-0.12.1-beta-debug.tgz","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-24ceQrtW3Jf7oCTrlAPY5h/pLoIybxiz/UgoiHn4sNjgIDYbhhp71zbdeQRCOS4oOmPrJoZftvB4lhpZurX9CQ==","shasum":"67504f904dd3098e52ed5059c4a46906a1247a43","tarball":"https://registry.npmjs.org/@deltachat/calls-webapp/-/calls-webapp-0.12.1-beta-debug.tgz","fileCount":4,"unpackedSize":601825,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCOPt3hhJgw4N0tfujhDo86FGTM7nYrUhTJ5RGt7ZNccQIgdYXiHg3ibB/XVSoL9p7G+sX+s+aqS7E40fqdkIYGai4="}]},"_npmUser":{"name":"wofwca","email":"WofWca@protonmail.com"},"directories":{},"maintainers":[{"name":"missytake","email":"missytake@systemli.org"},{"name":"simon-laux","email":"npm-package-manager@simonlaux.de"},{"name":"jikstra","email":"jikstra@disroot.org"},{"name":"link2xt","email":"link2xt@testrun.org"},{"name":"wofwca","email":"WofWca@protonmail.com"},{"name":"ncodher","email":"ndh@deltachat.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/calls-webapp_0.12.1-beta-debug_1771350118128_0.1726500902609871"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-13T15:38:10.452Z","modified":"2026-02-17T17:41:58.540Z","0.10.0-beta-debug":"2025-10-13T15:38:10.762Z","0.11.0-beta-debug":"2025-11-12T07:07:28.836Z","0.12.0-beta-debug":"2026-02-04T16:08:58.358Z","0.12.1-beta-debug":"2026-02-17T17:41:58.313Z"},"description":"P2P videocalls via WebRTC for integration into Delta Chat clients.","maintainers":[{"name":"missytake","email":"missytake@systemli.org"},{"name":"simon-laux","email":"npm-package-manager@simonlaux.de"},{"name":"jikstra","email":"jikstra@disroot.org"},{"name":"link2xt","email":"link2xt@testrun.org"},{"name":"wofwca","email":"WofWca@protonmail.com"},{"name":"ncodher","email":"ndh@deltachat.de"}],"readme":"# Call\n\nP2P videocalls via WebRTC for integration into Delta Chat clients.\n\n## How it works\n\nBelow is a sequence diagram of how Delta Chat works together with this app.\nIf you see a block of text instead of a diagram, go\n[here](https://mermaid.ink/svg/pako:eNqtVstu2zAQ_JUFL7UBx43ltxCkiJ0ecmgQJA6MFr7Q0tomSokqSSV1g_x7l5QUO34UaVpDB0ncndmdHVJ-YpGKkYXM4I8c0wgvBV9qnsxSoF_GtRWRyHhq4UKKCIGb4uaDgUuUlsN4xe2B4Mn97fV2sH_-CHeT-2swqB9Qm_2sUZU1UvPDOWdzfQ61SOUyhjmCXSEYnmyXVT8Aq-Yb0O2qi9BrZREUoRcQYdlpptEY9IwzdmcJD8ZcSngUduWwZqxIL6JPzs-LpkOYEjYRJWvI8jktAo9jh_XpSPyNRG4QNEq-9lk8-o62lKcQ8sSHF9V9VbmuIEH4-jpBs7rCVtDudN3LmtEL-RMinsYi5tTikpNcGuP6MeQr6o0aLApZO5qyFA_nw2t-sb5BdUs7wHt6TrmwsFC6RH6VS2_dihUJqtzuKkQyh1DDhAtZd-W5aVoFxk-DE5KUTfiy3pID9rRolDTUkKOmIni0AucZ69T2bRXuavo-pzi_nYxBLRao6_se8SU5R5X-gBm7iCLMCndUpnABvoE3WWIn-i2G2ExtNJkWw1JuCked0Q67nXbQKgk3s_f9HPJUu1ldYdf93uKpXdz_7iiP-rd-quQtBav8dJdrbIBEN5kVf8BjhtoV4p2G4ql53HKUVCor7jaWPzvbSHcT3MCDiNG5nRgSqIkFZMoYMZdYP5C5OVC8LBi_SveVEIKDTZU9iOQrL5BG_4Q02kZyzbwDB9O4kmr0Yvli8_3R8DvT6m3rDRepCxdWqJRLKAdD1qHJr3iaovQDpQ8L0hFDG9WsqOjag-Cl1WjqWZDVHREdQ5lWiXNmojTC1fjzxokG-MJSbe77JFLiI7ZIEUHkqJ2rtgh2Z_nSKPlwt0U4sqEP2Pxg9r46pdaswZZaxCy0OscGS1DTJqFH9uRCZoyQEpyxkG5jXPBcWnfUPVMafWK_KZVUmVrlyxULF1waesozJ0f5n-LlrSZC1GOVp5aFrdbAg7Dwif1kYdBu9vrdoNNvDYP2IBi0ggZbs_Ck1eq3m8Ne93TQHwxPe0H3ucF-eV7Soke9tPuD_vA0GFDA82_Bo8ZW).\n\n```mermaid\nsequenceDiagram\n    participant Alice as Alice's Delta Chat\n    participant ATURN as Alice's TURN / STUN servers\n    participant BTURN as Bob's TURN / STUN servers<br> (could be the same as Alice's)\n    participant Bob as Bob's Delta Chat\n\n    Note over Alice: Alice presses<br>\"Start Call with Bob\"\n    Alice ->> ATURN: What's my public address?\n    Alice ->> ATURN: Please relay my packets\n    ATURN -->> Alice: Your address is<br>42.42.42.42:12345<br>(srflx candidate gathered)\n    ATURN -->> Alice: I will relay your packets<br>(TURN (relay) candidate<br>gathered)\n    Note over Alice: Wait for relay candidate<br>or for timeout\n    Alice ->> Bob: (email) I want to start a call. My address is 42.42.42.42:12345,<br>or you can reach me at my TURN server.<br>(WebRTC offer)\n\n    Note over Bob: Bob presses \"Accept Call\"\n    Bob ->> BTURN: What's my public address?\n    Bob ->> BTURN: Please relay my packets\n    ATURN ->> Alice: BTW your other address is<br>42.42.42.43:54321\n    BTURN -->> Bob: Your address is<br>43.43.43.43:55555<br>(srflx candidate gathered)\n    BTURN -->> Bob: I will relay your packets<br>(TURN (relay) candidate<br>gathered)\n    Note over Bob: Wait for relay candidate<br>or for timeout\n    Bob ->> Alice: (email) Sure, let's have a call. My address is 43.43.43.43:55555,<br>or you can reach me at my TURN server.<br>(WebRTC answer)\n\n    loop\n        Alice <<-->> Bob: P2P video stream (if possible)\n        Alice <<->> ATURN: relayed video stream<br>(if P2P not possible)\n        ATURN <<->> BTURN: relayed video stream<br>(if P2P not possible)\n        BTURN <<->> Bob: relayed video stream<br>(if P2P not possible)\n    end\n\n    BTURN ->> Bob: BTW your other address is<br>43.43.43.43:55556\n\n    loop An additional WebRTC data channel can be established (via relay or P2P)<br>to promote more ICE candidates after the initial connection is established\n        Alice ->> Bob: My other address is 42.42.42.43:54321\n        Bob ->> Alice: My other address is 43.43.43.43:55556\n    end\n```\n\n## Integrating\n\nTo integrate into your Delta Chat client you need to provide a\n`window.calls` object with the following API:\n\n- `startCall: (offerPayload: string) => void` (implementation must call `dc_place_outgoing_call` chatmail core API)\n- `acceptCall: (answerPayload: string) => void` (implementation must call `dc_accept_incoming_call` chatmail core API)\n- `endCall: () => void` (implementation must call `dc_end_call` chatmail core API)\n- `getIceServers: () => string | Promise<string>` (returns a JSON string with array of ice server configurations as expected by https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration)\n- `getAvatar: () => string` (returning the chat's avatar image URL; can be a regular URL or a data-URL, ex. `\"data:image/png;base64,...\"`)\n\nCommands are given to the app via URL hash:\n\n- `#startCall`: tells the app to generate an offer payload and call `startCall()`, this is how the app should be open when the user is starting an outgoing call.\n- `#offerIncomingCall=PAYLOAD`: tells the app to show the \"Incoming call. Answer?\" screen. Then, if the user clicks \"Answer\", generate a WebRTC answer to the offer provided in `PAYLOAD`, and call `window.calls.acceptCall(webrtcAnswer)`. If the user declined the call, the app will invoke `window.calls.endCall`.\n- `#acceptCall=PAYLOAD`: same as `#offerIncomingCall`, but doesn't show the \"Incoming call. Answer?\" screen and instead automatically and immediately accepts the call.\n- `#onAnswer=PAYLOAD`: notifies the app that the outgoing call was accepted and provides the answer payload\n\n**IMPORTANT:** `PAYLOAD` **must** be base64 encoded (NOTE: you might still need to URL-encode the base64 string to be a valid URL hash) before passing it to the app in the URL hash.\n\nIn order to start the app in audio-only mode initially,\nprovide `noOutgoingVideoInitially` in the query (search) string\nof the initial URL, e.g. `/index.html?noOutgoingVideoInitially#startCall`.\n\nIn order to completely disable incoming and outgoing video,\nprovide `disableVideoCompletely` in the query string of the URL.\nSee <https://github.com/deltachat/calls-webapp/issues/31>.\n\n## Contributing\n\n### Installing Dependencies\n\nAfter cloning this repo, install dependencies:\n\n```\npnpm i\n```\n\n### Checking code format\n\n```\npnpm check\n```\n\n### Testing the app in the browser\n\nTo test your work in your browser while developing:\n\n```\npnpm start\n```\n\nOpen the simulated instances in 2 separate tabs (the \"share\" button on the instance in the simulator).\nThen add `#startCall` to the end of the URL of one instance.\n\nOn macOS on Safari, you may not be able to give access to the camera to two tabs simultaneously; in this case, try Firefox.\n\n### Building\n\nTo build the app for releasing:\n\n```\npnpm build\n```\n\nTo package the app with developer tools inside to debug in Delta Chat, set the `NODE_ENV`\nenvironment variable to \"debug\":\n\n```\nNODE_ENV=debug pnpm build\n```\n\nThe resulting optimized `.html` file is saved in `dist/` folder.\n\n### Releasing\n\nTo automatically build and create a new GitHub release with the `.html` file:\n\n```\ngit tag -a v1.0.1\ngit push origin v1.0.1\n```\n\n### Credits\n\nInspired by [Serverless WebRTC][serverless-webrtc] but built from scratch and much simpler:\nno data channel, file transfer and only browsers are supported.\n\nSee blog posts explaining the idea here:\n\n- [WebRTC without a signaling server](https://blog.printf.net/articles/2013/05/17/webrtc-without-a-signaling-server/)\n- [Serverless WebRTC, continued](https://blog.printf.net/articles/2014/07/01/serverless-webrtc-continued/)\n\n[serverless-webrtc]: https://github.com/cjb/serverless-webrtc/\n","readmeFilename":"README.md"}