Gratis, uoffisiell og leservennlig plattform for norske lover og sentrale forskrifter.
Inspirert av lagen.nu i Sverige. Data hentes fra Lovdata under NLOD 2.0.
Lovspeil er ikke offisiell. Lovdata er autoritativ kilde. Kontroller alltid mot Lovdata ved juridisk bruk.
Kildekode: github.com/devify-no/lovspeil.no
- Next.js 15 (App Router, SSR/SSG)
- TypeScript (strict)
- Tailwind CSS
- PostgreSQL + Drizzle ORM
- Cheerio for HTML/XML parsing
- Vitest for tester
- Node.js 20+
- PostgreSQL 15+
git clone https://github.com/devify-no/lovspeil.no.git
cd lovspeil.no
npm install
cp .env.example .env
# Rediger DATABASE_URL i .envLocal development (Docker):
npm run db:setup # start Postgres + push schema
# eller step-by-step:
npm run db:up # docker compose up -d
npm run db:push # apply schemaConnection string: postgres://lovspeil:lovspeil@localhost:5432/lovspeil
Neon Postgres (production):
- Create a project at console.neon.tech
- Copy the connection string into
.envasDATABASE_URL - For serverless hosting (e.g. Vercel), use the pooled connection string from the Neon dashboard
- Push the schema:
npm run db:push
# or generate and run migrations:
npm run db:generate
npm run db:migrateThe app connects to Neon via postgres.js with SSL. Use the pooled connection string from the Neon dashboard for serverless hosting; for long imports (npm run import:xml), the direct (non-pooler) URL is often faster.
Static generation (SSG): Law and regulation pages (~4 000) are pre-rendered at build time. Section pages use on-demand ISR (cached after first visit). Set DATABASE_URL in your hosting provider's build environment so next build can fetch slugs.
Uten Docker (lokal Postgres):
createdb lovspeil
npm run db:pushXML/HTML-filer fra Lovdata ligger i /data/nl (lover) og /data/sf (forskrifter).
# Importer alle lover og forskrifter
npm run import:xml
# Eller kun lover / forskrifter
npm run import:xml nl
npm run import:xml sfEtter import, bygg kryssreferanse-indeks:
npm run build:referencesnpm run devÅpne http://localhost:3000.
| Script | Beskrivelse |
|---|---|
npm run dev |
Start utviklingsserver |
npm run build |
Bygg for produksjon |
npm run import:xml |
Importer XML/HTML fra /data |
npm run build:references |
Bygg kryssreferanse-indeks |
npm run sync:lovdata |
(Fremtidig) Synkroniser fra Lovdata API |
npm run migrate:long-slugs |
Kort ned slug-er over 200 tegn (nødvendig for SSG) |
npm run db:up |
Start PostgreSQL via Docker |
npm run db:down |
Stop PostgreSQL container |
npm run db:reset |
Wipe and restart database |
npm run db:setup |
Start DB + push schema |
npm run db:push |
Push database-schema |
npm run test |
Kjør tester |
| URL | Beskrivelse |
|---|---|
/lover |
Oversikt over lover |
/lover/aksjeloven |
Aksjeloven |
/lover/aksjeloven/3-1 |
Aksjeloven § 3-1 |
/forskrifter |
Oversikt over forskrifter |
/sok?q=... |
Søk |
/om |
Om Lovspeil |
/kilde-og-lisens |
Kilde og lisens |
Filene i /data/nl og /data/sf er HTML eksportert fra Lovdata (despite .xml extension). Strukturen er:
<header class="documentHeader">– metadata (departement, dato, rettsområde)<section class="section">– kapitler<article class="legalArticle" data-name="§1-1">– paragrafer<a href="lov/1997-06-13-44">– eksplisitte kryssreferanser
Referanseløseren jobber i tre steg:
- Bevar XML-lenker – Eksplisitte
<a href="lov/...">fra Lovdata - Samme-dokument –
§ 7,§§ 7 og 9,§ 3-1 - Eksterne lover –
aksjeloven § 3-1,forvaltningsloven § 11
Alias-indeks bygges fra titler, korte navn og /data/manual-aliases.json.
Konservativ linking: kun auto-lenke ved confidence ≥ 0.75.
- Statically generated listing pages and document pages (~4 000); section pages via on-demand ISR
- Split
sitemap.xmlindex covering all documents and ~86 000 section URLs (Google 50k limit) robots.txt- Canonical URLs og Open Graph metadata
- JSON-LD (WebPage, BreadcrumbList, Legislation)
npm testTester dekker slug-generering, seksjonsnormalisering, referanseløsning og XML-parsing av eksempelfiler.
Applikasjonskoden er open source. Lovdata-innhold tilgjengeliggjøres under NLOD 2.0 med attribution til Lovdata.