CoolFace
Apppublic

lamhieu/docsifer

sourceHugging Facemitupdated 4mo agoView on Hugging Face
13likes
App README

<div align="center">

๐Ÿ“š Docsifer

Convert documents into clean, LLM-ready Markdown.

PDF ยท Word ยท PowerPoint ยท Excel ยท HTML ยท Audio ยท Image ยท CSV ยท JSON ยท ZIP

![Python](#) ![FastAPI](#) ![Docker](#) ![License](LICENSE)

</div>


Features

  • โ€”Multi-format โ€” PDF, Office, audio (Whisper), images (vision), HTML, CSV, JSON, ZIP, and more โ€” powered by MarkItDown.
  • โ€”Optional LLM โ€” bring your own OpenAI-compatible key for OCR, transcription and structured layout extraction.
  • โ€”Production-grade โ€” bounded concurrency, per-IP fairness, memory watchdog, disk cleanup, circuit breaker.
  • โ€”Hardened โ€” SSRF guard, path-traversal sanitation, body-size limits, security headers.
  • โ€”Observable โ€” JSON logs with request id, /v1/healthz, /v1/readyz, /v1/stats.
  • โ€”Privacy-first โ€” files are processed in-memory and discarded immediately.

Quickstart

bash
# Local
make install
cp .env.example .env
make run

# Docker
docker build -t docsifer .
docker run --rm -p 7860:7860 --env-file .env docsifer

Open <http://localhost:7860> for the UI or <http://localhost:7860/docs> for the API.

API

MethodPathDescription
POST/v1/convertConvert a file or URL to Markdown
GET/v1/statsUsage analytics snapshot
GET/v1/healthzLiveness probe
GET/v1/readyzReadiness probe

Examples

Basic conversion:

bash
curl -X POST http://localhost:7860/v1/convert \
     -F "file=@document.pdf"

With LLM enhancement:

bash
curl -X POST http://localhost:7860/v1/convert \
     -F "file=@page.html" \
     -F 'openai={"api_key":"sk-...","model":"gpt-4o-mini"}'

Convert a URL:

bash
curl -X POST http://localhost:7860/v1/convert \
     -F "url=https://example.com/article"

Configuration

All settings are environment-driven (prefix DOCSIFER_). See `.env.example` for the full list. Common knobs:

VariableDefaultPurpose
DOCSIFER_MAX_UPLOAD_BYTES10MBHard upload limit
DOCSIFER_MAX_CONCURRENT_CONVERSIONS2Global parallelism
DOCSIFER_MAX_QUEUE_DEPTH10Reject 503 when exceeded
DOCSIFER_MAX_PER_IP_CONCURRENT1Per-IP fairness
DOCSIFER_REQUEST_TIMEOUT_SEC55Conversion timeout
DOCSIFER_REDIS_URL / _TOKENlocalUpstash Redis for analytics
DOCSIFER_URL_ALLOW_PRIVATE_NETWORKSfalseDisable to block SSRF

Architecture

docsifer/
โ”œโ”€โ”€ api/         FastAPI layer โ€” routes, schemas, middleware
โ”œโ”€โ”€ core/        Pure logic โ€” converter, MIME, tokenizer, LLM cache
โ”œโ”€โ”€ analytics/   Lifespan-managed analytics (Upstash + in-memory)
โ”œโ”€โ”€ safety/      Anti-crash primitives (gate, limiter, watchdog, breaker)
โ”œโ”€โ”€ ui/          Optional Gradio playground
โ”œโ”€โ”€ config.py    Pydantic settings
โ”œโ”€โ”€ exceptions.py
โ”œโ”€โ”€ logging_config.py
โ””โ”€โ”€ main.py      App factory + lifespan

See `ARCHITECTURE.md` for the full design notes.

Development

bash
make install   # runtime + dev deps
make lint      # ruff
make format    # ruff format
make type      # mypy
make test      # pytest
make cov       # pytest with coverage

License

MIT ยฉ Lam Hieu โ€” built on top of the wonderful MarkItDown.