Commit graph

152 commits

Author SHA1 Message Date
OpenClaw Deployer
97744897f0 fix: move /docs route before express.static to fix CSP headers
All checks were successful
Promote to Production / Deploy to Production (push) Successful in 1m15s
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 9m8s
express.static was serving docs.html before the /docs route handler,
causing Helmet default CSP to be used instead of the custom Swagger UI CSP.
This blocked unsafe-eval and blob: workers needed by Swagger UI.
2026-02-18 13:51:35 +00:00
OpenClaw Deployer
a45d7704ab fix: relax CSP for /docs page — allow unsafe-eval for Swagger UI 5.x (ajv)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 8m41s
Swagger UI 5.x uses new Function() via ajv for JSON schema validation.
Helmet default CSP (script-src self) blocks this in Firefox, causing
TypeError: NetworkError when attempting to fetch resource on Try It.
Override CSP on /docs route to allow unsafe-eval.
2026-02-18 13:33:26 +00:00
OpenClaw Deployer
a996c76c11 fix: align Pro plan quota to 5,000 PDFs/month (matches code + Stripe)
All checks were successful
Promote to Production / Deploy to Production (push) Successful in 2m0s
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 9m5s
2026-02-18 13:10:20 +00:00
OpenClaw Deployer
0902e1e437 feat: add SMTP auth support for K3s migration
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 11m3s
Promote to Production / Deploy to Production (push) Successful in 3m23s
- Support SMTP_USER/SMTP_PASS env vars for authenticated SMTP
- Support SMTP_FROM env var for configurable sender address
- Auto-detect secure mode for port 465
- Backwards compatible: falls back to unauthenticated local relay
2026-02-18 12:47:33 +00:00
OpenClaw Deployer
02b2408772 ci: staged deployment — push to main→staging, git tag→prod
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Push to main builds ARM64 image and deploys to docfast-staging namespace
- Push a version tag (v*) promotes latest image to docfast namespace (prod)
- Both use same deployer SA with namespace-scoped RBAC
2026-02-18 12:40:00 +00:00
OpenClaw Deployer
681745f08f ci: use REGISTRY_TOKEN for container registry push
All checks were successful
Build & Deploy to K3s / Build & Deploy (push) Successful in 7m24s
2026-02-18 12:10:12 +00:00
OpenClaw Deployer
b568b14a42 ci: add packages:write permission for registry push
Some checks failed
Build & Deploy to K3s / Build & Deploy (push) Failing after 9m53s
2026-02-18 11:55:42 +00:00
OpenClaw Deployer
7a49541128 ci: switch to K3s deploy via Forgejo registry + kubectl
Some checks failed
Build & Deploy to K3s / Build & Deploy (push) Failing after 9m30s
- Build ARM64 image via QEMU/buildx on x86 runner
- Push to Forgejo container registry (uses built-in GITHUB_TOKEN)
- Deploy via kubectl with scoped deployer SA (docfast namespace only)
- No SSH, no secrets on infra, no Docker on k3s-mgr
2026-02-18 11:41:19 +00:00
DocFast Bot
87946a1762 fix: BUG-053,055,058,060,061,067,069 - JS minification, meta tags, skip-link, docs footer
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m44s
- BUG-053: Add terser JS minification to build process
- BUG-060: Add og:image, twitter:card, twitter:image to sub-pages
- BUG-067: Update skip-link to #main-content on all pages
2026-02-17 18:03:59 +00:00
e57a45b431 fix: apply QA fixes to correct build source (public/src/)
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m41s
- BUG-055: Remove duplicate preconnect tags from homepage
- BUG-058: Add twitter:image meta tag to homepage
- BUG-060: Add og:title/description/url to sub-pages (impressum/privacy/terms/status)
- BUG-061: Already done in sitemap.xml
- BUG-067: Add skip-to-content link via nav partial + styles_base
- BUG-069: Footer already added to docs.html
- BUG-053: Minify app.js and status.js, update HTML refs
2026-02-17 13:11:24 +00:00
7037b885e2 fix: BUG-055,058,060,061,067,069,053 - QA low/info fixes
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m35s
- BUG-055: Remove duplicate preconnect tags from homepage
- BUG-058: Add twitter:image meta tag to homepage
- BUG-060: Add og:title/description/url to sub-pages
- BUG-061: Add /status to sitemap.xml
- BUG-067: Add skip-to-content link on all pages
- BUG-069: Add legal footer to /docs page
- BUG-053: Minify app.js with terser
2026-02-17 13:07:43 +00:00
DocFast Bot
60efc5e206 ci: inject secrets from Forgejo CI into .env during deploy
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
2026-02-17 12:08:47 +00:00
DocFast Bot
73fba68320 ops: add post-deploy verification script and add to CI/CD workflow
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m35s
- scripts/verify-deploy.sh: checks container health, /health endpoint, and Stripe checkout
- .forgejo/workflows/deploy.yml: runs verify-deploy.sh after successful deploy
2026-02-17 11:51:36 +00:00
DocFast Bot
f5cea97adf security: remove Change Email feature (leaked key = account hijack)
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m7s
2026-02-17 11:40:27 +00:00
DocFast Bot
1702abdeb8 fix: add /change-email route in index.ts + fix SQL query escaping in keys.ts
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m36s
- Register GET /change-email route in src/index.ts (serves change-email.html)
- Fix updateKeyEmail() SQL query string (dollar signs were stripped by heredoc)
- Fix updateEmailByCustomer() SQL query string
- Rebuild TypeScript dist/
2026-02-17 11:34:21 +00:00
DocFast Bot
8f3b1a9660 feat: convert change-email from modal to standalone page + Stripe customer.updated webhook
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m8s
- Add /change-email as a proper standalone page (public/src/change-email.html)
  with API key input, new email input, verification code flow, and success state
