kith (n.): friends and acquaintances; the people you know.
Stream your screen to your friends, peer to peer. There are no accounts and no servers of ours, and quality isn't a paid tier: your stream goes straight to each friend over an encrypted connection.
Early days. It works, but it has run on few machines. On Windows, CI streams between two copies, installs, and shows a notification on a cloud machine, but nobody has streamed a real screen with a graphics card yet. Expect rough edges.
- Your code is your identity. Kith makes a key pair the first time it runs, and your code is the public half. Kith only connects people who have added each other's codes, so nobody else can put a stream on your screen. An invite link does that adding for both of you at once.
- Going live tells your friends. Friends with Kith open get a notification, or their player opens by itself if they asked for that.
- The video goes straight to them when your networks allow a direct connection, which is most of the time, and through a public relay when they don't. iroh makes the connection and Media over QUIC carries the video.
| Watch | Stream | |
|---|---|---|
| Linux | yes | yes, through the desktop's screen-sharing portal |
| Windows 10 and 11 | yes | a monitor or a window; not yet tried with a graphics card |
| Android | command line only; builds, untested | no |
Downloads are on the releases page.
- Windows 10 and 11: get
kith-<version>-windows-x86_64.zip, open it, and runkith.exe. Windows warns about an app it doesn't recognize, because Kith isn't code-signed: choose More info, then Run anyway. Kith then offers to install itself. - Linux (x86-64): get
kith-<version>-linux-x86_64.tar.gz, unpack it, and run./kith, which offers to install itself (or run./kith install). It runs on distributions from 2020 on.
To watch, you need nothing else. mpv or VLC plays with the least delay; with neither installed, streams open in your web browser.
To stream:
- Windows: nothing else. The zip carries
ffmpeg.exe, built with only what Kith uses (seeFFMPEG-LICENSE.txtandFFMPEG-SOURCE.txt). - Linux: gpu-screen-recorder,
from your distribution, or from Flathub (
com.dec05eba.gpu_screen_recorder) on SteamOS and other systems that install apps that way. The test pattern needs ffmpeg.
Install Rust, then:
git clone https://github.com/pabulum/kith
cd kith
cargo build --releaseThe program is target/release/kith. To build the Windows one on Linux,
run rustup target add x86_64-pc-windows-gnu, install mingw-w64
(mingw-w64-gcc on Arch), and run
cargo build --release --target x86_64-pc-windows-gnu.
scripts/ffmpeg-windows.sh builds its ffmpeg.exe (with Docker), and
scripts/release.sh builds the whole release.
Run kith with no arguments (on Windows, double-click kith.exe).
The window shows your code, your friends, and who's live. The first time,
it offers to Install itself: into the Start menu on Windows (Settings →
Apps removes it again), or your app menu on Linux. Opening a newer Kith
later offers to Update the installed one.
- Fill in Your name, click Invite a friend, and send the link it
copies to one friend. They paste it into Add a friend (or click it,
where their chat app opens
kith://links), and you're friends with each other. An invite works once, within a week. Swapping codes works too: Copy yours, and put theirs in Add a friend; each of you adds the other. - When a friend goes live, a notification says so, with a Watch button, and they show as LIVE in the window. Tick auto-open to have their stream open by itself next time.
- To stream, pick Screen or Test pattern and click Go live. The first time, your desktop asks which screen or window to share. On Windows, Share picks a monitor or one window. A window streams on its own even behind others, and closing it ends the stream. Video picks the encoder. Automatic uses your graphics card and H.264, which every friend can play. Hover over a choice to see what it means for the friends watching. Keep Discord out of the sound, on by default, stops friends in a Discord call with you hearing themselves.
Friends can reach you while Kith runs. Closing the window leaves it in the tray (the notification area, on Windows): click its icon to open the window again, or use its menu to quit. On a desktop without a tray (GNOME without the AppIndicator extension), closing the window quits Kith. Under Settings, Start Kith when you log in starts it in the tray.
kith name Sam # what friends see you as
kith invite # a link for one friend: using it makes you friends
kith join <link> # use a friend's invite
kith id # your code, the long way round:
kith friend add sam <sam's code> # ...sam adds yours too, or neither of you connects
kith friend set sam --auto-open # open sam's stream as soon as they go live
kith up # stay reachable without the window
kith live # stream your screen
kith live --source test # ...or a test pattern
kith live --stop
kith encoders # the video encoders your screen can be streamed with
kith watch sam [--latency low|normal|smooth]
kith watch sam --serve 127.0.0.1:8080 # for a player you open yourself, at that URL
kith status # who's online or live, and whether it's direct or relayed
kith quit # stop Kith: the window, the tray icon, or `kith up`
kith install # into the Start menu or app menu (~/.local/bin on Linux)
kith uninstall # ...and out again; your code and friends stayWhile Kith runs (the app, or kith up), the other commands go through it.
Without it, live and watch run until you press Ctrl-C. Opening Kith
again shows the window it already has, and kith --background starts it in
the tray without one.
player in the settings picks what plays a stream:
"auto", the default: mpv if it's installed, else VLC, else the browser."mpv","vlc"or"browser".- A command, such as
["mpv", "--fs", "-"]. It gets the stream on its standard input, or a local URL wherever an argument says{url}.
mpv has the least delay. The browser plays a page that Kith serves on your own machine (127.0.0.1). Every browser plays H.264, which streams use unless the streamer picks HEVC. Whether a browser can play HEVC depends on the browser and the graphics card, and one that can't says so and links to VLC.
The settings folder is ~/.config/kith on Linux and %APPDATA%\kith
on Windows. It holds config.toml, your key (secret.key) and the log
(kith.log). Besides player, config.toml has:
name: what friends see you as. Invites carry it.encoder: the video encoder for streaming your screen."auto"(the default) picks the graphics card and H.264;kith encoderslists the others your computer has, such as"hevc"or"hevc_10bit".silence: apps whose sound stays out of your stream,["Discord"]by default. Add a voice chat you use, such as"TeamSpeak", or set[]to send everything. On Windows only the first one that's running is left out, and it takes Windows 10 version 2004 or later.capture: not set by default. A command to record your screen with instead of the built-in one, which writes MPEG-TS (H.264 or HEVC video, AAC audio) to standard output.encoderandsilencedon't apply to it.latency: how far behind live you watch by default.[[invite]]: the invites you've made that nobody has used yet.
--home <dir> or KITH_HOME uses another folder, which is how one
computer can be two people.
Keep secret.key. It is your identity: if you lose it, your friends have to
add your new code.
- An invite is your code plus your say-so: whoever uses it first becomes your friend. Send it only to the friend it's for. It works once, and not after a week.
- Your friends can see your IP address. A direct connection needs it, as in most peer-to-peer games and calls.
- So can anyone who has your code, even if you haven't added them: setting
up a connection exchanges addresses before Kith checks who's asking.
Share your code the way you'd share your phone number. If it gets out,
delete
secret.keyto get a new one, and send that to your friends. - Streams are encrypted end to end. The relays that carry traffic when a direct connection isn't possible can't read it, but they can see which codes talk to each other, and when.
- Kith uses public infrastructure run by n0, who make iroh: the relays, and a directory that maps your code to the relay you're using (not to your IP address). The relays are rate-limited, and Kith can't use one of your own yet.
- The log has your friends' names and codes. Read it before you share it.
- The log is
kith.login the settings folder. The previous run's iskith.log.old. - The window doesn't open on Windows. Kith tries again with OpenGL, and
if that fails too, shows a dialog that says where the log is. Setting
WGPU_BACKEND=glgoes straight to OpenGL. - A stream stutters.
kith statusshows whether each friend's connection isdirectorrelayed. Relayed traffic goes through a rate-limited public server. - Windows warns about an unrecognized app. Kith isn't code-signed yet. Choose More info, then Run anyway.
- No notifications on Windows. Windows holds them back during games and in Do Not Disturb, and they wait in the notification center.
- No Kith in the tray on GNOME. GNOME shows tray icons only with the AppIndicator extension (Ubuntu turns it on). Without it, closing the window quits Kith.
cargo test # unit tests
scripts/smoke.sh # end to end on one machine: several identities, headless players
scripts/wine-smoke.sh # the Windows build under Wine, watching a Linux stream
scripts/wine-smoke.sh path/to/ffmpeg.exe # ...and streaming from Windows too
scripts/windows-smoke.sh path/to/ffmpeg.exe # on real Windows, in Git Bash (CI runs it)
scripts/ffmpeg-windows.sh # the trimmed ffmpeg.exe, built in a container
scripts/release.sh # the release in dist/, with third-party licensesA tag like v0.1.0 builds the release on GitHub and drafts it there.
MIT, in LICENSE. The browser player embeds
mpegts.js, which is Apache-2.0; see
assets/mpegts.js. Release archives list the licenses of everything
compiled in.