Skip to content
itsMattGuentherPublic

About

A small, self-hosted place for a group of friends to hang out. Text+Voice rooms, presence, and file sharing. One person runs a server, your friends connect. Nothing to sell you. No company in the middle.

Topics

Resources

Contributing

Stars

14 stars

Watchers

0 watching

Forks

Repository files navigation

Linger

A small, self-hosted place for a group of friends to hang out.

One person runs a server; their friends install the app and connect to it. Text rooms, voice rooms, DMs, file sharing, and a buddy list that shows who's around. Not federated, not a platform, no company in the middle. Built for people who already know each other, not a stadium of fifty thousand strangers.

To linger is to stay somewhere with no agenda and no obligation to be doing anything. That is the product thesis in one word.

The buddy list with a conversation open beside it, in one window

Status: 0.5.3, testing with friends. It works day to day; voice across different networks and some desktop setups still need checks on real computers. SPEC.md is the full product description.

🏠 The case for running your own

There was a stretch of the internet where a group of friends just had a place. Somebody ran it. You knew who that was, you could ask them for things, and the whole arrangement was a few files on a machine somebody owned. Then everyone moved into one enormous building owned by a company, and the terms changed:

  • Your conversations sit on someone else's disk, and the company's business depends on what it can learn from them.
  • Features get held back and sold back to you. The free experience gets a little worse on purpose, because friction is what makes an upsell work. That is not a bug in the design... it is the design.
  • There's a storefront in the middle of your conversation, selling cosmetics and subscriptions nobody asked for.
  • The product changes under you whenever a growth target does, and nobody asks.

Linger is the other arrangement. One person runs a server for their friends. The whole thing is one binary, one SQLite file, and a folder of uploads — you can back it up, move it to another box, read it with off-the-shelf tools, or walk away with all of it. There is no account that spans servers, no directory, no company in the middle.

And there is nothing to sell you, structurally: no paid tier, no store, no cosmetics, no premium anything, and none of it held back for later. It's AGPL-3.0, so if someone runs a modified server for other people, those people get the source. Zero telemetry — not opt-in, not anonymous, not crash reports.

This is not an attempt to build a better platform. It's an attempt to not need one.

✨ What it does

  • The buddy list. One tall window of places and people: you, the rooms with who's in each (your group DMs with them, which you can leave), and everyone on the server, here, away (with their away message) or offline. A DM lives on its person: their row lights up when they write, the people you're talking to stay at the top, and clicking someone opens them beside the list. Closing it keeps Linger running in the tray, and it can start when you sign in to the computer (off unless you turn it on).
  • Conversations beside the list, as tabs in the list's own window, which folds back to just the list when you want it slim. Or each in a window of its own.
  • No unread counts. A room with something new gets a bolder name, and a conversation opens at "you left off here". A DM you haven't read is lit in amber as well, with a desktop banner saying who it's from. Never a badge.
  • Styled names and statuses: your own font, color, gradient and glow; a status with up to three short fields you label yourself, links included; away messages; and, if you turn it on, your local time on your card.
  • Files and media. 500 MB uploads, with where a photo or video was taken always stripped. Media, a tab beside your list, keeps everything ever shared; star things to keep them forever. On a phone, Linger is in the share sheet: share a photo or file from another app, pick a conversation, and it waits in that message box for you to send.
  • Voice rooms with mute, deafen, push-to-talk and per-person volume. The talk key works with a game in front on Windows and Linux, and Linger listens for that one key and nothing else. Voice goes through the host's server, which passes it on so up to 60 can talk at once, and a relay the host can run lets in friends whose network blocks it. Joining leaves a small grey line in the chat, so people reading it know the talk moved to voice; it never rings anybody. Voice rooms are never recorded. The Android app joins voice too (from 0.5.1), and a locked phone stays in the call.
  • Voice messages: record a clip in the message box, hear it back, then send it or throw it away. Up to five minutes.
  • Screen sharing in voice: share a screen or one window from the Windows or Linux app at 30 or 60 frames a second, and everybody in that voice can watch it above the conversation, on a computer or a phone. Everybody in the call hears a share start, and Watch is one press away from any room. Your system's own picker chooses what's shared, and Linger never learns a window's name. From Windows the computer's sound can go with it, without the call's own voices, and everybody can hear it. It's never recorded. Cameras aren't a feature.
  • Every emoji, found by name: type :smiley: as on Discord. A server's host can add its own emoji too, animated GIFs included.
  • Reactions, as on Discord and Slack: any emoji, the server's own included, with how many people left it, and yours in blue. Up to six different on a message. They never notify anybody. A host can turn them off for a room, and anybody can hide them for themselves.
  • Polls: the host or a co-host types /poll, and everybody votes with a click. Who picked what shows as dots, never a tally, and every poll closes on its own, leaving a line saying how it came out.
  • Knock to nudge one person: a soft sound and a card that fades.
  • A message of the day for each room, beside its topic: the host or a co-host types /motd and it sits whole under the room's header until you fold it away. It never pings anybody.
  • Search through what people said and the files they shared.
  • Several servers at once, each a folding section of the list.
  • A co-host for when the host is away: one switch the host gives somebody, so they can look after rooms, reports and people. It isn't a role system; there is nothing else to set.
  • Full export. Anyone can export public rooms and their own DMs, with files, without asking the host. It opens in any web browser with a double-click.
  • Linux, Windows and Android (Tauri 2, not Electron). An iPhone app is in testing with a small group, and macOS builds from source.

What it will never have: XP, streaks or engagement metrics. Federation, bots, roles, threads, @everyone, algorithmic ordering, unread badges. Telemetry or analytics of any kind. A paid tier or a store. Anything that watches which applications you have open. The scope discipline is the product.

