CaseGraphCaseGraphv0.50.0
...

Brugervejledning

CaseGraph v0.50.0 — AI-native knowledge platform

1. Hvad er CaseGraph?

CaseGraph er en AI-drevet videnplatform til sagsorienteret arbejde. Du uploader dokumenter — PDF, DOCX, TXT eller billeder — og systemet:

  • Udtrækker tekst automatisk (inkl. OCR for billeder)
  • Splitter teksten i søgbare chunks med bevarede positioner
  • Finder entiteter: personer, selskaber, adresser, datoer, belob
  • Opdager relationer mellem entiteter med evidens fra kildeteksten
  • Bygger en visuel knowledge graph du kan udforske
  • Lader dig stille spørgsmål til dine dokumenter via AI-chat
  • Kan generere et sagskort (case map) fra hele dokumentmassen

Alt er sporbart: enhver AI-pastand og enhver relation kan spores tilbage til det præcise sted i kildedokumentet.

2. Kom i gang (5 min)

  1. Gå til Dashboard

    Her ser du API-status og kan uploade dokumenter.

  2. Upload et dokument

    Klik “Upload dokument” og vælg en PDF, DOCX eller TXT-fil. Systemet processerer filen automatisk (typisk 1-5 sekunder). Status skifter: uploaded → extracting → chunking → ready.

  3. Søg i dokumentet

    Gå til Søg og skriv et søgeord. Resultater vises med highlighted matches og link til kildedokumentet.

  4. Se entities

    Gå til Entities for at se de automatisk udtrukne personer, selskaber, datoer og relationer.

  5. Udforsk grafen

    Gå til Graph for at se entities som et visuelt netværk. Klik på en node for at se evidens.

3. Dokumenter og upload

Understottede formater

FormatFiltyperBemærkning
Tekst.txtUTF-8, direkte indlæsning
PDF.pdfTekstbaseret PDF (skannet kræver OCR)
Word.docx, .docTekst udtrækkes, formatering ignoreres
Billeder.jpg, .pngOCR via Tesseract.js (eng+dan)

Upload-grænser

  • Max filstorrelse: 50 MB per fil
  • En fil per upload (bulk-upload kommer senere)

Dokumentstatus

StatusBetydning
uploadedFil modtaget, venter på behandling
extractingTekst udtrækkes fra filen
extractedTekst udtrukket, klar til chunking
chunkingTekst splittes i søgbare dele
embeddingChunks embeddes til semantisk søgning
readyFærdigbehandlet — søgbar og i grafen
failedNoget gik galt — se fejlbesked

Hvad sker der efter upload?

Dokumentet gennemlober en automatisk pipeline:

  1. Tekst udtrækkes (PDF → pdf-parse, DOCX → mammoth, TXT → direkte, billede → Tesseract.js OCR)
  2. Teksten splittes i chunks (~1200 tegn med bevarede offsets)
  3. Hvis en embedding-provider er konfigureret: chunks embeddes til semantisk søgning
  4. Entities udtrækkes (regex for CVR/datoer + LLM for navne/relationer)
  5. AI-sammenfatning + rolle: i samme LLM-kald skriver AI 2-4 danske sætninger om dokumentet og klassificerer det som kontrakt/mail/indstillingsliste/retsafgørelse/faktura/brev/bilag/ mødereferat/notat/andet
  6. Resultater gemmes med sporbarhed til kildedokument og chunk

Dokumentvisning: Grid og Tidslinje

/dashboard kan du skifte mellem to visninger via knappen “▦ Grid” og “⊢ Tidslinje”:

  • Grid — klassiske kort med rolle-badge, AI- sammenfatning (blå italic venstrebjælke), oprettelsesdato og handlingsknapper (× slet, ↻ reprocess, → flyt, i info).
  • Tidslinje — vertikal akse med måneds-grupper. Hvert dokument vises med dag + måned, rolle-ikon i farve, titel og sammenfatning. Datoen er best-effort: brev-header → email-dato → upload-dato (kilde vises diskret under datoen).

Valget gemmes i localStorage så det folger dig mellem sessioner.

5. Entities og relationer

Entities-siden viser alle automatisk udtrukne entiteter og relationer fra dine dokumenter.

Entity-typer

TypeEksemplerKilde
PersonJens Hansen, CPR 010178-1234LLM + regex (CPR)
CompanyAcme Holding ApS, CVR 12345678LLM + regex (CVR)
AddressVesterbrogade 14, KobenhavnLLM
EventStiftelse, konkursdekretLLM
ClaimKrav på 2.3 mio. kr.LLM
PropertyMatrikel 42a, Strandvejen 8LLM
FinancialRelation1.500.000 kr., 42 mio. DKKRegex
Date12. marts 1978Regex

Relationer

Relationer udtrækkes af LLM og bruger SCREAMING_SNAKE_CASE-navne:OWNS, EMPLOYED_BY, LIVES_AT,PARTY_TO, CREDITOR_OF osv.

Hver relation har en confidence score (0-100%) og enevidens-snippet — det præcise citat fra kildeteksten.

Uden vs. med API-key

  • Uden: Kun regex-entities (CVR, CPR, datoer, belob). Ingen relationer.
  • Med ANTHROPIC_API_KEY eller OPENAI_API_KEY: LLM finder navne, adresser, selskaber, hændelser + relationer mellem dem.

6. Knowledge graph

Graph-siden viser entities som noder og relationer som kanter i et interaktivt React Flow-diagram. Der er to lag i grafen: workspace-grafen og AI case map.

Workspace-graf vs. AI case map

Workspace-grafAI Case map
Hvad er det?Den faktuelle graf bygget automatisk fra dokumentpipelinenEn AI-genereret analyse og fortolkning
Hvornår bygges den?Automatisk — vokser med hvert uploadet dokumentOn demand — når du trykker “Build case map”
IndholdEntities og relationer udtrukket fra tekst (fakta)AI's fortolkning: analyse, centrale aktører, risici, åbne spørgsmål
Koster penge?Nej (regex er gratis, LLM-extraction kører under upload)Ja — hvert kald bruger LLM-tokens via brokeren
DataPermanent i databasen (entities, relations, entity_mentions)Midlertidigt overlay — vises oven på workspace-grafen

Workspace-grafen er fundamentet. Den bygges automatisk når dokumenter processeres: entities udtrækkes, relationer opdages, og det hele gemmes i databasen med evidens-links til kildechunks. Grafen vokser med hvert nyt dokument du uploader.

AI case map er et overlay. Når du trykker “Build case map”, sender systemet alle entities, relationer og dokumentuddrag til AI'en (via brokeren), som genererer en analyse med en ny graf-struktur. Case map'et vises oven på workspace-grafen — det erstatter ikke de underliggende data.

Embeddings og grafen

Embeddings (vektorer) bruges kun til semantisk søgning — de har intet med grafen at gøre. Grafen er bygget på entities og relationer udtrukket fra dokumenttekst via regex og LLM. Du kan have en fuldt fungerende graf uden embeddings overhovedet.

Knapper i toolbar

KnapHvad den gørSletter data?
Build case mapGenererer AI case map overlay (koster tokens)Nej
Ryd visningSkjuler grafen visuelt — ingen data pavirkesNej — entities og relationer er bevaret i databasen
Vis grafBringer workspace-grafen tilbage efter “Ryd visning”Nej
Skjul case mapFjerner AI case map overlay, viser workspace-grafen igenNej — workspace-grafens data er upavirket

Intet sletter data. Entities og relationer er fakta udtrukket fra dine dokumenter — de forbliver i databasen uanset hvad du gør med visningen. “Ryd visning” og “Skjul case map” er rent visuelle handlinger.

Interaktion

  • Zoom: Scroll-hjul eller +/- knapper
  • Pan: Klik og træk i baggrunden
  • Flyt node: Klik og træk en node
  • Klik node: Abner sidepanel med evidens

Sidepanel (klik på node)

Viser:

  • Entity-type med farvet badge
  • Alle relationer med retning, type, confidence og evidens-citat
  • Kildedokumenter med chunk-reference og link

Filtrering

Venstre sidebar har checkboxes for hver entity-type. Sla typer fra for at forenkle grafen. Ændringer opdaterer grafen live.

7. AI Chat

Chat-siden lader dig stille spørgsmål til dine dokumenter i naturligt sprog.

Hvordan det virker (RAG)

  1. Dit spørgsmål embeddes (eller keyword-søges)
  2. De 15 mest relevante chunks hentes fra databasen
  3. Chunks sendes som kontekst til AI-modellen
  4. AI'en svarer baseret KUN på den kontekst — ingen gætterier
  5. Svaret inkluderer citations der peger til kildedokumenter

Eksempler på spørgsmål

  • “Hvem er de centrale personer i sagen?”
  • “Hvilke selskaber er nævnt og hvad er deres rolle?”
  • “Er der nogen okonomiske relationer mellem person X og selskab Y?”
  • “Hvad er de vigtigste datoer i forlobet?”
  • “Opsummer dokumentet om [emne]”

