Skip to content

v1.2.29 — link a device from the camera, the real global previews, photo and notification safety

Choose a tag to compare

@martyinspace martyinspace released this 17 Oct 06:23
07f4394

Before you upgrade

  • Phone app first. This release refuses device linking from apps older than 1.2.63. Update the BeanPool app on your
    phones (Play internal: 1.2.65) before your node takes this image, or "Link a device" stops working until they do.
  • Node-to-node ports are now opt-in. The example compose no longer publishes 4001/4002. Open them only if you link your
    node to other communities and want them to dial you.
  • Links typed as host:port remember the node that first answers. After the upgrade, each existing host:port link to
    another community records whichever node answers it next, and refuses a different one afterwards. If a linked community
    legitimately moves to a new key, remove the link in Settings and add it again.

What's new for members

  • Linking a new phone uses a four-digit confirm and works from the camera's QR code.
  • On the global community: the Ledger, Commons (Decide and enterprises), Invites and web My Deals are the real screens, filled
    with Example Valley and clearly marked as examples.
  • Events: "Not going" works on cancelled and ended events; event chats stop listing people who left; edits and RSVPs no longer
    fail in the minute after a repeating date ends.
  • Photos: no picture is stored with more pixels than phones can safely draw; a chat photo opens only for the people in that chat.
  • Notifications: repeating a request or a let-in no longer pushes the other person over and over.

For node owners

  • Owner alerts for removals and restores, the fresh-proof check on sensitive Settings actions, and an owner-delete flow.
  • A standby trusts its main server only through a pairing code (beanpool pair).
  • Federation hardening (stream limits, origin binding), connector URL edits keep a peer's listings, and removing a link
    removes its cached listings.

📦 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.29
    restart: unless-stopped
    ports:
      - "80:8080"
      - "443:8443"
      # Uncomment only to let linked nodes dial this node:
      # - "4001:4001"
      # - "4002:4002"
    volumes:
      - ./data:/data

Using Docker CLI:

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