🔐 Privacy

Your conversations live on your friend's server, not a company's. Messages, files, voice and shared screens travel encrypted (TLS) to the host's server, and nowhere else. No company sits in the middle, and nothing in Linger reads them to sell you something.

Linger isn't end-to-end encrypted yet, so the person running the server can see what's on it, and the database and files sit unencrypted on their disk. That's why it's made for friends: run your own server, or join one run by somebody you trust. End-to-end encrypted voice is on the backlog (#200). If you need protection even from your host, use an app built for that, such as Signal.

What is guaranteed: no telemetry, analytics or crash reporting, not even opt-in (the app only contacts GitHub to check for updates); EXIF, including GPS, stripped from every image, and the tags, location included, from every video and sound file; and no code that could read a window title (decision, 2026-08-28).

Anybody can delete their account on a server from inside the app, and choose whether what they wrote goes with it (user guide). Their username stays taken, so nobody new can pass as them.

📦 Installing the app

You need an invite link from your host. The user guide covers each step and what to do when something goes wrong.

Your computer How
Windows The …x64-setup.exe from the latest release
Omarchy or Arch The one-line setup below; updates then come with your system
Ubuntu, Debian, Mint The …amd64.deb: sudo apt install ~/Downloads/Linger_<version>_amd64.deb
Fedora, openSUSE The …x86_64.rpm: sudo dnf install (or zypper install) it
Any other Linux The …amd64.AppImage: chmod +x it, then run it
An Android phone The …android-arm64.apk, downloaded and opened on the phone (from 0.4.8; Android asks you to allow installs from your browser)
# Omarchy and Arch: trusts Linger's signing key, adds its repository, installs
curl -fsSL https://raw.githubusercontent.com/itsMattGuenther/Linger/main/packaging/arch/setup.sh | bash

Windows will warn you ("Windows protected your PC"): choose More info, then Run anyway. The installer isn't code-signed; that's a decision, not a broken download. After that, Linger updates itself, never while you're in voice. Updates are signed, and the app checks the signature before installing one.

🚀 Running a server

The host guide is the step-by-step path: a VPS or a computer at home, Docker, DNS, voice, backups and updates. The server runs on Intel or AMD (x86-64) machines only; there's no ARM build, so not a Raspberry Pi. Creating your first VPS covers the cloud side. The short version, for someone who already has Docker and two DNS names pointing at the machine:

mkdir linger && cd linger
curl -fLO https://raw.githubusercontent.com/itsMattGuenther/Linger/main/deploy/setup.sh
bash setup.sh   # asks for your name, checks it, starts the server, prints a setup link

The script fetches the newest release's server files, writes your settings into .env (the one file you'd ever edit), opens the firewall ports and prints a one-time setup link. Paste that link into the app. It makes your account, makes you the host and names the server. Voice needs UDP 3479 open, and nothing else. To update later, run ./update.sh in the same folder: it backs up the database, updates and restarts, and prints the version it's on.

🐞 Reporting a problem

Open an issue. Issues are public, so leave out message text, other people's names, server addresses and invite links. If you use a coding agent, the linger-report skill drafts the issue with you.

🛠️ Development

crates/linger-core/    shared types, IDs and the palette: the wire contract
crates/linger-server/  the server: REST and WebSocket gateway, SQLite, file storage
crates/linger-sfu/     voice forwarding, which the server runs
client/                the desktop app: Tauri 2 shell (src-tauri) and React
                       (src/next is the app; src/lib is the logic its windows
                       share, and src/generated the wire types); the phone
                       apps build from the same shell (src-tauri/gen/android
                       and src-tauri/gen/apple)
deploy/                Dockerfile, compose, Caddyfile, .env.example, setup.sh, update.sh
packaging/arch/        the Arch/Omarchy package and its repository
assets/                logos and fonts' licenses
agents/                skills for your own coding agent (linger-report, linger-contribute)
docs/                  guides, decisions, design, release notes
scripts/               check.sh (the local gate) and what it calls
.github/               CI workflows, issue forms, the PR template
.cargo/                where cargo test writes the TypeScript wire types
cargo test --workspace                        # server and core, no GUI needed
cd client && pnpm install && pnpm check && pnpm test
cd client && pnpm tauri dev                   # the desktop app
cd client && pnpm tauri android dev           # the phone app, on Android

The desktop app needs a webview, ALSA headers, cmake, the GStreamer plugins for sound, and the appindicator library for the tray; the packages for each distribution are in docs/development.md, with everything else about building and testing. The server needs ffmpeg to take videos and sound files (the Docker image has it); without it those uploads are refused, and the tests for them skip. The phone app needs Android Studio, Java 21 and the Rust Android targets; the steps are in its section there. Run scripts/check.sh before pushing; it runs what CI runs for your change, and docs/testing-strategy.md says what runs where.

Start with CONTRIBUTING.md and AGENTS.md. The docs (SPEC, ARCHITECTURE, PROTOCOL) are the source of truth; the queue is TASKS.md.

🙏 Thanks

To the people who've helped build Linger, in the order they joined in. Each one's link shows everything of theirs that's been merged, and stays up to date by itself:

Everybody whose work ships is added here once, and thanked for what they did in that release's notes.

And to everyone who's chipped in on Ko-fi. It goes toward what Linger costs to keep going, month after month: the servers it's built and tested on, the app stores' fees, and the website and its domain. A tip buys nothing in the app. Everybody gets all of Linger either way.

📜 License

AGPL-3.0. If you run a modified server for other people, they get the source.

About

A small, self-hosted place for a group of friends to hang out. Text+Voice rooms, presence, and file sharing. One person runs a server, your friends connect. Nothing to sell you. No company in the middle.

Topics

Resources

Contributing

Stars

14 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages