diff --git a/README.md b/README.md index e69de29..b5b2c39 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,93 @@ +# MarkItDown + +Self-hosted document-to-Markdown converter running on `labmini-01` at `md.carloselugo.com`. + +Built with FastAPI + [markitdown](https://github.com/microsoft/markitdown) by Microsoft. Drop any document, get clean Markdown output in the browser. + +--- + +## Stack + +| Layer | Tech | +|---|---| +| Backend | FastAPI + markitdown | +| Server | Uvicorn (python:3.12-slim) | +| Reverse proxy | Caddy (automatic SSL) | +| Container | Docker Compose | +| Network | `web_web-net` (shared with main stack) | + +--- + +## Supported Formats + +| Category | Formats | +|---|---| +| Documents | PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, EPUB, MSG | +| Web / Data | HTML, HTM, CSV, JSON, XML | +| Archives | ZIP (converts each file inside) | +| Images | PNG, JPG, JPEG, GIF, WEBP, BMP (OCR via AI) | +| Audio | MP3, WAV, M4A (transcription via AI) | +| Text | TXT, MD, RST | + +Max file size: **50 MB** + +--- + +## File Structure + +``` +/opt/markitdown/ +├── docker-compose.yaml +├── Dockerfile +├── main.py # FastAPI app — /convert endpoint +├── requirements.txt +├── static/ # Empty — assets are inline +└── templates/ + └── index.html # UI: drag & drop, output panel +``` + +--- + +## API + +| Method | Path | Description | +|---|---|---| +| GET | `/` | Web UI | +| POST | `/convert` | Upload file, returns `{ markdown, filename, size_kb, chars }` | + +### Example + +```bash +curl -X POST https://md.carloselugo.com/convert \ + -F "file=@document.pdf" | python3 -m json.tool +``` + +--- + +## Deploy + +```bash +cd /opt/markitdown +docker compose up -d --build +``` + +Caddy block in `/opt/web/Caddyfile`: + +```caddy +md.carloselugo.com { + import security_headers + reverse_proxy markitdown:8000 + log { + output file /var/log/caddy/markitdown.log + format json + } +} +``` + +--- + +## Notes + +- The `ffmpeg` warning on startup is harmless — only affects audio transcription, which requires an AI key to use. +- Images and audio transcription require an Anthropic or OpenAI API key passed to markitdown — not configured by default. +- Container runs on `web_web-net` so Caddy can resolve it by name. \ No newline at end of file