Fix SEO and accessibility issues in production build
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 11m20s

- Change 'Hosted in the EU' from h3 to h2 for proper heading hierarchy
- Add FAQ structured data (JSON-LD) for rich search results
- Remove onclick attributes from copy buttons (event listeners in app.js)

These changes were previously applied to templates/pages/ but missing
from public/src/ which is used by the Docker build. All changes now
applied to correct source files and built.
This commit is contained in:
DocFast Dev 2026-02-21 19:03:39 +00:00
parent 4aeac959c3
commit b476b0bd4e
7 changed files with 134 additions and 143 deletions

View file

@ -18,6 +18,54 @@
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"DocFast","url":"https://docfast.dev","applicationCategory":"DeveloperApplication","operatingSystem":"Web","description":"Convert HTML and Markdown to beautiful PDFs with a simple API call. Fast, reliable, developer-friendly.","offers":[{"@type":"Offer","price":"9","priceCurrency":"EUR","name":"Pro","description":"Unlimited PDF generation for production apps","billingIncrement":"P1M"}]}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How do I convert HTML to PDF with an API?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Send a POST request to https://docfast.dev/v1/convert/html with your HTML content in the request body and your API key in the Authorization header. DocFast returns a ready-to-use PDF in under 1 second."
}
},
{
"@type": "Question",
"name": "Does DocFast support Markdown to PDF?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, DocFast supports converting Markdown to PDF through the /v1/convert/markdown endpoint. Simply send your Markdown content and receive a beautifully formatted PDF."
}
},
{
"@type": "Question",
"name": "Where is DocFast hosted?",
"acceptedAnswer": {
"@type": "Answer",
"text": "DocFast is hosted exclusively in the EU, in Hetzner's Nuremberg, Germany datacenter. All data processing happens within EU borders and is fully GDPR compliant."
}
},
{
"@type": "Question",
"name": "How much does DocFast cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "DocFast Pro costs €9 per month and includes unlimited PDF generation, all conversion endpoints, built-in templates, and priority email support."
}
},
{
"@type": "Question",
"name": "Do you have official SDKs?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, DocFast provides official SDKs for Node.js, Python, Go, PHP, and Laravel. You can also use the REST API directly with curl or any HTTP client."
}
}
]
}
</script>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>⚡</text></svg>">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
@ -392,7 +440,7 @@ html, body {
<div class="eu-badge">
<div class="eu-icon">🇪🇺</div>
<div class="eu-content">
<h3>Hosted in the EU</h3>
<h2>Hosted in the EU</h2>
<p>Your data never leaves the EU • GDPR Compliant • Hetzner Germany (Nuremberg)</p>
</div>
</div>
@ -579,7 +627,7 @@ html, body {
</div>
<div style="background:var(--bg);border:1px solid var(--accent);border-radius:8px;padding:14px;font-family:monospace;font-size:0.82rem;word-break:break-all;margin:16px 0;position:relative;">
<span id="recoveredKeyText"></span>
<button onclick="copyRecoveredKey()" id="copyRecoveredBtn" style="position:absolute;top:8px;right:8px;background:var(--accent);color:var(--bg);border:none;border-radius:4px;padding:4px 12px;cursor:pointer;font-size:0.8rem;">Copy</button>
<button id="copyRecoveredBtn" style="position:absolute;top:8px;right:8px;background:var(--accent);color:var(--bg);border:none;border-radius:4px;padding:4px 12px;cursor:pointer;font-size:0.8rem;">Copy</button>
</div>
<p style="margin-top:20px;color:var(--muted);font-size:0.9rem;"><a href="/docs">Read the docs →</a></p>
</div>