Author SHA1 Message Date
Bendik Aagaard LynghaugandClaude Fable 5 795ada090d Answer the visitor question: but can AI do that?
Lint and reload / lint (pull_request) Successful in 2s
Lint and reload / reload (pull_request) Skipped
Weave the answer through the index copy instead of dodging it: the
description promises the same terms to any hand, the entry card names
the machine alongside the child and the elder, and a dedicated card
answers directly — identity is continuity of a key, not species.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y42TyF8Zu7NGRR2893vNcZ
2026-09-02 16:54:51 +02:00
9 changed files with 56 additions and 149 deletions
+1 -5
View File
@@ -18,7 +18,7 @@ on:
- .gitea/workflows/deploy.yml
env:
PORTAL_RELEASE: v0.6.20
PORTAL_RELEASE: v0.3.33
INSTANCE: redoal-portal
jobs:
@@ -57,10 +57,6 @@ jobs:
KANIDM_URL=${{ vars.KANIDM_URL }}
OAUTH2_CLIENT_ID=${{ vars.OAUTH2_CLIENT_ID }}
OAUTH2_CLIENT_SECRET=${{ secrets.OAUTH2_CLIENT_SECRET }}
# Onboarding from a desk (portal 0.3.40+, `invite:` alternatives): a
# Kanidm service-account token in idm_people_on_boarding. Empty
# means invites are not configured on this instance.
KANIDM_API_TOKEN=${{ secrets.KANIDM_API_TOKEN }}
PUBLIC_URL=${{ vars.PUBLIC_URL }}
COOKIE_SECURE=true
# This repo is its own instance's content source; branding
+6 -11
View File
@@ -15,18 +15,13 @@ jobs:
steps:
- uses: actions/checkout@v4
# The lint is portal itself (`portal lint`, since portal 0.6.0;
# iris is no longer released), at the version this site runs
# (PORTAL_RELEASE in deploy.yml).
# Same bare-metal runner/host as this repo's own Deploy workflow,
# which ships question_lint alongside the portal binary in every
# pinned release - so content is validated by the exact portal
# version this instance runs, not a hand-maintained yq/jq subset
# of the same rules.
- name: Lint questions
env:
PORTAL_RELEASE: v0.6.20
run: |
# The checkout is on a noexec mount for this runner; the cargo
# target dir is where it may run what it fetched.
bin="/var/local/cargo-target/portal-lint-$PORTAL_RELEASE"
[ -x "$bin" ] || { curl -sfL "${{ github.server_url }}/uhhm/portal/releases/download/$PORTAL_RELEASE/portal-x86_64-linux" -o "$bin" && chmod +x "$bin"; }
"$bin" lint --path questions
run: /srv/app/redoal-portal/current/question_lint --path questions
reload:
runs-on: bare
-16
View File
@@ -38,19 +38,3 @@ aggregates:
kept: { event: kept }
transitions:
open: [removed, kept]
# TestFlight beta signups (index.yaml's "Test it on your iPhone").
# Attended by automation, not a human desk: a new "requested" signup
# is handed to the App Store Connect API to invite the Apple ID to the
# closed beta; "withdrawn" (the /joined-testers self-transition) drops
# them from the invite list.
- bucket: redoal_testers
attended_by: >
n8n TestFlight onboarding workflow — ops/n8n/testflight-onboarding
in redoal/redoal. Consumes NATS events.redoal_testers.* and calls
App Store Connect POST /v1/betaTesters.
initial: open
states:
open: { event: requested }
withdrawn: { event: withdrawn }
transitions:
open: [withdrawn]
-15
View File
@@ -1,15 +0,0 @@
/* redoal - the skin over portal's own stylesheet
(site.yaml `stylesheet`, loaded after main.css, so these rules win). */
/* The way in sits beside the wordmark on every page. redoal.com is read
and answered without an account, so the invitation is not shown.
Whoever edits the site still signs in at /auth/login directly, and
once signed in the nav keeps its name and its way out. */
.session:has(a[href^="/auth/login"]) {
display: none;
}
/* Without :has(), the link alone goes and the empty nav stays. */
.session a[href^="/auth/login"] {
display: none;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

+20 -28
View File
@@ -1,42 +1,29 @@
# «Atelic Antics», the group exhibition at Podium, part of Attac's
# «Big Tech må vekk» 2026: opens 23 October 2026 at 19:00 and runs for a month. Announced
# The group exhibition at Podium, part of Attac's «Big Tech må vekk»
# 2026: opens 23 October 2026 at 19:00 and runs for a month. Announced
# in every header while it runs (portal's event: window); afterwards a
# followup, and a "post what happened" task lands on /review.
name: Where can you see it in person?
description: >
redoal is part of «Atelic Antics», the group exhibition at Podium,
opening 23 October and running for a month — the art strand of the
conference «Big Tech må vekk». Draw a shape at the podium, hear the
voices left there, and leave your own.
redoal is part of the group exhibition at Podium, opening 23 October
and running for a month — the art strand of the conference
«Big Tech må vekk». Draw on the screens, leave a voice at a shape,
hear who came before you.
event:
starts: 2026-10-23T19:00:00+02:00
# To 15 November, per the poster — not a month. The header announces
# this while it runs, so a duration that overshoots keeps inviting
# people to a closed room.
duration: 23d
duration: 31d
place: Podium, Hausmanns gate 34, Oslo
slideshow:
slides:
- image: images/atelic-antics.webp
caption: >
«Atelic Antics» — suggestions on digital resistance. Podium,
Hausmanns gate 34, 24 October to 15 November 2026.
width: 989
height: 1400
alternatives:
- name: Come draw at the podium
- name: Come draw on the wall
description: >
A podium with a touch screen, running the same app you can
install yourself. The shape you draw on it is an address: it
takes you to a place, and to the voices people have left there,
whether they stood here or drew it somewhere else.
The installation runs the same code as this site, on screens
you can stand in front of together — the network at the scale
of a room.
features:
- name: Opening 23 October, 19:00
description: >
«Atelic Antics» opens at [Podium](https://podium.enterprises/),
Hausmanns gate 34, and is up until 15 November. Come to the
opening, or any Saturday or Sunday after between 13:00 and
17:00.
At [Podium](https://podium.enterprises/), Hausmanns gate 34,
and up for a month. Come to the opening, or any Saturday
or Sunday after.
icon: lucide:calendar-days
- name: Part of «Big Tech må vekk»
description: >
@@ -47,7 +34,12 @@ alternatives:
icon: lucide:megaphone
- name: Draw, then listen
description: >
Draw a shape on the screen and arrive at a place.
Draw a shape on the touch screen and arrive at a place.
Listen to the voices left there, add your own, and watch
your line find the lines drawn before it.
icon: lucide:hand
- name: Take the zine with you
description: >
The printed zine sits in the room — six short pieces on what
a network like this could mean. Fold one, hand it on.
icon: lucide:book-open
+29 -43
View File
@@ -4,7 +4,9 @@ description: >
redoal is a gesture-addressed network. Draw a line and it becomes
an address — the drawing itself, ready to use the moment your hand
lifts. Similar drawings land near each other, and everything else
follows from that. Draw one below and see who's near.
follows from that. Draw one below and see who's near. Any hand
can draw — human or machine — and the network holds both to the
same promise: be the same hand you were yesterday.
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
@@ -40,25 +42,6 @@ alternatives:
The one trick, and what it enables — the parts that run today,
said plainly.
features:
- name: The count so far
description: >
Live from the front-door relay — the running tally of what's
been left at places.
icon: lucide:activity
resource:
source:
kind: url
url: https://relay.redoal.com/pulse
public: true
# /pulse (redoal ADR-0023) returns { voices_echoed: N }; shape
# it into one card — the number as the heading, the phrase
# beneath. Emit a bare object, not a wrapped [ … ]: the portal
# collects the jq output stream into an array itself, so a
# wrapping [ ] nests it ([[{…}]]) and drops to a raw JSON dump.
jq: >
{ "name": (.voices_echoed | tostring),
"description": "voices echoed so far" }
empty: The first voice hasn't echoed yet.
- name: A drawing is an address
description: >
The computer measures how your line curves, turns, and keeps
@@ -91,11 +74,22 @@ alternatives:
icon: lucide:stamp
- name: Draw and speak, and you're in
description: >
The primitives are the drawn line and the human voice. A
child, an elder, or a newcomer still learning the local
script arrives on the same terms as everyone else — that is
the whole entry requirement.
The primitives are the drawn line and the voice. A child,
an elder, a newcomer still learning the local script — or a
machine with a steady hand — arrives on the same terms as
everyone else; that is the whole entry requirement.
icon: lucide:hand
- name: But can AI do that?
description: >
It can — a machine can draw a line and leave a voice, and
one wrote much of the code this page runs on, in the open.
redoal asks a question people and machines answer the same
way: are you the hand you were last time? Every stroke and
every recording is sealed by its maker's own key, so who
you meet is whoever keeps showing up as themselves.
Resemblance decides closeness, continuity decides identity,
and those terms hold for everyone who draws.
icon: lucide:bot
- name: Carried by iroh, through varde
description: >
What is left at a place is kept and mirrored by
@@ -119,8 +113,7 @@ alternatives:
- name: Follow the build as it lands
description: >
The network as it is being built — and we need collaborators on
every new surface it grows. Desktop releases run free; the iPhone
beta is one tap away below.
every new surface it grows.
features:
- name: Communicate
description: >
@@ -132,25 +125,19 @@ alternatives:
description: Start exploring by running one of our applications.
icon: lucide:package
resource:
# The public manifest redoal's release job writes to
# dl.redoal.com (the repo is private; its own release assets
# 404 for visitors). Portal renders a manifest of this shape as
# one download card: the newest version, this device's file
# first, the Arch repo lines and TestFlight folded with the
# rest (content-reference, "A releases manifest").
source:
kind: url
url: https://dl.redoal.com/releases.json
kind: gitea_releases
owner: redoal
repo: redoal
public: true
empty: Nothing released yet — the first cut lands here.
- name: Test the iPhone app
description: >
The desktop releases above run free, no sign-up. The iPhone
build rides TestFlight (Apple's beta program) — [join the
redoal testers](https://testflight.apple.com/join/eR9dvHkz)
with one tap on your iPhone; no invitation, no email, no
waiting on us.
icon: lucide:smartphone
# url pinned to null while the repo is private - a private
# release's html_url 404s for anonymous visitors, and the
# card renders an unlinked heading instead (same lesson as
# uhhm/questions 9b7162f).
jq: >
.[] | {name: .name, description: .body, tag: .tag_name,
published: .published_at, url: null}
- name: Hear from us when it matters
description: >
@@ -173,4 +160,3 @@ alternatives:
- name: email
label: Email
type: email
-30
View File
@@ -1,30 +0,0 @@
id: /joined-testers
route: ^/joined-testers
followup: true
name: What happens next?
description: >
You asked for a place in the closed beta — here's the shape of it.
alternatives:
- name: Your invite is on its way
description: ""
features:
- name: Check your mail
description: >
A TestFlight invite goes to the Apple ID you left. Tap it on
your iPhone, install TestFlight if you don't have it, and
redoal lands on your home screen.
icon: lucide:mail
- name: It's rough on purpose
description: >
A beta, and an artwork before a product — the networked edges
are where the interesting questions live. Tell us what breaks.
icon: lucide:hammer
- name: Withdraw from the beta
description: >
Changed your mind? Confirm below and we'll drop your Apple ID from
the invite list.
self_transition:
bucket: redoal_testers
to: withdrawn
label: Remove me from the beta
-1
View File
@@ -5,4 +5,3 @@ hero:
kind: module
module: hero.js # this repo's sine-swings piece, served at /site/hero.js
wordmark_invert: true
stylesheet: custom.css