Architectuur · v2.1

Stack.

Markdowner is een lokale CLI (v2.1) die documenten, mail, scans en audio omzet naar een Zettelkasten-vault met search, RAG en optioneel een Logseq-graph.

Kern

Laag Taal / build
Binary markdowner C11 + C++17, make / CMake
Web-UI Python stdlib HTTP-server + vanilla HTML/CSS/JS (geen npm, geen framework)
Sidecars (OCR, ASR, mail, RAG) Python 3.10–3.12 in third_party/ocr-venv

De C-laag doet convert, vault, zettel, index, search. C++ zit vooral in OCR/ASR/ask. Zware of copyleft-tools draaien niet in-process, maar als subprocess.

In-process libraries

In de binary:

  • zlib / libzip — ZIP/Office-containers
  • pugixml — XML (Office/ODF)
  • SQLite + FTS5 — full-text index (_meta/inv/fts.db)
  • OpenSSL — hashing/crypto
  • libcurl + nlohmann/json — optionele ask → Mistral
  • Tesseract + Leptonica — OCR-fallback

Sidecars en externe tools

Conversie (PATH, niet gelinkt)

Pandoc, LibreOffice (soffice), Poppler (pdftotext/pdftoppm), antiword/catdoc, readpst, ffmpeg.

Mail

tools/mail_sidecar.py met extract-msg, icalendar, vobject.

OCR / HTR

RapidOCR (ONNX, default, licht), optioneel PaddleOCR / PP-StructureV3 (zwaar). Handschrift: Qwen2.5-VL, Kraken+ARletta (historisch NL), TrOCR (modern). GPU via PyTorch (CUDA of ROCm). Per pagina kiest een heuristische competitie de winnaar.

ASR

faster-whisper + lokaal Whisper-model.

RAG (ask)

sentence-transformers (BGE-M3), chonkie, rank_bm25, numpy, usearch. Chat: lokaal Ollama (o.a. Qwen) of optioneel Mistral-API.

Graph

Logseq 0.10.x (file-graph AppImage), geen Logseq 2.x-database.

Architectuur in één zin

C/C++-CLI als orchestrator → Markdown-vault → SQLite FTS5 + lokale embeddings → Python-sidecars voor OCR/ASR/RAG → dunne lokale web-UI op 127.0.0.1:8877. Alles is offline-first / OSS; cloud alleen als je zelf een API-key zet.

De commando’s staan op de man-page.

Open source

De stack van Markdowner is open source. Het enige echte niet-open-source-pad is optionele cloud-chat bij Mistral. Sommige modelgewichten zijn wel vrij te downloaden, maar geen OSI-open source.

De CLI, parsers, web-UI, sidecars en plugins zijn OSS. In de binary zitten alleen permissieve libs: zlib, libzip, pugixml, SQLite, OpenSSL, libcurl, nlohmann/json, Tesseract/Leptonica.

Zwaardere of copyleft-tools draaien expres buiten de binary (subprocess), maar zijn wél open source:

Onderdeel Licentie (kort)
Pandoc, Poppler, LibreOffice, readpst GPL / MPL / vergelijkbaar copyleft
Logseq 0.10.x AGPL
PaddleOCR, RapidOCR, faster-whisper, kraken, Transformers, Ollama OSS (Apache/MIT e.d.)
RAG-libs (chonkie, rank_bm25, usearch, sentence-transformers) OSS

Geen commerciële SDK’s in de binary. Zonder API-key blijft alles lokaal.

Wel downloadbaar, niet altijd “open source”

Modelgewichten zijn geen programma. Die hebben eigen voorwaarden.

Model Gebruik Open source?
BGE-M3 (embeddings) lokale ask / index ja (MIT)
Whisper (ASR) audio → tekst ja (MIT)
TrOCR modern handschrift ja (MIT)
ARletta historisch NL-HTR open inhoud (CC-BY), geen software-OSS
Qwen2.5 72B via Ollama lokale chat ja (Apache 2.0)
Qwen2.5-VL (handschrift-VLM) lokale OCR nee — Qwen Research License, alleen non-commercieel

NVIDIA-CUDA-drivers zijn propriëtair; ROCm is opener. Dat is de GPU-runtime, niet Markdowner.

Niet open source

Mistral API (MISTRAL_API_KEY): closed cloud. Chunks en vragen gaan naar api.mistral.ai. Hetzelfde voor mistral-large en optioneel ASK_RAG_EMBED=mistral.

Zonder key: retrieval lokaal; chat via Ollama als die draait, anders alleen hits.

Jouw vaults — scans, mail, notities — zijn jouw data, geen OSS.

Kort: code en lokale pipeline = OSS. Mistral = gesloten cloud (opt-in). Qwen2.5-VL-gewichten = restrictief, geen OSI-licentie.