The poster goes under the exhibition question as a slideshow slide —
989×1400 webp, 85K, sized to the "around 1400 pixels tall is plenty"
the content reference asks for.
It also settles a date this page had wrong. The poster runs 24.10 to
15.11; the event here said `duration: 31d` from the 23rd, which reaches
23 November. The header announces the exhibition for as long as the
event window lasts, so that would have kept inviting people to a closed
room for eight days. It is 23d now, and the opening hours the poster
gives — Saturdays and Sundays, 13:00 to 17:00 — are on the feature that
tells people when to come.
The 23rd at 19:00 stays as the start: that is the opening, and the 24th
is the first day the doors are open to everyone else.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ByshXuDEzH8hXh5qp4VgGk
redoal.com is read and answered without an account, so the invitation
to sign in has no audience. Portal's header nav keeps it next to the
wordmark on every page; a skin hides it.
The rule only takes the link in: signed in, the nav still carries the
name and the way out, and the gate on /review still offers its own way
in. First custom.css here, wired through site.yaml's stylesheet key.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
iris stopped at v0.5.10; the lint has been portal itself since 0.6.0,
fetched from the portal release this site runs, as uhhm/questions does.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The front door's releases card read the private repo's Gitea releases
with its link nulled, since those 404 for visitors. It now reads the
public manifest redoal's release job writes to dl.redoal.com, which
portal renders as a download card with this device's file first. The
pins move from v0.5.2 to v0.6.20 for both the instance and the lint;
the content lints clean on it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One card per release made the section grow forever, and the newest cut
is the one a visitor should actually run — the rest are history, not an
invitation.
`limit` is the portal's mechanism for this (uhhm/portal 22d086f) and
this site is pinned to PORTAL_RELEASE v0.5.2, which predates it, so the
jq takes `.[0]` instead of `.[]` and that is what does the work today.
`limit: 1` is declared alongside it: v0.5.2 ignores fields it does not
know, so it costs nothing now and takes over when the pin moves
forward, at which point the jq goes back to `.[]`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ByshXuDEzH8hXh5qp4VgGk
Attachments both ways, rate limiting, sessions that survive a deploy,
and an upload route that asks the policy like every other way in.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four releases on from v0.3.36: maps and `place:`, a reply to a case
mail becoming a note on its record, and the access policy's newer
rules. iris moves with it, since it is the lint for exactly this
portal.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The 'redoal testers' external group now has a public link
(https://testflight.apple.com/join/eR9dvHkz) — one tap on an iPhone,
no invitation flow. Replace the Apple-ID form (and its action/
record_as plumbing) with the link; no email collection, nothing for
us to process. The n8n named-invite workflow stays shelved in
redoal/redoal ops/ for a future curated group.
Lint: OK (9 questions, 5 aggregates).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ByshXuDEzH8hXh5qp4VgGk
Desktop releases run free (the gitea_releases listing, no sign-up); a
'Join the public testers' form on the same alternative collects the
Apple ID for a TestFlight invite, recorded to redoal_testers. New
confirmation page /joined-testers, and an aggregates entry with
attended_by pointing at the n8n TestFlight onboarding automation
(events.redoal_testers.* → App Store Connect).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ByshXuDEzH8hXh5qp4VgGk
The portal's apply_jq collects the jq output stream into an array
itself. The wrapping [ … ] made the filter emit one array-valued
output, which nested to [[{…}]] and failed the array-of-objects card
renderer, dumping raw JSON. Emit a bare object like the releases jq
does, so it collects into [{…}] and renders as a card.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ByshXuDEzH8hXh5qp4VgGk
A 'The count so far' feature in the index's 'Meet a network' alternative
fetches https://relay.redoal.com/pulse (redoal ADR-0023) with a kind:url
resource and shapes { voices_echoed: N } into one card — the number as
the heading, 'voices echoed so far' beneath. Lint-clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every recording card links to /report/<digest>. Filing opens a
redoal_reports record; the Reports desk decides — Remove it acts for
real (the relay deletes the recording everywhere), Keep it closes
with the voice in place. Pins portal v0.3.17 for markdown in cards.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y42TyF8Zu7NGRR2893vNcZ
redoal_watchers starts pending; /watching (the confirmation mail's
landing page) confirms to open or drops. Only open watchers are told.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The landing gesture leads to /shape/{curve.key} - the place page:
what was left there (the relay's /place, playable), leave your voice
(type: voice at value "{key}"), hear from exactly this address
(redoal_watchers, exact key), and the cards. Email leaves the landing
page. A card for iroh through varde. Desks for voices and watchers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
25% overscan on every side, drawing scaled to the piece so nothing
grows; html overflow-x: clip keeps the bleed from scrolling sideways.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Opens 21 October 2026, runs a month. Uses portal's event: window so
it rides in the header while it runs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The trace advanced a whole sample at a time (floor of points x
progress) - visible steps; the tip now interpolates between samples.
The single field-wide rotate is gone: each path turns at its own
seeded rate and direction about its own center, drifts on its own
small orbit, carries its own wave and traces itself at its own tempo.
Every rate is an integer number of cycles, so the loop stays
seamless. Same generator feeds the paint worklet and the canvas.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A host reboot on 2026-08-30 left the instance down: deploys only ever
started it. enable is best-effort until the host's polkit rule grants
manage-unit-files to deploy-runner.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every talking point now leads with the capability instead of the
absence: the room answers, the seal is yours, drawing and speaking
is the entry requirement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A new alternative, "Meet a network with no list and no landlord",
carries seven feature cards lifted from the redoal repo's zine and
intro-video script: the drawing-as-address trick, no middleman,
voices at a place, signatures not names, the twenty-four-word
manifest language, the no-reading entry requirement, and the honest
status. The landing description opens with the cold-open line, and
/shape gains a card on what a place holds in the full network.
Nothing here overclaims: every card describes something the redoal
repo ships and tests, and the last one says what doesn't yet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Category labels become paths a visitor can take (Draw a path and see
who's near / Follow the build as it lands / Hear from us when it
matters), the empty Communicate feature gets its why, every
input-bearing feature states its reason and carries a lucide icon,
and the desk and receipt titles become the page's one question.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
redoal_gestures and redoal_subscribers were written by the public
landing page but read by nothing - answers would have landed unseen.
/review (owners-gated via _section.yaml) now lists both, with an
owner-side retire transition for bouncing subscriber addresses.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same instance-ownership move as uhhm/questions: pin PORTAL_RELEASE,
ship /srv/app/redoal-portal from the published artifact, write env from
this repo's own Actions config, own the redoal.com Caddy route. Lint
now uses this instance's question_lint, matching the pinned version.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 2024 lysbue question returns as live content: a gesture-drawing
hero and form (type: gesture, wired to wss://relay.redoal.com),
redoal/redoal's releases via the gitea_releases source (unlinked
while the repo is private), and a subscribe flow. site.yaml rebrands
the portal instance; buckets are redoal_-prefixed to coexist with
uhhm's on the shared JetStream.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>