Skip to content

Linger v0.4.9

Choose a tag to compare

@github-actions github-actions released this 07 Oct 17:55
d7ddddb

Linger 0.4.9: room for a raid, and every emoji

Voice holds a raid now: 60 people in a room, and when a dozen cheer at once
you hear the six loudest instead of a wall of noise. Every room sounds better
too, because a lost packet no longer cuts a voice out for everybody. The emoji
picker has every emoji there is, Discord's :shortcodes: work, and a host can
add the server's own. Rooms stop showing as new when you've read them, and a
person who dropped out of voice stops showing up there two or three times.

Hosts: update the server. The voice fixes, emoji and read positions all
need it. This one changes the database, so going back to 0.4.8 means
restoring the backup update.sh makes. A server with no voice address set
turns voice on
after this update. For hosts has
the steps.

Everyone: update the app. A raid wants everybody in voice on 0.4.9.
Older apps keep sending silence, which costs the server, and when seven or
more people talk at once, an older app's voice is the first left out.

The highlights

  • A raid fits in one voice room (#197). Up to 60 people, up from 25. Apps
    send nothing while you're quiet, and the server passes on the six loudest
    voices at once, so twelve people cheering when the boss goes down still
    sounds like a crowd and doesn't swamp the server.
  • A lost packet doesn't stop a voice (#438). One packet lost on the way to
    the server made that person go silent for about a third of a second, for
    everybody in the room. That has happened in every voice room since 0.4.1.
  • Every emoji, and a server's own (#359). See Emoji.
  • Rooms you've read stop looking new (#453, #454), on the phone after
    it's been put away and on your other devices after you send something.
  • You show up in voice once (#451). A friend showed as "you, you, you"
    in a room's voice, because connections that had dropped kept their seats.

Voice

  • Sixty people a room (#197), up from 25. Your app sends nothing while
    you're quiet, muted or not pressing push-to-talk, the way Discord's does. It
    used to send fifty packets of silence a second, and the server copied every
    one to everybody.
  • The six loudest voices (#197). However many people talk at once, the
    server passes on the six loudest. Somebody already talking keeps their
    place unless a newcomer is clearly louder, so nobody is cut off mid-word.
  • Better sound in rooms of up to twenty (#431). Everybody sends at
    128 kbit/s, more than twice what voice used before. From twenty-one people
    the room steps down to 96 kbit/s, and back up once it's down to sixteen.
    Nobody sets it, and nobody hears the switch.
  • A lost packet doesn't stop a voice (#438). See the highlights. In a big
    room it got worse fast: with 60 people and 8 talking, listeners heard 78%
    of what was said. Now it's 99%.
  • A room filling all at once could leave somebody hearing nobody (#197).
    In about one in ten joins of 60 people at once, one person's app refused
    the server's call setup and heard silence. Fixed.
  • The voice bar in a big room (#197). With more than six people, it
    keeps six places: you, then whoever just talked, lit while they talk.
    Somebody new who talks takes the place of whoever spoke longest ago, so
    nobody jumps around while talking. Everyone in the room is a small dot in
    their own color underneath, ringed while they talk. Click the dots to see
    everyone by name, type to find somebody, and press Enter to set their
    volume. A room of six or fewer looks as it did.
  • You show up in voice once (#451). See the highlights. Behind the scenes,
    your other connections were sometimes hung up on as well, and reconnected
    so fast nobody noticed.
  • A microphone or speaker that stops working (#442) waits its half second
    before Linger opens it again. A second report of the same stop could cut
    that wait short, and the microphone could open once more just after you
    left voice.

The list on a big server

  • People shows the people you talk to (#197), on a server with more than
    twelve people here or away: anybody you've ever had a DM with. Everyone
    else folds under Everyone else, which starts folded. A smaller server's
    list is unchanged.
  • A busy room's row shows up to 16 dots, up from 5, so a full raid looks
    full.
  • One line per person, a new switch in Settings → Appearance, off to
    start. Every row in the list is one line, and a status shows when you point
    at somebody. The phone keeps two lines.

Emoji

  • Every emoji there is (#359), up from 66. Search by name or by a word
    for it ("hello" finds 👋), jump to a group with the tabs, and the emoji you
    use come back at the top. The hand beside the search sets a skin tone once.
  • Shortcodes. Type a colon and two letters, :smi, and pick from the
    list, the way @ offers people. A whole name, :smiley:, turns into 😃 as
    you type it. The names are Discord's (:thumbsup:, :slight_smile:), and
    GitHub's and Slack's work too.
  • A message of just a few emoji is drawn big, as Discord does.
  • A server's own emoji. The host (or a co-host) adds pictures in
    Settings → Emoji, and each becomes an emoji at once, named from its file:
    party-parrot.gif is :party_parrot:. Animated GIFs stay animated. Up to
    200 a server.
  • Emoji are drawn by your computer's own emoji font, so they look a little
    different on Windows and Linux, and an older Windows 10 leaves out the
    newest few dozen.

Reading

  • Coming back to the phone app no longer lights up nearly every room
    (#453). The app asked the server how far you'd read once per connection,
    and if that one ask failed, every room looked new until a restart. A phone
    coming back from the background often asked before Android had let its
    network back in. It now asks again, and asks after every fresh connection
    too.
  • Your own message no longer shows as new on your other devices (#454).
    Sending a message now marks it read on the server, for every device you
    use. A phone put away straight after sending used to lose that.
  • How far you've read only moves forward. One device can no longer pull
    back what another one read.

Linux

  • Opening Linger while it's already running no longer turns the GPU path
    off
    (#447). Opening it again from the menu left a marker behind that the
    next start took for a crash, so it switched WebKit's faster drawing off.
    Typing then ran a beat behind, and on a computer with two graphics chips the
    window could go grey. If typing has felt slow since, delete the
    gbm-off-… file in ~/.local/state/linger/ and open Linger again.
  • A computer with two graphics chips shows the app, not a grey window
    (#433). With WebKit's GPU path off (the AppImage always has it off), the
    page could draw on one chip while the window was on the other. Linger now
    sends the picture through ordinary memory in that case, which either chip
    can show.

Under the hood

  • The release's Android check shows what apksigner printed when it can't
    find a signer (T-1604). That's how this release found why the check kept
    failing: the build machine words the line differently. This release's
    .apk was built by hand from the same code and key, as 0.4.8's was, and
    the check is fixed for the next one.
  • CI's final check fails when GitHub never ran a job, instead of passing
    (#445).
  • The README has badges, a link to the website, and the website is step 5 of
    a release.

Known issues

  • Read positions don't move live between two devices that are both open.
    Read a room on the phone while the computer is open, and the computer shows
    it as new until it next connects afresh (a restart, say). Your own messages
    are fine either way.
  • The phone app doesn't update itself. Install each new .apk over the
    old one.
  • On Hyprland (Omarchy included), the mouse pointer jumps into a
    conversation that opens in a window of its own.
    The
    user guide has the two lines that turn it
    off.
  • The AppImage doesn't play AV1 videos (#358). Windows and the Arch,
    .deb and .rpm packages do.

For hosts: updating the server

Server image: ghcr.io/itsmattguenther/linger:0.4.9 (x86-64 only), also
tagged latest.

What changes for you:

  • Voice turns on by itself, if it was off. A server works out where voice
    goes from its name (LINGER_DOMAIN) now. If you never set
    LINGER_VOICE_ADDRESS, your server had no voice and now has it, as long as
    UDP 3479 is open (Voice in the host guide). To
    keep voice off, set LINGER_VOICE_ADDRESS=off (in .env, or in the
    environment: part of an older compose.yaml) before updating. If you set
    an address already, nothing changes.
  • A database change (server emoji). update.sh saves the database into
    backups/ before it starts 0.4.9, and that backup is how you'd go back.
  • Server emoji are yours (and your co-hosts') to add in Settings → Emoji.
    Friends on an older app see them as :name: until they update.
  • A raid needs everybody on 0.4.9. The server now throws away the silence
    older apps send, but they still send it, and that costs your server. An
    older app also can't say how loud it is, so when seven or more people talk
    at once, its voice is the first left out. Upload for fifty people stays near
    35 Mbps however many talk. The host guide has the
    numbers.
  • The data folder fixes itself. The image makes data writable on its
    own, so no more chown after setting up or moving a server.
  • Setting up a new server is one script, deploy/setup.sh, and every
    setting lives in .env. An older compose.yaml with its settings written
    inside keeps working, and nothing makes you move. The host guide says how,
    if you'd like to (Moving an older server's settings into
    .env
    ).

Run these on the server, one block at a time.

1. Go to the folder with your compose.yaml (the linger folder from
setup):

cd ~/linger

2. Get this release's update.sh. It now says where voice goes; an
older copy warns that a server with no voice address carries no voice, which
isn't true from 0.4.9.

curl -fLO https://raw.githubusercontent.com/itsMattGuenther/Linger/main/deploy/update.sh
chmod +x update.sh

3. Update:

./update.sh

(Use sudo ./update.sh if you type sudo before docker commands.) It
says where voice goes, downloads 0.4.9 while the server keeps running, stops
it for a few seconds to save the database into backups/, starts everything
again, and prints the version before and after.

4. Check it worked:

curl -f https://linger.example.com/api/v1/health

With your own address in place of linger.example.com, it should print
{"ok":true,"version":"0.4.9"}. Then docker compose logs linger | grep -i voice
says where voice goes, or that it's off.

If something goes wrong, update.sh prints the commands that put 0.4.8
back with the backup it just made. Going back needs that backup: 0.4.8
won't start on a database 0.4.9 has changed. Anything sent after the update
is lost when you go back, so decide soon if you're going to.

Install or update

Use the in-app update: Update… at the foot of the list, or Settings →
Account & App → Updates. Windows users should keep the same installer format
(.exe or .msi) when upgrading. Linux packages are .AppImage, .deb and
.rpm; on Omarchy or Arch, Linger updates with your system. Windows
installers are updater-signed, not Authenticode-signed; SmartScreen may still
warn about an unfamiliar app.

On Android, download Linger_0.4.9_android-arm64.apk from this release on
the phone and install it over the old one. You stay signed in. A first install
is step by step in the 0.4.8 notes.

New to Linger? Which file do I want?

Your computer Download the file ending in
Windows -setup.exe
Debian, Ubuntu or Mint .deb
Fedora, RHEL or openSUSE .rpm
Any other Linux .AppImage — make it executable and run it
macOS Not built yet — see decisions.md
Android phone _android-arm64.apk — download it on the phone
iPhone Not yet

The .msi is for companies rolling it out to many machines at once.
If you are not sure, you want the .exe.

The .sig files and latest.json are how an installed copy checks
that an update is genuine. You do not need to download them.

Windows will warn you. You get "Windows protected your PC", and
Run anyway is behind the small More info link. That is Windows
saying the installer has not been through a paid signing process. It
has not — that is a
known decision,
not a broken download.

Android will ask before installing. The phone says it won't
install apps from your browser until you allow it: tap Settings,
turn on Allow from this source, and go back. That is Android's
rule for any app that isn't from the Play Store. The phone app
doesn't update itself: install each new one from its release page,
right over the old one, and you stay signed in.

Checks on installed clients

Record OS, package type, previous and new version, and headset or microphone
with any failure. Use made-up messages, and keep private conversations out of
screenshots.

  1. Voice across two real networks (a home connection and a phone hotspot,
    say), with three or more people: everybody hears everybody, and a
    talker's voice doesn't drop out in short gaps (#438, #431).
  2. A big room, with more than six people in voice: the voice bar keeps six
    places, nobody moves while they talk, the dots light, and the everyone card
    finds a person by name (#197).
  3. Two devices in voice, then cut one's network: its seat goes within
    about four minutes, the other device stays connected, and the chat's
    voice line shows that person once (#451).
  4. Phone: read everything on the computer, leave the phone app in the
    background for a few minutes, come back: nothing shows as new. Send from
    the phone and put it away at once: the computer doesn't show that room as
    new (#453, #454).
  5. Emoji: find one by a word in the picker, type :thumbsup: in the box,
    and send three emoji alone. As the host, add a server emoji in
    Settings → Emoji and send it; somebody else sees the picture (#359).
  6. Linux, a package: open Linger from the menu while it runs, quit, open
    again. ~/.local/state/linger/ holds only running.lock (#447).
  7. Linux, two graphics chips, the AppImage: the window shows the app
    (#433).
  8. As a host with no voice address set: after update.sh, the logs say
    where voice goes, and a call works (#440).