Skip to content

Concord v0.57.0

Choose a tag to compare

@ZahakJ ZahakJ released this 25 Aug 19:01
· 220 commits to main since this release

Concord v0.57.0

Almost nothing in this release is visible. It is about what your node does
when nobody is typing — how much of your data plan it spends, how much of
your battery it holds, and one bug that could divide a guild in half without
telling anyone. If you run Concord on a phone, this is the release to take.

Guilds sync in bytes, not megabytes

A catch-up request used to say only "here is where I got to", and the answer
was rebuilt from scratch every time: the guild's icon and banner, every
member's profile with their avatar and profile banner, every custom emoji,
the whole governance log. Members ask each other for that once a minute,
forever, in both directions. Measured between two peers holding identical
state, on one guild with ordinary art on it: 677 KB per idle sync. That is
40 MB an hour, per guild, per direction, to establish that nothing had
happened.

A request now carries a list of what you already hold, and the answer is the
difference. The same guild now settles an idle sync in 863 bytes.

Past a certain amount of decoration it was not syncing at all. The response
had no budget against the 1 MiB transport limit, so a guild with a large
icon, a banner, a custom emoji and one decorated member built an answer that
could not be written — the requester read an empty stream and the guild
never caught up
. There was a point at which a guild was too decorated to
sync. The whole payload is now budgeted, in a priority order that answers
"what may a cosmetic image displace?" with "nothing": governance first, then
records, then messages, then art. Anything that does not fit comes in the
next round, and the requester asks straight away rather than waiting out the
minute.

Old and new peers interoperate in both directions; nothing here needed a
protocol version.

Your phone stops working for everyone else

A handset was running the same be-a-service-to-the-network stack as a desktop
on mains power, and paying for it out of a data plan.

  • It no longer relays other people's traffic. Carriers hand every phone a
    globally routable address, which was enough to start a relay service — so a
    friend behind a restrictive network could route an entire evening's session
    through a phone in somebody's pocket, with nothing metering it and nothing
    in the UI saying so.
  • It no longer answers reachability probes for strangers, and no longer
    builds the second network stack that service needs.
  • It keeps far fewer connections — 48 rather than the general-purpose
    default of 192 — after making sure the things that must never be dropped
    are exempt: guild members, your own linked devices, and the rendezvous
    nodes your offline mail waits on. Two of those were not protected before.
  • It searches for peers less often when the search is finding nobody.
    Discovery ran a full walk every fifteen seconds, all night, whether or not
    it ever turned anyone up. It now backs off to four minutes when rounds stop
    producing anyone new, and snaps back to eager the moment you join a guild,
    return to the app, or regain the network.
  • It knows when you are on cellular. Android now reports whether the
    connection is billed by the byte, and the discovery loops are held to a
    one-minute floor when it is. Delivery is untouched: messages, mailbox
    drains and sync run at the same speed on any network, and joining a guild
    on cellular feels exactly like joining one on Wi-Fi.
  • Its gossip keeps a phone's pace — a two-second heartbeat instead of one
    and a third of the idle chatter per topic, which for one member of one
    twenty-channel guild is forty-two meshes that each wake half as often.
    Desktops keep the tuned defaults, now written down rather than inherited.
  • Typing indicators cost nothing when no screen is on. Half a channel's
    gossip is the typing topic, and nobody reads "Sara is typing…" from a
    pocket. Backgrounding drops those meshes and keeps the message topics, so
    messages keep arriving at full speed.

A Wi-Fi permission also comes off the install screen. It existed for local
network discovery that cannot run on Android at all, so it was asking for
something nobody was getting.

A minimised window sleeps like a pocketed phone

Background pacing has worked for a year and fired on exactly one platform.
Nothing but Android ever told the node the app was off screen, so a window
minimised to the tray on Friday afternoon and a browser tab left open behind
forty others kept the full foreground cadence all weekend.

Pages now report whether anyone is actually looking. Because one node can
have several windows and tabs attached at once, the answer is a vote across
all of them — any visible window keeps the node awake, so a hidden tab can
never put a window you are typing in to sleep. Becoming visible is reported
instantly, because you are right there waiting; becoming hidden waits a
moment, because alt-tabbing through four windows does not mean you stopped
looking.