Citations

Under hvert AI-svar vises en “Kilder”-blok med links til de dokumenter og chunks der dannede grundlag for svaret. Klik for at gå direkte til kildedokumentet.

Kræver ANTHROPIC_API_KEY (Claude) eller OPENAI_API_KEY.

8. Case map

Case map er en AI-genereret sagsanalyse med tilhorende graf-specifikation. Find den via knappen “Build case map” på Graph-siden.

Hvad den gør

  1. Planner: AI'en analyserer alle entities, relationer og dokumentuddrag og laver en analyseplan
  2. Coder: AI'en folger planen og producerer en konkret graf med nodes, edges og evidens

Output

  • Tekstlig analyse: Resume af sagen, centrale aktører, risici, åbne spørgsmål
  • Graf-spec: Nodes og edges der renderes som overlay i React Flow-grafen

Workspace-graf vs. case map

Case map'et erstatter ikke workspace-grafen. Det er et midlertidigt overlay med AI's fortolkning. Tryk “Skjul case map” for at vende tilbage til den faktuelle workspace-graf. Ingen data slettes.

Kræver ANTHROPIC_API_KEY eller OPENAI_API_KEY. Koster LLM-tokens via brokeren.

9. Entity aspects (blå +-knap)

I War Room har hver entitet en lille blå + knap. Klik på den, og AI folder et Mapify-style topic tree ud af entiteten — en hierarkisk mindmap med 3 niveauer: topics → detaljer → punkter, alt med direkte citater fra kildedokumentet.

Hvordan det virker: tre LLM-pass per entitet. Pass 1 finder de 4-8 brede topics, pass 2 (parallelt) går i dybden på hvert topic, pass 3 (legal) klassificerer den juridiske kravtype og tilføjer gældende konkurslovs-frister. Resultatet cached'es i entitetens attributter så anden klik er instant.

Klik på et af kortene i træet → popover viser det verbatim citat fra dokumentet. Klik igen for at lukke.

Træet starter lige under tidsaksen og fan'er mod højre i trappe-form (cascade). SVG-canvas udvides dynamisk så der kan scrolles både vandret og lodret med mushjul eller træk.

11. Tidslinje og War Room

Graph-siden (/graph) er sagens centralt naevsystem. Den hedder War Room eller Situation Room og er bygget omkring en tidsakse som default-dimension.

Du kan:

  • Scrolle vandret og lodret — mushjul eller træk
  • Zoome med / 100% / + i toolbaren (40-150%)
  • Springe til I dag, Tilbage, Frem
  • Hover på en entitet for at fremhæve dens tidslinje-forbindelser
  • Skjule/vise entity-typer via filter
  • Se gule frist-markører over aksen (inferred deadlines)
  • Se tidslinjen for flere dokumenter samlet — events fra alle docs aggregeres

Tidslinjen ruller med indhold: måneds-labels (Jan-Dec), uge-hak (u1-u52), dag-hak ved høj zoom. Events sidder som kort under aksen med dato + entity-navn. Entiteter sidder i et band under events og forbindes til deres events via bezier-linjer.

12. Print og PDF

Klik 🖨 Print ▾ i toolbaren og vælg:

  • Kun grafer — tidslinje + doc-grafer + legal-graf, uden tekstsider
  • Alt — graferne + tekstanalyse (dokumentanalyse, frister, tidslinje)

Udskriften består af (i rækkefølge):

  1. Side 1 — Sagsanalyse (portrait): AI-genereret 3-5 sætnings sagssammenfatning fra Build case map
  2. Side 2 — Tidslinje pr år (portrait): horisontalt spor pr kalenderår, events nedenfor aksen, frister over
  3. Side 3-4 — Dokumentanalyse (1/2 + 2/2): entiteten gentages med L1-topics fordelt mellem to sider, stiplet vertikal forbindelse
  4. Side 5 — Legale aspekter: AI-analyse af gældende dansk ret for denne entitet

Alle sider har "Situation Room"-header og footer med dokumentnavn · udskriftsdato · side N af M. Udskrift i portrait A4, sorte stregr, store læsbare typer, uden chrome.

13. AI på tværs af dokumenter

Værdien af AI stiger markant når du har flere dokumenter. Et enkelt dokument kan du læse selv — men når du har 10, 50 eller 500 dokumenter, kan AI finde sammenhænge du aldrig ville opdage ved at læse dem enkeltvis.

Cross-document entity linking

Dokument A nævner “Jens Hansen, CVR 12345678”. Dokument B nævner “CVR 12345678, Vesterbrogade 14”. AI kobler dem automatisk: Jens Hansen → ejer CVR 12345678 → adresse Vesterbrogade 14. Tre fakta fra to dokumenter → en sammenhæng i grafen.

Relationsnetværk

Upload 10 dokumenter om en konkurs. AI bygger automatisk en graf: hvem ejer hvad, hvem skylder hvem, hvilke ejendomme er involveret, hvilke datoer er kritiske. Ting der er spredt over hundredvis af sider samles i et visuelt overblik.

Søgning på tværs

Spørg “hvilke selskaber optræder i flere dokumenter?” — AI-chatten henter chunks fra alle dokumenter og svarer med citations der peger præcist tilbage til hvert enkelt kildedokument.

Case map fra hele dokumentmassen

Tryk “Build case map” — AI'en læser alle dokument-sammenfatninger (2-4 sætninger pr. doc, genereret automatisk ved upload) sorteret kronologisk og bygger en samlet sagsanalyse. Centrale aktører, risici og åbne spørgsmål — men nu med sammenhængende narrativ og referencer til specifikke dokumenter (fx “ifølge kontrakten af 12/3/2025”) i stedet for tilfældige chunks.

Dokument-tidslinje

/dashboard kan du skifte mellem “▦ Grid” og “⊢ Tidslinje” for at se sagens dokument-floew kronologisk, grupperet pr. måned. Datoen for hvert dokument hentes best-effort:

  1. Brev-header (fx “12. marts 2025”)
  2. Email-dato (hvis det er en ingested email)
  3. Upload-dato (fallback)

Kilden vises diskret under datoen. Rolle-ikonet (📜 kontrakt, ✉ mail, ⚖ retsafgørelse, 💳 faktura osv.) kommer fra AI-klassi- fikationen der køres samtidig med sammenfatningen ved upload.

Automatisk modsigelses-detektion

/dashboard kan du trykke “⚠ Scan sagen for modsigelser”. For hver entitet der nævnes i 2 eller flere dokumentersender AI'en hele korpuset i ét prompt og leder efter tilfælde hvor dokumenterne siger forskellige ting om samme faktum.

Hvad flag'es:

  • “Selskabet gik konkurs 1/1/2025” vs. “Selskabet er fortsat aktivt i 2025”
  • “Ole ejer 50%” vs. “Ole ejer 100%”
  • “Mødet blev holdt 12. marts” vs. “Mødet blev holdt 14. marts”

Hvad flag'es IKKE (prompt er eksplicit om det):

  • Forskellige aspekter — to docs taler bare om hver sit aspekt af entiteten
  • Specificitets-forskel — “i starten af 2025” vs. “3. januar 2025”
  • Tidsforskydning hvor begge kan være sande — “Ole var direktør” (2020) vs. “Ole fratrådte” (2023)

Fund vises som rødt foldbart bånd på dashboardet med claim A ⇄ claim B, hvilke dokumenttitler hver side kommer fra, konfidens i procent og 1-sætnings forklaring. Hver modsigelse har en ×-knap til at afvise falske positiver.

Eksempel: konkurssag

Du uploader:

  • Indstillingsliste (konkursbo)
  • Arsrapport
  • Tinglysningsudskrift
  • Kontoudtog

Hver for sig er det bare papir. Sammen kan AI'en vise:

  1. Person X ejer selskab Y (fra arsrapport)
  2. Selskab Y har pant i ejendom Z (fra tinglysning)
  3. Ejendom Z er solgt under markedspris 3 mdr. for konkurs (fra kontoudtog + indstillingsliste)
  4. Potentiel omstodelig disposition

Det er det multi-dokument AI gør: den ser mønstre på tværs som intet menneske kan finde ved at bladre i mapper.

14. Email-ingestion

Du kan sende emails direkte til CaseGraph. Systemet poller en dedikeret mailboks via IMAP og processerer nye emails automatisk.

Sådan virker det

  1. Send eller videresend en email til den konfigurerede email-adresse
  2. CaseGraph checker indbakken hvert minut
  3. Email-brødtekst bliver til et dokument (afsender, dato, emne, tekst)
  4. Vedhæftninger (PDF, DOCX, billeder) bliver til separate dokumenter
  5. Alt kører gennem den normale pipeline: extract → chunk → embed → entities

Workspace-routing

Du kan styre hvilket workspace emails lander i:

MetodeEksempelWorkspace
Plus-adresseringemail+gg-business@domæne.dkgg-business
Emne-prefix[gg-business] Kontrakt...gg-business
DefaultIngen prefixStandard-workspace fra config

