Places: /shape/<key>, voices, address newsletter
Lint and reload / lint (push) Successful in 2s
Lint and reload / reload (push) Successful in 0s

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>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-08-30 16:05:26 +02:00
co-authored by Claude Fable 5
parent 605eb549f8
commit 66c31786ce
6 changed files with 156 additions and 42 deletions
+7
View File
@@ -14,3 +14,10 @@ aggregates:
unsubscribed: { event: unsubscribed } unsubscribed: { event: unsubscribed }
transitions: transitions:
open: [unsubscribed] open: [unsubscribed]
- bucket: redoal_watchers
initial: open
states:
open: { event: subscribed }
unsubscribed: { event: unsubscribed }
transitions:
open: [unsubscribed]
+13 -10
View File
@@ -13,12 +13,10 @@ alternatives:
description: > description: >
By associating similar movements while facilitating discourse we By associating similar movements while facilitating discourse we
discover signal within chaos. Draw a path — the network answers discover signal within chaos. Draw a path — the network answers
with the shapes it heard nearby. with the shape it heard, and with the places kept nearby. Pick
action: /shape one of those and it becomes your address.
# Announced, not yet open: the network answers with echoes today, action: /shape/{curve.key}
# what follows a shape is still being built. consequence: [Go to the place]
disabled: true
consequence: [Find what follows]
record_as: redoal_gestures record_as: redoal_gestures
encouragements: encouragements:
- What you don't know — your collaborators will. - What you don't know — your collaborators will.
@@ -36,10 +34,6 @@ alternatives:
type: gesture type: gesture
relay: wss://relay.redoal.com relay: wss://relay.redoal.com
optional: true optional: true
- name: email
label: Email, if the echoes should reach you later
type: email
optional: true
- name: Meet a network you carry in your hand - name: Meet a network you carry in your hand
description: > description: >
@@ -83,6 +77,15 @@ alternatives:
script arrives on the same terms as everyone else — that is script arrives on the same terms as everyone else — that is
the whole entry requirement. the whole entry requirement.
icon: lucide:hand icon: lucide:hand
- name: Carried by iroh, through varde
description: >
What is left at a place is kept and mirrored by
[varde](https://prosjekt.klingenbergbygg.no/bl/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: Young, and honest about it - name: Young, and honest about it
description: > description: >
A prototype and an artwork before it is a product. The A prototype and an artwork before it is a product. The
+33
View File
@@ -38,6 +38,39 @@ alternatives:
- to: unsubscribed - to: unsubscribed
label: Unsubscribe label: Unsubscribe
- name: Voices
description: >
Recordings left through the web, one answer per upload: the
address, the digest, the length. The audio itself lives in the
relay's node and in varde.
features:
- name: ""
description: ""
resource:
source:
kind: kv
bucket: redoal_voices
requires_group: owners
- name: Watchers
description: >
Who asked to hear from one exact address. Unsubscribing is
theirs (the link in their receipt); the desk can retire an
address that bounces.
action: /review
consequence: [Confirm]
features:
- name: ""
description: ""
resource:
source:
kind: kv
bucket: redoal_watchers
requires_group: owners
transitions:
- to: unsubscribed
label: Unsubscribe
- name: Announced pages - name: Announced pages
description: > description: >
Pages with an `event:` window, kept here by portal itself. When a Pages with an `event:` window, kept here by portal itself. When a
-32
View File
@@ -1,32 +0,0 @@
id: /shape
route: ^/shape
followup: true
name: Where does the path lead?
description: >
Your shape is in the room now. Echoes of it reach whoever draws
nearby — and theirs reach you, whenever you come back to draw again.
alternatives:
- name: What just happened
description: ""
features:
- name: An address, not an upload
description: >
The stroke became a 20-byte gesture key — a compressed
encoding of its shape. Similar shapes land on nearby keys;
that proximity is the whole network.
- name: Nothing to undo
description: >
A drawn path is a fact, not an account. There is no profile
behind it unless you left an email.
- name: What arrives here next
description: >
In the full network a drawing is a place that holds voices —
recordings left by whoever came before, and live talk with
whoever is standing here now. On this site it holds echoes
today; the voices follow.
- name: Draw another
description: >
The network gets more interesting with every shape it hears.
action: /
consequence: [Back to the canvas]
+94
View File
@@ -0,0 +1,94 @@
# The place a drawn (or picked) path leads to: /shape/<gesture key>.
# Reached through the landing alternative's templated action
# (/shape/{curve.key}); the key is the URL. What is kept here comes
# from the relay - the first redoal node - over its /place endpoint,
# and a voice left here goes back the same way (ADR-0015 in redoal).
name: Where does the path lead?
description: >
This is a place: the 20-byte address your path became — or the one
you picked from what the network keeps nearby. Voices left here play
here, for whoever draws their way to this shape.
alternatives:
- name: Listen to what was left here
description: ""
features:
- name: ""
description: ""
icon: lucide:ear
resource:
source:
kind: url
url: "https://relay.redoal.com/place/{key}"
public: true
empty: Nothing has been left at this address yet — yours could be the first voice here.
jq: >
.recordings[] | {name: ((.duration_ms / 1000 | round | tostring) + " seconds of voice"),
description: ("sealed by " + .author[0:8] + "…"),
audio: ("https://relay.redoal.com" + .audio)}
- name: Leave your voice here
description: >
Recorded in your browser, kept at exactly this address by the
relay — the first node of the network — and mirrored on from
there. The relay seals it with its own key on your behalf; a key
of your own comes with the app.
action: /shape/{voice.key}
consequence: [Keep it here]
record_as: redoal_voices
encouragements:
- It stays where you left it.
features:
- name: ""
description: Up to a minute. Say it once; it is sealed as it is.
icon: lucide:mic
requirements:
- name: voice
label: Voice
type: voice
relay: wss://relay.redoal.com
value: "{key}"
optional: true
- 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
anywhere else.
action: /subscribed
consequence: [Watch this address]
record_as: redoal_watchers
encouragements:
- Your shape now has a listener.
features:
- name: Where the note goes
description: >
The note is about one exact address, so it needs one exact
place to land.
icon: lucide:mail
requirements:
- name: email
label: Email
type: email
- name: key
label: Address
type: hidden
value: "{key}"
- name: What just happened
description: ""
features:
- name: An address, not an upload
description: >
The stroke became a 20-byte gesture key — an ordered chain of
headings, drawn back for you under the stroke. Similar shapes
land on nearby keys; picking a kept place makes its key yours.
- name: Nothing to undo
description: >
A drawn path is a fact, not an account. There is no profile
behind it unless you asked to hear from an address.
- name: Draw another
description: >
The network gets more interesting with every shape it hears.
action: /
consequence: [Back to the canvas]
+9
View File
@@ -21,3 +21,12 @@ alternatives:
bucket: redoal_subscribers bucket: redoal_subscribers
to: unsubscribed to: unsubscribed
label: Unsubscribe me label: Unsubscribe me
- name: Stop watching an address
description: >
Using the link from a note about a shape? Confirm below and that
address goes quiet for you.
self_transition:
bucket: redoal_watchers
to: unsubscribed
label: Stop watching