A guild that split in two now finds its way back

This is the one thing here that was ever visible, and it was visible as the
app being broken in a way nobody could name.

Two people allowed to change who is in a guild can do it at the same moment,
from the same starting point, without having seen each other's change. From
then on there are two guilds wearing one name. Each half is perfectly
consistent on its own — everyone online, everyone a member, every message
readable to the people beside you — and not one word crosses, with
nothing anywhere saying why.

It was in fact detected, and then thrown away milliseconds later: a peer on
your own half of the split would answer readably and clear the alarm,
though a peer sharing your half can tell you nothing whatever about the half
you cannot see. The verdict is now kept per peer, so only the peer that gave
evidence can withdraw it. The stranded half also had no way to find out it
was stranded, and now learns it from the requests the other half is already
sending. Repair is aimed at the people standing on the branch you need to
reach, rather than at whoever answered first.

Driven on a four-member guild forced into the state: previously nine messages
over ninety seconds, none of them crossing, no device ever showing a warning.
Now delivery across a freshly forked guild resumes in about eight seconds.

"Can people reach me?" now measures instead of guessing

Every rung of that panel read your own settings and inferred, and the
inference was wrong in both directions. A home router hands out a routable
IPv6 address and drops every unsolicited packet to it, so those users were
told people could reach them. A home server behind a port-forward holds a
private address, so the machine most obviously reachable in the whole user
base was told to go and set up a rendezvous it did not need.

The panel now leads with evidence: somebody opened a connection straight to
this computer this session, it already happened, the route demonstrably
works. Where there is no such proof the old rungs remain, reworded honestly —
"your address says people can reach you directly", with a line saying nobody
actually has yet.

The same proof now gates volunteering as a relay. A desktop only carries
other people's traffic once an inbound connection has shown it can be
reached, so friends stop holding reservations on relays that cannot carry
anything — which was the thing stopping them looking for one that worked.

Saying what is playing, for 302 bytes

Announcing a track re-sent your entire profile — avatar, banner, bio,
colours — to every guild you are in, several times per song. Measured on an
ordinary decorated profile that is 102,822 bytes to report a song title.
It is now its own small message: 302 bytes. Dragging a scrubber no longer
broadcasts at all, and an idle guild no longer re-ships your pictures every
minute for as long as the music is on.

Your profile card

All twelve card frames are redrawn — the six that were still borders now
match the six that had become places. Each has one light and a temperature to
spend it against, real texture rather than flat gradients, a shadow cast onto
the card it surrounds, and none of them is symmetrical any more. Six of the
faults fixed this pass were things that rendered perfectly and were only
caught by looking at them.

The scenes reach the whole card again. Legibility used to be bought by laying
the card's background back over the bottom two thirds, which turned a
whole-card effect into a banner with a lid on it; names now carry their own
soft halo instead, which is indifferent to what is behind them and to what
colour you picked. The frame chips in settings show the frame around a
miniature card at the right proportions, so the overhang that is the entire
identity of a frame has somewhere to go — twelve frames used to come out as
twelve thin coloured outlines.

Six new theme packs, each built on a combination the existing forty-four left
empty, and you can turn the shine off: the specular sweep across nine of
the animated packs can be switched off wholesale, while the packs where that
light is the pack keep their motion and lose only the hot core. It defaults
on, because it is a matter of taste rather than a fault.

Also

  • Push notification support is fully built and now asks the build whether it
    can run, rather than a flag nobody set. It stays off until a Firebase
    project is dropped in; docs/PUSH.md writes down exactly what that takes.
    Delivery today is unchanged — live sockets, and mail collected on open.
  • The visibility vote could fill up with ghosts on the desktop build, at
    which point a window you were looking straight at could not say so and the
    node settled to its slow beat. A full vote now makes room by dropping a
    client that reports nobody is looking.

Android sideload APK: versionCode 5700. Desktop: Linux native, Windows
native plus installer, and web binaries for every OS. macOS native still
needs the manual workflow.