9 Commits
Author SHA1 Message Date
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
8 changed files with 169 additions and 129 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ on:
- .gitea/workflows/deploy.yml
env:
PORTAL_RELEASE: v0.3.36
PORTAL_RELEASE: v0.6.20
INSTANCE: redoal-portal
jobs:
+7 -7
View File
@@ -15,18 +15,18 @@ jobs:
steps:
- uses: actions/checkout@v4
# iris (uhhm/iris) is the lint: it reads content with the portal
# release it is pinned to, so IRIS_RELEASE should match the portal
# this site runs (PORTAL_RELEASE in deploy.yml).
# 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
env:
IRIS_RELEASE: v0.3.39
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/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
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
+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

+22 -15
View File
@@ -1,19 +1,30 @@
# 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 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 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,
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 on the screens, leave a voice at a shape,
hear who came before you.
event:
starts: 2026-10-23T19:00:00+02:00
duration: 31d
# 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: See it in person at Podium
- name: Come draw on the wall
description: >
The installation runs the same code as this site, on screens
you can stand in front of together — the network at the scale
@@ -21,9 +32,10 @@ alternatives:
features:
- name: Opening 23 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: >
@@ -38,8 +50,3 @@ alternatives:
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
+121 -104
View File
@@ -1,115 +1,14 @@
id: /
name: What is redoal, and what can you do here?
name: What shapes us?
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. What it is comes first; the drawing is further
down the page.
follows from that. Draw one below and see who's near.
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
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
description: >
By associating similar movements while facilitating discourse we
@@ -136,7 +35,124 @@ alternatives:
relay: wss://relay.redoal.com
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: 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
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 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. Desktop releases run free; the iPhone
beta is one tap away below.
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:
# 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
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
- name: Hear from us when it matters
description: >
Notes from the build — sent only when there is something worth
saying.
@@ -157,3 +173,4 @@ alternatives:
- name: email
label: Email
type: email
+2 -2
View File
@@ -54,7 +54,7 @@ alternatives:
value: "{key}"
optional: true
- name: Get a note when a voice lands here
- name: Hear from this address
description: >
The fallback for a phone without the app: one note when
something is left at exactly this shape — and nothing about
@@ -81,7 +81,7 @@ alternatives:
type: hidden
value: "{key}"
- name: What your drawing became
- name: What just happened
description: ""
features:
- name: An address, not an upload
+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