Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
531dbbf2de | ||
|
|
0a51852cb2 | ||
|
|
2d4f46d152 | ||
|
|
32547d782f | ||
|
|
5ec32823b4 | ||
|
|
c674348b38 | ||
|
|
b12a601cae | ||
|
|
59fc40e0cb | ||
|
|
45a9526ea2 | ||
|
|
a546c2b08f | ||
|
|
af572e91c8 |
@@ -18,7 +18,7 @@ on:
|
||||
- .gitea/workflows/deploy.yml
|
||||
|
||||
env:
|
||||
PORTAL_RELEASE: v0.3.33
|
||||
PORTAL_RELEASE: v0.3.36
|
||||
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
|
||||
|
||||
@@ -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.
|
||||
# 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).
|
||||
- name: Lint questions
|
||||
run: /srv/app/redoal-portal/current/question_lint --path questions
|
||||
env:
|
||||
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:
|
||||
runs-on: bare
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -13,7 +13,7 @@ event:
|
||||
duration: 31d
|
||||
place: Podium, Hausmanns gate 34, Oslo
|
||||
alternatives:
|
||||
- name: Come draw on the wall
|
||||
- name: See it in person at 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
|
||||
|
||||
+104
-113
@@ -1,14 +1,115 @@
|
||||
id: /
|
||||
name: What shapes us?
|
||||
name: What is redoal, and what can you do here?
|
||||
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. What it is comes first; the drawing is further
|
||||
down the page.
|
||||
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
|
||||
@@ -35,117 +136,7 @@ alternatives:
|
||||
relay: wss://relay.redoal.com
|
||||
optional: true
|
||||
|
||||
- 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.
|
||||
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
|
||||
- name: Get a note when something lands
|
||||
description: >
|
||||
Notes from the build — sent only when there is something worth
|
||||
saying.
|
||||
|
||||
@@ -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
|
||||
@@ -54,7 +54,7 @@ alternatives:
|
||||
value: "{key}"
|
||||
optional: true
|
||||
|
||||
- name: Hear from this address
|
||||
- name: Get a note when a voice lands here
|
||||
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 just happened
|
||||
- name: What your drawing became
|
||||
description: ""
|
||||
features:
|
||||
- name: An address, not an upload
|
||||
|
||||
Reference in New Issue
Block a user