Vibeleaderboard
Index / app

p2p.kiwi

p2p.kiwi
Visit p2p.kiwi
Category
Developer Tools
Rank

Previous survey · No. 887 ·

Pricing
Open Source
Type
APP
Use case
Productivity & Collaboration
Interfaces
Desktop
Latest release
v3.10.0
Date

About

p2p.kiwi is a free, open-source, end-to-end encrypted peer-to-peer screen-sharing app for macOS, Windows, and Linux that also supports voice chat, text chat, multiple simultaneous remote cursors, and full remote mouse/keyboard control with an emergency key-chord to instantly cut off access. It runs as a P2P mesh network with no cloud service and no required accounts.

What it does

A desktop calling app built on Electron that connects participants directly over WebRTC, so the picture of your display travels between machines rather than through a hosted relay by default. Group key agreement uses MLS (Messaging Layer Security), and each video or audio frame is sealed with SFrame before it hits the wire. Sessions start from an invite link. A small native helper program draws the overlay and injects pointer and keystroke input when a guest is granted control.

Why it's ranked here

The encryption story is specific and honest. The README names the two IETF standards doing the real work and warns readers not to mistake ordinary WebRTC transport encryption for the end-to-end guarantee. The privacy policy admits what leaks anyway: connection metadata can reveal IP addresses and ports, and the default STUN server is Google's. Remote control is gated in native code rather than trusted to the interface. MIT licensed, with installers for all three desktop platforms. That combination of real cryptography, candid limits and careful control handling puts it ahead of most hobby screen-share tools.

What's good

Remote control refuses to arm at all unless the panic hotkey can be registered on that machine, and every pointer or key event must match the session, peer and grant number that was armed, so stale input after a revoke is rejected. Device identity keys go into the operating system's keychain or secret store when one is available. Invite secrets ride in the link's fragment, never in a query string, and are kept out of debug logs. The optional contacts server is off by default and never sees media or group keys.

Tradeoffs

The privacy policy states plainly that there has been no formal cryptography audit, so the end-to-end claim rests on the design, not on outside review. Peers still contact STUN servers, Google's unless you set your own, and those exchanges expose addresses. The main window runs with Node integration on and the renderer sandbox off, which widens the blast radius of any renderer bug. Media encryption appears as a separate settings toggle. Turning on the contacts server means trusting it with your sign-in identity, username, contact graph and presence.

How to use it well

Fits small teams and pairs who want to share a screen or hand over the mouse without a vendor account. Before a sensitive call, confirm media encryption is enabled in settings and set your own STUN or TURN servers if you do not want Google seeing connection setup. Test the emergency hotkey before granting anyone control. Install through Homebrew, the AUR, or the release downloads. Skip it where an audited product is a compliance requirement, or where you need recording and scheduling features of a hosted meeting service.

Technical notes+

Electron main process in src/main/index.ts registers the kiwi and legacy bananas URL schemes, enforces a single instance in production, and creates the window with sandbox false, nodeIntegration true and contextIsolation true. src/preload/index.ts exposes a KiwiApi bridge covering settings (e2eeEnabled, mediaE2eeEnabled, iceServers, emergencyHotkey), remoteControl arm/disarm and input calls, and a large bonjour contacts surface. native/overlay-sidecar/main.odin handles remote-control-arm by checking caps.emergency_hotkey, pointer and keyboard injection capabilities, and an emergency_generation counter; reject_stale_grant drops events whose sessionId, peerId or grantEpoch do not match. package.json pulls ts-mls, @hpke/core and @noble curves and hashes. electron-builder.yml ships the sidecar binary as an extra resource, a udev input rules file, and auto-updates from a generic p2p.kiwi feed.

Observed

License
MIT (LICENSE)
End-to-end encryption design
MLS-managed keys with SFrame media encryption over DTLS-SRTP (README.md)
Cryptography audit
Privacy policy states the app has not received a formal cryptography audit (PRIVACY.md)
Default STUN server
Google's STUN server unless the user configures their own (PRIVACY.md)
Platforms and packaging
Windows NSIS installer, macOS universal DMG, Linux AppImage, snap, flatpak and deb (electron-builder.yml)
Install channels
GitHub releases, AUR package, Homebrew cask (README.md)
App framework
Electron with a Svelte renderer, TypeScript (package.json)
Native input helper
Odin sidecar that refuses to arm remote control without an emergency hotkey (native/overlay-sidecar/main.odin)
Renderer isolation
Main window sets sandbox false and nodeIntegration true (src/main/index.ts)

Read from README.md, package.json, LICENSE, PRIVACY.md, Makefile, electron-builder.yml, src/main/index.ts, src/preload/index.ts, src/renderer/src/App.svelte, native/overlay-sidecar/main.odin.

Tags

screen-sharep2pe2eeremote-controlopen-sourcecross-platform

Tech Stack

Node.jsTypeScriptVite

Media

p2p.kiwi

Comments (0)

No comments yet

Editorially curated, with community endorsements as a secondary signal. Corrections welcome.