Erhverv Privat
Funktioner Sikkerhed Priser Projekt Prøv gratis

HeidiMail — Projektoverblik

Intern teknisk dokumentation. Alle data hostes i Danmark under dansk jurisdiktion.

Tech Stack

Komponent Teknologi Status
Mail server SWPMailServer (eget byg, .NET) — JMAP, SMTP, DKIM/SPF/DMARC klar
Protokol JMAP (JSON Meta Application Protocol) — delta-sync, push klar
Webclient .NET Core Razor Pages, TypeScript, Autofac DI, Dapper klar
Database PostgreSQL — LISTEN/NOTIFY, 52 migrationer, AES-256-GCM passwords klar
Chat transport SignalR (WebSocket med fallback til long polling) klar
Hosting Dansk datacenter (ikke AWS/Azure/GCP) — udbyder TBD planlagt
Signup Vipps MobilePay API — 1 kr. verifikation, kun transaktions-ID planlagt
Native apps (fase 3) TBD (Electron, .NET MAUI, eller lign.) planlagt

Kanban — Projektstatus

Planlagt
Bruger & Sikkerhed (Fase 1)
Signaturer (schema klar)
  • Database-schema allerede oprettet i migrationer
  • UI og API til CRUD af email-signaturer mangler
Brugerpræferencer (schema klar)
  • Database-schema klar (user_preferences)
  • API + UI til indstillinger (tema, standard-signatur, notifikationer) mangler
Chat (Fase 1) — rest
Kontekstuel chat (email-knyttet)
  • Chat knyttet til en specifik modtaget email-tråd — implicit kontekst
  • I dag er sessioner ad hoc / draft-knyttede; email-tråd-koblingen mangler
Signup & Anti-abuse (Fase 1)
MobilePay-integration
  • Vipps MobilePay API — 1 kr. verifikation ved signup
  • Kun transaktions-ID gemmes (ikke navn/telefon/CPR)
  • Kræver CVR + MobilePay-erhvervsaftale først
Rate limiting for nye konti
  • Første 24t: maks 10 udgående mails
  • Første 7 dage: maks 30 mails, derefter gradvis optrapning
  • Bounce-rate og spam-rapport monitoring, auto-suspension
abuse@heidimail.dk
  • Abuse-postkasse med overvågning
  • System til detektion og lukning af misbrugskonti
  • Procedure for abuse-rapporter fra andre mailservere
Juridisk & Infra (Fase 1)
CVR, selskab, MobilePay-erhverv
  • ApS oprettelse + CVR-nummer
  • Erhvervskonto i bank + MobilePay-erhvervsaftale
  • Estimeret budget: ~20.000 kr.
Privatlivspolitik
  • GDPR-dokumentation: hvad gemmes, hvor længe, lovgrundlag
  • Fortegnelse over behandlingsaktiviteter
  • Procedure for indsigts- og sletningsanmodninger
Databehandleraftaler
  • DPA med datacenter, backup-udbyder, evt. SMS-gateway
  • HeidiMail sælger privacy — compliance-kravene er ekstra høje
Dansk datacenter hosting
  • Evaluering af Netgroup, GlobalConnect el. lign.
  • Ikke AWS/Azure/GCP/Hetzner — trouværdighed kræver dansk udbyder
IP/domæne reputation opvarmning
  • Gradvis opvarmning — mails lander i spam de første uger
  • Perfekt DKIM/SPF/DMARC er forudsætning
  • Soft launch med lukket beta anbefales
Kollaborativ redigering (Fase 2)
Cursor/badge broadcasting
  • Realtids cursor-positioner og navne-badges i email-body via SignalR
  • Pragmatisk tilgang: ingen CRDT/OT, cursor-broadcasting + menneskelig koordinering
Realtids tekst-broadcasting
  • Tekstændringer broadcastes til alle deltagere via SignalR
  • Ingen algoritmisk conflict resolution — koordinering sker i chat
Chat-sidebar ved redigering
  • Chat integreret som sidebar i email-editor
  • Bygger på fase 1 chat-infrastruktur
Custom domains (B2B)
  • Multi-tenant domain-support i SWPMailServer
  • DNS-verifikation flow, uafhængig af collab-features
E2E-kryptering (Fase 3)
Native apps (desktop + mobil)
  • Desktop (Electron/.NET MAUI) + mobil (iOS/Android)
  • Forudsætning for E2E: browser-storage er upålidelig
  • Lokal storage og søgeindeksering i appen
Kryptering at rest
  • Mailbox krypteres på server med brugerens nøgle
  • Dekryptering sker udelukkende i native app
  • Valgfrit per bruger — webclient fortsætter uden E2E
Key management + recovery
  • Nøglegenerering, recovery phrase, multi-device synkronisering
  • Password reset problematik: nyt password = ny nøgle = gamle mails tabt
  • Proton-lignende recovery phrase som løsning
I gang
Landing Page (Fase 1)
Projekt-statusside
  • Teknisk dokumentationsside med kanban-overblik
  • Klikbare tasks med detaljer fra projektbeskrivelsen
Udført
Email (Fase 1)
SWPMailServer + JMAP client
  • SWPMailServer (eget byg, .NET) med native JMAP & SMTP
  • DKIM, SPF, DMARC konfigureret — Sieve-baseret filtrering
  • Custom JmapClient i .NET Core med session/auth håndtering
Webclient: 3-panel layout
  • ASP.NET Core Razor Pages + TypeScript frontend
  • Sidebar (mapper) | Mail-liste | Læsepanel
  • Autofac DI, Dapper til PostgreSQL
