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

Docline - Dashboard Document Management System vytvořený Appitect

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

1

Discovery (1 týden)

Seznam 40 bodů frustrací se stávajícím workflow, prioritizace na 6 core funkcí, výběr stacku

2

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ů

3

Frontend (2 týdny)

Dashboard jako file browser, TipTap + Monaco editory, TailwindCSS s custom theme a tmavým režimem jako default

4

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

Docline - TipTap rich-text editor pro dokumenty
Docline - Monaco code editor pro kód a konfigurace
Docline - Full-text vyhledávání v češtině

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.