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
7 changed files with 117 additions and 169 deletions
+1 -5
View File
@@ -18,7 +18,7 @@ on:
- .gitea/workflows/deploy.yml - .gitea/workflows/deploy.yml
env: env:
PORTAL_RELEASE: v0.3.36 PORTAL_RELEASE: v0.3.33
INSTANCE: redoal-portal INSTANCE: redoal-portal
jobs: jobs:
@@ -57,10 +57,6 @@ jobs:
KANIDM_URL=${{ vars.KANIDM_URL }} KANIDM_URL=${{ vars.KANIDM_URL }}
OAUTH2_CLIENT_ID=${{ vars.OAUTH2_CLIENT_ID }} OAUTH2_CLIENT_ID=${{ vars.OAUTH2_CLIENT_ID }}
OAUTH2_CLIENT_SECRET=${{ secrets.OAUTH2_CLIENT_SECRET }} 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 }} PUBLIC_URL=${{ vars.PUBLIC_URL }}
COOKIE_SECURE=true COOKIE_SECURE=true
# This repo is its own instance's content source; branding # This repo is its own instance's content source; branding
+6 -11
View File
@@ -15,18 +15,13 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
# iris (uhhm/iris) is the lint: it reads content with the portal # Same bare-metal runner/host as this repo's own Deploy workflow,
# release it is pinned to, so IRIS_RELEASE should match the portal # which ships question_lint alongside the portal binary in every
# this site runs (PORTAL_RELEASE in deploy.yml). # 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 - name: Lint questions
env: run: /srv/app/redoal-portal/current/question_lint --path questions
IRIS_RELEASE: v0.3.39
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/iris-$IRIS_RELEASE"
[ -x "$bin" ] || { curl -sfL "${{ github.server_url }}/uhhm/iris/releases/download/$IRIS_RELEASE/iris" -o "$bin" && chmod +x "$bin"; }
"$bin" check --path questions
reload: reload:
runs-on: bare runs-on: bare
-16
View File
@@ -38,19 +38,3 @@ aggregates:
kept: { event: kept } kept: { event: kept }
transitions: transitions:
open: [removed, kept] 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]
+1 -1
View File
@@ -13,7 +13,7 @@ event:
duration: 31d duration: 31d
place: Podium, Hausmanns gate 34, Oslo place: Podium, Hausmanns gate 34, Oslo
alternatives: alternatives:
- name: See it in person at Podium - name: Come draw on the wall
description: > description: >
The installation runs the same code as this site, on screens The installation runs the same code as this site, on screens
you can stand in front of together — the network at the scale you can stand in front of together — the network at the scale
+107 -104
View File
@@ -1,115 +1,16 @@
id: / id: /
name: What is redoal, and what can you do here? name: What shapes us?
description: > description: >
redoal is a gesture-addressed network. Draw a line and it becomes redoal is a gesture-addressed network. Draw a line and it becomes
an address — the drawing itself, ready to use the moment your hand an address — the drawing itself, ready to use the moment your hand
lifts. Similar drawings land near each other, and everything else lifts. Similar drawings land near each other, and everything else
follows from that. What it is comes first; the drawing is further follows from that. Draw one below and see who's near. Any hand
down the page. can draw — human or machine — and the network holds both to the
same promise: be the same hand you were yesterday.
responsible: responsible:
name: Bendik Aagaard Lynghaug name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no contact: bl@uhhm.no
alternatives: alternatives:
# The opener: what redoal is, in two features and no button. The
# two people it exists for are the one who draws and the one who
# leaves a voice; both keep what they made.
- name: What redoal is
description: >
The one trick, and what it enables — the parts that run today,
said plainly.
features:
- name: A drawing is an address, and yours to use
description: >
The computer measures how your line curves, turns, and keeps
rhythm, and boils it down to a twenty-byte fingerprint.
Similar drawings get similar fingerprints — two spirals land
like two houses on the same street, and that closeness is
the whole network. Your machine asks the machines around it,
"has anyone been near this shape?", and your spiral finds my
spiral directly, peer to peer.
icon: lucide:map-pin
- name: A voice stays where you left it, sealed by your own hand
description: >
A drawing is a place, and places hold voices. Listen to the
recordings people left at a gesture, leave your own on top,
and when someone stands at the same drawing right now, just
talk. Every recording carries a signature from the leaver's
own machine: keep the key and you're recognized, delete it
and you were never here. A child, an elder, or a newcomer
still learning the local script arrives on the same terms.
icon: lucide:mic
# The look around: nothing to fill in.
- name: Have a look around first
description: >
The network as it runs right now, and where it is going.
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: Releases
description: Run one of the desktop applications, free, no sign-up.
icon: lucide:package
resource:
source:
kind: gitea_releases
owner: redoal
repo: redoal
public: true
empty: Nothing released yet — the first cut lands here.
# 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: The iPhone app, in beta
description: >
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
- name: Carried by iroh, through varde
description: >
What is left at a place is kept and mirrored by
[varde](https://project.uhhm.no/uhhm/varde), a small
daemon that moves bytes between consenting machines over
[iroh](https://iroh.computer) — verified, rate-limited, and
legible to the network it runs on. Recordings travel that way,
with no company carrying them.
icon: lucide:waypoints
- name: Built in the open at UHHM
description: >
[UHHM](https://uhhm.no) builds and carries the gesture math,
the relay, and the portal this page runs on — and hosts the
network's first node. It is a prototype and an artwork before
it is a product: what you can touch is real and running, the
transport that reaches across the internet is being built
now, and the rough edges are where the interesting questions
live. A client, a relay, an instrument — if you want to put
the network on a surface it isn't on yet, say so through the
path below.
icon: lucide:anvil
# The offers.
- name: Draw a path and see who's near - name: Draw a path and see who's near
description: > description: >
By associating similar movements while facilitating discourse we By associating similar movements while facilitating discourse we
@@ -136,7 +37,109 @@ alternatives:
relay: wss://relay.redoal.com relay: wss://relay.redoal.com
optional: true optional: true
- name: Get a note when something lands - name: Meet a network you carry in your hand
description: >
The one trick, and what it enables — the parts that run today,
said plainly.
features:
- name: A drawing is an address
description: >
The computer measures how your line curves, turns, and keeps
rhythm, and boils it down to a twenty-byte fingerprint.
Similar drawings get similar fingerprints — two spirals land
like two houses on the same street, and that closeness is
the whole network.
icon: lucide:map-pin
- name: Your machine asks the room
description: >
To find someone, your machine asks the machines around it:
"has anyone been near this shape?" Your spiral finds my
spiral directly, peer to peer. The whole directory is the
shapes people know, passed along on a napkin.
icon: lucide:users
- name: Voices stay where you left them
description: >
A drawing is a place, and places hold voices. Listen to the
recordings people left at a gesture, leave your own on top,
and when someone stands at the same drawing right now, just
talk — live, machine to machine.
icon: lucide:mic
- name: Sealed by your own hand
description: >
Every recording and every stored stroke carries a signature
from the leaver's own machine — proof that it arrived
intact and that the same hand made the same things. The key
lives only with you: keep it and you're recognized, delete
it and you were never here.
icon: lucide:stamp
- name: Draw and speak, and you're in
description: >
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
[varde](https://project.uhhm.no/uhhm/varde), a small
daemon that moves bytes between consenting machines over
[iroh](https://iroh.computer) — verified, rate-limited, and
legible to the network it runs on. Recordings travel that way,
with no company carrying them.
icon: lucide:waypoints
- name: Built in the open at UHHM
description: >
[UHHM](https://uhhm.no) builds and carries the gesture math,
the relay, and the portal this page runs on — and hosts the
network's first node. It is a prototype and an artwork before
it is a product: what you can touch is real and running, the
transport that reaches across the internet is being built
now, and the rough edges are where the interesting questions
live.
icon: lucide:anvil
- 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.
features:
- name: Communicate
description: >
A client, a relay, an instrument — if you want to put the
network on a surface it isn't on yet, say so through the
path above and we'll find each other.
icon: lucide:message-circle
- name: Releases
description: Start exploring by running one of our applications.
icon: lucide:package
resource:
source:
kind: gitea_releases
owner: redoal
repo: redoal
public: true
empty: Nothing released yet — the first cut lands here.
# 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: > description: >
Notes from the build — sent only when there is something worth Notes from the build — sent only when there is something worth
saying. saying.
-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
+2 -2
View File
@@ -54,7 +54,7 @@ alternatives:
value: "{key}" value: "{key}"
optional: true optional: true
- name: Get a note when a voice lands here - name: Hear from this address
description: > description: >
The fallback for a phone without the app: one note when The fallback for a phone without the app: one note when
something is left at exactly this shape — and nothing about something is left at exactly this shape — and nothing about
@@ -81,7 +81,7 @@ alternatives:
type: hidden type: hidden
value: "{key}" value: "{key}"
- name: What your drawing became - name: What just happened
description: "" description: ""
features: features:
- name: An address, not an upload - name: An address, not an upload