Mail listing med sync/caching
  • JMAP delta-sync med sinceState/newState
  • PostgreSQL cache: cached_mails, cached_mail_attachments, jmap_sync_states
  • API endpoints: /api/mailboxes, /api/mail, /api/mail/{id}/body
Læse, sende, svare, videresende
  • Standard email-operationer via JMAP Email/set + EmailSubmission
  • CC/BCC support, reply/forward med korrekt threading
Drafts med auto-save
  • Auto-save til Drafts-mailbox via JMAP Email/set
  • Debounced save ved ændringer i compose-editor
Labels & mapper
  • JMAP Mailbox-operationer: opret, omdøb, slet, flyt
  • JMAP keywords til label-tagging
Vedhæftninger
  • Upload/download via JMAP blob endpoints
  • Inline og attached vedhæftninger med MIME-type håndtering
Batch-operationer (select, arkiver, slet)
  • Multi-select i mail-listen med bulk JMAP Email/set
  • Arkivér (flyt til Archive-mailbox), slet (flyt til Trash)
Storage quota (JMAP Quota/get)
  • JMAP Quota/get med hardLimit og resourceType:octets parsing
  • Storage-bar i toolbar avatar-dropdown med brugt/total visning
  • Integrationstest mod rigtig SWPMailServer-instans
Toolbar account switcher
  • Kontonavn + email + avatar samlet i én toolbar-knap
  • Avatar-dropdown med kontoskift, profil-link og storage
  • Erstatter sidebar account switcher — renere layout
Bruger & Sikkerhed (Fase 1)
ASP.NET Core Identity (Dapper)
  • Custom Identity stores implementeret med Dapper
  • PostgreSQL-backed brugerhåndtering
Auto-provisioning ved login
  • Automatisk oprettelse af mailkonto på SWPMailServer ved første login
  • Konfiguration af JMAP-credentials og mailbox-setup
Mail account CRUD + krypteret password (AES-256-GCM)
  • Opret, læs, opdater, slet mailkonti via SWPMailServer Admin-API
  • Passwords krypteret med AES-256-GCM før lagring i PostgreSQL
Connection test til mailserver
  • JMAP session endpoint health check
  • Verifikation af credentials og server-tilgængelighed
Totrinsbekræftelse (2FA/TOTP)
  • TOTP-baseret 2FA med QR-kode og manuel nøgle til authenticator-apps
  • 10 recovery codes til backup-login
  • Fuld settings-UI: aktivér, deaktivér, regenerér koder
  • Login-flow med 6-cifret OTP og recovery code fallback
  • Password-bekræftelse på alle 2FA-handlinger
Database: 15 migrationer
  • PostgreSQL schema med 52 migrationer (identity, mail cache, kontakter, collab, betaling)
  • Dapper data access, snake_case ↔ PascalCase mapping
Landing Page (Fase 1)
Marketing-site (Erhverv + Privat)
  • Razor Pages i HeidiMail.Landing-projekt
  • Segment-toggle: erhverv/privat med separate prissider
Responsive design
  • Desktop-first, breakpoints ved 900px (tablet) og 768px (mobil)
  • Poppins + JetBrains Mono, Phosphor Icons
Chat & Samarbejde (Fase 1)
SignalR-hub + grupper
  • CollabHub: per-bruger-push via Clients.User, session-grupper
  • Join/leave, typing-indikator, peer-events
Ad hoc chat (sessioner + invitationer)
  • Opret session, inviter via email, deltager-styring
  • REST: /api/collab/session/*
Notifikationer (live invitationer)
  • InvitationReceived pushes til alle brugerens faner via SignalR
  • REST-fallback: /api/collab/invitations/pending
Chat-kryptering + historik (zero-knowledge)
  • Beskeder krypteres client-side (keySeed-deriveret nøgle), gemmes i IndexedDB
  • Historik relayes peer-to-peer — serveren ser kun ciphertext, ingen DB-lagring
Kontakter (Fase 1)
Kontakt-CRUD + labels
  • Fuld CRUD: emails, telefoner, adresser, felter; label-tagging
  • REST: /api/contacts, /api/contact-labels
Timeline, forslag & relations-styrke
  • Email-historik pr. kontakt; foreslåede kontakter fra mail-trafik
  • Styrke (hot/warm/cold/lost) ud fra 30-dages mail-antal + sidste kontakt
vCard + signatur-parsing
  • vCard-generering/-parsing og parsing af email-signaturer til kontakter
Kryptering & sikre beskeder (Fase 1)
Browser-E2E (nøglepar + backup)
  • Keypair-setup, PBKDF2-wrapped privat nøgle, rewrap ved password-skift
  • Public-key-lookup, key-backup-bekræftelse, 2FA-gated
Sikre beskeder (krypteret link-inbox)
  • Send krypteret besked til ekstern modtager via token-link
  • Browser-side dekryptering med password; svar uden HeidiMail-konto
Konto, betaling & drift
Abonnement & betaling (backend)
  • Planer, abonnementer, betalinger + scheduler (15-min polling, auto-debitering)
  • MobilePay kører som mock-service — rigtig Vipps-API mangler stadig
Audit-log
  • Persistent audit af handlinger (actor, target, detaljer); bruger-side log-side
Admin-panel (tenant-admin)
  • Separat HeidiMail.Admin: brugerstyring (lås/op, cache), domæne-admin (DNS/DKIM)