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)
- Gå til Dashboard
Her ser du API-status og kan uploade dokumenter.
- 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.
- Søg i dokumentet
Gå til Søg og skriv et søgeord. Resultater vises med highlighted matches og link til kildedokumentet.
- Se entities
Gå til Entities for at se de automatisk udtrukne personer, selskaber, datoer og relationer.
- 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
| Format | Filtyper | Bemærkning |
|---|---|---|
| Tekst | .txt | UTF-8, direkte indlæsning |
| Tekstbaseret PDF (skannet kræver OCR) | ||
| Word | .docx, .doc | Tekst udtrækkes, formatering ignoreres |
| Billeder | .jpg, .png | OCR via Tesseract.js (eng+dan) |
Upload-grænser
- Max filstorrelse: 50 MB per fil
- En fil per upload (bulk-upload kommer senere)
Dokumentstatus
| Status | Betydning |
|---|---|
uploaded | Fil modtaget, venter på behandling |
extracting | Tekst udtrækkes fra filen |
extracted | Tekst udtrukket, klar til chunking |
chunking | Tekst splittes i søgbare dele |
embedding | Chunks embeddes til semantisk søgning |
ready | Færdigbehandlet — søgbar og i grafen |
failed | Noget gik galt — se fejlbesked |
Hvad sker der efter upload?
Dokumentet gennemlober en automatisk pipeline:
- Tekst udtrækkes (PDF → pdf-parse, DOCX → mammoth, TXT → direkte, billede → Tesseract.js OCR)
- Teksten splittes i chunks (~1200 tegn med bevarede offsets)
- Hvis en embedding-provider er konfigureret: chunks embeddes til semantisk søgning
- Entities udtrækkes (regex for CVR/datoer + LLM for navne/relationer)
- 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
- Resultater gemmes med sporbarhed til kildedokument og chunk
Dokumentvisning: Grid og Tidslinje
På /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.
4. Søgning
Gå til Søg-siden. Der er tre søgemodes:
| Mode | Hvordan | Kræver API-key |
|---|---|---|
| Keyword | Postgres fuldtekstsogning (tsvector). Finder præcise ord. | Nej |
| Semantic | Vektorsogning via pgvector. Finder semantisk lignende indhold. | Ja (embedding-provider) |
| Hybrid | Kører begge, kombinerer via Reciprocal Rank Fusion. | Nej (falder tilbage til keyword) |
Hvad er forskellen? Keyword vs. Semantic
Keyword matcher bogstaver. Semantic matcher mening.
Keyword search kører 100% lokalt i Postgres — ingen AI, ingen API-nøgler, ingen omkostninger. Den finder ord og ordstammer: “konkurs” matcher “konkursen”, “konkurserne”, “konkursbo”. Men den finder kun dokumenter der indeholder de præcise ord du søger efter.
Semantic search (AI) forstår hvad du mener. Den konverterer din søgning og alle chunks til matematiske vektorer og finder de chunks der ligger tættest i betydningsrum — uanset hvilke ord der bruges.
| Du søger | Keyword finder | Semantic finder |
|---|---|---|
| “konkurs” | Dokumenter med ordet “konkurs” | Dokumenter med “konkurs” |
| “insolvens” | Ingenting (ordet optræder ikke) | Konkurs-afsnittene (samme betydning) |
| “okonomiske problemer” | Ingenting | Passager om likviditet, gæld, underskud |
| “hvem skylder penge” | Ingenting | Afsnit om kreditorer og debitorer |
| “tojfirma i vanskeligheder” | Ingenting | MacFashion ApS konkurs-sagen |
For juridisk og finansielt arbejde med mange dokumenter er det forskellen mellem at finde det du søger på, og at finde det du leder efter.
Tips
- Keyword-søgning virker altid — også uden API-nøgler
- Semantic search kræver en konfigureret embedding-provider (OpenAI, Voyage, Jina, Cohere eller Ollama)
- Hybrid er default og anbefales — den kombinerer begge metoder
- Søgeresultater viser highlighted matches og link til kildedokument
- Klik på dokumenttitlen for at se alle chunks
5. Entities og relationer
Entities-siden viser alle automatisk udtrukne entiteter og relationer fra dine dokumenter.
Entity-typer
| Type | Eksempler | Kilde |
|---|---|---|
| Person | Jens Hansen, CPR 010178-1234 | LLM + regex (CPR) |
| Company | Acme Holding ApS, CVR 12345678 | LLM + regex (CVR) |
| Address | Vesterbrogade 14, Kobenhavn | LLM |
| Event | Stiftelse, konkursdekret | LLM |
| Claim | Krav på 2.3 mio. kr. | LLM |
| Property | Matrikel 42a, Strandvejen 8 | LLM |
| FinancialRelation | 1.500.000 kr., 42 mio. DKK | Regex |
| Date | 12. marts 1978 | Regex |
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-graf | AI Case map | |
|---|---|---|
| Hvad er det? | Den faktuelle graf bygget automatisk fra dokumentpipelinen | En AI-genereret analyse og fortolkning |
| Hvornår bygges den? | Automatisk — vokser med hvert uploadet dokument | On demand — når du trykker “Build case map” |
| Indhold | Entities 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 |
| Data | Permanent 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
| Knap | Hvad den gør | Sletter data? |
|---|---|---|
| Build case map | Genererer AI case map overlay (koster tokens) | Nej |
| Ryd visning | Skjuler grafen visuelt — ingen data pavirkes | Nej — entities og relationer er bevaret i databasen |
| Vis graf | Bringer workspace-grafen tilbage efter “Ryd visning” | Nej |
| Skjul case map | Fjerner AI case map overlay, viser workspace-grafen igen | Nej — 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)
- Dit spørgsmål embeddes (eller keyword-søges)
- De 15 mest relevante chunks hentes fra databasen
- Chunks sendes som kontekst til AI-modellen
- AI'en svarer baseret KUN på den kontekst — ingen gætterier
- 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
- Planner: AI'en analyserer alle entities, relationer og dokumentuddrag og laver en analyseplan
- 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.
10. Legale aspekter og frister
Udover dokumentets indhold tilføjer AI et juridisk lag ovenpå analysen. Det vises som en blå §-markeret L1 under aspect-træet og som en dedikeret side i print.
Pass 3 klassificerer entiteten (separatist-krav, privilegeret fordring, ejendomsforbehold, kurator-rolle, konkursdekret osv.) og producerer relevante:
- Frister — fx anmeldelsesfrist, fordringsprøvelsesfrist, kæremålsfrist
- Bevisbyrde — hvem skal dokumentere hvad
- Konsekvenser — ved manglende opfyldelse
- Lovhjemmel — henvisninger til konkurslovens paragraffer
Vigtigt: Dette er AI-analyse baseret på generel viden om dansk konkurslov og retspleje. Alle lovhenvisninger skal verificeres mod primær kilde før de bruges i konkret sagsbehandling. En gul advarsel vises i popoveren.
Implicitte frister på tidslinjen: fra events som fordringsprøvelse, indstillingsliste og konkursdekretets afsigelse afleder AI automatisk gule ⌉-markører for relevante lovmæssige frister:
- Indsigelsesfrist: +14 dage fra indstillingslisten
- Kæremålsfrist (anslået): +6 uger fra indstillingslisten (retsplejelov § 394)
- Anmeldelsesfrist: +4 uger fra konkursdekret afsigelse (konkursloven § 128)
10.1 Legal-service: cached lov-tekst og auto-injection
Udover de AI-genererede legale aspekter kan systemet også hente og cache den faktiske lov-tekst fra danske love, så AI verificerer mod konkret paragraftekst i stedet for sin egen hukommelse.
Side: Legal (nav-punkt 9). To-kolonne admin:
- Venstre: liste af 10 seedede danske love (Konkursloven, Aftaleloven, Tinglysningsloven, Erhvervslejeloven, Retsplejeloven, Erstatningsansvarsloven, Selskabsloven, Danske Lov, Kildeskatteloven, Købeloven). Hver har kort-form (kkl, aftl, tll, ...) og deeplink til retsinformation.dk.
- Højre: cached paragraffer for den valgte lov + form til at indsætte ny tekst (paste fra retsinformation).
Auto-detektor i fronts og situations-rapporter: systemet scanner tekst som "kkl § 87", "konkurslovens § 61, stk. 2", "AFTL § 36", "DL 5-7-1" — og hvis paragraffen er cached, injiceres den autentiske tekst i AI-prompten med instruksen: "Tjek dine paragraf-citater mod denne tekst. Hvis paragraf-teksten ikke understøtter brugen, skriv MISMATCH."
I rapporter bliver lov-refs som "kkl § 87" rendret som klikbare 📜-links til retsinformation.dk.
Endpoints (fx for scripts): GET /api/legal/laws, PUT /api/legal/:code/:paragraph, POST /api/legal/detect, POST /api/legal/context.
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):
- Side 1 — Sagsanalyse (portrait): AI-genereret 3-5 sætnings sagssammenfatning fra Build case map
- Side 2 — Tidslinje pr år (portrait): horisontalt spor pr kalenderår, events nedenfor aksen, frister over
- Side 3-4 — Dokumentanalyse (1/2 + 2/2): entiteten gentages med L1-topics fordelt mellem to sider, stiplet vertikal forbindelse
- 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
På /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:
- Brev-header (fx “12. marts 2025”)
- Email-dato (hvis det er en ingested email)
- 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
På /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:
- Person X ejer selskab Y (fra arsrapport)
- Selskab Y har pant i ejendom Z (fra tinglysning)
- Ejendom Z er solgt under markedspris 3 mdr. for konkurs (fra kontoudtog + indstillingsliste)
- → 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
- Send eller videresend en email til den konfigurerede email-adresse
- CaseGraph checker indbakken hvert minut
- Email-brødtekst bliver til et dokument (afsender, dato, emne, tekst)
- Vedhæftninger (PDF, DOCX, billeder) bliver til separate dokumenter
- Alt kører gennem den normale pipeline: extract → chunk → embed → entities
Workspace-routing
Du kan styre hvilket workspace emails lander i:
| Metode | Eksempel | Workspace |
|---|---|---|
| Plus-adressering | email+gg-business@domæne.dk | gg-business |
| Emne-prefix | [gg-business] Kontrakt... | gg-business |
| Default | Ingen prefix | Standard-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-PostogPrecedence: bulk/lister 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"
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 i
mymind_node_overrides.keywordsog 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 som
userPriorityNodesså 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:
- KPI "Fakturaer" → /invoices (med ← Tilbage til MyMind-knap øverst)
- Signal-card "TDC 12.500 kr" → /documents/<id> (samme tilbage-knap)
- Cirkel for "Sag mod XYZ" → DetailPanel → Åbn sag → /situation-reports?front=<id>
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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).
- 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.
- 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.
| Indstilling | Hvad |
|---|---|
| Navn (display label) | Klik overskriften i DetailPanel og rediger — bruges overalt uden at ændre AI'ens data |
| Baggrundsfarve / ring-farve | Farve-swatches i panelet; ∅ = tilbage til standard |
| Form | ⬤ Cirkel (standard) / ■ Firkant / ◆ Rombe — vælg med knapper |
| Ikon / emoji | Emoji-picker eller Lucide-ikon-søgning — vises midt i cirklen i stedet for farve |
| Billede | Upload et billede (PNG/JPG) — vises som cirkel-clip midt i noden |
| Skrifttype / størrelse | Font-familie og font-størrelse på node-labelen |
| Skjul hierarki-linje | Fjern 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)
- Åbn Genveje-appen på iPhone → faneblad Automation nederst → tryk + øverst til højre → Opret personlig automation.
- 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.
- Tilføj action: Web → Hent indhold fra URL. Sæt:
- URL:
https://casegraph.fly.dev/api/workspaces/demo/calls(skiftdemotil dit workspace-slug) - Method:
POST - Headers:
Content-Type: application/json - Request Body (JSON):
Brug variabel-pickeren til at indsætte de magic-variables der svarer til opkaldets data.{ "phone": <FRA_OPKALDET>, "direction": "incoming", "durationSeconds": <VARIGHED>, "endedAt": <NU> }
- URL:
- 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. - 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
- Gå til
/timelineog klik tandhjulet (⚙) ud for kalender-knappen, eller/calendarhvis siden eksisterer - Klik 🔗 Forbind Google Calendar → OAuth-flow giver Read+Write til alle kalendere på din konto
- Hver konto viser sine kalendere som checkboxes — toggle hvilke der inkluderes i sync, og vælg én som opret nye events her(write-cal)
- Klik 🔄 Opdatér kalender-liste fra Google hvis du har oprettet en ny kalender hos Google og vil hente den ind
- Du kan tilkoble flere konti (privat + arbejde fx)
- 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:
| Kilde | Hvor tit | Type | Justeres via |
|---|---|---|---|
| 📧 IMAP email | hvert 60. sekund | Server-poll | IMAP_POLL_INTERVAL_MS i apps/api/.env (default 60000 ms) |
| 📨 Gmail (OAuth) | hvert 2. minut | Server-poll | GMAIL_POLL_INTERVAL_MS i apps/api/.env (default 120000 ms) |
| 📅 Google Calendar | baggrunds-poller hvert 10. min (uafhængig af browser); browser-trigger også hvis side åbnes og last_synced_at >10 min | Server-poll + browser | CALENDAR_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-scrape | scheduler 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 snapshot | scheduler tjekker hvert 5. min; tager dagens snapshot kl. 06:00 hvis ikke allerede taget | Server-poll | Hardcoded TARGET_HOUR=6 i apps/api/src/services/mymind-scheduler.ts (kræver kode-ændring + deploy) |
| 🔍 Aftalsforslag-scan | kun når du klikker "🔍 Scan dokumenter for aftaler" — én job pr. nyt OCR'd dokument | Manuel | Knappen i /calendar Foreslåede-tab |
| 📥 Dokument-upload-pipeline | med det samme efter upload — kører i job-queue (extract → chunk → embed → entities) | Trigget pr. upload | Job-queue er Postgres-backed in-process worker; ingen interval at tweake |
Hvor justerer jeg intervallerne?
- Email/Gmail intervaller: redigér
apps/api/.envog restart API-serveren.IMAP_POLL_INTERVAL_MS=30000giver 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å
/auctionsfor at vælge interval (15 min – 24 t) og "stop efter"-tidspunkt. - MyMind snapshot-tidspunkt: ændr
TARGET_HOUR-konstanten imymind-scheduler.tsog redeploy. (Kunne flyttes tilworkspace_settingssom per-workspace-config — TODO.) - Kalender — server-poller: ændr
CALENDAR_POLL_INTERVAL_MSiapps/api/.env(default 600000 = 10 min). Pr-konto-cooldown justeres medCALENDAR_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=300000for 5-min-poll. - Kalender — browser-fallback: når en bruger åbner
/calendareller/timelinekører frontenden også en sync hvislast_synced_ater >10 min gammelt. Tærsklen styres viaSTALE_MSicalendar-panel.tsxogtimeline/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:
| Provider | Model | Koster | Kører |
|---|---|---|---|
| Ollama | nomic-embed-text | Gratis | Lokalt på din maskine |
| OpenAI | text-embedding-3-small | $0.02/1M tokens | Cloud |
| Voyage AI | voyage-3-lite | Gratis (50M/mnd) | Cloud |
| Jina AI | jina-embeddings-v3 | Gratis (1M/mnd) | Cloud |
| Cohere | embed-v4.0 | Gratis (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).
21b. Legal RAG — for nørder
Når du genererer et juridisk responsum bruger CaseGraph Retrieval-Augmented Generation (RAG) ovenpå Claude/GPT. Modellens vægte ændres ikke — vi træner ikke. Men vi giver den ægte paragraf-tekst i prompten på det rigtige tidspunkt så den kan citere ordret i stedet for at hallucinere.
Flowet ved et responsum
- Du udvælger N dokumenter + stiller et juridisk spørgsmål
- Vi embedder spørgsmålet + dokumenttekst (Jina/OpenAI/Voyage 1024-1536 dim vektor)
- Cosine-similarity-søgning i
legal_paragraphs-tabellen finder top-12 mest semantisk relevante paragraffer (similarity-tærskel 0.35) - Vi tilføjer regex-detected refs (eksplicit nævnt i tekst som “kkl § 87”) ovenpå
- Hele lov-grundlaget injiceres i AI-prompten med en STYRENDE-instruks:“Hvis paragraf-teksten ikke understøtter din konklusion, skriv ⚠️ MISMATCH”
- AI genererer struktureret responsum (Konklusion → Faktum → Retsgrundlag → Vurdering)
Hvorfor paragraffer ikke chunkes
Almindelige dokumenter splittes i ~1200-tegn chunks før de embeddes. Lov-paragraffer derimod er allerede selvstændige semantic-enheder(typisk 50-500 tegn). Hver paragraf = én række = ét embedding. Chunking ville bryde sammenhængen mellem stk. 1 og stk. 2, og søgningen ville miste præcision. Det er den ene plads i CaseGraph hvor vi ikkekører chunking.
Krydsreferencer på tværs af love
Det interessante: AI'en finder paragraffer du ikke selv har nævnt. Hvis dit spørgsmål handler om “konsignations-lager + konkurs”, fanger embedding-søgningen begreber som “ejerskab af løsøre”, “tilbageholdelsesret”, “kommissionsforhold” — og henter relevante paragraffer fra både konkursloven, købeloven og aftaleloven, fordi embedding-modellen er trænet på enorme korpora hvor de begreber optræder sammen i juridisk sammenhæng.
Eksempel: spørgsmål om “Lauritz konsigneret lager + kuratorens krav” → retrieval henter automatisk:
- kkl § 87 (separatist) — direkte semantisk match
- kkl § 88 (udlevering) — direkte
- kbl § 28 (tilbageholdelsesret) — købeloven nævnes IKKE i spørgsmålet, men retrieval ser sammenhængen
- aftl § 17 (fuldmagt) — kommissionsforhold-match
- kkl § 90 (undtagelser) — modpartens potentielle forsvar
Det er den advokat-edge: din responsum nævner paragraffer modparten ikke har tænkt på.
Tekniske detaljer
| Komponent | Implementation |
|---|---|
| Embedding-model | Brugerens valg (Jina v3 default, 1024 dim) — samme provider for alt |
| Vector-storage | pgvector i Postgres (legal_paragraphs.embedding kolonne) |
| Similarity-metric | Cosine (operatør <=>), 1 - cosine_distance |
| Top-K retrieval | 12 paragraffer pr responsum (similarity ≥ 0.35) |
| Combination strategi | Eksplicit (regex) ∪ Semantic (embedding), dedupliceret på (lov, paragraf) |
| Anti-hallucination | System-prompt instruerer AI til at skrive ⚠️ MISMATCH hvis paragraf-tekst ikke understøtter brug |
Caveats
- Embedding-kvaliteten på dansk juridisk sprog er ikke perfekt — providers er trænet primært på engelsk. Visse meget tekniske danske begreber kan blive misset.
- Cache er pr. workspace — paragrafferne du fylder ind i én sag er tilgængelige på tværs af alle dine workspaces (loven er den samme).
- Paragraffer skal være ordret kopi fra retsinformation. Tilføj IKKE kapitel-overskrifter, Karnov-noter eller egne kommentarer til paragraf-feltet — det forstyrrer anti-hallucination-verify.
- Hver responsum du genererer bygger erfaringen — vi kan senere bruge gode responsa som few-shot eksempler for nye sager i samme domæne.
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:
| Funktion | Uden nogle | Med embedding-provider | ANTHROPIC_API_KEY |
|---|---|---|---|
| Upload + extraction | Virker | Virker | Virker |
| Keyword search | Virker | Virker | Virker |
| Semantic search | — | Virker | — |
| Entity extraction | Regex only | Regex only | + LLM |
| AI Chat | — | — | Virker (Claude) |
| Case map | — | — | Virker |
Embedding-providers
Semantisk søgning kræver en embedding-provider. Vælg en i EMBEDDING_PROVIDER:
| Provider | Env-variabel | Gratis? |
|---|---|---|
| OpenAI | OPENAI_API_KEY | Nej (betalt) |
| Voyage AI | VOYAGE_API_KEY | 50M tokens/maned gratis |
| Jina AI | JINA_API_KEY | 1M tokens/maned gratis |
| Cohere | COHERE_API_KEY | 1000 kald/maned gratis |
| Ollama | OLLAMA_BASE_URL | Ja — 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ål | Antal |
|---|---|
| Kodelinjer total | ~14.000 |
| TypeScript | ~12.400 |
| SQL (migrations) | ~380 |
| CSS | ~900 |
| Source-filer | 117 |
| Git commits | 54+ |
Backend (apps/api)
| Komponent | Linjer | Indhold |
|---|---|---|
| AI Broker | ~2.050 | Model routing, cost tracking, budget, policy, embeddings (5 providers) |
| Routes | ~1.375 | 11 route-filer (documents, search, entities, graph, chat, broker, OCR, auth, settings, workspaces, dashboard) |
| Services | ~1.875 | Chat, case map, documents, entities, graph, search, auth, audit, email-ingestion, review |
| Extractors | ~200 | PDF, DOCX, TXT, OCR (Tesseract.js) |
| Jobs | ~450 | Pipeline: extract → chunk → embed → entities |
Frontend (apps/web)
| Komponent | Antal |
|---|---|
| Sider | 9 (Dashboard, Søg, Entities, Graph, Chat, OCR, Guide, Broker, Login) |
| UI-komponenter | 12+ (document cards, case graph, chat panel, timeline, upload, workspace selector, settings, etc.) |
| Linjer total | ~5.400 |
Database
| Mål | Antal |
|---|---|
| SQL-migrationer | 9 (0001–0009) |
| Tabeller | 17 (users, workspaces, documents, chunks, entities, relations, jobs, sessions, audit_log, ai_usage, workspace_settings, m.fl.) |
| Extensions | pgcrypto, citext, pg_trgm, pgvector |
AI-integration
| Funktion | Provider |
|---|---|
| LLM (chat, case map, extraction) | Anthropic Claude (primary), OpenAI GPT (fallback) |
| Embedding (semantic search) | Ollama, OpenAI, Voyage AI, Jina AI, Cohere |
| OCR | Tesseract.js (lokal, eng+dan) |
| Entity extraction | Regex (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ør | Tilbud | Kommentar |
|---|---|---|
| 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 KAILA | AI-assistant ovenpå Karnovs 150 år gamle kommenterede lovsamling. UfR-domme. | Etableret giganten med dybeste faglige redaktionelle database. Ressourcetung, betalt-tier. |
| Juris.dk | Del af Copenhagen Legal Tech. Automatiser document review, drafting, quality checks. | Smal — fokus på automation af eksisterende advokat-workflows. |
| LovBot.dk | Dansk-specifik. Retsinformation.dk-integration + dansk retspraksis. 97 dokumenttyper i 6 kategorier (ansættelse, leje, samarbejde, virksomhed, GDPR, inkasso). | SMB / lægmand-positionering. |
| ClearContract | AI-etik / compliance + kontrakt-fokus. | Adjacent — fokus på compliance, ikke generel sagshåndtering. |
Sagsstyrings-systemer (lille AI-modenhed, men etablerede)
| Aktør | Tilbud |
|---|---|
| EG CapLegal | Microsoft Dynamics-baseret. Sag/dokument/tid/fakturering. |
| Legis 365 | Cloud-baseret advokatsystem. |
| Abakion Legal | All-in-one for advokatfirmaer. |
| Unik Advosys | Modulært: handel, inkasso, konkurs. |
| Penneo | Dokumentsignering + 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.