- Update footer partial: change "/#change-email" link to "/change-email" on all pages
- Remove email change modal HTML and hash-handler JS from index page source
- Add /change-email to sitemap.xml
- Rebuild all HTML files via build-html.cjs

- Add updateEmailByCustomer() to src/services/keys.ts
- Add customer.updated webhook handler in src/routes/billing.ts
  to sync email changes made via Stripe dashboard back to DocFast
2026-02-17 11:31:37 +00:00
DocFast Bot
5099bae41f refactor: merge duplicate nav/style partials, fix sticky nav overflow
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m36s
2026-02-17 11:20:47 +00:00
DocFast Bot
855068a011 fix: downgrade instead of delete key on subscription cancel
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m43s
- Replace revokeByCustomer with downgradeByCustomer in keys.ts
  - Sets tier='free' in cache and DB (UPDATE, not DELETE)
- Add isDocFastSubscription() product filter helper in billing.ts
  - Filters all subscription events by prod_TygeG8tQPtEAdE
- Handle customer.subscription.updated event
  - Downgrades on status=canceled/past_due/unpaid or cancel_at_period_end=true
- Handle customer.subscription.deleted with product filter
  - Downgrades to free (was incorrectly deleting the key)

Fixes revenue integrity bug: cancelled Pro subscribers kept Pro access.
2026-02-17 10:46:12 +00:00
OpenClaw
2bfd893510 Fix: sticky navbar on all pages
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m10s
2026-02-17 10:38:52 +00:00
DocFast Agent
7653939bd9 fix: QA audit bugs BUG-051/052/056/057/059/062/063/064/065/066/068
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m38s
- BUG-056: Fix sitemap namespace sitemapns.org -> sitemaps.org
- BUG-062: Extend <main> to wrap all page content (hero+features+pricing+EU section)
- BUG-064: Add sr-only <label> elements to all modal form inputs (signup, recovery, change-email)
- BUG-051/052: Remove duplicate X-Content-Type-Options headers from nginx (let helmet handle)
- BUG-057: Fix JSON-LD and pricing card: Pro plan is 2,500 PDFs/month not 5,000
- BUG-059: Add meta description, canonical URL, og: tags to /docs page
- BUG-063: Change eu-hosting h3 to h2 (correct heading hierarchy)
- BUG-065/066: Add aria-modal=true, role=dialog to modals; aria-label=Close to close buttons
- BUG-068: Add hash-based modal open for #change-email on page load
- Add .sr-only CSS utility class to base and index styles
2026-02-17 08:15:03 +00:00
DocFast Agent
a0d4ba964c fix: audit #18 rate limit cleanup (.unref), audit #25 consistent error shapes
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m4s
Audit #18 - Rate limit store memory growth:
- rateLimitStore already had cleanup via cleanupExpiredEntries() per-request + 60s interval
- Added .unref() to the setInterval timer for clean graceful shutdown behaviour

Audit #25 - Consistent error response shapes:
- billing.ts: Fixed 409 plain-text response -> JSON { error: "..." }
- index.ts: Simplified 404 from 4-field object to { error: "Not Found: METHOD path" }
- signup.ts: Removed extra retryAfter field from rate-limit message object
- pdfRateLimit.ts: Merged limit/tier/retryAfter into single error message string
- usage.ts: Merged limit/used/upgrade fields into single error message string
- convert.ts: Merged detail field into error message (3 occurrences)

