Use ParseOtter for free at https://www.parseotter.com/.
ParseOtter is a free-to-use PDF/EPUB-to-Markdown conversion service and an open-source, self-hostable implementation powered by Cloudflare Workers, R2, D1, Durable Objects, Modal GPU inference, and marker-pdf.
Try the hosted service · Self-hosting guide · Public examples · Architecture
| Feature | Description | |
|---|---|---|
| 📄 | PDF & EPUB conversion | Upload any PDF or EPUB file and get clean, structured Markdown output |
| 🖼️ | Image extraction | Figures, diagrams, and embedded images are extracted and included in the result |
| 👀 | Live Markdown preview | Preview converted Markdown directly in the browser before downloading |
| 📦 | ZIP download | Get a ZIP archive containing the Markdown file plus all extracted assets |
| ⚡ | GPU-powered | Conversion runs on Modal GPUs using marker-pdf for high-quality OCR and layout analysis |
| 🔒 | No account required | Upload and convert instantly — no signup, no login, no tracking |
| 🛠️ | Self-hostable | Deploy your own instance on Cloudflare Workers + Modal with full control over data and privacy |
- Upload — drag and drop a PDF or EPUB file in the browser
- Convert — the file is uploaded directly to Cloudflare R2, then dispatched to a GPU worker for conversion
- Preview & download — view the Markdown in-browser or download a ZIP with the Markdown and extracted images
Results are retained for 48 hours by default. No files are stored permanently.
The public hosted service is available at https://www.parseotter.com/. You can convert PDF and EPUB files to Markdown there without deploying this repository.
Use the repository when you want to run your own instance, inspect the architecture, or contribute changes.
ParseOtter is not just a converter wrapper. It is a complete, inspectable async document conversion service:
- Browser uploads go directly to Cloudflare R2 through multipart upload sessions.
- The API Worker owns task creation, status polling, download links, feedback, quotas, and retention metadata.
- Durable Objects coordinate per-task state.
- Modal GPU jobs run
marker-pdfconversion and call the Worker back with HMAC-signed results. - Users get Markdown preview in the browser and a ZIP download containing Markdown plus extracted assets.
That makes ParseOtter useful when private documents, repeatable deployments, auditability, or AI/RAG ingestion workflows matter more than a one-off hosted upload form.
- AI and RAG developers who need Markdown plus extracted assets from PDF or EPUB sources.
- Documentation and knowledge-base teams preparing documents for search, ingestion, or review.
- Self-hosters who want an auditable document conversion pipeline.
- Operators who need explicit storage, retention, rate limiting, and callback behavior.
- Contributors who want a production-style Cloudflare Workers and Modal example to inspect or extend.
- Browser upload UI for PDF and EPUB files.
- Direct multipart uploads from the browser to Cloudflare R2.
- Cloudflare Worker API for task creation, upload orchestration, polling, feedback, and downloads.
- D1 task state, feedback, abuse counters, and retention metadata.
- Durable Object coordination per conversion task.
- Modal GPU conversion backend using
marker-pdf. - Markdown preview and ZIP download with extracted assets.
- Default 48-hour result retention.
- Turnstile, rate limiting, anonymous usage controls, and HMAC-signed Modal callbacks.
- Conversion quality depends on upstream
marker-pdfbehavior and the source document layout. - Complex tables, scanned documents, math-heavy PDFs, multi-column papers, and unusual encodings may need manual review or future conversion controls.
- The hosted service is designed for interactive conversion, not unlimited batch ingestion.
- Self-hosted deployments require Cloudflare and Modal resources; a one-command local-only deployment is not included yet.
- Result retention is intentionally short by default. Operators should adjust retention, privacy notices, and access controls for their own environment.
The stack has three deployable parts:
frontend: React + Vite app deployed as a Cloudflare Worker static asset app.api-worker: Hono API deployed to Cloudflare Workers with D1, R2, Durable Objects, Cron, and Worker secrets.modal-converter: Python 3.13 Modal app that runs GPU conversion jobs and calls the Worker back with signed results.
Install local dependencies:
cd frontend
yarn install
cd ../api-worker
yarn install
cd ../modal-converter
uv syncRun local checks:
cd frontend
yarn typecheck
yarn test
yarn build
cd ../api-worker
yarn cf-typegen
yarn typecheck
yarn test
cd ../modal-converter
uv run pytestFor a full self-hosted deployment, start with DEPLOYMENT.md. Use fresh D1/R2/Modal resources for a first public install.
Public example names use ParseOtter placeholders:
- Frontend Worker:
parseotter-web,parseotter-web-production - API Worker:
parseotter-api,parseotter-api-production - D1:
parseotter-tasks-dev,parseotter-tasks-production - R2:
parseotter-files-dev,parseotter-files-production - Modal app:
parseotter-converter-dev,parseotter-converter-production
Checked-in routes use example.com, yourdomain.com, and your-*.workers.dev placeholders. Replace every account ID, database ID, bucket name, endpoint, domain, and secret before deploying.
In the default deployment model:
- Uploaded source files and result ZIPs are stored in Cloudflare R2.
- Task metadata, feedback, usage counters, and retention timestamps are stored in Cloudflare D1.
- Result access expires after 48 hours by default.
- A Worker Cron cleanup marks expired tasks and deletes recorded R2 input/output objects.
- Browser local history is stored only in the user's browser local storage.
Self-hosters are responsible for their own privacy policy, user notices, Cloudflare/Modal configuration, data retention settings, logs, access controls, and abuse handling.
- Deployment guide
- Public conversion examples
- Frontend README
- API Worker README
- Modal Converter README
- Public assets
- Security policy
- Contributing
- Changelog
- Roadmap
- Fixture provenance
- v0.1.2 release notes
- v0.1.1 release notes
- v0.1.0 release notes
ParseOtter builds on:
AGPL-3.0. See LICENSE.
