Repository navigation
v1.2.28 — owner alerts, sealed off-box backups, global by area, Home cards
📦 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:/dataUsing Docker CLI:
docker pull ghcr.io/beanpool-org/beanpool-node:latestWhat'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