Commit graph

243 commits

Author SHA1 Message Date
7fffd404e9 chore: upgrade express-rate-limit 7.5.1 → 8.3.1 (IPv6 security fix)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m10s
- Fixes IPv6 rate limit bypass vulnerability (GHSA-46wh-pxpv-q5gq)
- IPv6 addresses now masked to /56 subnet by default
- Updated custom keyGenerators to use ipKeyGenerator() helper
- 5 new TDD tests for v8 features (ipKeyGenerator, IPv6 masking)
- 672 tests passing, 0 TS errors, 0 npm audit vulnerabilities
2026-03-11 20:06:44 +01:00
603cbd7061 Migrate from Express 4 to Express 5
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 19m30s
- Upgraded express from ^4.22.1 to ^5.2.1
- Added comprehensive Express 5 migration tests with TDD approach
- All 667 tests passing (663 existing + 4 new migration tests)
- No breaking changes detected in the codebase
- Express 5's native async error handling now active
- TypeScript compilation successful with @types/express ^5.0.6

Express 5 features now available:
- Automatic async error catching in route handlers
- Improved performance and stricter path matching
- Default export import style already in use
2026-03-11 17:08:07 +01:00
a55c306514 chore: update dependencies (express 4.22, helmet 8.1, nanoid 5.1, swagger-ui-dist 5.32, tsx 4.21, typescript 5.9, vitest 3.2, @types/*)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m16s
2026-03-11 14:07:11 +01:00
Hoid
cc7de5ef49 feat: add periodic database cleanup every 6 hours (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m15s
- Cleans expired verifications and orphaned usage rows
- Previously only ran once on startup (13d+ uptime = accumulation)
- Interval uses .unref() to not block graceful shutdown
- Stopped during shutdown before pool.end()
- Idempotent start (safe to call multiple times)
- 6 TDD tests added (periodic-cleanup.test.ts)
- 663 tests total, all passing
2026-03-11 11:06:09 +01:00
75c6a6ce58 chore: upgrade marked 15→17 (ReDoS fix, list rendering improvements)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 17m28s
2026-03-11 08:07:05 +01:00
af3391d05a chore: update puppeteer 24.39.0, nodemailer 8.0.2
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m57s
2026-03-10 20:09:05 +01:00
b491052f69 refactor: extract billing HTML templates into billing-templates.ts (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m0s
- Extract renderSuccessPage() and renderAlreadyProvisionedPage() from billing.ts
- Share common styles via SHARED_STYLES constant
- 11 TDD tests: content rendering, XSS escaping, structure validation
- billing.ts: 369 → 334 lines (-35 lines, inline HTML removed)
- 647 tests passing (59 files), 0 tsc errors
2026-03-10 17:03:44 +01:00
DocFast CEO
25cb5e2e94 refactor: extract findKeyInCacheOrDb to DRY up DB fallback pattern (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 20m17s
- New shared helper findKeyInCacheOrDb(column, value) for DB lookups
- Refactored downgradeByCustomer, updateKeyEmail, updateEmailByCustomer,
  and findKeyByCustomerId to use the shared helper
- Eliminated ~60 lines of duplicated SELECT/row-mapping code
- 3 TDD tests added (keys-db-fallback-helper.test.ts)
- 636 tests passing, 0 tsc errors
2026-03-10 14:06:44 +01:00
DocFast CEO
4e00feb860 refactor: extract buildPdfOptions to DRY up renderPdf/renderUrlPdf (TDD)
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Extract shared PDF options construction into buildPdfOptions()
- Both renderPdf and renderUrlPdf now use the shared builder
- 5 TDD tests added (pdf-options-builder.test.ts)
- 633 tests passing, 0 tsc errors
2026-03-10 14:04:19 +01:00
DocFast Backend Agent
b1a09f7b3f refactor(demo): Use handlePdfRoute to reduce boilerplate
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m8s
- Refactored demo routes to use shared handlePdfRoute utility
- Added handleDemoPdfRoute wrapper to preserve attachment disposition
- Preserved watermark injection and demo.pdf default filename
- Added comprehensive TDD tests for Content-Disposition behavior
- Reduced demo.ts from 269 to 238 lines (31 lines removed)
- All 628 tests pass including 6 new behavioral tests

Fixes duplicated error handling, validation, and concurrency logic
while maintaining existing demo route behavior.
2026-03-10 11:06:34 +01:00
7ae20ea280 refactor: extract static page routes into routes/pages.ts (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m9s
- Created src/routes/pages.ts with pagesRouter consolidating all page-serving
  routes: /, /docs, /impressum, /privacy, /terms, /examples, /status,
  /favicon.ico, /openapi.json, /api
- Reduced index.ts from 391 to 314 lines (20% reduction)
- Removed unused imports (createRequire, APP_VERSION, swaggerSpec) from index.ts
- 4 TDD tests verifying router exports and route definitions
- 622 tests passing, 0 tsc errors
2026-03-10 08:04:22 +01:00
76b2179be9 refactor: extract shared PDF route handler to eliminate convert route duplication
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 19m19s
- New src/utils/pdf-handler.ts with handlePdfRoute() helper
- Handles: content-type validation, PDF option validation, slot acquire/release, error mapping, response headers
- Refactored convert.ts from 388 to 233 lines (40% reduction)
- 10 TDD tests for the new helper (RED→GREEN verified)
- All 618 tests passing, zero tsc --noEmit errors
2026-03-09 20:07:27 +01:00
54316d45cf fix: resolve all TypeScript strict-mode errors in test files
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 21m52s
- convert-sanitized: use 'as Record' cast for optional mock call args
- error-responses: fix module path (database.js → db.js) and mock return type
- recover-initial-db-fallback: fix mock return type (undefined → true)
- render-timing: remove non-existent .prepare property check
- usage-flush: cast mock request objects to any for test setup

Zero tsc --noEmit errors. 608 tests passing.
2026-03-09 17:12:22 +01:00
Hoid
c52dec2380 type safety: complete catch(err:unknown) migration + extract admin routes
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 17m50s
- All remaining catch(err) and catch(error) blocks now use : unknown
  across keys.ts, email.ts, usage.ts, index.ts (shutdown handlers)
- Extract admin/usage routes from index.ts (459→391 lines) into
  new src/routes/admin.ts with authMiddleware + adminAuth per-route
- Remove unused imports from index.ts (getConcurrencyStats, isProKey,
  getUsageForKey, getUsageStats, NextFunction)
- 10 new TDD tests (7 error helper, 3 admin router)
- 608 total tests, all passing
2026-03-09 14:09:12 +01:00
5a7ee79316 refactor: eliminate all catch(err: any) with proper unknown typing + type email transport
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 19m10s
- Replace all catch(err: any) with catch(err: unknown) across 8 source files
- Add errorMessage() and errorCode() helpers for safe error property access
- Type nodemailer transport config as SMTPTransport.Options (was any)
- Type health endpoint databaseStatus (was any)
- Type convert route margin param (was any)
- Change queryWithRetry params from any[] to unknown[]
- Update isTransientError to require Error instances (was accepting plain objects)
- 19 new TDD tests (error-type-safety.test.ts)
- Updated existing tests to use proper Error instances
- 598 tests total, all passing, zero type errors
2026-03-09 11:10:58 +01:00
Hoid
da049b77e3 fix(cors): dynamic origin for staging support (BUG-111) + eliminate all 'as any' casts
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 17m51s
- CORS middleware now allows both docfast.dev and staging.docfast.dev origins
  for auth/billing routes, with Vary: Origin header for proper caching
- Unknown origins fall back to production origin (not reflected)
- 13 TDD tests added for CORS behavior

Type safety improvements:
- Augment Express.Request with requestId, acquirePdfSlot, releasePdfSlot
- Use Puppeteer's PaperFormat and PuppeteerLifeCycleEvent types in browser.ts
- Use 'as const' for format literals in convert/demo/templates routes
- Replace Stripe apiVersion 'as any' with @ts-expect-error
- Zero 'as any' casts remaining in production code

579 tests passing (13 new), 51 test files
2026-03-09 08:08:37 +01:00
a60d379e66 Add AuthenticatedRequest type, eliminate apiKeyInfo 'as any' casts
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m6s
- Created src/types.ts with AuthenticatedRequest interface extending Express Request
- Replaced (req as any).apiKeyInfo with typed AuthenticatedRequest cast in:
  - auth.ts, usage.ts, pdfRateLimit.ts middleware
  - index.ts route handlers (usage/me, admin auth, admin usage, admin cleanup, concurrency)
- 4 TDD tests added. 566 tests passing (50 files).
2026-03-08 20:03:15 +01:00
Hoid
b70ed49c15 fix: add X-Robots-Tag noindex for staging, remove dead comment (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 19m3s
2026-03-08 17:03:37 +01:00
Hoid
7206cb518d Remove dead signup router, unused verification functions, and legacy cleanup query
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 18m37s
- Delete src/routes/signup.ts (dead code, 410 handler in index.ts remains)
- Remove isEmailVerified() and getVerifiedApiKey() from verification.ts (only used by signup)
- Remove stale-key cleanup from cleanupStaleData() that queried legacy verifications table
- Update usage middleware message: 'Free tier limit' → 'Account limit'
- TDD: 8 new tests, removed signup.test.ts (dead), net 556 tests passing
2026-03-08 14:07:50 +01:00
DocFast Dev
921562750f Optimize Dockerfile with multi-stage build
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 19m42s
- Added multi-stage build to reduce final image size
- Stage 1 (builder): Installs all deps, compiles TS, generates OpenAPI, builds HTML
- Stage 2 (production): Fresh base image with only production deps and compiled artifacts
- Final image no longer contains src/, tsconfig.json, or dev dependencies
- Added TDD test (dockerfile-build.test.ts) to verify build artifacts exist
- All 561 tests pass

Reduces image size by excluding TypeScript source, build tools, and dev dependencies.
2026-03-08 11:05:59 +01:00
DocFast CEO
da57f57299 chore: update pg 8.20, puppeteer 24.38, stripe 20.4.1, @types/node 22.19.15
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
Safe patch/minor dependency updates. npm audit: 0 vulnerabilities.
559 tests passing.
2026-03-08 11:02:57 +01:00
Hoid
2793207b39 Remove dead token-based verification system
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m26s
- Remove verificationsCache array and loadVerifications() function from verification.ts
- Remove verifyToken() and verifyTokenSync() functions (multi-replica unsafe, never used)
- Remove createVerification() function (stores unused data)
- Remove GET /verify route and verifyPage() helper function
- Remove loadVerifications() call from startup
- Remove createVerification() usage from signup route
- Update imports and test mocks to match removed functions
- Keep active 6-digit code system intact (createPendingVerification, verifyCode, etc.)

All 559 tests passing. The active verification system using pending_verifications
table and 6-digit codes continues to work normally.
2026-03-08 08:07:20 +01:00
d376d586fe fix(keys): add DB fallback to updateEmailByCustomer, updateKeyEmail, and recover route (BUG-108, BUG-109, BUG-110)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m8s
- updateEmailByCustomer: DB fallback when stripe_customer_id not in cache
- updateKeyEmail: DB fallback when key not in cache
- POST /v1/recover: DB fallback when email not in cache (was only on verify)
- 6 TDD tests added (keys-email-update.test.ts, recover-initial-db-fallback.test.ts)
- 547 tests total, all passing
2026-03-07 20:06:13 +01:00
424a16ed8a fix: prevent error message information disclosure + standardize error handling (TDD)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m10s
Security & Consistency Fixes:
- Convert routes no longer leak internal error messages (err.message)
- Templates route no longer exposes error details via 'detail' field
- Admin cleanup endpoint no longer exposes error message
- Standardized QUEUE_FULL response: 429 → 503 (Service Unavailable)
- Added missing PDF_TIMEOUT handling: returns 504 Gateway Timeout
- Generic 500 errors now return 'PDF generation failed.' without internals

TDD Approach:
1. RED: Created error-responses.test.ts with 11 failing tests
2. GREEN: Fixed src/routes/convert.ts, templates.ts, and index.ts
3. Updated convert.test.ts to expect new correct status codes
4. All 541 tests pass

Before: 'PDF generation failed: Puppeteer crashed: SIGSEGV in Chrome'
After:  'PDF generation failed.' (internals logged, not exposed)

Closes security audit findings re: information disclosure
2026-03-07 17:05:54 +01:00
Hoid
6b1b3d584e fix: OpenAPI spec accuracy — hide internal endpoints, mark signup/verify deprecated
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m9s
- Remove @openapi annotations from /v1/billing/webhook (Stripe-internal)
- Remove @openapi annotations from /v1/billing/success (browser redirect)
- Mark /v1/signup/verify as deprecated (returns 410)
- Add 3 TDD tests in openapi-spec.test.ts
- Update 2 existing tests in app-routes.test.ts
- 530 tests passing (was 527)
2026-03-07 14:06:12 +01:00
DocFast CEO
1d5d9adf08 fix: add /v1/email-change to restricted CORS origin list
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m55s
/v1/email-change was missing from the restricted CORS list, getting
wildcard Access-Control-Allow-Origin: * instead of being restricted to
https://docfast.dev like other account management routes (signup,
recover, billing, demo). TDD: test added to app-routes.test.ts.
2026-03-07 11:03:56 +01:00
dd337d30b5 feat: add GET /v1/usage/me endpoint for user-facing usage stats
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m41s
2026-03-07 08:04:50 +01:00
2b4fa0c690 fix: await flushDirtyEntries during shutdown to prevent usage data loss
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
Remove fire-and-forget SIGTERM/SIGINT handlers from usage.ts (race condition
with pool.end() in index.ts). Instead, await flushDirtyEntries() in the
index.ts shutdown orchestrator between stopping the server and closing the
DB pool.
2026-03-07 08:03:56 +01:00
b964b98a8b fix(BUG-106): DB fallback for downgradeByCustomer and recover route
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m7s
- downgradeByCustomer now queries DB when key not in memory cache,
  preventing cancelled customers from keeping Pro access in multi-pod setups
- recover/verify endpoint falls back to DB lookup when cache miss on email
- Added TDD tests for both fallback paths (4 new tests)
2026-03-06 20:06:04 +01:00
OpenClaw
4473641ee1 fix: clear PDF_TIMEOUT timers after successful render, fix test unhandled rejections
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m59s
2026-03-06 17:06:41 +01:00
f9caef82e6 feat: add PDF render timing to convert and demo routes
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Failing after 1m42s
- renderPdf() and renderUrlPdf() now return { pdf, durationMs }
- Timing wraps the actual render with Date.now()
- Log render duration via logger.info
- Add X-Render-Time response header in convert and demo routes
- Update all callers in convert, demo, templates routes
- Add TDD tests in render-timing.test.ts
- Update existing test mocks for new return shape
2026-03-06 11:08:06 +01:00
OpenClaw
0283e9dae8 test: add browser pool unit tests
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Failing after 1m46s
2026-03-06 08:05:45 +01:00
1b398566a6 fix: update examples page meta description — remove Laravel, add URLs
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 16m22s
2026-03-05 17:04:24 +01:00
c233f289c9 feat: add URL-to-PDF examples to examples page
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Add 'URL to PDF' nav link and example section
- Show basic and advanced cURL examples for /v1/convert/url
- Include security notes (JS disabled, private URLs blocked)
- Add test coverage for the new section
2026-03-05 17:03:23 +01:00
503e65103e fix: replace stale Free Tier with Demo tier in Terms of Service (BUG-104)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m18s
- Section 2.1: replaced Free Tier (100 PDFs, 10 req/min) with Demo (Free) - no account, 5 req/hr, evaluation only
- Section 5.1: changed 'no SLA for free tier' to 'no SLA for demo usage'
- Added terms-content regression test (3 tests)
- 487 tests passing across 33 files
2026-03-05 14:11:00 +01:00
4f6659c8c9 fix: replace fake Go/PHP SDK examples with plain HTTP examples
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Go: replaced non-existent docfast-go SDK with net/http example
- PHP: replaced non-existent DocFast\Client SDK with file_get_contents example
- Removed fake Laravel facade example, added note instead
- Updated code labels to 'generate-pdf.go' and 'generate-pdf.php'
- Added test to prevent regression
2026-03-05 14:06:27 +01:00
c82e00f18b fix: replace stale Free Tier with Demo tier in Terms of Service
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Section 2.1: Replace Free Tier with Demo (Free) - no account required,
  5 req/hour, testing and evaluation only, no SLA/support
- Section 5.1: Change 'no SLA for free tier' to 'no SLA for demo usage'
- Add terms-content test to verify no Free Tier references remain
- Rebuild public/terms.html via build-html.cjs
2026-03-05 14:05:34 +01:00
47571c8c81 fix: validate PDF options in template render route (BUG-103)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 16m25s
2026-03-05 11:04:22 +01:00
OpenClaw
ba2e542e2a fix: use sanitized PDF options from validator in convert/demo routes (BUG-102)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m44s
2026-03-05 08:05:22 +01:00
c03f217690 fix(BUG-101): enforce route-specific body size limits
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m40s
Remove global express.json({ limit: '2mb' }) that preempted route-specific
parsers. Each route group now has its own express.json() with correct limit:
- Demo: 50KB, Convert: 500KB, Others: 2MB, Stripe webhook: unchanged
2026-03-04 17:06:31 +01:00
d2f819de94 fix: flush usage entries independently to prevent batch poisoning (BUG-100)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m5s
2026-03-04 14:04:53 +01:00
OpenClaw Subagent
314edc182a Fix OpenAPI PdfOptions schema: add missing format values, waitUntil field, and template size limits
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m49s
- Updated format enum from 6 to 11 values: added Ledger, A0, A1, A2, A6
- Added waitUntil field with enum: [load, domcontentloaded, networkidle0, networkidle2]
- Added 100KB size limit documentation for headerTemplate and footerTemplate
- Added comprehensive test to verify OpenAPI spec matches validation logic
- All tests passing (463/463)
2026-03-04 11:09:19 +01:00
7d44524ae0 Add input validation for waitUntil and size limits for headerTemplate/footerTemplate
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Add waitUntil validation with allowed values: load, domcontentloaded, networkidle0, networkidle2
- Add size limit validation for headerTemplate and footerTemplate (100KB max)
- Follow TDD approach: 15 new failing tests, then implementation
- All 462 tests passing (was 447)
2026-03-04 11:04:46 +01:00
OpenClaw Bot
646a94dd6a chore: update dependencies (patch/minor)
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m30s
2026-03-04 08:07:28 +01:00
Hoid (Backend Dev)
5f776db662 Fix BUG-099: Add TTL mechanism to provisionedSessions to prevent memory leak
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m22s
- Replace unbounded Set with Map<sessionId, timestamp> tracking insertion time
- Add periodic cleanup every hour to remove entries older than 24h
- Add on-demand cleanup before duplicate checks for timely cleanup
- Add comprehensive TDD tests verifying TTL behavior:
  * Fresh entries work correctly
  * Stale entries (>24h) get cleaned up
  * Fresh entries survive cleanup
  * Bounded size with many entries
- All 447 tests pass including 4 new TTL tests
- Memory leak fixed while preserving DB-level deduplication
2026-03-03 17:06:38 +01:00
DocFast CEO
024fa0084d fix: clean up request interceptor in recyclePage to prevent pool contamination
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)
2026-03-02 17:05:45 +01:00
DocFast CEO
b05bd44432 chore: remove stale documentation and backup Dockerfile
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- BACKUP_PROCEDURES.md (outdated, CNPG handles backups now)
- CI-CD-SETUP-COMPLETE.md (setup notes, not needed in repo)
- Dockerfile.backup (old Dockerfile variant)
2026-03-02 17:03:01 +01:00
DocFast CEO
5aee8ae753 chore: remove stale tracking files and artifact
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Remove \001@ stray file (BUG-031)
- Remove bugs.md, state.json, sessions.md, decisions.md (stale from session 1, real state tracked externally)
2026-03-02 17:02:16 +01:00
6290c3eb97 fix(BUG-095,BUG-097): add Support link to footer partial, expand docs.html footer
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m44s
2026-03-02 14:11:13 +01:00
DocFast CEO
cf1a589a47 chore: bump to v0.5.2, update sitemap dates, add .dockerignore, update deps
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m44s
- Version bump 0.5.1 → 0.5.2 (24 commits since last tag)
- Update sitemap lastmod dates to 2026-03-02
- Add .dockerignore to exclude node_modules, .git, tests from build context
- Update minor deps: pg, puppeteer, stripe, swagger-ui-dist, @types/*
- npm audit: 0 vulnerabilities, 440 tests passing
2026-03-02 08:12:30 +01:00