Changelog
Every change to this belfry: the code it runs and what was changed on the server, with who started each change. Settings are named, never their values.
13 November 2026
server Settings changed: COMMUNITY_NAME, COMPANY_NAME, THEME, REGISTER, ADMIN_NETS, CUSTODY_SEED_DIR, HOMEPAGE
code Ships chat 3a93d6a: Guest join: after a retry, an expired / wrong code first checks the relay for the save (the first try may have gone through and only its answer got lost)
76074fd
code Ships chat 8cd92ac: Code boxes: a pasted code fills all six ("Code: 123 456" too) and replaces a full row; a failed connection keeps the digits, retries, and offers Try again
ddd77e3
code Website proposals: a failed publish says so in the proposal's chat; marking it Passed again retries (once per version and pass)
19d2f6a
code Ships chat 6d267c1: Website updates start as proposals: "Propose as the website" on a shared version; the proposal shows its preview and goes live once a belfry admin marks it Passed
9a277af
code Website: a proposal in #website that a belfry admin marks Passed goes live (website.watch, every minute)
624789d
code Channel pages: two templates. Public = issues (Open / Closed from the chat's labels); members only = requests (the form first). Sign in, or post as a guest
ec78103
code Agents: a mirrored agent leaves a channel when its member does (9001, mirror); mirrored adds are tagged
e71b661
code Ships chat 683c974: Agents are marked wherever they write: "<member>'s agent" or "Agent"
2df749d
code A member's own agent follows its member into every channel (agents.mirror, on becoming theirs and every 10 minutes)
908ac6c
code Expiry: the first tick after a start runs (monotonic time starts at boot, so a box up for less than an hour skipped it); tests no longer depend on uptime
a0a573a
code Channel pages: moving a channel between public and members only is never retroactive (periods)
ac9ac06
code Ships chat 193557f: Channel settings gear right of the bell for its admins; a channel can take threads only (or events, proposals)
73713c6
code Open first-run setup, belfry setup-reset, and agents asking to join
874cf25
12 November 2026
code Ships chat bed85ae: roles, invite as a member (admins), the invite sheet's 'Joins as', Belfry settings
47abb97
code Member links: the join answer says the role and the length of membership
62c8b8a
code Roles for members, and member links from the invite sheet
8ce483a
code Guest save: a wrong code says how many tries are left; 'taken' names the account (nip05) so the apps can sign in natively
d2b4c52
code Push: one device row per identity, so two accounts on one phone both get their notifications
854a4da
code Ships chat b2e968b: Guest links open straight into the channel, in guest mode; Join asks name, e-mail and the code sent by e-mail
f6bf8bc
code Guest mode follows the guest into a second channel
73521d3
code Guest links open in guest mode: read first, join with a name and an e-mail
79ac780
code Sessions: a signer that doesn't answer says so (503 signer), not 'you hold your own key'
60c82bf
code Sign in from the phone apps without a browser: the session is named by its client, bound to the session key, wrong codes say how many tries are left
639b39b
code Ships chat c6579a0: Channel info: no white screen on Members, About without boxes, a Log of everything, Todos; handle and photo row
7c0cc20
code Ships chat 6029788: Meeting form: tap faces to pick people, + to add someone (name or e-mail, then the other)
c89299e
code Ships chat 59c4b10: Audio recording: + → Audio recording, pause/resume, saved on the device as it records
4c51b60
code Ships chat 2215f2a: Meetings: add people by name (an account is made for them), hand a held account over
272be87
code Meetings: people added by name get an identity (POST /api/meeting-guests)
de14ba2
code Ships chat 9768c93: Channel pull-down: description first, latest photos, members as faces; slug e-mail; smooth lightbox; no to-do mark
ce688cb
code Mail: a channel answers to its plain slug (bugs@ reaches bugs-c3e5)
fd6e438
11 November 2026
code Ships chat 7504d77: Event form: "Hidden" instead of "Link" (not listed: anyone with the link)
2e5cbd7
code Ships chat 5ccc71f: Sheets scroll on phones (the form scrolls in its own box, the drawer keeps the drag to close); new events, proposals, to-dos and channels keep a draft until sent
37c0175
code Default channels: the descriptions an earlier version wrote for #proposals and #events are refreshed when nobody changed them
2b56c9f
code Ships chat 2db1d76: Requests and proposals: a member turns a request into a proposal (its thread says so); events in #events are public by default, in #bookings for members; each channel says who sees it
fe08b81
code Default channels: 🌐 #events and #requests public, #bookings and #proposals for members; an earlier public #proposals set up by default becomes members only
b9d87a9
code Ships chat a325118: Public channels show a globe; #proposals and #events take one type of post (a New proposal / New event button instead of the message box)
270f2e7
code Default channels #proposals and #events: public, a page at <domain>/<id>, one type of post each
3808432
code Web threads: each author from the web gets an account; agents' page: staying reliable
0b1598a
code Ships chat e139d5f: Channel settings: one Visibility setting (Public / Members only) replaces the page's list option; /proposals is free for a channel
3451ff4
code Channel pages: on the public website only, hourly digest, channel visibility; /proposals removed
7df7ad2
code Ships chat 23c9b83: Channel settings: threads from the web, a public page at <domain>/<slug>
995d44d
code A channel's public page: anyone opens a thread from the web at <domain>/<slug>
d86d3f6
code Ships chat b86d662: Sending after a dropped connection: seconds, not half a minute
b36c719
code Ships chat ab57a9d: Branding: admins set the logo, cover image and two colours (Me → Branding)
59d7f3d
code Branding: admins set the belfry's logo, cover and colours, kept in its own Nostr profile
2eee89c
code Mention digest: the community up top, mentions per channel, a reply link under each
3652a0c
code Ships chat 1bbbb05: Full pull-down: a vertical swipe on a to-do scrolls the list
5a56219
code Ships chat 4bde2b2: E-mail threads: the subject lives in the header, not in every bubble
a63b432
code Ships chat dabedd9: Images open in a lightbox: as big as possible, swipe/arrows/buttons through a message's images, Esc, ✕ or a tap outside to close
96ccd2d
code Ships chat d6cfae1: To-dos: the one being worked on shows a ring filling clockwise with the minutes of the current stretch, 1h/2h… in it past an hour
77aeba6
code Ships chat f845d47: Drafts: unsent text (with picked @mentions and #channels) is kept per channel and per thread on this device; sending clears it
619cb6c
code Ships chat 49d378d: Live updates: check the relay sockets still answer (back in the foreground, every minute) and reconnect a dead one; reopen a live subscription the relay closed
1202e46
code Ships chat 91c1b6b: To-dos: their steps show in the thread of the message they came from, with times; badge done/total of the latest 20; the header pulled all the way keeps its layout and shows more
b083d64
code Invite page for agents: say which to-do you are working on now (working heartbeat every 2 min, idle)
eeee2a9
code Ships chat e597816: To-dos: a turning circle on the one being worked on now (2101 'working' heartbeat, fresh for 5 min; 'idle' stops it)
fc6beee
code Invite page for agents: the channel to-do list (create, claim, update in a thread, mark done)
d4bbf75
code Invite page for agents: how to attach pictures and files (Blossom upload + imeta)
8d025e8
code push.<domain> answers 404 when this belfry doesn't run the gateway (error ran after the handle)
4a62cb9
code Merge branch 'push' into belfry-setup
6b78a6d
code Phone apps' sessions are named by client_id: Belfry for iPhone / Belfry for Android (both share sh.belfry.app://connect)
2420f5d
code docs/push.md: what changed while building (secret names, 503/502, groups key, DMs by arrival, thread links)
1c6b3fb
code Push in the stack: gateway profile, push.<domain>, belfry config settings
21b7a9d
code services/push-gateway: POST /v1/send to APNs and FCM for the phone apps
926932d
code Push notifications on the belfry: devices, settings and the watcher (push.py)
159e941
code docs/push.md: push notifications for the phone apps (gateway, devices, settings, payload, triggers)
0b6af36
10 November 2026
code POST /api/whois: member, agent or guest per key (apps can't tell from events); belfry.json revalidates with an ETag instead of a 5-minute cache
5cbab04
code chat.<domain>/events/<link> opens the chat's event page (and lets the phone apps claim event links on the host with assetlinks.json)
3f46c28
code belfry apply: one at a time per box (flock); a second one waits instead of racing on the same containers
c98186d
code The belfry's own posts in the chat carry its name, not 'Drop box' (the groups API key is the server itself)
d63823e
code Agents: POST /agents {mine: true} says why it refuses (not_member, unknown, taken, not_guest_agent, not_inviter, limit)
a6c9a69
code Ships chat 85ede89: Reply opens the thread's own view (or the third column) with its box focused, instead of a second reply box in the channel
74d8887
code Android App Links: chat.<domain>/.well-known/assetlinks.json for sh.belfry.app (release certificate)
5951f29
code Ships chat ef9e1cc: Belfry events
9dbe16d
code CORS of /api/*: PUT too (the chat sets an event's custom URL from chat.<domain>)
72d4b7e
code Homepage skill: /events stays on the apex (the community's events, events.py)
ab77195
code Belfry events: public pages, the events API, tickets, applications, co-host links
48c3b21
code Groups relay patch 0004: applications from keys that are not relay members
4269c68
code Ships chat b96bd00: threads in a third column on large screens, # suggests channels (by belfry-agent)
56443eb
code Ships chat 0a0ad41: profile's Message button centred on wide screens
08ce06f
code A member's own agents; guests and agents brought into one more channel; ships chat 453684b
210f36f
code Guest links only by people who have the channel; own apps named at sign-in; prebuilt images for belfry-sh; ships chat 1834584
d24202c
code Ships chat 7b03279: the audit's chat fixes (only the author's edits count, proposals in feedback on the channel line, drafts kept on a failed save)
0aa7b8c
code Dead code: claim.json_dumps, credentials.presented_claims and VCT_PATH, theme.BASES had no reader anywhere
a15fb65
code guests: _channel_event_kind only called _channel_event
a4bd370
code Previews: a new site object and HTTP client every minute per preview, never closed
a740a8d
code Theme: the community's name was escaped twice in page titles; the THEME comment described a removed osv base look
e713c0e
code Mailer: a name with a line break in a subject raised (500 on /apply); unsent mails piled up in memory without a mail provider
3ac6de5
code Drop box: the upload proof's key fell back to the fixed word "drop" without a pass secret
38a1bb0
code Blossom gate: a created_at or expiration that is no number raised (500) instead of 401
074c556
code Sign-in by e-mail: an address with Odoo wildcards (%@%) found a member and the answer gave their address
459bd76
code A channel's guest could read the members-only relay through pass.<domain>/monitor/stream
d624f58
code Own register: passes never expired, no cron runs expire there; the background round does it hourly
a8c6858
code Console: with Authentik down, the admins were asked for on every page view (30 s timeout each)
53443c1
code Own register: the steward dashboard and the shift pages raised instead of showing no shifts
1d5f86e
code Guest passes minted tokens: a guest's 30 days counted as 31 token days when a mint is set
eb5f27e
code backup.sh: back up the belfry's own register and infra/data
604c40d
code NEXT_STEPS: section 4 listed work as open that sections 3o to 3zi record as built
709dcd7
code belfry-homepage skill: the list of paths a homepage cannot use was incomplete
722cf17
code install.sh: cap container logs on a new server
b9d7111
code install.sh: the plan and the closing lines match what is installed
f017c3b
code infra/README: services, overlays and folders that were missing
cda43da
code belfry app: say where an installed app really answers
8c29336
code belfry apply: remove superseded image versions after a successful apply
077af88
code docs/README: list the documents the index did not know
07f832c
code register.md, mail.md: invite links live on belfry.<domain>; outgoing mail does not depend on Odoo
4774c5a
code README: the install paragraph as install.sh works now
3527d47
code belfry-steward skill: admins moderate every group; API addresses on belfry.<domain>/api/v1
3fb025c
code belfry-theme skill: the chat is at chat.<domain>, installed apps at <domain>/<name>/
04d5c9b
code belfry-app skill: the session API is belfry.<domain>/api/v1/session
5ba2832
code belfry-install skill: server sizes, first admin, mail providers and ports as install.sh has them
27e3f9c
code Ships chat 30e775b: one summary line per channel with a pull-down, to-dos, pinned messages, pod shapes
a20dbc0
code Usernames: a member starts with their name as a slug, not a number, and can change it; ships chat 4c71a22
68af7af
code Ships chat 85ccbd4: back buttons no longer bounce between Messages and a conversation
f32b781
code Ships chat d4cfafa: deleting a message asks first, in the app
574ec9a
code Ships chat 4c83aa1: edit your messages, Open thread chip, no sideways scroll on iPhones
e37dca6
code An admin can make a saved guest an admin: they become a member; ships chat 05d2415
63e16d2
code Keycast patch 0023: one client key, one identity, on every path
41f3e55
9 November 2026
code Keycast patch 0022: a bunker connection bound to its client key at creation
834a74d
code Forms lock on submit on the belfry's pages; a guest's session is asked for its own key; ships chat 0c06dc3
73963ab
code Ship chat dd63466
3214da0
code Guest join: the same device asking twice gets the same account (ships chat ff0ae0e)
e355a74
code Guest links without a hand-off code: chat.<domain>/join/<token>, one signed join request
d0fde3d
code Ship chat 4756dae
292b1da
code Chat 551dba2: Discord-style reactions and message menu
5263265
code Chat 4ba145f: sign out as a link, room for reactions under each message
151d987
code Chat 7bc5f82: profiles with tags and places, members map, admin role, channel blind, dialogs on laptops
a36b345
code Places for profiles (GET/POST /api/v1/places: GeoNames cities15000 plus places members add near a city) and the admin role from the chat (POST /api/v1/admins)
cbfc944
code One-tap guests: a name, and straight into the channel; the e-mail later
ea4773e
code Sign-in accepts Belfry's own native apps (sh.belfry.app://connect, 'Belfry for iPhone'), approved by default
e4ee3f2
code The invite page has its styles: labels over full-width fields, the belfry's button; after sending, the form folds under 'Send it again'
36ff214
code The website as a conversation: #website, previews at preview.<domain>, publish a shared version
729596a
code The chat moves to chat.<domain>; links people get go to belfry.<domain> or chat.<domain>
0387536
code Agents as guests: /invite/<token>.md tells them how, they accept with their own key
96ffbc9
code The belfry's API at belfry.<domain>/api/v1
49fa939
code Chat (village-app 03f3c54): threads unfold in place, Reply from the long press, older threads resurface
65f5060
code The community's own domain may call the API (CORS): the chat at <domain>/chat makes guest links, follows and sessions again
2191c45
code Group admins sync skips the relay's own key; chat (village-app 37c924a): the invite QR keeps its place while loading or failing
095e4db
code Community admins administer every channel; @mention digests by e-mail; Markdown in announcement mails
53b4a2b
code Chat (village-app 2cfb85f): stuck old e-mails say so
66ee44d
code Chat (village-app e54c649): messages and e-mails are saved first and sent through the outbox, with retries; no more endless Sending…
4bd0a84
code Any member can bring a guest into a channel; e-mail threads in the chat; room between the mail providers
e4ff795
code Chat (village-app 10941c8): an empty channel offers Invite people
3feef2c
code Chat (village-app 65fa3e3): join lines need invited-by
8892751
code A channel's guests: a 30-day link from a channel's admin, that channel only
31394be
code Chat (village-app 35ee840): search in the header, unread count on ☰, day separators
79baf6b
code Chat (village-app 7fce647): the channel header pulls down (peek, full), active members this month, 'seen'
9fd0bd5
code Installed apps live on the community's domain: <domain>/chat, one origin and one sign-in
4202fdd
code Chat (village-app 81d0655): the phone drawer slides both ways, full height, drag/back/Esc to close
03a75ba
code Chat (village-app 38b792f): channels in a drawer on phones, SVG icons, unread count on your avatar
af8c3dc
code Sign-in page: an app of this belfry is shown by its path (/chat), and no badge once approved
b469c12
code apps.<domain>: the tag says 'Not restyled for Belfry yet' (the frame renamed the old wording), on its own line
acf0d26
code apps.<domain>: your apps for everyone, the apps that can be added for admins; old app hosts empty the phone's cached copy
95bd420
code Shipped apps: reinstall a current copy that doesn't link the theme's own.css yet
144ac99
code No community's look in the code: Belfry's look only, the rest is a theme folder; Belfry Brussels's apps off by default
cf30503
8 November 2026
code Console in direction A: one home that grows with you (visitor, member, admin strip with next steps); setup as a checklist with one E-mail row (Lettermint or Resend, key tried before saving) and add-ons apart
2c29f8c
code Chat: the laptop layout (channel list always on the left, you at its bottom)
e7e611d
code Shipped apps: the community name is COMMUNITY_NAME
bc0fe21
code Shipped apps live in infra/shipped-apps (infra/apps/chat is the chat.<domain> image's source)
1880cd9
code apps.<domain>/ lists the installed apps in the belfry's look; chat ships with every belfry
b7c6d8c
code The monitor moves to the console (belfry.<domain>/monitor); no Odoo check without Odoo
cfabcd4
code Lettermint as a mail provider; the version and updates from the admin console
43c8eb0
code settings: register_mode (REGISTER), not shadowing BaseSettings
61c60f2
code The belfry's own register: Odoo becomes an optional add-on
b859ab5
code Shared inboxes: mail from anyone to a channel becomes an e-mail card; admins answer as the channel
d478a3f
code Mail to a channel: only what the member wrote, with the whole e-mail one tap away
0a8de56
code belfry apply reloads the proxy, so a changed Caddyfile takes effect
793a627
code E-mail as messages: name@ and channel@<domain> receive mail, members answer from the chat
986895b
7 November 2026
code Own sign-in on pass.<domain> (e-mail + code, the belfry look); drop page: sign in or upload as a guest, channel linked to the chat; other belfries show their own name
d7f738d
code Drop box links: upload to a channel from a link, anonymously, with a name, or as a member
20bb190
code Announcements in any channel: admins' messages tagged t=announcement, followed per channel
ec1fef6
code Announcements: "as soon as possible" or monthly; the confirmation link confirms
515e929
code Public announcements: an admins-only channel, followers by e-mail, a morning digest
3d4047f
code Sessions carry their device ("Chat · Safari on iPhone"), listed apart in /api/me/sessions; member numbers have no prefix (new databases)
ce68bcd
6 November 2026
code Sessions over the API; addresses from the signer's username
d76f391
code Sign-in page wording: members open a session in an app with their own account
ad9012f
code test_theme: strip comments before looking for the rules
dd1b01e
code Fix the base stylesheet (it was all comment) and the sign-in page script in a browser not signed in
b2d8427
code Apps need an admin's approval; requests and approvals are Nostr events
0f517d0
code belfry app install: a belfry's own static web apps at apps.<domain>/<name>/
2394997
5 November 2026
code Setup: a one-question-at-a-time first run; never show text from the URL
31bf2f9
code install.sh: 4 GB of RAM is enough to run (warn under 8); images already on the server count for the disk check
290bcfa
code lean_build: tag each local build <repo>:tree-<hash>, so a reinstall finds it (instead of infra/.built)
bf7bffe
code First run by link, first admin with a browser session key; sign in to any app as name@domain
916f538
code belfry setup-code: pass the name through
4b3c383
code Setup page: providers folded until opened, one form each; setup codes made for a person (belfry setup-code NAME), or the name asked with the code; no 'who' field
fb36070
code Setup page keeps 'applying' during the apply; CLI as root without git ownership warnings; /git README title once
760635a
code Themes, belfry.<domain>/setup and /git
529f578
4 November 2026
code Merge branch 'belfry-console' into belfry-sh
6feae6e
code belfry: an image without a name is belfry-<service> (Compose's default), so it is not rebuilt every time
a4c0e02
code belfry apply on little disk: rebuild an image only when its sources changed
9a3a61a
code Blossom accepts web files (HTML, CSS, JS, JSON, fonts, …) for nsites, kept 5 years
3cbe3f6
code belfry apply: with little disk, build one image at a time and empty the build cache after each
2e9d822
code install.sh: new belfries show their own website (HOMEPAGE=nsite), a placeholder until published
8833685
code belfry.<domain>: overview, status, members by e-mail, website approvals; placeholder homepage
b894e6a
code DEPLOY: the git server is prebuilt too
31313cf
code Prebuilt images: the git server (ngit-grasp) too
b2d0e2f
code belfry: record changes in the changelog, belfry homepage publish|status
9817181
code Community pages every belfry serves: /proposals, /monitor, /changelog
97cd8ac
code Community homepage on the apex: start page, a proxy to the website, or an nsite (NIP-5A)
c3302ba
code NEXT_STEPS §3zu: git server deployed on belfry.tofauti.net, smoke green
4f1e29c
code Prebuilt images on GHCR: the signer, proxy, groups relay and onboarding service
6ff5a4e
code Git server for agents: ngit-grasp at git.<domain>, members are the active passes
af98fe8
code install.sh: say where it stopped, quieter apt and Docker install; disk sizes from a real run
c8aafd4
code install.sh: Caddy on 80/443 by default, nginx only with --nginx
c4fdee2
code One-command install: curl -fsSL https://belfry.sh/install.sh | sudo bash
51a6aa9
1 November 2026
code Fewer onboarding screens for outside apps: Keycast 0021, Village Notes signs in by itself
f0c1642
code Merge github/main: PR #1 (belfry-event allows any kind)
e7fd146
code Merge PR #1: Keycast policy belfry-event: allow any kind
ea4a407
code Signed in on the way back to the app: the welcome page signs in and ends at return_url
cb934c4
code test_nip46check: ruff format (the padding table one tuple per line)
f1fb532
code Pass order API: payment_url straight to Mollie's checkout, return_url back to the app
528de41
code Keycast policy belfry-event: allow any kind
2001790
code Invite codes from an app: /api/invites without an e-mail, Village Notes "Invite someone"
eb3743d
code Sign-out back to the app, no "Stay signed in?" step, branded Keycast pages for outside apps
ef04e28
31 October 2026
code feat: add signin with email
48e10ba
code Internal invoices numbered as orders (ORD/) when another organisation invoices the tickets
8c6dca9
code Plan snapshot note: rev 90, tickets invoiced by XL Collective (§3zq)
da41674
code Tickets booked at the seller's Odoo: invoice, payment and credit note over JSON-2
925fc47
code Village notes: an example app on a Belfry (invite, bunker sign-in, tokens, notes)
59d71c0
30 October 2026
code Agent command: one action per call through the holder's bunker (me, invite, invites, status, revoke)
d8c981b
code COMMUNITY_NAME quoted in .env.example: bootstrap sources .env, and the unquoted space broke it
88c73b6
code E-mail code for an app's own key: /api/email-code binds the key to the address in Odoo
9231001
code Bootstrap accepts Stripe restricted keys (rk_test_, rk_live_); DEPLOY.md lists their permissions
1a04fd5
code Apps connect to a Belfry: /.well-known/belfry.json, /api/me, CORS, steward skill
87865ce
code NEXT_STEPS §3zn: deployed to both servers, smoke 220 ok on each
041d100
code Blossom gate keeps the public proxy's X-Forwarded-Proto: blob URLs are https again
a540371
code Smoke 6w: the smoke steward leaves the stewards group again
3737762
code Agents act for a pass holder through a bunker; stewards get a free pass
847e0a0
28 October 2026
code Fresh install on a server: bootstrap waits for Issuer2's own metadata; ADMIN_NETS before bootstrap
85b5051
code Short names for the participant apps: <domain>/chat and others redirect to their hosts
ba5a58f
code Pass API and agent skill: an agent orders a pass from an invite on a visitor's behalf
e2a0ce6
27 October 2026
code Encrypted OpenID4VP responses (direct_post.jwt) for the door and pass sign-in: Talao presents the pass
4c90785
code Sign-in code next to the magic link: a 6-digit code in the same mail, for devices without the mailbox
68ee49e
code CLAUDE.md: refer to NEXT_STEPS, the slice contract and the plan snapshot by path, not as imports
fbac39c
code NEXT_STEPS: Belfry registered at the EUDI Launchpad registrar
5c72549
code NEXT_STEPS: EUDI registrar section is §3zk (§3zj is the sign-in code)
aa221e0
code EUDI reference wallet: signed issuer metadata, registrar certificates for issuer and verifier
f34c57c
26 October 2026
code Programme: a Shifts tab for volunteers and stewards
851868f
code Groups: Flotilla on a NIP-29 relay (zooid); every participant can open a group
36e89e1
code Volunteers: a two-week pass earned with three shifts; shifts in Odoo, a personal shift page, steward pages
eb36064
code Applications: <domain>/apply, answered with an invite or a friendly no on the steward pages
a7155b2
code Sign-up journey from the user test: invites wait for payment, VAT, real invoices, welcome page, mail to apps
028aec9
code Photos: no more black uploads
f96efbd
code Sign-in: the account page's button goes straight to the e-mail sign-in; no avatars
755ff5e
code Programme review follow-ups: calendar filters under the relay's cap, retries
36ae07b
code Programme: page past the relay's cap, word search, titles only for bookings
9f7ad55
code NEXT_STEPS: polls on Nostr deployed
52733d9
code Polls on Nostr: public relay hint, smoke checks, docs
ee55af5
code Polls on Nostr: an announcement when a poll opens, the result when it closes
a0f91af
code NEXT_STEPS: programme app complete and deployed
d2f26a5
code Programme app: phone navigation, search, reminders, offline, polls per session
58085bd
code NEXT_STEPS: programme app deployed on the test VM
4eebd3e
code Programme app: announce, edit and cancel your own session
f390a2f
25 October 2026
code Programme app: what is on now, RSVPs, comments and photos per session
38c531b
code Calendar on phones: square mark, date on one line, day view first
ec88ae9
code Wallet: send to someone from the directory, receive by QR, clearer history
36349e3
code Wallet: the pass's tokens arrive on sign-in; no Lightning address settings
07b0587
code Programme and room bookings as public calendar events
6a4a1fa
code Invoice page: no salesperson for participants (the onboarding service's user)
82ff200
code Invoice and payment pages link to Belfry, not to Odoo
571d088
code Branded error pages: proxy, onboarding service, Odoo
68262dd
code Share preview: Belfry Brussels instead of "Odoo" for invite links
056d6da
code zerotier.sh dns: no forwarded AAAA for the domain (the public IPv6 would bypass ZeroTier)
dce21e8
code Admin network DNS: dnsmasq on the VM's ZeroTier address
9eb35ea
code Wallet: the participant's own signer, seed and nutzap key in an encrypted backup on the relay
f039d2a
code Join with an own Nostr key: proof on the invite page, keyless signer account at activation
28ce1a7
code NEXT_STEPS: iDEAL and Bancontact are enabled in the Mollie account
cdeeb9f
code NEXT_STEPS: the verifier kept a stale status list beyond its TTL
2d707da
code Status list: indexes above the highest in use stay valid
6c1f8af
code Smoke: follow the start page's forward; the test-run notice on Odoo's invite page; tester notes: the November test window
16cd2fc
code Start page at the apex, invites from participants, feedback page, test-run notice
0082ac4
code NEXT_STEPS: the user's open to-dos (Mollie methods and key, old backups, venue IPv4)
1cbd867
code NEXT_STEPS: the test VM's fresh install (Belgium, EUR, new keys)
3305775
code bootstrap: offer only the Mollie payment methods the Mollie account has enabled
5a7343f
code Fresh Odoo database in the company's country (BE, EUR); status list valid only for active passes
97047cd
code Blueprints: no placeholder fallback for client secrets
4ba88f2
code Secrets as files instead of environment variables; Docker hardening
9f4fc10
code Mollie: a pending refund revokes the pass; rate limits for the venue WiFi
eb5f277
code odoo.conf carries a PBKDF2 hash of the master password, not the password
2a046d4
code Default avatars from the key; Mollie next to Stripe with refunds and chargebacks
4a1849d
code Stripe from bootstrap: Odoo's provider from STRIPE_PUBLISHABLE_KEY and secrets/stripe_secret_key, both webhooks
24d6afe
code Reports and moderation: a Report link in the directory, market and photos, steward handling
3fe4edb
code Privacy notice, terms, refund policy, community rules, help on pass.<domain>; event-day runbook
028abc6
24 October 2026
code Sync workflow: actions/checkout@v5 (runs on Node.js 24; v4's Node.js 20 is deprecated)
0b73a07
code DEPLOY: reload the proxy after a Caddyfile change (the directory is mounted)
ea4a914
code Docs for readers new to the project: current state only, a docs index, the pass sign-in bridge
22dab0d
code Wallet: Geist from the image instead of Inter from Google Fonts (patch 0006)
da39c7f
code NEXT_STEPS 3x: hardening and the admin network; plan snapshot notes rev 75
3e7f13f
code zerotier.sh: ADMIN_NETS includes the VM's own public addresses
6092480
code chore: add github workflow
bb7391e
code Hardening: rate limits, per-account magic-link limit, CSP, non-root containers, split networks, no Mailpit in production, admin pages over ZeroTier only
bd9c9ec
code The pass on the phone without a wallet: /me shows a renewing QR, /check at the door
32f17f8
code Mobile, second pass: dashboard, header, wallet buttons, button rows (Keycast 0016, wallet 0005)
dcf13eb
code Mail sender: prod-env.sh keeps an existing MAIL_FROM; DEPLOY.md says it needs SPF
8805a6f
code What's new: recent activity across the apps in the directory (people.<domain>/#/activity)
2a56654
code Mobile: buttons fit phones with large text (Keycast patch 0015, Authentik brand CSS)
2c6d7fc
code Photos at photos.<domain> (services/village), tips in community tokens through the wallet
9071b7d
code Directory and marketplace (services/village), paid in community tokens through the wallet
ee4d155
code Plan: DIDs dropped (no did:webvh, no id.<domain>); identity is the Nostr key
0b80b8d
code Mocked hardware tokens until the YubiKey ceremony; rewrap keeps seed and backup key
6393159