| Commit message (Expand) | Author | Age | Files | Lines |
| * | style: ruff's own fixes, mechanically applied | Christophe Besson | 6 days | 1 | -1/+0 |
| * | fix(hub): stop keeping a copy of every group's file listing in the browser | Christophe Besson | 6 days | 1 | -3/+2 |
| * | fix(hub): a group whose node is down is no longer something the reader waits for | Christophe Besson | 7 days | 1 | -0/+144 |
| * | fix(hub): Search waits on a connection that stalls, not on one that is slow | Christophe Besson | 7 days | 1 | -0/+134 |
| * | auth: a sign-out during a renewal must not write half a session | Christophe Besson | 8 days | 1 | -0/+154 |
| * | spa: a blank page can never be silent again | Christophe Besson | 9 days | 1 | -0/+260 |
| * | playlists: promise the count that holds when nothing compresses | Christophe Besson | 9 days | 1 | -1/+25 |
| * | playlists: refuse a body no frame can carry, and say which one | Christophe Besson | 9 days | 1 | -0/+61 |
| * | menu: give the panel the room that is actually below it | Christophe Besson | 9 days | 1 | -1/+75 |
| * | menu: do not close on the panel's own scrolling | Christophe Besson | 9 days | 1 | -0/+216 |
| * | playlists: make the writes actually leave the browser | Christophe Besson | 9 days | 1 | -0/+160 |
| * | music: pool single-album artists into shared rows | Christophe Besson | 9 days | 1 | -0/+316 |
| * | music: the playlist menus | Christophe Besson | 9 days | 2 | -3/+423 |
| * | playlists: the store, and putting it on nodes | Christophe Besson | 9 days | 1 | -0/+296 |
| * | music: play, play next, add to queue | Christophe Besson | 9 days | 1 | -0/+308 |
| * | feat(hub): Videos and Music list their cards a page at a time | Christophe Besson | 10 days | 1 | -3/+9 |
| * | fix(ui): a group opened directly lands on the preferred app once preferences ...0.14 | Christophe Besson | 11 days | 1 | -3/+25 |
| * | fix(ui): sidebar stays above a phone's address bar and does not scroll the page | Christophe Besson | 11 days | 1 | -0/+147 |
| * | refactor(spa): stop asking a node what version it is | Christophe Besson | 2026-09-10 | 1 | -1/+0 |
| * | refactor(mnp)!: one answer to "may this member write", and it is the root | Christophe Besson | 2026-09-10 | 2 | -2/+2 |
| * | feat(hub): pin the app controls while a library scrolls | Christophe Besson | 2026-09-10 | 1 | -0/+563 |
| * | test(spa): drive the composer's recovery through the real reconnect | Christophe Besson | 2026-09-09 | 1 | -2/+43 |
| * | fix(spa): a reconnect must give the Chat composer back | Christophe Besson | 2026-09-09 | 1 | -3/+60 |
| * | feat: resume an interrupted upload, and pause one | Christophe Besson | 2026-09-09 | 1 | -2/+23 |
| * | test(hub): stop the Chrome profile cleanup racing its own children | Christophe Besson | 2026-09-08 | 5 | -5/+50 |
| * | Merge origin/main into the chat encryption work | Christophe Besson | 2026-09-07 | 2 | -104/+240 |
| |\ |
|
| | * | feat(mnp)!: seal the upload under the group key | Christophe Besson | 2026-09-07 | 1 | -0/+102 |
| | * | fix(mnp): give a reply an id, so it stops being routed by luck | Christophe Besson | 2026-09-07 | 1 | -56/+89 |
| * | | feat(chat): encrypt group chat under per-device epoch keys (MNP 2.0) | Christophe Besson | 2026-09-07 | 1 | -6/+89 |
| |/ |
|
| * | feat!: MNP 1.0 — seal index and handshake_ack under the group key | Christophe Besson | 2026-09-03 | 1 | -0/+98 |
| * | fix(hub): route the chat ack to the request that asked for it | Christophe Besson | 2026-09-03 | 1 | -0/+206 |
| * | fix(hub): fall back to the group's first app when the landing tab is absent | Christophe Besson | 2026-09-02 | 1 | -0/+185 |
| * | fix(hub): let the reader scroll up in the chat again | Christophe Besson | 2026-09-01 | 1 | -0/+222 |
| * | feat(hub): split the group UI into a pluggable "applications" architecture | Christophe Besson | 2026-08-23 | 2 | -3/+5 |
| * | fix: update source-reading tests that drifted from the code | Christophe Besson | 2026-08-22 | 2 | -3/+8 |
| * | fix: the chat tab no longer scrolls, and a group is listed or invite-only | Christophe Besson | 2026-08-18 | 1 | -0/+169 |
| * | fix(client): the desktop client runs, and running it corrected three things | Christophe Besson | 2026-08-18 | 1 | -0/+6 |
| * | fix(hub): a session that renews itself | Christophe Besson | 2026-08-17 | 1 | -0/+165 |
| * | fix(hub): the transfers panel hung off the side of a phone | Christophe Besson | 2026-08-17 | 1 | -0/+140 |
| * | test(hub): a hook that depends on one declared below it never runs | Christophe Besson | 2026-08-17 | 2 | -7/+103 |
| * | fix(hub): bound the video read-ahead by the playhead, not by the network | Christophe Besson | 2026-08-16 | 1 | -0/+159 |