No description
Find a file
Pier-Jean Malandrino e74c788ad4
Merge pull request #32 from scub-france/feature/include-chunking
Feature/include chunking
2026-04-02 12:38:08 +02:00
.github/workflows Add missing config for doc publication 2026-03-23 10:25:55 +01:00
docs Add GIF in README 2026-03-23 10:55:54 +01:00
document-parser Add chunking tests and update existing test assertions 2026-04-02 12:33:07 +02:00
frontend Add frontend chunking feature with Prepare mode 2026-04-02 12:33:07 +02:00
.dockerignore Add docker push 2026-03-20 18:26:20 +01:00
.editorconfig Add qualityt check and contributing doc 2026-03-21 15:34:54 +01:00
.env.example Radical architecture change, migration to a more lightweight 2026-03-17 16:06:27 +01:00
.gitignore Add feature flipping mechanism 2026-04-02 11:25:23 +02:00
CHANGELOG.md Add qualityt check and contributing doc 2026-03-21 15:34:54 +01:00
CONTRIBUTING.md Migrate frontend in typescript 2026-03-21 15:58:43 +01:00
docker-compose.yml Refacto and add cp paste btn 2026-03-21 15:03:10 +01:00
Dockerfile Refacto and add cp paste btn 2026-03-21 15:03:10 +01:00
LICENSE Work on full Docker integration 2026-03-17 13:33:36 +01:00
mkdocs.yml Build true detailed documentaiton 2026-03-22 08:56:00 +01:00
nginx.conf Refacto and add cp paste btn 2026-03-21 15:03:10 +01:00
README.md Add GIF in README 2026-03-23 10:55:54 +01:00

Docling Studio

License: MIT Python Node Docling CI

A visual document analysis studio powered by Docling. Upload a PDF, configure the extraction pipeline, and visualize the results — text, tables, images, formulas, bounding boxes — all from your browser.

Docling Studio — Presentation

Features

  • Home page with quick upload and recent documents
  • PDF viewer with page navigation, bounding box overlay, and resizable results panel
  • Configurable Docling pipeline — OCR, table extraction, code/formula enrichment, picture classification & description, image generation
  • Bounding box visualization — color-coded element overlay directly on the PDF
  • Per-page results — right panel syncs with the current PDF page
  • Markdown & HTML export of extracted content
  • Document management — upload, list, delete
  • Analysis history — re-visit and open past analyses
  • Dark / Light theme and FR / EN localization

Architecture

┌────────────┐         ┌──────────────────────┐
│  Frontend  │────────▶│   Document Parser    │
│  Vue 3     │  /api/* │ FastAPI + Docling    │
│  port 3000 │         │ SQLite + file storage│
└────────────┘         │   port 8000          │
                       └──────────────────────┘
Service Stack Role
frontend Vue 3, TypeScript, Vite, Pinia UI, PDF viewer, results display
document-parser FastAPI, Docling, SQLite, pdf2image REST API, document parsing, storage

Backend structure (clean architecture)

document-parser/
├── main.py                   # FastAPI app, CORS, lifespan
├── domain/                   # Pure domain — no HTTP, no DB
│   ├── models.py             # Document, AnalysisJob dataclasses
│   ├── parsing.py            # Docling conversion & page extraction
│   └── bbox.py               # Bounding box coordinate normalization
├── api/                      # HTTP layer (FastAPI routers)
│   ├── schemas.py            # Pydantic DTOs (camelCase serialization)
│   ├── documents.py          # /api/documents endpoints
│   └── analyses.py           # /api/analyses endpoints
├── persistence/              # Data layer (SQLite via aiosqlite)
│   ├── database.py           # Connection management, schema init
│   ├── document_repo.py      # Document CRUD
│   └── analysis_repo.py      # AnalysisJob CRUD
├── services/                 # Use case orchestration
│   ├── document_service.py   # Upload, delete, preview
│   └── analysis_service.py   # Async Docling processing
└── tests/                    # 99 tests (pytest)

Frontend structure (feature-based)

frontend/src/
├── app/                      # App shell, router, global styles
├── pages/                    # Route-level pages
│   ├── HomePage.vue          # Landing page with upload & stats
│   ├── StudioPage.vue        # PDF viewer + config + results
│   ├── DocumentsPage.vue     # Document management
│   ├── HistoryPage.vue       # Past analyses
│   └── SettingsPage.vue      # Theme, language, API URL
├── features/                 # Feature modules
│   ├── analysis/             # Analysis store, API, bbox, UI components
│   ├── document/             # Document store, API, upload, list
│   ├── history/              # History store, API, navigation
│   └── settings/             # Settings store
└── shared/                   # Shared utilities (types, i18n, http, format)

Quick Start

Docker (fastest)

docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:latest

Open http://localhost:3000

Note: The first analysis takes longer as Docling downloads its ML models (~400 MB). Subsequent runs are fast.

Docker Compose (for development)

git clone https://github.com/scub-france/Docling-Studio.git
cd Docling-Studio
docker compose up --build

Local Development

Backend (Python 3.12+):

cd document-parser
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload --port 8000

Frontend (Node 20+):

cd frontend
npm install
npm run dev

Running Tests

# Backend (99 tests)
cd document-parser
pip install pytest pytest-asyncio httpx
pytest tests/ -v

# Frontend (81 tests)
cd frontend
npm run test:run

Pipeline Options

These options map directly to Docling's PdfPipelineOptions. See the Docling documentation for details on each feature.

Option Default Description
do_ocr true OCR for scanned pages and embedded images
do_table_structure true Table detection and row/column reconstruction
table_mode accurate accurate (TableFormer) or fast
do_code_enrichment false Specialized OCR for code blocks
do_formula_enrichment false Math formula recognition (LaTeX output)
do_picture_classification false Classify images by type (chart, photo, diagram…)
do_picture_description false Generate image descriptions via VLM
generate_picture_images false Extract detected images as separate files
generate_page_images false Rasterize each page as an image
images_scale 1.0 Scale factor for generated images (0.110)

Configuration

All configuration is done via environment variables. See .env.example.

Variable Default Description
CORS_ORIGINS http://localhost:3000,... CORS allowed origins (comma-separated)
UPLOAD_DIR ./uploads File storage directory
DB_PATH ./data/docling_studio.db SQLite database path
CONVERSION_TIMEOUT 600 Max seconds for a single Docling conversion

CI / Release

GitHub Actions pipelines (see .github/workflows/):

Workflow Trigger What it does
CI push to main, pull requests Lint + type check + Backend tests (99) + Frontend tests (81) + build
Release push tag v* Build & push multi-arch Docker image to ghcr.io

To publish a new version:

git tag v0.2.0
git push origin v0.2.0

Performance & System Requirements

Document type Pages Approx. time (CPU)
Simple report 510 ~30s1 min
Research paper 1030 ~12 min
Large document 100+ ~25 min

Docker Desktop settings

The document parser needs at least 4 GB of RAM:

Resource Minimum Recommended
Memory 6 GB 8 GB+
CPUs 4 8+

Platform support

All Docker images are multi-arch (linux/amd64 + linux/arm64). No GPU required.

Tech Stack

  • Frontend: Vue 3, TypeScript, Vite, Pinia, DOMPurify
  • Backend: FastAPI, Docling 2.x, SQLite (aiosqlite), pdf2image
  • CI: GitHub Actions
  • Infra: Docker Compose + Nginx

Contributing

Contributions are welcome! Please open an issue first to discuss what you'd like to change.

License

MIT — Pier-Jean Malandrino