Skip to content

v1.2.28 — owner alerts, sealed off-box backups, global by area, Home cards

Choose a tag to compare

@martyinspace martyinspace released this 10 Oct 10:31
69b2560

📦 How to Install / Upgrade

BeanPool is distributed as a Docker container. You can pull the latest version directly from the GitHub Container Registry.

Using Docker Compose:

services:
  beanpool:
    image: ghcr.io/beanpool-org/beanpool-node:1.2.28
    restart: unless-stopped
    ports:
      - "80:8080"
      - "443:8443"
      - "4001:4001"
      - "4002:4002"
    volumes:
      - ./data:/data

Using Docker CLI:

docker pull ghcr.io/beanpool-org/beanpool-node:latest

What's Changed

  • test(server): author-off-board suite stops the pricing aggregator that raced its plan check by @martyinspace in #1347
  • Key vault V3: image and releases (reproducible boot file, two-signature releases, API handover, custodian tool) by @martyinspace in #1314
  • One public-URL resolver for every caller; the open door's counters on the Onboarding screen by @martyinspace in #1345
  • chore(tests): test-all gives native and core vitest a 30 s timeout under load by @martyinspace in #1351
  • Publish the guide: operator manual v79 → v80 by @martyinspace in #1352
  • fix(photos): key the photos of group and direct listings on public-read nodes by @martyinspace in #1348
  • Publish the guide: operator manual v80 → v81 by @martyinspace in #1353
  • Key vault V4: the phone deposits and restores its sign-in copy with the vault by @martyinspace in #1336
  • C12: the open door's key leaves the database for a file, like the recovery seal's key by @martyinspace in #1350
  • Publish the guide: members' guide v89 → v90, operator manual v81 → v82 by @martyinspace in #1355
  • Small follow-ups: pricing guide counts board listings only, photo-key comments, C12 rollback key limit by @martyinspace in #1356
  • Key vault: sign releases, deposit receipts and every answer the phone acts on (gate 4 of V4) by @martyinspace in #1354
  • Paged copies P2: the standby builds each whole copy in pages in a staging database and swaps it in at a restart by @martyinspace in #1334
  • Publish the guide: operator manual v82 → v83 by @martyinspace in #1358
  • test: split test-standby-paged-copies into the copy steps and the swap-at-boot steps by @martyinspace in #1359
  • Vault phone gates: finding 3, N1 and N2 (a vault build's restore falls back on a signed "no copy"; "no copy" lasts a week) by @martyinspace in #1357
  • fix(pricing): the guide skips listings hidden by reports, paused or cancelled by @martyinspace in #1365
  • Paged copies P4: listing photos travel by reference; the accounts' bytes don't block deltas by @martyinspace in #1370
  • Publish the guide: operator manual v83 → v84 by @martyinspace in #1373
  • test(server): money-limits flake — a new connection per request, and a failed fetch says why by @martyinspace in #1372
  • fix(server): re-key, invite and pairing codes stay out of the logs by @martyinspace in #1375
  • Money: a late pledge is never stranded; an open deal's price is frozen by @martyinspace in #1374
  • Publish the guide: members' guide v90 → v91 by @martyinspace in #1380
  • Local communities: the remaining people reads become members-only (privacy F1, F2, F3, F5) by @martyinspace in #1376
  • 📱 Expo: [compatibility] Export ErrorBoundary in node-mismatch.tsx by @martyinspace in #1360
  • ✨ Flow: [manager UX] add loading indicator for ReplicationAccessPanel by @martyinspace in #1361
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel to invite people button by @martyinspace in #1362
  • 🔨 Forge: [reliability] catch errors in bulk post deletion route by @martyinspace in #1371
  • chore(jules): register the 2026-10-01 batch's closes by @martyinspace in #1383
  • 🗺️ Atlas: [manager tests] add SuggestChangePanel component tests by @martyinspace in #1366
  • P4 follow-ups: a take-over stops every fetch path; one scrypt per password copy; a failed first copy waits and keeps its photos by @martyinspace in #1378
  • docs(operators): what a visitor's live-updates socket still hears by @martyinspace in #1382
  • Publish the guide: operator manual v84 → v85 by @martyinspace in #1385
  • fix(money): a listing edit can't poison balances with NaN; ledger, schema and importer refuse non-finite amounts by @martyinspace in #1379
  • Admin auth: the break-glass code only enrols; key sign-in 2FA braked; invite redeem signed by the key it registers by @martyinspace in #1377
  • Publish the guide: operator manual v85 → v86 by @martyinspace in #1386
  • DoS hardening: WebSocket caps, the signature claim bucket, cached peer reads, a bounded nearest-first pass, server timeouts by @martyinspace in #1384
  • Backups: restore, download and replication tokens are owner-only; restore checks what it's given by @martyinspace in #1381
  • Publish the guide: operator manual v86 → v87 by @martyinspace in #1387
  • Honest wording: who can open the sign-in copies a community and the vault hold by @martyinspace in #1389
  • deploy.sh packs only git-tracked files; add .dockerignore by @martyinspace in #1388
  • Expo pushes carry our access token when the node has one by @martyinspace in #1390
  • Publish the guide: members' guide v91 → v92, operator manual v87 → v88 by @martyinspace in #1395
  • Global node: invites off, so the sign-in door is the only way in by @martyinspace in #1391
  • Post photos: no key collisions between posts, and members-only photos aren't cached publicly by @martyinspace in #1393
  • V5 PR 2: the phone uses the global door's advertised vault keys, with a one-time backstop by @martyinspace in #1396
  • Groups: a suspended convenor's powers rest until the suspension ends; no Decision removes or suspends an owner or admin by @martyinspace in #1394
  • V5 PR 1: global's door accepts key vault tickets (server) by @martyinspace in #1397
  • Delete account blanks the member's group, enterprise, event and DM lines and photos, and empties the WAL by @martyinspace in #1392
  • Publish the guide: members' guide v92 → v93, operator manual v88 → v89 by @martyinspace in #1400
  • Notifications say nothing private and carry the community's signature (push design steps 1 and 3) by @martyinspace in #1398
  • One phone, several communities: own cache file each, no signature downgrade, no membership oracle by @martyinspace in #1399
  • Community modes slice 1: the door (who may invite), with Invite / Known presets in Settings by @martyinspace in #1401
  • Join the global community from an account you already have (phone; server keeps a joining federation visitor local) by @martyinspace in #1402
  • Publish the guide: members' guide v93 → v94, operator manual v89 → v90 by @martyinspace in #1409
  • Data at rest: snapshots on the main server only and capped; the log keeps 30 days and loses a deleted member; their picture gone from memory by @martyinspace in #1404
  • The phone blanks a deleted member's older direct messages itself by @martyinspace in #1407
  • Registrar: ?n= vouches only for a live name, capped fields, 3 names per key, a v2 nonce, no Cloudflare ids in errors by @martyinspace in #1410
  • The app checks a notice's signature before acting on it, and posts local notices from its own sync (push design step 4) by @martyinspace in #1406
  • test: fix two flaky tests (guide-versions cleanup, wash-trading first-send) by @martyinspace in #1412
  • Tier A (replication): a stopped whole copy no longer deletes the next copy's staging; standby suite flakes by @martyinspace in #1405
  • Blocking someone stops their messages and notifications on the server, not just on your screen by @martyinspace in #1403
  • Publish the guide: members' guide v94 → v95, operator manual v90 → v91 by @martyinspace in #1420
  • chore: spell the app name BeanPool, one word by @martyinspace in #1419
  • test: stop suite nodes asking GitHub for the latest release (flaky standby-devices / standby-in-flight) by @martyinspace in #1417
  • Tier A: the limiter cap keeps the buckets that limit someone; claim: charged only for bodies read past 16 KiB; /api/version asks git once; an update-check switch for operators by @martyinspace in #1421
  • test-push-notices: no more random failures from hex that contains '1234' by @martyinspace in #1424
  • Phone app: App Lock covers pop-ups and the app switcher; Pulse sign-in tokens are this-device-only and cleared on Sign Out by @martyinspace in #1413
  • Key vault: backups off the box (S3-compatible, two custodians set it) and alerts when it locks or backups stop by @martyinspace in #1414
  • test(standby): step 10 says requests "sent after" the confirm, not "reached" by @martyinspace in #1423
  • Global abuse: reports weighted by standing and independence (no report rings), polls labelled informal on global, 3 knocks a day by @martyinspace in #1416
  • Tier A (global limits): the global node's socket caps, 600 a minute for visitors, the "no room" close, joins not broadcast by @martyinspace in #1422
  • Beans from someone you've blocked arrive without their note by @martyinspace in #1426
  • Web manager: the admin password off the web app's origin, Settings under the strict CSP, CSRF bound to its session, no ?auth= on the logs socket, no credentialed CORS on admin routes by @martyinspace in #1418
  • Publish the guide: members' guide v95 → v96, operator manual v91 → v92 by @martyinspace in #1429
  • Push tokens locked at rest: token_id and token_box under the recovery-seal key (push design step 2) by @martyinspace in #1408
  • Tier A: any node can send its sealed backups off the box, on a schedule, to S3-compatible storage its operator chooses by @martyinspace in #1427
  • test(server): fix flaky check 13 in test-blocks-on-messaging (key order fixture) by @martyinspace in #1432
  • Supply chain: actions pinned by SHA, least-privilege tokens, install scripts allow-listed, each release waits for Marty's approval by @martyinspace in #1430
  • Force updates that never interrupt: a safe-moment block, per-platform floors held for the store, the app's version in the ping by @martyinspace in #1415
  • Follow-ups to #1430: wider :latest guard, release approval note, install-script wording by @martyinspace in #1438
  • Global: clean up a burst of accounts in one action — see who joined from one connection within a day, hide their posts (undo) or remove them, with a guard (S9) by @martyinspace in #1431
  • Tier A: registrar M3 — a swapped origin behind a live name is paused (D2), a leaked token's connector can't hide, the holder can rotate; paused names self-heal by @martyinspace in #1428
  • Standby: a failed take-over rolls back instead of looping; two standbys from one envelope can't both be main by @martyinspace in #1433
  • Tier A: the global node's 12-words door with door work (core + server): escalating cost instead of 5/h 20/day by @martyinspace in #1425
  • Publish the guide: members' guide v96 → v97, operator manual v92 → v93 by @martyinspace in #1447
  • Force-update follow-ups: a door's prompt is a leave on every phone, the add-words page clears the keyboard, guide wording (#1415 review 3) by @martyinspace in #1443
  • Reports on a post act on its author; a report on a post that isn't here is refused; burst undo reaches a fixed point by @martyinspace in #1444
  • fix(native): polls get their own heading on the nearest-first Market feed by @martyinspace in #1451
  • fix(native): a block's report is dropped only on the node's own refusal by @martyinspace in #1450
  • Standby: a take-over the next start rolls back never boots the database as the main server by @martyinspace in #1448
  • Standby: a take-over finished in place stops where a main server's boot refuses, and sweeps settled escrows by @martyinspace in #1453
  • Security storm smalls: TOTP once, strict Ed25519, literal searches, thresholds in range, no internal text to members, retired backup proxy gone by @martyinspace in #1457
  • Replication manifest: classify doorNumbers.* as this server's own by @martyinspace in #1459
  • CI flakes: photos-by-reference fd, standby-health push title, G11-c 'only', Node 22 keep-alive, registrar clock skew, tunnel fake port by @martyinspace in #1460
  • Standby copies: a broken photo backs the whole copy off; what a failed pull fetched stays; Settings says what it waits on (F4, F5) by @martyinspace in #1455
  • Money follow-ups from #1379 and #1374: refunds, plain refusals, quantities at every door, take-over badBalances, no pledge box on a funded enterprise by @martyinspace in #1445
  • Storm smalls follow-ups: strict Ed25519 on the phone, no address in thumbnail refusals, net tested as mounted by @martyinspace in #1461
  • Tier A: the global node's two doors in the web app (S5): 12 words or a sign-in, door work in a same-origin Web Worker, add a sign-in later by @martyinspace in #1449
  • Publish the guide: members' guide v97 → v98, operator manual v93 → v94 by @martyinspace in #1468
  • Standby copies: progress resets the back-off; guide wait made true; retries suite on S's clock (#1455 follow-ups) by @martyinspace in #1462
  • Tier A: polls on the global node say how many votes came from new or 12-word accounts, stamped at the vote (global-abuse LOW-7); the rest of the review measured by @martyinspace in #1458
  • The member list costs the server only what changed: a phone's sync no longer reads every member by @martyinspace in #1467
  • The health ping no longer counts every member's photo: a phone's 30-second check costs the server almost nothing by @martyinspace in #1469
  • A Pulse fetch whose connect fails at once no longer crashes the node by @martyinspace in #1464
  • fix(web): a browser with no IndexedDB still reads the public pages by @martyinspace in #1463
  • Direct messages: bind the sender and the message id into the encryption (crypto review M F2) by @martyinspace in #1446
  • 🎨 Palette: [a11y] add focus rings to EventChat composer and send button by @martyinspace in #1434
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel and hint to propose project submit button by @martyinspace in #1435
  • ⚡ Bolt: [perf] single-pass RSVP processing in getPosts by @martyinspace in #1436
  • 🗺️ Atlas: [manager tests] add ColdStartWizard onCancel and print card unit tests by @martyinspace in #1437
  • ✨ Flow: [manager UX] add loading states for EconomySection enterprises and proposals by @martyinspace in #1440
  • 📱 Expo: [compatibility] Export ErrorBoundary in recover-identity.tsx by @martyinspace in #1441
  • 🔨 Forge: [reliability] return 404 when deleting non-existent commons project by @martyinspace in #1439
  • 🔎 Scout: [test coverage] owner lock open check by @martyinspace in #1442
  • Commons pot: a row holding no number is never overwritten; nothing is paid from a pot that isn't one (#1445 NB-1..3) by @martyinspace in #1465
  • Sign-in copies: sealed to the restoring device, live-only, no pings or evictions, kid refetch throttled (FABLE-sec-sso 2-5) by @martyinspace in #1456
  • perf(server): on global a card edit goes to its circle only; a visitor's board read 3.6× cheaper; the member list never misses a role, vouch or badge by @martyinspace in #1470
  • test(blocks-on-beans): deterministic §8 whatever the suite speed by @martyinspace in #1473
  • Home H1: home.layout and interests preferences (own-read, replicated) by @martyinspace in #1471
  • Commons pot pause follow-ups: mixed bulk removal, infinite grant cap words by @martyinspace in #1474
  • Home dashboard H0 + H0b: GET /api/home, the Home screen in one read (beans and deals cards) by @martyinspace in #1472
  • Tier A: the global node's 12-words door in the phone app (S4): two ways in, door work on expo-crypto, Safety Backup + one-way-back card, add a sign-in later by @martyinspace in #1452
  • Guide and manual for the two doors (S6): 12 words or a sign-in, one way back, a new account's limits and why, the door's numbers by @martyinspace in #1454
  • fix(web): wrong-clock 401 at the web door says to check this device's date and time by @martyinspace in #1476
  • Publish the guide: members' guide v98 → v99, operator manual v94 → v95 by @martyinspace in #1477
  • Where Beans are off, the daily Sybil audit no longer freezes the node by @martyinspace in #1466
  • perf(server): members' photos out of their rows; the member list no longer reads a photo (global node crash) by @martyinspace in #1475
  • test(server): split the take-over crash-then-fails suite in three, each well inside the runner's 300 s by @martyinspace in #1480
  • test(pwa): the global door check reads the tour photo from member_photos by @martyinspace in #1481
  • perf(server): big groups' rosters and every list send photo URLs, not photos (global node crash, #1478) by @martyinspace in #1484
  • chore(scripts): Sonnet 5.5 replaces Sonnet 5 (lane review default, feedback digest) by @martyinspace in #1485
  • docs(lanes): AGY brief rules — poll long commands, never end the turn while one runs by @martyinspace in #1487
  • test(server): split the schema-upgrade suite in three, each well inside the runner's 300 s by @martyinspace in #1488
  • chore: comments name the split schema-upgrade suites (#1488 follow-up) by @martyinspace in #1489
  • docs: global heavy lists under concurrency — measurements and design by @martyinspace in #1491
  • perf(server): the last lists that sent photo bytes (crowdfunds, group pictures) send URLs (#1486) by @martyinspace in #1490
  • Home H3: the web Home page and the lobby's visitor Home (one request, 304s, Edit home, axe-clean at 320 px) by @martyinspace in #1479
  • fix: group descriptions (and other list text) get a size limit (#1493) by @martyinspace in #1494
  • Publish the guide: members' guide v99 → v100 by @martyinspace in #1495
  • Tier A: Home H2 — the phone's Home tab the app opens on (one /api/home read, cards, tailoring, interests, the header reads Home) by @martyinspace in #1483
  • Publish the guide: members' guide v100 → v101 by @martyinspace in #1507
  • docs(jules): register the 2026-10-03 batch's closed PRs by @martyinspace in #1509
  • 📱 Expo: [compatibility] export ErrorBoundary in door-work-probe.tsx by @martyinspace in #1500
  • 🎨 Palette: [a11y] InstallPrompt touch target sizing and test coverage by @martyinspace in #1501
  • 🔎 Scout: [test coverage] money-limits-gate by @martyinspace in #1505
  • test(pwa): the lobby restore waits for Join to be enabled (a CI race from #1479) by @martyinspace in #1508
  • Community modes slice 2: the names list, encrypted to the admins' keys, and confirming a member by @martyinspace in #1411
  • Publish the guide: members' guide v101 → v102, operator manual v95 → v96 by @martyinspace in #1513
  • Home H4: the global flavour on the phone (Find your community on Home, global steps, joined count, Near you by distance) by @martyinspace in #1511
  • Bump the app to v1.2.57 (android 279 / ios 221) by @martyinspace in #1514
  • fix(native): the Market's fresh-listings banner reads its words, not the emoji (from #1499) by @martyinspace in #1516
  • docs(guide): Home H5 — the guide describes the Home tab by @martyinspace in #1510
  • Publish the guide: members' guide v102 → v103 by @martyinspace in #1518
  • fix: text limits follow-ups (#1496) by @martyinspace in #1498
  • perf(server): a cap on heavy list reads, so a burst can't kill the node (global heavy lists, slice 1) by @martyinspace in #1492
  • The 12 words as a recovery kit: print it or save it as a PDF (phone and web) by @martyinspace in #1519
  • Publish the guide: members' guide v103 → v104 by @martyinspace in #1521
  • Key vault image: a build-time static network setting for hosts without DHCP (1984 VPS #1) by @martyinspace in #1522
  • The names list survives Sign Out and a new phone: a locked copy on the node, sealed to each admin's own key by @martyinspace in #1520
  • Publish the guide: operator manual v96 → v97 by @martyinspace in #1525
  • Global heavy lists, slice 2: one shared directory answer per version (gzip, ETag), so a burst of readers costs one build by @martyinspace in #1523
  • Global heavy lists, slice 3: shared roster answers per group and view (exact version, digest ETag, under the cap) by @martyinspace in #1526
  • names-copy test: a flipped signature always changes its bytes (1-in-16 CI flake) by @martyinspace in #1533
  • beanpool recover: make a member owner from the server's shell, announced and logged, clearing no setting by @martyinspace in #1528
  • QR sign-in: the phone asks "did you just open Settings?", shows where and when; the computer types the phone's two digits by @martyinspace in #1527
  • Node sign-in step 5: key sign-ins skip the server's 2FA code; step-up unlock for owner changes from the phone; App Lock on for role holders by @martyinspace in #1530
  • Public address: only an owner reads the tunnel token or changes the address by @martyinspace in #1535
  • Node sign-in step 6: the admin password needs a second factor (soft gate: 2FA card first; keys never gated) by @martyinspace in #1537
  • door-work timing test bound CI can meet; sign-in comments without the removed 2FA code by @martyinspace in #1538
  • Node sign-in step 3: break-glass codes from Settings and the app, 2FA backup codes for an owner with a current code by @martyinspace in #1529
  • Manual: an owner's key does everything the password does (except changing the password) by @martyinspace in #1539
  • Claim a node with a one-time claim code (sign-in step 8, stage A: server only, beside the password) by @martyinspace in #1532
  • Claim v2: the phone proves the claim code without sending it (stage B1, stacked on #1532) by @martyinspace in #1536
  • Node sign-in step 7a: owner automation tokens (scoped, shown once, revocable, never owner-only) + Settings card by @martyinspace in #1540
  • beanpool claim: set the community's address first, then show the claim code and a QR for the phone by @martyinspace in #1542
  • Cap admin bulk post delete at 200 per request, and have the manager and settings page send it in batches by @martyinspace in #1544
  • Node sign-in step 8, stage B3: the phone's Claim a community (native only; needs a phone build) by @martyinspace in #1543
  • A new group with a picture keeps the stamp it was made with (fixes a same-millisecond flake) by @martyinspace in #1547
  • Setup wizard step 2: an owner signed in with their phone key is told they are the owner, with no 2FA setup (claim stage B5) by @martyinspace in #1545
  • Manager: the unclaimed card before sign-in, with a claim QR and the password under a fold (sign-in step 8, stage B4) by @martyinspace in #1541
  • Re-key codes wait for Manage again, the node inbox is owners only, and the connection log shows no member content by @martyinspace in #1546
  • Fleet manager signs in to a node with an owner automation token instead of the admin password (node sign-in 7b-1) by @martyinspace in #1549
  • Break-glass follow-ups: signing out everywhere retires an owner's code, no-store on refusals, the app keeps no copy by @martyinspace in #1548
  • The harvester and the operator scripts can use an owner's automation token instead of the admin password by @martyinspace in #1550
  • 🗺️ Atlas: [manager tests] add unit tests for node-claim lib by @martyinspace in #1556
  • 🎨 Palette: [a11y] add focus ring styling to OwnerUnlockCard buttons by @martyinspace in #1552
  • 🔎 Scout: [test coverage] member-error-text by @martyinspace in #1554
  • ⚡ Bolt: [perf] O(1) group lookups in MapPage audience notices by @martyinspace in #1555
  • Token timing test: re-measure before failing, so a busy CI runner can't fail it by @martyinspace in #1561
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel to recovery words submit button by @martyinspace in #1558
  • Break-glass test: use this 2FA step and the next, so a step rollover can't fail main by @martyinspace in #1562
  • With two-factor sign-in off, the admin password sent with a request no longer opens admin routes (sign-in step 7c) by @martyinspace in #1551
  • Sign-in step 7c follow-ups: the legacy Settings page, the fleet manager and setup-backup.mjs explain a refused password; tighter tests by @martyinspace in #1564
  • test-heavy-read-cap: a 24-reader run whose memory shrank no longer sets a negative bound (CI flake) by @martyinspace in #1565
  • beanpool claim follow-ups: the install's name request ends once an address is held, backs off in an outage, and the hand-off file, --contact and --key are hardened by @martyinspace in #1566
  • Evacuated photo rows keep their updated_at watermark when moved in the same millisecond by @martyinspace in #1568
  • Only admins can read a node's peer links: GET /api/local/connectors, and the links in /api/local/dashboard by @martyinspace in #1570
  • A working "Sign out everywhere" in Settings and the app; tokens and the password can't sign out the wrong person by @martyinspace in #1563
  • A late registrar answer never moves a community off the name its owner set; a page in front of the registrar no longer ends a claim request by @martyinspace in #1572
  • Unclaimed card follow-ups: QR node address from node, keep password fold open, docs accuracy by @martyinspace in #1569
  • Owner scripts and harvester: the five follow-ups from #1550's review by @martyinspace in #1571
  • Publish the guide: operator manual v97 → v98 by @martyinspace in #1574
  • Hide snapshot schedule form while unknown and check manager API routes case-insensitively by @martyinspace in #1567
  • The live log stream ends with the sign-in that opened it by @martyinspace in #1573
  • No registrar answer moves a community onto a second name its key holds; Take offline and rotate name and guard their name by @martyinspace in #1576
  • Owner scripts: standby .env 0600, ADMIN_PASSWORD from the environment, no secrets in the Settings backup command, no credential through a redirect by @martyinspace in #1575
  • Log streams opened with the password end when the password, its 2FA or break-glass changes; log sockets' inbound frames make no traffic line by @martyinspace in #1577
  • Bump the app to v1.2.58 (android 280 / ios 222) by @martyinspace in #1578
  • Harvester and standby never follow a redirect with a credential; clearer redirect and setup-backup 2FA messages by @martyinspace in #1580
  • Address race residuals: no revive after Take offline, signed ?name=, rotate 409 wording by @martyinspace in #1579
  • Website: 'Not a Crypto App' at the end of What BeanPool Isn't by @martyinspace in #1581
  • A 2FA session ends when the password or 2FA it was made under changes by @martyinspace in #1582
  • Turned-away names kept as a bounded list; Settings shows and releases the install's late name by name by @martyinspace in #1583
  • Publish the guide: operator manual v98 → v99 by @martyinspace in #1584
  • Home on server older than GET /api/home: show server needs an update instead of unreachable by @martyinspace in #1586
  • App works with a community still on an older server: its info read goes unsigned, the socket asks first, an old server's refusal is signed again once by @martyinspace in #1585
  • A deploy no longer shows owners an unclean shutdown; a real crash still does by @martyinspace in #1590
  • An owner can retire the admin password for good by @martyinspace in #1587
  • Make timing-sensitive server tests robust on loaded CI machines by @martyinspace in #1596
  • Report refused redirect as 'redirect' with host rather than 'network' by @martyinspace in #1594
  • Manage from Home's NEEDS YOU opens Settings signed in: no stale Android tab, and a link that can't be used says so by @martyinspace in #1592
  • Publish the guide: operator manual v99 → v100 by @martyinspace in #1600
  • An invite bound to a name: joining with it confirms you against your entry (community modes slice 3) by @martyinspace in #1589
  • A server whose admin password is retired can't turn its 2FA back on, and Settings stops offering it by @martyinspace in #1598
  • Releasing a name by name never lets go of the record's current name; a claim and a release of the same name never overlap (#1583 follow-ups) by @martyinspace in #1591
  • A new server has no admin password: its first owner claims it with the claim code by @martyinspace in #1595
  • Retry test-clean-stop child node start on port collision by @martyinspace in #1601
  • Re-Key: opening the window never makes a code, and an unused code can be cancelled by @martyinspace in #1588
  • Publish the guide: members' guide v104 → v105, operator manual v100 → v101 by @martyinspace in #1602
  • The known floor: confirmed members in a known community get a credit line the owner sets, one offer unlocks it, admins can lower or freeze one member's by @martyinspace in #1593
  • Debts and a second chance: a departed member's debt stays on their names-list entry until it is paid back, worked off or forgiven by @martyinspace in #1597
  • Community health panel and consent at joining: totals for admins, exceptions only for confirmed members who agreed, every opening logged by @martyinspace in #1599
  • Publish the guide: members' guide v105 → v106, operator manual v101 → v102 by @martyinspace in #1603
  • test-pulse-resolver stops failing since 4 Oct 10:00Z: the pruned item has a fixed old date by @martyinspace in #1606
  • Dispute chat shows only this trade's notices, and the consent says what the fraud alerts really fire on (wording 4) by @martyinspace in #1604
  • Publish the guide: members' guide v106 → v107, operator manual v102 → v103 by @martyinspace in #1607
  • chore(native): bump to v1.2.59 (android 281 / ios 223) by @martyinspace in #1605
  • Every admin look at the disputes and the fraud alerts is logged; member stats show only the community's trade totals by @martyinspace in #1608
  • Publish the guide: members' guide v107 → v108, operator manual v103 → v104 by @martyinspace in #1609
  • Community health on the phone shows the totals and who looked at trades and alerts; the Profile Photo sheet's button is no longer cut off by @martyinspace in #1610
  • A vote on removing a member shows their balance only to those who can vote in it, and the consent says which looks are logged by @martyinspace in #1613
  • Admins can lower, freeze or restore one member's known floor from the Manager's member screen by @martyinspace in #1614
  • Paying the Commons is safe to retry: the same payment sent twice is paid once by @martyinspace in #1615
  • Publish the guide: members' guide v108 → v109, operator manual v104 → v105 by @martyinspace in #1618
  • Node state files are written whole or not at all; a broken local-config.json is read from its last good copy, never as a new install by @martyinspace in #1616
  • ⚡ Bolt: [perf] O(1) pending transaction lookup in PWA Escrow banner by @martyinspace in #1617
  • Withdraw and I agree show what was saved, a frozen credit line says so, and the consent text reads on a phone by @martyinspace in #1612
  • Jules register: today's three closes, and #1617 noted as merged by mistake by @martyinspace in #1628
  • 📱 Expo: [compatibility] export ErrorBoundary in profile-setup screen by @martyinspace in #1619
  • 🎨 Palette: [a11y] Add focus-visible rings to KnownConsentCard buttons by @martyinspace in #1620
  • 🔎 Scout: [test coverage] viewer-helpers by @martyinspace in #1622
  • 🗺️ Atlas: [manager tests] TotpSetupGate component unit tests by @martyinspace in #1624
  • ✨ Flow: [manager UX] Add loading state indicator for AutomationTokensPanel by @martyinspace in #1625
  • 📱 Expo: [compatibility] Export ErrorBoundary and refine route parameters in settings-signin screen by @martyinspace in #1560
  • A broken node key stops the start instead of making a new identity; key files are private; a .bak from the first start by @martyinspace in #1627
  • Debts in the apps: an entry's debt history and how to settle it, a member's repayment and Pay the Commons; the names list opens short by @martyinspace in #1611
  • Publish the guide: members' guide v109 → v110, operator manual v105 → v106 by @martyinspace in #1629
  • Server image builds again: loadOrCreateIdentity names its return type by @martyinspace in #1630
  • Known floor panel shows its changes and hides controls the node would refuse; a token's look names the token by @martyinspace in #1631
  • Publish the guide: members' guide v110 → v111, operator manual v106 → v107 by @martyinspace in #1632
  • The phone Ledger's top part scrolls with the page, so Pay the Commons and the Levels / Wallet tabs can be reached on a small phone by @martyinspace in #1633
  • Ledger guard test catches the header moved back or pinned; the comment says one list by @martyinspace in #1634
  • A known-floor change that changes nothing writes no log line (the same amount, a freeze of a frozen line, the default where it is) by @martyinspace in #1635
  • Community health no longer says "check your connection" when the server answered with an error; the avatar row scrolls clear of the footer by @martyinspace in #1636
  • Keeper join requests tell the lead keeper only whether the applicant can back their pledge, not how much they have by @martyinspace in #1638
  • Publish the guide: members' guide v111 → v112 by @martyinspace in #1639
  • A new server stopped during its first start can start again; each start-stop says how to go on with no backup by @martyinspace in #1637
  • Publish the guide: operator manual v107 → v108 by @martyinspace in #1641
  • A keeper request's standing check reads instead of writing, so the lead keeper's pages never fail or wait on a write by @martyinspace in #1640
  • Start-stop messages: only an address-service name pauses on a new node key; an address on your own domain is not affected by @martyinspace in #1642
  • Publish the guide: operator manual v108 → v109 by @martyinspace in #1643
  • The Ledger's badge and Levels card show one level, with the trust figure from the node's own tier by @martyinspace in #1644
  • Update check reads only node releases (v1.2.27), so a vault release can never look like a newer node; a vault tag no longer starts the node image release by @martyinspace in #1648
  • Faster hot reads: member checks compile their statements once, and a board read works out each author's badge once by @martyinspace in #1649
  • Signed requests no longer walk every spent nonce: expired nonces are freed from an expiry heap (server and vault) by @martyinspace in #1647
  • docker-compose passes PRIVATE_PREVIEW to the node by @martyinspace in #1650
  • Private preview: a node setting that lets in only its members and the owner's or admins' invites, so global can drop Cloudflare Access by @martyinspace in #1645
  • Publish the guide: operator manual v109 → v110 by @martyinspace in #1651
  • The vault custodian tool no longer quits silently at "Type yes" on a real terminal by @martyinspace in #1646
  • Tests pin tierCredit on a member's own balance read, and the release-tag guard as the release job's first step by @martyinspace in #1652
  • A cancelled or removed listing's photo stops loading for anyone who can no longer see the listing by @martyinspace in #1653
  • Photo store writes off the event loop (putAsync) and remembered avatar URL keys by @martyinspace in #1654
  • A removed listing's photo URL is no longer handed out in trades, chats or the pricing guide to people who can't load it by @martyinspace in #1655
  • Members' faces come back on the phones' next sync when a private preview is turned on or off by @martyinspace in #1656
  • Publish the guide: operator manual v110 → v111 by @martyinspace in #1667
  • 🗺️ Atlas: [manager tests] add UnclaimedCard component unit tests by @martyinspace in #1657
  • ✨ Flow: [manager UX] Add loading indicator for CommunityHealthPanel by @martyinspace in #1660
  • 📱 Expo: [compatibility] export ErrorBoundary and refine search parameters in invite.tsx by @martyinspace in #1659
  • 🔎 Scout: [test coverage] visitor-allowlist by @martyinspace in #1664
  • 🔨 Forge: [reliability] catch errors in tombstone pruning GC by @martyinspace in #1661
  • 🛡️ Sentinel: [security] enforce participant check on message edits by @martyinspace in #1662
  • Jules register for the 6 Oct batch, and #1662's edit comment by @martyinspace in #1668
  • Vault: no monthly restart; two custodians restart it for a new image when ready to unlock by @martyinspace in #1669
  • 🔎 Scout: [test coverage] enterprise-text by @martyinspace in #1674
  • 🗺️ Atlas: [manager tests] OwnerPhoneBanner component unit tests by @martyinspace in #1673
  • 📱 Expo: [compatibility] Export ErrorBoundary in apple-probe.tsx by @martyinspace in #1672
  • 🎨 Pixel: [native a11y] add accessibilityHint to event submit button by @martyinspace in #1677
  • Jules register for the 7 Oct batch by @martyinspace in #1678
  • Roadmap: Stellar anchoring without co-signers; anchored off-server backups by @martyinspace in #1679
  • Vault image: file modes no longer depend on the caller's umask (vault-v1.0.0 booted with no network) by @martyinspace in #1681
  • 🔎 Scout: [test coverage] post-fields by @martyinspace in #1683
  • 🗺️ Atlas: [manager tests] add useClaimState hook unit tests by @martyinspace in #1688
  • 📱 Expo: [compatibility] export ErrorBoundary in google-probe.tsx by @martyinspace in #1689
  • Jules register: the six closes from the 8 Oct batch by @martyinspace in #1691
  • Vault image: a fast test that build.sh hands mkosi the right file modes under umask 077 by @martyinspace in #1692
  • Phone asks for the members again from the same point when the community was too busy to answer by @martyinspace in #1693
  • Home: a Tips card for newcomers, one tip at a time (both apps) by @martyinspace in #1694
  • Publish the guide: members' guide v112 → v113 by @martyinspace in #1695
  • chore(native): bump to v1.2.60 (android 282 / ios 224) by @martyinspace in #1696
  • Home cards: one catalogue in core, and the node keeps a member's card list as sent (F0 + F1) by @martyinspace in #1697
  • test(web): the Tips landing test waits for the record it checks by @martyinspace in #1698
  • Home on the phone: add a card from a picker, remove or move it, and keep your own list (F2) by @martyinspace in #1699
  • Publish the guide: members' guide v113 → v114 by @martyinspace in #1700
  • 🎨 Pixel: [native a11y] Add accessibilityHint to group invite landing action button by @martyinspace in #1702
  • 🔎 Scout: [test coverage] pricing-guide-admin by @martyinspace in #1706
  • ✨ Flow: [manager UX] Add loading state indicator for OffboxBackupsPanel by @martyinspace in #1707
  • 🗺️ Atlas: [manager tests] add report dismissal and telemetry metric parsing unit tests for ThreatReviewModal by @martyinspace in #1708
  • Jules register: five closes from 9 Oct by @martyinspace in #1712
  • 🛡️ Sentinel: [security] validate crowdfund project expiry date format by @martyinspace in #1705
  • One deadline check for every route that makes a project, including /api/enterprise by @martyinspace in #1713
  • Home on the web: add a card from a picker, remove or move it, and keep your own list (F3) by @martyinspace in #1701
  • Publish the guide: members' guide v114 → v115 by @martyinspace in #1714
  • Home: an edit made while the first save on an unknown list is out is no longer lost (web and phone) by @martyinspace in #1715
  • Home: a saved search shows its listings (web and phone) by @martyinspace in #1716
  • Publish the guide: members' guide v115 → v116 by @martyinspace in #1718
  • Home: a sun and moon card, worked out on the phone (web and phone) by @martyinspace in #1720
  • GitHub ready for launch: issue forms, support page, code of conduct, private security reports by @martyinspace in #1721
  • Publish the guide: members' guide v116 → v117 by @martyinspace in #1731
  • 🗺️ Atlas: [manager tests] AnalyticsModule warning threshold and empty history unit tests by @martyinspace in #1722
  • 🎨 Palette: [a11y] add focus-visible ring styling to GroupSuccessionPanel controls by @martyinspace in #1726
  • 🎨 Pixel: [native a11y] Add dynamic accessibility label to review submit button during submission by @martyinspace in #1727
  • Jules register: the 10 Oct batch's closed items by @martyinspace in #1733
  • Sun and moon: no '0%' crescent; public routes round the community's location to ~1 km by @martyinspace in #1732
  • Phone sync: listings beyond the first 200 changes are no longer missed by @martyinspace in #1719
  • Control room: alerts to Marty's phone for name requests, new communities and paused names by @martyinspace in #1734
  • Home: First steps lasts two weeks on phones too, and 'Ask a community' only for ones within 250 km by @martyinspace in #1737
  • Publish the guide: members' guide v117 → v118 by @martyinspace in #1743
  • Vault: a backup that reached the bucket counts as done, even if tidying old ones fails by @martyinspace in #1735
  • Each server can alert its owners: disk, backups, restarts, standby by @martyinspace in #1738
  • Publish the guide: operator manual v111 → v112 by @martyinspace in #1744
  • Lists show small photos, so a Market page downloads far less by @martyinspace in #1742
  • Control room: alerts when global, the vault or a community server stops answering by @martyinspace in #1741
  • Server alerts: a problem the owner just fixed stops counting in the banner at once by @martyinspace in #1747
  • Global: a member's phone can ask for the 500 listings nearest their area by @martyinspace in #1739
  • Release 1.2.28: version bump by @martyinspace in #1748

Full Changelog: v1.2.27...v1.2.28