Understøttede vedhæftninger

PDF, DOCX, TXT, JPG, PNG — samme formater som manuel upload. Hver vedhæftning processeres som et selvstændigt dokument.

Reklamemails — automatisk filtrering og rensning

CaseGraph blokerer automatisk nye reklamemails fra at komme ind i systemet. Eksisterende reklamemails kan renses via Indstillinger.

Automatisk blokering (nye mails)
RFC-headers List-Unsubscribe, List-Id,List-Post og Precedence: bulk/list er obligatoriske i alle masseudsendte emails. Systemet returnerer tidligt ved sådanne headers — mailen logges ikke, udtrækkes ikke, og bruger ikke LLM-kvote.
Rens eksisterende reklamemails
Gå til Indstillinger (tandhjulet i toppen) → sektionen 🗑 Rens reklamemails øverst. To kriterier bruges:
  • Gmail-kategori: emails med label Promotions, Social, Updates eller Forums
  • Emne-heuristik: emnelinjen matcher fx "rabat", "tilbud", "udsalg", "nyhedsbrev", "shop nu"
Klik Se hvad der vil blive slettet for en preview med antal og eksempler. Klik Slet N emails for at fjerne dem permanent (inklusive chunks, entities og relationer).

15. Email-tråde og merge/split

Side: Tråde (nav-punkt 6). Viser alle email-tråde i workspacet — grupperet efter References/In-Reply-Toheaders og Gmail's threadId.

Tråd-kortet

  • Antal beskeder + deltagere + samlet vedhæftnings-tæller
  • Klik for at åbne tråd-detaljen med swim-lane visualisering: hver deltager får sin egen vandrette stribe, beskeder ligger som dots langs tids-akse, pile viser hvem der svarer hvem
  • Klik en dot → mail-body åbnes
  • Vedhæftninger vises i sidepanel med adgang til kildefiler

Merge — flet tråde sammen

Hvis to tråde i virkeligheden er én sag (fx forskelligt emne men samme parter): vælg checkboxer ved tråde og klik Flet. Beskeder fra kilde-trådene flyttes ind i destinationen.
Reversibelt: "Vis flettede tråde"-toggle viser de soft-deletede; klik Genskab for at rulle tilbage.

Split — træk en mail ud i ny tråd

Hvis en mail i en tråd egentlig hører til en anden sag: åbn tråden, klik ↗ Split ud på en mail. Ny tråd oprettes med den ene mail. Også reversibelt.

Inline-quote ekstraktion

Hvis en email indeholder citerede tidligere mails (Gmail/Outlook attribution-linjer), kan vi ekstrahere dem som selvstændige beskeder via Hent inline mails-knap. Nyttigt når en lang tråd er videresendt og vi ikke har de oprindelige beskeder.

16. Multi-track tidslinje

Side: Tidslinje (nav-punkt 7). Forskellig fra War Room (sektion 11): denne side viser sagens tidsmæssige forløb i flere parallelle baner.

Tre visnings-modes

  • Pr. kilde: hver source (mail, dokument, telefon, finans) i sin egen bane. Godt overblik over hvad der sker hvornår.
  • Multy: hver entitet (person/selskab) i sin egen bane — top-N efter aktivitet. Følg hvem der gør hvad over tid.
  • ZigZag dialogue: 2-3 parter i fokus → bobler bevæger sig mellem dem som en samtale. Klik en bobles dot → ZigZag-mode aktiveres automatisk og kollaberer til de relevante deltagere.

Adaptive tidsakse

År/måned/uge/dag/time/minut — auto-vælges efter zoom-niveau med super-major + major + minor labels. Brug zoom-presets eller mushjul/træk for at navigere.

Cross-thread spørgsmål

I ZigZag mode kan AI hente alle mails mellem to parter på tværs af tråde via POST /mails-between. Fx alle mails Jens↔Gerdy uanset hvilken tråd de tilhører — viser den fulde dialog (typisk 100+ mails frem og tilbage).

17. Fronter og situations-rapporter

Side: Fronter (nav-punkt 8). En front er en operation eller arbejdslinje med eksplicit mål, deadline og ansvarlig. AI overvåger sagsmassen og leverer struktureret briefing per front.

Front-dokumentet (styrer AI)

Hver front har et printbart dokument med faste felter:

  • 🎯 Mål — den ønskede tilstand
  • 📍 Hvor — lokation eller kontekst
  • ⚽ Hvem (har bolden) — ansvarlig
  • 📅 Hvornår — deadline
  • 📋 Grundlag — aftaler + lov-grundlag der skal checkes
  • 📝 Noter — sagsbehandlerens kontekst (vægtes højt af AI)
  • 🔎 Søgeord — driver AI's dokument-søgning

Klik 📄 Print front-dokument for et A4-print med logo, alle felter og "Fortroligt"-stempel.

AI Situations-rapport

Klik 🆕 Generér ny rapport → AI læser front-dokumentet, finder alle dokumenter (mails, kontrakter, notater) der matcher søgeordene inden for tids-vinduet, trækker aftale-dokumenter (role=kontrakt) ind som Legal-AI input, og leverer en rapport med faste sektioner:

  • Mål-status: bevæger vi os MOD/VÆK fra målet, %-bud på sandsynlighed for at nå deadline
  • Nye begivenheder seneste 14 dage
  • Risici og åbne spørgsmål (🔴 KRITISK / 🟡 MEDIUM / 🟢 LAV)
  • Grundlag — verifikation: ✓ HOLDER / ⚠️ MANGLER / ✗ MODSIGES for hvert paragraf-punkt fra Grundlag-feltet
  • Relevante aftaler ved navn fra Legal-AI
  • Lovgivning: kkl §, AFTL § osv. (auto-cached fra Legal-service hvis tilgængelig)
  • Observationer proaktive flag: 🔄 nye advokater, 📅 møder, ⏰ frister, 🔇 tavshed
  • Kilder + TODO-liste med 📎-links til kildedokumenter

Vejledning og opfølgnings-spørgsmål

🧭 Vejledning til AI — fri-tekst input før genererering: fx "tjek om JIJ har overset noget", "kig efter ny advokat".

📂 Åbn historisk rapport — alle tidligere rapporter er gemt. Når en historisk rapport er åben, kan du stille opfølgnings-spørgsmål nederst → ny rapport bygges som flettet videreføring af den gamle.

Print-modes

  • 📄 Print front-dokument — kun front-dokumentet
  • 🖨️ Print rapport — fuld rapport med forside (logo) + indhold + TODO på sin egen sidste side
  • ✅ Print TODO — kun TODO-listen som ét-sides huskeliste med "✅ TODO — Frontnavn"-overskrift

18. MyMind — dit operative overblik

Side: MyMind. Et samlet bord der viser hvad der er "oppe i tiden" for dig lige nu — sager, deadlines, fakturaer, aftaler, kontakter, dokumenter — på tværs af alle livsområder. Tænk det som dit personlige cockpit-overblik der bygger ovenpå alt det CaseGraph allerede ved om dig.

Lagene på siden (oppefra og ned)

  • Verdener-selector — dropdown øverst til venstre for at skifte mellem AI-genereret universe og dine egne "Verdener" (separate tematiske grafer). Se Verdener.
  • KPI-strip — 4 tal: aktive fronter, deadlines denne uge, møder næste uge, fakturaer (90 dage). Klik "Aktive fronter" for at folde fronter-panelet ud.
  • Aktive fronter-panel (når foldet ud) — alle dine ikke-arkiverede fronter med stabil farve per front (8-farve hash-palette på front-id). Klik en row → /situation-reports med den front aktiv.
  • Radial mindmap — den AI-genererede stjerne af temaer → entiteter → items. Klik en cirkel for at åbne DetailPanel. Træk for pan, mousewheel for zoom, træk en cirkel for at flytte den. Floating toolbar med søg, forbind, zoom, ny node, nøgleord-filter.
  • Signal-feed — flad liste af 8 livsområder (økonomi, aftaler, sager, sundhed, bolig, personer, kommunikation, dokumenter). Hver card = ét signal med severity, dato og "why". Klikbar drilldown til kildedokumentet. Filter-chips øverst.
  • Mine noter — tabel nederst der samler alle de instrukser du selv har skrevet på noder.

Begreber — kort fortalt

