From 84aacf0f4f8c23a4f02a883b50d68c4008a14b92 Mon Sep 17 00:00:00 2001 From: Hoid Date: Mon, 16 Feb 2026 19:24:43 +0000 Subject: [PATCH] Add support@docfast.dev mailbox (FreeScout) to CEO state --- projects/business/memory/state.json | 2 + projects/business/src/pdf-api/Dockerfile | 2 + .../src/pdf-api/public/docs.html.server | 109 ---- .../src/pdf-api/public/impressum.html | 62 +- .../src/pdf-api/public/impressum.html.server | 108 ---- .../business/src/pdf-api/public/index.html | 7 +- .../src/pdf-api/public/index.html.server | 560 ------------------ .../src/pdf-api/public/partials/_footer.html | 14 + .../src/pdf-api/public/partials/_modals.html | 42 ++ .../src/pdf-api/public/partials/_nav.html | 10 + .../pdf-api/public/partials/_nav_index.html | 10 + .../pdf-api/public/partials/_styles_base.html | 37 ++ .../_styles_index.html} | 306 ++++------ .../business/src/pdf-api/public/privacy.html | 46 +- .../src/pdf-api/public/src/impressum.html | 50 ++ .../src/pdf-api/public/src/index.html | 255 ++++++++ .../{privacy.html.server => src/privacy.html} | 64 +- .../{terms.html.server => src/terms.html} | 64 +- .../business/src/pdf-api/public/terms.html | 46 +- .../src/pdf-api/scripts/build-html.cjs | 48 ++ .../src/pdf-api/templates/pages/docs.html | 1 - .../pdf-api/templates/pages/impressum.html | 43 +- .../src/pdf-api/templates/pages/index.html | 16 +- .../src/pdf-api/templates/pages/privacy.html | 45 +- .../src/pdf-api/templates/pages/terms.html | 45 +- 25 files changed, 781 insertions(+), 1211 deletions(-) delete mode 100644 projects/business/src/pdf-api/public/docs.html.server delete mode 100644 projects/business/src/pdf-api/public/impressum.html.server delete mode 100644 projects/business/src/pdf-api/public/index.html.server create mode 100644 projects/business/src/pdf-api/public/partials/_footer.html create mode 100644 projects/business/src/pdf-api/public/partials/_modals.html create mode 100644 projects/business/src/pdf-api/public/partials/_nav.html create mode 100644 projects/business/src/pdf-api/public/partials/_nav_index.html create mode 100644 projects/business/src/pdf-api/public/partials/_styles_base.html rename projects/business/src/pdf-api/public/{index.html.backup-20260214-175429 => partials/_styles_index.html} (55%) create mode 100644 projects/business/src/pdf-api/public/src/impressum.html create mode 100644 projects/business/src/pdf-api/public/src/index.html rename projects/business/src/pdf-api/public/{privacy.html.server => src/privacy.html} (67%) rename projects/business/src/pdf-api/public/{terms.html.server => src/terms.html} (73%) create mode 100644 projects/business/src/pdf-api/scripts/build-html.cjs diff --git a/projects/business/memory/state.json b/projects/business/memory/state.json index 14f5152..761595c 100644 --- a/projects/business/memory/state.json +++ b/projects/business/memory/state.json @@ -15,6 +15,7 @@ "CI/CD PIPELINE: Forgejo Actions workflow created. Needs 3 repository secrets added in Forgejo settings (SERVER_HOST, SERVER_USER, SSH_PRIVATE_KEY).", "REPRODUCIBLE INFRASTRUCTURE: DONE \u2014 setup.sh, docker-compose, configs, disaster recovery docs all in infrastructure/ directory.", "PRO PLAN LIMITS: DONE \u2014 Set to 2,500 PDFs/month at \u20ac9/mo. Competitive with html2pdf.app. Enforced in code, updated on landing page + JSON-LD + Stripe.", + "SUPPORT EMAIL LIVE: support@docfast.dev is now active in FreeScout. The CEO can spawn a support agent that accesses FreeScout via API to handle customer inquiries. Update the website contact/support references to use this address.", "BUG-049 HIGH: Pro customers do not receive an invoice after payment. This is legally required in Austria/EU. Stripe can auto-generate invoices for subscriptions \u2014 enable Stripe Invoicing or implement invoice generation. Customer must receive a proper invoice with: company name, ATU number, invoice number, date, amount, VAT breakdown.", "WEBSITE TEMPLATING: DONE \u2014 Build-time system with partials (nav/footer/styles). Source in public/src/, build with node scripts/build-html.cjs." ], @@ -62,6 +63,7 @@ "sshKey": "/home/openclaw/.ssh/docfast", "smtp": "Postfix + OpenDKIM configured. DKIM-signed emails working. SPF/DKIM/DMARC DNS records live.", "email": "noreply@docfast.dev", + "supportEmail": "support@docfast.dev (managed via FreeScout, hoid user has access)", "backups": "BorgBackup LOCAL daily at 03:00 UTC + OFF-SITE at 03:30 UTC. Remote: ssh://u149513-sub11@u149513-sub11.your-backup.de:23/./docfast-1 (repokey-blake2 encryption). PostgreSQL dumps + Docker volumes + configs.", "cicd": "Forgejo Actions workflow operational. 3 secrets configured.", "infraDocs": "infrastructure/ directory with full provisioning scripts" diff --git a/projects/business/src/pdf-api/Dockerfile b/projects/business/src/pdf-api/Dockerfile index 367f83d..1143405 100644 --- a/projects/business/src/pdf-api/Dockerfile +++ b/projects/business/src/pdf-api/Dockerfile @@ -18,7 +18,9 @@ COPY package*.json ./ RUN npm install --omit=dev COPY dist/ dist/ +COPY scripts/ scripts/ COPY public/ public/ +RUN node scripts/build-html.cjs RUN rm -f public/swagger-ui && ln -s /app/node_modules/swagger-ui-dist public/swagger-ui # Create data directory and set ownership to docfast user diff --git a/projects/business/src/pdf-api/public/docs.html.server b/projects/business/src/pdf-api/public/docs.html.server deleted file mode 100644 index 0e6db53..0000000 --- a/projects/business/src/pdf-api/public/docs.html.server +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - DocFast API Documentation - - - - - - - - ← Back to docfast.dev -
- - - - diff --git a/projects/business/src/pdf-api/public/impressum.html b/projects/business/src/pdf-api/public/impressum.html index 66b4aa5..97968ad 100644 --- a/projects/business/src/pdf-api/public/impressum.html +++ b/projects/business/src/pdf-api/public/impressum.html @@ -6,37 +6,45 @@ Impressum — DocFast - - - -/* Content */ -main { padding: 60px 0 80px; } -h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 16px; letter-spacing: -1px; } -h2 { font-size: 1.5rem; font-weight: 700; margin: 32px 0 16px; color: var(--accent); } -h3 { font-size: 1.2rem; font-weight: 600; margin: 24px 0 12px; } -p { margin-bottom: 16px; line-height: 1.7; } -ul { margin-bottom: 16px; padding-left: 24px; } -li { margin-bottom: 8px; line-height: 1.7; } -.highlight { background: rgba(52,211,153,0.08); border: 1px solid rgba(52,211,153,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: var(--accent); font-size: 0.9rem; } -.info { background: rgba(96,165,250,0.08); border: 1px solid rgba(96,165,250,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #60a5fa; font-size: 0.9rem; } -.warning { background: rgba(251,191,36,0.08); border: 1px solid rgba(251,191,36,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #fbbf24; font-size: 0.9rem; } - -/* Footer */ -footer { padding: 40px 0; border-top: 1px solid var(--border); } -footer .container { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; } + + + @@ -97,4 +105,4 @@ footer .container { display: flex; align-items: center; justify-content: space-b - \ No newline at end of file + diff --git a/projects/business/src/pdf-api/public/impressum.html.server b/projects/business/src/pdf-api/public/impressum.html.server deleted file mode 100644 index 97968ad..0000000 --- a/projects/business/src/pdf-api/public/impressum.html.server +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -Impressum — DocFast - - - - - - - - - - -
-
-

Impressum

-

Legal notice according to § 5 ECG and § 25 MedienG (Austrian law)

- -

Company Information

-

Company: Cloonar Technologies GmbH

-

Address: Linzer Straße 192/1/2, 1140 Wien, Austria

-

Email: legal@docfast.dev

- -

Legal Registration

-

Commercial Register: FN 631089y

-

Court: Handelsgericht Wien

-

VAT ID: ATU81280034

-

GLN: 9110036145697

- -

Responsible for Content

-

Cloonar Technologies GmbH
- Legal contact: legal@docfast.dev

- -

Disclaimer

-

Despite careful content control, we assume no liability for the content of external links. The operators of the linked pages are solely responsible for their content.

- -

The content of our website has been created with the greatest possible care. However, we cannot guarantee that the content is current, reliable or complete.

- -

EU Online Dispute Resolution

-

Platform of the European Commission for Online Dispute Resolution (ODR): https://ec.europa.eu/consumers/odr

-
-
- - - - - diff --git a/projects/business/src/pdf-api/public/index.html b/projects/business/src/pdf-api/public/index.html index ff4dc0c..70f1ac6 100644 --- a/projects/business/src/pdf-api/public/index.html +++ b/projects/business/src/pdf-api/public/index.html @@ -17,7 +17,7 @@ - - - - - - - - -
-
-
🚀 Simple PDF API for Developers
-

HTML to PDF
in one API call

-

Convert HTML, Markdown, or URLs to pixel-perfect PDFs. Built-in templates for invoices & receipts. No headless browser headaches.

-
- - Read the Docs -
-

Already have an account? Lost your API key? Recover it →

- -
-
- - terminal -
-
-# Convert HTML to PDF — it's that simple -curl -X POST https://docfast.dev/v1/convert/html \ - -H "Authorization: Bearer YOUR_KEY" \ - -H "Content-Type: application/json" \ - -d '{"html": "<h1>Hello World</h1><p>Your first PDF</p>"}' \ - -o output.pdf -
-
-
-
- -
-
-
-
-
<1s
-
Avg. generation time
-
-
-
99.5%
-
Uptime SLA
-
-
-
HTTPS
-
Encrypted & secure
-
-
-
0 bytes
-
Data stored on disk
-
-
-
-
- -
-
-
-
🇪🇺
-
-

Hosted in the EU

-

Your data never leaves the EU • GDPR Compliant • Hetzner Germany (Nuremberg)

-
-
-
-
- -
-
-

Everything you need

-

A complete PDF generation API. No SDKs, no dependencies, no setup.

-
-
- -

Sub-second Speed

-

Persistent browser pool — no cold starts. Your PDFs are ready before your spinner shows.

-
-
- -

Pixel-perfect Output

-

Full CSS support including flexbox, grid, and custom fonts. Your brand, your PDFs.

-
-
- -

Built-in Templates

-

Invoice and receipt templates out of the box. Pass JSON data, get beautiful PDFs.

-
-
- -

Dead-simple API

-

REST API. JSON in, PDF out. Works with curl, Python, Node, Go — anything with HTTP.

-
-
- -

Fully Configurable

-

A4, Letter, custom sizes. Portrait or landscape. Headers, footers, and margins.

-
-
- -

Secure by Default

-

HTTPS only. Rate limiting. No data stored. PDFs stream directly — nothing touches disk.

-
-
-
-
- -
-
-

Simple, transparent pricing

-

Start free. Upgrade when you're ready. No surprise charges.

-
-
-
Free
-
€0 /mo
-
Perfect for side projects and testing
-
    -
  • 100 PDFs per month
  • -
  • All conversion endpoints
  • -
  • All templates included
  • -
  • Rate limiting: 10 req/min
  • -
- -
- -
-
-
- - - - - - - - - - - - - - - - - diff --git a/projects/business/src/pdf-api/public/partials/_footer.html b/projects/business/src/pdf-api/public/partials/_footer.html new file mode 100644 index 0000000..c0c1d4a --- /dev/null +++ b/projects/business/src/pdf-api/public/partials/_footer.html @@ -0,0 +1,14 @@ + diff --git a/projects/business/src/pdf-api/public/partials/_modals.html b/projects/business/src/pdf-api/public/partials/_modals.html new file mode 100644 index 0000000..5407e44 --- /dev/null +++ b/projects/business/src/pdf-api/public/partials/_modals.html @@ -0,0 +1,42 @@ + + \ No newline at end of file diff --git a/projects/business/src/pdf-api/public/partials/_nav.html b/projects/business/src/pdf-api/public/partials/_nav.html new file mode 100644 index 0000000..c1409ba --- /dev/null +++ b/projects/business/src/pdf-api/public/partials/_nav.html @@ -0,0 +1,10 @@ + diff --git a/projects/business/src/pdf-api/public/partials/_nav_index.html b/projects/business/src/pdf-api/public/partials/_nav_index.html new file mode 100644 index 0000000..3d9f1e2 --- /dev/null +++ b/projects/business/src/pdf-api/public/partials/_nav_index.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/projects/business/src/pdf-api/public/partials/_styles_base.html b/projects/business/src/pdf-api/public/partials/_styles_base.html new file mode 100644 index 0000000..a03e308 --- /dev/null +++ b/projects/business/src/pdf-api/public/partials/_styles_base.html @@ -0,0 +1,37 @@ + diff --git a/projects/business/src/pdf-api/public/index.html.backup-20260214-175429 b/projects/business/src/pdf-api/public/partials/_styles_index.html similarity index 55% rename from projects/business/src/pdf-api/public/index.html.backup-20260214-175429 rename to projects/business/src/pdf-api/public/partials/_styles_index.html index 6523c61..326eb7a 100644 --- a/projects/business/src/pdf-api/public/index.html.backup-20260214-175429 +++ b/projects/business/src/pdf-api/public/partials/_styles_index.html @@ -1,11 +1,3 @@ - - - - - -DocFast — HTML & Markdown to PDF API - - - - - - - - +/* Fix mobile terminal gaps at 375px and smaller */ +@media (max-width: 375px) { + .container { + padding: 0 12px !important; + } + .code-section { + margin: 32px auto 0; + max-width: calc(100vw - 24px) !important; + } + .code-header { + padding: 8px 12px; + } + .code-block { + padding: 12px !important; + font-size: 0.7rem; + } + .hero { + padding: 56px 0 40px; + } +} -
-
-
🚀 Simple PDF API for Developers
-

HTML to PDF
in one API call

-

Convert HTML, Markdown, or URLs to pixel-perfect PDFs. Built-in templates for invoices & receipts. No headless browser headaches.

-
- - Read the Docs -
+/* Additional mobile overflow fixes */ +html, body { + overflow-x: hidden !important; + max-width: 100vw !important; +} -
-
-
- terminal -
-
-# Convert HTML to PDF — it's that simple -curl -X POST https://docfast.dev/v1/convert/html \ - -H "Authorization: Bearer YOUR_KEY" \ - -H "Content-Type: application/json" \ - -d '{"html": "<h1>Hello World</h1><p>Your first PDF</p>"}' \ - -o output.pdf -
-
-
-
+@media (max-width: 768px) { + * { + max-width: 100% !important; + } + body { + overflow-x: hidden !important; + } + .container { + overflow-x: hidden !important; + max-width: 100vw !important; + padding: 0 16px !important; + } + .code-section { + max-width: calc(100vw - 32px) !important; + overflow: hidden !important; + display: flex !important; + flex-direction: column !important; + white-space: normal !important; + } + .code-block { + overflow-x: hidden !important; + white-space: pre-wrap !important; + word-break: break-all !important; + max-width: 100% !important; + box-sizing: border-box !important; + } + .trust-grid { + justify-content: center !important; + overflow-x: hidden !important; + max-width: 100% !important; + } + + /* Force any wide elements to fit */ + pre, code, .code-block { + max-width: calc(100vw - 32px) !important; + overflow-wrap: break-word !important; + word-break: break-all !important; + white-space: pre-wrap !important; + overflow-x: hidden !important; + } + .code-section { + max-width: calc(100vw - 32px) !important; + overflow-x: hidden !important; + white-space: normal !important; + } +} -
-
-
-
-
<1s
-
Avg. generation time
-
-
-
99.9%
-
Uptime SLA
-
-
-
HTTPS
-
Encrypted & secure
-
-
-
0 bytes
-
Data stored on disk
-
-
-
-
+/* Recovery modal states */ +#recoverInitial, #recoverLoading, #recoverVerify, #recoverResult { display: none; } +#recoverInitial.active { display: block; } +#recoverLoading.active { display: flex; flex-direction: column; align-items: center; padding: 40px 0; text-align: center; } +#recoverResult.active { display: block; } +#recoverVerify.active { display: block; } -
-
-

Everything you need

-

A complete PDF generation API. No SDKs, no dependencies, no setup.

-
-
-
-

Sub-second Speed

-

Persistent browser pool — no cold starts. Your PDFs are ready before your spinner shows.

-
-
-
🎨
-

Pixel-perfect Output

-

Full CSS support including flexbox, grid, and custom fonts. Your brand, your PDFs.

-
-
-
📄
-

Built-in Templates

-

Invoice and receipt templates out of the box. Pass JSON data, get beautiful PDFs.

-
-
-
🔧
-

Dead-simple API

-

REST API. JSON in, PDF out. Works with curl, Python, Node, Go — anything with HTTP.

-
-
-
📐
-

Fully Configurable

-

A4, Letter, custom sizes. Portrait or landscape. Headers, footers, and margins.

-
-
-
🔒
-

Secure by Default

-

HTTPS only. Rate limiting. No data stored. PDFs stream directly — nothing touches disk.

-
-
-
-
+/* Email change modal states */ +#emailChangeInitial, #emailChangeLoading, #emailChangeVerify, #emailChangeResult { display: none; } +#emailChangeInitial.active { display: block; } +#emailChangeLoading.active { display: flex; flex-direction: column; align-items: center; padding: 40px 0; text-align: center; } +#emailChangeResult.active { display: block; } +#emailChangeVerify.active { display: block; } -
-
-

Simple, transparent pricing

-

Start free. Upgrade when you're ready. No surprise charges.

-
-
-
Free
-
$0 /mo
-
Perfect for side projects and testing
-
    -
  • 100 PDFs per month
  • -
  • All conversion endpoints
  • -
  • All templates included
  • -
  • Rate limiting: 10 req/min
  • -
- -
- -
-
-
- - - - - - - - - +/* Focus-visible for accessibility */ +.btn:focus-visible, a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } + \ No newline at end of file diff --git a/projects/business/src/pdf-api/public/privacy.html b/projects/business/src/pdf-api/public/privacy.html index aad1ddb..bdb66e0 100644 --- a/projects/business/src/pdf-api/public/privacy.html +++ b/projects/business/src/pdf-api/public/privacy.html @@ -3,7 +3,6 @@ - Privacy Policy — DocFast @@ -20,46 +19,31 @@ body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.65; -webkit-font-smoothing: antialiased; } a { color: var(--accent); text-decoration: none; transition: color 0.2s; } a:hover { color: var(--accent-hover); } - -/* Nav */ +.container { max-width: 800px; margin: 0 auto; padding: 0 24px; } nav { padding: 20px 0; border-bottom: 1px solid var(--border); } nav .container { display: flex; align-items: center; justify-content: space-between; } -.logo { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.5px; color: var(--fg); display: flex; align-items: center; gap: 8px; } +.logo { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.5px; color: var(--fg); display: flex; align-items: center; gap: 8px; text-decoration: none; } .logo span { color: var(--accent); } .nav-links { display: flex; gap: 28px; align-items: center; } .nav-links a { color: var(--muted); font-size: 0.9rem; font-weight: 500; } .nav-links a:hover { color: var(--fg); } - -.container { max-width: 800px; margin: 0 auto; padding: 0 24px; } - -/* Content */ -main { padding: 60px 0 80px; } -h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 16px; letter-spacing: -1px; } -h2 { font-size: 1.5rem; font-weight: 700; margin: 32px 0 16px; color: var(--accent); } -h3 { font-size: 1.2rem; font-weight: 600; margin: 24px 0 12px; } -p { margin-bottom: 16px; line-height: 1.7; } -ul { margin-bottom: 16px; padding-left: 24px; } -li { margin-bottom: 8px; line-height: 1.7; } -.highlight { background: rgba(52,211,153,0.08); border: 1px solid rgba(52,211,153,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: var(--accent); font-size: 0.9rem; } -.info { background: rgba(96,165,250,0.08); border: 1px solid rgba(96,165,250,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #60a5fa; font-size: 0.9rem; } -.warning { background: rgba(251,191,36,0.08); border: 1px solid rgba(251,191,36,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #fbbf24; font-size: 0.9rem; } - -/* Footer */ -footer { padding: 40px 0; border-top: 1px solid var(--border); } -footer .container { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; } +.content { padding: 60px 0; min-height: 60vh; } +.content h1 { font-size: 2rem; font-weight: 800; margin-bottom: 32px; letter-spacing: -1px; } +.content h2 { font-size: 1.3rem; font-weight: 700; margin: 32px 0 16px; color: var(--fg); } +.content h3 { font-size: 1.1rem; font-weight: 600; margin: 24px 0 12px; color: var(--fg); } +.content p, .content li { color: var(--muted); margin-bottom: 12px; } +.content ul, .content ol { padding-left: 24px; } +.content strong { color: var(--fg); } +footer { padding: 32px 0; border-top: 1px solid var(--border); margin-top: 60px; } +footer .container { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; } .footer-left { color: var(--muted); font-size: 0.85rem; } -.footer-links { display: flex; gap: 24px; flex-wrap: wrap; } +.footer-links { display: flex; gap: 20px; flex-wrap: wrap; } .footer-links a { color: var(--muted); font-size: 0.85rem; } .footer-links a:hover { color: var(--fg); } - -/* Responsive */ -@media (max-width: 640px) { - main { padding: 40px 0 60px; } - h1 { font-size: 2rem; } - .footer-links { gap: 16px; } +@media (max-width: 768px) { footer .container { flex-direction: column; text-align: center; } + .nav-links { gap: 16px; } } - @@ -204,4 +188,4 @@ footer .container { display: flex; align-items: center; justify-content: space-b - \ No newline at end of file + diff --git a/projects/business/src/pdf-api/public/src/impressum.html b/projects/business/src/pdf-api/public/src/impressum.html new file mode 100644 index 0000000..a9a3524 --- /dev/null +++ b/projects/business/src/pdf-api/public/src/impressum.html @@ -0,0 +1,50 @@ + + + + + +Impressum — DocFast + + + + +{{> styles_base}} + + + +{{> nav}} + +
+
+

Impressum

+

Legal notice according to § 5 ECG and § 25 MedienG (Austrian law)

+ +

Company Information

+

Company: Cloonar Technologies GmbH

+

Address: Linzer Straße 192/1/2, 1140 Wien, Austria

+

Email: legal@docfast.dev

+ +

Legal Registration

+

Commercial Register: FN 631089y

+

Court: Handelsgericht Wien

+

VAT ID: ATU81280034

+

GLN: 9110036145697

+ +

Responsible for Content

+

Cloonar Technologies GmbH
+ Legal contact: legal@docfast.dev

+ +

Disclaimer

+

Despite careful content control, we assume no liability for the content of external links. The operators of the linked pages are solely responsible for their content.

+ +

The content of our website has been created with the greatest possible care. However, we cannot guarantee that the content is current, reliable or complete.

+ +

EU Online Dispute Resolution

+

Platform of the European Commission for Online Dispute Resolution (ODR): https://ec.europa.eu/consumers/odr

+
+
+ +{{> footer}} + + + diff --git a/projects/business/src/pdf-api/public/src/index.html b/projects/business/src/pdf-api/public/src/index.html new file mode 100644 index 0000000..f40dc96 --- /dev/null +++ b/projects/business/src/pdf-api/public/src/index.html @@ -0,0 +1,255 @@ + + + + + +DocFast — HTML & Markdown to PDF API + + + + + + + + + + + + + + +{{> styles_index}} + + + + + + +{{> nav_index}} + +
+
+
🚀 Simple PDF API for Developers
+

HTML to PDF
in one API call

+

Convert HTML, Markdown, or URLs to pixel-perfect PDFs. Built-in templates for invoices & receipts. No headless browser headaches.

+
+ + Read the Docs +
+

Already have an account? Lost your API key? Recover it →

+ +
+
+ + terminal +
+
+# Convert HTML to PDF — it's that simple +curl -X POST https://docfast.dev/v1/convert/html \ + -H "Authorization: Bearer YOUR_KEY" \ + -H "Content-Type: application/json" \ + -d '{"html": "<h1>Hello World</h1><p>Your first PDF</p>"}' \ + -o output.pdf +
+
+
+
+ +
+
+
+
+
<1s
+
Avg. generation time
+
+
+
99.5%
+
Uptime SLA
+
+
+
HTTPS
+
Encrypted & secure
+
+
+
0 bytes
+
Data stored on disk
+
+
+
+
+ +
+
+
+
🇪🇺
+
+

Hosted in the EU

+

Your data never leaves the EU • GDPR Compliant • Hetzner Germany (Nuremberg)

+
+
+
+
+ +
+
+

Everything you need

+

A complete PDF generation API. No SDKs, no dependencies, no setup.

+
+
+ +

Sub-second Speed

+

Persistent browser pool — no cold starts. Your PDFs are ready before your spinner shows.

+
+
+ +

Pixel-perfect Output

+

Full CSS support including flexbox, grid, and custom fonts. Your brand, your PDFs.

+
+
+ +

Built-in Templates

+

Invoice and receipt templates out of the box. Pass JSON data, get beautiful PDFs.

+
+
+ +

Dead-simple API

+

REST API. JSON in, PDF out. Works with curl, Python, Node, Go — anything with HTTP.

+
+
+ +

Fully Configurable

+

A4, Letter, custom sizes. Portrait or landscape. Headers, footers, and margins.

+
+
+ +

Secure by Default

+

HTTPS only. Rate limiting. No data stored. PDFs stream directly — nothing touches disk.

+
+
+
+
+ +
+
+

Simple, transparent pricing

+

Start free. Upgrade when you're ready. No surprise charges.

+
+
+
Free
+
€0 /mo
+
Perfect for side projects and testing
+
    +
  • 100 PDFs per month
  • +
  • All conversion endpoints
  • +
  • All templates included
  • +
  • Rate limiting: 10 req/min
  • +
+ +
+ +
+
+
+ +{{> footer}} + +{{> modals}} + + + + + + + + + + + + diff --git a/projects/business/src/pdf-api/public/privacy.html.server b/projects/business/src/pdf-api/public/src/privacy.html similarity index 67% rename from projects/business/src/pdf-api/public/privacy.html.server rename to projects/business/src/pdf-api/public/src/privacy.html index bdb66e0..ec66c42 100644 --- a/projects/business/src/pdf-api/public/privacy.html.server +++ b/projects/business/src/pdf-api/public/src/privacy.html @@ -8,56 +8,11 @@ - +{{> styles_base}} - +{{> nav}}
@@ -172,20 +127,7 @@ footer .container { display: flex; justify-content: space-between; align-items:
- +{{> footer}} diff --git a/projects/business/src/pdf-api/public/terms.html.server b/projects/business/src/pdf-api/public/src/terms.html similarity index 73% rename from projects/business/src/pdf-api/public/terms.html.server rename to projects/business/src/pdf-api/public/src/terms.html index 3ade338..d9aeb6e 100644 --- a/projects/business/src/pdf-api/public/terms.html.server +++ b/projects/business/src/pdf-api/public/src/terms.html @@ -8,56 +8,11 @@ - +{{> styles_base}} - +{{> nav}}
@@ -244,20 +199,7 @@ footer .container { display: flex; justify-content: space-between; align-items:
- +{{> footer}} diff --git a/projects/business/src/pdf-api/public/terms.html b/projects/business/src/pdf-api/public/terms.html index 31a24d1..3ade338 100644 --- a/projects/business/src/pdf-api/public/terms.html +++ b/projects/business/src/pdf-api/public/terms.html @@ -3,7 +3,6 @@ - Terms of Service — DocFast @@ -20,46 +19,31 @@ body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.65; -webkit-font-smoothing: antialiased; } a { color: var(--accent); text-decoration: none; transition: color 0.2s; } a:hover { color: var(--accent-hover); } - -/* Nav */ +.container { max-width: 800px; margin: 0 auto; padding: 0 24px; } nav { padding: 20px 0; border-bottom: 1px solid var(--border); } nav .container { display: flex; align-items: center; justify-content: space-between; } -.logo { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.5px; color: var(--fg); display: flex; align-items: center; gap: 8px; } +.logo { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.5px; color: var(--fg); display: flex; align-items: center; gap: 8px; text-decoration: none; } .logo span { color: var(--accent); } .nav-links { display: flex; gap: 28px; align-items: center; } .nav-links a { color: var(--muted); font-size: 0.9rem; font-weight: 500; } .nav-links a:hover { color: var(--fg); } - -.container { max-width: 800px; margin: 0 auto; padding: 0 24px; } - -/* Content */ -main { padding: 60px 0 80px; } -h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 16px; letter-spacing: -1px; } -h2 { font-size: 1.5rem; font-weight: 700; margin: 32px 0 16px; color: var(--accent); } -h3 { font-size: 1.2rem; font-weight: 600; margin: 24px 0 12px; } -p { margin-bottom: 16px; line-height: 1.7; } -ul { margin-bottom: 16px; padding-left: 24px; } -li { margin-bottom: 8px; line-height: 1.7; } -.highlight { background: rgba(52,211,153,0.08); border: 1px solid rgba(52,211,153,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: var(--accent); font-size: 0.9rem; } -.info { background: rgba(96,165,250,0.08); border: 1px solid rgba(96,165,250,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #60a5fa; font-size: 0.9rem; } -.warning { background: rgba(251,191,36,0.08); border: 1px solid rgba(251,191,36,0.15); border-radius: 8px; padding: 16px; margin: 24px 0; color: #fbbf24; font-size: 0.9rem; } - -/* Footer */ -footer { padding: 40px 0; border-top: 1px solid var(--border); } -footer .container { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; } +.content { padding: 60px 0; min-height: 60vh; } +.content h1 { font-size: 2rem; font-weight: 800; margin-bottom: 32px; letter-spacing: -1px; } +.content h2 { font-size: 1.3rem; font-weight: 700; margin: 32px 0 16px; color: var(--fg); } +.content h3 { font-size: 1.1rem; font-weight: 600; margin: 24px 0 12px; color: var(--fg); } +.content p, .content li { color: var(--muted); margin-bottom: 12px; } +.content ul, .content ol { padding-left: 24px; } +.content strong { color: var(--fg); } +footer { padding: 32px 0; border-top: 1px solid var(--border); margin-top: 60px; } +footer .container { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 16px; } .footer-left { color: var(--muted); font-size: 0.85rem; } -.footer-links { display: flex; gap: 24px; flex-wrap: wrap; } +.footer-links { display: flex; gap: 20px; flex-wrap: wrap; } .footer-links a { color: var(--muted); font-size: 0.85rem; } .footer-links a:hover { color: var(--fg); } - -/* Responsive */ -@media (max-width: 640px) { - main { padding: 40px 0 60px; } - h1 { font-size: 2rem; } - .footer-links { gap: 16px; } +@media (max-width: 768px) { footer .container { flex-direction: column; text-align: center; } + .nav-links { gap: 16px; } } - @@ -276,4 +260,4 @@ footer .container { display: flex; align-items: center; justify-content: space-b - \ No newline at end of file + diff --git a/projects/business/src/pdf-api/scripts/build-html.cjs b/projects/business/src/pdf-api/scripts/build-html.cjs new file mode 100644 index 0000000..7b02b6d --- /dev/null +++ b/projects/business/src/pdf-api/scripts/build-html.cjs @@ -0,0 +1,48 @@ +#!/usr/bin/env node +/** + * DocFast HTML Build Script + * Replaces {{> partial_name}} in source files with partial contents. + * Source: public/src/*.html → Output: public/*.html + * Partials: public/partials/_*.html + */ +const fs = require('fs'); +const path = require('path'); + +const srcDir = path.join(__dirname, '..', 'public', 'src'); +const outDir = path.join(__dirname, '..', 'public'); +const partialsDir = path.join(__dirname, '..', 'public', 'partials'); + +// Load all partials +const partials = {}; +if (fs.existsSync(partialsDir)) { + for (const f of fs.readdirSync(partialsDir)) { + if (f.startsWith('_') && f.endsWith('.html')) { + const name = f.replace(/^_/, '').replace(/\.html$/, ''); + partials[name] = fs.readFileSync(path.join(partialsDir, f), 'utf-8').trimEnd(); + } + } +} +console.log(`Loaded partials: ${Object.keys(partials).join(', ')}`); + +if (!fs.existsSync(srcDir)) { + console.error(`Source directory not found: ${srcDir}`); + process.exit(1); +} + +// Process each source file +const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.html')); +for (const file of files) { + let content = fs.readFileSync(path.join(srcDir, file), 'utf-8'); + + // Replace {{> partial_name}} with partial content + content = content.replace(/\{\{>\s*(\w+)\s*\}\}/g, (match, name) => { + if (partials[name]) return partials[name]; + console.warn(` Warning: partial '${name}' not found in ${file}`); + return match; + }); + + const outPath = path.join(outDir, file); + fs.writeFileSync(outPath, content); + console.log(` Built: ${file}`); +} +console.log('Done.'); diff --git a/projects/business/src/pdf-api/templates/pages/docs.html b/projects/business/src/pdf-api/templates/pages/docs.html index 2ca18b5..0e6db53 100644 --- a/projects/business/src/pdf-api/templates/pages/docs.html +++ b/projects/business/src/pdf-api/templates/pages/docs.html @@ -1,4 +1,3 @@ - diff --git a/projects/business/src/pdf-api/templates/pages/impressum.html b/projects/business/src/pdf-api/templates/pages/impressum.html index 65a5e33..e376d03 100644 --- a/projects/business/src/pdf-api/templates/pages/impressum.html +++ b/projects/business/src/pdf-api/templates/pages/impressum.html @@ -1,18 +1,49 @@ - -{{> head-common}} -{{title}} + + +Impressum — DocFast diff --git a/projects/business/src/pdf-api/templates/pages/index.html b/projects/business/src/pdf-api/templates/pages/index.html index 2c9ecec..045f3db 100644 --- a/projects/business/src/pdf-api/templates/pages/index.html +++ b/projects/business/src/pdf-api/templates/pages/index.html @@ -1,4 +1,3 @@ - @@ -18,7 +17,7 @@ @@ -135,4 +166,4 @@ {{> footer}} - \ No newline at end of file + diff --git a/projects/business/src/pdf-api/templates/pages/terms.html b/projects/business/src/pdf-api/templates/pages/terms.html index 98d4b2e..2058153 100644 --- a/projects/business/src/pdf-api/templates/pages/terms.html +++ b/projects/business/src/pdf-api/templates/pages/terms.html @@ -1,18 +1,49 @@ - -{{> head-common}} -{{title}} + + +Terms of Service — DocFast @@ -207,4 +238,4 @@ {{> footer}} - \ No newline at end of file +