All error responses now consistently use {"error": "message"} shape.
2026-02-17 08:10:14 +00:00
OpenClaw
e7d28bc62b fix: batch usage writes (#10), retry divergence (#12), per-key queue fairness (#15)
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 3m9s
2026-02-16 20:07:11 +00:00
OpenClaw
09c6feb06e Fix audit #14 (body size limits), #17 (duplicate session_id), #22 (unused import)
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m53s
2026-02-16 19:51:24 +00:00
OpenClaw
6cc30db5c6 Add styled /status page, update footer/terms links from /health to /status
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m49s
2026-02-16 19:48:25 +00:00
OpenClaw
59cc8f3d0e Session 45: support email, audit fixes (template validation, content-type, admin auth, waitUntil)
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m20s
- Added support@docfast.dev to footer, impressum, terms, landing page, openapi.json
- Fixed audit #6: Template render validates required fields (400 on missing)
- Fixed audit #7: Content-Type check on markdown/URL routes (415)
- Fixed audit #11: /v1/usage and /v1/concurrency now require ADMIN_API_KEY
- Fixed audit Critical #3: URL convert uses domcontentloaded instead of networkidle0
2026-02-16 19:30:21 +00:00
OpenClaw
8a86e34f91 fix: critical and high-severity security fixes
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m52s
- CRITICAL: DNS rebinding SSRF - pin DNS resolution via request interception
- CRITICAL: XSS in billing success - use data-attribute instead of JS string
- HIGH: Webhook signature bypass - refuse unverified webhooks (500)
- HIGH: Filename header injection - sanitize Content-Disposition filename
- HIGH: Verification code timing attack - use crypto.timingSafeEqual()
- HIGH: Remove duplicate unreachable 404 handler
- HIGH: Add IPv6 unique local (fc00::/7) to SSRF private IP check
- HIGH: Replace console.warn with structured logger
2026-02-16 18:56:21 +00:00
a01fbb0357 feat: website templating system — shared nav/footer partials, build-time HTML assembly
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m55s
- Build script: scripts/build-pages.js (zero dependencies, Node.js only)
- Shared partials: nav.html, footer.html (single source of truth)
- 5 page templates in templates/pages/
- Output is byte-for-byte identical to current production
- Run: npm run build:pages
- Also fixes JSON-LD: 2,500 → 5,000 PDFs/month (was inconsistent)
2026-02-16 18:54:17 +00:00
OpenClaw
e51e65524a refactor: extract shared partials from HTML pages (nav, footer, styles, modals)
Some checks failed
Deploy to Production / Deploy to Server (push) Has been cancelled
- Created build-time templating system using existing build-html.cjs
- Extracted index.html into source template with partials:
  _styles_index.html, _nav_index.html, _modals.html
- All 4 templated pages (index, impressum, privacy, terms) use partials
- docs.html excluded (Swagger UI, completely different structure)
- Added HTML build step to Dockerfile
- Built output is byte-identical to original files
2026-02-16 18:52:31 +00:00
OpenClaw
aab6bf3bee feat: Pro limit 2,500/mo, website templating, cleanup
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 2m24s
- Set Pro tier limit to 2,500 PDFs/month (was unlimited/5000)
- Added Pro limit enforcement in usage middleware
- Updated landing page, JSON-LD, and Stripe product description
- Created build-time HTML templating (partials for nav/footer/styles)
- Source files in public/src/, partials in public/partials/
- Build script: node scripts/build-html.cjs
- Deleted stale backup file
- Fixed index.html nav logo to use <a> tag for consistency
2026-02-16 18:46:59 +00:00
d3015826e5 cleanup: remove incomplete template partials
Some checks failed
Deploy to Production / Deploy to Server (push) Has been cancelled
2026-02-16 18:44:52 +00:00
c903860917 Enforce Pro plan limit of 5,000 PDFs/month
Some checks failed
Deploy to Production / Deploy to Server (push) Has been cancelled
2026-02-16 18:41:57 +00:00
OpenClaw
b98e8bc253 fix: BUG-046 usage endpoint data leak, BUG-047 copy button, BUG-048 email change links
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m18s
BUG-046 (CRITICAL): getUsageStats() now accepts apiKey param and returns
only that key usage instead of all users. Route passes req.apiKeyInfo.key.

BUG-047: Added visible Copy button to Pro key success page in billing.ts.

BUG-048: Added class="open-email-change" to Change Email links in all
HTML pages so the JS modal opener can find them.
2026-02-16 18:06:52 +00:00
OpenClaw
a1d26b85ec Add off-site BorgBackup to Hetzner Storage Box
Some checks failed
Deploy to Production / Deploy to Server (push) Has been cancelled
- Separate borg repo on Hetzner Storage Box (repokey-blake2)
- Runs daily at 03:30 UTC (after local backup at 03:00)
- Same data: PG dump, Docker volumes, nginx, SSL, DKIM, app files
- Same retention: 7 daily + 4 weekly + 3 monthly
- Remote: ssh://u149513-sub11@u149513-sub11.your-backup.de:23/./docfast-1
2026-02-16 18:05:44 +00:00
DocFast Bot
5b7e343139 build: compile dist for sitemap, favicon, and graceful shutdown changes
All checks were successful
Deploy to Production / Deploy to Server (push) Successful in 1m12s
2026-02-16 16:10:15 +00:00
DocFast Bot
d7b0a0eaa6 fix(landing): BUG-045 — Pro tier says Unlimited instead of 10,000 PDFs
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 22s
The Pro tier has no limit in code (unlimited). Fixed landing page copy
and JSON-LD structured data to match.
2026-02-16 16:07:26 +00:00
DocFast Bot
b1135edcca security: disable JavaScript execution in Puppeteer for PDF generation
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
2026-02-16 15:32:34 +00:00
OpenClaw
59d563841d merge: resolve conflicts, keep standardized footer versions
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
2026-02-16 15:04:24 +00:00
OpenClaw
e926349d7f fix: standardize footer across all pages, add Home link, fix mobile footer CSS 2026-02-16 15:03:29 +00:00
DocFast Bot
735e788acd Fix footer link order to match home page exactly
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
2026-02-16 14:47:53 +00:00
DocFast Bot
f53a6a5460 Update impressum with real company data, unify footer across all pages
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
2026-02-16 14:46:54 +00:00
openclawd
1ef8f5743c feat: Add built dist files with EU compliance routes
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
- Include compiled TypeScript with new /impressum, /privacy, /terms routes
- Temporary commit of dist files for Docker deployment
2026-02-16 13:09:25 +00:00
openclawd
5ef8f34133 feat: Add EU compliance pages and EU hosting marketing
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
- Add footer links for Impressum, Privacy Policy, Terms of Service
- Create legal pages: /impressum, /privacy, /terms (Austrian/EU compliant)
- Add EU hosting badge highlighting GDPR compliance and EU data residency
- Add Express routes for legal pages with caching headers
- All pages use consistent dark theme design matching landing page
2026-02-16 13:07:24 +00:00
openclawd
03dd6c17df Fix three critical issues: Docker healthcheck, USD->EUR pricing, static asset caching
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 22s
- Docker healthcheck: Use Node.js instead of curl (not installed in slim image)
- Pricing: Change from USD ($) to EUR (€) in frontend and backend Stripe integration
- Static assets: Add Cache-Control headers (1 day) for /public and /docs files
2026-02-16 13:04:47 +00:00
openclawd
76714d799e Fix: nginx duplicate MIME type, update version to 0.2.1, improve log rotation
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 22s
- Remove duplicate text/html from nginx gzip_types (fixes nginx -t warning)
- Update hardcoded API version from 0.2.0 to 0.2.1 to match package.json
- Update logrotate config: daily rotation, 7 days retention, improved postrotate
- Add Docker logging configuration with size/file limits
2026-02-16 08:36:55 +00:00
openclawd
7b55a1ddc6 Fix SSRF vulnerability: Add IPv6 link-local blocking and update error message
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
- Add fe80::/10 (IPv6 link-local) detection to isPrivateIP()
- Update error message to match specification: 'URL resolves to a private/internal IP address'
- Existing protections already covered all required IPv4 ranges and IPv6 localhost
2026-02-16 08:36:08 +00:00
DocFast CEO
86f8da62ec v0.2.1: request logging, 404 handler, permissions-policy, SEO improvements, typo fix
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
2026-02-16 08:32:57 +00:00
openclawd
210e71e3d8 feat: SEO + Nginx optimization
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
- Update sitemap.xml to include /v1/health endpoint
- Add proper 404 handling (JSON for API paths, HTML for browser paths)
- Create optimized nginx config with gzip, cache headers, specific locations
- Add logrotate configuration for DocFast logs
- Add security headers and static asset caching
2026-02-16 08:30:14 +00:00
OpenClaw
9541ae1826 Backend hardening: structured logging, timeouts, memory leak fixes, compression, XSS fix
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
- Add pino structured logging with request IDs (X-Request-Id header)
- Add 30s timeout to acquirePage() and renderPdf/renderUrlPdf
- Add verification cache cleanup (every 15min) and rate limit cleanup (every 60s)
- Read version from package.json in health endpoint
- Add compression middleware
- Escape currency in templates (XSS fix)
- Add static asset caching (1h maxAge)
- Remove deprecated docker-compose version field
- Replace all console.log/error with pino logger
2026-02-16 08:27:42 +00:00
OpenClaw
4833edf44c SEO & accessibility: OG tags, robots.txt, sitemap, OG image, aria labels, focus trap, keyboard nav
Some checks failed
Deploy to Production / Deploy to Server (push) Has been cancelled
2026-02-16 08:27:25 +00:00
openclawd
ed273430c7 Merge branch 'main' of ssh://git.cloonar.com/openclawd/docfast
Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 21s
2026-02-15 11:06:49 +00:00