Vlastní DMS, protože nás všechno štvalo
Document Management System s real-time spoluprací, dvěma editory a full-text vyhledáváním v češtině. Jeden nástroj místo pěti — od editace přes review až po export, bez opouštění platformy.
Klient
Appitect (interní)
Typ
Webová aplikace · DMS
Doba vývoje
9 týdnů
Launch
Q4 2025

O projektu
Klient a cíl
Interní nástroj pro správu dokumentů, který nahradí chaos z pěti různých nástrojů — Google Docs, Notion, random Markdown soubory, Word dokumenty posílané e-mailem. Jedno místo pro všechno.
Cílem bylo vytvořit platformu, kam hodíte dokument, rychle ho zeditujete, pošlete kolegovi na review a když je potřeba — necháte ho podepsat. Bez měsíčních plateb za pět služeb zvlášť.
Scope
- ✓File management se složkami, tagy a drag & drop
- ✓Rich-text editor (TipTap) + code editor (Monaco)
- ✓Real-time spolupráce přes Yjs CRDT
- ✓Full-text vyhledávání s českým stemmingem
- ✓Verzování dokumentů s rollbackem a export do PDF/DOCX
Výzva
Každý vývojářský tým má dokumenty — smlouvy, nabídky, interní poznámky, technické specifikace, zápisy z meetingů. A každý tým řeší to samé: kam to dát? Google Docs na spolupráci, Notion na interní wiki, random Markdown soubory v repozitářích, Word dokumenty posílané e-mailem tam a zpátky. Polovina věcí v jednom nástroji, polovina v druhém, nikdo neví kde je ta poslední verze.
Google Docs je super na spolupráci, ale nemá žádnou organizaci. Notion je hezký, ale podepisovat v něm smlouvy nemůžete. Pandadoc stojí majlant a dělá víc než potřebujete. A české nástroje na DMS vypadají jak z roku 2008. Chtěli jsme jedno místo pro správu, editaci, review a podpis dokumentů — s moderním UX a bez kompromisů.
Proces vývoje
Discovery (1 týden)
Seznam 40 bodů frustrací se stávajícím workflow, prioritizace na 6 core funkcí, výběr stacku
Backend (2 týdny)
JWT autentizace, Google OAuth, 2FA. File management s hierarchickými složkami, verzováním a soft-delete. 18+ NestJS modulů
Frontend (2 týdny)
Dashboard jako file browser, TipTap + Monaco editory, TailwindCSS s custom theme a tmavým režimem jako default
Real-time & pokročilé funkce (3 týdny)
Yjs CRDT spolupráce, šablony, smart folders, full-text search, verzování, export do PDF/DOCX
Technické řešení
Frontend
- Next.js 16 (App Router)
- React 19
- TipTap Editor
- Monaco Editor
Backend & Infrastruktura
- NestJS 10 + TypeScript
- TypeORM + PostgreSQL
- Yjs WebSocket Server
- Docker + Sentry
Služby & Integrace
- PostgreSQL FTS (tsvector)
- Puppeteer (PDF export)
- TailwindCSS
- JWT + Google OAuth + 2FA
Screenshots



