diff --git a/assets/css/tools.css b/assets/css/tools.css index f2aacd3..25cbf85 100644 --- a/assets/css/tools.css +++ b/assets/css/tools.css @@ -7177,3 +7177,779 @@ body.lt-landing { border-top: 1px solid rgba(0, 32, 91, 0.18); } +/* ── korr-doc-links (in-tool breadcrumb links) ───────────────────────── */ +.korr-doc-links { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.8rem; + color: var(--dbn-ink, #16130f); + opacity: 0.6; + margin-bottom: 18px; +} +.korr-doc-links a { + color: var(--dbn-blue, #00205b); + text-decoration: none; +} +.korr-doc-links a:hover { + text-decoration: underline; +} + +/* ═══════════════════════════════════════════════════════════════════════ + KDOC — Public documentation pages (korrespond-about / guide / tech) + ═══════════════════════════════════════════════════════════════════════ */ + +/* ── Shared page wrapper ─────────────────────────────────────────────── */ +.kdoc-page { + background: var(--dbn-paper, #f6f2ea); + color: var(--dbn-ink, #16130f); + min-height: 100vh; + font-family: 'IBM Plex Sans', sans-serif; +} + +/* ── Nav breadcrumb row ──────────────────────────────────────────────── */ +.kdoc-breadcrumb { + max-width: 1100px; + margin: 0 auto; + padding: 12px 2rem; + font-size: 0.82rem; + color: var(--dbn-ink); + opacity: 0.7; +} +.kdoc-breadcrumb a { + color: var(--dbn-blue, #00205b); + text-decoration: none; +} +.kdoc-breadcrumb a:hover { text-decoration: underline; } + +/* ── Hero ─────────────────────────────────────────────────────────────── */ +.kdoc-hero { + background: var(--dbn-blue, #00205b); + color: #fff; + padding: clamp(3rem, 8vw, 6rem) 2rem clamp(3rem, 6vw, 5rem); + text-align: center; +} +.kdoc-hero__inner { + max-width: 860px; + margin: 0 auto; +} +.kdoc-hero__kicker { + font-size: 0.78rem; + letter-spacing: 0.1em; + text-transform: uppercase; + opacity: 0.75; + margin-bottom: 1rem; +} +.kdoc-hero__title { + font-family: 'Crimson Pro', Georgia, serif; + font-size: clamp(2rem, 5vw, 3.6rem); + font-weight: 700; + line-height: 1.15; + margin: 0 0 1.2rem; + color: #fff; +} +.kdoc-hero__sub { + font-size: clamp(1rem, 2.2vw, 1.2rem); + opacity: 0.88; + line-height: 1.65; + margin-bottom: 2rem; +} +.kdoc-hero__stats { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 2rem 3rem; + margin: 2rem 0; +} +.kdoc-hero__stat { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; +} +.kdoc-hero__stat strong { + font-size: 2rem; + font-weight: 700; + font-family: 'Crimson Pro', serif; + color: #c9e0ff; +} +.kdoc-hero__stat span { + font-size: 0.78rem; + opacity: 0.75; + text-align: center; +} +.kdoc-hero__ctas { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 12px; + margin-top: 2rem; +} +.kdoc-btn-primary { + display: inline-block; + background: var(--dbn-red, #ba0c2f); + color: #fff; + padding: 0.75rem 1.8rem; + border-radius: 4px; + font-weight: 600; + font-size: 0.95rem; + text-decoration: none; + transition: background 0.15s; +} +.kdoc-btn-primary:hover { background: #8f0921; } +.kdoc-btn-secondary { + display: inline-block; + background: rgba(255,255,255,0.12); + color: #fff; + border: 1px solid rgba(255,255,255,0.4); + padding: 0.75rem 1.6rem; + border-radius: 4px; + font-weight: 500; + font-size: 0.9rem; + text-decoration: none; + transition: background 0.15s; +} +.kdoc-btn-secondary:hover { background: rgba(255,255,255,0.22); } + +/* ── Sections ────────────────────────────────────────────────────────── */ +.kdoc-section { + max-width: 1100px; + margin: 0 auto; + padding: clamp(2.5rem, 5vw, 4.5rem) 2rem; +} +.kdoc-section--alt { + background: #edeae1; +} +.kdoc-section--alt .kdoc-section { + /* inner padding still applies */ +} +.kdoc-section__eyebrow { + font-size: 0.75rem; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--dbn-red, #ba0c2f); + font-weight: 600; + margin-bottom: 0.6rem; +} +.kdoc-section__title { + font-family: 'Crimson Pro', Georgia, serif; + font-size: clamp(1.6rem, 3.5vw, 2.4rem); + font-weight: 700; + margin: 0 0 0.8rem; + color: var(--dbn-ink); +} +.kdoc-section__sub { + font-size: 1rem; + line-height: 1.7; + color: var(--dbn-ink); + opacity: 0.8; + max-width: 680px; + margin-bottom: 2rem; +} + +/* ── Feature cards grid ─────────────────────────────────────────────── */ +.kdoc-features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1.5rem; + margin-top: 1.5rem; +} +.kdoc-feature-card { + background: #fff; + border: 1px solid rgba(0,32,91,0.1); + border-radius: 8px; + padding: 1.6rem; +} +.kdoc-feature-card__icon { + font-size: 1.8rem; + margin-bottom: 0.8rem; + display: block; +} +.kdoc-feature-card__title { + font-family: 'Crimson Pro', serif; + font-size: 1.2rem; + font-weight: 700; + margin: 0 0 0.5rem; + color: var(--dbn-blue, #00205b); +} +.kdoc-feature-card__body { + font-size: 0.9rem; + line-height: 1.65; + color: var(--dbn-ink); + opacity: 0.85; +} + +/* ── Simple 3-step pipeline (marketing page) ─────────────────────────── */ +.kdoc-steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 0; + margin-top: 1.5rem; + position: relative; +} +.kdoc-step-card { + background: #fff; + border: 1px solid rgba(0,32,91,0.1); + border-radius: 8px; + padding: 1.8rem 1.6rem; + position: relative; +} +.kdoc-step-card__num { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.2rem; + height: 2.2rem; + border-radius: 50%; + background: var(--dbn-blue, #00205b); + color: #fff; + font-weight: 700; + font-size: 0.95rem; + margin-bottom: 1rem; +} +.kdoc-step-card__title { + font-family: 'Crimson Pro', serif; + font-size: 1.15rem; + font-weight: 700; + margin: 0 0 0.5rem; + color: var(--dbn-ink); +} +.kdoc-step-card__body { + font-size: 0.88rem; + line-height: 1.65; + color: var(--dbn-ink); + opacity: 0.82; +} +.kdoc-step-card__example { + margin-top: 0.8rem; + font-size: 0.8rem; + font-style: italic; + color: var(--dbn-blue); + opacity: 0.75; +} +@media (min-width: 700px) { + .kdoc-steps { + grid-template-columns: 1fr auto 1fr auto 1fr; + align-items: stretch; + } + .kdoc-step-arrow { + display: flex; + align-items: center; + padding: 0 0.5rem; + font-size: 1.4rem; + color: var(--dbn-blue); + opacity: 0.4; + } +} +.kdoc-step-arrow { + display: none; +} + +/* ── Screenshot gallery ──────────────────────────────────────────────── */ +.kdoc-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); + gap: 2rem; + margin-top: 1.5rem; +} +.kdoc-gallery__item { + display: flex; + flex-direction: column; + gap: 0.8rem; +} +.kdoc-screenshot { + border-radius: 8px; + box-shadow: 0 4px 24px rgba(0,0,0,0.12), 0 1px 4px rgba(0,0,0,0.08); + max-width: 100%; + border: 1px solid rgba(0,32,91,0.08); +} +.kdoc-gallery__caption { + font-size: 0.82rem; + color: var(--dbn-ink); + opacity: 0.65; + text-align: center; +} + +/* ── LLM spotlight ───────────────────────────────────────────────────── */ +.kdoc-llm-spotlight { + background: var(--dbn-blue, #00205b); + color: #fff; + border-radius: 10px; + padding: 2.5rem 2rem; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; + align-items: center; + margin-top: 1.5rem; +} +@media (max-width: 640px) { + .kdoc-llm-spotlight { grid-template-columns: 1fr; } +} +.kdoc-llm-spotlight__badge { + display: inline-block; + background: rgba(255,255,255,0.15); + border: 1px solid rgba(255,255,255,0.3); + padding: 4px 12px; + border-radius: 20px; + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; + margin-bottom: 0.8rem; +} +.kdoc-llm-spotlight__title { + font-family: 'Crimson Pro', serif; + font-size: 1.6rem; + font-weight: 700; + margin: 0 0 0.6rem; +} +.kdoc-llm-spotlight__body { + font-size: 0.9rem; + line-height: 1.7; + opacity: 0.88; +} +.kdoc-llm-stats { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} +.kdoc-llm-stat { + background: rgba(255,255,255,0.1); + border-radius: 6px; + padding: 1rem; +} +.kdoc-llm-stat strong { + display: block; + font-size: 1.3rem; + font-family: 'Crimson Pro', serif; + color: #c9e0ff; +} +.kdoc-llm-stat span { + font-size: 0.78rem; + opacity: 0.75; +} + +/* ── Authority body grid ─────────────────────────────────────────────── */ +.kdoc-bodies { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; + margin-top: 1.5rem; +} +.kdoc-body-card { + background: #fff; + border: 1px solid rgba(0,32,91,0.1); + border-radius: 6px; + padding: 1rem 1.2rem; +} +.kdoc-body-card__name { + font-weight: 600; + font-size: 0.9rem; + color: var(--dbn-blue, #00205b); + margin-bottom: 4px; +} +.kdoc-body-card__law { + font-size: 0.75rem; + color: var(--dbn-ink); + opacity: 0.6; + font-style: italic; +} + +/* ── CTA strip ───────────────────────────────────────────────────────── */ +.kdoc-cta-strip { + background: var(--dbn-red, #ba0c2f); + color: #fff; + text-align: center; + padding: 4rem 2rem; +} +.kdoc-cta-strip__title { + font-family: 'Crimson Pro', serif; + font-size: clamp(1.6rem, 3.5vw, 2.4rem); + font-weight: 700; + margin: 0 0 0.8rem; +} +.kdoc-cta-strip__sub { + font-size: 1rem; + opacity: 0.88; + margin-bottom: 2rem; +} +.kdoc-cta-strip .kdoc-btn-primary { + background: #fff; + color: var(--dbn-red, #ba0c2f); +} +.kdoc-cta-strip .kdoc-btn-primary:hover { + background: #f5e8ea; +} +.kdoc-cta-strip .kdoc-btn-secondary { + border-color: rgba(255,255,255,0.5); +} + +/* ── Guide: TOC ──────────────────────────────────────────────────────── */ +.kdoc-toc { + background: #fff; + border: 1px solid rgba(0,32,91,0.1); + border-radius: 8px; + padding: 1.4rem 1.6rem; + margin: 0 0 2.5rem; + display: inline-block; +} +.kdoc-toc__title { + font-size: 0.78rem; + letter-spacing: 0.08em; + text-transform: uppercase; + font-weight: 600; + color: var(--dbn-ink); + opacity: 0.55; + margin-bottom: 0.8rem; +} +.kdoc-toc ol { + margin: 0; + padding-left: 1.2rem; +} +.kdoc-toc li { + font-size: 0.9rem; + margin-bottom: 0.3rem; +} +.kdoc-toc a { + color: var(--dbn-blue, #00205b); + text-decoration: none; +} +.kdoc-toc a:hover { text-decoration: underline; } + +/* ── Guide: step sections ────────────────────────────────────────────── */ +.kdoc-guide-step { + margin-bottom: 3.5rem; + scroll-margin-top: 2rem; +} +.kdoc-guide-step__header { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 1rem; +} +.kdoc-guide-step__num { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 2rem; + height: 2rem; + border-radius: 50%; + background: var(--dbn-blue, #00205b); + color: #fff; + font-weight: 700; + font-size: 0.9rem; + flex-shrink: 0; +} +.kdoc-guide-step__title { + font-family: 'Crimson Pro', serif; + font-size: 1.35rem; + font-weight: 700; + margin: 0; + color: var(--dbn-ink); +} +.kdoc-guide-step__body { + font-size: 0.92rem; + line-height: 1.7; + color: var(--dbn-ink); + opacity: 0.88; + margin-bottom: 1.2rem; +} +.kdoc-guide-step__screenshot { + margin: 1rem 0; +} + +/* ── Preset / tone table ─────────────────────────────────────────────── */ +.kdoc-table { + width: 100%; + border-collapse: collapse; + font-size: 0.88rem; + margin: 1rem 0 1.5rem; +} +.kdoc-table th { + text-align: left; + font-weight: 600; + padding: 0.5rem 0.8rem; + border-bottom: 2px solid rgba(0,32,91,0.2); + color: var(--dbn-blue, #00205b); + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} +.kdoc-table td { + padding: 0.6rem 0.8rem; + border-bottom: 1px solid rgba(0,32,91,0.08); + vertical-align: top; + line-height: 1.55; +} +.kdoc-table tr:last-child td { border-bottom: none; } +.kdoc-table td:first-child { font-weight: 600; color: var(--dbn-blue); white-space: nowrap; } + +/* ── Guide: tips ─────────────────────────────────────────────────────── */ +.kdoc-tips { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 1rem; + margin-top: 1rem; +} +.kdoc-tip { + background: #fff; + border-left: 3px solid var(--dbn-blue, #00205b); + border-radius: 0 6px 6px 0; + padding: 0.9rem 1.1rem; + font-size: 0.88rem; + line-height: 1.6; + color: var(--dbn-ink); +} +.kdoc-tip strong { color: var(--dbn-blue); } + +/* ── Tech: pipeline diagram ──────────────────────────────────────────── */ +.kdoc-pipeline { + display: flex; + flex-direction: column; + gap: 0; + margin: 1.5rem 0; +} +.kdoc-pipeline__pass { + background: #fff; + border: 1px solid rgba(0,32,91,0.12); + border-radius: 8px; + padding: 1.4rem 1.6rem; + position: relative; +} +.kdoc-pipeline__pass-badge { + display: inline-block; + background: var(--dbn-blue, #00205b); + color: #fff; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + padding: 2px 8px; + border-radius: 3px; + margin-bottom: 0.6rem; +} +.kdoc-pipeline__pass-badge--mini { background: #0f766e; } +.kdoc-pipeline__pass-badge--optional { background: #6b7280; } +.kdoc-pipeline__pass-title { + font-family: 'Crimson Pro', serif; + font-size: 1.1rem; + font-weight: 700; + margin: 0 0 0.4rem; + color: var(--dbn-ink); +} +.kdoc-pipeline__pass-body { + font-size: 0.86rem; + line-height: 1.65; + color: var(--dbn-ink); + opacity: 0.82; +} +.kdoc-pipeline__pass ul { + margin: 0.5rem 0 0; + padding-left: 1.2rem; + font-size: 0.84rem; + line-height: 1.6; +} +.kdoc-pipeline__arrow-down { + text-align: center; + font-size: 1.2rem; + color: var(--dbn-blue); + opacity: 0.4; + padding: 4px 0; +} +@media (min-width: 760px) { + .kdoc-pipeline { + flex-direction: row; + align-items: stretch; + } + .kdoc-pipeline__pass { + flex: 1; + } + .kdoc-pipeline__arrow-down { + display: flex; + align-items: center; + padding: 0 4px; + font-size: 1.4rem; + } +} + +/* ── Tech: KB stats ──────────────────────────────────────────────────── */ +.kdoc-kb-stats { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 1rem; + margin: 1.5rem 0; +} +.kdoc-kb-stat { + background: #fff; + border: 1px solid rgba(0,32,91,0.1); + border-radius: 8px; + padding: 1.1rem 1.2rem; + text-align: center; +} +.kdoc-kb-stat strong { + display: block; + font-family: 'Crimson Pro', serif; + font-size: 1.9rem; + font-weight: 700; + color: var(--dbn-blue, #00205b); + line-height: 1; + margin-bottom: 4px; +} +.kdoc-kb-stat span { + font-size: 0.78rem; + color: var(--dbn-ink); + opacity: 0.65; +} + +/* ── Tech: RAG diagram ───────────────────────────────────────────────── */ +.kdoc-rag-flow { + display: flex; + flex-direction: column; + gap: 8px; + margin: 1.5rem 0; +} +.kdoc-rag-row { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} +.kdoc-rag-box { + background: #fff; + border: 1px solid rgba(0,32,91,0.14); + border-radius: 5px; + padding: 0.6rem 1rem; + font-size: 0.82rem; + font-weight: 500; + color: var(--dbn-ink); +} +.kdoc-rag-box--blue { + background: var(--dbn-blue, #00205b); + color: #fff; + border-color: var(--dbn-blue); +} +.kdoc-rag-box--teal { + background: #0f766e; + color: #fff; + border-color: #0f766e; +} +.kdoc-rag-box--red { + background: var(--dbn-red, #ba0c2f); + color: #fff; + border-color: var(--dbn-red); +} +.kdoc-rag-arrow { + font-size: 1rem; + color: var(--dbn-blue); + opacity: 0.45; +} +.kdoc-slice-grid { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin: 0.8rem 0; +} +.kdoc-slice-chip { + background: rgba(0,32,91,0.08); + border: 1px solid rgba(0,32,91,0.14); + border-radius: 20px; + padding: 3px 10px; + font-size: 0.78rem; + font-weight: 500; + color: var(--dbn-blue, #00205b); +} + +/* ── Tech: finetune block ────────────────────────────────────────────── */ +.kdoc-finetune { + background: #1a2e4a; + color: #e8f0fb; + border-radius: 10px; + padding: 2rem 2rem; + margin-top: 1.5rem; +} +.kdoc-finetune__badge { + display: inline-block; + background: rgba(201,224,255,0.15); + border: 1px solid rgba(201,224,255,0.3); + padding: 3px 10px; + border-radius: 20px; + font-size: 0.73rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.07em; + margin-bottom: 0.8rem; +} +.kdoc-finetune__title { + font-family: 'Crimson Pro', serif; + font-size: 1.5rem; + font-weight: 700; + margin: 0 0 0.6rem; + color: #c9e0ff; +} +.kdoc-finetune__body { + font-size: 0.9rem; + line-height: 1.7; + opacity: 0.88; +} +.kdoc-finetune__chips { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 1.2rem; +} +.kdoc-finetune__chip { + background: rgba(255,255,255,0.1); + border: 1px solid rgba(255,255,255,0.2); + border-radius: 4px; + padding: 4px 10px; + font-size: 0.78rem; + color: #c9e0ff; + font-family: 'IBM Plex Mono', monospace; +} + +/* ── Tech: privacy block ─────────────────────────────────────────────── */ +.kdoc-privacy { + background: #edeae1; + border-radius: 8px; + padding: 1.6rem 2rem; + margin-top: 1.5rem; +} +.kdoc-privacy__title { + font-weight: 700; + color: var(--dbn-blue, #00205b); + margin-bottom: 0.6rem; +} +.kdoc-privacy ul { + margin: 0; + padding-left: 1.3rem; + font-size: 0.88rem; + line-height: 1.8; + color: var(--dbn-ink); +} + +/* ── Doc page nav-bar links row ──────────────────────────────────────── */ +.kdoc-doc-nav { + background: rgba(0,32,91,0.04); + border-bottom: 1px solid rgba(0,32,91,0.08); + padding: 8px 2rem; +} +.kdoc-doc-nav__inner { + max-width: 1100px; + margin: 0 auto; + display: flex; + gap: 1.5rem; + font-size: 0.82rem; + flex-wrap: wrap; +} +.kdoc-doc-nav a { + color: var(--dbn-blue, #00205b); + text-decoration: none; + font-weight: 500; + padding: 4px 0; + border-bottom: 2px solid transparent; +} +.kdoc-doc-nav a:hover, +.kdoc-doc-nav a.is-active { + border-bottom-color: var(--dbn-blue); +} + diff --git a/assets/images/korrespond/form-bottom.png b/assets/images/korrespond/form-bottom.png new file mode 100644 index 0000000..b133b66 Binary files /dev/null and b/assets/images/korrespond/form-bottom.png differ diff --git a/assets/images/korrespond/form-top.png b/assets/images/korrespond/form-top.png new file mode 100644 index 0000000..a8e8382 Binary files /dev/null and b/assets/images/korrespond/form-top.png differ diff --git a/assets/images/korrespond/hero-guide.png b/assets/images/korrespond/hero-guide.png new file mode 100644 index 0000000..655b5ee Binary files /dev/null and b/assets/images/korrespond/hero-guide.png differ diff --git a/assets/images/korrespond/hero-marketing.png b/assets/images/korrespond/hero-marketing.png new file mode 100644 index 0000000..62bedc4 Binary files /dev/null and b/assets/images/korrespond/hero-marketing.png differ diff --git a/assets/images/korrespond/hero-tech.png b/assets/images/korrespond/hero-tech.png new file mode 100644 index 0000000..c3124fa Binary files /dev/null and b/assets/images/korrespond/hero-tech.png differ diff --git a/assets/images/korrespond/output-draft.png b/assets/images/korrespond/output-draft.png new file mode 100644 index 0000000..0d7f0c4 Binary files /dev/null and b/assets/images/korrespond/output-draft.png differ diff --git a/assets/images/korrespond/output-refined.png b/assets/images/korrespond/output-refined.png new file mode 100644 index 0000000..9563de3 Binary files /dev/null and b/assets/images/korrespond/output-refined.png differ diff --git a/assets/images/korrespond/refine-panel.png b/assets/images/korrespond/refine-panel.png new file mode 100644 index 0000000..3977d23 Binary files /dev/null and b/assets/images/korrespond/refine-panel.png differ diff --git a/korrespond-about.php b/korrespond-about.php new file mode 100644 index 0000000..4d7b9a1 --- /dev/null +++ b/korrespond-about.php @@ -0,0 +1,284 @@ + + + + + + + Korrespond — Draft letters to Norwegian authorities · Do Better Norge Tools + + + + + + + + + + + + + + +
+ + + + + + Legal Tools + +
+ + + Open Korrespond → + + Sign in + +
+
+ + + + + +
+
+

AI Correspondence · Norwegian Authorities · Hard-RAG Grounded

+

Draft the letter that changes everything.

+

Korrespond turns your situation into a polished, statute-grounded letter, email, or court filing — always in Norwegian bokmål plus your working language, side by side. Every § citation is verified against 220,000+ indexed legal passages before it reaches you.

+ +
+
+ 220K+ + legal passages indexed +
+
+ 11 + authority presets +
+
+ 4 + output types +
+
+ 3 + pipeline passes +
+
+ + +
+
+ + +
+
+

What you get

+

Three things no other tool gives you at once.

+
+
+ 🇳🇴 +

Always Norwegian + your language

+

The canonical draft is always Norwegian bokmål — the legally operative form. Your working language (English, Polish, or Ukrainian) appears side-by-side as a reference column. Copy either version with one click.

+
+
+ 📜 +

Hard-RAG: no hallucinated statutes

+

Every § number in the draft is traced to a specific retrieved passage from the legal corpus before it reaches you. The self-check pass strips any citation that can't be verified. If no statute fits — the draft says so plainly, without fake references.

+
+
+ ⚖️ +

Covers the statutes that matter

+

forvaltningsloven (fvl §§ 17, 18, 24-25, 28, 32), barnevernsloven, NAV-loven, opplæringslova, barnehageloven, and EMK Art. 6 & 8 — all reachable by selecting the right recipient body. Optional second pass pulls formal ECHR case citations (Strand Lobben, Johansen, K.O. and V.M.).

+
+
+
+
+ + +
+

How it works

+

Describe → retrieve → draft. In under a minute.

+

Three steps from blank form to ready-to-send letter. No legal training required.

+ +
+
+ 1 +

Describe your situation

+

Choose the authority you're writing to, select your output type and tone, and describe what happened. Pick a goal chip (appeal, access to documents, request meeting…) or write your own. Upload the original letter if replying.

+

E.g. “NAV denied my application. I want to appeal and demand a reasoned decision.”

+
+ +
+ 2 +

AI retrieves applicable law & drafts

+

The pipeline classifies your situation, identifies the relevant statute set for your chosen authority, retrieves the top matching passages from 220,000+ indexed sources, and drafts a formal letter — citing only what it actually found.

+

Produces two-column output: Norsk (bokmål) canonical + your working language reference.

+
+ +
+ 3 +

Refine with formal citations

+

Optional second pass: choose Norwegian law, ECHR, or both. The tool rewrites the draft with court-ready citation style — jf. forvaltningsloven § 17, Strand Lobben m.fl. mot Norge, EMD-37283/13, §§ 207–214 — and appends a Rettskilder (legal sources) block.

+

Costs one extra credit. Takes ~30 seconds.

+
+
+
+ + +
+
+

Screenshots

+

See it in action.

+ +
+
+ + +
+

Under the hood

+

Powered by a purpose-built legal LLM.

+
+
+ Fine-tuned model +

dbn-legal-agent

+

A QLoRA fine-tune trained on Norwegian child-welfare and administrative law text. Unlike a general-purpose LLM, dbn-legal-agent understands the procedural vocabulary of forvaltningsloven — what a klage requires, what triggers fvl § 17 consultation rights, how Barnevernet decisions must be reasoned under § 6-3. It runs alongside Azure gpt-4o to shape the structure and register of every draft.

+
+
+
+ QLoRA + fine-tune method +
+
+ fvl + procedural vocabulary +
+
+ gpt-4o + drafting backbone +
+
+ 3-pass + pipeline architecture +
+
+
+
+ + +
+
+

Authority coverage

+

11 presets. Each loads the right statutes automatically.

+

Selecting a recipient body pre-loads the relevant statute set into the Hard-RAG retrieval. No need to know which laws apply — the tool does that for you.

+
+
+

Barnehage

+

barnehageloven · fvl

+
+
+

Skole (1.–10. trinn)

+

opplæringslova · fvl

+
+
+

SFO

+

opplæringslova · fvl

+
+
+

NAV

+

NAV-loven · fvl

+
+
+

Bufdir

+

fvl · EMK Art. 8

+
+
+

Barnevernet

+

barnevernsloven · fvl · EMK

+
+
+

Kommune (annet)

+

fvl

+
+
+

Statsforvalteren

+

fvl · barnevernsloven

+
+
+

Trygderetten

+

trygderettsloven · fvl

+
+
+

Tingretten

+

tvisteloven · EMK Art. 6

+
+
+

Annet

+

fvl (general)

+
+
+
+
+ + +
+

Ready to draft your letter?

+

Free for Do Better Norge members. No credit card required.

+
+ + Open Korrespond → + + Sign in to use Korrespond → + Register free + +
+
+ + + + + diff --git a/korrespond-guide.php b/korrespond-guide.php new file mode 100644 index 0000000..6d85283 --- /dev/null +++ b/korrespond-guide.php @@ -0,0 +1,403 @@ + + + + + + + Korrespond User Guide — How to draft letters to Norwegian authorities + + + + + + + + + + + + + +
+ + + + + + Legal Tools + +
+ + + Open Korrespond → + + Sign in + +
+
+ + + + +
+
+

User Guide · Korrespond

+

How to use Korrespond.

+

A step-by-step walkthrough of every control — from choosing your mode to understanding the output and using the formal citation refine pass.

+
+
+ + +
+ +
+

In this guide

+
    +
  1. Choose a mode: Reply or Initiate
  2. +
  3. Choose the recipient body
  4. +
  5. Output type
  6. +
  7. Tone
  8. +
  9. Context fields
  10. +
  11. Describe the situation & goal chips
  12. +
  13. Upload files (Reply mode)
  14. +
  15. The clarify gate
  16. +
  17. Understanding the output
  18. +
  19. Using the Refine pass
  20. +
  21. Tips & gotchas
  22. +
+
+ + +
+
+ 1 +

Choose a mode: Reply or Initiate

+
+
+ Mode toggle showing Reply and Initiate options +
+
+

Reply mode is for when you have received a letter, decision, or notice and need to respond to it. Upload the document (PDF, DOCX, or TXT) and the tool will read it as the basis for your reply. You can still add narrative context.

+

Initiate mode is for when you want to start a new correspondence from scratch — no incoming document. You'll describe the situation in the "What happened" field. This mode is required for the narrative field.

+
+
+ + +
+
+ 2 +

Choose the recipient body

+
+
+

The recipient body dropdown pre-loads the relevant statute set into the Hard-RAG retrieval pipeline. Choosing correctly means the tool searches the right laws — you don't need to know which statutes apply yourself.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RecipientStatutes loadedTypical use
Barnehagebarnehageloven · fvlEnrolment disputes, special needs provisions
Skole (1.–10. trinn)opplæringslova · fvlAccess to education, psycho-social environment
SFOopplæringslova · fvlAfter-school care disputes
NAVNAV-loven · fvlBenefit denials, appeal of decisions
Bufdirfvl · EMK Art. 8Adoption, surrogacy, family reunification
Barnevernetbarnevernsloven · fvl · EMK Art. 8Care orders, emergency placements, tiltaksplan
Statsforvalterenfvl · barnevernslovenComplaints about municipality / Barnevernet
Trygderettentrygderettsloven · fvlSocial security tribunal appeals
Tingrettentvisteloven · EMK Art. 6Court filings, procedural motions
Kommune (annet)fvlAny other municipal body
Annetfvl (general)Authorities not in the list above
+
+ + +
+
+ 3 +

Output type

+
+
+

Choose the format that fits what you need to send.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeWhen to use itStructure
EmailDay-to-day correspondence, quick inquiries, follow-upsShort subject + body with signature
Formal letterOfficial complaints, appeals, access-to-documents requestsSender/receiver block, date, reference, body, signature
Court/tribunal filingSubmissions to Tingretten or TrygderettenNumbered sections, legal argument structure, prayer for relief
Phone-call prepBefore calling a caseworker or authorityOpening line · key facts · statutes to cite if pressed · questions to ask · escalation path
+
+ + +
+
+ 4 +

Tone

+
+
+

Tone affects the register and directness of the draft — not the legal accuracy. The AI will maintain correct Norwegian procedural formality regardless of tone.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ToneWhen to use it
CooperativeFirst contact, relationship still intact, no conflict yet
Neutral-professional ★Default. Works for most situations — factual, polite, direct
FirmDeadline has passed, previous requests ignored, clear legal obligation exists
AdversarialFormal complaints, escalations, when cooperation has broken down completely. Use intentionally — sets a confrontational tone that can close doors.
Conciliatory-warmDe-escalation, apology situations, requesting a second chance or meeting
+
+ + +
+
+ 5 +

Context fields

+
+
+

Case reference (saksnummer): The reference number on any letter you've received. Providing this helps the AI draft precise references in the header. If you don't have one yet, leave it blank.

+

Where (kommune / fylke): The geographical location of the authority. This helps the AI address the letter correctly and can affect which specific regulations apply (e.g. local school rules).

+

Next deadline: If there's a deadline for your response or action, enter it here. The AI will include an explicit deadline reference in the letter where appropriate. Accepts YYYY-MM-DD or plain text like "3 weeks from today".

+

Who is involved: Names and roles of the key parties — you, any caseworker, the child if relevant, a lawyer, etc. Keep it brief (e.g. "Me (parent), caseworker Anna Hansen, son Ola (age 8)"). Tip: use the Redact tool first if you'll share this externally.

+
+
+ + +
+
+ 6 +

Describe the situation & choose a goal

+
+
+ Narrative field and goal chips +
+
+

"What happened / context" is the most important field. Write what happened, when, who decided what, and what outcome you want. The more specific you are, the better the draft. 8,000 characters maximum.

+

Goal chips let you quickly state your legal goal. Click one to auto-fill the Goal field — you can then edit it. Each chip maps to a specific procedural right:

+
    +
  • Access to docs (fvl §18) — Request access to all documents in your case
  • +
  • Appeal (fvl §28) — Formally appeal a decision to the klageinstans
  • +
  • Request meeting — Request a face-to-face meeting with a caseworker
  • +
  • Reasoned decision (fvl §24-25) — Demand a written, reasoned decision
  • +
  • Right to be heard (fvl §17) — Invoke your procedural right to be heard before a decision
  • +
  • Complaint — File a complaint about caseworker conduct
  • +
  • Clarify timeline — Ask for a status update and expected timeline
  • +
+

You can type your own goal in the text field instead of — or in addition to — using a chip.

+
+
+ + +
+
+ 7 +

Upload files (Reply mode)

+
+
+

In Reply mode, upload the letter or decision you received. The AI will read and summarise it as the basis for your reply. Supported formats: PDF, DOCX, TXT. Up to 4 files, max 8 MB each.

+

Convention: the first file uploaded is treated as the primary received letter. Additional files are treated as supporting attachments (e.g. previous correspondence, evidence).

+

In Initiate mode, uploads are optional — use them to provide supporting context (previous letters, medical reports, etc.).

+

All files are processed in memory and immediately discarded when the session ends. Nothing is written to disk or retained.

+
+
+ + +
+
+ 8 +

The clarify gate

+
+
+

Before drafting, the AI runs a quick classification pass (Pass 1) to understand your situation. If it finds gaps that would significantly affect the quality of the draft — a missing decision date, unclear which child is involved, unknown authority — it pauses and shows a "Before we draft, clarify:" panel with specific questions.

+

Answer what you can, then click Continue draft. Your answers are merged into the context before Pass 2 runs. This extra step costs no additional credit.

+

If you're in a hurry or simply don't know the answers, click Draft anyway. The tool will proceed with what it has and flag uncertainties in the output.

+

Note: the clarify pass is free. Credits are only deducted when the actual drafting (Pass 2) begins.

+
+
+ + +
+
+ 9 +

Understanding the output

+
+
+ Two-column output: Norwegian bokmål and English side by side +
+
+

The output has two columns:

+
    +
  • Norsk (bokmål) — canonical: The legally operative draft. This is what you send. Use the Copy or Download .txt button to get the text.
  • +
  • Working language — reference: A translation into your working language (EN/PL/UK). Use this to understand what you're sending — do not send this version to the authority.
  • +
+

Cited law note: at the bottom of the output, a note shows how many law sources were retrieved and cited. If it says "No cited law sources — draft is plain-language", it means no statute matched your situation closely enough to cite — the draft will still be useful but won't include § references. This is the honest behaviour: no fake citations.

+
+
+ + +
+
+ 10 +

Using the Refine pass

+
+
+ Refine panel with Norwegian law, ECHR, and Both options +
+
+

The Refine with formal citations panel appears after the initial draft. This optional second pass (+1 credit) rewrites the draft with court-ready citation style and appends a Rettskilder (legal sources) block at the end.

+

Choose your jurisdiction scope:

+
    +
  • Norwegian law only: Rewrites to use jf. forvaltningsloven § 17, jf. opplæringslova § 9 A-4 style. Best for most domestic correspondence.
  • +
  • ECHR (EMK + HUDOC): Adds European Court of Human Rights citations with full case name, application number, date, and paragraph — e.g. Strand Lobben m.fl. mot Norge, EMD-37283/13 (17.09.2019), § 207. Use when arguing family life rights (Art. 8) or fair trial (Art. 6).
  • +
  • Both: Combines Norwegian statute citations with ECHR case law. Strongest for Barnevernet, Bufdir, or court filings where both domestic and ECHR grounds apply.
  • +
+
+
+ Refined output with formal citations including opplæringslova and EMK +
+
+ + +
+
+ 11 +

Tips & gotchas

+
+
+
Use the Redact tool first. If your narrative includes full names, fødselsnumre, or addresses, run it through Redact before pasting into Korrespond — especially if you plan to share the output.
+
Saksnummer helps a lot. Even a partial case reference from a letter header helps the AI address the reply correctly and cite the right case context.
+
Adversarial tone is powerful — use it intentionally. It signals formal conflict escalation. Once sent, it can close cooperative doors. Use Firm first unless you've genuinely exhausted other options.
+
Goal chips stack with the narrative. If you pick "Appeal (fvl §28)" but your narrative also mentions access to documents, the AI will address both — you don't need to pick just one chip.
+
Deadline field affects the draft directly. The AI explicitly states the deadline in the letter and frames the request with urgency where appropriate. Always fill it in if one exists.
+
For ECHR citations, choose Barnevernet or Bufdir as body. Those presets load the ECHR + family law corpus slices. The Refine pass will then find the strongest relevant case law (Strand Lobben, Johansen, K.O. and V.M.).
+
+
+ +
+ + +
+

Ready to try it?

+

Free for Do Better Norge members.

+
+ + Open Korrespond → + + Sign in to use Korrespond → + Register free + + How it works under the hood +
+
+ + + + + diff --git a/korrespond-tech.php b/korrespond-tech.php new file mode 100644 index 0000000..a597555 --- /dev/null +++ b/korrespond-tech.php @@ -0,0 +1,342 @@ + + + + + + + How Korrespond works — Hard-RAG, fine-tuned LLM, 3-pass pipeline + + + + + + + + + + + + + +
+ + + + + + Legal Tools + +
+ + + Open Korrespond → + + Sign in + +
+
+ + + + +
+
+

Technical Showcase · Hard-RAG · Fine-tuned LLM · 3-pass pipeline

+

How Korrespond knows what to write.

+

A full walkthrough of the retrieval-augmented generation pipeline, citation verification system, fine-tuned legal model, and the formal citation refine pass that produces court-ready references.

+ +
+
+ 220K+ + passages indexed +
+
+ 8 + corpus slices +
+
+ 3 + pipeline passes +
+
+ gpt-4o + drafting model +
+
+
+
+ + +
+

Architecture

+

Three passes. Each with a distinct job.

+

The pipeline is intentionally sequential — Pass 1 is cheap and fast (gpt-4o-mini); Pass 2 is expensive and only runs if the situation is clear enough; Pass 3 is optional and user-triggered.

+ +
+
+ Pass 1 · gpt-4o-mini +

Classify & gap-check

+

Parses the intake and returns a structured JSON classification:

+
    +
  • summary — one-sentence case summary
  • +
  • parties — identified actors
  • +
  • applicable_acts — relevant statute sets
  • +
  • missing_facts[] — gaps that would hurt draft quality
  • +
  • suggested_goal — inferred goal if none stated
  • +
+

If missing_facts is non-empty → emits clarify gate. No credit deducted until Pass 2 starts.

+
+ +
+ Pass 2 · gpt-4o +

Retrieve → draft → check → translate

+

Four sub-steps, each verified before proceeding:

+
    +
  • Retrieve: hybrid dense + BM25 search across the preset corpus slices; top 8 passages returned with source IDs
  • +
  • Draft: gpt-4o generates the letter using [CITE:N] tokens referencing only retrieved source IDs
  • +
  • Self-check: strips any [CITE:N] token whose source ID isn't in the retrieved pool; flags deadline/goal/tone compliance
  • +
  • Translate: Norwegian draft → working language (single call)
  • +
+
+ +
+ Pass 3 · optional +

Formal citation refine

+

User-triggered (+1 credit). Jurisdiction-scoped retrieval, then rewrites inline citations to formal style and appends Rettskilder block:

+
    +
  • Norwegian: jf. forvaltningsloven § 17
  • +
  • ECHR: full case name, application number, date, paragraph
  • +
  • Both: combined domestic + ECHR grounds
  • +
+
+
+
+ + +
+
+

Hard-RAG

+

Every § citation is verified before it reaches you.

+

Hard-RAG means the model is constrained to only cite what it retrieved. No § number can appear in the final draft unless a corresponding source passage was actually found and fetched.

+ +
+
+
User intake + body preset
+ +
Corpus slice selection
+ +
Hybrid search (dense vector + BM25)
+ +
Top 8 passages with source IDs
+
+
+
Passages injected into gpt-4o prompt
+ +
Draft with [CITE:N] tokens only
+ +
Self-check: verify each [CITE:N] resolves
+ +
Strip unverified citations
+
+
+ +

The self-check pass parses every [CITE:N] token in the draft and looks up the source ID N in the retrieved pool. If it doesn't match — the citation is removed and the paragraph is rewritten without it. The output also flags whether the deadline was addressed, whether the stated goal was achieved, and whether the tone matched the selected chip.

+ +

What happens when no statute fits?

+

If no corpus passage closely matches the situation, the draft is produced in plain language without § references. A note in the output says: "No cited law sources — draft is plain-language (no § references available from corpus)." This is the intentional, honest behaviour — a blank draft is better than one with fake citations.

+
+
+ + +
+

Knowledge base

+

220,000+ passages across 8 corpus slices.

+

The legal corpus is split into named slices. Each recipient body preset maps to a set of slices, so retrieval is always scoped to the right area of law.

+ +
+
+ 220K+ + total indexed passages +
+
+ 8 + corpus slices +
+
+ 1,731 + FNV tribunal decisions +
+
+ 23 + ECHR Norwegian-family cases +
+
+ Azure + AI Search (West Europe) +
+
+ Hybrid + dense vector + BM25 +
+
+ +

Corpus slices

+
+ child_welfare + echr + family_core + bufdir_guidance + norwegian_courts + broader_legal + dbn_resources + hague +
+ +

Body preset → slice mapping (examples)

+ + + + + + + + + + + + +
Recipient bodyCorpus slices loaded
Barnevernetchild_welfare · echr · family_core
Bufdirfamily_core · echr · bufdir_guidance
NAVbroader_legal (NAV-loven)
Skole / Barnehage / SFObroader_legal (opplæringslova / barnehageloven)
Statsforvalterenchild_welfare · broader_legal
Trygderetten / Tingrettennorwegian_courts · broader_legal
+
+ + +
+
+

Fine-tuned model

+

dbn-legal-agent: trained on Norwegian legal text.

+ +
+ QLoRA fine-tune +

dbn-legal-agent

+

A QLoRA (Quantized Low-Rank Adaptation) fine-tune trained on Norwegian child-welfare and administrative law text. Unlike a general-purpose LLM, dbn-legal-agent has internalized the procedural vocabulary and reasoning patterns of forvaltningsloven: what triggers a § 17 right to be heard, what a lawful § 24 reasoned decision must contain, how barnevernsloven § 6-3 frames the child's best interest standard.

+

In the Korrespond pipeline, dbn-legal-agent runs as a domain adapter alongside Azure gpt-4o. The retrieval prompt is constructed using dbn-legal-agent's representation of the intake, while gpt-4o handles the final generation within the Hard-RAG constraint. This separation gives structural clarity (gpt-4o) and domain precision (dbn-legal-agent) in the same pipeline.

+
+ QLoRA + forvaltningsloven + barnevernsloven + child-welfare corpus + Norwegian bokmål output + gpt-4o co-pipeline +
+
+ +

Model responsibilities in the pipeline

+ + + + + + + + + + + + +
PassModelRole
Pass 1 classifygpt-4o-miniFast structured classification + gap detection
Pass 1 clarify questionsgpt-4o-mini + dbn-legal-agentDomain-aware question generation
Pass 2 draftgpt-4oFull letter generation within Hard-RAG constraints
Pass 2 self-checkgpt-4o-miniCitation verification + tone/goal/deadline audit
Pass 2 translategpt-4o-miniNorwegian → working language translation
Pass 3 refinegpt-4oFormal citation rewrite + Rettskilder block
+
+
+ + +
+

Pass 3 — Formal citation refine

+

Court-ready citations in two styles.

+

The optional third pass does a jurisdiction-scoped retrieval run, then rewrites the draft with formal inline citations and a Rettskilder appendix. Two distinct citation formats are supported:

+ +
+
+ 🇳🇴 +

Norwegian statute style

+

Inline citations use jf. (with reference to) and the official statute name + section: jf. forvaltningsloven § 17, jf. opplæringslova § 9 A-4, jf. barnevernsloven § 6-3. Section numbers are verified against the corpus before inclusion.

+
+
+ ⚖️ +

ECHR citation style

+

Full European Court of Human Rights citation format: case name · application number · date · chamber/Grand Chamber · paragraph. Example: Strand Lobben m.fl. mot Norge, EMD-37283/13 (Storkammer, 10.09.2019), § 207. Sources pulled from the ECHR corpus slice and HUDOC.

+
+
+ +

Example refined output

+ Refined output showing formal citations including opplæringslova §9 A-4 and EMK artikkel 8 +

Refined draft (Norwegian + English) with opplæringslova § 9 A-4 and EMK artikkel 8 inline citations.

+ +

Anchor queries for ECHR mode

+

For Barnevernet and Bufdir cases, the ECHR refine pass runs specific anchor queries targeting the most-cited Norwegian family cases in the HUDOC corpus:

+
+ Strand Lobben m.fl. mot Norge + Johansen mot Norge + K.O. og V.M. mot Norge + Aune mot Norge + EMK Art. 8 family life Norway + EMK Art. 6 fair trial +
+
+ + +
+
+

Privacy & security

+

Your documents never leave your session.

+ +
+

Privacy by design

+
    +
  • All uploaded files are extracted to text in memory using PHP's in-process file handlers. The raw binary is never written to disk on the server.
  • +
  • Session context (your narrative, uploaded text, drafts) is scoped to your authenticated session and discarded when the session ends.
  • +
  • Azure OpenAI (gpt-4o, gpt-4o-mini) is configured on the West Europe region. Data processed via Azure OpenAI is not used for model training under the default enterprise agreement.
  • +
  • Azure AI Search (bnl-legal-search) stores only the public legal corpus — statutes, tribunal decisions, ECHR judgments. None of your case information is stored in the search index.
  • +
  • Qdrant vector database stores only the public corpus embeddings — no user data.
  • +
  • Telemetry logged: tool name, language, output type, pass count, latency, source count. No case text, no names, no case references are logged.
  • +
+
+
+
+ + +
+

See it work on your case.

+

Free for Do Better Norge members. All 3 passes available to every member.

+
+ + Open Korrespond → + + Sign in to use Korrespond → + Register free + + User guide +
+
+ + + + + diff --git a/korrespond.php b/korrespond.php index 902e96d..f84b49c 100644 --- a/korrespond.php +++ b/korrespond.php @@ -16,6 +16,14 @@ require_once __DIR__ . '/includes/layout.php'; + +
Mode diff --git a/preview.php b/preview.php index 1ee79c5..70a8ef0 100644 --- a/preview.php +++ b/preview.php @@ -91,6 +91,18 @@ $localizedContent = [ 'Per-slice document browser with source count and last-indexed date', ], ], + + 'korrespond' => [ + 'pitch' => 'Describe your situation — the authority, what happened, your goal — and Korrespond retrieves the applicable statutes from 220,000+ indexed legal passages, drafts a formal letter in Norwegian bokmål, verifies every § citation against what it actually retrieved, and returns the draft side-by-side with your working language. Optional second pass rewrites with court-ready formal citations (jf. forvaltningsloven § 17, Strand Lobben m.fl. mot Norge § 207) and a Rettskilder appendix.', + 'features' => [ + '3-pass pipeline: classify + gap-check → Hard-RAG draft + self-check → optional formal-citation refine', + '11 authority presets (Barnevernet, NAV, skole, Bufdir, Statsforvalter, Trygderetten…) each pre-loading the right statute set', + 'Hard-RAG: every § citation verified against retrieved corpus — no fake references, ever', + 'Always outputs Norwegian bokmål (canonical) + your working language (EN/PL/UK) side-by-side', + 'Optional Refine pass: Norwegian statute style (jf. fvl § 17) or ECHR with full case name + paragraph', + 'Powered by dbn-legal-agent — a QLoRA fine-tune on Norwegian child-welfare and administrative law', + ], + ], ], 'no' => [ @@ -164,6 +176,18 @@ $localizedContent = [ 'Utsnittleser med dokumentantall og sist-indeksert-dato', ], ], + + 'korrespond' => [ + 'pitch' => 'Beskriv situasjonen — mottaker, hva som skjedde, og hva du vil oppnå — og Korrespond henter relevante lovbestemmelser fra over 220 000 indekserte juridiske passasjer, skriver et formelt brev på norsk bokmål, verifiserer alle §-henvisninger mot faktisk hentet materiale, og leverer utkastet side om side med ditt arbeidsspråk. Valgfri andreskanning gir rettssikre sitater (jf. forvaltningsloven § 17, Strand Lobben m.fl. mot Norge § 207) og et Rettskilder-vedlegg.', + 'features' => [ + '3-trinns pipeline: klassifiser + mangelsjekk → Hard-RAG-utkast + selvsjekk → valgfri sitatforbedring', + '11 mottakerforhåndsinnstillinger (Barnevernet, NAV, skole, Bufdir, Statsforvalter, Trygderetten…)', + 'Hard-RAG: alle §-sitater verifisert mot hentet korpus — ingen falske referanser', + 'Alltid norsk bokmål (kanonisk) + arbeidsspråket ditt (EN/PL/UK) side om side', + 'Valgfri refinering: norsk lovstil (jf. fvl § 17) eller EMD med fullt saksnavn + avsnitt', + 'Drevet av dbn-legal-agent — QLoRA-finjustert på norsk barnevernsrett og forvaltningsrett', + ], + ], ], ]; @@ -405,6 +429,44 @@ $samples = [ 'p95 latency : 142 ms', ]), ], + + 'korrespond' => [ + 'scenario_label' => ($uiLang === 'no') ? 'Situasjonsbeskrivelse' : 'Situation', + 'scenario' => ($uiLang === 'no') + ? 'Mottaker: Barnevernet — Modus: Initier — Mål: Be om tilgang til saksdokumenter — Tone: Fast' + : 'Recipient: Barnevernet — Mode: Initiate — Goal: Request access to case documents — Tone: Firm', + 'output_label' => ($uiLang === 'no') ? 'Utkast (norsk bokmål)' : 'Draft (Norwegian bokmål)', + 'output' => implode("\n", [ + 'KORRESPOND — Formelt brev', + 'Mottaker: Barnevernet · Modus: Initier · Ton: Fast', + 'Hentede lovkilder: 4 passasjer (fvl, barnevernsloven)', + '', + 'Til: [Barnevernstjenesten, kommunenavn]', + 'Fra: [Navn]', + 'Dato: 19. mai 2026', + 'Ref.: [Saksnummer]', + '', + 'Anmodning om innsyn i saksdokumenter', + '─────────────────────────────────────', + 'Jeg ber herved om innsyn i alle saksdokumenter', + 'tilknyttet min sak, jf. forvaltningsloven § 18.', + '', + 'Som part i saken har jeg rett til å gjøre meg', + 'kjent med alle dokumenter i saken, med mindre', + 'særlige unntak etter fvl. §§ 18 a-e gjør seg', + 'gjeldende. Jeg ber om at slikt unntak begrunnes', + 'skriftlig, jf. fvl. § 24-25.', + '', + 'Jeg ber om svar innen 5 virkedager.', + '', + 'Med vennlig hilsen,', + '[Navn]', + '', + '─────────────────────────────────────', + 'Siterte lovkilder: fvl. § 18 · fvl. § 24-25', + 'Selvsjekk: mål oppfylt ✓ · frist nevnt ✓ · tone Fast ✓', + ]), + ], ]; $sample = $samples[$slug]; @@ -504,6 +566,15 @@ $sample = $samples[$slug];

+ +
+ About Korrespond + · + User guide + · + How it works +
+