What shapes us? - redoal.com content: gesture hero, pseudo edition, releases
The 2024 lysbue question returns as live content: a gesture-drawing hero and form (type: gesture, wired to wss://relay.redoal.com), redoal/redoal's releases via the gitea_releases source (unlinked while the repo is private), and a subscribe flow. site.yaml rebrands the portal instance; buckets are redoal_-prefixed to coexist with uhhm's on the shared JetStream. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
|||||||
|
name: Lint and reload
|
||||||
|
|
||||||
|
# Lint runs on PRs too - it's the status check branch protection
|
||||||
|
# requires before the development-commit automation's PRs may merge
|
||||||
|
# (merge_when_checks_succeed). The reload only ever fires on a push
|
||||||
|
# that actually landed on main.
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: bare
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Same bare-metal runner/host as portal's own deploy job, which
|
||||||
|
# publishes this binary to a stable path on every deploy - runs
|
||||||
|
# portal's real transition-table/shape validation directly, not a
|
||||||
|
# hand-maintained yq/jq subset of the same rules (lint.sh, now
|
||||||
|
# superseded and removed).
|
||||||
|
- name: Lint questions
|
||||||
|
run: /srv/app/uhhm-portal/current/question_lint --path questions
|
||||||
|
|
||||||
|
reload:
|
||||||
|
runs-on: bare
|
||||||
|
needs: lint
|
||||||
|
if: github.event_name == 'push'
|
||||||
|
steps:
|
||||||
|
# Tells every running portal instance to re-fetch and atomically
|
||||||
|
# swap in the new content - see content::watch_for_reload in the
|
||||||
|
# portal repo. Fire and forget: no reply expected, no payload
|
||||||
|
# needed (the subject alone is the whole message).
|
||||||
|
- name: Tell portal to reload content
|
||||||
|
run: nats pub portal.content.reload '' --server "nats://infra:${{ secrets.NATS_TOKEN }}@127.0.0.1:4222"
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# questions (redoal.com)
|
||||||
|
|
||||||
|
The content behind [redoal.com](https://redoal.com) — a second face of
|
||||||
|
the same [portal](https://project.uhhm.no/uhhm/portal) question engine
|
||||||
|
that serves uhhm.no. Every page is a YAML file under `questions/`;
|
||||||
|
pushing to `main` lints and then tells every running portal instance
|
||||||
|
to hot-reload.
|
||||||
|
|
||||||
|
The full schema reference lives in
|
||||||
|
[uhhm/questions' README](https://project.uhhm.no/uhhm/questions) —
|
||||||
|
this repo only notes what's distinctive here:
|
||||||
|
|
||||||
|
- **`site.yaml`** rebrands the instance: title `redoal`, its own
|
||||||
|
wordmark, and a `gesture` hero — the landing page opens on a
|
||||||
|
drawing canvas wired to `wss://relay.redoal.com` (the
|
||||||
|
`redoal-relay` crate in [redoal/redoal](https://project.uhhm.no/redoal/redoal)),
|
||||||
|
so visitors' similar strokes echo to each other live. The wordmark
|
||||||
|
is white-stroked like uhhm's, because portal's light theme lands
|
||||||
|
wordmarks as ink via an invert filter.
|
||||||
|
- **`type: gesture`** on `index.yaml`'s "Our Understanding" — the
|
||||||
|
pseudo edition of the network: draw a path, it becomes a real
|
||||||
|
20-byte gesture key (computed by the relay with the canonical Rust
|
||||||
|
pipeline), and the submitted answer stores `{points, key}` in the
|
||||||
|
`redoal_gestures` bucket. Marked `optional: true` deliberately:
|
||||||
|
the widget's hidden input is invisible to HTML required-validation.
|
||||||
|
- **`gitea_releases`** on "Our Composition" — advertises
|
||||||
|
redoal/redoal's releases. The jq filter pins `url: null` while that
|
||||||
|
repo is private (a private release's html_url 404s for anonymous
|
||||||
|
visitors); flip it to `.html_url` if the repo ever goes public.
|
||||||
|
- **Bucket names are `redoal_`-prefixed** (`redoal_gestures`,
|
||||||
|
`redoal_subscribers`): both portal instances share one NATS
|
||||||
|
JetStream, and bare names would collide with uhhm's buckets.
|
||||||
|
|
||||||
|
Lint locally before pushing:
|
||||||
|
|
||||||
|
```
|
||||||
|
/srv/app/uhhm-portal/current/question_lint --path questions
|
||||||
|
```
|
||||||
|
|
||||||
|
(or from a portal checkout:
|
||||||
|
`cargo run --features ssr --bin question_lint -- --path <this repo>/questions`)
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# State graphs for event-sourced buckets - see portal's
|
||||||
|
# src/aggregates/mod.rs. Bucket names are redoal_-prefixed because
|
||||||
|
# both portal instances (uhhm.no and redoal.com) share one NATS
|
||||||
|
# JetStream; a bare "subscribers" would collide with uhhm's.
|
||||||
|
#
|
||||||
|
# redoal_gestures (index.yaml's record_as for drawn paths) has no
|
||||||
|
# entry on purpose: plain KV, no lifecycle - a drawn gesture is a
|
||||||
|
# fact, not a process.
|
||||||
|
aggregates:
|
||||||
|
- bucket: redoal_subscribers
|
||||||
|
initial: open
|
||||||
|
states:
|
||||||
|
open: { event: subscribed }
|
||||||
|
unsubscribed: { event: unsubscribed }
|
||||||
|
transitions:
|
||||||
|
open: [unsubscribed]
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
id: /
|
||||||
|
name: What shapes us?
|
||||||
|
description: >
|
||||||
|
redoal is a gesture-addressed network — peers find each other by
|
||||||
|
drawing similar shapes. The gesture is the address. Draw one above
|
||||||
|
and see who's near.
|
||||||
|
responsible:
|
||||||
|
name: Bendik Aagaard Lynghaug
|
||||||
|
contact: bl@uhhm.no
|
||||||
|
alternatives:
|
||||||
|
- name: Our Understanding
|
||||||
|
description: >
|
||||||
|
By associating similar movements while facilitating discourse we
|
||||||
|
discover signal within chaos. Draw a path — the network answers
|
||||||
|
with the shapes it heard nearby.
|
||||||
|
action: /shape
|
||||||
|
consequence: [Find what follows]
|
||||||
|
record_as: redoal_gestures
|
||||||
|
encouragements:
|
||||||
|
- What you don't know — your collaborators will.
|
||||||
|
features:
|
||||||
|
- name: ""
|
||||||
|
description: Start by creating a path
|
||||||
|
requirements:
|
||||||
|
# optional: the widget's hidden input skips HTML required-
|
||||||
|
# validation, so required would be unenforceable anyway
|
||||||
|
# (see the schema notes in this repo's README).
|
||||||
|
- name: curve
|
||||||
|
label: Curve
|
||||||
|
placeholder: Lines
|
||||||
|
type: gesture
|
||||||
|
relay: wss://relay.redoal.com
|
||||||
|
optional: true
|
||||||
|
- name: email
|
||||||
|
label: Email, if the echoes should reach you later
|
||||||
|
type: email
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
- name: Our Composition
|
||||||
|
description: >
|
||||||
|
The network as it is being built — every release of the core,
|
||||||
|
as it lands.
|
||||||
|
features:
|
||||||
|
- name: Releases
|
||||||
|
description: Cut from redoal/redoal on this Gitea.
|
||||||
|
resource:
|
||||||
|
source:
|
||||||
|
kind: gitea_releases
|
||||||
|
owner: redoal
|
||||||
|
repo: redoal
|
||||||
|
public: true
|
||||||
|
# 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: Our Devotion
|
||||||
|
description: >
|
||||||
|
Notes from the build — sent only when there is something worth
|
||||||
|
saying.
|
||||||
|
action: /subscribed
|
||||||
|
consequence: [Subscribe]
|
||||||
|
record_as: redoal_subscribers
|
||||||
|
encouragements:
|
||||||
|
- Consider yourself posted.
|
||||||
|
features:
|
||||||
|
- name: Where to send it
|
||||||
|
description: ""
|
||||||
|
requirements:
|
||||||
|
- name: name
|
||||||
|
label: Name
|
||||||
|
- name: email
|
||||||
|
label: Email
|
||||||
|
type: email
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
id: /shape
|
||||||
|
route: ^/shape
|
||||||
|
followup: true
|
||||||
|
name: The path continues
|
||||||
|
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: Draw another
|
||||||
|
description: >
|
||||||
|
The network gets more interesting with every shape it hears.
|
||||||
|
action: /
|
||||||
|
consequence: [Back to the canvas]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
id: /subscribed
|
||||||
|
route: ^/subscribed
|
||||||
|
followup: true
|
||||||
|
name: What should you expect?
|
||||||
|
description: >
|
||||||
|
Notes when the network learns something — that's the whole promise.
|
||||||
|
alternatives:
|
||||||
|
- name: You're on the list
|
||||||
|
description: ""
|
||||||
|
features:
|
||||||
|
- name: Rare, by design
|
||||||
|
description: A few considered notes a year — nothing more.
|
||||||
|
- name: Easy to leave
|
||||||
|
description: Every note carries a genuine, one-click unsubscribe.
|
||||||
|
|
||||||
|
- name: Unsubscribe
|
||||||
|
description: >
|
||||||
|
Using the link from one of our emails? Confirm below and we'll
|
||||||
|
stop writing.
|
||||||
|
self_transition:
|
||||||
|
bucket: redoal_subscribers
|
||||||
|
to: unsubscribed
|
||||||
|
label: Unsubscribe me
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Instance branding - see the schema notes in this repo's README and
|
||||||
|
# portal's content loader (src/content.rs, SiteConfig). The relay URL
|
||||||
|
# here drives the landing hero's ambient echoes; the same URL appears
|
||||||
|
# on index.yaml's gesture requirement for the form widget.
|
||||||
|
title: redoal
|
||||||
|
wordmark: https://project.uhhm.no/redoal/questions/raw/branch/main/wordmark.svg
|
||||||
|
hero:
|
||||||
|
kind: gesture
|
||||||
|
relay: wss://relay.redoal.com
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="710" height="220" viewBox="-30 -90 710 220" fill="none" stroke="#fff" stroke-width="26" stroke-linecap="round">
|
||||||
|
<!-- r e d o a l in the same geometric skeleton style as uhhm's
|
||||||
|
wordmark: 84-wide letters on a 124 grid, x-height 0..100,
|
||||||
|
ascenders to -60. White strokes so the light theme's
|
||||||
|
invert filter (style/main.css) lands it as ink on paper. -->
|
||||||
|
<path d="M0,0 V100 M0,42 A42,42 0 0 1 84,42"></path>
|
||||||
|
<path d="M124,50 H208 M208,50 A42,42 0 1 0 205.5,64.4"></path>
|
||||||
|
<path d="M332,-60 V100 M248,50 A42,42 0 1 1 332,50 A42,42 0 1 1 248,50"></path>
|
||||||
|
<path d="M372,50 A42,42 0 1 1 456,50 A42,42 0 1 1 372,50"></path>
|
||||||
|
<path d="M580,0 V100 M496,50 A42,42 0 1 1 580,50 A42,42 0 1 1 496,50"></path>
|
||||||
|
<path d="M620,-60 V100"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 809 B |
Reference in New Issue
Block a user