Klíčové funkce
Dva editory, jedno ukládání
TipTap pro rich-text dokumenty (smlouvy, nabídky, zápisy) a Monaco Editor pro kód a konfiguráky. Oba sdílí stejné verzování a ukládání, ale UX je úplně jiné.
Real-time spolupráce přes CRDT
Yjs CRDT framework umožňuje simultánní editaci bez zamykání a merge konfliktů. Kurzory ostatních uživatelů vidíte v reálném čase, offline edity se synchronizují automaticky.
Verzování a rollback
Každá uložená verze dokumentu se archivuje s možností okamžitého rollbacku. Hierarchické složky, soft-delete s košem a tagging systém pro rychlou organizaci.
Full-text search v češtině
PostgreSQL tsvector s GIN indexem prohledává obsah i metadata. České stemming funguje díky unaccent extension. Response time pod 100ms i na tisících dokumentů.
Smart folders s dynamickými filtry
Dynamické složky s filtry — například „Všechny smlouvy starší než rok, které ještě nebyly podepsané.“ Aktualizují se automaticky podle zadaných pravidel.
Šablony a export do PDF/DOCX
Firemní šablony pro opakující se dokumenty (NDA, smlouva o dílo, cenová nabídka). Server-side rendering do PDF přes Puppeteer, DOCX a HTML s konzistentním stylováním.
Technické výzvy
CRDT vs. Operational Transform pro real-time editaci
Výzva
Potřebovali jsme bezkonfliktní simultánní editaci dokumentů více uživateli. Operational Transform (jak ho používá Google Docs) je složitý na implementaci a má edge cases, které se těžko řeší.
Řešení
Zvolili jsme Yjs s CRDT — jednodušší, robustnější a zvládne offline-first scénáře out of the box. Standalone WebSocket server na portu 3002 s JWT autentizací, automatickým čištěním rooms po 5 minutách neaktivity a IndexedDB perzistencí pro offline edity.
Full-text search v češtině bez Elasticsearch
Výzva
Potřebovali jsme full-text vyhledávání, které funguje i s českou diakritikou, skloňováním a překlepy. Elasticsearch by přidal další závislost a komplexitu do infrastruktury.
Řešení
PostgreSQL tsvector s GIN indexem a unaccent extension pro český stemming. Pro většinu use cases je to víc než dostatečné — pod 100ms response time i na tisících dokumentů a o jednu závislost míň v infrastruktuře.
Modulární architektura s 18+ moduly
Výzva
Projekt pokrývá autentizaci, file management, editaci, verzování, šablony, search a další. Bez jasné architektury by kód rychle zkorodoval.
Řešení
Každá feature je samostatný NestJS modul se svým controllerem, servicem, DTOs a entitami. Rate limiting per-endpoint, storage kvóty per-user, globální error handling přes Sentry. Celkem 18+ modulů s jasně definovanými hranicemi.
Čísla
~25 000
Řádky kódu
18+
NestJS moduly
< 50ms (p95)
Backend response
< 50ms
WebSocket latence
< 100ms
Full-text search
95+
Lighthouse
Co jsme se naučili
CRDT > OT
Operational Transform je složitý na implementaci a má edge cases. Yjs s CRDT je jednodušší, robustnější a zvládne offline-first scénáře out of the box.
PostgreSQL FTS stačí
Nemusíte tahat Elasticsearch pro full-text search. Pro většinu use cases je PostgreSQL tsvector s GIN indexem víc než dostatečný — a máte o jednu závislost míň.
Modulární NestJS architektura
Každá feature jako samostatný modul se svým controllerem, servicem a entitami. 18+ modulů s jasně definovanými hranicemi — kód se nehroutí ani po měsících vývoje.
Celý stack v TypeScriptu
Frontend i backend ve stejném jazyce. Sdílíme mentální model, typy i konvence — žádné přepínání kontextu mezi jazyky a rychlejší onboarding nových členů týmu.
Výsledek
Docline dnes používáme interně pro správu všech dokumentů — smlouvy, nabídky, interní poznámky, technické specifikace. Jeden nástroj místo pěti. Real-time spolupráce funguje bez přemýšlení, full-text search najde cokoli během milisekund a export do PDF zvládneme na jedno kliknutí.
Projekt zároveň slouží jako referenční ukázka toho, co dokážeme jako tým dodat — od prázdného repozitáře po production-ready aplikaci s 2FA autentizací a real-time spoluprací. Celý stack TypeScript, ~25 000 řádek kódu, 9 týdnů vývoje.
Potřebujete vlastní interní nástroj?
Rádi s vámi probereme, jak můžeme vytvořit aplikaci na míru vašim potřebám — od prvního wireframu po production deploy.