[{"data":1,"prerenderedAt":232},["ShallowReactive",2],{"seite-\u002Fopen-source\u002Fdms-selbst-gebaut\u002F":3},{"id":4,"title":5,"body":6,"description":223,"extension":224,"meta":225,"navigation":226,"path":227,"robots":228,"seo":229,"stem":230,"__hash__":231},"seiten_de\u002Fopen-source\u002Fdms-selbst-gebaut.md","Drei Programme oder ein eigenes",{"type":7,"value":8,"toc":213},"minimark",[9,13,17,22,25,44,47,51,54,57,61,64,86,89,93,96,107,125,132,135,146,150,153,156,159,163,166,169,172,175,178,182,196],[10,11,5],"h1",{"id":12},"drei-programme-oder-ein-eigenes",[14,15,16],"p",{},"Im Februar 2026 wollte ich meine Papiere loswerden: Rechnungen, Verträge,\nArztbriefe, Steuerunterlagen. Fotografieren oder als PDF hochladen, der Rest\nsollte von selbst gehen. Vorher habe ich über 30 Open-Source-Projekte geprüft,\ndanach selbst gebaut. Dieser Artikel erklärt, warum, und wie die Lage ein\nhalbes Jahr später aussieht.",[18,19,21],"h2",{"id":20},"fünf-anforderungen-und-ein-schwacher-laptop","Fünf Anforderungen und ein schwacher Laptop",[14,23,24],{},"Die Liste war kurz, und jeder Punkt war Pflicht:",[26,27,28,32,35,38,41],"ol",{},[29,30,31],"li",{},"Upload von Fotos und PDFs mit einem Archiv dahinter",[29,33,34],{},"Texterkennung (OCR) über Mistral OCR",[29,36,37],{},"Tags, die sich aus dem Inhalt ergeben, ohne dass ich sie setze",[29,39,40],{},"Volltextsuche und ein Chat, der Fragen über alle Dokumente beantwortet",[29,42,43],{},"Eine einzige Oberfläche für alles",[14,45,46],{},"Punkt 2 kam von der Hardware. Mein Laptop hat 4 GB Grafikspeicher und wenig\nRAM. MinerU braucht 16 bis 32 GB, Docling hat Spitzen von 3 bis 4 GB, PaddleOCR\nwill eine ordentliche GPU. Lokale Texterkennung in guter Qualität fiel damit\nweg.",[18,48,50],{"id":49},"das-muster-in-der-evaluation","Das Muster in der Evaluation",[14,52,53],{},"Geprüft habe ich Dokumentenablagen wie Paperless-ngx, Papermerge, Docspell,\nMayan EDMS und Teedy, RAG-Werkzeuge wie AnythingLLM, kotaemon, Open WebUI,\nDify und RAGFlow, dazu ERP-Systeme mit Dokumentenmodul. Jedes Projekt bekam\neine Zeile, jede Anforderung eine Spalte.",[14,55,56],{},"Nach ein paar Zeilen war das Muster klar. Die Ablagen konnten archivieren,\ntaggen und suchen, aber keine Fragen beantworten. Die RAG-Werkzeuge konnten\nFragen beantworten, aber nichts ablegen: keine Ordner, keine Tags pro\nDokument, kein Archiv, das man durchblättert. Jede Gruppe hatte genau die\nHälfte.",[18,58,60],{"id":59},"die-beste-kombination-waren-drei-programme","Die beste Kombination waren drei Programme",[14,62,63],{},"Am nächsten kam Paperless-ngx mit zwei Erweiterungen:",[65,66,67,74,80],"ul",{},[29,68,69,73],{},[70,71,72],"strong",{},"Paperless-ngx"," als Archiv mit Volltextsuche",[29,75,76,79],{},[70,77,78],{},"paperless-gpt"," für Mistral OCR und Tags per Sprachmodell",[29,81,82,85],{},[70,83,84],{},"paperless-ai"," für den Chat über alle Dokumente",[14,87,88],{},"Das sind drei Programme mit drei Oberflächen, drei Konfigurationen und zwei\nIndizes, die zum Archiv passen müssen. Wer ein Dokument hochlädt, geht in die\neine Oberfläche; wer eine Frage stellt, in eine andere. Genau das wollte ich\nnicht. Anforderung 5 war der Grund für den Eigenbau.",[18,90,92],{"id":91},"was-stattdessen-entstand","Was stattdessen entstand",[14,94,95],{},"Das DMS ist eine Vue-3-Oberfläche mit PrimeVue auf Supabase: PostgreSQL mit\npgvector für die Vektoren, Storage für die Dateien, Edge Functions für die\nVerarbeitung. Ein Upload läuft durch vier Stufen:",[97,98,103],"pre",{"className":99,"code":101,"language":102},[100],"language-text","upload-document → process-ocr → extract-data → generate-embed\n","text",[104,105,101],"code",{"__ignoreMap":106},"",[14,108,109,112,113,116,117,120,121,124],{},[104,110,111],{},"upload-document"," rechnet den SHA-256 der Datei und lehnt Doppelte ab.\n",[104,114,115],{},"process-ocr"," liest PDFs mit Textebene lokal aus und schickt nur Fotos und\nScans an Mistral OCR. ",[104,118,119],{},"extract-data"," bestimmt den Dokumenttyp, liest Felder\nwie Betrag und Frist nach einem Schema aus und vergibt Tags. ",[104,122,123],{},"generate-embed","\nzerlegt den Text in Abschnitte von 1000 Zeichen, die sich um 200 überlappen,\nund speichert ihre Vektoren.\nSchlägt eine Stufe fehl, steht der Fehler am Dokument.",[14,126,127,128,131],{},"Die Suche kombiniert beides, was PostgreSQL mitbringt: die deutsche\nVolltextsuche mit ",[104,129,130],{},"tsvector"," und die Vektorsuche mit pgvector, gewichtet mit\n0.4 und 0.6. Der Chat holt sich über dieselbe Suche die passenden Abschnitte\nund nennt zu jeder Antwort die Dokumente, aus denen sie stammt.",[14,133,134],{},"Weil alles in einer Datenbank liegt, gelten auch die Rechte an einer Stelle.\nEin Team kann Dokumenttypen wie Lohnausweise nur für Admins freigeben. Die\nSuchfunktion filtert nach denselben Regeln wie die Dokumentliste, deshalb\nlandet ein gesperrtes Dokument weder in Treffern noch als Quelle im Chat. Mit\ndrei Programmen hätte jeder Index die Rechte des Archivs nachbilden müssen.",[14,136,137,138,145],{},"Kein Teil der Anwendung ruft Mistral direkt. Alle Aufrufe gehen über einen\n",[139,140,144],"a",{"href":141,"rel":142},"https:\u002F\u002Fgithub.com\u002Fgstrainovic\u002Fai-proxy",[143],"nofollow","eigenen Proxy",", der den Schlüssel\nhält und den Verbrauch pro Organisation zählt.",[18,147,149],{"id":148},"war-mistral-ocr-die-richtige-wahl","War Mistral OCR die richtige Wahl?",[14,151,152],{},"Im Februar war es die einzige, die der Laptop zuliess. Im September habe ich\nnachgemessen: Mistral OCR gegen Vision-Modelle, die Infomaniak und kvant in\nder Schweiz anbieten, mit künstlichen und echten Belegen, sauber und verzerrt.",[14,154,155],{},"Bei sauberen Scans sind grosse Vision-Modelle wie Kimi K2.6 und Qwen3.5 gleich\ngut oder besser, aber langsamer und teurer. Sobald die Vorlage schwierig\nwird, liegt Mistral OCR vorn: Bei verzerrten Seiten mit dichten Tabellen fand\nes 91 Prozent der Zellen, die Vision-Modelle höchstens 82. Bei Schweizer\nDokumenten wie QR-Rechnungen und Lohnausweisen machte es die wenigsten\nZeichenfehler, bei echten Handyfotos fand es 97 bis 99 Prozent der Felder.",[14,157,158],{},"Beim Datenschutz ist Mistral nicht die beste, sondern eine zulässige Wahl.\nDie Server stehen in Frankreich, das Schweizer Datenschutzgesetz erlaubt die\nÜbermittlung in die EU ohne weitere Garantien. Ein Schweizer Anbieter wäre\nbeim Standort besser. Die Regel für den Test war deshalb: Qualität vor\nStandort. Die Einzelheiten kommen in einem eigenen Artikel.",[18,160,162],{"id":161},"wie-es-heute-aussieht","Wie es heute aussieht",[14,164,165],{},"Für diesen Artikel habe ich die Evaluation im September 2026 wiederholt. Das\nFeld bewegt sich schnell: Einige Projekte haben Mistral OCR dazubekommen,\nPapermerge sucht neue Maintainer, OpenKM verteilt seine Community-Fassung nur\nnoch ohne Quellcode.",[14,167,168],{},"Am meisten hat sich bei Paperless-ngx getan. Version 3.0 kam im Juli 2026\nmit eingebauter KI heraus: Vorschläge für Titel, Tags und Dokumenttyp und ein\nChat über ein oder mehrere Dokumente, mit Links zu den Quellen. Als\nSprachmodell dient Ollama oder jede OpenAI-kompatible API. Texterkennung in\nder Cloud bietet Paperless-ngx selbst nur über Azure an. Mistral OCR und Tags\nschon beim Einlesen bringt weiterhin paperless-gpt. paperless-ai wird laut\nseinem README nicht mehr gepflegt.",[14,170,171],{},"Papra, eine schlanke Ablage, hat seit Juli Mistral OCR und Tags per\nSprachmodell. Ihr fehlt nur der Chat.",[14,173,174],{},"Aus drei Programmen sind also zwei geworden. Wer heute eine private Ablage mit\nChat will und mit zwei Oberflächen leben kann, sollte zuerst Paperless-ngx 3\nmit paperless-gpt ausprobieren. Das ist reifer, als mein Projekt es\nin einem halben Jahr werden kann.",[14,176,177],{},"Selbst bauen lohnt sich, wenn eine der fünf Anforderungen nicht verhandelbar\nist, oder wenn die Ablage für andere laufen soll. Organisationen mit Rollen,\nRechte pro Dokumenttyp bis in den Chat, Verbrauch pro Organisation: Das lässt\nsich an drei verbundene Programme nur schwer anbauen.",[18,179,181],{"id":180},"was-sich-übertragen-lässt","Was sich übertragen lässt",[65,183,184,187,190,193],{},[29,185,186],{},"Anforderungen als Spalten aufschreiben, bevor man die erste Zeile füllt,\nund zu jeder Zelle die Quelle notieren.",[29,188,189],{},"Nach Mustern suchen, nicht nach dem Sieger. „Jede Gruppe hat die Hälfte\"\nsagt mehr als dreissig einzelne Urteile.",[29,191,192],{},"Kombinationen zählen: Drei Programme, die zusammen alles können, sind eine\neigene Lösung mit eigenem Wartungsaufwand.",[29,194,195],{},"Die Evaluation vor einer Entscheidung wiederholen, wenn sie älter als ein\npaar Monate ist. In diesem Feld ändert sich in einem halben Jahr viel.",[14,197,198,199,204,205,208,209,212],{},"Der Quelltext liegt offen:\n",[139,200,203],{"href":201,"rel":202},"https:\u002F\u002Fgithub.com\u002Fgstrainovic\u002Fdms",[143],"github.com\u002Fgstrainovic\u002Fdms",". Die\nvollständige Evaluation mit beiden Ständen steht in ",[104,206,207],{},"docs\u002Fevaluation.md",", die\nVerarbeitung in ",[104,210,211],{},"supabase\u002Ffunctions\u002F",".",{"title":106,"searchDepth":214,"depth":214,"links":215},2,[216,217,218,219,220,221,222],{"id":20,"depth":214,"text":21},{"id":49,"depth":214,"text":50},{"id":59,"depth":214,"text":60},{"id":91,"depth":214,"text":92},{"id":148,"depth":214,"text":149},{"id":161,"depth":214,"text":162},{"id":180,"depth":214,"text":181},"Warum ich meine Dokumentenablage mit OCR, Tags und Chat selbst gebaut habe, statt Paperless-ngx und Erweiterungen zu verbinden. Was die Evaluation zeigte und wie es ein halbes Jahr später aussieht.","md",{},true,"\u002Fopen-source\u002Fdms-selbst-gebaut",null,{"title":5,"description":223},"open-source\u002Fdms-selbst-gebaut","MxutseHqDrk4OJsEyoKeMUlokAApCrWQJYOuUEZkEVA",1790517213098]