[{"data":1,"prerenderedAt":232},["ShallowReactive",2],{"seite-\u002Fit\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_it\u002Fopen-source\u002Fdms-selbst-gebaut.md","Tre programmi o uno proprio",{"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},"tre-programmi-o-uno-proprio",[14,15,16],"p",{},"Nel febbraio 2026 volevo liberarmi delle mie carte: fatture, contratti,\nlettere del medico, documenti fiscali. Fotografarli o caricarli come PDF, il\nresto doveva andare da sé. Prima ho esaminato oltre 30 progetti open source,\npoi l’ho costruito da solo. Questo articolo spiega perché, e com’è la\nsituazione sei mesi dopo.",[18,19,21],"h2",{"id":20},"cinque-requisiti-e-un-laptop-debole","Cinque requisiti e un laptop debole",[14,23,24],{},"L’elenco era breve, e ogni punto era obbligatorio:",[26,27,28,32,35,38,41],"ol",{},[29,30,31],"li",{},"Caricamento di foto e PDF con un archivio alle spalle",[29,33,34],{},"Riconoscimento del testo (OCR) tramite Mistral OCR",[29,36,37],{},"Tag che derivano dal contenuto, senza che debba assegnarli io",[29,39,40],{},"Ricerca full-text e una chat che risponde a domande su tutti i documenti",[29,42,43],{},"Un’unica interfaccia per tutto",[14,45,46],{},"Il punto 2 veniva dall’hardware. Il mio laptop ha 4 GB di memoria grafica e\npoca RAM. MinerU richiede da 16 a 32 GB, Docling ha picchi da 3 a 4 GB,\nPaddleOCR vuole una GPU seria. Un riconoscimento del testo locale di buona\nqualità era quindi escluso.",[18,48,50],{"id":49},"lo-schema-nella-valutazione","Lo schema nella valutazione",[14,52,53],{},"Ho esaminato archivi di documenti come Paperless-ngx, Papermerge, Docspell,\nMayan EDMS e Teedy, strumenti RAG come AnythingLLM, kotaemon, Open WebUI,\nDify e RAGFlow, e in più sistemi ERP con un modulo documenti. Ogni progetto\nha avuto una riga, ogni requisito una colonna.",[14,55,56],{},"Dopo qualche riga lo schema era chiaro. Gli archivi sapevano archiviare,\nassegnare tag e cercare, ma non rispondere a domande. Gli strumenti RAG\nsapevano rispondere a domande, ma non archiviare nulla: niente cartelle,\nniente tag per documento, nessun archivio da sfogliare. Ogni gruppo aveva\nesattamente la metà.",[18,58,60],{"id":59},"la-combinazione-migliore-erano-tre-programmi","La combinazione migliore erano tre programmi",[14,62,63],{},"Il più vicino era Paperless-ngx con due estensioni:",[65,66,67,74,80],"ul",{},[29,68,69,73],{},[70,71,72],"strong",{},"Paperless-ngx"," come archivio con ricerca full-text",[29,75,76,79],{},[70,77,78],{},"paperless-gpt"," per Mistral OCR e tag tramite modello linguistico",[29,81,82,85],{},[70,83,84],{},"paperless-ai"," per la chat su tutti i documenti",[14,87,88],{},"Sono tre programmi con tre interfacce, tre configurazioni e due indici che\ndevono corrispondere all’archivio. Chi carica un documento va in\nun’interfaccia; chi fa una domanda, in un’altra. Proprio questo non lo\nvolevo. Il requisito 5 è stato il motivo per costruirlo da solo.",[18,90,92],{"id":91},"che-cosa-è-nato-al-suo-posto","Che cosa è nato al suo posto",[14,94,95],{},"Il DMS è un’interfaccia Vue 3 con PrimeVue su Supabase: PostgreSQL con\npgvector per i vettori, Storage per i file, Edge Functions per\nl’elaborazione. Un caricamento passa per quattro fasi:",[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"," calcola lo SHA-256 del file e rifiuta i doppioni.\n",[104,114,115],{},"process-ocr"," estrae in locale i PDF con livello di testo e manda a Mistral\nOCR solo foto e scansioni. ",[104,118,119],{},"extract-data"," determina il tipo di documento,\nestrae secondo uno schema campi come importo e scadenza e assegna i tag.\n",[104,122,123],{},"generate-embed"," suddivide il testo in sezioni da 1000 caratteri che si\nsovrappongono di 200, e ne salva i vettori.\nSe una fase fallisce, l’errore compare sul documento.",[14,126,127,128,131],{},"La ricerca combina entrambe le cose che PostgreSQL offre già: la ricerca\nfull-text in tedesco con ",[104,129,130],{},"tsvector"," e la ricerca vettoriale con pgvector,\nponderate con 0,4 e 0,6. La chat recupera le sezioni pertinenti tramite la\nstessa ricerca e per ogni risposta indica i documenti da cui proviene.",[14,133,134],{},"Poiché tutto sta in un unico database, anche i permessi valgono in un unico\npunto. Un team può riservare tipi di documento come i certificati di salario\nai soli admin. La funzione di ricerca filtra secondo le stesse regole della\nlista dei documenti, perciò un documento bloccato non finisce né tra i\nrisultati né come fonte nella chat. Con tre programmi ogni indice avrebbe\ndovuto replicare i permessi dell’archivio.",[14,136,137,138,145],{},"Nessuna parte dell’applicazione chiama Mistral direttamente. Tutte le\nchiamate passano per un ",[139,140,144],"a",{"href":141,"rel":142},"https:\u002F\u002Fgithub.com\u002Fgstrainovic\u002Fai-proxy",[143],"nofollow","proxy proprio",",\nche custodisce la chiave e conta il consumo per organizzazione.",[18,147,149],{"id":148},"mistral-ocr-era-la-scelta-giusta","Mistral OCR era la scelta giusta?",[14,151,152],{},"A febbraio era l’unica che il laptop consentiva. A settembre ho misurato di\nnuovo: Mistral OCR contro i modelli di visione che Infomaniak e kvant offrono\nin Svizzera, con documenti sintetici e reali, puliti e distorti.",[14,154,155],{},"Con scansioni pulite, i grandi modelli di visione come Kimi K2.6 e Qwen3.5\nsono altrettanto buoni o migliori, ma più lenti e più cari. Non appena\nl’originale diventa difficile, Mistral OCR è in testa: con pagine distorte e\ntabelle fitte ha trovato il 91 % delle celle, i modelli di visione al massimo\nl’82 %. Con documenti svizzeri come le QR-fatture e i certificati di salario\nha commesso meno errori di carattere, con vere foto da smartphone ha trovato\ndal 97 al 99 % dei campi.",[14,157,158],{},"Per la protezione dei dati Mistral non è la scelta migliore, ma una scelta\nammessa. I server si trovano in Francia, e la legge svizzera sulla protezione\ndei dati consente il trasferimento nell’UE senza ulteriori garanzie. Un\nfornitore svizzero sarebbe migliore per l’ubicazione. La regola per il test\nera quindi: qualità prima dell’ubicazione. I dettagli arriveranno in un\narticolo a parte.",[18,160,162],{"id":161},"comè-la-situazione-oggi","Com’è la situazione oggi",[14,164,165],{},"Per questo articolo ho ripetuto la valutazione nel settembre 2026. Il settore\nsi muove in fretta: alcuni progetti hanno aggiunto Mistral OCR, Papermerge\ncerca nuovi maintainer, OpenKM distribuisce ormai la sua versione community\nsolo senza codice sorgente.",[14,167,168],{},"Il cambiamento più grande riguarda Paperless-ngx. La versione 3.0 è uscita nel\nluglio 2026 con IA integrata: suggerimenti per titolo, tag e tipo di documento e una chat\nsu uno o più documenti, con link alle fonti. Come modello linguistico serve\nOllama o qualsiasi API compatibile con OpenAI. Il riconoscimento del testo nel\ncloud Paperless-ngx lo offre di suo solo tramite Azure. Mistral OCR e i tag\ngià all’importazione li porta ancora paperless-gpt. paperless-ai, secondo il\nsuo README, non è più mantenuto.",[14,170,171],{},"Papra, un archivio snello, ha da luglio Mistral OCR e tag tramite modello\nlinguistico. Le manca solo la chat.",[14,173,174],{},"Da tre programmi si è quindi passati a due. Chi oggi vuole un archivio privato\ncon chat e può convivere con due interfacce dovrebbe provare prima\nPaperless-ngx 3 con paperless-gpt. È più maturo di quanto il mio progetto\npossa diventare in sei mesi.",[14,176,177],{},"Costruirlo da sé conviene quando uno dei cinque requisiti non è negoziabile,\noppure quando l’archivio deve funzionare per altri. Organizzazioni con ruoli,\npermessi per tipo di documento fin dentro la chat, consumo per\norganizzazione: tutto questo si aggiunge a fatica a tre programmi collegati.",[18,179,181],{"id":180},"che-cosa-si-può-trasferire","Che cosa si può trasferire",[65,183,184,187,190,193],{},[29,185,186],{},"Scrivere i requisiti come colonne prima di compilare la prima riga, e\nannotare per ogni cella la fonte.",[29,188,189],{},"Cercare schemi, non il vincitore. «Ogni gruppo ha la metà» dice di più di\ntrenta giudizi singoli.",[29,191,192],{},"Contare le combinazioni: tre programmi che insieme sanno fare tutto sono una\nsoluzione a sé, con un proprio onere di manutenzione.",[29,194,195],{},"Ripetere la valutazione prima di una decisione, se ha più di qualche mese.\nIn questo campo in sei mesi cambia molto.",[14,197,198,199,204,205,208,209,212],{},"Il codice sorgente è aperto:\n",[139,200,203],{"href":201,"rel":202},"https:\u002F\u002Fgithub.com\u002Fgstrainovic\u002Fdms",[143],"github.com\u002Fgstrainovic\u002Fdms",". La\nvalutazione completa con entrambi gli stati si trova in ",[104,206,207],{},"docs\u002Fevaluation.md",",\nl’elaborazione 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},"Perché ho costruito da solo il mio archivio di documenti con OCR, tag e chat, invece di collegare Paperless-ngx ed estensioni. Che cosa ha mostrato la valutazione e com’è la situazione sei mesi dopo.","md",{},true,"\u002Fopen-source\u002Fdms-selbst-gebaut",null,{"title":5,"description":223},"open-source\u002Fdms-selbst-gebaut","M4ryxAlOwJbT7TF3PCg5Nd0L-WzGSDlFteijn9g39i4",1790517213152]