Author SHA1 Message Date
Bendik Aagaard LynghaugandClaude Fable 5.1 bbb029e077 The opening moved to Saturday 24 October, 19:00
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 1s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MznPTC31w5mSUK4XMehcpi
2026-10-19 12:19:01 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 33724567b4 What you can make with redoal, and how far each piece is
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 1s
A new page, /create, answers the one question the front page kept
hinting at: what can be made here. Three paths - drawing your way in,
teaching a place a behaviour, carrying a piece of the network - each a
list of short cards cut to one measure: what a thing is, then where it
stands, running, landing on the phone next, or planned, with the accent
saying the same. The pulse and the releases keep themselves current.

The front page's informational alternative now says one thing and
hands over to /create with a Learn more link.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MznPTC31w5mSUK4XMehcpi
2026-10-19 12:00:29 +02:00
Bendik Aagaard LynghaugandClaude Opus 5.5 2050edf8b4 The podium is a place to draw, not the network in a room
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 1s
The exhibition copy promised screens to stand in front of together and
the network at the scale of a room. What is there is one podium with a
touch screen: a terminal to draw a shape on, which takes you to a place
and the voices left there, from the room or anywhere else.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MznPTC31w5mSUK4XMehcpi
2026-10-17 13:36:17 +02:00
Bendik Aagaard LynghaugandClaude Opus 5 4e5ac9ceb7 The Atelic Antics poster, and the run it actually has
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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
2026-10-16 10:52:11 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 7c2970c4cd The exhibition has its title, and the zine is not in the room
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
«Atelic Antics» names the group show at Podium where the page
introduces it; the zine feature goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MznPTC31w5mSUK4XMehcpi
2026-10-06 22:23:49 +02:00
Bendik LynghaugandClaude Opus 5 8d36c819c1 Hide the sign-in link beside the wordmark
Lint and reload / reload (push) Successful in 0s
Lint and reload / lint (push) Successful in 2s
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
2026-10-06 08:10:54 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 da515feb0a The lint is portal lint from the portal release
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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>
2026-10-05 13:13:18 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 aedf45cf0a Releases come from dl.redoal.com, and the site runs portal 0.6.20
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Failing after 2s
Lint and reload / reload (push) Skipped
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>
2026-10-05 12:56:32 +02:00
Bendik Aagaard LynghaugandClaude Opus 5 d1ae870f2d The releases card shows the cut you should run
Lint and reload / reload (push) Successful in 0s
Lint and reload / lint (push) Successful in 2s
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
2026-10-04 22:52:50 +02:00
Bendik Aagaard Lynghaug cf5108aec4 Take portal v0.5.2 (the rate limiter needs connect info)
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 1s
2026-09-28 18:13:50 +02:00
Bendik Aagaard LynghaugandClaude Opus 5 6a72c67dab Take portal v0.5.1
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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>
2026-09-28 17:53:46 +02:00
Bendik Aagaard LynghaugandClaude Opus 5 5e10e21814 Take portal v0.4.0
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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>
2026-09-28 16:27:47 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 0a51852cb2 deploy: carry KANIDM_API_TOKEN into the instance env
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 1s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-23 12:27:36 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 2d4f46d152 Lint with iris v0.3.39 (iris is versioned as portal from here on)
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-23 06:04:41 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 32547d782f Lint: run iris from the cargo target dir (the checkout is noexec on this runner)
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-22 17:58:27 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 5ec32823b4 Lint with iris v0.1.0
Lint and reload / lint (push) Failing after 2s
Lint and reload / reload (push) Skipped
The lint now lives in uhhm/iris, pinned to the portal release it
matches; question_lint leaves the portal tarball.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-22 17:42:31 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 c674348b38 Pin portal v0.3.36
Deploy instance / deploy (push) Successful in 2s
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
Question nav offers a followup only once it is earned; bounded
outbound fetches; uploads over 2 MB start working.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-22 17:02:32 +02:00
Bendik Aagaard LynghaugandClaude Fable 5 b12a601cae iPhone beta joins via the TestFlight public link
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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
2026-09-12 22:16:44 +02:00
Bendik Aagaard LynghaugandClaude Opus 4.8 59fc40e0cb Testers signup in the Releases alternative; redoal_testers bucket
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
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
2026-09-12 16:44:20 +02:00
Bendik Aagaard Lynghaug 45a9526ea2 Pin portal v0.3.35
Deploy instance / deploy (push) Successful in 1s
Lint and reload / lint (push) Successful in 3s
Lint and reload / reload (push) Successful in 0s
2026-09-12 12:21:16 +02:00
Bendik Aagaard LynghaugandClaude Fable 5.1 a546c2b08f Pin portal v0.3.34
Deploy instance / deploy (push) Successful in 1s
Lint and reload / lint (push) Successful in 3s
Lint and reload / reload (push) Successful in 0s
Question nav offers followups by reach (on the visitor's verified
path, or further down from the current page), not to anyone carrying
any chain.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4jrCgLiKKHAEFuZUJjckH
2026-09-11 19:43:44 +02:00
bl af572e91c8 Merge pull request 'Fix voices-echoed card: emit bare object, not wrapped array' (#5) from fix-pulse-jq-nested-array into main
Lint and reload / lint (push) Successful in 3s
Lint and reload / reload (push) Successful in 0s
Reviewed-on: #5
2026-09-11 12:07:47 +00:00
Bendik Aagaard LynghaugandClaude Opus 4.8 6c3aa46ab0 Fix voices-echoed card: emit bare object, not wrapped array
Lint and reload / lint (pull_request) Successful in 3s
Lint and reload / reload (pull_request) Skipped
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
2026-09-11 11:47:56 +02:00
bl c8d181b8a5 Merge pull request 'Flaunt 'voices echoed so far' on the index (live /pulse count)' (#4) from voices-echoed-count into main
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s
Reviewed-on: #4
2026-09-11 08:21:18 +00:00
10 changed files with 370 additions and 112 deletions
+5 -1
View File
@@ -18,7 +18,7 @@ on:
- .gitea/workflows/deploy.yml
env:
PORTAL_RELEASE: v0.3.33
PORTAL_RELEASE: v0.6.20
INSTANCE: redoal-portal
jobs:
@@ -57,6 +57,10 @@ 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
+11 -6
View File
@@ -15,13 +15,18 @@ jobs:
steps:
- uses: actions/checkout@v4
# 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.
# 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).
- name: Lint questions
run: /srv/app/redoal-portal/current/question_lint --path 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
reload:
runs-on: bare
+16
View File
@@ -38,3 +38,19 @@ 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
@@ -0,0 +1,15 @@
/* 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.

After

Width:  |  Height:  |  Size: 85 KiB

+234
View File
@@ -0,0 +1,234 @@
# What you can make with redoal, and how far each piece is. Every card
# is cut to the same measure: one sentence for what it is, one for
# where it stands, opening with a status word that the accent repeats:
# Running (green) - in your hands today
# Landing (amber) - on the desktop since 0.1.20, phones get it with
# the next beta; flip to Running after that build
# Planned (grey) - decided, not built
# The two live cards (the pulse, the releases) keep themselves current.
name: What can you make with redoal?
description: >
A drawing is an address. What you make is what you leave at it, what
you teach it to do, or the piece of the network you carry yourself.
Each card says what a thing is, then how far it is: running today,
landing on the phone next, or planned.
alternatives:
- name: Draw your way in
description: >
Making with nothing but a finger and a voice. Everything here runs
in the apps, in the browser on this page, or both.
features:
- name: The count so far
description: >
Live from the front door: how many voices have been left at
places so far.
icon: lucide:activity
color: "#6cc08b"
resource:
source:
kind: url
url: https://relay.redoal.com/pulse
public: true
jq: >
{ "name": (.voices_echoed | tostring),
"description": "voices echoed so far" }
empty: The first voice hasn't echoed yet.
- name: A line is an address
description: >
Draw a line and the shape itself is where you are; draw it
again anywhere and you are back. Running everywhere.
icon: lucide:map-pin
color: "#6cc08b"
- name: The line comes back
description: >
The address redraws the shape, so a place looks like the line
that made it. Running everywhere.
icon: lucide:pen-line
color: "#6cc08b"
- name: Neighbours at the line's foot
description: >
The nearest places line up under your drawing, fainter the
further off they are, and your ink settles on the best one.
Running in the apps.
icon: lucide:route
color: "#6cc08b"
- name: A place holds voices
description: >
Recordings stay at the drawing they were left at, for whoever
draws their way there. Running everywhere.
icon: lucide:archive
color: "#6cc08b"
- name: Leave a voice
description: >
Record on top of what is there; it carries your machine's
seal, not your name. Running in the apps and the browser.
icon: lucide:mic
color: "#6cc08b"
- name: Who is here
description: >
The people standing at the same drawing right now, counted
only once they have reached you. Landing: on the desktop now,
on the phone with the next beta.
icon: lucide:users
color: "#e0b04a"
- name: Talk, live
description: >
Hold to speak to the people here, from your machine to theirs,
nothing in between. Running whenever there is company.
icon: lucide:audio-lines
color: "#6cc08b"
- name: Answer with a drawing
description: >
A reply is a second line, anchored at the voice it answers.
Running in the apps.
icon: lucide:reply
color: "#6cc08b"
- name: One place across hands
description: >
The same line drawn facing another way is the same place.
Landing: on the desktop now, on the phone next.
icon: lucide:rotate-ccw
color: "#e0b04a"
- name: Voices that find you
description: >
Listen once, and the author's next voice at that place is sent
to you. Landing: on the desktop now, on the phone next.
icon: lucide:send
color: "#e0b04a"
- name: Favourites and recents
description: >
The places you keep, and the ones you passed on the way.
Running in the apps.
icon: lucide:star
color: "#6cc08b"
- name: Forget
description: >
Only the one who left a voice can erase it, and the erasure
travels as far as the voice did. Running everywhere.
icon: lucide:eraser
color: "#6cc08b"
- name: Draw in the browser
description: >
This site's canvas finds the place and who is near, without
installing anything. Running here.
icon: lucide:globe
color: "#6cc08b"
- name: Two lines at once
description: >
Two shapes added into one address. Planned.
icon: lucide:combine
color: "#8b9099"
- name: Teach a place a behaviour
description: >
A place can do more than hold voices. Behaviour is written in a
small language of twenty-four words and left at a drawing like
anything else, for every visitor's device to run.
features:
- name: A place that does something
description: >
A doorbell, a counter, a turn-taker: a small machine that runs
on the device of whoever arrives. Running from the command
line.
icon: lucide:bell
color: "#6cc08b"
- name: Twenty-four words
description: >
The whole language can send, remember, publish and change
state, and nothing else, so it can never do harm. Running.
icon: lucide:spell-check
color: "#6cc08b"
- name: Events, states, handlers
description: >
Name what can happen, where the thing can be, and what to do
when. Running.
icon: lucide:git-branch
color: "#6cc08b"
- name: Check it, then make the bytes
description: >
One command says whether the file is sound and how big it is
on the wire; another turns it into the bytes for a place.
Running.
icon: lucide:terminal
color: "#6cc08b"
- name: Try it dry
description: >
Fire events at it on your own machine and watch each one move,
before anyone else sees it. Running from the command line.
icon: lucide:flask-conical
color: "#6cc08b"
- name: The bench in the app
description: >
The other side of a place's sheet: how it works with its
surroundings. Running on personal devices; the installation
keeps it closed.
icon: lucide:wrench
color: "#6cc08b"
- name: Publish from the app
description: >
Leaving a behaviour at a place from the app itself, with no
command line. Planned.
icon: lucide:upload
color: "#8b9099"
- name: A whole experience at a place
description: >
A game, a service, an app, found by drawing near it. Planned.
icon: lucide:sparkles
color: "#8b9099"
- name: Carry a piece of the network
description: >
Nothing here belongs to a company. Install it, hold a copy of what
people leave, or run a door of your own.
features:
- name: Install it
description: >
Desktop for Linux and Mac, iPhone through the beta program.
Running.
icon: lucide:package
color: "#6cc08b"
resource:
source:
kind: url
url: https://dl.redoal.com/releases.json
public: true
empty: Nothing released yet — the first cut lands here.
- name: varde holds the bytes
description: >
A small daemon that keeps recordings and moves them between
machines that agreed to it. Running on the desktop, and built
into the phone app.
icon: lucide:hard-drive
color: "#6cc08b"
- name: The front door
description: >
The first node answers the browser, introduces phones to each
other and keeps a copy of what is left. Running on one machine
in Oslo.
icon: lucide:door-open
color: "#6cc08b"
- name: Two phones meet through it
description: >
Introduced at the door, two phones reach each other directly
and keep that path open. Landing: on the desktop now, on the
phone next.
icon: lucide:smartphone
color: "#e0b04a"
- name: Nothing arrives uninvited
description: >
A voice is only sent to you after you have listened to its
author. Landing: on the desktop now, on the phone next.
icon: lucide:hand
color: "#e0b04a"
- name: Same room, no door
description: >
Two desktops on one network find each other without the front
door at all. Running.
icon: lucide:wifi
color: "#6cc08b"
- name: A door of your own
description: >
Run a second front door that helps people meet and learns
nothing about them. Planned.
icon: lucide:key-round
color: "#8b9099"
+30 -22
View File
@@ -1,29 +1,42 @@
# 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
# «Atelic Antics», the group exhibition at Podium, part of Attac's
# «Big Tech må vekk» 2026: opens 24 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 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.
redoal is part of «Atelic Antics», the group exhibition at Podium,
opening 24 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.
event:
starts: 2026-10-23T19:00:00+02:00
duration: 31d
starts: 2026-10-24T19: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
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 on the wall
- name: Come draw at the podium
description: >
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.
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.
features:
- name: Opening 23 October, 19:00
- name: Opening 24 October, 19:00
description: >
At [Podium](https://podium.enterprises/), Hausmanns gate 34,
and up for a month. Come to the opening, or any Saturday
or Sunday after.
«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.
icon: lucide:calendar-days
- name: Part of «Big Tech må vekk»
description: >
@@ -34,12 +47,7 @@ alternatives:
icon: lucide:megaphone
- name: Draw, then listen
description: >
Draw a shape on the touch screen and arrive at a place.
Draw a shape on the 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
+28 -83
View File
@@ -37,87 +37,25 @@ alternatives:
- name: Meet a network you carry in your hand
description: >
The one trick, and what it enables — the parts that run today,
said plainly.
The one trick, and what it enables — said plainly, with how far
each piece is.
action: /create
consequence: [Learn more]
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. The card renders unlinked when the relay is quiet.
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
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.
Draw a line and the shape itself is where you are. Similar
lines land near each other, and everything else follows: the
voices people left at a place, the ones standing there now,
a line drawn back in answer. No accounts, and no company in
the middle.
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 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.
icon: lucide:hand
- 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.
every new surface it grows. Desktop releases run free; the iPhone
beta is one tap away below.
features:
- name: Communicate
description: >
@@ -129,19 +67,25 @@ 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: gitea_releases
owner: redoal
repo: redoal
kind: url
url: https://dl.redoal.com/releases.json
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: 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
- name: Hear from us when it matters
description: >
@@ -164,3 +108,4 @@ alternatives:
- name: email
label: Email
type: email
+30
View File
@@ -0,0 +1,30 @@
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,3 +5,4 @@ hero:
kind: module
module: hero.js # this repo's sine-swings piece, served at /site/hero.js
wordmark_invert: true
stylesheet: custom.css