No description
|
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m17s
When renderUrlPdf() sets up request interception for SSRF DNS pinning,
the interceptor and event listener were never cleaned up in recyclePage().
This could cause subsequent HTML-to-PDF conversions on the same pooled
page to have external resources blocked by the stale interceptor.
- Export recyclePage for testability
- Add removeAllListeners('request') + setRequestInterception(false)
- Add browser-recycle.test.ts with TDD (red→green verified)
Tests: 443 passing (was 442)
|
||
|---|---|---|
| .forgejo/workflows | ||
| deploy | ||
| dist | ||
| infrastructure | ||
| public | ||
| scripts | ||
| sdk | ||
| src | ||
| templates/partials | ||
| .dockerignore | ||
| .gitignore | ||
| DEPLOYMENT.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| logrotate-docfast | ||
| nginx-docfast.conf | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| VERSION | ||
| vitest.config.ts | ||
DocFast API
Fast, reliable HTML/Markdown/URL to PDF conversion API. EU-hosted, GDPR compliant.
Website: https://docfast.dev Docs: https://docfast.dev/docs Status: https://docfast.dev/status
Features
- HTML → PDF — Full documents or fragments with optional CSS
- Markdown → PDF — GitHub-flavored Markdown with syntax highlighting
- URL → PDF — Render any public webpage as PDF (SSRF-protected)
- Invoice Templates — Built-in professional invoice template
- PDF Options — Paper size, orientation, margins, headers/footers, page ranges, scaling
Quick Start
1. Get an API Key
Sign up at https://docfast.dev — free demo available, Pro plan at €9/month for 5,000 PDFs.
2. Generate a PDF
curl -X POST https://docfast.dev/v1/convert/html \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Hello World</h1><p>Your first PDF.</p>"}' \
-o output.pdf
API Endpoints
Convert HTML to PDF
curl -X POST https://docfast.dev/v1/convert/html \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Hello</h1>", "format": "A4", "margin": {"top": "20mm"}}' \
-o output.pdf
Convert Markdown to PDF
curl -X POST https://docfast.dev/v1/convert/markdown \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"markdown": "# Hello\n\nWorld", "css": "body { font-family: sans-serif; }"}' \
-o output.pdf
Convert URL to PDF
curl -X POST https://docfast.dev/v1/convert/url \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "format": "A4", "landscape": true}' \
-o output.pdf
Invoice Template
curl -X POST https://docfast.dev/v1/templates/invoice/render \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"invoiceNumber": "INV-001",
"date": "2026-02-14",
"from": {"name": "Your Company", "email": "you@example.com"},
"to": {"name": "Client", "email": "client@example.com"},
"items": [{"description": "Consulting", "quantity": 10, "unitPrice": 150, "taxRate": 20}]
}' \
-o invoice.pdf
Demo (No Auth Required)
Try the API without signing up:
curl -X POST https://docfast.dev/v1/demo/html \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Demo PDF</h1><p>No API key needed.</p>"}' \
-o demo.pdf
Demo PDFs include a watermark and are rate-limited.
PDF Options
All conversion endpoints accept these options:
| Option | Type | Default | Description |
|---|---|---|---|
format |
string | "A4" |
Paper size: A4, Letter, Legal, A3, etc. |
landscape |
boolean | false |
Landscape orientation |
margin |
object | {top:"0",right:"0",bottom:"0",left:"0"} |
Margins in CSS units (px, mm, in, cm) |
printBackground |
boolean | true |
Include background colors/images |
filename |
string | "document.pdf" |
Suggested filename in Content-Disposition |
css |
string | — | Custom CSS (for HTML fragments and Markdown) |
scale |
number | 1 |
Scale (0.1–2.0) |
pageRanges |
string | — | Page ranges, e.g. "1-3, 5" |
width |
string | — | Custom page width (overrides format) |
height |
string | — | Custom page height (overrides format) |
headerTemplate |
string | — | HTML template for page header |
footerTemplate |
string | — | HTML template for page footer |
displayHeaderFooter |
boolean | false |
Show header/footer |
preferCSSPageSize |
boolean | false |
Use CSS @page size over format |
Authentication
Pass your API key via either:
Authorization: Bearer <key>headerX-API-Key: <key>header
Development
# Install dependencies
npm install
# Run in development mode
npm run dev
# Run tests
npm test
# Build
npm run build
# Start production server
npm start
Environment Variables
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
STRIPE_SECRET_KEY |
Yes | Stripe API key for billing |
STRIPE_WEBHOOK_SECRET |
Yes | Stripe webhook signature secret |
SMTP_HOST |
Yes | SMTP server hostname |
SMTP_PORT |
Yes | SMTP server port |
SMTP_USER |
Yes | SMTP username |
SMTP_PASS |
Yes | SMTP password |
BASE_URL |
No | Base URL (default: https://docfast.dev) |
PORT |
No | Server port (default: 3100) |
BROWSER_COUNT |
No | Puppeteer browser instances (default: 2) |
PAGES_PER_BROWSER |
No | Pages per browser (default: 8) |
LOG_LEVEL |
No | Pino log level (default: info) |
Architecture
- Runtime: Node.js + Express
- PDF Engine: Puppeteer (Chromium) with browser pool
- Database: PostgreSQL (via pg)
- Payments: Stripe
- Email: SMTP (nodemailer)
License
Proprietary — Cloonar Technologies GmbH