Snapshot (LLM-tree)
Den radiale graf bygges af AI'en på et tidspunkt og caches. Klik ↻ Genberegn for at lade AI'en lave et nyt tema-overblik fra dine seneste data (~$0.02 per kald).
Signal
Et item på "Signaler — lige nu"-feeden. Genereret deterministisk fra DB (ingen LLM) hver gang du loader siden, så den er altid frisk. Hvert signal har livsområde,severity (rød/gul/grøn), dato, why og en sourceRef der peger på det underliggende dokument / sag / kalender-event.
Livsområde
Den kategori et signal eller en node hører til. 8 stk: 💰 økonomi, 📅 aftaler, ⚖️ sager, 🩺 sundhed, 🏠 bolig, 👥 personer, ✉️ kommunikation, 📄 dokumenter. Bruges til filtrering og farve-kodning.
Severity
Hvor presserende et signal er — beregnet ud fra hvor tæt på i tid det er, beløbets størrelse, status (forfalden / kommer snart / fjern fremtid). Vises som farvet bjælke på cardet og som prik i header.
Front (sag)
En operation/arbejdslinje med mål, deadline og ansvarlig (sé §17). Front-noder vises med en stabil farve på tværs af MyMind, timeline og print — så du genkender "Sag mod XYZ" som blå overalt.
Node-key
Den interne nøgle for en node. Format: front:<uuid>,signal:<id>, doc:<uuid>,usernode:<uuid>, radial:<llm-id>. Stabil på tværs af rebuilds for sourceRef-baserede noder, så dine noter og overrides overlever.
User-node (mit barn)
En node du selv har tilføjet via "+ Tilføj barn" i DetailPanel. Vises med stiplet cyan kant. Kan have egne børn, egen note, egne dokumenter, prioritet og nøgleord. Slettes rekursivt (alle børn med).
Nøgleord (keyword)
Et fritekst-tag du selv sætter på en node. Lagres imymind_node_overrides.keywords og virker på alle node-typer. Bruges til keyword-filter i toolbar'en: aktiver ét eller flere keywords og se kun relevante noder (dimming af resten). AND/OR-mode styrer om node skal have alle eller blot ét af de valgte keywords.
Prioritet (urgency)
High / Medium / Low på user-noder. Vises som farvet prik (rød/gul/grøn). High og Medium sendes til AI somuserPriorityNodes så de fremhæves i næste rebuild. Sættes i DetailPanel → Prioritet-dropdown.
Bruger-relation
En manuel forbindelseslinje du tegner mellem to noder i Forbind-mode (🔗 Forbind i toolbar). Kan have en tekst-etikette. Overlever rebuilds. Vises som blå buet streg — adskilles fra AI'ens lilla kryds-koblinger og grå hierarki-linjer.
Note
Din skrevne instruks til en specifik node. Auto-saves 1.5s efter du holder op med at skrive. Markeres med 📝-badge på cirklen.
Kør straks (🚀)
Send din note til AI'en og få et konkret implementations- forslag tilbage straks. Hjælper dig med at se "hvad ville dette koste / kræve" før du beder en udvikler om det. Markeres med 🤖-badge på cirklen efter første kald.
Vedhæft fil (📎)
Upload PDF/DOCX/billede direkte fra din PC til en node. Filen går gennem normal CaseGraph-pipeline (extraction, OCR, chunks, embeddings) og bliver søgbar i hele systemet. Markeres med 📎-badge på cirklen.
Override (🎨)
Dit eget navn / baggrundsfarve / ring-farve på en node — stabilt på tværs af rebuilds. Klik på h3-overskriften i DetailPanel for at omdøbe; vælg swatches for farver. Tilbage-til-standard via ∅-knappen.
SourceRef
Pointer fra en node tilbage til det underliggende objekt:{kind: "doc"|"entity"|"calendar"|"front"|...}. Driver klik-til-kilde-knappen og bestemmer node-key.
Front-arvet farve
Hvis en node ligger under en front i tree'et, arver den front-farven (rød/blå/grøn osv. fra hash). Sker både for LLM-genererede børn og dine egne user-noder. Sikrer at alt der hører til "Sag X" ser ud til at høre til Sag X.
Trin 1 vs Trin 2
Arkitekturen: Trin 1 = deterministiske signaler fra DB (altid virker). Trin 2 = LLM-tematisering ovenpå (kan fejle uden at knække signal-feeden). Hvis du ser "Tomt mindmap"-banner er det Trin 2 der har returneret intet — Trin 1 stadig fungerer.

Drilldown-flow

MyMind er bygget til at være et udgangspunkt — ikke en endestation. Hver klik skal helst tage dig dybere:

  1. KPI "Fakturaer" → /invoices (med ← Tilbage til MyMind-knap øverst)
  2. Signal-card "TDC 12.500 kr" → /documents/<id> (samme tilbage-knap)
  3. Cirkel for "Sag mod XYZ" → DetailPanel → Åbn sag → /situation-reports?front=<id>
  4. Front-row i panel → /situation-reports' rapport for den specifikke front

Pan / zoom / drag

  • Klik+træk på baggrund = pan canvas
  • Mousewheel = zoom 20–300%, pivot under cursor
  • Klik+træk på cirkel = flyt noden — bliver cyan-kantet for at markere "du har flyttet den"
  • ↺ Nulstil layout-knap (øverst i hjørnet) = tilbage til auto-radial og default zoom

Layout-state gemmes i browserens localStorage per workspace — overlever reload, men ikke browser-skift. Mister du dit layout: bare klik et par cirkler og det auto-radiale layout tager over.

Nøgleord og keyword-filter

Du kan tagge enhver node med frit valgte nøgleord — AI-noder, dine egne user-noder, front-noder, alle typer. Nøgleord gemmes i databasen og overlever rebuilds.

  1. Tilføj nøgleord

    Klik en node → åbn DetailPanel → scroll til bunden: 🏷 Nøgleord. Skriv et ord og tryk Enter. Ordet tilføjes som en blå chip. Klik × på en chip for at fjerne den.

  2. Filter-baren dukker op

    Så snart mindst én node har et nøgleord, vises en keyword filter-bar nederst i toolbar'en (under søgefeltet). Alle unikke nøgleord på tværs af alle noder vises som chips.

  3. Aktiver et filter

    Klik et nøgleord-chip i filter-baren. Alle noder der IKKE har det keyword tones ned til 10% opacity — de forsvinder visuelt men er stadig der. Noder med keyword + deres forfader-kæde (så træet forbliver forbundet) + naboer via bruger-relationer forbliver fuldt synlige.

  4. Fler-valg og AND/OR

    Klik flere keywords. Som standard vises noder der har ENTEN det ene ELLER det andet (OR-mode). Når 2+ keywords er valgt vises en gul OR-knap — klik den for at skifte tilAND (node skal have ALLE valgte keywords). Klik igen for at skifte tilbage.

  5. Ryd filter

    Klik ✕ Ryd i filter-baren eller klik det aktive keyword igen for at deaktivere det.

Typiske use cases: mærk noder med "konkurs", "DAB", "Lauritz" så du hurtigt kan skjule alt andet og se kun hvad der vedrører den specifikke sag. Eller mærk noder med "haster" for at filtrere til det der kræver handling i dag.

Prioritet (urgency)

User-noder (dem du selv har oprettet) kan gives en prioritet. Den vises som en farvet dot på noden i grafen og sender et signal til AI'en om hvad der er vigtigst for dig.

  • 🔴 Høj — knaldrød dot. AI sætter disse noder øverst og giver dem høj urgency i tema-træet.
  • 🟡 Mellem — gul dot. AI inkluderer dem som fremtrædende items.
  • 🟢 Lav — grøn dot. Prioriteret over ikke-mærkede noder.

Sæt prioritet: klik user-node → DetailPanel → Prioritet-dropdown øverst i panelet. High og Mellem-noder sendes automatisk til AI'en næste gang du klikker ↻ Genberegn.

Bruger-relationer

Du kan tegne dine egne forbindelseslinjer (relationer) mellem to vilkårlige noder — uanset om de er i samme gren af træet eller ej.

  1. Aktiver Forbind-mode

    Klik 🔗 Forbind i toolbar'en. Cursoren skifter til kors. Klik og træk fra én node til en anden. En popup spørger om en etikette på relationen (valgfrit — tryk Enter for at springe over).

  2. Rediger eller slet

    Klik på en eksisterende relations-streg (den brede transparente hit-area). En popup viser den nuværende etikette og har knapper til at omdøbe og slette.

  3. Parallelle linjer

    Hvis der er to relationer mellem de samme noder forskydes de automatisk parallelt så begge er synlige.

Relationer er permanente og overlever rebuilds. De vises som blå buede streger — anderledes end AI'ens egne kryds-tema-koblinger (lilla stiplede) og hierarki-linjer (grå).

Node-styling

Via DetailPanel kan du tilpasse udseendet af enhver node individuelt. Alt gemmes i databasen og overlever rebuilds.

IndstillingHvad
Navn (display label)Klik overskriften i DetailPanel og rediger — bruges overalt uden at ændre AI'ens data
Baggrundsfarve / ring-farveFarve-swatches i panelet; ∅ = tilbage til standard
Form⬤ Cirkel (standard) / ■ Firkant / ◆ Rombe — vælg med knapper
Ikon / emojiEmoji-picker eller Lucide-ikon-søgning — vises midt i cirklen i stedet for farve
BilledeUpload et billede (PNG/JPG) — vises som cirkel-clip midt i noden
Skrifttype / størrelseFont-familie og font-størrelse på node-labelen
Skjul hierarki-linjeFjern den grå streg til forælderen — noden svæver frit
Skalering (3D)↕ resize-håndtag i 3D-visning justerer node-radius (gemmes per node)

