Grunnleggende arkitekturbeslutninger tatt og dokumentert: - Alt er noder (brukere, team, innhold, mediefiler, samlings-noder) - Edges definerer hva en node er (freeform typer, metadata i JSONB) - Materialisert tilgangsmatrise (node_access) erstatter workspace-RLS - Visibility (hidden/discoverable/readable/open) på noder - Aliaser via usynlige system-edges - Maskinrommet eier all skriving (SpacetimeDB først, PG asynk) - SpacetimeDB holder hele grafen, PG er persistent backup - Node- og edge-skjema spesifisert (docs/primitiver/) Fjernet workspace-konseptet fra hele dokumentasjonen (~40 filer). Fem retninger besluttet, én åpen (rom, ikke forum). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.3 KiB
Universell input og mottak
Status: Besluttet.
Én multimodal input-primitiv. Én personlig mottaksflate. Alt som fanges er en node. Hva det "er" bestemmes av edges. Hvordan det presenteres bestemmes av mottakeren.
Input-primitiven
Én overflate som fanger alt:
- Tekst — skriving, Markdown, kodeblokker
- Lyd — voice memo, diktering → automatisk transkribert
- Bilde — foto, skjermbilde, tegning
- AI-støtte — spør AI, få forslag, la den transformere input
- URL — lim inn lenke, den berikes automatisk
Brukeren gjør det samme uansett kontekst — skriver, snakker eller tegner i input-feltet. Forskjellen mellom "dagbok", "chatmelding" og "kanban-kort" er ikke hva brukeren gjør — det er hvilke edges som knyttes til resultatet.
Én pipeline
All input går gjennom samme tekniske pipeline: maskinrommet → SpacetimeDB (instant) → PG (asynk).
Konteksten bestemmer routing, ikke en teknisk modus:
- Du er i et møte → inputen streames live til andre deltakere
- Du er alene på bussen → inputen lander som privat node
- Du er i en podcast-kanal → inputen går inn i produksjonspipeline
Samme pipeline. Ulike edges.
Input-metode og innholdstype er ortogonale
Du kan snakke inn et kanban-kort. Du kan tegne en kalenderoppføring. Input-primitiven bryr seg ikke om hva det blir — den fanger det som kommer inn. Alt etterpå er edges.
Én overflate å perfeksjonere
All UX-investering konsentreres ett sted. Én perfekt input-opplevelse — responsiv, multimodal, med god AI-støtte — i stedet for ti middelmådige spesialgrensesnitt.
Edges definerer alt
Hva en node "er" bestemmes utelukkende av edges:
- Node +
belongs_to→ kanal = chatmelding - Node +
belongs_to→ board +status= kanban-kort - Node +
scheduled→ tidspunkt = kalenderoppføring - Node uten edges til andre = privat notat
- Node +
mentions→ topic = faktoid i kunnskapsgrafen - Node uten edges = løs tanke, ennå uorganisert
Retyping er trivielt. Chatmelding → kanban-kort = legg til board-edge og status-edge. Ingen datamigrering, bare edges.
Multitype er naturlig. En node kan være både kanban-kort og kalenderoppføring og faktoid. Det er ikke en edge case — det er arkitekturen.
Edge-tildeling
Når du "bare sier noe" — hvem bestemmer edges?
- Kontekst gir det meste. Du er i en samtale →
belongs_to- edge til samtalen. Du er alene → privat. Dekker 80%. - Eksplisitt handling. Du drar en node til kanban-brettet. Du tagger noe. Du setter en dato.
- AI-foreslått. Systemet foreslår
mentions-edge når du nevner en person. Foreslår kanban når noe ligner en oppgave.
Detaljer for AI-foreslåtte edges avklares ved implementering.
Mottak-primitiven
Der input er "én overflate som fanger alt", er mottak "én overflate som presenterer alt tilpasset deg."
Mottaker bestemmer format
All lyd transkriberes. All tekst kan leses opp (TTS). Noden har alltid begge representasjoner. Mottaker setter sin preferanse:
- Trond snakker inn en tanke → node med lyd + transkripsjon
- Peter har tekst-preferanse → ser transkripsjonen
- Vegard har lyd-preferanse → hører originallyd
Modalitet er ikke en egenskap ved meldingen, men ved lesningen.
Dimensjoner ved mottak
Format. Lyd, tekst, visuelt — mottaker bestemmer.
Filtrering. Mottaksflaten filtrerer basert på dine edges: kanaler du følger, personer du samarbeider med, topics du er interessert i.
Prioritering. AI-assistert vekting: ubesvarte meldinger, oppgaver med frist, noder endret siden sist. Ikke en notifikasjonsliste — en vektet visning av det som er relevant.
Tempo. Sanntid (ting streamer inn) eller asynkront (digest, oppsummering).
Mottaksflaten er en visning av grafen
"Noder med edge til meg, vektet på relevans og tid." Ikke en egen mekanisme — en spørring mot grafen med deg som sentrum.
Kommunikasjonsnoden — den tredje primitiven
Input fanger. Mottak presenterer. Kommunikasjonsnoden er stedet der folk møtes — en node som samler deltakere, definerer tilgangsregler, og fungerer som kontekst.
Én node, mange former
| Variant | Deltakere | Input | Mottak |
|---|---|---|---|
| Én-til-én | 2 | Begge | Begge |
| Gruppechat | N | Alle | Alle |
| Møte | N | Alle | Alle |
| Allmøte | 1 + N | Leder | Alle lytter |
| Podcastinnspilling | 2-4 + N | Verter | Alle lytter |
| Livesending | 1-4 + ∞ | Verter | Streamet |
| Asynkron gjest | 1 + 1 | Gjest | Redaksjonen |
Forskjellen er edge-konfigurasjoner, ikke ulike systemer:
owner-edge — kontrollerer nodenmember-edge — kan gi input og mottareader-edge — kan kun motta
Kontekst arves automatisk
Input i en kommunikasjonsnode arver kontekst-edges. Sier du noe
i et møte → noden får belongs_to-edge til møtet automatisk.
Livssyklus
- Live — deltakere til stede, input streames
- Asynkron — deltakere gir input i eget tempo
- Avsluttet — arkivert, alt som ble sagt er noder med edges
- Gjenåpnet — reaktivert ("vi tar opp tråden fra forrige møte")
Skalering er edge-endring
Samtale → møte = flere deltaker-edges. Møte → livesending = offentlige mottak-edges. Livesending → podcast = publiserings-edges på arkivert innhold.
Tekniske forutsetninger
STT (tale → tekst): løst
Faster-whisper kjører lokalt, god norsk kvalitet.
TTS (tekst → tale): løsbart
Start med ElevenLabs bak AI Gateway, bytt til lokal modell når kvaliteten holder. Backend-swap bak gatewayen — brukeren merker ingenting.
Visninger er spørringer
Chat = noder med kanal-edge, sortert på tid. Kanban = noder med board-edge, gruppert på status. Kalender = noder med dato-edge, på tidslinje. Dagbok = private noder, sortert på tid. Mottaksflate = noder med edge til deg, vektet.
Alle leser fra samme graf. Ingen har "sin egen" data.
Forhold til andre retninger
- Noder er sentrum — visibility, tilgangsmatrise, aliaser
- Datalaget — SpacetimeDB holder hele grafen, PG persisterer asynkront
- Maskinrommet — validering, routing, CAS, tunge jobber (Whisper, TTS, AI)
- Rom, ikke forum — kommunikasjonsnoden er den konkrete realiseringen av "rommet"