runs: uhhm on portal 0.5.1 (scrapped after preview), its mail rounds, and Tomter Vel's front door

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-28 20:34:53 +02:00
co-authored by Claude Opus 5.5
parent d4d4c7cba3
commit 5e736668e4
82 changed files with 6898 additions and 0 deletions
@@ -0,0 +1,21 @@
# Tomter Vel's front door, showing rather than inviting (local only)
Built from `plans/tomtervel.yaml` with the words of
`runs/tomtervel-opener-2026-09-23`, the front door reworded by Sonnet
after two builder changes. Not deployed: vel.klingenbergbygg.no is
what goes to the board.
- **Public lists are shown, not pointed at.** Each bucket the public
may read (traffic reports, playground and path faults, the
noticeboard) is a feature on the front door carrying its newest
three records inline (`sort_by(.submitted_ms) | reverse | .[:3]`,
same pruning and `public_states` as the full list) and a markdown
link to the full list at `/status/<bucket>`.
- **The card names what it shows.** The old "Have a look around
first / Nothing to fill in here" framing is gone from the fallback
and from the words guidance: the card is "Siste fra bygda", "Nye
meldinger og oppslag, slik de står akkurat nå".
Lints green with the iris mail checks (uhhm/iris PR 1); the two
warnings are real (a neighbour whose request was not solved is not
told; a member removed from the list is not told).
@@ -0,0 +1,19 @@
words: questions/index.yaml
content repo written to runs/tomtervel-frontdoor-2026-09-28/site
OK: 32 question(s), 13 aggregate(s) valid
OK: access policy, 116 rule(s), validates
OK: 7 mail(s): every placeholder fills, every link lands
need "bli-medlem": / [Bli medlem eller endre medlemskapet] -> /medlem [Bli medlem av Tomter Vel] -> "husstander"
need "endre-medlemskap": / [Bli medlem eller endre medlemskapet] -> /medlem [Oppdater eller avslutt medlemskapet] -> "medlemsendringer"
need "trafikkfare": / [Si fra om noe farlig eller ødelagt] -> /melde-fra [Meld fra om en trafikkfare] -> "trafikkmeldinger"
need "anleggsfeil": / [Si fra om noe farlig eller ødelagt] -> /melde-fra [Meld fra om noe ødelagt] -> "anleggsfeil"
need "horingsinnspill": / [Si din mening i en høringssak] -> "innspill"
need "hjelpe-til": / [Stille opp på 17. mai, dugnad eller i komité] -> /bidra [Bli med på dugnad eller arrangement] -> "frivillige"
need "komite": / [Stille opp på 17. mai, dugnad eller i komité] -> /bidra [Sitt i en komité som betyr noe for deg] -> "komitesoknader"
need "trenger-hjelp": / [Hjelp fra naboen, eller hjelp naboen] -> /naboer [Få en nabo til å stille opp] -> "hjelpebehov"
need "kan-hjelpe": / [Hjelp fra naboen, eller hjelp naboen] -> /naboer [Bli spurt når en nabo trenger en hånd] -> "hjelpere"
need "dele-utstyr": / [Hjelp fra naboen, eller hjelp naboen] -> /naboer [Lån ut eller lån av naboen] -> "oppslag"
need "utlegg": /komiteer/utlegg [Få pengene tilbake] -> "utlegg"
OK: 11 need(s) structurally met, 0 planned, 21 persona(s)
WARN: hjelpebehov: the person is mailed at "open" and not told when their case ends at ["ikke_lost"]
WARN: husstander: the person is mailed at "open" and not told when their case ends at ["utmeldt"]
@@ -0,0 +1,192 @@
aggregates:
- bucket: anleggsfeil
initial: open
states:
open:
event: received
tatt_tak_i:
event: tatt_tak_i
utbedret:
event: utbedret
transitions:
open:
- tatt_tak_i
tatt_tak_i:
- utbedret
- bucket: frivillige
initial: open
states:
open:
event: received
kontaktet:
event: kontaktet
satt_opp:
event: satt_opp
takket_nei:
event: takket_nei
transitions:
kontaktet:
- satt_opp
- takket_nei
open:
- kontaktet
- takket_nei
- bucket: hjelpebehov
initial: open
states:
open:
event: received
mail:
to: submitter
subject: Vi leter etter en nabo til deg
body: Vi har mottatt det du trenger hjelp til, og ser etter en nabo som kan stille opp. Du hører fra oss så snart vi har funnet noen.
formidlet:
event: formidlet
mail:
to: submitter
subject: En nabo er koblet på
body: |-
Vi har funnet en nabo som kan hjelpe. De tar kontakt med deg direkte.
Det du kan gjøre nå: {site}/decide/trenger-hjelp?chain={chain}&email={email}
ordnet:
event: ordnet
mail:
to: submitter
subject: Bra det løste seg
body: Godt å høre at det ordnet seg. Takk for at du sa fra, og lykke til videre.
ikke_lost:
event: ikke_lost
transitions:
formidlet:
- ordnet
- ikke_lost
open:
- formidlet
- ikke_lost
- bucket: hjelpere
initial: open
states:
open:
event: received
registrert:
event: registrert
trukket:
event: trukket
transitions:
open:
- registrert
- trukket
- bucket: husstander
initial: open
states:
open:
event: received
mail:
to: submitter
subject: Nesten i mål som medlem
body: |-
Takk for at du vil bli medlem. Du får en betalingsoppfordring med kontonummer og beløp så snart kasserer har sett på saken.
Det du kan gjøre nå: {site}/decide/bli-medlem?chain={chain}&email={email}
betalt:
event: betalt
mail:
to: submitter
subject: Medlemskapet er i orden
body: Kontingenten er registrert betalt. Du er nå medlem av Tomter Vel - velkommen med!
utmeldt:
event: utmeldt
transitions:
open:
- betalt
- utmeldt
- bucket: innspill
initial: open
states:
open:
event: received
tatt_med:
event: tatt_med
ikke_tatt_med:
event: ikke_tatt_med
transitions:
open:
- tatt_med
- ikke_tatt_med
- bucket: komitesoknader
initial: open
states:
open:
event: received
plassert:
event: plassert
avslatt:
event: avslatt
transitions:
open:
- plassert
- avslatt
- bucket: medlemsendringer
initial: open
states:
open:
event: received
oppdatert:
event: oppdatert
transitions:
open:
- oppdatert
- bucket: oppslag
initial: open
states:
open:
event: received
lagt_ut:
event: lagt_ut
mail:
to: submitter
subject: Oppslaget er synlig for naboene
body: Oppslaget ditt er lagt ut, og naboene kan nå se det.
tatt_ned:
event: tatt_ned
transitions:
open:
- lagt_ut
- tatt_ned
- bucket: trafikkmeldinger
initial: open
states:
open:
event: received
tatt_opp:
event: tatt_opp
ordnet:
event: ordnet
avvist:
event: avvist
transitions:
open:
- tatt_opp
- avvist
tatt_opp:
- ordnet
- avvist
- bucket: utlegg
initial: open
states:
open:
event: received
godkjent:
event: godkjent
utbetalt:
event: utbetalt
avvist:
event: avvist
transitions:
godkjent:
- utbetalt
- avvist
open:
- godkjent
- avvist
@@ -0,0 +1,264 @@
You write the words for one page of a website for this business.
Business: Tomter Vel
About: Velforeningen for Tomter, stiftet i 1947. Sju komiteer drevet på fritida: arrangementer, elvestien, lekeplassene, høringssvar, miljøgata, pendlerforhold og trafikk. 157 husstander er medlemmer.
Contact: Styret i Tomter Vel <post@tomtervel.no>
Language to write in: no
Everyone the site serves:
- door medlem: for en husstand i Tomter som vil bli medlem, betale kontingent, eller melde flytting, ny e-post eller utmelding; behind it: bli-medlem, endre-medlemskap
- door melde-fra: for noen som har sett noe farlig i trafikken, eller noe ødelagt på lekeplassen eller stien; behind it: trafikkfare, anleggsfeil
- door bidra: for noen som vil stille opp på 17. mai, dugnad eller et arrangement, eller sitte i en komité; behind it: hjelpe-til, komite
- door naboer: for en nabo som trenger en hånd med snømåking, handling eller skyss, kan gi en, eller har noe å låne ut; behind it: trenger-hjelp, kan-hjelpe, dele-utstyr
- bli-medlem: en husstand i Tomter - wants: å bli medlem og få betalt kontingenten. Handled by kasserer. Stages: open -> betalt -> utmeldt. Lands in `husstander`; its form collects: {navn}, {adresse}, {email}, {telefon} (optional).
- endre-medlemskap: et medlem som har flyttet, byttet e-post eller vil melde seg ut - wants: at velet har riktige opplysninger om dem. Handled by kasserer. Stages: open -> oppdatert. Lands in `medlemsendringer`; its form collects: {navn}, {adresse}, {hva_er_nytt} (long).
- trafikkfare: en som har sett et farlig sted i trafikken - wants: at velet tar det opp med kommunen eller den som eier veien. Handled by trafikk. Stages: open -> tatt_opp -> ordnet -> avvist. Lands in `trafikkmeldinger`; its form collects: {hvor}, {hva} (long), {epost} (optional).
- anleggsfeil: en som ser at noe på lekeplassen eller stien er ødelagt - wants: at det blir fikset før noen skader seg. Handled by lekeplasser. Stages: open -> tatt_tak_i -> utbedret. Lands in `anleggsfeil`; its form collects: {hvor}, {hva} (long).
- horingsinnspill: en beboer som har en mening om en sak kommunen har på høring - wants: at velet tar det med i sitt svar. Handled by horingsinstans. Stages: open -> tatt_med -> ikke_tatt_med. Lands in `innspill`; its form collects: {navn}, {sak}, {innspill} (long).
- hjelpe-til: en som vil hjelpe til på et arrangement eller en dugnad - wants: å bli satt opp på noe som passer dem. Handled by arrangementer. Stages: open -> kontaktet -> satt_opp -> takket_nei. Lands in `frivillige`; its form collects: {navn}, {telefon}, {hva}.
- komite: en som vil sitte i en komité - wants: en plass i den komiteen som driver med det de bryr seg om. Handled by styret. Stages: open -> plassert -> avslatt. Lands in `komitesoknader`; its form collects: {navn}, {epost}, {komite}.
- trenger-hjelp: en beboer som ikke får til noe selv for tiden, som snømåking, handling eller en skyss - wants: at en nabo stiller opp. Handled by nabohjelp. Stages: open -> formidlet -> ordnet -> ikke_lost. Lands in `hjelpebehov`; its form collects: {navn}, {email}, {adresse}, {hva} (long), {telefon} (optional).
- kan-hjelpe: en nabo som kan stille opp når noen trenger det - wants: å bli spurt når det passer. Handled by nabohjelp. Stages: open -> registrert -> trukket. Lands in `hjelpere`; its form collects: {navn}, {email}, {telefon}, {kan}.
- dele-utstyr: en nabo som har noe å låne ut, eller trenger å låne noe - wants: et oppslag som naboene ser. Handled by styret. Stages: open -> lagt_ut -> tatt_ned. Lands in `oppslag`; its form collects: {navn}, {email}, {har_eller_trenger}, {hva} (long).
- utlegg: en i en komité som har lagt ut for noe - wants: pengene tilbake. Handled by kasserer. Stages: open -> godkjent -> utbetalt -> avvist. Lands in `utlegg`; its form collects: {navn}, {belop}, {hva} (long).
The page: questions/index.yaml
It is the front door: the first page any visitor sees. `question` is the page's one question. It opens modestly: `opener` is the first card, what the business does in several features and no button at all - a stranger reads it and decides whether to trust the place, so say what is true and useful, not what to press. `shopping` is the second card: the site's live content, presented as it is - the latest records, a figure that matters, what has been built. It works best presented plainly: a heading that names what it shows ('Latest from the noticeboard', 'What we have built'), each item headed by its own content, `link` naming the full list. The content does the persuading; the card only has to label it, so it needs no invitation to look around and no word about forms. Only then come the offers: under `doors`, each entry is one alternative that leads to a page of its own for one kind of visitor, and its heading must let that visitor recognise themselves from the heading alone; under `needs`, each entry is one alternative with a form behind it.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"question": "<WRITE: the one question this page asks its reader>",
"description": "<WRITE: one or two short sentences>",
"opener": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"features": {
"medlem": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
},
"nabo": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
}
}
},
"shopping": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"items": {
"status-anleggsfeil": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"link": "<WRITE: the words of a link to the whole list, two to four words, naming it>",
"empty": "<WRITE: one short sentence shown when the list has nothing in it yet, inviting rather than apologising>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
},
"status-oppslag": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"link": "<WRITE: the words of a link to the whole list, two to four words, naming it>",
"empty": "<WRITE: one short sentence shown when the list has nothing in it yet, inviting rather than apologising>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
},
"status-trafikkmeldinger": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"link": "<WRITE: the words of a link to the whole list, two to four words, naming it>",
"empty": "<WRITE: one short sentence shown when the list has nothing in it yet, inviting rather than apologising>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
}
}
},
"doors": {
"medlem": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"for_whom": "<WRITE: a few words naming who this is for, addressed to them; or empty>",
"behind": "<WRITE: one sentence naming what a reader can do behind this door, in their words>"
},
"melde-fra": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"for_whom": "<WRITE: a few words naming who this is for, addressed to them; or empty>",
"behind": "<WRITE: one sentence naming what a reader can do behind this door, in their words>"
},
"bidra": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"for_whom": "<WRITE: a few words naming who this is for, addressed to them; or empty>",
"behind": "<WRITE: one sentence naming what a reader can do behind this door, in their words>"
},
"naboer": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"for_whom": "<WRITE: a few words naming who this is for, addressed to them; or empty>",
"behind": "<WRITE: one sentence naming what a reader can do behind this door, in their words>"
}
},
"needs": {
"horingsinnspill": {
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"description": "<WRITE: one or two short sentences>",
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"requires_title": "<WRITE: a form label for the field `requires_title`>",
"requires_description": "<WRITE: a form label for the field `requires_description`>",
"requires_icon": "<WRITE: a form label for the field `requires_icon`>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"labels": {
"navn": "<WRITE: a form label for the field `navn`>",
"sak": "<WRITE: a form label for the field `sak`>",
"innspill": "<WRITE: a form label for the field `innspill`>"
},
"hints": {
"navn": "<WRITE: an example answer for the field `navn`, as a placeholder; or empty>",
"sak": "<WRITE: an example answer for the field `sak`, as a placeholder; or empty>",
"innspill": "<WRITE: an example answer for the field `innspill`, as a placeholder; or empty>"
}
}
}
}
Reply with the JSON object only.
=== REPLY ===
{
"question": "Hva trenger du hjelp med i Tomter?",
"description": "Tomter Vel er for alle som bor her. Velg det som passer deg, så finner du veien videre.",
"opener": {
"heading": "Velforeningen for Tomter siden 1947",
"description": "Vi er sju komiteer som jobber på fritida for bygda vår. 157 husstander er med.",
"features": {
"medlem": {
"heading": "157 husstander er medlemmer",
"description": "Kontingenten går til arrangementer, lekeplasser, elvestien og arbeidet for tryggere trafikk.",
"icon": "users"
},
"nabo": {
"heading": "Naboer som stiller opp for hverandre",
"description": "Trenger du hjelp med snømåking, handling eller skyss, finner vi en nabo som kan. Du kan også låne og låne ut utstyr.",
"icon": "heart-handshake"
}
}
},
"shopping": {
"heading": "Siste fra bygda",
"description": "Nye meldinger og oppslag, slik de står akkurat nå.",
"items": {
"status-anleggsfeil": {
"heading": "Feil på lekeplasser og sti",
"description": "Det som er meldt inn, og hvor langt vi har kommet med å fikse det.",
"link": "Alle feilmeldinger",
"empty": "Ingenting er meldt ødelagt akkurat nå. Ser du noe, si fra.",
"icon": "construction"
},
"status-oppslag": {
"heading": "Oppslagstavla for naboer",
"description": "Utstyr som er til låns, og det naboene leter etter.",
"link": "Hele oppslagstavla",
"empty": "Tavla er tom nå. Legg gjerne ut det første oppslaget.",
"icon": "list"
},
"status-trafikkmeldinger": {
"heading": "Farlige steder i trafikken",
"description": "Det naboer har meldt fra om, og hva velet har gjort med det.",
"link": "Alle trafikkmeldinger",
"empty": "Ingen farlige steder er meldt inn nå. Har du sett et, fortell oss.",
"icon": "car"
}
}
},
"doors": {
"medlem": {
"heading": "Bli medlem eller endre medlemskapet",
"description": "Meld deg inn, betal kontingent, eller si fra om flytting, ny e-post eller utmelding.",
"button": "Til medlemskap",
"icon": "user-plus",
"for_whom": "For deg som bor i Tomter",
"behind": "Du kan bli medlem og betale kontingent, eller melde flytting, ny e-post eller utmelding."
},
"melde-fra": {
"heading": "Si fra om noe farlig eller ødelagt",
"description": "Har du sett et farlig sted i trafikken eller noe i stykker på lekeplassen eller stien? Da vet velet det.",
"button": "Meld fra",
"icon": "alert-triangle",
"for_whom": "For deg som har sett noe",
"behind": "Du kan melde fra om et farlig sted i trafikken eller om noe som er ødelagt på lekeplassen eller stien."
},
"bidra": {
"heading": "Stille opp på 17. mai, dugnad eller i komité",
"description": "Velet drives av folk som bidrar litt. Finn noe som passer deg.",
"button": "Vil bidra",
"icon": "hand-helping",
"for_whom": "For deg som vil være med",
"behind": "Du kan melde deg til hjelp på 17. mai, dugnad eller et arrangement, eller søke plass i en komité."
},
"naboer": {
"heading": "Hjelp fra naboen, eller hjelp naboen",
"description": "Snømåking, handling, skyss og utlån av utstyr, naboer imellom.",
"button": "Til nabohjelp",
"icon": "heart-handshake",
"for_whom": "For deg og naboene dine",
"behind": "Du kan be om hjelp, tilby hjelp eller legge ut noe du har å låne ut."
}
},
"needs": {
"horingsinnspill": {
"heading": "Si din mening i en høringssak",
"description": "Har kommunen en sak på høring som du har tanker om? Send oss innspillet ditt.",
"button": "Send innspill",
"encouragement": "Innspillet ditt leses av høringsgruppa før velet skriver sitt svar.",
"icon": "megaphone",
"requires_title": "Dette trenger vi fra deg",
"requires_description": "Navnet ditt, hvilken sak det gjelder og hva du mener.",
"requires_icon": "clipboard-list",
"road_title": "Slik går det videre",
"road_description": "Innspillet kommer inn til høringsgruppa. Så avgjør de om det blir tatt med i velets svar, og du får vite om det ble med eller ikke.",
"road_icon": "route",
"who_title": "Hvem leser det",
"who_description": "Høringsgruppa i Tomter Vel leser det du sender. Du når styret på post@tomtervel.no.",
"who_icon": "users",
"form_title": "Ditt innspill",
"form_description": "Ha saken og det du vil si klart før du begynner.",
"labels": {
"navn": "Navn",
"sak": "Hvilken sak gjelder det?",
"innspill": "Hva mener du?"
},
"hints": {
"navn": "Kari Nordmann",
"sak": "Reguleringsplan for Tomtervegen",
"innspill": "Jeg mener gangfeltet bør flyttes nærmere skolen, fordi barna krysser der."
}
}
}
}
@@ -0,0 +1,312 @@
needs:
- id: bli-medlem
who: en husstand i Tomter
wants: å bli medlem og få betalt kontingenten
enters: /
via: Bli medlem eller endre medlemskapet
lands_in: husstander
handled_by: kasserer
stages:
- open
- betalt
- utmeldt
done_when:
- betalt
- utmeldt
success:
- betalt
max_steps: 2
max_fields: 3
stage_words:
open: mottatt
betalt: betalt
utmeldt: meldt ut
- id: endre-medlemskap
who: et medlem som har flyttet, byttet e-post eller vil melde seg ut
wants: at velet har riktige opplysninger om dem
enters: /
via: Bli medlem eller endre medlemskapet
lands_in: medlemsendringer
handled_by: kasserer
stages:
- open
- oppdatert
done_when:
- oppdatert
success:
- oppdatert
max_steps: 2
max_fields: 3
stage_words:
open: mottatt
oppdatert: oppdatert
- id: trafikkfare
who: en som har sett et farlig sted i trafikken
wants: at velet tar det opp med kommunen eller den som eier veien
enters: /
via: Si fra om noe farlig eller ødelagt
lands_in: trafikkmeldinger
handled_by: trafikk
stages:
- open
- tatt_opp
- ordnet
- avvist
done_when:
- ordnet
- avvist
success:
- ordnet
max_steps: 2
max_fields: 2
stage_words:
open: mottatt
tatt_opp: tatt opp med kommunen
ordnet: ordnet
avvist: avvist
- id: anleggsfeil
who: en som ser at noe på lekeplassen eller stien er ødelagt
wants: at det blir fikset før noen skader seg
enters: /
via: Si fra om noe farlig eller ødelagt
lands_in: anleggsfeil
handled_by: lekeplasser
stages:
- open
- tatt_tak_i
- utbedret
done_when:
- utbedret
success:
- utbedret
max_steps: 2
max_fields: 2
stage_words:
open: mottatt
tatt_tak_i: tatt tak i
utbedret: utbedret
- id: horingsinnspill
who: en beboer som har en mening om en sak kommunen har på høring
wants: at velet tar det med i sitt svar
enters: /
via: Si din mening i en høringssak
lands_in: innspill
handled_by: horingsinstans
stages:
- open
- tatt_med
- ikke_tatt_med
done_when:
- tatt_med
- ikke_tatt_med
success:
- tatt_med
max_steps: 1
max_fields: 3
stage_words:
open: mottatt
tatt_med: tatt med i høringssvaret
ikke_tatt_med: ikke tatt med
- id: hjelpe-til
who: en som vil hjelpe til på et arrangement eller en dugnad
wants: å bli satt opp på noe som passer dem
enters: /
via: Stille opp på 17. mai, dugnad eller i komité
lands_in: frivillige
handled_by: arrangementer
stages:
- open
- kontaktet
- satt_opp
- takket_nei
done_when:
- satt_opp
- takket_nei
success:
- satt_opp
max_steps: 2
max_fields: 3
stage_words:
open: mottatt
kontaktet: kontaktet
satt_opp: satt opp
takket_nei: takket nei
- id: komite
who: en som vil sitte i en komité
wants: en plass i den komiteen som driver med det de bryr seg om
enters: /
via: Stille opp på 17. mai, dugnad eller i komité
lands_in: komitesoknader
handled_by: styret
stages:
- open
- plassert
- avslatt
done_when:
- plassert
- avslatt
success:
- plassert
max_steps: 2
max_fields: 3
stage_words:
open: mottatt
plassert: plassert i en komité
avslatt: avslått
- id: trenger-hjelp
who: en beboer som ikke får til noe selv for tiden, som snømåking, handling eller en skyss
wants: at en nabo stiller opp
enters: /
via: Hjelp fra naboen, eller hjelp naboen
lands_in: hjelpebehov
handled_by: nabohjelp
stages:
- open
- formidlet
- ordnet
- ikke_lost
done_when:
- ordnet
- ikke_lost
success:
- ordnet
max_steps: 2
max_fields: 4
stage_words:
open: mottatt
formidlet: formidlet til en nabo
ordnet: ordnet
ikke_lost: ikke løst
- id: kan-hjelpe
who: en nabo som kan stille opp når noen trenger det
wants: å bli spurt når det passer
enters: /
via: Hjelp fra naboen, eller hjelp naboen
lands_in: hjelpere
handled_by: nabohjelp
stages:
- open
- registrert
- trukket
done_when:
- registrert
- trukket
success:
- registrert
max_steps: 2
max_fields: 4
stage_words:
open: mottatt
registrert: registrert som hjelper
trukket: trukket
- id: dele-utstyr
who: en nabo som har noe å låne ut, eller trenger å låne noe
wants: et oppslag som naboene ser
enters: /
via: Hjelp fra naboen, eller hjelp naboen
lands_in: oppslag
handled_by: styret
stages:
- open
- lagt_ut
- tatt_ned
done_when:
- lagt_ut
- tatt_ned
success:
- lagt_ut
max_steps: 2
max_fields: 4
stage_words:
open: mottatt
lagt_ut: lagt ut
tatt_ned: tatt ned
- id: utlegg
who: en i en komité som har lagt ut for noe
wants: pengene tilbake
enters: /komiteer/utlegg
via: Få pengene tilbake
lands_in: utlegg
handled_by: kasserer
stages:
- open
- godkjent
- utbetalt
- avvist
done_when:
- utbetalt
- avvist
success:
- utbetalt
max_steps: 1
max_fields: 3
stage_words:
open: mottatt
godkjent: godkjent
utbetalt: utbetalt
avvist: avvist
enters_as: komiteer
personas:
- id: nyinnflyttet
need: bli-medlem
text: Vi flyttet til Tomter i mars og har hørt at det finnes et vel. Hvordan blir vi med, og hva koster det?
- id: glemte-a-betale
need: bli-medlem
text: Jeg har vært medlem før men fikk ikke betalt i fjor. Kan jeg bare vippse, og til hvem?
- id: ny-epost
need: endre-medlemskap
text: Vi har byttet e-postadresse og får ikke lenger noe fra dere.
- id: flytter
need: endre-medlemskap
text: Vi selger huset og flytter til Ski i august, så vi må ut av medlemslista.
- id: skolevei
need: trafikkfare
text: Bilene kjører altfor fort i svingen ved skolen om morgenen, og det er ikke fortau der ungene går.
- id: busslomme
need: trafikkfare
text: Det er umulig å se om det kommer noen når man skal ut fra busslomma ved butikken, hekken har blitt kjempehøy.
- id: huske
need: anleggsfeil
text: Huska på lekeplassen henger i én kjetting. Sønnen min dro i den i går og den holdt så vidt.
- id: bru
need: anleggsfeil
text: Planken på den lille brua på stien langs elva er råtten, jeg gikk nesten gjennom.
- id: blokker
need: horingsinnspill
text: Kommunen skal bygge blokker på jordet bak stasjonen, og jeg synes det er alt for høyt. Kan velet si ifra?
- id: togtider
need: horingsinnspill
text: Ruter vil kutte det tidlige toget. Jeg pendler til Oslo hver dag og vil at velet skriver til dem om det.
- id: vafler
need: hjelpe-til
text: Jeg kan steke vafler på 17. mai-frokosten hvis dere trenger folk.
- id: motorsag
need: hjelpe-til
text: Har motorsag og ledig helg, kan ta trær langs elvestien hvis det er en dugnad.
- id: pendler
need: komite
text: Jeg pendler og er lei av at ingen snakker med Ruter. Jeg vil gjerne være med i gjengen som jobber med det.
- id: planlegger
need: komite
text: Jeg er arealplanlegger av yrke og kunne bidratt når kommunen sender saker på høring.
- id: tilhenger
need: dele-utstyr
text: Jeg har en tilhenger som står ubrukt mesteparten av året, naboer kan gjerne låne den for en hundrelapp.
- id: stige
need: dele-utstyr
text: Trenger en lang stige en dag i helga for å rense takrenna, er det noen i nærheten som har?
- id: snomaking
need: trenger-hjelp
text: Jeg er 84 og klarer ikke å måke innkjørselen lenger. Er det noen som kan hjelpe meg når det snør?
- id: nyoperert
need: trenger-hjelp
text: Jeg er nyoperert i hofta og kommer meg ikke til butikken på noen uker. Kunne noen handlet for meg?
- id: hjemmekontor
need: kan-hjelpe
text: Jeg jobber hjemmefra og kan godt måke eller handle for noen som ikke får det til selv.
- id: pensjonert-elektriker
need: kan-hjelpe
text: Pensjonert elektriker, har bil og god tid. Si fra om noen trenger skyss eller en hånd med småting.
- id: kvittering
need: utlegg
text: Jeg kjøpte pølser og kakao til skøytedagen for 1 840 kroner, her er kvitteringa, vil ha det igjen.
@@ -0,0 +1 @@
qualifies: arrangementer
@@ -0,0 +1,65 @@
name: Hvem har meldt seg, og hvor langt har jeg kommet med å sette dem opp?
description: Oversikt over folk som vil hjelpe til, slik at du kan følge opp og sette dem opp på noe som passer.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Frivillige til arrangementer og dugnad
description: Her ser du hvem som har meldt seg til dugnad, 17. mai eller andre arrangementer, og hvor langt du har kommet med hver av dem.
action: /arrangementer
consequence:
- Lagre
features:
- name: Frivillige
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: frivillige
requires_group: arrangementer
transitions:
- from: kontaktet
to: satt_opp
label: Sett opp
- from: kontaktet
to: takket_nei
label: Takket nei
- from: open
to: kontaktet
label: Merk som kontaktet
- from: open
to: takket_nei
label: Takket nei
- name: Inviter noen inn i Arrangementer
description: De får en konto, plass i Arrangementer, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /arrangementer
consequence:
- Inviter
invite:
group: arrangementer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /arrangementer
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: arrangementer
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,82 @@
name: Vil du hjelpe til i nabolaget?
description: Vil du stille opp for nabolaget? Her melder du deg til dugnad og arrangementer, eller til en av komiteene.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Bli med på dugnad eller arrangement
description: 17. mai, dugnad eller andre arrangementer trenger folk som stiller opp. Si fra hva du kan bidra med, så setter vi deg opp på noe som passer.
action: /received/hjelpe-til
consequence:
- Meld meg på
record_as: frivillige
features:
- name: Hva skjer videre
description: Arrangementskomiteen tar kontakt og finner ut hva som passer for deg. Sier du ja, blir du satt opp på en oppgave – sier du nei takk, er det helt greit.
icon: lucide:clipboard-list
- name: Hvem leser dette
description: Arrangementskomiteen leser det du sender, og du kan nå dem på post@tomtervel.no i mellomtiden.
icon: lucide:users
- name: Meld deg som hjelper
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: telefon
label: Telefon
type: tel
placeholder: 912 34 567
- name: hva
label: Hva kan du hjelpe til med?
type: select
options:
- 17. mai
- Juletregranstenning
- Skøytedag
- Dugnad på elvestien
- Det som trengs
multiple: true
description: Fortell kort hva du kan hjelpe til med.
icon: lucide:hand-helping
encouragements:
- Det holder med noen ord om hva du kan tenke deg – vi tar kontakt når det nærmer seg.
- name: Sitt i en komité som betyr noe for deg
description: Velet drives av sju komiteer på fritida, og alle trenger flere hender. Si hvilken komité du har lyst til å være med i.
action: /received/komite
consequence:
- Meld interesse
record_as: komitesoknader
features:
- name: Hva skjer videre
description: Styret ser på ønsket ditt og finner en plass i komiteen du har meldt deg til, eller sier fra hvis det ikke er rom akkurat nå.
icon: lucide:clipboard-list
- name: Hvem leser dette
description: Styret leser det du sender, og du kan nå dem på post@tomtervel.no i mellomtiden.
icon: lucide:handshake
- name: Meld deg til en komité
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: epost
label: E-post
type: email
placeholder: kari@eksempel.no
- name: komite
label: Hvilken komité?
type: select
options:
- Arrangementer
- Elvesti
- Høringsinstans
- Leke- og møteplasser
- Miljøgate
- Pendlerforhold
- Trafikkforhold
multiple: true
description: Skriv hvilken komité du er interessert i.
icon: lucide:users
encouragements:
- Det tar bare et minutt, og noen fra styret svarer deg.
@@ -0,0 +1,11 @@
name: What would you like to do?
description: ''
alternatives:
- name: Utmeldt
description: ''
self_transition:
bucket: husstander
to: utmeldt
from:
- open
label: Utmeldt
@@ -0,0 +1,11 @@
name: Skal oppslaget om utstyret fortsatt stå ute?
description: Her sier du fra at utstyret er hentet eller ikke lenger tilgjengelig for utlån.
alternatives:
- name: Meld at utstyret er tatt ned
description: Oppslaget fjernes fra siden, så ingen flere spør om å låne det.
self_transition:
bucket: oppslag
to: tatt_ned
from:
- open
label: Ta ned oppslaget
@@ -0,0 +1,11 @@
name: Vil du fortsatt kunne bli spurt om å hjelpe en nabo?
description: Her ser du naboer som har bedt om en hånd, og kan velge om du fortsatt kan bidra eller trekke deg for nå.
alternatives:
- name: Ta en pause fra nabohjelpen
description: Du blir tatt av lista over naboer som kan spørres, men kan melde deg på igjen når det passer bedre.
self_transition:
bucket: hjelpere
to: trukket
from:
- open
label: Trekk meg
@@ -0,0 +1,11 @@
name: Har naboen fått hjelpen de trengte?
description: Her ser du henvendelsen fra naboen som trengte en hånd, og kan si fra når det er ordnet.
alternatives:
- name: Meld fra at hjelpen er gitt
description: Da vet vi at naboen har fått hjelpen sin, og saken lukkes.
self_transition:
bucket: hjelpebehov
to: ordnet
from:
- formidlet
label: Merk som ordnet
@@ -0,0 +1 @@
qualifies: horingsinstans
@@ -0,0 +1,59 @@
name: Hva sier vi i høringssvaret?
description: Her samler du innspillene og ser hva som er tatt med i velets høringssvar.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Innspill til høringssvar
description: Her ligger innspill fra beboere til saker kommunen har på høring.
action: /horingsinstans
consequence:
- Send svar
features:
- name: Innspill
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: innspill
requires_group: horingsinstans
transitions:
- from: open
to: tatt_med
label: Tatt med i svaret
- from: open
to: ikke_tatt_med
label: Ikke tatt med
- name: Inviter noen inn i Høringsinstans
description: De får en konto, plass i Høringsinstans, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /horingsinstans
consequence:
- Inviter
invite:
group: horingsinstans
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /horingsinstans
consequence:
- Send svar
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: horingsinstans
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,118 @@
name: Hva trenger du hjelp med i Tomter?
description: Tomter Vel er for alle som bor her. Velg det som passer deg, så finner du veien videre.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Velforeningen for Tomter siden 1947
description: Vi er sju komiteer som jobber på fritida for bygda vår. 157 husstander er med.
features:
- name: 157 husstander er medlemmer
description: Kontingenten går til arrangementer, lekeplasser, elvestien og arbeidet for tryggere trafikk.
icon: lucide:users
- name: Naboer som stiller opp for hverandre
description: Trenger du hjelp med snømåking, handling eller skyss, finner vi en nabo som kan. Du kan også låne og låne ut utstyr.
icon: lucide:heart-handshake
- name: Siste fra bygda
description: Nye meldinger og oppslag, slik de står akkurat nå.
features:
- name: Feil på lekeplasser og sti
description: Det som er meldt inn, og hvor langt vi har kommet med å fikse det. [Alle feilmeldinger](/status/anleggsfeil)
icon: lucide:construction
resource:
source:
kind: kv
bucket: anleggsfeil
public: true
states: []
empty: Ingenting er meldt ødelagt akkurat nå. Ser du noe, si fra.
jq: 'sort_by(.submitted_ms) | reverse | .[:3] | .[] | .responses |= {hva: .hva, hvor: .hvor}'
- name: Oppslagstavla for naboer
description: Utstyr som er til låns, og det naboene leter etter. [Hele oppslagstavla](/status/oppslag)
icon: lucide:list
resource:
source:
kind: kv
bucket: oppslag
public: true
states: []
empty: Tavla er tom nå. Legg gjerne ut det første oppslaget.
jq: 'sort_by(.submitted_ms) | reverse | .[:3] | .[] | .responses |= {har_eller_trenger: .har_eller_trenger, hva: .hva}'
- name: Farlige steder i trafikken
description: Det naboer har meldt fra om, og hva velet har gjort med det. [Alle trafikkmeldinger](/status/trafikkmeldinger)
icon: lucide:car
resource:
source:
kind: kv
bucket: trafikkmeldinger
public: true
states: []
empty: Ingen farlige steder er meldt inn nå. Har du sett et, fortell oss.
jq: 'sort_by(.submitted_ms) | reverse | .[:3] | .[] | .responses |= {hva: .hva, hvor: .hvor}'
- name: Bli medlem eller endre medlemskapet
description: Meld deg inn, betal kontingent, eller si fra om flytting, ny e-post eller utmelding.
action: /medlem
consequence:
- Til medlemskap
features:
- name: For deg som bor i Tomter
description: Du kan bli medlem og betale kontingent, eller melde flytting, ny e-post eller utmelding.
icon: lucide:user-plus
- name: Si fra om noe farlig eller ødelagt
description: Har du sett et farlig sted i trafikken eller noe i stykker på lekeplassen eller stien? Da vet velet det.
action: /melde-fra
consequence:
- Meld fra
features:
- name: For deg som har sett noe
description: Du kan melde fra om et farlig sted i trafikken eller om noe som er ødelagt på lekeplassen eller stien.
icon: lucide:alert-triangle
- name: Stille opp på 17. mai, dugnad eller i komité
description: Velet drives av folk som bidrar litt. Finn noe som passer deg.
action: /bidra
consequence:
- Vil bidra
features:
- name: For deg som vil være med
description: Du kan melde deg til hjelp på 17. mai, dugnad eller et arrangement, eller søke plass i en komité.
icon: lucide:hand-helping
- name: Hjelp fra naboen, eller hjelp naboen
description: Snømåking, handling, skyss og utlån av utstyr, naboer imellom.
action: /naboer
consequence:
- Til nabohjelp
features:
- name: For deg og naboene dine
description: Du kan be om hjelp, tilby hjelp eller legge ut noe du har å låne ut.
icon: lucide:heart-handshake
- name: Si din mening i en høringssak
description: Har kommunen en sak på høring som du har tanker om? Send oss innspillet ditt.
action: /received/horingsinnspill
consequence:
- Send innspill
record_as: innspill
features:
- name: Slik går det videre
description: Innspillet kommer inn til høringsgruppa. Så avgjør de om det blir tatt med i velets svar, og du får vite om det ble med eller ikke.
icon: lucide:route
- name: Hvem leser det
description: Høringsgruppa i Tomter Vel leser det du sender. Du når styret på post@tomtervel.no.
icon: lucide:users
- name: Ditt innspill
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: sak
label: Hvilken sak gjelder det?
type: text
placeholder: Reguleringsplan for Tomtervegen
- name: innspill
label: Hva mener du?
type: textarea
placeholder: Jeg mener gangfeltet bør flyttes nærmere skolen, fordi barna krysser der.
description: Ha saken og det du vil si klart før du begynner.
icon: lucide:megaphone
encouragements:
- Innspillet ditt leses av høringsgruppa før velet skriver sitt svar.
@@ -0,0 +1 @@
qualifies: kasserer
@@ -0,0 +1,102 @@
name: Hva venter på meg som kasserer akkurat nå?
description: Her har du oversikt over medlemmer, endringer og utlegg som venter på deg som kasserer.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Nye medlemmer som venter på registrering
description: Husstander som har meldt seg inn og venter på å bli registrert som betalende medlem.
action: /kasserer
consequence:
- Lagre
features:
- name: Husstander
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: husstander
requires_group: kasserer
transitions:
- from: open
to: betalt
label: Registrer betaling
- from: open
to: utmeldt
label: Meld ut
- name: Endringer som venter på å bli registrert
description: Medlemmer som har flyttet, byttet e-post eller vil melde seg ut, og venter på at opplysningene blir oppdatert.
action: /kasserer
consequence:
- Lagre
features:
- name: Medlemsendringer
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: medlemsendringer
requires_group: kasserer
transitions:
- from: open
to: oppdatert
label: Registrer endring
- name: Utlegg som venter på deg
description: Utlegg fra komitémedlemmer som venter på godkjenning eller utbetaling.
action: /kasserer
consequence:
- Lagre
features:
- name: Utlegg
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: utlegg
requires_group: kasserer
transitions:
- from: godkjent
to: utbetalt
label: Merk som utbetalt
- from: godkjent
to: avvist
label: Avvis likevel
- from: open
to: godkjent
label: Godkjenn utlegg
- from: open
to: avvist
label: Avvis utlegg
- name: Inviter noen inn i kassereren
description: De får en konto, plass i kassereren, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /kasserer
consequence:
- Inviter
invite:
group: kasserer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /kasserer
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: kasserer
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1 @@
qualifies: komiteer
@@ -0,0 +1,44 @@
name: Hva står ubehandlet i komiteen din nå?
description: Her holder du oversikt over sakene komiteen din har ansvar for, og flytter dem videre etter hvert som de blir fulgt opp.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Få tilbake det du har lagt ut
description: Har du lagt ut for noe til komiteen? Send det inn så kasserer kan betale deg tilbake.
action: /komiteer/utlegg
consequence:
- Send utlegg
- name: Inviter noen inn i komiteene
description: De får en konto, plass i komiteene, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /komiteer
consequence:
- Inviter
invite:
group: komiteer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /komiteer
consequence:
- Confirm
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: komiteer
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,10 @@
name: Hva skjer med utlegget mitt nå?
description: Utlegget er sendt til kasserer. Du får beskjed når det er sjekket.
alternatives:
- name: Pengene kommer på konto
description: Kasserer ser gjennom kvitteringen og overfører pengene til kontoen du oppga.
- name: Til forsiden
description: ''
action: /komiteer
consequence:
- Til forsiden
@@ -0,0 +1,38 @@
followup: false
name: Har du lagt ut penger for komiteen og vil ha dem tilbake?
description: Har du betalt for noe på vegne av en komité? Send inn utlegget, så får du pengene tilbake.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Få pengene tilbake
description: Har du lagt ut for noe til komiteen? Send det inn, så ordner kasserer resten.
action: /komiteer/utlegg-sent
consequence:
- Send inn
record_as: utlegg
features:
- name: Fra krav til utbetaling
description: Kasserer ser gjennom kravet og godkjenner det, og deretter blir pengene utbetalt til deg. Blir det avvist, hører du hvorfor.
icon: lucide:wallet
- name: Kasserer ser dette
description: Kasserer i styret leser kravet ditt, og kan nås på post@tomtervel.no om det haster.
icon: lucide:coins
- name: Krav om refusjon
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: belop
label: Beløp
type: text
placeholder: 450 kr
- name: hva
label: Hva gjaldt det
type: textarea
placeholder: Kaffe og kjeks til dugnaden
description: Ha kvittering eller bilag klart før du fyller ut.
icon: lucide:receipt
encouragements:
- Legg ved bilag om du har det, så går det raskere.
@@ -0,0 +1 @@
qualifies: lekeplasser
@@ -0,0 +1,59 @@
name: Hva må fikses på lekeplassene og stien nå?
description: Her følger komiteen for lekeplassene opp det som er meldt inn av skader, til det er fikset.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Det som er meldt inn av skader
description: Meldinger om noe som er ødelagt på lekeplassen eller langs stien, og som bør fikses.
action: /lekeplasser
consequence:
- Lagre
features:
- name: Anleggsfeil
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: anleggsfeil
requires_group: lekeplasser
transitions:
- from: open
to: tatt_tak_i
label: Ta tak i saken
- from: tatt_tak_i
to: utbedret
label: Merk som utbedret
- name: Inviter noen inn i Leke- og møteplasser
description: De får en konto, plass i Leke- og møteplasser, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /lekeplasser
consequence:
- Inviter
invite:
group: lekeplasser
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /lekeplasser
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: lekeplasser
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,72 @@
name: Vil du bli medlem, eller endre medlemskapet ditt?
description: Bli medlem av Tomter Vel, eller oppdater opplysningene dine hvis du allerede er medlem.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Bli medlem av Tomter Vel
description: Meld deg inn i velet, så holder vi deg oppdatert og du støtter arbeidet i nærmiljøet.
action: /received/bli-medlem
consequence:
- Bli medlem
record_as: husstander
features:
- name: Etter innmelding
description: Meldingen går til kasserer, som registrerer deg og sender deg kontingenten på e-post. Når den er betalt er du medlem.
icon: lucide:coins
- name: Hvem svarer deg
description: Kasserer i styret leser dette, og du kan nå oss på post@tomtervel.no i mellomtiden.
icon: lucide:user
- name: Meld deg inn
requirements:
- name: navn
label: Navn
type: text
placeholder: Ola Nordmann
- name: adresse
label: Adresse
type: text
placeholder: Tomterveien 12
- name: email
label: Email
type: email
- name: telefon
label: Telefon
type: tel
optional: true
placeholder: 123 45 678
description: Ha adressen i Tomter og en e-post du bruker klar.
icon: lucide:user-plus
encouragements:
- Kasserer sender deg kontingenten på e-post rett etterpå.
- name: Oppdater eller avslutt medlemskapet
description: Har du flyttet, byttet e-post eller vil melde deg ut? Gi oss beskjed så vi har riktige opplysninger.
action: /received/endre-medlemskap
consequence:
- Send endring
record_as: medlemsendringer
features:
- name: Etter du sender inn
description: Kasserer får beskjeden og oppdaterer medlemslisten, eller melder deg ut om det er det du ber om.
icon: lucide:refresh-cw
- name: Hvem svarer deg
description: Kasserer i styret leser dette, og du kan nå oss på post@tomtervel.no i mellomtiden.
icon: lucide:user
- name: Endre medlemskap
requirements:
- name: navn
label: Navn
type: text
placeholder: Ola Nordmann
- name: adresse
label: Adresse
type: text
placeholder: Ny adresse i Tomter
- name: hva_er_nytt
label: Hva vil du endre?
type: textarea
placeholder: Ny e-post, ny adresse, eller ønske om utmelding
description: Skriv navnet ditt og hva som er nytt.
icon: lucide:pencil
encouragements:
- Det tar bare et par minutter, og kasserer ordner resten.
@@ -0,0 +1,69 @@
name: Hva vil du melde fra om?
description: Har du sett noe farlig i trafikken, eller noe ødelagt på lekeplassen eller stien? Her sier du fra til velet.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Meld fra om en trafikkfare
description: Sett du noe farlig i trafikken? Fortell trafikkomiteen om det, så tar de det videre.
action: /received/trafikkfare
consequence:
- Send inn
record_as: trafikkmeldinger
features:
- name: Hva skjer videre
description: Trafikkomiteen tar meldingen din opp med kommunen eller den som eier veien. Du får vite om saken blir ordnet eller avvist.
icon: lucide:route
- name: Hvem leser dette
description: Trafikkomiteen leser meldingen din; haster det, kan du nå styret på post@tomtervel.no.
icon: lucide:car
- name: Meld trafikkfare
requirements:
- name: hvor
label: Hvor var det
type: text
placeholder: Krysset Tomterveien / Elvestien
- name: hva
label: Hva så du
type: textarea
placeholder: Dårlig sikt i krysset, biler kjører fort
- name: epost
label: E-post (valgfritt)
type: email
optional: true
placeholder: ola.nordmann@epost.no
description: Fortell hva du så, hvor det var, og legg gjerne igjen e-posten din hvis vi trenger å spørre mer.
icon: lucide:alert-triangle
encouragements:
- Bare noen linjer om hva og hvor er nok til at vi kan følge opp.
- name: Meld fra om noe ødelagt
description: Se noe ødelagt på en lekeplass eller langs elvestien, så tar lekeplasskomiteen tak i det.
action: /received/anleggsfeil
consequence:
- Send inn
record_as: anleggsfeil
features:
- name: Hva skjer videre
description: Meldingen går til lekeplasskomiteen, som ser på den og tar tak i saken. Når feilen er utbedret, er saken avsluttet.
icon: lucide:wrench
- name: Hvem leser dette
description: Lekeplasskomiteen leser meldingen din; til det haster kan du nå styret på post@tomtervel.no.
icon: lucide:hammer
- name: Meld anleggsfeil
requirements:
- name: hvor
label: Hvor er det
type: select
options:
- Lekeplassen
- Elvestien
- Skøytebanen
- Et annet sted
- name: hva
label: Hva er ødelagt
type: textarea
placeholder: Løs planke på gjerdet ved husken
description: Fortell hva som er ødelagt og omtrent hvor det er.
icon: lucide:construction
encouragements:
- Det holder med noen ord om hva du så og hvor.
@@ -0,0 +1,125 @@
name: Trenger du en hånd, eller kan du gi en?
description: Godt naboskap gjør hverdagen lettere. Trenger du en hånd, kan gi en, eller har noe å låne bort?
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Få en nabo til å stille opp
description: Får du ikke til snømåking, en handletur eller skyss for tiden? Si fra, så finner vi en nabo som kan stille opp.
action: /received/trenger-hjelp
consequence:
- Be om hjelp
record_as: hjelpebehov
features:
- name: Fra melding til hjelp
description: Nabohjelpen finner en nabo som kan stille opp. Er det ordnet, eller om det ikke lot seg løse, får du beskjed.
icon: lucide:hand-helping
- name: Hvem ser dette
description: Nabohjelpen tar imot og finner noen til deg, eller ring post@tomtervel.no i mellomtiden.
icon: lucide:users
- name: Be om en hånd
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: email
label: E-post
type: email
placeholder: kari@eksempel.no
- name: adresse
label: Adresse
type: text
placeholder: Tomterveien 12
- name: hva
label: Hva trenger du hjelp til
type: textarea
placeholder: Måke snø på trappa, handle inn litt mat
- name: telefon
label: Telefon
type: tel
optional: true
placeholder: 123 45 678
description: Skriv kort hva du trenger hjelp til.
icon: lucide:heart-handshake
encouragements:
- Vi finner en nabo som kan stille opp så fort som mulig.
- name: Bli spurt når en nabo trenger en hånd
description: Kan du stille opp med snømåking, en handletur eller skyss når en nabo trenger det? Meld deg, så blir du spurt når det passer.
action: /received/kan-hjelpe
consequence:
- Meld deg
record_as: hjelpere
features:
- name: Fra påmelding til spørsmål
description: Du blir registrert som hjelper. Trekker du deg tilbake senere, er det bare å si fra.
icon: lucide:user-check
- name: Hvem ser dette
description: Nabohjelpen har oversikten og ringer deg direkte når det er noe, eller nås på post@tomtervel.no.
icon: lucide:heart-handshake
- name: Meld deg som hjelper
requirements:
- name: navn
label: Navn
type: text
placeholder: Kari Nordmann
- name: email
label: E-post
type: email
placeholder: kari@eksempel.no
- name: telefon
label: Telefon
type: tel
placeholder: 123 45 678
- name: kan
label: Hva kan du hjelpe med
type: select
options:
- Snømåking
- Handling
- Kjøring
- Småfiks i huset
- En prat og litt selskap
- Det som trengs
multiple: true
description: Fortell kort hva du kan bidra med.
icon: lucide:hand-helping
encouragements:
- Du blir bare kontaktet når noe passer for deg.
- name: Lån ut eller lån av naboen
description: Har du noe naboene kan få låne, eller trenger du å låne noe selv? Legg ut et oppslag så ser de andre på Tomter det.
action: /received/dele-utstyr
consequence:
- Legg ut oppslag
record_as: oppslag
features:
- name: Fra oppslag til avtale
description: Oppslaget legges ut for naboene å se. Når det er ordnet eller ikke lenger aktuelt, tas det ned igjen.
icon: lucide:clipboard-list
- name: Hvem ser dette
description: Styret legger ut oppslaget og kan nås på post@tomtervel.no i mellomtiden.
icon: lucide:users
- name: Lån eller utlån
requirements:
- name: navn
label: Navn
type: text
placeholder: Ola Nordmann
- name: email
label: E-post
type: email
placeholder: ola@eksempel.no
- name: har_eller_trenger
label: Har du eller trenger du
type: select
options:
- Jeg har noe å låne ut
- Jeg trenger å låne noe
- name: hva
label: Hva gjelder det
type: textarea
placeholder: Hengerfeste til bil, tilhenger, stige
description: Skriv kort hva det gjelder, så folk skjønner det med en gang.
icon: lucide:package
encouragements:
- Vi legger det ut så naboene kan se det.
@@ -0,0 +1 @@
qualifies: nabohjelp
@@ -0,0 +1,85 @@
name: Hvem trenger hjelp, og hvem kan stille opp?
description: Her kobler du naboer som trenger hjelp med dem som kan stille opp.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Naboer som trenger en hånd
description: Naboer som trenger en hånd med snømåking, handling eller skyss – klare til å bli koblet med noen som kan hjelpe.
action: /nabohjelp
consequence:
- Lagre
features:
- name: Hjelpebehov
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: hjelpebehov
requires_group: nabohjelp
transitions:
- from: formidlet
to: ordnet
label: Meld ordnet
- from: formidlet
to: ikke_lost
label: Meld ikke løst
- from: open
to: formidlet
label: Koble til nabo
- from: open
to: ikke_lost
label: Meld ikke løst
- name: Naboer som kan stille opp
description: Naboer som har sagt de kan stille opp – klare til å bli spurt når noen trenger dem.
action: /nabohjelp
consequence:
- Lagre
features:
- name: Hjelpere
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: hjelpere
requires_group: nabohjelp
transitions:
- from: open
to: registrert
label: Registrer som hjelper
- from: open
to: trukket
label: Meld trukket
- name: Inviter noen inn i nabohjelpen
description: De får en konto, plass i nabohjelpen, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /nabohjelp
consequence:
- Inviter
invite:
group: nabohjelp
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /nabohjelp
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: nabohjelp
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,15 @@
name: Hva skjer med meldingen min nå?
description: Meldingen din om skaden er sendt til lekeplasskomiteen. De ser over det du har sendt.
alternatives:
- name: Komiteen tar tak i det
description: Lekeplasskomiteen ser på meldingen og tar tak i det som må fikses før noen skader seg.
- name: Se andre meldte feil
description: Se hva andre har meldt inn av skader på lekeplassene og stien, og hvor langt det har kommet.
action: /status/anleggsfeil
consequence:
- Se meldte feil
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer etter at jeg har meldt meg inn?
description: Vi har mottatt innmeldingen din. Kasserer tar kontakt med betalingsinfo så snart medlemskapet er registrert.
alternatives:
- name: Kasserer sender deg betalingsinfo
description: Kasserer går gjennom nye innmeldinger og sender deg kontonummer og beløp for kontingenten.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,15 @@
name: Hva skjer med det jeg har lagt ut?
description: Takk for at du la ut noe naboene kan låne. Vi legger det ut på oppslaget så snart vi kan.
alternatives:
- name: Styret legger det ut for deg
description: En i styret legger utstyret ut på naboenes oppslag, så andre kan se det og spørre om å låne.
- name: Se alt naboene deler
description: Se hva andre i Tomter har lagt ut til utlån akkurat nå.
action: /status/oppslag
consequence:
- Se hva naboer deler
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer nå med det jeg meldte inn?
description: Vi har mottatt beskjeden om at du har flyttet, byttet e-post eller vil melde deg ut.
alternatives:
- name: Kasserer retter opp opplysningene
description: Kasserer oppdaterer medlemslista og gir deg beskjed hvis det er noe mer vi trenger fra deg.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer nå som jeg har meldt meg?
description: Takk for at du vil hjelpe til. Arrangementskomiteen har fått beskjed og tar kontakt med deg.
alternatives:
- name: Komiteen tar kontakt
description: Du hører fra noen i komiteen når de vet hva de trenger hjelp til, gjerne noen dager før arrangementet eller dugnaden.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer med det jeg har sagt om saken?
description: Innspillet ditt er sendt til høringsinstansen i velet.
alternatives:
- name: Innspillet ditt inn i vurderingen
description: De ser på om det kan tas med i velets høringssvar til kommunen, og gir beskjed om det blir med.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer nå som jeg har registrert meg?
description: Takk for at du sier fra at du kan stille opp. Nabohjelp-komiteen tar imot meldingen og legger deg inn på lista over naboer som kan hjelpe.
alternatives:
- name: Du blir kontaktet ved behov
description: Når en nabo trenger hjelp med noe du har sagt du kan bidra med, tar komiteen kontakt med deg direkte.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer nå som jeg har meldt interesse for en komité?
description: Takk for at du vil bidra! Styret har fått beskjed og ser på hvilken komité som passer best for deg.
alternatives:
- name: Vi finner riktig komité til deg
description: Noen fra styret tar kontakt for å høre mer om hva du liker å drive med, og finner en komité som passer.
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,15 @@
name: Hva skjer med meldingen min nå?
description: Meldingen din om trafikkfaren er sendt til komiteen for trafikk.
alternatives:
- name: Trafikkomiteen tar den videre
description: Trafikkomiteen ser gjennom meldinger jevnlig og tar det videre med kommunen eller den som eier veien der det trengs.
- name: Andre meldte trafikkfarer
description: Se hva andre har meldt inn, og status på sakene.
action: /status/trafikkmeldinger
consequence:
- Se andre trafikkfarer
- name: Tilbake til forsiden
description: ''
action: /
consequence:
- Tilbake til forsiden
@@ -0,0 +1,10 @@
name: Hva skjer nå som jeg har bedt om hjelp?
description: Meldingen din er sendt til nabohjelpa. Vi ser etter en nabo som kan stille opp.
alternatives:
- name: Vi finner en nabo til deg
description: Vi tar kontakt med noen som kan hjelpe, så snart vi finner en som passer.
- name: Til forsiden
description: ''
action: /
consequence:
- Til forsiden
@@ -0,0 +1,24 @@
name: Hva skjer med det jeg har meldt fra om?
description: Her ser du meldinger om ødelagt lekeutstyr og skader på elvestien, og hvor langt hver sak har kommet.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Status på meldte anleggsfeil
description: Alle meldinger er åpne for alle å se.
features:
- name: Anleggsfeil
description: Each row is one case and the stage it has reached. Names and contact details are not shown here.
resource:
source:
kind: kv
bucket: anleggsfeil
public: true
states: []
empty: Nothing here yet.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {hva: .hva, hvor: .hvor}'
- name: Tilbake til meldinger
description: ''
action: /
consequence:
- Tilbake til meldinger
@@ -0,0 +1,24 @@
name: Hva er sendt inn, og hvor langt har det kommet?
description: Her ser du alt som er sendt inn og hvor langt hvert oppslag har kommet.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Oversikt over det som er meldt inn
description: Åpen liste – navn og detaljer vises ikke.
features:
- name: Oppslag
description: Each row is one case and the stage it has reached. Names and contact details are not shown here.
resource:
source:
kind: kv
bucket: oppslag
public: true
states: []
empty: Nothing here yet.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {har_eller_trenger: .har_eller_trenger, hva: .hva}'
- name: Tilbake
description: ''
action: /
consequence:
- Tilbake
@@ -0,0 +1,24 @@
name: Er det meldt fra om noe farlig i trafikken der jeg bor?
description: Her ser du farlige steder i trafikken som er meldt inn, og hvor langt saken har kommet.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Trafikkmeldinger og status
description: Alle meldinger som er sendt inn, og hvor de står nå.
features:
- name: Trafikkmeldinger
description: Each row is one case and the stage it has reached. Names and contact details are not shown here.
resource:
source:
kind: kv
bucket: trafikkmeldinger
public: true
states: []
empty: Nothing here yet.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {hva: .hva, hvor: .hvor}'
- name: Tilbake
description: ''
action: /
consequence:
- Tilbake
@@ -0,0 +1 @@
qualifies: styret
@@ -0,0 +1,219 @@
name: Hva venter på styret akkurat nå?
description: 'Herfra følger styret opp det som ikke hører under en enkelt komité: høringssvar, komitéplasser og oppslag fra naboer.'
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Høringsinnspill fra beboerne
description: Her samles meninger fra beboerne om saker kommunen har på høring, klare til å tas med i velets svar.
action: /styret
consequence:
- Lagre
features:
- name: Innspill
description: Each row is one case and the stage it has reached. Another desk moves these.
resource:
source:
kind: kv
bucket: innspill
requires_group: styret
transitions: []
- name: Søknader til komiteene
description: Her ligger alle som har meldt seg til en komité og venter på en plass.
action: /styret
consequence:
- Lagre
features:
- name: Komitesoknader
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: komitesoknader
requires_group: styret
transitions:
- from: open
to: plassert
label: Sett i komité
- from: open
to: avslatt
label: Avslå søknaden
- name: Utstyr til utlån blant naboer
description: Her ligger det naboer har å låne ut eller trenger å låne, klart til å legges ut.
action: /styret
consequence:
- Lagre
features:
- name: Oppslag
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: oppslag
requires_group: styret
transitions:
- from: open
to: lagt_ut
label: Legg ut oppslaget
- from: open
to: tatt_ned
label: Ta ned oppslaget
- name: Meldinger om trafikkfarer
description: Her samles meldinger om farlige steder i trafikken, klare til å tas videre med kommunen eller veieier.
action: /styret
consequence:
- Lagre
features:
- name: Trafikkmeldinger
description: Each row is one case and the stage it has reached. Another desk moves these.
resource:
source:
kind: kv
bucket: trafikkmeldinger
requires_group: styret
transitions: []
- name: Inviter noen inn i Arrangementer
description: De får en konto, plass i Arrangementer, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: arrangementer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i Høringsinstans
description: De får en konto, plass i Høringsinstans, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: horingsinstans
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i kassereren
description: De får en konto, plass i kassereren, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: kasserer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i komiteene
description: De får en konto, plass i komiteene, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: komiteer
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i Leke- og møteplasser
description: De får en konto, plass i Leke- og møteplasser, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: lekeplasser
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i nabohjelpen
description: De får en konto, plass i nabohjelpen, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: nabohjelp
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i styret
description: De får en konto, plass i styret, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: styret
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Inviter noen inn i Trafikkforhold
description: De får en konto, plass i Trafikkforhold, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /styret
consequence:
- Inviter
invite:
group: trafikk
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /styret
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: styret
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1 @@
qualifies: trafikk
@@ -0,0 +1,65 @@
name: Hvilke trafikkfarer må følges opp?
description: Her ser du meldinger om farlige steder i trafikken og følger dem opp overfor kommunen eller veieier.
responsible:
name: Styret i Tomter Vel
contact: post@tomtervel.no
alternatives:
- name: Farlige steder i trafikken
description: Farlige steder i trafikken som naboer har meldt inn.
action: /trafikk
consequence:
- Lagre
features:
- name: Trafikkmeldinger
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: trafikkmeldinger
requires_group: trafikk
transitions:
- from: open
to: tatt_opp
label: Ta opp med kommunen
- from: open
to: avvist
label: Avvis meldingen
- from: tatt_opp
to: ordnet
label: Meld ordnet
- from: tatt_opp
to: avvist
label: Avvis meldingen
- name: Inviter noen inn i Trafikkforhold
description: De får en konto, plass i Trafikkforhold, og en engangslenke der de selv velger passord eller passnøkkel. Send lenken videre til dem.
action: /trafikk
consequence:
- Inviter
invite:
group: trafikk
features:
- name: Hvem
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Navn
- name: email
label: E-post
type: email
- name: Sendte invitasjoner
description: Hver invitasjon med lenken som ble laget. Marker som ferdig når personen er inne.
action: /trafikk
consequence:
- Lagre
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: trafikk
transitions:
- from: open
to: done
label: Er inne
@@ -0,0 +1,16 @@
title: Tomter Vel
lang: no
mail:
from: Tomter Vel <tomtervel@klingenbergbygg.no>
reply_to: post@tomtervel.no
invite:
subject: Din konto hos {site_name}
body: |-
Hei {name},
{site_name} har laget en konto til deg og lagt deg til i {group}. Brukernavnet ditt er {username}.
Velg passord her før {expires}:
{link}
Etterpå logger du inn på {site}.
File diff suppressed because it is too large Load Diff
+101
View File
@@ -0,0 +1,101 @@
# uhhm.no, rebuilt for portal 0.5.1 and previewed from a branch
**Scrapped 2026-09-28** after the preview: the original reads better.
The branch, the instance, its NATS and its Caddy route are removed;
the `preview.uhhm.no` DNS record remains in uhhm/infrastructure. What
carried over to the trainer: the 0.5 schema, the mail scoring, and the
iris mail checks.
`plans/uhhm.yaml` (the 2026-09-23 plan) built with round 8's words
(`runs/uhhm-2026-09-23/words-r8.json`), after the builder learned
portal 0.5's content schema. Lints green with iris v0.5.1: 15 pages,
9 aggregates, 58 access rules, 7 needs met.
What is new against round 8:
- **A submitter's own moves say where they may be made from.**
Portal 0.5 reads a `self_transition` without `from` as the initial
state alone; the builder writes `from:` for every one. (The
Tomter Vel content deployed on 2026-09-23 fails the 0.5 lint for
this reason: its "hjelpen er gitt" link moves from `formidlet`.)
- **The approved changes to this site are public.** `propose` gets
`watched_by: [public]` and `public_states: [approved]`, so
`/status/development_proposals` lists what was approved, without
who proposed it (`submitted_by` is `private`). The page's words are
Sonnet's, told that the list shows only approved changes
(`words-status.json`); the front door's card for it is worded by
hand (`overrides.json`).
Build, reproducibly, without a model:
```
portal-trainer build --plan plans/uhhm.yaml --out runs/uhhm-2026-09-28/site \
--words runs/uhhm-2026-09-23/words-r8.json \
--words runs/uhhm-2026-09-28/words-status.json \
--words runs/uhhm-2026-09-28/overrides.json --lint iris
```
## The preview
uhhm/questions branch `preview/trainer` carries this build, and
`.gitea/workflows/preview.yml` serves any `preview/*` branch as
`app@uhhm-preview` on ergo (:3012, `preview.uhhm.no`):
- its own NATS container (`uhhm-preview-nats`, 127.0.0.1:4232), so a
preview never writes into uhhm.no's buckets, and gdo, which reads
the real NATS, never delivers its mail;
- no sign-in, so the owners' and custodians' desks are not reachable
in a preview;
- the pushed commit, not the branch name, as `CONTENT_BRANCH`:
portal puts the ref into Gitea's `git/trees/<ref>` path, and the
slash in `preview/trainer` 404s there. A portal fix would let a
preview follow its branch with the normal reload.
`preview.uhhm.no` needs a DNS record (uhhm/infrastructure pull
request 4, then a manual terraform apply) before Caddy can get it a
certificate. Until then the preview answers on the host:
`curl -H 'X-Forwarded-For: 127.0.0.1' http://127.0.0.1:3012/`.
Not in this build: `grants`, deadlines (`after`) and `type: record`.
Nothing in the uhhm plan is an approval that means membership of a
group that exists, nor a stage a clock should end, and `type: record`
needs dynamic pages the builder does not make yet.
## The mails, scored as a person reads them
`rate --repo` now rates every mail the site sends, the invite mail
included (site.yaml `mail.invite`, written by the builder whenever a
plan onboards people and has a sender). Besides LIX, each mail is put
to its reader - someone who sent a form, or someone just brought in -
with three questions: what happened and to what, what can I do now,
who wrote and how do I answer. Each is also put to a gutted twin
("News. There is news."); a yes the twin also gets fails the control.
The mail is read as it arrives, placeholders filled with plausible
values.
| Round | Mails | All three answered | iris mail warnings |
|---|---|---|---|
| 1 (`rate-round1.txt`) | round 8's, plus the invite | 7 of 11 | 0 |
| 2 (not rated) | reworded: name the case and the sender | - | 5 |
| 3 (`rate.txt`) | reworded again with every rule below | 11 of 11 | 0 |
Round 1's four misses never named their case ("We'd like to take this
on", "your message", "your draft" for what was a description) or who
wrote; the rule became: every mail names the case by a field the
person filled in and ends with the business's name. Following it,
round 2 found new ways to go wrong, each now a rule too:
- `{project}`, a whole brief, in a subject line, and `{org_contact}`,
usually empty, in a greeting (the five warnings): the prompt marks
fields `(long)` and `(optional)` and keeps both out;
- "the custodian has written why in the reply", which no desk can
do: a decision's mail offers a reply instead, since a reply reaches
the people who decided as a note.
The deterministic half of that went into iris (uhhm/iris PR 1): a
placeholder nothing fills, a link to a page that does not exist, a
grant on a site that mails no one, an invite without `{link}` fail;
a placeholder only some forms collect or all mark optional, a long
answer in a subject, a dialogue that never says how it ended, and a
mail about a case the person may act on without their link, warn.
The preview branch carries round 3's mails.
@@ -0,0 +1,155 @@
aggregates:
- bucket: applicants
initial: open
states:
open:
event: applied
invited:
event: invited
active:
event: onboarded
departed:
event: departed
declined:
event: declined
transitions:
active:
- departed
invited:
- active
- declined
open:
- invited
- declined
- bucket: custody_requests
initial: open
states:
open:
event: received
mail:
to: submitter
subject: We have your message
body: Your message reached the custodians of the first node. We read everything that comes in - expect a real reply, not an autoresponder.
in_dialogue:
event: in_dialogue
resolved:
event: resolved
mail:
to: submitter
subject: Your case is resolved
body: This is resolved. Here's what we found and what we did about it - write back if it isn't settled from where you sit.
declined:
event: declined
mail:
to: submitter
subject: On your message to the custodians
body: We've read your message and decided this isn't something we can take on as custodians. If you think we've missed something, write back and tell us.
transitions:
in_dialogue:
- resolved
- declined
open:
- in_dialogue
- declined
- bucket: development_proposals
initial: open
states:
open:
event: proposed
approved:
event: approved
rejected:
event: rejected
transitions:
open:
- approved
- rejected
- bucket: organizations
initial: prospect
states:
prospect:
event: identified
client:
event: became_client
past_client:
event: churned
transitions:
client:
- past_client
prospect:
- client
- past_client
- bucket: projects
initial: open
states:
open:
event: submitted
mail:
to: submitter
subject: We have your brief
body: |-
Your brief is in front of us. We read the whole thing before we reply, so it may take a few days - you'll hear from us either way.
What you can do next: {site}/decide/commission?chain={chain}&email={email}
accepted:
event: accepted
mail:
to: submitter
subject: We'd like to take this on
body: We want to take this on. Next we'll be in touch to talk through scope, timing and how we'll work together.
declined:
event: declined
mail:
to: submitter
subject: On your brief
body: We've read your brief and this isn't one we're taking on. It isn't a judgment on the problem - just not a fit for us right now.
transitions:
open:
- accepted
- declined
- bucket: subscribers
initial: open
states:
open:
event: subscribed
unsubscribed:
event: unsubscribed
transitions:
open:
- unsubscribed
- bucket: trials
initial: open
states:
open:
event: received
mail:
to: submitter
subject: We're looking at your draft
body: We have what you sent. A person will read it and build your draft, or tell you why not - you'll hear from us either way.
approved:
event: approved
mail:
to: submitter
subject: Your draft is approved
body: Your draft is approved and on its way. We built it from your own words - have a look when it's ready and tell us what to change.
previewed:
event: previewed
mail:
to: submitter
subject: Your draft is ready to view
body: Your draft is ready to look at. It's built from your own words - the link below takes you straight to it.
declined:
event: declined
mail:
to: submitter
subject: On your draft
body: We've decided not to build this draft. If the situation changes, get back in touch and we'll take another look.
transitions:
approved:
- previewed
- declined
open:
- approved
- declined
attended_by: |
approved -> previewed: the n8n workflow that builds the draft site from an approved intake (docker, rauthy, portal content) and sends the preview link. Until it exists, owners run portal-trainer by hand and press the button.
+13
View File
@@ -0,0 +1,13 @@
words: site.yaml
content repo written to runs/uhhm-2026-09-28/site
OK: 15 question(s), 9 aggregate(s) valid
OK: access policy, 58 rule(s), validates
OK: 11 mail(s): every placeholder fills, every link lands
need "commission": / [Have us build it: send the brief] -> "projects"
need "trial": / [See your own business as a site, before you buy anything] -> "trials"
need "collaborate": / [Work with us] -> "applicants"
need "subscribe": / [Hear from us now and then] -> "subscribers"
need "propose": / [Suggest a change to this website] -> "development_proposals"
need "custody": / [You are on the redoal network: a node, an app, or a recording that concerns you] -> "custody_requests"
need "prospect": /owners/prospect [Keep an organization on your radar] -> "organizations"
OK: 7 need(s) structurally met, 0 planned, 15 persona(s)
+13
View File
@@ -0,0 +1,13 @@
words: aggregates.yaml
content repo written to runs/uhhm-2026-09-28/site
OK: 15 question(s), 9 aggregate(s) valid
OK: access policy, 58 rule(s), validates
OK: 11 mail(s): every placeholder fills, every link lands
need "commission": / [Have us build it: send the brief] -> "projects"
need "trial": / [See your own business as a site, before you buy anything] -> "trials"
need "collaborate": / [Work with us] -> "applicants"
need "subscribe": / [Hear from us now and then] -> "subscribers"
need "propose": / [Suggest a change to this website] -> "development_proposals"
need "custody": / [You are on the redoal network: a node, an app, or a recording that concerns you] -> "custody_requests"
need "prospect": /owners/prospect [Keep an organization on your radar] -> "organizations"
OK: 7 need(s) structurally met, 0 planned, 15 persona(s)
+12
View File
@@ -0,0 +1,12 @@
words: questions/status/development_proposals/index.yaml
content repo written to runs/uhhm-2026-09-28/site
OK: 15 question(s), 9 aggregate(s) valid
OK: access policy, 58 rule(s), validates
need "commission": / [Have us build it: send the brief] -> "projects"
need "trial": / [See your own business as a site, before you buy anything] -> "trials"
need "collaborate": / [Work with us] -> "applicants"
need "subscribe": / [Hear from us now and then] -> "subscribers"
need "propose": / [Suggest a change to this website] -> "development_proposals"
need "custody": / [You are on the redoal network: a node, an app, or a recording that concerns you] -> "custody_requests"
need "prospect": /owners/prospect [Keep an organization on your radar] -> "organizations"
OK: 7 need(s) structurally met, 0 planned, 15 persona(s)
+952
View File
@@ -0,0 +1,952 @@
{
"needs": [
{
"id": "commission",
"who": "an organization with a problem it wants software to solve",
"wants": "a considered reply to a brief, from people who read the whole thing",
"enters_as": null,
"lands_in": "projects",
"handled_by": "owners",
"done_when": [
"accepted",
"declined"
],
"success": [
"accepted"
],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"Have us build it: send the brief"
],
"alternative": "Have us build it: send the brief",
"fields": [
{
"name": "name",
"label": "Your name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Your email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "project",
"label": "The problem you want solved",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "organization",
"label": "Your organization",
"type": "text",
"optional": false,
"options": []
},
{
"name": "org_contact",
"label": "Who we should talk to",
"type": "text",
"optional": true,
"options": []
}
]
}
]
},
{
"id": "trial",
"who": "someone who runs a business where requests, approvals and handovers get lost, and wants to see it as a site before committing to anything",
"wants": "a first draft of a site for their own roles, built from their own words and approved by a person first",
"enters_as": null,
"lands_in": "trials",
"handled_by": "owners",
"done_when": [
"previewed",
"declined"
],
"success": [
"previewed"
],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"See your own business as a site, before you buy anything"
],
"alternative": "See your own business as a site, before you buy anything",
"fields": [
{
"name": "business",
"label": "Your business",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Your email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "what_we_do",
"label": "What you do",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "who_comes_to_us",
"label": "Who comes to you",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "what_we_keep_track_of",
"label": "What you keep track of",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "who_is_involved",
"label": "Who's involved",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "what_slows_us_down",
"label": "What slows you down",
"type": "textarea",
"optional": true,
"options": []
}
]
}
]
},
{
"id": "collaborate",
"who": "someone who wants to work with us on what we build",
"wants": "to be read as a person, and invited in if there is a fit",
"enters_as": null,
"lands_in": "applicants",
"handled_by": "owners",
"done_when": [
"departed",
"declined"
],
"success": [
"departed"
],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"Work with us"
],
"alternative": "Work with us",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "interest",
"label": "What kind of work",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "note",
"label": "Tell us more",
"type": "textarea",
"optional": true,
"options": []
}
]
}
]
},
{
"id": "subscribe",
"who": "someone who wants to hear from us when there is something to say",
"wants": "a note now and then, and an easy way out",
"enters_as": null,
"lands_in": "subscribers",
"handled_by": "owners",
"done_when": [
"unsubscribed"
],
"success": [],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"Hear from us now and then"
],
"alternative": "Hear from us now and then",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "propose",
"who": "a visitor who sees how a page on this site should change",
"wants": "the change read by a person and, if approved, made",
"enters_as": null,
"lands_in": "development_proposals",
"handled_by": "owners",
"done_when": [
"approved",
"rejected"
],
"success": [
"approved"
],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"Suggest a change to this website"
],
"alternative": "Suggest a change to this website",
"fields": [
{
"name": "submitted_by",
"label": "Your name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": true,
"options": []
},
{
"name": "page",
"label": "Which page",
"type": "text",
"optional": true,
"options": []
},
{
"name": "rationale",
"label": "Why this is better",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "proposed_yaml",
"label": "Your proposed text",
"type": "textarea",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "custody",
"who": "someone who runs, builds on, or is affected by the redoal network and needs the people who keep its first node",
"wants": "an answer from a custodian, and action where the network keeps something it should not",
"enters_as": null,
"lands_in": "custody_requests",
"handled_by": "custodians",
"done_when": [
"resolved",
"declined"
],
"success": [
"resolved"
],
"steps": [
{
"page": "/",
"question": "What is UHHM, and what can you get here?",
"context": "What UHHM does: Two things, both built here and both running. A considered reply to your brief, and software that fits the argument: Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself. A network that answers to you: UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.\nHave a look around first: Nothing to fill in here. What is already out in the world, and the network as it runs right now. What we have built: A few things already out in the world. The redoal network, live: Straight from the relay, the first node of the network. Changes to this site we have approved: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)",
"options": [
{
"name": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing."
},
{
"name": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through."
},
{
"name": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit."
},
{
"name": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own."
},
{
"name": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how."
},
{
"name": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at."
}
],
"expect": [
"You are on the redoal network: a node, an app, or a recording that concerns you"
],
"alternative": "You are on the redoal network: a node, an app, or a recording that concerns you",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "about",
"label": "What's going on",
"type": "select",
"optional": false,
"options": [
"Running a node of my own",
"Building on the network",
"Something the network keeps about me",
"Something else"
]
},
{
"name": "what",
"label": "In short",
"type": "textarea",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "prospect",
"who": "an owner who has met an organization worth following up",
"wants": "it written down and walked through its states from the desk",
"enters_as": "owners",
"lands_in": "organizations",
"handled_by": "owners",
"done_when": [
"past_client"
],
"success": [],
"steps": [
{
"page": "/owners/prospect",
"question": "Is there an organization I should be keeping track of?",
"context": "",
"options": [
{
"name": "Keep an organization on your radar",
"description": "One line per organization worth watching, moved through the stages as things develop."
}
],
"expect": [
"Keep an organization on your radar"
],
"alternative": "Keep an organization on your radar",
"fields": [
{
"name": "name",
"label": "Organization",
"type": "text",
"optional": false,
"options": []
},
{
"name": "contact",
"label": "Contact",
"type": "text",
"optional": false,
"options": []
},
{
"name": "note",
"label": "Note",
"type": "textarea",
"optional": true,
"options": []
}
]
}
]
}
],
"buckets": {
"projects": {
"initial": "open",
"transitions": {
"open": [
"accepted",
"declined"
]
},
"words": {
"accepted": "taken on",
"declined": "not a fit for us",
"open": "received"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "open",
"to": "accepted",
"label": "Accept brief"
},
{
"from": "open",
"to": "declined",
"label": "Decline brief"
}
]
}
],
"self_moves": [
"declined"
]
},
"trials": {
"initial": "open",
"transitions": {
"approved": [
"previewed",
"declined"
],
"open": [
"approved",
"declined"
]
},
"words": {
"approved": "approved for a draft",
"declined": "not a fit for us",
"open": "received",
"previewed": "a preview is ready"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "approved",
"to": "previewed",
"label": "Mark previewed"
},
{
"from": "approved",
"to": "declined",
"label": "Decline trial"
},
{
"from": "open",
"to": "approved",
"label": "Approve trial"
},
{
"from": "open",
"to": "declined",
"label": "Decline trial"
}
]
}
],
"self_moves": []
},
"applicants": {
"initial": "open",
"transitions": {
"active": [
"departed"
],
"open": [
"invited",
"declined"
],
"invited": [
"active",
"declined"
]
},
"words": {
"active": "working with us",
"declined": "not a fit for us",
"departed": "moved on",
"invited": "invited in",
"open": "received"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "active",
"to": "departed",
"label": "Mark departed"
},
{
"from": "invited",
"to": "active",
"label": "Confirm active"
},
{
"from": "invited",
"to": "declined",
"label": "Withdraw the invite"
},
{
"from": "open",
"to": "invited",
"label": "Send invite"
},
{
"from": "open",
"to": "declined",
"label": "Decline applicant"
}
]
}
],
"self_moves": []
},
"subscribers": {
"initial": "open",
"transitions": {
"open": [
"unsubscribed"
]
},
"words": {
"open": "on the list",
"unsubscribed": "off the list"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "open",
"to": "unsubscribed",
"label": "Unsubscribe them"
}
]
}
],
"self_moves": [
"unsubscribed"
]
},
"development_proposals": {
"initial": "open",
"transitions": {
"open": [
"approved",
"rejected"
]
},
"words": {
"approved": "approved",
"open": "received",
"rejected": "turned down"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "open",
"to": "approved",
"label": "Approve change"
},
{
"from": "open",
"to": "rejected",
"label": "Reject change"
}
]
},
{
"page": "/status/development_proposals",
"group": null,
"moves": []
}
],
"self_moves": []
},
"custody_requests": {
"initial": "open",
"transitions": {
"in_dialogue": [
"resolved",
"declined"
],
"open": [
"in_dialogue",
"declined"
]
},
"words": {
"declined": "closed without action",
"in_dialogue": "in dialogue with a custodian",
"open": "received",
"resolved": "resolved"
},
"desks": [
{
"page": "/custodians",
"group": "custodians",
"moves": [
{
"from": "in_dialogue",
"to": "resolved",
"label": "Mark resolved"
},
{
"from": "in_dialogue",
"to": "declined",
"label": "Close, no action"
},
{
"from": "open",
"to": "in_dialogue",
"label": "Open dialogue"
},
{
"from": "open",
"to": "declined",
"label": "Decline case"
}
]
},
{
"page": "/owners",
"group": "owners",
"moves": []
}
],
"self_moves": [
"resolved"
]
},
"organizations": {
"initial": "prospect",
"transitions": {
"client": [
"past_client"
],
"prospect": [
"client",
"past_client"
]
},
"words": {
"client": "a client",
"past_client": "a past client",
"prospect": "a prospect"
},
"desks": [
{
"page": "/owners",
"group": "owners",
"moves": [
{
"from": "client",
"to": "past_client",
"label": "Mark past client"
},
{
"from": "prospect",
"to": "client",
"label": "Mark as client"
},
{
"from": "prospect",
"to": "past_client",
"label": "Archive as past client"
}
]
}
],
"self_moves": []
}
},
"personas": [
{
"id": "architecture-firm",
"need": "commission",
"text": "We run a small architecture firm and our project files are scattered across three cloud drives. We want to pay someone to set up proper storage and backups we control ourselves."
},
{
"id": "climbing-gym-founder",
"need": "commission",
"text": "I have an idea for a booking app for climbing gyms and I'm looking for a team that can build the first version with me."
},
{
"id": "municipality-buyer",
"need": "commission",
"text": "Our municipality needs an internal tool for tracking building permits. We are looking for a vendor who can scope it and deliver it."
},
{
"id": "exhibition-visitor",
"need": "subscribe",
"text": "I saw your drawing network at an exhibition and liked it. I don't want to get involved, I'd just like to know when there is news."
},
{
"id": "tech-journalist",
"need": "subscribe",
"text": "I write about Nordic technology. Keep me posted on what you release so I can cover it."
},
{
"id": "rust-developer",
"need": "collaborate",
"text": "I'm a Rust developer between jobs and I like that you build in the open. I would love to contribute, and maybe join you."
},
{
"id": "interaction-designer",
"need": "collaborate",
"text": "I'm an interaction designer. I want to work with you on the drawing interface."
},
{
"id": "student-intern",
"need": "collaborate",
"text": "I'm a computer science student looking for a summer internship doing infrastructure work."
},
{
"id": "plumber-owner",
"need": "trial",
"text": "I run a plumbing company with four vans. Jobs come in by phone and text and some get lost. I'd like to see how this would look for us before I spend any money."
},
{
"id": "dance-school",
"need": "trial",
"text": "We are a dance school. Enrolments, cancellations and invoices all go through one email inbox that only I understand. Can you show me a version made for us?"
},
{
"id": "node-runner",
"need": "custody",
"text": "I run a small server in Berlin and want to host a redoal node that peers with yours. Who do I talk to?"
},
{
"id": "recorded-name",
"need": "custody",
"text": "Someone left a recording on redoal that says my full name and where I live. I want it gone, and I want to know who is responsible for that network."
},
{
"id": "app-builder",
"need": "custody",
"text": "I'm building a music app and would like to use redoal's gesture addresses in it. Is that possible, and who decides?"
},
{
"id": "wording-fix",
"need": "propose",
"text": "The subscribe page should say how often you actually write. I'd like to suggest that exact change to the page."
},
{
"id": "rewrite",
"need": "propose",
"text": "One page on this site reads wrong to me and I know exactly how I'd rewrite it. Where do I send the new text?"
}
]
}
+12
View File
@@ -0,0 +1,12 @@
{
"questions/index.yaml": {
"shopping": {
"items": {
"status-development_proposals": {
"heading": "Changes to this site we have approved",
"description": "Suggestions from visitors that a person here has read and approved, open for anyone to read."
}
}
}
}
}
+28
View File
@@ -0,0 +1,28 @@
desk bucket buttons mistaken for
/custodians custody_requests 4 of 4
/owners applicants 4 of 4
/owners development_proposals 2 of 2
/owners organizations 2 of 2
/owners projects 2 of 2
/owners trials 4 of 4
mail LIX words happened now who gutted twin says
custody_requests:open 32 easy 27 no no no ok
custody_requests:resolved 20 very easy 28 yes yes yes ok
custody_requests:declined 33 easy 32 no no no ok
projects:open 9 very easy 39 yes yes yes ok
projects:accepted 16 very easy 27 no no yes ok
projects:declined 17 very easy 30 yes yes yes ok
trials:open 13 very easy 31 no no yes ok
trials:approved 17 very easy 32 yes yes yes ok
trials:previewed 13 very easy 28 yes yes yes ok
trials:declined 25 very easy 23 yes yes yes ok
invite 24 very easy 83 yes yes yes ok
need LIX which where asked next gutted twin says page load
commission 27 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 4 required - SPLIT
trial 28 very easy 2/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 6 required - SPLIT
collaborate 26 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 3 required - SPLIT
subscribe 27 very easy 2/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 2 required - SPLIT
propose 28 very easy 2/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 3 required - SPLIT
custody 29 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 4 required - SPLIT
+28
View File
@@ -0,0 +1,28 @@
desk bucket buttons mistaken for
/custodians custody_requests 4 of 4
/owners applicants 4 of 4
/owners development_proposals 2 of 2
/owners organizations 2 of 2
/owners projects 2 of 2
/owners trials 4 of 4
mail LIX words happened now who gutted twin says
custody_requests:open 32 easy 25 yes yes yes ok
custody_requests:resolved 32 easy 30 yes yes yes ok
custody_requests:declined 29 very easy 33 yes yes yes ok
projects:open 14 very easy 34 yes yes yes ok
projects:accepted 14 very easy 37 yes yes yes ok
projects:declined 20 very easy 39 yes yes yes ok
trials:open 23 very easy 34 yes yes yes ok
trials:approved 17 very easy 41 yes yes yes ok
trials:previewed 8 very easy 34 yes yes yes ok
trials:declined 18 very easy 32 yes yes yes ok
invite 24 very easy 83 yes yes yes ok
need LIX which where asked next gutted twin says page load
commission 27 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 4 required - SPLIT
trial 28 very easy 2/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 6 required - SPLIT
collaborate 26 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 3 required - SPLIT
subscribe 27 very easy 2/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 2 required - SPLIT
propose 28 very easy 0/2 2/2 2/2 2/2 0/0/0/0 ok 6 options, 3 required - SPLIT
custody 29 very easy 3/3 3/3 3/3 3/3 0/0/0/0 ok 6 options, 4 required - SPLIT
+304
View File
@@ -0,0 +1,304 @@
{
"collaborate": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 26.34959349593496,
"personas": 3,
"options": 6,
"required_fields": 3,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 3,
"where": 3,
"asked": 3,
"next": 3
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
},
"commission": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 27.352380952380955,
"personas": 3,
"options": 6,
"required_fields": 4,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 3,
"where": 3,
"asked": 3,
"next": 3
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
},
"custody": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 28.8003663003663,
"personas": 3,
"options": 6,
"required_fields": 4,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 3,
"where": 3,
"asked": 3,
"next": 3
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
},
"desk /custodians custody_requests": {
"right": 4,
"of": 4,
"mistaken": []
},
"desk /owners applicants": {
"right": 4,
"of": 4,
"mistaken": []
},
"desk /owners development_proposals": {
"right": 2,
"of": 2,
"mistaken": []
},
"desk /owners organizations": {
"right": 2,
"of": 2,
"mistaken": []
},
"desk /owners projects": {
"right": 2,
"of": 2,
"mistaken": []
},
"desk /owners trials": {
"right": 4,
"of": 4,
"mistaken": []
},
"mail custody_requests:declined": {
"lix": 29.333333333333332,
"words": 33,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail custody_requests:open": {
"lix": 31.83695652173913,
"words": 25,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail custody_requests:resolved": {
"lix": 32.0,
"words": 30,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail invite": {
"lix": 24.05128205128205,
"words": 83,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail projects:accepted": {
"lix": 14.464285714285715,
"words": 37,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail projects:declined": {
"lix": 20.06081081081081,
"words": 39,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail projects:open": {
"lix": 14.404761904761905,
"words": 34,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail trials:approved": {
"lix": 17.442307692307693,
"words": 41,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail trials:declined": {
"lix": 17.5,
"words": 32,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail trials:open": {
"lix": 23.205882352941174,
"words": 34,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"mail trials:previewed": {
"lix": 8.25,
"words": 34,
"understanding": {
"happened": true,
"now": true,
"who": true
},
"control_ok": true
},
"propose": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 28.30081300813008,
"personas": 2,
"options": 6,
"required_fields": 3,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 0,
"where": 2,
"asked": 2,
"next": 2
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
},
"subscribe": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 27.352380952380955,
"personas": 2,
"options": 6,
"required_fields": 2,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 2,
"where": 2,
"asked": 2,
"next": 2
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
},
"trial": {
"steps": 1,
"pages": [
{
"page": "/",
"lix": 28.29310344827586,
"personas": 2,
"options": 6,
"required_fields": 6,
"overloaded": true,
"followup_shown": true,
"understanding": {
"which": 2,
"where": 2,
"asked": 2,
"next": 2
},
"control": {
"which": 0,
"where": 0,
"asked": 0,
"next": 0
},
"control_ok": true
}
]
}
}
+184
View File
@@ -0,0 +1,184 @@
aggregates:
- bucket: applicants
initial: open
states:
open:
event: applied
invited:
event: invited
active:
event: onboarded
departed:
event: departed
declined:
event: declined
transitions:
active:
- departed
invited:
- active
- declined
open:
- invited
- declined
- bucket: custody_requests
initial: open
states:
open:
event: received
mail:
to: submitter
subject: We have your request about {about}
body: |-
{name}, your request about {about} has reached the custodians of the redoal network. A custodian will answer you at {email}.
{site}
UHHM
in_dialogue:
event: in_dialogue
resolved:
event: resolved
mail:
to: submitter
subject: Your request about {about} is resolved
body: |-
{name}, the custodians have resolved your request about {about}. If something is still wrong, reply to this mail and a custodian will read it.
{site}
UHHM
declined:
event: declined
mail:
to: submitter
subject: 'Your request about {about}: declined'
body: |-
{name}, the custodians have declined your request about {about}. You can reply to this mail to ask about it, and a reply reaches the people who decided.
{site}
UHHM
transitions:
in_dialogue:
- resolved
- declined
open:
- in_dialogue
- declined
- bucket: development_proposals
initial: open
states:
open:
event: proposed
approved:
event: approved
rejected:
event: rejected
transitions:
open:
- approved
- rejected
- bucket: organizations
initial: prospect
states:
prospect:
event: identified
client:
event: became_client
past_client:
event: churned
transitions:
client:
- past_client
prospect:
- client
- past_client
- bucket: projects
initial: open
states:
open:
event: submitted
mail:
to: submitter
subject: We have the brief from {organization}
body: |-
{name}, the brief from {organization} has reached us, and we will read all of it. You will get a considered reply at {email}.
{site}
UHHM
What you can do next: {site}/decide/commission?chain={chain}&email={email}
accepted:
event: accepted
mail:
to: submitter
subject: '{organization}: we would like to take your project on'
body: |-
{name}, we have read the brief from {organization} and would like to take the project on. Reply to this mail and we will agree on the next step.
{site}
UHHM
declined:
event: declined
mail:
to: submitter
subject: '{organization}: we cannot take your project on'
body: |-
{name}, we have read the brief from {organization} and cannot take the project on. You can reply to this mail to ask about it, and a reply reaches the people who decided.
{site}
UHHM
transitions:
open:
- accepted
- declined
- bucket: subscribers
initial: open
states:
open:
event: subscribed
unsubscribed:
event: unsubscribed
transitions:
open:
- unsubscribed
- bucket: trials
initial: open
states:
open:
event: received
mail:
to: submitter
subject: We have your trial request for {business}
body: |-
Your request for {business} has reached us, and a person will read it before anything is built. You will hear from us at {email} once it has been decided.
{site}
UHHM
approved:
event: approved
mail:
to: submitter
subject: '{business}: your trial is approved'
body: |-
We have approved the trial for {business}, and we are now building a first draft of a site from your own words. You will get a mail at {email} when it is ready to look at.
{site}
UHHM
previewed:
event: previewed
mail:
to: submitter
subject: '{business}: your first draft is ready'
body: |-
The first draft of a site for {business} is ready for you to look at. Reply to this mail and tell us what fits and what does not.
{site}
UHHM
declined:
event: declined
mail:
to: submitter
subject: '{business}: we cannot build your trial'
body: |-
We have declined the trial for {business}. You can reply to this mail to ask about it, and a reply reaches the people who decided.
{site}
UHHM
transitions:
approved:
- previewed
- declined
open:
- approved
- declined
attended_by: |
approved -> previewed: the n8n workflow that builds the draft site from an approved intake (docker, rauthy, portal content) and sends the preview link. Until it exists, owners run portal-trainer by hand and press the button.
@@ -0,0 +1,130 @@
You write the words for one page of a website for this business.
Business: UHHM
About: UHHM builds software around a clear argument: infrastructure, tools and products for organizations that can say what problem they have. It also builds and carries the redoal network - the gesture math, the relay, the first node, and the portal this site runs on - and answers for what that network keeps.
Contact: Bendik Aagaard Lynghaug <bl@uhhm.no>
Language to write in: en
Everyone the site serves:
- commission: an organization with a problem it wants software to solve - wants: a considered reply to a brief, from people who read the whole thing. Handled by owners. Stages: open -> accepted -> declined. Lands in `projects`; its form collects: {name}, {email}, {project} (long), {organization}, {org_contact} (optional).
- trial: someone who runs a business where requests, approvals and handovers get lost, and wants to see it as a site before committing to anything - wants: a first draft of a site for their own roles, built from their own words and approved by a person first. Handled by owners. Stages: open -> approved -> previewed -> declined. Lands in `trials`; its form collects: {business}, {email}, {what_we_do} (long), {who_comes_to_us} (long), {what_we_keep_track_of} (long), {who_is_involved} (long), {what_slows_us_down} (long) (optional).
- collaborate: someone who wants to work with us on what we build - wants: to be read as a person, and invited in if there is a fit. Handled by owners. Stages: open -> invited -> active -> departed -> declined. Lands in `applicants`; its form collects: {name}, {email}, {interest} (long), {note} (long) (optional).
- subscribe: someone who wants to hear from us when there is something to say - wants: a note now and then, and an easy way out. Handled by owners. Stages: open -> unsubscribed. Lands in `subscribers`; its form collects: {name}, {email}.
- propose: a visitor who sees how a page on this site should change - wants: the change read by a person and, if approved, made. Handled by owners. Stages: open -> approved -> rejected. Lands in `development_proposals`; its form collects: {submitted_by}, {email} (optional), {page} (optional), {rationale} (long), {proposed_yaml} (long).
- custody: someone who runs, builds on, or is affected by the redoal network and needs the people who keep its first node - wants: an answer from a custodian, and action where the network keeps something it should not. Handled by custodians. Stages: open -> in_dialogue -> resolved -> declined. Lands in `custody_requests`; its form collects: {name}, {email}, {about}, {what} (long).
- prospect: an owner who has met an organization worth following up - wants: it written down and walked through its states from the desk. Handled by owners. Stages: prospect -> client -> past_client. Lands in `organizations`; its form collects: {name}, {contact}, {note} (long) (optional).
The page: aggregates.yaml
It is the mails the site sends. Under each bucket, each stage that sends one has a `subject` and a `body`: the mail a person gets the moment their case enters that stage, saying what happened and what, if anything, they can do now. Plain text, at most three short sentences plus the link line, no greeting longer than one word, in the business's voice. Keep every `{...}` placeholder exactly as it is - `{site}`, `{chain}`, `{email}` and any field name are filled in by the site - and keep any line with a link in it. The person reads the mail alone, days later, maybe among others: every mail says what it is about in their terms, using a field they filled in as a `{placeholder}` where one names it (the fields each bucket's forms collect are listed under the needs above), never `this` or `your message` alone and never the business's own words for things; and every mail ends with the business's name on its own line, so they know who wrote. A subject names the case by a short field (a name, a place, a choice), never a long one marked `(long)`, which would put a whole answer in the inbox list. Never use a field marked `(optional)`: whoever skipped it gets a blank where it was. Promise only what the site does: a desk's decision carries no written reason, so a mail about a decision never says one was written - it says they can reply to this mail to ask, and a reply reaches the people who decided.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"custody_requests": {
"declined": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"open": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"resolved": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
}
},
"projects": {
"accepted": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"declined": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"open": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
}
},
"trials": {
"approved": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"declined": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"open": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
},
"previewed": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
}
}
}
Reply with the JSON object only.
=== REPLY ===
{
"custody_requests": {
"declined": {
"subject": "Your request about {about}: declined",
"body": "{name}, the custodians have declined your request about {about}. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have your request about {about}",
"body": "{name}, your request about {about} has reached the custodians of the redoal network. A custodian will answer you at {email}.\n{site}\nUHHM"
},
"resolved": {
"subject": "Your request about {about} is resolved",
"body": "{name}, the custodians have resolved your request about {about}. If something is still wrong, reply to this mail and a custodian will read it.\n{site}\nUHHM"
}
},
"projects": {
"accepted": {
"subject": "{organization}: we would like to take your project on",
"body": "{name}, we have read the brief from {organization} and would like to take the project on. Reply to this mail and we will agree on the next step.\n{site}\nUHHM"
},
"declined": {
"subject": "{organization}: we cannot take your project on",
"body": "{name}, we have read the brief from {organization} and cannot take the project on. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have the brief from {organization}",
"body": "{name}, the brief from {organization} has reached us, and we will read all of it. You will get a considered reply at {email}.\n{site}\nUHHM"
}
},
"trials": {
"approved": {
"subject": "{business}: your trial is approved",
"body": "We have approved the trial for {business}, and we are now building a first draft of a site from your own words. You will get a mail at {email} when it is ready to look at.\n{site}\nUHHM"
},
"declined": {
"subject": "{business}: we cannot build your trial",
"body": "We have declined the trial for {business}. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have your trial request for {business}",
"body": "Your request for {business} has reached us, and a person will read it before anything is built. You will hear from us at {email} once it has been decided.\n{site}\nUHHM"
},
"previewed": {
"subject": "{business}: your first draft is ready",
"body": "The first draft of a site for {business} is ready for you to look at. Reply to this mail and tell us what fits and what does not.\n{site}\nUHHM"
}
}
}
@@ -0,0 +1,45 @@
You write the words for one page of a website for this business.
Business: UHHM
About: UHHM builds software around a clear argument: infrastructure, tools and products for organizations that can say what problem they have. It also builds and carries the redoal network - the gesture math, the relay, the first node, and the portal this site runs on - and answers for what that network keeps.
Contact: Bendik Aagaard Lynghaug <bl@uhhm.no>
Language to write in: en
Everyone the site serves:
- commission: an organization with a problem it wants software to solve - wants: a considered reply to a brief, from people who read the whole thing. Handled by owners. Stages: open -> accepted -> declined.
- trial: someone who runs a business where requests, approvals and handovers get lost, and wants to see it as a site before committing to anything - wants: a first draft of a site for their own roles, built from their own words and approved by a person first. Handled by owners. Stages: open -> approved -> previewed -> declined.
- collaborate: someone who wants to work with us on what we build - wants: to be read as a person, and invited in if there is a fit. Handled by owners. Stages: open -> invited -> active -> departed -> declined.
- subscribe: someone who wants to hear from us when there is something to say - wants: a note now and then, and an easy way out. Handled by owners. Stages: open -> unsubscribed.
- propose: a visitor who sees how a page on this site should change - wants: the change read by a person and, if approved, made. Handled by owners. Stages: open -> approved -> rejected.
- custody: someone who runs, builds on, or is affected by the redoal network and needs the people who keep its first node - wants: an answer from a custodian, and action where the network keeps something it should not. Handled by custodians. Stages: open -> in_dialogue -> resolved -> declined.
- prospect: an owner who has met an organization worth following up - wants: it written down and walked through its states from the desk. Handled by owners. Stages: prospect -> client -> past_client.
The page: questions/status/development_proposals/index.yaml
It is a public page anyone can open, read-only, listing ONLY the cases that have reached: approved. Nothing else is shown - do not promise the reader anything waiting or turned down. `question` is what this page asks; `heading` names the list.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"question": "<WRITE: the one question this page asks its reader>",
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"list_description": "<WRITE: one line over a public list of what people have sent in, or empty>",
"list_title": "<WRITE: a short title, two to four words, naming the list itself>",
"list_note": "<WRITE: one sentence saying what a single row is, and what the buttons under it do or what the list leaves out>",
"empty": "<WRITE: one short sentence shown when the list has nothing in it yet, inviting rather than apologising>",
"back": "<WRITE: a button, one to three words, saying what pressing it does>"
}
Reply with the JSON object only.
=== REPLY ===
{"question":"Which changes to this site have already been approved?","description":"These are the suggested page changes a person here has read and approved. Each one is being made or has been made.","heading":"See the changes we've approved","list_description":"Suggestions from visitors that we've read and agreed to make.","list_title":"Approved changes","list_note":"Each row is one suggested change to a page on this site that has been approved; the list shows nothing else.","empty":"No changes have been approved yet. If you see something on a page that should be different, send us your suggestion.","back":"Suggest a change"}
@@ -0,0 +1,41 @@
You write the words for one page of a website for this business.
Business: UHHM
About: UHHM builds software around a clear argument: infrastructure, tools and products for organizations that can say what problem they have. It also builds and carries the redoal network - the gesture math, the relay, the first node, and the portal this site runs on - and answers for what that network keeps.
Contact: Bendik Aagaard Lynghaug <bl@uhhm.no>
Language to write in: en
Everyone the site serves:
- commission: an organization with a problem it wants software to solve - wants: a considered reply to a brief, from people who read the whole thing. Handled by owners. Stages: open -> accepted -> declined.
- trial: someone who runs a business where requests, approvals and handovers get lost, and wants to see it as a site before committing to anything - wants: a first draft of a site for their own roles, built from their own words and approved by a person first. Handled by owners. Stages: open -> approved -> previewed -> declined.
- collaborate: someone who wants to work with us on what we build - wants: to be read as a person, and invited in if there is a fit. Handled by owners. Stages: open -> invited -> active -> departed -> declined.
- subscribe: someone who wants to hear from us when there is something to say - wants: a note now and then, and an easy way out. Handled by owners. Stages: open -> unsubscribed.
- propose: a visitor who sees how a page on this site should change - wants: the change read by a person and, if approved, made. Handled by owners. Stages: open -> approved -> rejected.
- custody: someone who runs, builds on, or is affected by the redoal network and needs the people who keep its first node - wants: an answer from a custodian, and action where the network keeps something it should not. Handled by custodians. Stages: open -> in_dialogue -> resolved -> declined.
- prospect: an owner who has met an organization worth following up - wants: it written down and walked through its states from the desk. Handled by owners. Stages: prospect -> client -> past_client.
The page: site.yaml
It is the invite mail: the first mail a person gets when a member of the business brings them in to help (onto a desk, into a committee), carrying the one-time link that lets them set a password. `subject` and `body` under `invite`. They did not ask for it, so say who brought them in and to what, then the link and when it runs out, then where they sign in afterwards. Plain text, short lines. Keep every `{...}` placeholder exactly as it is: `{name}`, `{username}`, `{group}`, `{link}`, `{expires}`, `{site}`, `{site_name}` are filled in by the site, and `{link}` must stay on a line of its own.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"invite": {
"subject": "<WRITE: a form label for the field `subject`>",
"body": "<WRITE: a form label for the field `body`>"
}
}
Reply with the JSON object only.
=== REPLY ===
{"invite": {"subject": "{name}, you have been invited to {group} on {site_name}", "body": "Hello {name},\n\nA member of {site_name} has brought you in to help\non {group}.\n\nYour username is {username}.\n\nUse this one-time link to set a password:\n\n{link}\n\nThe link runs out {expires}.\nIf it has run out, ask the person who invited you\nfor a new one.\n\nAfterwards you sign in at {site}\nwith your username and the password you chose.\n\nIf you were not expecting this, you can ignore\nthis mail. Nothing happens until the link is used.\n\n{site_name}"}}
+204
View File
@@ -0,0 +1,204 @@
needs:
- id: commission
who: an organization with a problem it wants software to solve
wants: a considered reply to a brief, from people who read the whole thing
enters: /
via: 'Have us build it: send the brief'
lands_in: projects
handled_by: owners
stages:
- open
- accepted
- declined
done_when:
- accepted
- declined
success:
- accepted
max_steps: 1
max_fields: 4
stage_words:
open: received
accepted: taken on
declined: not a fit for us
- id: trial
who: someone who runs a business where requests, approvals and handovers get lost, and wants to see it as a site before committing to anything
wants: a first draft of a site for their own roles, built from their own words and approved by a person first
enters: /
via: See your own business as a site, before you buy anything
lands_in: trials
handled_by: owners
stages:
- open
- approved
- previewed
- declined
done_when:
- previewed
- declined
success:
- previewed
max_steps: 1
max_fields: 6
stage_words:
open: received
approved: approved for a draft
previewed: a preview is ready
declined: not a fit for us
- id: collaborate
who: someone who wants to work with us on what we build
wants: to be read as a person, and invited in if there is a fit
enters: /
via: Work with us
lands_in: applicants
handled_by: owners
stages:
- open
- invited
- active
- departed
- declined
done_when:
- departed
- declined
success:
- departed
max_steps: 1
max_fields: 3
stage_words:
open: received
invited: invited in
active: working with us
departed: moved on
declined: not a fit for us
- id: subscribe
who: someone who wants to hear from us when there is something to say
wants: a note now and then, and an easy way out
enters: /
via: Hear from us now and then
lands_in: subscribers
handled_by: owners
stages:
- open
- unsubscribed
done_when:
- unsubscribed
success: []
max_steps: 1
max_fields: 2
stage_words:
open: on the list
unsubscribed: off the list
- id: propose
who: a visitor who sees how a page on this site should change
wants: the change read by a person and, if approved, made
enters: /
via: Suggest a change to this website
lands_in: development_proposals
handled_by: owners
stages:
- open
- approved
- rejected
done_when:
- approved
- rejected
success:
- approved
max_steps: 1
max_fields: 3
stage_words:
open: received
approved: approved
rejected: turned down
- id: custody
who: someone who runs, builds on, or is affected by the redoal network and needs the people who keep its first node
wants: an answer from a custodian, and action where the network keeps something it should not
enters: /
via: 'You are on the redoal network: a node, an app, or a recording that concerns you'
lands_in: custody_requests
handled_by: custodians
stages:
- open
- in_dialogue
- resolved
- declined
done_when:
- resolved
- declined
success:
- resolved
max_steps: 1
max_fields: 4
stage_words:
open: received
in_dialogue: in dialogue with a custodian
resolved: resolved
declined: closed without action
- id: prospect
who: an owner who has met an organization worth following up
wants: it written down and walked through its states from the desk
enters: /owners/prospect
via: Keep an organization on your radar
lands_in: organizations
handled_by: owners
stages:
- prospect
- client
- past_client
done_when:
- past_client
success: []
max_steps: 1
max_fields: 2
stage_words:
prospect: a prospect
client: a client
past_client: a past client
enters_as: owners
personas:
- id: architecture-firm
need: commission
text: We run a small architecture firm and our project files are scattered across three cloud drives. We want to pay someone to set up proper storage and backups we control ourselves.
- id: climbing-gym-founder
need: commission
text: I have an idea for a booking app for climbing gyms and I'm looking for a team that can build the first version with me.
- id: municipality-buyer
need: commission
text: Our municipality needs an internal tool for tracking building permits. We are looking for a vendor who can scope it and deliver it.
- id: exhibition-visitor
need: subscribe
text: I saw your drawing network at an exhibition and liked it. I don't want to get involved, I'd just like to know when there is news.
- id: tech-journalist
need: subscribe
text: I write about Nordic technology. Keep me posted on what you release so I can cover it.
- id: rust-developer
need: collaborate
text: I'm a Rust developer between jobs and I like that you build in the open. I would love to contribute, and maybe join you.
- id: interaction-designer
need: collaborate
text: I'm an interaction designer. I want to work with you on the drawing interface.
- id: student-intern
need: collaborate
text: I'm a computer science student looking for a summer internship doing infrastructure work.
- id: plumber-owner
need: trial
text: I run a plumbing company with four vans. Jobs come in by phone and text and some get lost. I'd like to see how this would look for us before I spend any money.
- id: dance-school
need: trial
text: We are a dance school. Enrolments, cancellations and invoices all go through one email inbox that only I understand. Can you show me a version made for us?
- id: node-runner
need: custody
text: I run a small server in Berlin and want to host a redoal node that peers with yours. Who do I talk to?
- id: recorded-name
need: custody
text: Someone left a recording on redoal that says my full name and where I live. I want it gone, and I want to know who is responsible for that network.
- id: app-builder
need: custody
text: I'm building a music app and would like to use redoal's gesture addresses in it. Is that possible, and who decides?
- id: wording-fix
need: propose
text: The subscribe page should say how often you actually write. I'd like to suggest that exact change to the page.
- id: rewrite
need: propose
text: One page on this site reads wrong to me and I know exactly how I'd rewrite it. Where do I send the new text?
@@ -0,0 +1 @@
qualifies: custodians
@@ -0,0 +1,65 @@
name: What is waiting on the custodians?
description: 'The desk for custodians: open custody cases, and the people invited to answer them.'
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
alternatives:
- name: Custody cases waiting on you
description: Cases from people who use, build on, or answer for something the redoal network touches, and need a custodian's word on it.
action: /custodians
consequence:
- Confirm
features:
- name: Custody requests
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: custody_requests
requires_group: custodians
transitions:
- from: in_dialogue
to: resolved
label: Mark resolved
- from: in_dialogue
to: declined
label: Close, no action
- from: open
to: in_dialogue
label: Open dialogue
- from: open
to: declined
label: Decline case
- name: Bring in another custodian
description: Give someone an account and a one-time link to join as a custodian.
action: /custodians
consequence:
- Invite custodian
invite:
group: custodians
features:
- name: Invite a custodian
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Name
- name: email
label: Email
type: email
- name: Invited custodians
description: Custodians invited but not yet signed in.
action: /custodians
consequence:
- Confirm
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: custodians
transitions:
- from: open
to: done
label: Signed in
@@ -0,0 +1,11 @@
name: What would you like to do?
description: ''
alternatives:
- name: Declined
description: ''
self_transition:
bucket: projects
to: declined
from:
- open
label: Declined
@@ -0,0 +1,11 @@
name: What would you like to do?
description: ''
alternatives:
- name: Resolved
description: ''
self_transition:
bucket: custody_requests
to: resolved
from:
- in_dialogue
label: Resolved
@@ -0,0 +1,11 @@
name: Do you want to keep hearing from us?
description: You're on our list. Change your mind whenever you like.
alternatives:
- name: Stop getting notes from us
description: You'll stop hearing from us. Nothing else changes.
self_transition:
bucket: subscribers
to: unsubscribed
from:
- open
label: Unsubscribe
@@ -0,0 +1,273 @@
name: What is UHHM, and what can you get here?
description: UHHM builds software for organisations that can say what problem they have, and keeps the redoal network underneath.
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
alternatives:
- name: What UHHM does
description: Two things, both built here and both running.
features:
- name: A considered reply to your brief, and software that fits the argument
description: 'Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself.'
icon: lucide:layers
- name: A network that answers to you
description: 'UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.'
- name: Have a look around first
description: Nothing to fill in here. What is already out in the world, and the network as it runs right now.
features:
- name: What we have built
description: A few things already out in the world.
icon: lucide:hammer
resource:
public: true
source:
kind: gitea_starred
username: bl
jq: |
.[] | {name: .name, description: .description, url: (if .website != null and .website != "" then .website elif .private then null else .html_url end)}
- name: The redoal network, live
description: Straight from the relay, the first node of the network.
icon: lucide:activity
resource:
public: true
source:
kind: url
url: https://relay.redoal.com/pulse
jq: |
{ "name": (.voices_echoed | tostring),
"description": "voices echoed so far" }
empty: The first voice has not echoed yet.
- name: Changes to this site we have approved
description: Suggestions from visitors that a person here has read and approved, open for anyone to read. [Changes to this site we have approved](/status/development_proposals)
icon: lucide:list
- name: 'Have us build it: send the brief'
description: You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing.
action: /received/commission
consequence:
- Send the brief
record_as: projects
features:
- name: What happens next
description: We read your brief and either take it on or tell you honestly if it's not a fit.
icon: lucide:route
- name: Who reads this
description: One of the owners reads it; write to bl@uhhm.no if you'd rather reach us directly.
icon: lucide:user-check
- name: Tell us the problem
requirements:
- name: name
label: Your name
type: text
placeholder: Sara Nilsen
- name: email
label: Your email
type: email
placeholder: sara@company.com
- name: project
label: The problem you want solved
type: textarea
placeholder: Our drivers log hours on paper and it takes a day to get them into payroll.
- name: organization
label: Your organization
type: text
placeholder: Nilsen Transport AS
- name: org_contact
label: Who we should talk to
type: text
optional: true
placeholder: Sara Nilsen, ops manager
description: The more of the problem you put in, the better the reply.
icon: lucide:briefcase
encouragements:
- Someone here reads every brief in full before writing back.
- name: See your own business as a site, before you buy anything
description: Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through.
action: /received/trial
consequence:
- Start the draft
record_as: trials
features:
- name: What happens next
description: We look at what you sent and, if it's a fit, build a draft from your own roles and words for you to see before anything moves further.
icon: lucide:route
- name: Who reads this
description: An owner looks at what you send; write to bl@uhhm.no if you'd rather reach us directly.
icon: lucide:user-check
- name: Describe your business
requirements:
- name: business
label: Your business
type: text
placeholder: Nilsen Transport AS
- name: email
label: Your email
type: email
placeholder: sara@company.com
- name: what_we_do
label: What you do
type: textarea
placeholder: We move freight for local businesses and handle the paperwork for them.
- name: who_comes_to_us
label: Who comes to you
type: textarea
placeholder: Local businesses that need something moved on short notice.
- name: what_we_keep_track_of
label: What you keep track of
type: textarea
placeholder: Bookings, driver hours, and which loads are still waiting on a signature.
- name: who_is_involved
label: Who's involved
type: textarea
placeholder: Drivers, dispatchers, and the customers waiting on their delivery.
- name: what_slows_us_down
label: What slows you down
type: textarea
optional: true
placeholder: Approvals sit in someone's inbox for days before anyone acts on them.
description: Answer in your own words - there's no wrong way to describe your business.
icon: lucide:layers
encouragements:
- A person looks at what you send before anything gets built.
- name: Work with us
description: 'A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit.'
action: /received/collaborate
consequence:
- Get in touch
record_as: applicants
features:
- name: What happens next
description: We read what you send and get back to you. If there's a fit, we invite you in and you start working with us — and if things ever change, that's fine too.
icon: lucide:route
- name: Who reads this
description: One of the owners reads this directly — for anything urgent, write to bl@uhhm.no.
icon: lucide:user-check
- name: Say hello
requirements:
- name: name
label: Name
type: text
placeholder: Your name
- name: email
label: Email
type: email
placeholder: you@example.com
- name: interest
label: What kind of work
type: textarea
placeholder: Backend work, or something design-heavy
- name: note
label: Tell us more
type: textarea
optional: true
placeholder: A bit about what you'd want to work on, or a link to your work
description: Tell us who you are and what kind of work you're after.
icon: lucide:handshake
encouragements:
- A person reads this, not a form filter — worth the ten minutes.
- name: Hear from us now and then
description: You'd rather hear from us now and then than check back on your own.
action: /received/subscribe
consequence:
- Sign up
record_as: subscribers
features:
- name: What happens next
description: You're on the list. We write when there's something worth saying, and you can leave the list whenever you like.
icon: lucide:bell
- name: Who reads this
description: An owner sends these notes directly — write to bl@uhhm.no if you'd rather ask something first.
icon: lucide:user-check
- name: Stay in the loop
requirements:
- name: name
label: Name
type: text
placeholder: Your name
- name: email
label: Email
type: email
placeholder: you@example.com
description: Just your email, or your name too if you'd like.
icon: lucide:mail
encouragements:
- One click unsubscribes you later, no questions asked.
- name: Suggest a change to this website
description: You have spotted a page on uhhm.no that should read differently, and you know roughly how.
action: /received/propose
consequence:
- Send change
record_as: development_proposals
features:
- name: What happens next
description: Someone here reads your proposal and either makes the change or explains why not. Either way, you'll hear back.
icon: lucide:route
- name: Who reads this
description: An owner reads every proposal before anything changes — reach us at bl@uhhm.no if it's time-sensitive.
icon: lucide:user-check
- name: Propose a change
requirements:
- name: submitted_by
label: Your name
type: text
placeholder: Your name
- name: email
label: Email
type: email
optional: true
placeholder: you@example.com
- name: page
label: Which page
type: text
optional: true
placeholder: questions/join/index.yaml
- name: rationale
label: Why this is better
type: textarea
placeholder: The current heading doesn't say what you actually get
- name: proposed_yaml
label: Your proposed text
type: textarea
placeholder: 'heading: "A clearer way to say this"'
description: Point us to the page and show us the change.
icon: lucide:pencil
encouragements:
- Even a rough version helps — we can tidy the wording ourselves.
- name: 'You are on the redoal network: a node, an app, or a recording that concerns you'
description: UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at.
action: /received/custody
consequence:
- Send to a custodian
record_as: custody_requests
features:
- name: What happens next
description: A custodian opens a dialogue with you. A node gets its peer, a builder gets an answer, and something the network should not keep gets removed. Either way you hear what was decided.
icon: lucide:route
- name: Who reads this
description: A custodian reads it directly; if it's urgent, write to bl@uhhm.no in the meantime.
icon: lucide:user-check
- name: Reach a custodian
requirements:
- name: name
label: Name
type: text
placeholder: Your name
- name: email
label: Email
type: email
placeholder: you@yourcompany.com
- name: about
label: What's going on
type: select
options:
- Running a node of my own
- Building on the network
- Something the network keeps about me
- Something else
- name: what
label: In short
type: textarea
placeholder: A relay node is misbehaving
description: Say which of the four it is, and what you need, in a few lines.
icon: lucide:shield
encouragements:
- A custodian reads every message that comes in here.
@@ -0,0 +1 @@
qualifies: owners
@@ -0,0 +1,209 @@
name: What's waiting on me today?
description: 'Everything waiting on you: briefs, trials, applicants, subscribers, and proposals, all in one place.'
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
alternatives:
- name: People who want to build with us
description: People who've asked to build with us, waiting on a decision or already working alongside us.
action: /owners
consequence:
- Confirm
features:
- name: Applicants
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: applicants
requires_group: owners
transitions:
- from: active
to: departed
label: Mark departed
- from: invited
to: active
label: Confirm active
- from: invited
to: declined
label: Withdraw the invite
- from: open
to: invited
label: Send invite
- from: open
to: declined
label: Decline applicant
- name: What's been raised with custodians
description: Questions and issues raised with the people who keep the first node - custodians handle these, but you can see where each one stands.
action: /owners
consequence:
- Confirm
features:
- name: Custody requests
description: Each row is one case and the stage it has reached. Another desk moves these.
resource:
source:
kind: kv
bucket: custody_requests
requires_group: owners
transitions: []
- name: Proposed changes to the site
description: Changes visitors have proposed for pages on this site, waiting on a yes or no.
action: /owners
consequence:
- Confirm
features:
- name: Development proposals
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: development_proposals
requires_group: owners
transitions:
- from: open
to: approved
label: Approve change
- from: open
to: rejected
label: Reject change
- name: Organizations you're tracking
description: Organizations you've met, tracked from first contact through to client and beyond.
action: /owners
consequence:
- Confirm
features:
- name: Organizations
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: organizations
requires_group: owners
transitions:
- from: client
to: past_client
label: Mark past client
- from: prospect
to: client
label: Mark as client
- from: prospect
to: past_client
label: Archive as past client
- name: Briefs waiting on a reply
description: Briefs sent in by organizations with a problem they want solved.
action: /owners
consequence:
- Confirm
features:
- name: Projects
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: projects
requires_group: owners
transitions:
- from: open
to: accepted
label: Accept brief
- from: open
to: declined
label: Decline brief
- name: Who's hearing from you
description: People who want to hear from you now and then.
action: /owners
consequence:
- Confirm
features:
- name: Subscribers
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: subscribers
requires_group: owners
transitions:
- from: open
to: unsubscribed
label: Unsubscribe them
- name: Trial sites in progress
description: Businesses who want to see their own workflow as a working site before committing to anything.
action: /owners
consequence:
- Confirm
features:
- name: Trials
description: Each row is one case. The buttons record what you have just done with it.
resource:
source:
kind: kv
bucket: trials
requires_group: owners
transitions:
- from: approved
to: previewed
label: Mark previewed
- from: approved
to: declined
label: Decline trial
- from: open
to: approved
label: Approve trial
- from: open
to: declined
label: Decline trial
- name: Track a new organization
description: Write down an organization worth following up, and track it from first contact onward.
action: /owners/prospect
consequence:
- Add prospect
- name: Bring in a custodian
description: Bring someone in to help keep the first node and answer for the network.
action: /owners
consequence:
- Send invite
invite:
group: custodians
features:
- name: Invite a custodian
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Their name
- name: email
label: Their email
type: email
- name: Bring in another owner
description: Bring someone in to work this desk alongside you.
action: /owners
consequence:
- Send invite
invite:
group: owners
features:
- name: Invite an owner
description: Their name, and the address the account and its one-time link go to.
requirements:
- name: name
label: Their name
- name: email
label: Their email
type: email
- name: Invites you've sent
description: People you've invited in, and whether they've taken it up yet.
action: /owners
consequence:
- Confirm
features:
- name: Who has been invited
description: Each row is one invitation, with the one-time link while it is unused.
resource:
source:
kind: kv
bucket: portal_invites
requires_group: owners
transitions:
- from: open
to: done
label: Taken up
@@ -0,0 +1,10 @@
name: What happens to this now?
description: Thanks — we've got your prospect written down, and it now moves through the desk with everything else we're tracking.
alternatives:
- name: It's on the desk now
description: An owner walks it from prospect to client, and on to past client, as the relationship moves.
- name: Back to site
description: ''
action: /owners
consequence:
- Back to site
@@ -0,0 +1,39 @@
followup: false
name: Is there an organization I should be keeping track of?
description: Write down an organization worth following up, and move it through client and past client as things develop.
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
alternatives:
- name: Keep an organization on your radar
description: One line per organization worth watching, moved through the stages as things develop.
action: /owners/prospect-sent
consequence:
- Add to prospects
record_as: organizations
features:
- name: Moves as you update it
description: It sits as a prospect until something moves - then you mark it client, and later past client if the work ends.
icon: lucide:route
- name: Just for you
description: Only you see this, so keep it wherever you check next.
icon: lucide:user
- name: New prospect
requirements:
- name: name
label: Organization
type: text
placeholder: Nordvik Bakery
- name: contact
label: Contact
type: text
placeholder: met at the bakers' conference, [email protected]
- name: note
label: Note
type: textarea
optional: true
placeholder: wants a booking flow, follow up after harvest season
description: Name the organization and where things stand.
icon: lucide:briefcase
encouragements:
- Takes a minute, and it's yours to update later.
@@ -0,0 +1,10 @@
name: What happens to what I just sent?
description: Your note is in. An owner reads every one and will get back to you if there's a fit worth exploring.
alternatives:
- name: We'll write if there's a fit
description: If it looks like a fit, we'll reach out to talk about where you could help.
- name: Back to site
description: ''
action: /
consequence:
- Back to site
@@ -0,0 +1,10 @@
name: What happens now that we've sent our brief?
description: Your brief is in. An owner reads every commission end to end before replying.
alternatives:
- name: A real reply from someone who read it
description: Expect a reply within a few working days, either way, straight to your inbox.
- name: Back to home
description: ''
action: /
consequence:
- Back to home
@@ -0,0 +1,10 @@
name: Who looks after what the network keeps?
description: A custodian reads every message about the redoal network and what it keeps.
alternatives:
- name: A custodian is on it
description: Expect a reply once your report has been looked at and the network checked.
- name: Back to the site
description: ''
action: /
consequence:
- Back to the site
@@ -0,0 +1,15 @@
name: What happens to my proposal now?
description: Your proposal is in. Someone here will read it and decide whether it fits before anything changes on the page.
alternatives:
- name: A read, then a decision
description: We'll write back once it's been read — approved and made live, or turned down with a reason.
- name: See all development proposals
description: ''
action: /status/development_proposals
consequence:
- Open
- name: Back home
description: ''
action: /
consequence:
- Back home
@@ -0,0 +1,10 @@
name: What happens now that I've subscribed?
description: You'll hear from us when there's something worth saying, not on a schedule.
alternatives:
- name: You're on the list
description: You're on the list. Every note has an unsubscribe link if it stops being useful.
- name: Back to site
description: ''
action: /
consequence:
- Back to site
@@ -0,0 +1,10 @@
name: What happens now that you've sent this?
description: We read every trial request ourselves before anything gets built.
alternatives:
- name: A first draft, built from your own words
description: If it looks like a fit, we'll draft your site from your own words and send it back for your say before anything goes live.
- name: Back to site
description: ''
action: /
consequence:
- Back to site
@@ -0,0 +1,25 @@
name: Which changes to this site have already been approved?
description: These are the suggested page changes a person here has read and approved. Each one is being made or has been made.
responsible:
name: Bendik Aagaard Lynghaug
contact: bl@uhhm.no
alternatives:
- name: See the changes we've approved
description: Suggestions from visitors that we've read and agreed to make.
features:
- name: Approved changes
description: Each row is one suggested change to a page on this site that has been approved; the list shows nothing else.
resource:
source:
kind: kv
bucket: development_proposals
public: true
states:
- approved
empty: No changes have been approved yet. If you see something on a page that should be different, send us your suggestion.
jq: '.[] | .responses |= {page: .page, proposed_yaml: .proposed_yaml, rationale: .rationale}'
- name: Suggest a change
description: ''
action: /
consequence:
- Suggest a change
+30
View File
@@ -0,0 +1,30 @@
title: UHHM
lang: en
mail:
from: UHHM <portal@uhhm.no>
reply_to: bl@uhhm.no
invite:
subject: '{name}, you have been invited to {group} on {site_name}'
body: |-
Hello {name},
A member of {site_name} has brought you in to help
on {group}.
Your username is {username}.
Use this one-time link to set a password:
{link}
The link runs out {expires}.
If it has run out, ask the person who invited you
for a new one.
Afterwards you sign in at {site}
with your username and the password you chose.
If you were not expecting this, you can ignore
this mail. Nothing happens until the link is used.
{site_name}
+570
View File
@@ -0,0 +1,570 @@
{
"aggregates.yaml": {
"custody_requests": {
"declined": {
"subject": "Your request about {about}: declined",
"body": "{name}, the custodians have declined your request about {about}. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have your request about {about}",
"body": "{name}, your request about {about} has reached the custodians of the redoal network. A custodian will answer you at {email}.\n{site}\nUHHM"
},
"resolved": {
"subject": "Your request about {about} is resolved",
"body": "{name}, the custodians have resolved your request about {about}. If something is still wrong, reply to this mail and a custodian will read it.\n{site}\nUHHM"
}
},
"projects": {
"accepted": {
"subject": "{organization}: we would like to take your project on",
"body": "{name}, we have read the brief from {organization} and would like to take the project on. Reply to this mail and we will agree on the next step.\n{site}\nUHHM"
},
"declined": {
"subject": "{organization}: we cannot take your project on",
"body": "{name}, we have read the brief from {organization} and cannot take the project on. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have the brief from {organization}",
"body": "{name}, the brief from {organization} has reached us, and we will read all of it. You will get a considered reply at {email}.\n{site}\nUHHM\n\nWhat you can do next: {site}/decide/commission?chain={chain}&email={email}"
}
},
"trials": {
"approved": {
"subject": "{business}: your trial is approved",
"body": "We have approved the trial for {business}, and we are now building a first draft of a site from your own words. You will get a mail at {email} when it is ready to look at.\n{site}\nUHHM"
},
"declined": {
"subject": "{business}: we cannot build your trial",
"body": "We have declined the trial for {business}. You can reply to this mail to ask about it, and a reply reaches the people who decided.\n{site}\nUHHM"
},
"open": {
"subject": "We have your trial request for {business}",
"body": "Your request for {business} has reached us, and a person will read it before anything is built. You will hear from us at {email} once it has been decided.\n{site}\nUHHM"
},
"previewed": {
"subject": "{business}: your first draft is ready",
"body": "The first draft of a site for {business} is ready for you to look at. Reply to this mail and tell us what fits and what does not.\n{site}\nUHHM"
}
}
},
"questions/custodians/index.yaml": {
"question": "What is waiting on the custodians?",
"description": "The desk for custodians: open custody cases, and the people invited to answer them.",
"confirm": "Confirm",
"buckets": {
"custody_requests": {
"heading": "Custody cases waiting on you",
"description": "Cases from people who use, build on, or answer for something the redoal network touches, and need a custodian's word on it.",
"moves": {
"in_dialogue->resolved": "Mark resolved",
"in_dialogue->declined": "Close, no action",
"open->in_dialogue": "Open dialogue",
"open->declined": "Decline case"
},
"list_title": "Custody requests",
"list_note": "Each row is one case. The buttons record what you have just done with it."
}
},
"links": {},
"invites": {
"custodians": {
"heading": "Bring in another custodian",
"description": "Give someone an account and a one-time link to join as a custodian.",
"button": "Invite custodian",
"form_title": "Invite a custodian",
"form_description": "Their name, and the address the account and its one-time link go to.",
"labels": {
"name": "Name",
"email": "Email"
}
}
},
"invited": {
"heading": "Invited custodians",
"description": "Custodians invited but not yet signed in.",
"done": "Signed in",
"list_title": "Who has been invited",
"list_note": "Each row is one invitation, with the one-time link while it is unused."
}
},
"questions/decide/commission.yaml": {
"question": "What would you like to do?",
"description": "",
"moves": {
"declined": {
"heading": "Declined",
"description": "",
"button": "Declined"
}
}
},
"questions/decide/custody.yaml": {
"question": "What would you like to do?",
"description": "",
"moves": {
"resolved": {
"heading": "Resolved",
"description": "",
"button": "Resolved"
}
}
},
"questions/decide/subscribe.yaml": {
"question": "Do you want to keep hearing from us?",
"description": "You're on our list. Change your mind whenever you like.",
"moves": {
"unsubscribed": {
"heading": "Stop getting notes from us",
"description": "You'll stop hearing from us. Nothing else changes.",
"button": "Unsubscribe"
}
}
},
"questions/index.yaml": {
"question": "What is UHHM, and what can you get here?",
"description": "UHHM builds software for organisations that can say what problem they have, and keeps the redoal network underneath.",
"opener": {
"heading": "What UHHM does",
"description": "Two things, both built here and both running.",
"features": {
"software": {
"heading": "A considered reply to your brief, and software that fits the argument",
"description": "Infrastructure, tools and products for organizations that can say what problem they have. Bring the brief, or first see your own way of working as a working site, before you pay for anything. The brief stays yours: you can withdraw it yourself.",
"icon": "layers"
},
"redoal": {
"heading": "A network that answers to you",
"description": "UHHM builds and carries the redoal network: the gesture math, the relay, the first node, and the portal this page runs on. Run a node, build on it, or have a recording removed, and you say when it is resolved.",
"icon": "waypoints"
}
}
},
"shopping": {
"heading": "Have a look around first",
"description": "Nothing to fill in here. What is already out in the world, and the network as it runs right now.",
"items": {
"built": {
"heading": "What we have built",
"description": "A few things already out in the world.",
"icon": "hammer"
},
"voices": {
"heading": "The redoal network, live",
"description": "Straight from the relay, the first node of the network.",
"icon": "activity"
},
"status-development_proposals": {
"heading": "Changes to this site we have approved",
"description": "Suggestions from visitors that a person here has read and approved, open for anyone to read.",
"icon": "list"
}
}
},
"doors": {},
"needs": {
"commission": {
"heading": "Have us build it: send the brief",
"description": "You know the problem and want it solved, whether it is infrastructure, a tool, or the first version of a product. Write it up for people who read the whole thing.",
"button": "Send the brief",
"encouragement": "Someone here reads every brief in full before writing back.",
"icon": "briefcase",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "We read your brief and either take it on or tell you honestly if it's not a fit.",
"road_icon": "route",
"who_title": "Who reads this",
"who_description": "One of the owners reads it; write to bl@uhhm.no if you'd rather reach us directly.",
"who_icon": "user-check",
"form_title": "Tell us the problem",
"form_description": "The more of the problem you put in, the better the reply.",
"labels": {
"name": "Your name",
"email": "Your email",
"project": "The problem you want solved",
"organization": "Your organization",
"org_contact": "Who we should talk to"
},
"hints": {
"name": "Sara Nilsen",
"email": "sara@company.com",
"project": "Our drivers log hours on paper and it takes a day to get them into payroll.",
"organization": "Nilsen Transport AS",
"org_contact": "Sara Nilsen, ops manager"
}
},
"trial": {
"heading": "See your own business as a site, before you buy anything",
"description": "Describe how requests, approvals and handovers move through your business today. We approve it by hand and build a working draft of a site for your own roles, for you to click through.",
"button": "Start the draft",
"encouragement": "A person looks at what you send before anything gets built.",
"icon": "layers",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "We look at what you sent and, if it's a fit, build a draft from your own roles and words for you to see before anything moves further.",
"road_icon": "route",
"who_title": "Who reads this",
"who_description": "An owner looks at what you send; write to bl@uhhm.no if you'd rather reach us directly.",
"who_icon": "user-check",
"form_title": "Describe your business",
"form_description": "Answer in your own words - there's no wrong way to describe your business.",
"labels": {
"business": "Your business",
"email": "Your email",
"what_we_do": "What you do",
"who_comes_to_us": "Who comes to you",
"what_we_keep_track_of": "What you keep track of",
"who_is_involved": "Who's involved",
"what_slows_us_down": "What slows you down"
},
"hints": {
"business": "Nilsen Transport AS",
"email": "sara@company.com",
"what_we_do": "We move freight for local businesses and handle the paperwork for them.",
"who_comes_to_us": "Local businesses that need something moved on short notice.",
"what_we_keep_track_of": "Bookings, driver hours, and which loads are still waiting on a signature.",
"who_is_involved": "Drivers, dispatchers, and the customers waiting on their delivery.",
"what_slows_us_down": "Approvals sit in someone's inbox for days before anyone acts on them."
}
},
"collaborate": {
"heading": "Work with us",
"description": "A developer, a designer, a student: say what you would want to build with us, and we read it as a person and invite you in if there is a fit.",
"button": "Get in touch",
"encouragement": "A person reads this, not a form filter — worth the ten minutes.",
"icon": "handshake",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "We read what you send and get back to you. If there's a fit, we invite you in and you start working with us — and if things ever change, that's fine too.",
"road_icon": "route",
"who_title": "Who reads this",
"who_description": "One of the owners reads this directly — for anything urgent, write to bl@uhhm.no.",
"who_icon": "user-check",
"form_title": "Say hello",
"form_description": "Tell us who you are and what kind of work you're after.",
"labels": {
"name": "Name",
"email": "Email",
"interest": "What kind of work",
"note": "Tell us more"
},
"hints": {
"name": "Your name",
"email": "you@example.com",
"interest": "Backend work, or something design-heavy",
"note": "A bit about what you'd want to work on, or a link to your work"
}
},
"subscribe": {
"heading": "Hear from us now and then",
"description": "You'd rather hear from us now and then than check back on your own.",
"button": "Sign up",
"encouragement": "One click unsubscribes you later, no questions asked.",
"icon": "mail",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "You're on the list. We write when there's something worth saying, and you can leave the list whenever you like.",
"road_icon": "bell",
"who_title": "Who reads this",
"who_description": "An owner sends these notes directly — write to bl@uhhm.no if you'd rather ask something first.",
"who_icon": "user-check",
"form_title": "Stay in the loop",
"form_description": "Just your email, or your name too if you'd like.",
"labels": {
"name": "Name",
"email": "Email"
},
"hints": {
"name": "Your name",
"email": "you@example.com"
}
},
"propose": {
"heading": "Suggest a change to this website",
"description": "You have spotted a page on uhhm.no that should read differently, and you know roughly how.",
"button": "Send change",
"encouragement": "Even a rough version helps — we can tidy the wording ourselves.",
"icon": "pencil",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "Someone here reads your proposal and either makes the change or explains why not. Either way, you'll hear back.",
"road_icon": "route",
"who_title": "Who reads this",
"who_description": "An owner reads every proposal before anything changes — reach us at bl@uhhm.no if it's time-sensitive.",
"who_icon": "user-check",
"form_title": "Propose a change",
"form_description": "Point us to the page and show us the change.",
"labels": {
"submitted_by": "Your name",
"email": "Email",
"page": "Which page",
"rationale": "Why this is better",
"proposed_yaml": "Your proposed text"
},
"hints": {
"submitted_by": "Your name",
"email": "you@example.com",
"page": "questions/join/index.yaml",
"rationale": "The current heading doesn't say what you actually get",
"proposed_yaml": "heading: \"A clearer way to say this\""
}
},
"custody": {
"heading": "You are on the redoal network: a node, an app, or a recording that concerns you",
"description": "UHHM hosts the redoal network's first node and answers for what it keeps. Write here if you run a node, build on the network, or want something it holds about you looked at.",
"button": "Send to a custodian",
"encouragement": "A custodian reads every message that comes in here.",
"icon": "shield",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "What happens next",
"road_description": "A custodian opens a dialogue with you. A node gets its peer, a builder gets an answer, and something the network should not keep gets removed. Either way you hear what was decided.",
"road_icon": "route",
"who_title": "Who reads this",
"who_description": "A custodian reads it directly; if it's urgent, write to bl@uhhm.no in the meantime.",
"who_icon": "user-check",
"form_title": "Reach a custodian",
"form_description": "Say which of the four it is, and what you need, in a few lines.",
"labels": {
"name": "Name",
"email": "Email",
"about": "What's going on",
"what": "In short"
},
"hints": {
"name": "Your name",
"email": "you@yourcompany.com",
"about": "We run our order system on a relay node and it's been dropping messages since Tuesday",
"what": "A relay node is misbehaving"
}
}
}
},
"questions/owners/index.yaml": {
"question": "What's waiting on me today?",
"description": "Everything waiting on you: briefs, trials, applicants, subscribers, and proposals, all in one place.",
"confirm": "Confirm",
"buckets": {
"applicants": {
"heading": "People who want to build with us",
"description": "People who've asked to build with us, waiting on a decision or already working alongside us.",
"moves": {
"active->departed": "Mark departed",
"invited->active": "Confirm active",
"invited->declined": "Withdraw the invite",
"open->invited": "Send invite",
"open->declined": "Decline applicant"
},
"list_title": "Applicants",
"list_note": "Each row is one case. The buttons record what you have just done with it."
},
"custody_requests": {
"heading": "What's been raised with custodians",
"description": "Questions and issues raised with the people who keep the first node - custodians handle these, but you can see where each one stands.",
"moves": {},
"list_title": "Custody requests",
"list_note": "Each row is one case and the stage it has reached. Another desk moves these."
},
"development_proposals": {
"heading": "Proposed changes to the site",
"description": "Changes visitors have proposed for pages on this site, waiting on a yes or no.",
"moves": {
"open->approved": "Approve change",
"open->rejected": "Reject change"
},
"list_title": "Development proposals",
"list_note": "Each row is one case. The buttons record what you have just done with it."
},
"organizations": {
"heading": "Organizations you're tracking",
"description": "Organizations you've met, tracked from first contact through to client and beyond.",
"moves": {
"client->past_client": "Mark past client",
"prospect->client": "Mark as client",
"prospect->past_client": "Archive as past client"
},
"list_title": "Organizations",
"list_note": "Each row is one case. The buttons record what you have just done with it."
},
"projects": {
"heading": "Briefs waiting on a reply",
"description": "Briefs sent in by organizations with a problem they want solved.",
"moves": {
"open->accepted": "Accept brief",
"open->declined": "Decline brief"
},
"list_title": "Projects",
"list_note": "Each row is one case. The buttons record what you have just done with it."
},
"subscribers": {
"heading": "Who's hearing from you",
"description": "People who want to hear from you now and then.",
"moves": {
"open->unsubscribed": "Unsubscribe them"
},
"list_title": "Subscribers",
"list_note": "Each row is one case. The buttons record what you have just done with it."
},
"trials": {
"heading": "Trial sites in progress",
"description": "Businesses who want to see their own workflow as a working site before committing to anything.",
"moves": {
"approved->previewed": "Mark previewed",
"approved->declined": "Decline trial",
"open->approved": "Approve trial",
"open->declined": "Decline trial"
},
"list_title": "Trials",
"list_note": "Each row is one case. The buttons record what you have just done with it."
}
},
"links": {
"prospect": {
"heading": "Track a new organization",
"description": "Write down an organization worth following up, and track it from first contact onward.",
"button": "Add prospect"
}
},
"invites": {
"custodians": {
"heading": "Bring in a custodian",
"description": "Bring someone in to help keep the first node and answer for the network.",
"button": "Send invite",
"form_title": "Invite a custodian",
"form_description": "Their name, and the address the account and its one-time link go to.",
"labels": {
"name": "Their name",
"email": "Their email"
}
},
"owners": {
"heading": "Bring in another owner",
"description": "Bring someone in to work this desk alongside you.",
"button": "Send invite",
"form_title": "Invite an owner",
"form_description": "Their name, and the address the account and its one-time link go to.",
"labels": {
"name": "Their name",
"email": "Their email"
}
}
},
"invited": {
"heading": "Invites you've sent",
"description": "People you've invited in, and whether they've taken it up yet.",
"done": "Taken up",
"list_title": "Who has been invited",
"list_note": "Each row is one invitation, with the one-time link while it is unused."
}
},
"questions/owners/prospect-sent.yaml": {
"question": "What happens to this now?",
"description": "Thanks — we've got your prospect written down, and it now moves through the desk with everything else we're tracking.",
"next_heading": "It's on the desk now",
"next_description": "An owner walks it from prospect to client, and on to past client, as the relationship moves.",
"back": "Back to site"
},
"questions/owners/prospect.yaml": {
"heading": "Keep an organization on your radar",
"description": "One line per organization worth watching, moved through the stages as things develop.",
"button": "Add to prospects",
"encouragement": "Takes a minute, and it's yours to update later.",
"icon": "briefcase",
"requires_title": "",
"requires_description": "",
"requires_icon": "",
"road_title": "Moves as you update it",
"road_description": "It sits as a prospect until something moves - then you mark it client, and later past client if the work ends.",
"road_icon": "route",
"who_title": "Just for you",
"who_description": "Only you see this, so keep it wherever you check next.",
"who_icon": "user",
"form_title": "New prospect",
"form_description": "Name the organization and where things stand.",
"labels": {
"name": "Organization",
"contact": "Contact",
"note": "Note"
},
"hints": {
"name": "Nordvik Bakery",
"contact": "met at the bakers' conference, [email protected]",
"note": "wants a booking flow, follow up after harvest season"
},
"question": "Is there an organization I should be keeping track of?",
"page_description": "Write down an organization worth following up, and move it through client and past client as things develop."
},
"questions/received/collaborate.yaml": {
"question": "What happens to what I just sent?",
"description": "Your note is in. An owner reads every one and will get back to you if there's a fit worth exploring.",
"next_heading": "We'll write if there's a fit",
"next_description": "If it looks like a fit, we'll reach out to talk about where you could help.",
"back": "Back to site"
},
"questions/received/commission.yaml": {
"question": "What happens now that we've sent our brief?",
"description": "Your brief is in. An owner reads every commission end to end before replying.",
"next_heading": "A real reply from someone who read it",
"next_description": "Expect a reply within a few working days, either way, straight to your inbox.",
"back": "Back to home"
},
"questions/received/custody.yaml": {
"question": "Who looks after what the network keeps?",
"description": "A custodian reads every message about the redoal network and what it keeps.",
"next_heading": "A custodian is on it",
"next_description": "Expect a reply once your report has been looked at and the network checked.",
"back": "Back to the site"
},
"questions/received/propose.yaml": {
"question": "What happens to my proposal now?",
"description": "Your proposal is in. Someone here will read it and decide whether it fits before anything changes on the page.",
"next_heading": "A read, then a decision",
"next_description": "We'll write back once it's been read — approved and made live, or turned down with a reason.",
"back": "Back home",
"see_all": {
"heading": "See all development proposals",
"description": "",
"button": "Open"
}
},
"questions/received/subscribe.yaml": {
"question": "What happens now that I've subscribed?",
"description": "You'll hear from us when there's something worth saying, not on a schedule.",
"next_heading": "You're on the list",
"next_description": "You're on the list. Every note has an unsubscribe link if it stops being useful.",
"back": "Back to site"
},
"questions/received/trial.yaml": {
"question": "What happens now that you've sent this?",
"description": "We read every trial request ourselves before anything gets built.",
"next_heading": "A first draft, built from your own words",
"next_description": "If it looks like a fit, we'll draft your site from your own words and send it back for your say before anything goes live.",
"back": "Back to site"
},
"questions/status/development_proposals/index.yaml": {
"question": "Which changes to this site have already been approved?",
"description": "These are the suggested page changes a person here has read and approved. Each one is being made or has been made.",
"heading": "See the changes we've approved",
"list_description": "Suggestions from visitors that we've read and agreed to make.",
"list_title": "Approved changes",
"list_note": "Each row is one suggested change to a page on this site that has been approved; the list shows nothing else.",
"empty": "No changes have been approved yet. If you see something on a page that should be different, send us your suggestion.",
"back": "Suggest a change"
},
"site.yaml": {
"invite": {
"subject": "{name}, you have been invited to {group} on {site_name}",
"body": "Hello {name},\n\nA member of {site_name} has brought you in to help\non {group}.\n\nYour username is {username}.\n\nUse this one-time link to set a password:\n\n{link}\n\nThe link runs out {expires}.\nIf it has run out, ask the person who invited you\nfor a new one.\n\nAfterwards you sign in at {site}\nwith your username and the password you chose.\n\nIf you were not expecting this, you can ignore\nthis mail. Nothing happens until the link is used.\n\n{site_name}"
}
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"questions/status/development_proposals/index.yaml": {
"question": "Which changes to this site have already been approved?",
"description": "These are the suggested page changes a person here has read and approved. Each one is being made or has been made.",
"heading": "See the changes we've approved",
"list_description": "Suggestions from visitors that we've read and agreed to make.",
"list_title": "Approved changes",
"list_note": "Each row is one suggested change to a page on this site that has been approved; the list shows nothing else.",
"empty": "No changes have been approved yet. If you see something on a page that should be different, send us your suggestion.",
"back": "Suggest a change"
}
}