Verdener

En verden er et separat tematisk univers ved siden af det AI-genererede hoved-tree. Brug verdener til at adskille fx "Privat", "Erhverv", "Hobby" — eller til at eksperimentere med en anden vinkel på dine data.

  • Opret en verden: verdener-dropdown øverst → + Ny verden. Giv den et navn og en valgfri beskrivelse.
  • Skift verden: klik i dropdown. Grafen genindlæses med den valgte verdens noder og relationer.
  • Hoved-AI-tree er altid tilgængeligt som "AI-genereret" øverst i dropdown — det er ikke en verden men vises på samme måde.
  • Noder, noter, relationer og overrides er world-scoped: du kan have den samme node-key i to verdener med forskelligt indhold.

3D visning (/mymind3d)

MyMind 3D er en alternativ visning der viser de samme noder som 3D-sfærer i et roterende rum. Nyttigt til at opdage strukturer der er svære at se i 2D.

  • Navigation: træk for at rotere, scroll for zoom, klik en node for at fokusere (den forstørres og centeres).
  • Resize: klik en fokuseret node → et ↕-håndtag vises under label-teksten. Træk op = større, ned = mindre. Gemmes i databasen.
  • Farver og labels følger samme override-system som 2D — baggrundsfarve, ring-farve, custom display label.
  • 3D er read-only hvad angår relations og struktur — redigér data i 2D og se resultatet i 3D.

Mine noter-tabellen

Alle noter du har skrevet samles i en tabel nederst. Hver række: type (signal / front / doc / radial), node-titel (med override hvis sat), notens tekst, sidst-opdateret, slet. Front-noter linker tilbage til situations-rapport-siden.

Menneske–AI: samspillet og fejlkilderne

AI er en første-kladde, ikke en facit. Det gælder for alle CaseGraph-features, men det er særlig vigtigt at forstå i MyMind — fordi MyMind ligner et personligt overblik, og fordi AI-fejl der kan handle om dig føles anderledes end fejl i en juridisk sagsanalyse.

Hvad AI ved — og hvad den ikke ved

Når AI bygger dit MyMind-snapshot, arbejder den med de signaler den kan se: hvilke entiteter der er nævnt flest gange, hvilke dokumenter der er uploadet, hvilke kalenderaftaler der er registreret, hvilke fronter der er åbne. Den ved ikke:

  • Hvem du er i relation til de nævnte entiteter
  • At en kalenderaftale tilhører dig og ikke en modpart
  • At en adresse er dit hjem frem for en sagsejendom
  • At to entiteter der optræder tæt i et dokument ikke nødvendigvis hænger sammen i virkeligheden

AI slutter fra mønstre i tekst og tal. Det giver den en reel evne til at opdage relationer mennesker overser — men det giver den også en blind vinkel: den kan sætte data sammen på måder der er statistisk plausible men faktisk forkerte.

Et konkret eksempel: kalender-tilknytning

En aftale som "Samtale med sygeplejerske" kan i et dokument optræde på samme side som en modparts navn. AI ser det som en mulig sammenhæng og placerer aftalen under modpartens node — selvom aftalen i virkeligheden er din egen. Det er ikke en tilfældig fejl; det er AI der gør præcis det den er designet til: finde mønstre. Men mønsteret er her misvisende.

CaseGraph har indført eksplicitte regler i AI-prompten for at minimere dette: kalenderaftaler tilhører altid brugeren, ikke andre entiteter. Men regler kan ikke dække alle tilfælde — og du er den eneste der ved hvad der er sandt.

Hvad du kan gøre

  • Rebuild: Ser noget forkert ud i MyMind? Klik "Genbyg snapshot". AI genererer et nyt træ ud fra den aktuelle tilstand i databasen — bedre data giver bedre resultater.
  • Manuelt tilføj noder: Entiteter og relationer du selv tilføjer (via +-knappen eller kontekstmenuen) overlever rebuilds og er ikke genstand for AI-vurdering. De er sandheden.
  • Prioritér med urgency: Markér nodes som "Kritisk" — AI er instrueret i at disse altid skal med i overblikket, selv i korte snapshots.
  • Anmeld fejl til os: Systematiske fejl (AI placerer konsekvent X under Y) er bugs vi kan fixe med bedre prompt-regler.

Det grundlæggende princip

AI er en intelligent assistent der arbejder for dig — men den har ikke adgang til den kontekst du har i dit hoved. Behandl AI-output som du ville behandle en kollegas første udkast: nyttigt som udgangspunkt, men kræver din gennemlæsning og korrektion før det er officielt.

I CaseGraph er det muligt fordi al data er sporbar: enhver relation har kilde-evidens, enhver node kan undersøges, og dine egne korrektioner gemmes separat fra det AI har genereret. Du kan altid se hvad der kommer fra AI og hvad der kommer fra dig.

AI er god til at se bredt — du er god til at vide hvad der er rigtigt. Den bedste analyse opstår når begge bidrager med det de er bedst til.

19. Kalender — events og AI-foreslåede aftaler

Side: Kalender (nav-punkt 8). Sidestillet med /timeline men dedikeret til at administrere konkrete events: gennemse kommende, beslutte foreslåede, søge i historik.

Tre tabs

  • 📅 Kommende — accepterede/bekræftede events fra nu og fremad. "om N dage"-badge bliver rød ved ≤3 dage tilbage.
  • 💭 Foreslåede — aftaler AI-detectoren har fundet i ny-uploadede dokumenter (læge-indkaldelse, retsmøde, deadlines osv.). Hver markeres gult med ✓ Accept / ✗ Afvis-knapper. Accept pusher til Google Calendar via konto-OAuth; Afvis markerer som rejected.
  • 🕘 Historik — events fra sidste 90 dage, sorteret nyeste først.

Søgning og fødselsdage

Søgefelt øverst filtrerer på titel, lokation og beskrivelse — virker på tværs af alle 3 tabs samtidig. Events hvor titlen matcherfødselsdag / fdag / birthday / født får automatisk 🇩🇰-flag (Dannebrog) for visuel genkendelse.

Deep-link og drilldown

/calendar?event=<id> er en deep-link der:

  • Auto-vælger den rigtige tab baseret på event'ets dato/status
  • Scroll-jumper til kortet
  • Markerer det med fed gul border-highlight

Bruges fra MyMind: klik en kalender-cirkel i radial-grafen → DetailPanel → Åbn i kalender → tager dig direkte til det specifikke event. Tilbage-knappen øverst (← Tilbage til MyMind) tager dig tilbage til den eksakte node du kom fra.

Cards-felter