What's Changed

  • Standby keeps transfers with unusual notes; a half-finished photo move no longer blocks the Market by @martyinspace in #1736
  • Directory snapshots are counted at their real memory cost by @martyinspace in #1740
  • Group chats, step 1: the locks (shared code only, not switched on) by @martyinspace in #1749
  • 🎨 Palette: [a11y] improve post-release review modal accessibility in MarketplacePage by @martyinspace in #1751
  • ✨ Flow: [manager UX] add loading indicator for AlertsPanel by @martyinspace in #1752
  • 🛡️ Shield: [native security] enforce device-only accessibility options on secure store writes by @martyinspace in #1755
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel and busy state to welcome flow action buttons by @martyinspace in #1757
  • 🔎 Scout: [test coverage] post-sight by @martyinspace in #1756
  • 🗺️ Atlas: [manager tests] signOutEverywhere, shutdown, disk health and decision actions in node-client by @martyinspace in #1758
  • 👁️ Watchman: [regression] fix test-door-work failure by @martyinspace in #1759
  • Group chats, step 1 follow-ups: tighter locks from the review by @martyinspace in #1760
  • Enterprise keepers can vote to pay out, with a 7-day Decision by @martyinspace in #1750
  • Revert #1759 (door-work timing) and add three Jules register entries by @martyinspace in #1761
  • Global on the web: the Market and Map start from your area by @martyinspace in #1763
  • The server compresses its answers, so a first sync downloads about a sixth by @martyinspace in #1764
  • Group chats, step 2: the server keeps only locked lines by @martyinspace in #1762
  • Global: a rough area at signup, and Settings → Your area by @martyinspace in #1766
  • Publish the guide: members' guide v118 → v119, operator manual v112 → v113 by @martyinspace in #1771
  • Global: new and changed listings reach only the phones nearby by @martyinspace in #1765
  • Enterprise keepers see and cast their votes in both apps by @martyinspace in #1767
  • Publish the guide: members' guide v119 → v120 by @martyinspace in #1773
  • Two small follow-ups: open-deals index, the Map's area note by @martyinspace in #1774
  • Group chats, step 2b: keys that hold up over time by @martyinspace in #1772
  • Chat groups can vote on their lead, rules and closing (server; the apps follow) by @martyinspace in #1777
  • Group chats: a newcomer learns nothing about lines from before they joined by @martyinspace in #1782
  • Search finds words in Chinese, Japanese and Thai text by @martyinspace in #1776
  • Global on the phone: keep the listings near your area by @martyinspace in #1778
  • Owners are alerted when someone gains power on their server by @martyinspace in #1779
  • Publish the guide: operator manual v113 → v114 by @martyinspace in #1786
  • Idle connections hold less memory by @martyinspace in #1775
  • Global on the phone: a listing gone from the node says so; an odd tied list never stops the sync by @martyinspace in #1787
  • Guide: the worldwide community shows you what's near your area by @martyinspace in #1789
  • Publish the guide: members' guide v120 → v121 by @martyinspace in #1790
  • Chat group members see and cast their votes in both apps by @martyinspace in #1784
  • Publish the guide: members' guide v121 → v122 by @martyinspace in #1795
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel and hint to propose vote submit buttons by @martyinspace in #1797
  • 🎨 Palette: [a11y] add focus ring to ConsentText summary by @martyinspace in #1799
  • 📱 Expo: [compatibility] Export ErrorBoundary in edit-project.tsx by @martyinspace in #1800
  • 🛡️ Shield: [native security] configure SecureStore options for app lock preferences by @martyinspace in #1804
  • ⚡ Bolt: [perf] O(1) usage lookup in appAddressesReport by @martyinspace in #1803
  • 🗺️ Atlas: [manager tests] token fetch guard unit tests by @martyinspace in #1798
  • 🔎 Scout: [test coverage] home answer parseLands by @martyinspace in #1796
  • Jules register: #1802 was a re-file of #1728 by @martyinspace in #1806
  • The nightly audit no longer freezes the server by @martyinspace in #1793
  • Group chats on the phone are end-to-end encrypted by @martyinspace in #1788
  • Trust floors read ratings by index, and the audit's slicing has tests by @martyinspace in #1813
  • Pushes by area look only at the sockets near a listing by @martyinspace in #1809
  • A member's new phone can take over their account with the admin's code by @martyinspace in #1783
  • Global: the nearby list is sent once, and not at all when it hasn't changed by @martyinspace in #1805
  • Search finds words between Chinese punctuation, never errors on odd characters, and hides people you've blocked by @martyinspace in #1808
  • Global: a changed nearby list is sent as what changed, not the whole list by @martyinspace in #1810
  • ⚡ Bolt: [perf] pre-compute treasury accounts set in marketplace feed handler by @martyinspace in #1825
  • 🗺️ Atlas: [manager tests] add unit tests for reportSubject, formatResolverName, and isManagerApi in node-client by @martyinspace in #1824
  • Jules register: batch #1817–#1825 by @martyinspace in #1829
  • Pushes by area skip people who blocked the author, as the nearby list does by @martyinspace in #1827
  • Security alerts survive a restart and cover every way a role changes by @martyinspace in #1807
  • Publish the guide: members' guide v122 → v123, operator manual v114 → v115 by @martyinspace in #1836
  • Small follow-ups from the 12 Oct reviews by @martyinspace in #1828
  • Nearby set diff: the two missing tests, and the memory counter counts string ids by @martyinspace in #1832
  • Groups use one set of words: leaders, keepers and convenors by @martyinspace in #1814
  • Pulse: a channel's verified-account match reads the link's path, not its host by @martyinspace in #1835
  • ✨ Flow: [manager DX] replace any in RekeyMemberWizard catch blocks by @martyinspace in #1801
  • Publish the guide: members' guide v123 → v124, operator manual v115 → v116 by @martyinspace in #1837
  • Group chats on the phone fail closed: a key-store error, a DM label or a missing row never sends readable words by @martyinspace in #1815
  • Group chats on the web are end-to-end encrypted by @martyinspace in #1816
  • Levels you haven't reached yet read as something to grow into, never locked by @martyinspace in #1839
  • Group chats: a member who changes phones keeps their name on their old lines by @martyinspace in #1826
  • Guide: pages that changed after this week's merges by @martyinspace in #1843
  • Operator manual: every page says what the server does today by @martyinspace in #1846
  • Test the vault custodian tool's 'Type yes' on a real terminal for unlock, reshare, restore and settings send by @martyinspace in #1848
  • Publish the guide: members' guide v124 → v125, operator manual v116 → v117 by @martyinspace in #1856
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel and busy state to re-key code submit button by @martyinspace in #1817
  • Group chats on the phone: a group or a DM is one conversation whatever its id's case, and deleting the account takes its keys by @martyinspace in #1841
  • Welcome and onboarding follow dark mode by @martyinspace in #1842
  • Global shows the whole of BeanPool: the sample community, the modes, and the server switch by @martyinspace in #1845
  • Website: start a community in one block, with the honest costs by @martyinspace in #1840
  • Publish the guide: regenerated files by @martyinspace in #1862
  • The web app's fonts come from the node itself, not Google by @martyinspace in #1858
  • Group chats: tests that pin how an old chain is shown by @martyinspace in #1860
  • A 'verified account' badge means the node asked the platform by @martyinspace in #1849
  • Tests: the sample-id guard suite no longer trips over a stale connection on CI by @martyinspace in #1866
  • Global: a phone can ask for just the members it needs, and search on the node by @martyinspace in #1847
  • Admins can connect their own AI assistant to their node (read-only tools and backups) by @martyinspace in #1855
  • Group chats: faster on phones with many conversations, and a capitalised link opens the chat you already have by @martyinspace in #1863
  • A listing's push keeps who blocked its author between pushes, and its tests check blocks both ways by @martyinspace in #1864
  • Global shows the whole of BeanPool on the phone by @martyinspace in #1852
  • Direct messages: your phone is told, with signed proof and a date, when the other person changed their key by @martyinspace in #1871
  • Owners and admins hear when reports come in by @martyinspace in #1850
  • Admins and owners can connect their own AI assistant from Settings, see what it sees, and disconnect it by @martyinspace in #1865
  • Publish the guide: members' guide v125 → v126, operator manual v117 → v118 by @martyinspace in #1876
  • Global on the web: People shows who's near, search asks the node by @martyinspace in #1861
  • Tests: the nearby-push equivalence suite always exercises a block near the listing by @martyinspace in #1875
  • Getting started: a near-empty Home, a one-minute tour, and a ? on every tab by @martyinspace in #1857
  • Publish the guide: members' guide v126 → v127 by @martyinspace in #1878
  • Global on the phone: keep only the people you need, fetch the rest on demand by @martyinspace in #1859
  • Admins: your AI assistant can suggest a moderation action, and you approve it on your phone by @martyinspace in #1868
  • Publish the guide: members' guide v127 → v128, operator manual v118 → v119 by @martyinspace in #1879
  • Global shows the whole of BeanPool on the web by @martyinspace in #1853
  • Dark mode on the phone: every screen readable by @martyinspace in #1834
  • Web app: the screen's name in the top bar no longer covers "Online" by @martyinspace in #1880
  • Admins: connect Claude or ChatGPT to your community by pasting its address and approving on your phone by @martyinspace in #1881
  • Publish the guide: operator manual v119 → v120 by @martyinspace in #1890
  • Group chats: bring your old history to a new phone with your words or a friend's scan by @martyinspace in #1844
  • Publish the guide: members' guide v128 → v129 by @martyinspace in #1891
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel to event reminder save button by @martyinspace in #1882
  • 📱 Expo: [compatibility] Export ErrorBoundary in rekey-code.tsx by @martyinspace in #1884
  • ✨ Flow: [manager DX] replace catch e any in NodeRolesPanel by @martyinspace in #1885
  • 🗺️ Atlas: [manager tests] confirmPhoneDigits and wrongDigitsMessage unit tests by @martyinspace in #1886
  • 👁️ Watchman: [regression] fix test-admin-auth failure by @martyinspace in #1888
  • 🔎 Scout: [test coverage] member-area by @martyinspace in #1889
  • 🔨 Forge: [reliability] catch unhandled exception in project deletion route by @martyinspace in #1887
  • Assistants' OAuth door: up to 1,000 registrations can wait, plus test pins; the token suite no longer calls GitHub by @martyinspace in #1892
  • Group chats: the guide says a member who changed their name can't be confirmed in person again by a phone that knew both names by @martyinspace in #1893
  • Website: three doors for a stranger — try it, find or start a community, or use your invite by @martyinspace in #1851
  • Global: shorter, plainer words on the local-community strips by @martyinspace in #1870
  • The guide explains what you see on the global community, and how to start a local one by @martyinspace in #1869
  • Small fixes: tour help, joining the global community, Start a community link, deal amounts on small phones by @martyinspace in #1896
  • Publish the guide: members' guide v129 → v130, operator manual v120 → v121 by @martyinspace in #1903
  • Tests: a failing push-by-area check can be replayed exactly from its seed by @martyinspace in #1897
  • Worldwide community: New Message shows your friends, and People stops waiting on a node that doesn't answer by @martyinspace in #1900
  • A block saved by another program on the node still stops the blocked person's next listing push by @martyinspace in #1901
  • Timing and memory checks that failed unrelated PRs on a busy CI runner now measure against the same run by @martyinspace in #1894
  • On a large Beans node the wash check refreshes in the background, never holding the server by @martyinspace in #1854
  • Report a child-safety concern straight from the report menu by @martyinspace in #1895
  • Publish the guide: members' guide v130 → v131, operator manual v121 → v122 by @martyinspace in #1910
  • DMs stop naming a deleted member's old keys, and every re-key date the node serves is checked by @martyinspace in #1898
  • Only you can read your own friends list by @martyinspace in #1902
  • Members on demand without by-area listings: a removed photo leaves every listing, and People shows no wrong count by @martyinspace in #1899
  • Dark mode on the web: every page readable by @martyinspace in #1833
  • Website: every button and link is big enough to tap on a small phone with large text, and grey text is easier to read by @martyinspace in #1905
  • A member's invites, chats and trades go only to them, even with read auth off, and the People list no longer gives away who added you by @martyinspace in #1909
  • Connections in common on a profile count only people who are friends both ways with you and with them by @martyinspace in #1911
  • Main is green again: the former-keys test expects someone else's conversation list to stay refused on an open node by @martyinspace in #1918
  • One colour library for the phone, web app and manager; the phone moves onto it and loses Earth/Slate (brand option C) by @martyinspace in #1904
  • The admin's data no longer says who took a listing or which deal it is in by @martyinspace in #1915
  • Blocker cache: test data_version ordering, store version on connection, warn once on trigger rebuild by @martyinspace in #1916
  • Reviews name their writer and the deal only to the two people in the trade by @martyinspace in #1914
  • Wash check: read the last 30 days of trades a page at a time, so a busy node's loop is never held long by @martyinspace in #1919
  • Every report screen offers Child safety, and the Reports queue puts those reports first by @martyinspace in #1912
  • Find your community: type your town instead of sharing your location (phone and web) by @martyinspace in #1917
  • Two tests no longer fail when the Mac is busy: door-work counts the screen's turns, and the two-tab sweep is split so it fits its time by @martyinspace in #1921
  • Adding a friend tells them, adds are capped at 100 a day, you can't add someone you blocked, and anyone can hide themselves from connections in common by @martyinspace in #1913
  • Publish the guide: members' guide v131 → v132, operator manual v122 → v123 by @martyinspace in #1924
  • Test: Home's slow-save tests no longer race the clock, so they pass when the Mac is busy by @martyinspace in #1920
  • The Commons shows the doodle wallpaper behind it, like Home and the Market by @martyinspace in #1922
  • Grey caption text on the phone is readable in light and dark (text.muted reaches 4.5:1) by @martyinspace in #1923
  • Make sample-id guard timing check robust to machine load by @martyinspace in #1925
  • Blocked list: also remove someone from your friends in one step (phone and web) by @martyinspace in #1926
  • Manager buttons and chips take their colours from the shared colour library by @martyinspace in #1928
  • Invite links on the global community open the app on Android, and the location prompt says what location is really for by @martyinspace in #1930
  • Web app: buttons, gold and chips take their colours from the shared brand library by @martyinspace in #1927
  • Save a Market search to Home, and the saved search shows its newest matches (phone and web) by @martyinspace in #1932
  • Global: an Offer can be posted without a price (the button asked for a price the form doesn't show) by @martyinspace in #1933
  • Deleting your account at your last community now removes your key's copy at the key vault first by @martyinspace in #1931
  • Web header: profile, help and Settings are gold and bigger on a charcoal pill (stacked on #1927) by @martyinspace in #1934
  • On the global node a newcomer's first post can be a Need, with no profile photo (Beans-on communities unchanged) by @martyinspace in #1936
  • Global node: a new member can't list everyone, and an open group's members are seen only by the group by @martyinspace in #1939
  • Website words match what the apps do: where sign-in copies are kept, daily limits, the claim step and deletion by @martyinspace in #1942
  • Members' guide: say where the web app differs, and fix 182 sentences the code contradicts by @martyinspace in #1943
  • A new member's first screens: the install banner waits for the tour, How it works says what is on without Beans, notices on Home only by @martyinspace in #1940
  • Translation groundwork: a shared words layer and date tables in core, with checks (English unchanged) by @martyinspace in #1941
  • Operator manual: say how a new server really works (the claiming phone is the owner, no genesis Admin), and fix 74 sentences the code contradicts by @martyinspace in #1948
  • README and help page say what BeanPool does today: plain-words opening, no gossip mesh, where the operator manual opens by @martyinspace in #1949
  • Publish the guide: members' guide v132 → v133, operator manual v123 → v124 by @martyinspace in #1963
  • Phone: a sign-in copy restores only the account the community lists for that key by @martyinspace in #1951
  • Names in any alphabet are found for a sign-in restore and can't be taken twice in another case by @martyinspace in #1956
  • A newcomer's first minute: one recovery truth, no photo gate, Offers green, reports said in place, the web find card's two actions by @martyinspace in #1955
  • beanpool claim and the claim card name the phone's real steps: Find a community, then Claim ‹name› by @martyinspace in #1974
  • 🎨 Pixel: [native a11y] add dynamic accessibilityLabel and busy state to pricing report submit button by @martyinspace in #1958
  • 🎨 Palette: [a11y] improve touch target sizing and focus rings in CommonsInfoModal by @martyinspace in #1962
  • 🗺️ Atlas: [manager tests] geo utility edge case tests by @martyinspace in #1966
  • Jules register: why five of the 15 Oct bot PRs were closed, so they aren't filed again by @martyinspace in #1969
  • Events keep the host's clock and the place's time zone, and can be online (server side) by @martyinspace in #1937
  • People sharing one address (a hall's wifi) no longer lock each other out of pairing and the name check; a busy day slows new sign-ups instead of filling the node by @martyinspace in #1950
  • Every writer of a member's name follows the one name rule, and a sign-in restore reaches the account the person picked by @martyinspace in #1977
  • Words S2 (web): choose the language on the first screen and in Settings; one chunk per language by @martyinspace in #1947
  • Web words: "How it works" on the worldwide community is in the member's language, and every list of the 12 words is marked never to translate by @martyinspace in #1976
  • The registrar never takes over a name it didn't make: our own servers' names are reserved, and a claim that finds a stranger record is refused by @martyinspace in #1978
  • Web: tap a group chat's header to open the group, and convenors can invite people from the web by @martyinspace in #1979
  • Help page: a "Writing to us" section — who reads what you send, and how soon by @martyinspace in #1973
  • Recovery words typed on a Turkish keyboard (İ, ı) now restore the account; the recovery-path file check is computed by @martyinspace in #1944
  • Removed lines in a row show as one line in group chats (web and phone) by @martyinspace in #1982
  • Event times on the web: the place's clock first, your time second, online events and the zone picker (stacked on #1937) by @martyinspace in #1952
  • Phone: choose the language on the first screen or in Settings, live; the welcome, join and area screens in 25 languages (translation S1) by @martyinspace in #1954
  • Colour leftovers: DM trade lines readable in dark, manager terracotta that drew nothing, web colours on the library (light as it was), 48dp friend buttons by @martyinspace in #1975
  • Registrar: a pending claim's retry and a second record at a name are checked too; the zone check refuses a partial zone by @martyinspace in #1985
  • Events: the host lets people in to the note and the chat (on by default on the global node) by @martyinspace in #1953
  • Deflake MessagesPage C5 and WebJoin busy sentence tests by @martyinspace in #1986
  • Key vault: the newest backup's custodians can rebuild a fresh vault; a damaged newer backup is read from its other copy or its own seal, or the restore waits by @martyinspace in #1981
  • Sending your whole account to another device needs the phone's lock, a server it already uses and two digits; the Settings QR refuses an app that can't show digits by @martyinspace in #1983
  • Deflake CI: photo-move retry gaps, DM spelling collision, sample-id guard cost bound; heavy-read 503 is by design by @martyinspace in #1987
  • Global: members see other people's listing places to about 1 km, and searching people by name has a daily limit by @martyinspace in #1965
  • Repeating events on the server: every week or month, one row that moves to its next date (event times slice 4, stacked on #1937) by @martyinspace in #1945
  • Direct messages: if the key behind a name changes, your phone stops and asks before sending by @martyinspace in #1872
  • Messages: the review prompt and Rate your partner follow the DM's own trades; View Post opens a finished post or says why not by @martyinspace in #1980
  • Owners only, with a fresh proof, for what can wipe a node or lock an owner out; no route resets the node or deletes a snapshot (server side) by @martyinspace in #1984
  • Phone: events show the place's clock and time zone, and can be online (stacked on #1937) by @martyinspace in #1946
  • Repeating events: test that "take back everyone" reaches people let in on any date, not only this date by @martyinspace in #1988
  • Directory hygiene: only an unnamed community or DIRECTORY_UNLISTED is held back (and says so); Find your community says far, none and not-loaded truthfully by @martyinspace in #1935
  • HomePage tests: wait for the page's own effect before the Tips click and the Save-search Escape (two CI flakes) by @martyinspace in #1989
  • 🔎 Scout: [test coverage] withheld-lines by @martyinspace in #1961
  • Publish the guide: members' guide v133 → v134, operator manual v124 → v125 by @martyinspace in #1990
  • Web app: hide the custom node address setting from members; a stored one is shown with Reset by @martyinspace in #1991
  • DM key change: rule 5 gets a way out (check the code, Continue), and the key-change words say only what's true by @martyinspace in #1995
  • Publish the guide: members' guide v134 → v135 by @martyinspace in #1998
  • Owners: a fresh proof to remove or suspend another owner, and to keep fewer snapshots (#1984 N-1, N-2) by @martyinspace in #1992
  • Web app opens in Dark for visitors who never chose; every stored Light is kept; no light flash on first paint by @martyinspace in #1997
  • Vault reshare makes new ticket and deposit keys, and a restore never takes an older generation once a newer backup exists by @martyinspace in #1996
  • Phone sync: a phone with no copy of the node's profile asks for it first, never reads the whole board; a 403 members_on_demand switches to reads by key by @martyinspace in #1999
  • Members by key wherever the node refuses the whole list: web app switches on the 403, phone follows one rule and re-asks an old profile copy (follow-up to #1999) by @martyinspace in #2004
  • Phone app: the vault words say only what's true (phones not computers, what Disconnect removes, backups while paused) by @martyinspace in #2001
  • A member's trades answer a tag: the phone's every-cycle read becomes a 304 while nothing changed by @martyinspace in #2003
  • Repeating events in both apps: Repeats and Until on the form, the ↻ caption, Next dates with Cancel this date (event times slice 5) by @martyinspace in #1993
  • Restore takes locked backups only, keeps a restore point first, and can be rolled back (owner-delete S2) by @martyinspace in #2002
  • Words: ar, bn, de, el, es, fa, fil, fr catch up with every sentence (machine drafts) by @martyinspace in #2014
  • Words: hi, id, it, ja, ko, ml, pt, ru catch up with every sentence (machine drafts) by @martyinspace in #2013
  • Words: sw, ta, tr, uk, ur, vi, zh-Hans, zh-Hant catch up with every sentence (machine drafts) by @martyinspace in #2015
  • A mistyped mirror link or copy source no longer spends the owner's 2FA code by @martyinspace in #2016
  • ⚡ Bolt: [perf] O(1) user group lookups in native market screen by @martyinspace in #2011
  • 📱 Expo: [compatibility] Export ErrorBoundary in project-detail.tsx by @martyinspace in #2012
  • 🎨 Palette: [a11y] Add focus-visible ring styling to LobbyJoin button by @martyinspace in #2005
  • 🗺️ Atlas: [manager tests] add isModeratorSession, sectionTargetFor, and endKeySession unit tests by @martyinspace in #2008
  • 🔎 Scout: [test coverage] event-zone by @martyinspace in #2010
  • Website follows the visitor's light or dark setting (dark unchanged, light from the brand library) by @martyinspace in #1994
  • Jules register, 16 Oct: three closed with reasons, two merged-in-error notes by @martyinspace in #2019
  • A mistyped break-glass, gateway, off-box or release-name request spends no 2FA code: the proof after the request's own checks by @martyinspace in #2018
  • Global's Ledger preview is the real Ledger screen, drawn from Example Valley (web) by @martyinspace in #2020
  • chore(native): bump to v1.2.61 (android 283 / ios 225) by @martyinspace in #2021
  • The owner can restore a backup and roll back from the server's shell (beanpool restore, beanpool restore-point); owner-delete S3 by @martyinspace in #2017
  • Web Messages gets a Groups tab like the phone's: New group, Find groups, and an empty view that says what a group is by @martyinspace in #2023
  • Global node: no Beans price, founding chip or tier on Market cards and profiles; phone trust panel follows Beans; Commons drops the one-tab switcher by @martyinspace in #2022
  • DMs: the keyboard no longer covers the message box (1.2.61 regression from #1872) by @martyinspace in #2024
  • chore(native): bump to v1.2.62 (android 284 / ios 226) by @martyinspace in #2026
  • Global previews (a): Ledger words true on global and Send Beans locally; phone CreditBar readable in dark; Export CSV and My Deals fit at 320; composer price line; meeting tips on global profiles; no New members chip on global by @martyinspace in #2027
  • Website: dark mode passes contrast everywhere (9 pins removed, light unchanged), safety cards read as one set, fine-print links break between links by @martyinspace in #2032
  • Phone Ledger: In Escrow shows only Beans the node actually holds, not requests still waiting for approval by @martyinspace in #2034
  • The pairing QR works from the phone's camera app; an old app is told to update instead of the browser waiting; Settings says "Link a device" by @martyinspace in #2025
  • Publish the guide: members' guide v135 → v136, operator manual v125 → v126 by @martyinspace in #2036
  • Settings matches the server's removals: no Wipe & Reset or snapshot Delete, a locked-only restore with an in-page confirmation, a Restore points card, and no window confirm() for anything destructive (owner-delete S4b) by @martyinspace in #2029
  • Publish the guide: operator manual v126 → v127 by @martyinspace in #2043
  • Global previews (d): no reads of your own data where a feature is a preview; phone My Deals closes before its ways forward by @martyinspace in #2035
  • Owners are alerted for restores, address changes, a replaced recovery code, backup settings, removals and an admin's renames (owner-delete S5) by @martyinspace in #2033
  • Publish the guide: operator manual v127 → v128 by @martyinspace in #2047
  • A node's first boot never fails on a self-signed certificate OpenSSL can't parse (asn1 illegal padding) by @martyinspace in #2031
  • Settings → Chat memory lists this phone's communities on a first visit, not "No communities on this phone yet." by @martyinspace in #2046
  • Global profiles: no "100% Reciprocity Health" badge or "Trades" count where nobody makes a deal by @martyinspace in #2045
  • Federation hardening: strangers can't hold peer streams open; a relayed sender or buyer takes the peer's own home; peers-off reaches inbound; link balances members-only by @martyinspace in #2039
  • Link a device asks for four digits, not two (3% → 0.03% per phished scan); a phone or server that only knows two refuses with words, nothing held by @martyinspace in #2041
  • Auth hardening: cap the nonce's length, break-glass refuses the old format, a new sign-in ends the browser's old session by @martyinspace in #2038
  • Publish the guide: members' guide v136 → v137 by @martyinspace in #2054
  • Global previews: the Market tab, the Map, a Ledger opened early and phone Diagnostics read nothing of the member's by @martyinspace in #2053
  • Restore and roll-back run one at a time, a roll-back never strips the server's files, a database that is no community's is refused, and cut-off restore files go at boot by @martyinspace in #2050
  • Manager: the fresh-proof code box on every screen whose route asks it, and N4's bare statuses in words (owner-delete S4a) by @martyinspace in #2028
  • The operator manual matches the owner-delete changes: restore from the shell with restore points, the fresh-proof list, starting over as two recipes, no reset or legacy page (owner-delete S6) by @martyinspace in #2048
  • Example Valley gets a full Decision, enterprise, project and example invites; deals, ledger and escrow now agree by @martyinspace in #2030
  • A new account never goes over one the phone can't read; standard 12-word checksum on the web; clipboard line names what it can't clear by @martyinspace in #2051
  • Publish the guide: operator manual v128 → v129 by @martyinspace in #2055
  • Ledger: a hardship grant survives a work-off's next payment; an open crowdfund passes the audit; a goal met in cents is funded; pledges and sends to the cent by @martyinspace in #2042
  • Bump the app to 1.2.63 (android 285 / ios 227), as built for Play internal by @martyinspace in #2056
  • Faces open only from a member's link on every community; the map pin is rounded for anyone but its admins; four smaller public-read leaks closed by @martyinspace in #2049
  • Publish the guide: members' guide v137 → v138, operator manual v129 → v130 by @martyinspace in #2059
  • Registrar fixes from the verified audit: /update names its row, Direct needs an IP, 64 KB body cap, new-name budget, /admin unframeable; nodes sign v2 by @martyinspace in #2044
  • A standby's main server is pinned once, from its own shell: beanpool pair and a pairing code; no route can change it (standby pin P1) by @martyinspace in #2037
  • The operator manual says how a standby is paired: a pairing code on its shell (beanpool pair); which server a standby trusts; no mirror link by @martyinspace in #2061
  • Publish the guide: operator manual v130 → v131 by @martyinspace in #2062
  • docs: make node-to-node p2p ports 4001 and 4002 opt-in by @martyinspace in #2064
  • Cap unbounded mode wait on web Ledger page with timeout and Try again by @martyinspace in #2065
  • fix(federation): key remote listings cache deletion to peer identity across URL updates by @martyinspace in #2066
  • Global previews: Commons → Decide is the real Decide screen, fed Example Valley's quadratic Decision by @martyinspace in #2058
  • fix: pin identity on first dial for host:port peer connectors (FED-07) by @martyinspace in #2069
  • 🔎 Scout: [test coverage] write-file-atomic by @martyinspace in #2074
  • 🎨 Palette: [a11y] enhance touch targets and focus rings in CreateGroupModal by @martyinspace in #2075
  • Jules register: the 17 Oct closes by @martyinspace in #2080
  • Global previews: web My Deals is the real My Deals modal, fed Example Valley's sample deals by @martyinspace in #2060
  • fix(events): chat participant filtering, RSVP withdrawal, series roll window, and year bounds (E1, E3, E5, M5) by @martyinspace in #2078
  • Manager: unit tests for the fresh-proof helper by @martyinspace in #2081
  • Global previews: People → Invites is the real Invite screen, fed Example Valley's example invites by @martyinspace in #2057
  • fix(federation): delete cached peer listings when connector is removed (#2067) by @martyinspace in #2068
  • Global previews: the Commons enterprise card and the enterprise page are the real screens, fed Example Valley's enterprise by @martyinspace in #2063
  • fix(photos): pixel cap at ingestion and authenticated message attachment read (P1, P2) by @martyinspace in #2079
  • fix(events): update web and phone event cards on Not going with post:null by @martyinspace in #2083
  • CI: one native vitest worker on CI by @martyinspace in #2086
  • fix(pwa): trap focus in marker sheets and restore focus to opener on close by @martyinspace in #2085
  • Test fix: E5's Saturday is counted on Brisbane's calendar by @martyinspace in #2088
  • fix(push): fold repeatable let-in and deal pushes to once per hour by @martyinspace in #2087
  • fix(commons): draw enterprises preview only on Groups tab, so Decide opens at its own content by @martyinspace in #2084
  • chore(native): bump to v1.2.65 (android 287 / ios 229) by @martyinspace in #2089
  • Release 1.2.29: version bump by @martyinspace in #2090

Full Changelog: v1.2.28...v1.2.29