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 @@ + + + +
+ + +
+ AI Correspondence · Norwegian Authorities · Hard-RAG Grounded
+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.
+ +What you get
+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.
+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.
+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
+Three steps from blank form to ready-to-send letter. No legal training required.
+ +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.”
+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.
+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
+
+ The intake form: choose recipient body, output type, and tone in seconds.
+
+ Two-column output: Norwegian bokmål canonical on the left, English reference on the right.
+
+ The optional Refine pass — choose Norwegian law, ECHR, or both.
+
+ After refinement: formal citations like jf. opplæringslova § 9 A-4 and EMK artikkel 8.
+Under the hood
+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.
+Authority coverage
+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)
+Free for Do Better Norge members. No credit card required.
+ +
+ User Guide · 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
+ +
+ 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.
+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.
+| Recipient | +Statutes loaded | +Typical use | +
|---|---|---|
| Barnehage | +barnehageloven · fvl | +Enrolment disputes, special needs provisions | +
| Skole (1.–10. trinn) | +opplæringslova · fvl | +Access to education, psycho-social environment | +
| SFO | +opplæringslova · fvl | +After-school care disputes | +
| NAV | +NAV-loven · fvl | +Benefit denials, appeal of decisions | +
| Bufdir | +fvl · EMK Art. 8 | +Adoption, surrogacy, family reunification | +
| Barnevernet | +barnevernsloven · fvl · EMK Art. 8 | +Care orders, emergency placements, tiltaksplan | +
| Statsforvalteren | +fvl · barnevernsloven | +Complaints about municipality / Barnevernet | +
| Trygderetten | +trygderettsloven · fvl | +Social security tribunal appeals | +
| Tingretten | +tvisteloven · EMK Art. 6 | +Court filings, procedural motions | +
| Kommune (annet) | +fvl | +Any other municipal body | +
| Annet | +fvl (general) | +Authorities not in the list above | +
Choose the format that fits what you need to send.
+| Type | When to use it | Structure |
|---|---|---|
| Day-to-day correspondence, quick inquiries, follow-ups | +Short subject + body with signature | +|
| Formal letter | +Official complaints, appeals, access-to-documents requests | +Sender/receiver block, date, reference, body, signature | +
| Court/tribunal filing | +Submissions to Tingretten or Trygderetten | +Numbered sections, legal argument structure, prayer for relief | +
| Phone-call prep | +Before calling a caseworker or authority | +Opening line · key facts · statutes to cite if pressed · questions to ask · escalation path | +
Tone affects the register and directness of the draft — not the legal accuracy. The AI will maintain correct Norwegian procedural formality regardless of tone.
+| Tone | When to use it |
|---|---|
| Cooperative | +First contact, relationship still intact, no conflict yet | +
| Neutral-professional ★ | +Default. Works for most situations — factual, polite, direct | +
| Firm | +Deadline has passed, previous requests ignored, clear legal obligation exists | +
| Adversarial | +Formal complaints, escalations, when cooperation has broken down completely. Use intentionally — sets a confrontational tone that can close doors. | +
| Conciliatory-warm | +De-escalation, apology situations, requesting a second chance or meeting | +
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.
+
+ "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:
+You can type your own goal in the text field instead of — or in addition to — using a chip.
+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.
+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.
+
+ The output has two columns:
+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.
+
+ 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:
+
+ Free for Do Better Norge members.
+ +
+ Technical Showcase · Hard-RAG · Fine-tuned LLM · 3-pass pipeline
+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.
+ +Architecture
+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.
+ +Parses the intake and returns a structured JSON classification:
+summary — one-sentence case summaryparties — identified actorsapplicable_acts — relevant statute setsmissing_facts[] — gaps that would hurt draft qualitysuggested_goal — inferred goal if none statedIf missing_facts is non-empty → emits clarify gate. No credit deducted until Pass 2 starts.
Four sub-steps, each verified before proceeding:
+[CITE:N] tokens referencing only retrieved source IDs[CITE:N] token whose source ID isn't in the retrieved pool; flags deadline/goal/tone complianceUser-triggered (+1 credit). Jurisdiction-scoped retrieval, then rewrites inline citations to formal style and appends Rettskilder block:
+Hard-RAG
+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.
+ +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.
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
+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.
+ +| Recipient body | Corpus slices loaded |
|---|---|
| Barnevernet | child_welfare · echr · family_core |
| Bufdir | family_core · echr · bufdir_guidance |
| NAV | broader_legal (NAV-loven) |
| Skole / Barnehage / SFO | broader_legal (opplæringslova / barnehageloven) |
| Statsforvalteren | child_welfare · broader_legal |
| Trygderetten / Tingretten | norwegian_courts · broader_legal |
Fine-tuned model
+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.
+| Pass | Model | Role |
|---|---|---|
| Pass 1 classify | gpt-4o-mini | Fast structured classification + gap detection |
| Pass 1 clarify questions | gpt-4o-mini + dbn-legal-agent | Domain-aware question generation |
| Pass 2 draft | gpt-4o | Full letter generation within Hard-RAG constraints |
| Pass 2 self-check | gpt-4o-mini | Citation verification + tone/goal/deadline audit |
| Pass 2 translate | gpt-4o-mini | Norwegian → working language translation |
| Pass 3 refine | gpt-4o | Formal citation rewrite + Rettskilder block |
Pass 3 — Formal citation refine
+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:
+ +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.
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.
+ Refined draft (Norwegian + English) with opplæringslova § 9 A-4 and EMK artikkel 8 inline citations.
+ +For Barnevernet and Bufdir cases, the ECHR refine pass runs specific anchor queries targeting the most-cited Norwegian family cases in the HUDOC corpus:
+Privacy & security
+Privacy by design
+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.Free for Do Better Norge members. All 3 passes available to every member.
+ += htmlspecialchars(dbnToolsT('preview_free_note', $uiLang)) ?>
= htmlspecialchars(dbnToolsT('preview_get_access', $uiLang)) ?> → + + += htmlspecialchars(dbnToolsT('preview_other_tools', $uiLang)) ?>