Hvert event-kort viser:

  • 📅 Dato/tid (lokal-formateret) + "om N dage"-tag
  • Konto-email (hvilken Google Calendar event'et hører til)
  • 📍 Lokation
  • 👥 Attendees-summary (op til 3 navne + "+N"-rest)
  • Beskrivelse (trunkeret til 240 tegn)
  • Åbn i Google Calendar hvis html_link er sat

For foreslåede events vises også 📄 fundet i: <dokument>som linker til kilde-PDF'en med Tilbage-til-kalender-knap.

20. Auktions-overvågning og vision-match

Side: Auktioner (nav-punkt 10). Bygget til konkurssager hvor aktiver sælges på online-auktion (fx auktionshuset.dk). Overvåger bud-udvikling, sammenligner mod kundens egne registreringer, AI-klassificerer.

Sources og scrape

Tilføj URL til en auktions-side (typisk auktionshuset.dk). Klik 🔄 Scrape for at hente alle lots med titel, billeder, aktuelt bud, slut-tidspunkt. Bud-ændringer logges i auction_bid_history så udviklingen kan spores.

Auto-scheduler (⏱ Plan)

Klik ⏱ Plan på en source for at aktivere auto-scrape: interval (15min - 24t), "stop efter" (typisk auktions-slut). In-process scheduler i API-serveren tjekker hvert minut og kører scrape når en source er due. Holdes i live af min_machines_running=1på fly.io.

Vision-match mod aktiv-registrering

Importér aktiver fra det eksterne "Aktiv-Registrering"-projekt (aktiv-registrering) via 🔄 Hent fra Aktiv-registreringknap øverst — pulls 96 aktiver + 500 billeder fra deres Supabase-database.

Klik 👁 Match billeder på en source → for hvert auction-billede sender systemet auction-billedet + de 4 tekstmæssigt mest-lignende registry-billeder til Groq Llama 4 Scout vision (gratis) eller Claude Haiku 4.5 (premium). AI returnerer matches med konfidens 0-100%.

Match-workflow

  • Stat-kort er klikbare filtre: 👁 Match fundet, ✓ Bekræftet match, ○ Ingen match
  • Cards i grid har farvet ramme: orange = foreslået, grøn = bekræftet
  • Klik et card → detail-modal viser side-by-side: auction-billede ↔ registry-billede + alle vinkler af registreringen
  • ✓ Match — det er det samme bekræfter (grøn)
  • ✗ Falsk — ikke samme afviser; alle afviste matches tæller ikke længere som "match fundet"

Tekst-søg + filter

Søgefelt øverst: skriv fx "vase", "sofa", "krone 1" — multi-ord søger AND. Kombineres med source/match-filter og sortering.

Udvikling (📈)

Udvikling-undersiden viser:

  • Tidsserie-graf: bud-aktivitet per time (fra bid-history)
  • 🏆 Top 10 højeste bud lige nu
  • 📈 Top 10 største stigning fra start
  • ⚡ Top 10 mest aktive (flest bud-ændringer)
  • Hver række: thumbnail, lot-nummer, titel, bud, slut-tid, nedtælling, ↗ link til auktionssiden

Telefon-opkalds-logning

Hvert opkald (indgående/udgående/missed) på din iPhone logges automatisk i CaseGraph via en iOS Personal Automation. Bagefter kan du valgfrit notere hvad der blev sagt + om der blev indgået en aftale + hvornår du skal følge op. Selv uden note ligger opkaldet på timeline.

Sådan sætter du iOS Shortcut op (engangs-setup)

  1. Åbn Genveje-appen på iPhone → faneblad Automation nederst → tryk + øverst til højre → Opret personlig automation.
  2. Vælg trigger: scroll ned til Opkald → vælg Anyone + retning Avsluttet. Slå “Kør straks” til så du undgår at skulle bekræfte hver gang.
  3. Tilføj action: Web → Hent indhold fra URL. Sæt:
    • URL: https://casegraph.fly.dev/api/workspaces/demo/calls (skift demo til dit workspace-slug)
    • Method: POST
    • Headers: Content-Type: application/json
    • Request Body (JSON):
      {
        "phone": <FRA_OPKALDET>,
        "direction": "incoming",
        "durationSeconds": <VARIGHED>,
        "endedAt": <NU>
      }
      Brug variabel-pickeren til at indsætte de magic-variables der svarer til opkaldets data.
  4. Valgfrit — åbn note-side automatisk: tilføj action Get value for “noteUrl” in Dictionary oven på forrige resultat → Web → Open URLs med https://casegraph.fly.dev{noteUrl} som URL.
  5. Test: ring til en testperson, læg på, gå til CaseGraph → /timeline → der skulle dukke en orange 📞-ikon op.

Telefonnr → kontakt-match

Når et opkald logges slår vi telefonnummerets sidste 8 cifre op i entities.attributes.phone (eller mobile/phone_number). Match → opkaldet linkes til Person-entiteten og vises med navnet på timeline. Intet match → opkaldet logges alligevel med rå telefonnummer som label, og du kan tagge kontakten manuelt på /call-note/[id]-siden.

Note-flow

På /call-note/[id]-siden kan du:

  • Skrive note (Pass 2 tilføjer 🎤 audio + Whisper-AI for dansk diktering)
  • Markere “Aftale indgået” ✓/✗
  • Sætte follow-up dato + action (“ring tilbage”, “send tilbud”)

Spring over-knappen forlader siden uden at slette opkaldet — opkaldet ligger stadig på timeline som ren log-event.

Faktura-linjer og kvitteringer

/invoices er et struktureret regnskabs-overblik. Upload PDF-fakturaer (Lauritz, butikker, betalingsservice-oversigter, m.v.), så kører pipelinen OCR + AI-extraction og ekstraherer linjer som rækker du kan filtrere, søge og verificere.

Layout

Siden er splittet i to sektioner med egne stat-bånd:

  • 📅 Kommende — forfaldsdato fra og med i dag
  • 📜 Historiske — forfaldsdato før i dag (eller uden dato)

Hver sektion viser: linjer, fakturaer, total beløb, ✓ verificeret-andel, 📷 med-billede-andel. Page-headeren viser samme tal “i alt”.

Upload

Drag-and-drop PDF / billed-filer på upload-zonen, eller klik 📤 Upload. Op til 3 filer kører parallelt gennem OCR + AI. Status-køen viser per fil: ⏳ I kø → 📤 Uploader → 🤖 AI læser → ✅ Færdig (X linjer, Y kr) eller ❌ fejl.

Auto-dedup: uploades samme fil to gange (samme sha256-checksum + workspace) returneres det eksisterende dokument med ♻️ “Allerede uploadet — sprunget over”. Ingen ny række, ingen ny extraction, ingen ekstra LLM-spend.

AI-extraction

Bruger Groq Scout single-shot per dokument med strict JSON Schema. Prompten er specialiseret til:

  • Lauritz auktion — sammenfatter gebyr-linjer (0099, 0095, 0071) under hovedlinjen i feeDkk-feltet
  • Betalingsservice / PBS — håndterer column-collision hvor cifre fra beløb klistrer ind i aftalenr (kanonisk eksempel: JYSKE FINANS 0153050343 + 3.497 kr → ikke 01530503433 + 497)
  • Dubletter — samme post nævnt flere steder i samme dokument (forside-rubrik + detaljeret tabel) sammenlægges til ÉN linje

Hvis dokumentet IKKE er en faktura (bogføringsudtræk, kontoudtog), returnerer LLM'en tom linjer-array og dokumentet markeres ikke som faktura.

Søgning og filter

Søgefeltet matcher beskrivelse, varenummer, leverandør, fakturanr og dokumenttitel — alle ord skal være tilstede (AND). Matches højlightes med gult mark (samme stil som /search). Andre filtre: dato-interval, billed-status, kun verificerede, sortering (dato/beløb/lot).

Manuel rettelse og verificering

✏️ åbner inline-edit hvor du kan rette description, varenummer, hammerslag, salær, total. ✓ marker som verificeret (grøn baggrund). 🤖 re-kører AI-extraction på hele dokumentet med opdateret prompt. Manuel rettelse overskriver LLM'en og bevares ved reprocess.

DB-side dedup

Migration 0039 tilføjer et unique index på (document_id, lot_no, invoice_date, total_dkk, normaliseret description)så LLM'ens output aldrig kan duplikere selv om prompten skulle fejle. INSERT...ON CONFLICT DO NOTHING dropper stille dubletter.

Kalender og AI-aftalsforslag

CaseGraph kan koble en eller flere Google-kalendere til workspacet og automatisk foreslå aftaler ud fra indlæste dokumenter (læge-indkaldelser, retsmøder, fordringsprøvelser, frister, m.m.).

Tilkobling

  1. Gå til /timeline og klik tandhjulet (⚙) ud for kalender-knappen, eller /calendar hvis siden eksisterer
  2. Klik 🔗 Forbind Google Calendar → OAuth-flow giver Read+Write til alle kalendere på din konto
  3. Hver konto viser sine kalendere som checkboxes — toggle hvilke der inkluderes i sync, og vælg én som opret nye events her(write-cal)
  4. Klik 🔄 Opdatér kalender-liste fra Google hvis du har oprettet en ny kalender hos Google og vil hente den ind
  5. Du kan tilkoble flere konti (privat + arbejde fx)
  6. Bind en entity (typisk Person) til kontoen — så ved systemet hvilke dokumenter der vedrører dig som deltager

Sync

Sync-vinduet er fast 180 dage tilbage + 90 dage frem (= 270 dage centreret på i dag). Re-sync af samme vindue henter de samme events og opdaterer dem — det er ikke en bug at samme antal vises hver gang.

Hvor tit: kalender-sync er browser-trigget, ikke server-cron. Hver gang du åbner /calendar eller /timeline tjekker frontenden om kalender-konto'ens last_synced_at er ældre end 10 minutter — hvis ja, kaldes sync-endpointet automatisk i baggrunden. Du kan også trykke manuel-sync-knappen i kalender-settings når du vil. Konsekvens: hvis du ikke har CaseGraph åben i fx 24 timer, sker der ingenting med kalenderen — modsat email/Gmail som har en server-side poller.

Sync-toasten skelner mellem nye events (rækker der INSERT'es første gang) og opdaterede events (eksisterende rækker hvor titel/sted/tid kan have ændret sig). Eksempel: “39 events fra 1 kalender-konto (0 nye, 39 opdaterede). Vindue: 180d tilbage + 90d frem.”

Toasten er CaseGraph's egen — ikke browser-default alert(). Stack i nederste hjørne, klar farvekodning (info/success/warning/error), auto-dismiss efter 6s eller manuel × eller klik action-knap.

AI-aftalsforslag

Klik 🔍 Scan dokumenter for aftaler — detector kører LLM på hver OCR'd dokument og spørger: indeholder dette en kommende aftale eller frist? Hvis ja, ekstraheres titel, dato/tid, sted og deltagere. Når en deltager matcher en kalender-konto, oprettes et forslag som du kan ✓ acceptere (push til Google) eller ✗ afvise.

Dubletter dedupes automatisk: samme aftale (samme tid ±15 min) nævnt i flere mails giver kun ÉT forslag. Forslag fra ikke-fakturaer (fx bogføringsudtræk) afvises af LLM'en før de når kalender-pipelinen.

Sync-intervaller — hvor tit henter CaseGraph nyt indhold

CaseGraph har flere kilder der trækker indhold ind løbende. Nogle kører som baggrunds-pollere i API-serveren (uafhængigt af om du har browseren åben), andre er browser-trigget (skal have en relevant side åben for at synce). Her er den samlede oversigt:

KildeHvor titTypeJusteres via
📧 IMAP emailhvert 60. sekundServer-pollIMAP_POLL_INTERVAL_MS i apps/api/.env (default 60000 ms)
📨 Gmail (OAuth)hvert 2. minutServer-pollGMAIL_POLL_INTERVAL_MS i apps/api/.env (default 120000 ms)
📅 Google Calendarbaggrunds-poller hvert 10. min (uafhængig af browser); browser-trigger også hvis side åbnes og last_synced_at >10 minServer-poll + browserCALENDAR_POLL_INTERVAL_MS (default 600000) + CALENDAR_MIN_SYNC_INTERVAL_MS (default 540000) i apps/api/.env. Slå helt fra med CALENDAR_SCHEDULER_DISABLED=true. Manuel sync-knap i kalender-settings når som helst.
🏷 Auktions-scrapescheduler tjekker hvert 60. sek; hver source kører på sit eget interval (15 min – 24 t)Server-poll⏱ Plan-knappen pr. auction-source på /auctions
🧠 MyMind daglig snapshotscheduler tjekker hvert 5. min; tager dagens snapshot kl. 06:00 hvis ikke allerede tagetServer-pollHardcoded TARGET_HOUR=6 i apps/api/src/services/mymind-scheduler.ts (kræver kode-ændring + deploy)
🔍 Aftalsforslag-scankun når du klikker "🔍 Scan dokumenter for aftaler" — én job pr. nyt OCR'd dokumentManuelKnappen i /calendar Foreslåede-tab
📥 Dokument-upload-pipelinemed det samme efter upload — kører i job-queue (extract → chunk → embed → entities)Trigget pr. uploadJob-queue er Postgres-backed in-process worker; ingen interval at tweake

Hvor justerer jeg intervallerne?

  • Email/Gmail intervaller: redigér apps/api/.env og restart API-serveren. IMAP_POLL_INTERVAL_MS=30000 giver fx polling hvert 30. sekund. På fly.io sæt det som secret: fly secrets set IMAP_POLL_INTERVAL_MS=30000.
  • Auktions-interval: pr. source via UI — klik ⏱ Plan på /auctions for at vælge interval (15 min – 24 t) og "stop efter"-tidspunkt.
  • MyMind snapshot-tidspunkt: ændr TARGET_HOUR-konstanten i mymind-scheduler.ts og redeploy. (Kunne flyttes til workspace_settings som per-workspace-config — TODO.)
  • Kalender — server-poller: ændr CALENDAR_POLL_INTERVAL_MS i apps/api/.env (default 600000 = 10 min). Pr-konto-cooldown justeres med CALENDAR_MIN_SYNC_INTERVAL_MS (default 540000 = 9 min). Slå polleren helt fra hvis ønsket: CALENDAR_SCHEDULER_DISABLED=true. På fly.io: fly secrets set CALENDAR_POLL_INTERVAL_MS=300000 for 5-min-poll.
  • Kalender — browser-fallback: når en bruger åbner /calendar eller /timeline kører frontenden også en sync hvis last_synced_at er >10 min gammelt. Tærsklen styres via STALE_MS i calendar-panel.tsx og timeline/page.tsx.

Multi-provider LLM router

Broker'en understøtter en speciel multi-free-provider der prøver op til 22 forskellige LLM-providers i prioritetsrækkefølge og automatisk falder over til næste når én rammer rate-limit eller quota-loft.

Status-dashboard

Gå til /broker/free-tier for at se live-status:

  • # prioritet i kæden
  • Kvalitet ★ 1-5 (manuel rating)
  • Status ready / cooldown
  • Free-tier limits RPM, RPD, TPD per provider
  • Brug i dag tokens + % af kvota
  • Cooldown remaining indtil slot er klar igen
  • Sidste fejl til debug
  • Paid pris hvis fri kvota løber tør

Aktivér flere slots

Hver slot er gated på en env-key. For at aktivere fx GitHub Models:

fly secrets set GITHUB_MODELS_TOKEN=github_pat_...

Andre relevante keys: GEMINI_API_KEY, GROQ_API_KEY, CEREBRAS_API_KEY, SAMBANOVA_API_KEY, TOGETHER_API_KEY, FIREWORKS_API_KEY, NEBIUS_API_KEY, HUGGINGFACE_API_KEY, MISTRAL_API_KEY, OPENROUTER_API_KEY, DEEPSEEK_API_KEY, CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID.

21. Hvad er embedding?

Embedding er den teknologi der gør semantic search mulig. Det er en AI-model der konverterer tekst til tal — specifikt en liste af 768 tal (en “vektor”) der repræsenterer tekstens mening.

Hvordan det virker

Forestil dig at al tekst lever i et kæmpe rum med 768 dimensioner. Hvert stykke tekst har en position i det rum. Tekster der handler om det samme emne ligger tæt på hinanden — uanset hvilke ord de bruger.

  • “MacFashion er gået konkurs” og “selskabet er insolvent” → tæt på hinanden
  • “MacFashion er gået konkurs” og “vejret er godt i dag” → langt fra hinanden

Hvad CaseGraph bruger det til

Når du uploader et dokument, embeddes hvert chunk (tekststykke). Når du søger, embeddes din søgning. Derefter finder pgvector (Postgres vektordatabase) de chunks der ligger tættest i betydningsrummet.

Det er derfor søgningen “hvem skylder penge” finder afsnit om kreditorer og debitorer — selvom de ord aldrig optræder i din søgning.

Hvem laver det?

CaseGraph understøtter 5 embedding-providers:

ProviderModelKosterKører
Ollamanomic-embed-textGratisLokalt på din maskine
OpenAItext-embedding-3-small$0.02/1M tokensCloud
Voyage AIvoyage-3-liteGratis (50M/mnd)Cloud
Jina AIjina-embeddings-v3Gratis (1M/mnd)Cloud
Cohereembed-v4.0Gratis (1000/mnd)Cloud

Ollama er standard — kører lokalt, ingen API-nøgle, ingen kost, ingen data sendt ud af din maskine. Ollama er lavet af Ollama, Inc. (San Francisco). Selve modellen (nomic-embed-text) er lavet af Nomic AI.

Uden embedding

Uden embedding virker keyword search stadig (finder præcise ord). Du mister kun semantic search (forståelse af mening). Embedding kan slås til og fra i indstillinger (tandhjul-ikonet).

22. API-nøgler og AI-funktioner

CaseGraph fungerer uden API-nøgler med begrænset funktionalitet. Tilføj nøgler i apps/api/.env for at aktivere mere:

FunktionUden nogleMed embedding-providerANTHROPIC_API_KEY
Upload + extractionVirkerVirkerVirker
Keyword searchVirkerVirkerVirker
Semantic searchVirker
Entity extractionRegex onlyRegex only+ LLM
AI ChatVirker (Claude)
Case mapVirker

Embedding-providers

Semantisk søgning kræver en embedding-provider. Vælg en i EMBEDDING_PROVIDER:

ProviderEnv-variabelGratis?
OpenAIOPENAI_API_KEYNej (betalt)
Voyage AIVOYAGE_API_KEY50M tokens/maned gratis
Jina AIJINA_API_KEY1M tokens/maned gratis
CohereCOHERE_API_KEY1000 kald/maned gratis
OllamaOLLAMA_BASE_URLJa — kører lokalt, ingen key

Konfiguration

# apps/api/.env
ANTHROPIC_API_KEY=sk-ant-...    # Påkrævet for Claude (primary LLM)
EMBEDDING_PROVIDER=ollama       # Eller: openai, voyage, jina, cohere
OLLAMA_BASE_URL=http://localhost:11434  # Kun for Ollama
# OPENAI_API_KEY=sk-...         # Fallback LLM + OpenAI embeddings

Claude er primary LLM. OpenAI bruges som fallback. Embeddings og LLM er uafhængige — du kan bruge Ollama til embeddings og Claude til chat/case map.

23. Begreber

Chunk
Et stykke tekst (~1200 tegn) fra et dokument. Grundenheden for søgning og AI-kontekst. Hvert chunk bevarer sin position i originaldokumentet.
Entity
En identificeret ting: person, selskab, adresse, dato, belob, hændelse. Udtrukket automatisk via regex og/eller LLM.
Relation
En forbindelse mellem to entities (fx “Jens Hansen OWNS Acme ApS”). Har confidence score og evidens-citat.
Evidence linking
Enhver entity-mention og relation peger tilbage til chunk_id + char offset → kildedokument. Ingen unsourced claims.
RAG (Retrieval-Augmented Generation)
AI-chat-teknik: relevant kontekst hentes fra databasen og sendes med til LLM'en,$1så$2den svarer baseret på dine dokumenter — ikke generel viden.
Workspace-graf
Den faktuelle graf bygget automatisk fra dokumentpipelinen. Indeholder entities og relationer udtrukket fra tekst. Vokser med hvert uploadet dokument. Data er permanent.
Case map
AI-genereret sagsanalyse med tilhorende graf-specifikation. Et midlertidigt overlay oven på workspace-grafen. Viser AI's fortolkning: centrale aktører, relationer, risici og åbne spørgsmål.
Workspace
Isoleret kontekst for en samling dokumenter. Hver workspace har egne dokumenter, entities, relationer og graf.
AI Broker
Internt system der styrer hvilke AI-modeller der bruges, tracker token-forbrug og omkostninger, og håndhæver budgetgrænser.
Embedding
En matematisk vektor der repræsenterer et stykke tekst. Bruges til semantisk søgning (pgvector). Har intet med grafen at gøre.

24. Statistik

CaseGraph v0.50.0 — nuværende omfang af platformen.

Kodebase

MålAntal
Kodelinjer total~14.000
TypeScript~12.400
SQL (migrations)~380
CSS~900
Source-filer117
Git commits54+

Backend (apps/api)

KomponentLinjerIndhold
AI Broker~2.050Model routing, cost tracking, budget, policy, embeddings (5 providers)
Routes~1.37511 route-filer (documents, search, entities, graph, chat, broker, OCR, auth, settings, workspaces, dashboard)
Services~1.875Chat, case map, documents, entities, graph, search, auth, audit, email-ingestion, review
Extractors~200PDF, DOCX, TXT, OCR (Tesseract.js)
Jobs~450Pipeline: extract → chunk → embed → entities

Frontend (apps/web)

KomponentAntal
Sider9 (Dashboard, Søg, Entities, Graph, Chat, OCR, Guide, Broker, Login)
UI-komponenter12+ (document cards, case graph, chat panel, timeline, upload, workspace selector, settings, etc.)
Linjer total~5.400

Database

MålAntal
SQL-migrationer9 (0001–0009)
Tabeller17 (users, workspaces, documents, chunks, entities, relations, jobs, sessions, audit_log, ai_usage, workspace_settings, m.fl.)
Extensionspgcrypto, citext, pg_trgm, pgvector

AI-integration

FunktionProvider
LLM (chat, case map, extraction)Anthropic Claude (primary), OpenAI GPT (fallback)
Embedding (semantic search)Ollama, OpenAI, Voyage AI, Jina AI, Cohere
OCRTesseract.js (lokal, eng+dan)
Entity extractionRegex (CVR, CPR, datoer) + Claude LLM

Videnopsamling og sagshåndtering

Et kort overblik over hvordan CaseGraph passer ind i det danske legal-tech- landskab — så du ved hvad du kan bruge det til, og hvor du eventuelt skal supplere med andre værktøjer.

Direkte AI-sammenlignelige (lov + analyse)

AktørTilbudKommentar
Lovguiden"Danmarks mest avancerede juridiske AI-assistent". 35+ kilder, 300.000+ dokumenter (love, bekendtgørelser, vejledninger, cirkulærer, domme, EU-ret). PDF-upload + AI-analyse + lovhenvisninger + opsummering.Største direkte konkurrent på lov-database-bredde og AI-søgning.
Karnov KAILAAI-assistant ovenpå Karnovs 150 år gamle kommenterede lovsamling. UfR-domme.Etableret giganten med dybeste faglige redaktionelle database. Ressourcetung, betalt-tier.
Juris.dkDel af Copenhagen Legal Tech. Automatiser document review, drafting, quality checks.Smal — fokus på automation af eksisterende advokat-workflows.
LovBot.dkDansk-specifik. Retsinformation.dk-integration + dansk retspraksis. 97 dokumenttyper i 6 kategorier (ansættelse, leje, samarbejde, virksomhed, GDPR, inkasso).SMB / lægmand-positionering.
ClearContractAI-etik / compliance + kontrakt-fokus.Adjacent — fokus på compliance, ikke generel sagshåndtering.

Sagsstyrings-systemer (lille AI-modenhed, men etablerede)

AktørTilbud
EG CapLegalMicrosoft Dynamics-baseret. Sag/dokument/tid/fakturering.
Legis 365Cloud-baseret advokatsystem.
Abakion LegalAll-in-one for advokatfirmaer.
Unik AdvosysModulært: handel, inkasso, konkurs.
PenneoDokumentsignering + KYC. Dominerende dansk e-sign-løsning.

Internationale spillere med dansk eksponering

  • Microsoft 365 Copilot for Legal — generalist, Microsoft-stack.
  • Energent.ai — international AI legal research.
  • Harvey AI — Big Law i USA, nogle danske partnerskaber.
  • Legora — nordisk legal AI startup.

CaseGraphs position

CaseGraph sælger ikke information (det gør Karnov og Lovguiden) — CaseGraph sælger værktøjet til at arbejde med din egen information. Det betyder:

Det CaseGraph har som de andre IKKE har:

  • Knowledge graph + entity-extraction på tværs af dokumenter — sporbar evidens fra hver påstand til kildetekst
  • Workspace-isolation (multi-tenant SåS-klar) — hver sag/klient i sin egen lukkede silo
  • War Room / Network-graf-visualisering — du ser sagen i stedet for at læse om den
  • Kalender-integration med proposals fra mails/opkald — automatiske frist-forslag
  • Multi-modal indtag: OCR, IMAP, Gmail, telefon-opkald, fakturaer, billeder
  • Gratis Tier 0 (multi-free LLM router) — ingen ressourceloft mens du tester
  • Open-source LLM-stack (Ollama-fallback) — ingen amerikansk-cloud-lock-in

Det de andre har som CaseGraph IKKE har:

  • Komplet kuraterede lov-database (Karnov har 150 års commentary; vi bygger via bulk-fetch fra retsinformation.dk)
  • UfR/FED-domssamlinger via betalte feeds
  • Etableret advokatfirma-kundebase med support-aftaler
  • Faglig redaktionel kvalitet på paragraf-noter

Når du skal supplere CaseGraph

  • Karnov / UfR hvis du har brug for kommenteret retspraksis med cite-format der modparten tager seriøst
  • Penneo hvis du sender mange digitale underskrifter
  • EG CapLegal / Legis 365 hvis du allerede har en dybt integreret sagshåndtering med tid/fakturering du ikke vil væk fra

Konkurrent-overblikket er fra 2026-05-03. Markedet bevæger sig — sig til hvis du opdager nye spillere vi bør medtage.

25. FAQ

Kan jeg bruge systemet uden AI API-nøgler?

Ja. Upload, tekstudtræk, chunking, keyword search og regex-baseret entity extraction virker uden API-nøgler. Semantic search, AI chat og case map kræver mindst en nogle.

Hvilke sprog understottes?

Systemet er designet til dansk, men fungerer med alle sprog. Regex-heuristik (CPR, CVR) er dansk-specifikke. LLM-extraction og chat virker på alle sprog. OCR understotter engelsk og dansk (eng+dan).

Hvad koster det at bruge AI-funktionerne?

CaseGraph bruger pay-per-use API-kald til Anthropic/OpenAI. Typisk koster en chat-besked ~$0.001-0.01. Case map ~$0.01-0.05. Se broker-dashboardet under /broker for aktuelle omkostninger. Ollama-embeddings er gratis (kører lokalt).

Er mine data sikre?

Dokumenter opbevares lokalt på disk. AI-kald sender kun relevante chunks til API'en — aldrig hele dokumenter. Der logges aldrig kundedata i tekstlogs. Audit log sporer alle handlinger.

Hvornår finder modsigelses-scanneren noget?

Kun på entiteter der er nævnt i mindst 2 forskellige dokumenter i samme workspace. Entiteter der kun optræder ét sted springes over — der er intet at sammenligne med. Scanneren leder efter samme faktum beskrevet forskelligt (fx forskellige datoer for samme hændelse, forskellige ejerandele, modstridende status). Forskellige aspekter af entiteten, meget vs. lidt specifikke beskrivelser, og tidsforskudte udsagn hvor begge kan være sande flag'es ikke.

Kan jeg slette et dokument?

Endnu ikke via UI (kommer senere). Dokumenter kan slettes direkte i databasen.

Hvorfor ser jeg kun CVR og datoer som entities?

Uden ANTHROPIC_API_KEY eller OPENAI_API_KEY kører kun regex-heuristik. Sæt en API-nogle for at aktivere LLM-baseret extraction der finder navne, adresser, selskaber og relationer.

Sletter “Ryd visning” mine data?

Nej. “Ryd visning” skjuler kun grafen visuelt. Alle entities, relationer og entity mentions er bevaret i databasen. Tryk “Vis graf” for at bringe den tilbage.

Hvad er forskellen på workspace-grafen og case map?

Workspace-grafen bygges automatisk fra dokumentpipelinen — den indeholder fakta (entities og relationer) udtrukket fra tekst. Case map er en AI-genereret analyse der vises som overlay oven på grafen. Case map koster LLM-tokens, workspace-grafen gør ikke.