Commit Graph
19 Commits
Author SHA1 Message Date
anthonyandClaude Sonnet 5 21cca36595 feat: add React frontend and serve it from Express
Also fixes a Windows-specific bug in worker.js and cleanup.js: the
"run only if executed directly" guard compared import.meta.url against
`file://${process.argv[1]}`, which never matches on Windows (backslash
path separators, missing extra slash before the drive letter). main()
silently never ran, so the worker process started and exited
immediately without ever polling. Caught during this task's manual
verification of the full upload-convert-download flow. Fixed with
node:url's pathToFileURL, which builds a correct file:// URL cross-platform.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:54:27 +02:00
anthonyandClaude Sonnet 5 0761f1b76d feat: add cleanup script and o2switch deployment docs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:22:48 +02:00
anthonyandClaude Sonnet 5 360e0ee7a6 feat: add worker process with bounded concurrency and per-job timeout
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:21:42 +02:00
anthonyandClaude Sonnet 5 ceccc1d1af feat: add server entry point
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:20:25 +02:00
anthonyandClaude Sonnet 5 ba5756e122 feat: add job status and download endpoints
Also adds vitest.config.js with fileParallelism: false. Every DB-backed
test file wipes and reseeds the shared conversion_jobs table in
beforeEach; running test files in parallel (Vitest's default) let one
file's DELETE race another file's just-inserted row against the same
live MariaDB instance, causing intermittent cross-file failures.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:17:55 +02:00
anthonyandClaude Sonnet 5 280b249b05 feat: add POST /api/jobs and GET /api/formats endpoints
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:15:13 +02:00
anthonyandClaude Sonnet 5 5cf2ae4d59 feat: validate declared source format against sniffed magic bytes
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:14:16 +02:00
anthonyandClaude Sonnet 5 05ff96b8b3 feat: add best-effort PDF source converters (txt, html, docx)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:12:43 +02:00
anthonyandClaude Sonnet 5 16b4f28b42 feat: add DOCX/TXT/HTML document converters
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:10:34 +02:00
anthonyandClaude Sonnet 5 a049be2fc8 feat: add image to PDF converter
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:08:51 +02:00
anthonyandClaude Sonnet 5 5a990106b0 feat: add image converter family (sharp)
Regenerates the sample.png test fixture via sharp itself: the
hand-encoded base64 PNG from the plan had valid magic bytes (enough to
fool file-type's signature check) but was malformed past the header,
which libpng rejected as soon as sharp actually tried to decode it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:07:26 +02:00
anthonyandClaude Sonnet 5 aeebc47379 feat: add converter registry
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:06:12 +02:00
anthonyandClaude Sonnet 5 4b7ad9ef4e feat: add conversion_jobs repository
Also configures the MariaDB pool with timezone: 'auto', since the
default 'local' mode sends dates without timezone conversion and
silently broke expires_at comparisons whenever the app host and DB
server clocks differ (caught by the findExpiredJobs test).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:03:04 +02:00
anthonyandClaude Sonnet 5 f7c7e547d2 feat: add MIME sniffing and output MIME lookup
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:00:45 +02:00
anthonyandClaude Sonnet 5 d0faa162dc feat: add storage path helpers
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 14:12:13 +02:00
anthonyandClaude Sonnet 5 a5ab05303f feat: add MariaDB schema and connection pool
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 14:09:46 +02:00
anthonyandClaude Sonnet 5 378ca762a2 feat: project scaffolding and env config loader
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 14:06:56 +02:00
anthonyandClaude Sonnet 5 fe93139c6e Add implementation plan for file converter v1 (core + Images + Documents)
18 bite-sized TDD tasks from project scaffolding through the React
frontend and an end-to-end pipeline test, following the approved design
spec.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 13:46:16 +02:00
anthonyandClaude Sonnet 5 020fa199f8 Add design spec for file converter v1 (core + Images + Documents)
Covers architecture, MariaDB job model, conversion registry pattern,
o2switch deployment (Passenger + pm2 worker + cron cleanup), and
anti-abuse/error-handling strategy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-28 14:35:42 +02:00