Commit Graph
117 Commits
Author SHA1 Message Date
anthonyandClaude Sonnet 5 a66143d312 feat(archive): add 7z and tar.7z converters
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 12:53:36 +02:00
anthonyandClaude Sonnet 5 a76b10a43f feat(archive): add tar.bz2 converter via 7za
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 12:52:29 +02:00
anthonyandClaude Sonnet 5 c9251e66e2 feat(archive): add tar and tar.gz converters
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 12:51:34 +02:00
anthonyandClaude Sonnet 5 d68694ead8 feat(archive): add zip converter with compression level and zip-slip protection
archiver v8 (installed) uses a class-based API (`ZipArchive`) rather than
the factory-function API most examples online still describe — adjusted
createZip() to match after the first test run surfaced the mismatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 12:49:46 +02:00
anthonyandClaude Sonnet 5 031df9a999 feat(archive): add double-extension-aware filename parsing helper
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 12:47:27 +02:00
anthonyandClaude Sonnet 5 a7a91a7a2e feat(frontend): add remove button to pending and submitted file cards
Lets users drop an uploaded file from the UI list before or after
conversion, without cancelling anything server-side.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:47:18 +02:00
anthonyandClaude Sonnet 5 987af80286 feat(frontend): redesign homepage and file config form with aurora palette
Rebuild the visual identity from the actual Ombrora mark (violet/cyan aurora
blobs) instead of the generic blue/amber scheme, add Bricolage Grotesque and
IBM Plex Mono for display and code-like text, and give the hero an animated
aurora backdrop, gradient headline, and a format-pair marquee driven by the
real registered converters.

Rework the file config form: target format and icon size are both chip
groups now instead of a native select, and quality/compression sliders get a
gradient-filled track, custom thumb, and a mono value pill to match. File
type icons are color-coded by family (images/documents/fonts/ebooks) and
reused across FileConfigCard, FileCard, and FormatsGrid.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:34:13 +02:00
anthonyandClaude Sonnet 5 023a96e5d8 feat(frontend): show destination format badge, fix download size to reflect converted output
The download button was showing the input file's size (carried over
client-side from upload) instead of the actual converted file's size.
It now reads outputSizeBytes from the polled job status once done.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:14:44 +02:00
anthonyandClaude Sonnet 5 db3e73860b feat(api): expose outputSizeBytes on job status
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:14:38 +02:00
anthonyandClaude Sonnet 5 89749d8c20 fix(frontend): show file size in the download button label
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:10:29 +02:00
anthonyandClaude Sonnet 5 a647bee507 feat(frontend): thread file size from upload through to the download card
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:04:01 +02:00
anthonyandClaude Sonnet 5 f1f7a0162d feat(frontend): add icon/size header, spinner, and styled download button to FileCard
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:02:06 +02:00
anthonyandClaude Sonnet 5 994d70aa62 feat(frontend): restyle format picker and add file size to the config card
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 16:01:37 +02:00
anthonyandClaude Sonnet 5 7c58e50c11 feat(frontend): use flag icons in the language switcher
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 15:59:39 +02:00
anthonyandClaude Sonnet 5 f5958586b7 feat(frontend): add formatBytes util for human-readable file sizes
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 15:53:03 +02:00
anthonyandClaude Sonnet 5 3cff496a85 feat(frontend): add flag-icons dependency
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 15:52:37 +02:00
anthonyandClaude Sonnet 5 d0ff81344f docs: add design spec for file card / language switcher polish
Covers flag-icons for the language switcher, a shared header layout
across the choose/convert/download states, human-readable file sizes,
and restyled format/quality controls and download button.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 15:43:46 +02:00
anthony 005bb0e2a7 package.json > fix npm run deploy for prisma 2026-07-31 15:32:44 +02:00
anthony 9d2a966431 docs: document o2switch's single package.json/node_modules constraint
Explains the react-router-dom resolution failure encountered deploying
the frontend redesign, and the fix (mirror frontend runtime deps into
root package.json) so it doesn't need re-discovering next time.
2026-07-31 15:27:46 +02:00
anthony 4e58568ddd fix(deploy): mirror frontend runtime deps into the root package.json
The o2switch nodevenv/Passenger setup only installs a single
package.json/node_modules (root), so npm install --prefix frontend
never actually populates frontend/node_modules there. Node's module
resolution walks up from frontend/src to the root node_modules, so
adding react-router-dom, react-i18next, i18next, and
@phosphor-icons/react to root's dependencies (react/react-dom were
already present) lets the production vite build resolve them without
needing a second node_modules tree.
2026-07-31 15:26:16 +02:00
anthony 965b2ecc53 style(frontend): responsive polish pass for narrow viewports
Part of the Ombrora Convert redesign (Task 5/5).
2026-07-31 15:00:18 +02:00
anthony 8e405bd3b0 feat(frontend): add per-language SEO metadata, JSON-LD, robots.txt, and sitemap
Part of the Ombrora Convert redesign (Task 4/5).
2026-07-31 14:59:06 +02:00
anthony 2aa8e51b80 feat(frontend): add reassurance strip and supported-formats section
Part of the Ombrora Convert redesign (Task 3/5).
2026-07-31 14:57:46 +02:00
anthony bc7a3b0691 feat(frontend): add routing, layout, i18n wiring, and restyle the conversion tool
Migrates the existing upload/format-select/quality/convert logic from
the old single-file App.jsx into a router shell (/ -> /fr//en/) with a
shared Layout (header, language switcher, dark-mode toggle, footer).
Tool logic itself is unchanged, only restyled into cards.

Part of the Ombrora Convert redesign (Task 2/5).
2026-07-31 14:55:16 +02:00
anthony ee18cc2d90 feat(frontend): add design tokens, dark mode hook, and i18n scaffold
Part of the Ombrora Convert redesign (Task 1/5).
2026-07-31 14:49:19 +02:00
anthony f499196dae docs: add Ombrora Convert frontend redesign implementation plan
5-task plan: design tokens/dark mode/i18n scaffold, routing+layout+
migrated tool, reassurance+formats sections, SEO metadata, responsive
polish.
2026-07-31 14:37:05 +02:00
anthony ab95e3e699 docs: add Ombrora Convert frontend redesign design spec
Foundation sub-project: merged homepage+tool page, FR/EN i18n via URL
prefix, dark mode, SEO basics, and reassurance elements backed by
actual backend guarantees (1h auto-delete, 100MB max, no account).
2026-07-31 14:27:15 +02:00
anthony 5850ca2c68 README.md > Add ffmpeg portable o2switch setup 2026-07-31 14:01:27 +02:00
anthony d811eb0abc README.md > Add Calibre Deploy Method 2026-07-31 13:54:56 +02:00
anthony dd8557e418 docs: add ebook conversion implementation plan 2026-07-31 13:29:11 +02:00
anthony 86b555b334 feat: register ebook converter in the app so the API serves the new family
Also fixes a real bug found via the fb2 API test: file-type sniffs a
real fb2 file's XML declaration as generic "xml", not "fb2" and not
undetected, so it never reached the undetectable-format fallback added
in the previous commit. Added an fb2->xml alias in normalizeFormat,
same pattern as the existing azw3->mobi one.
2026-07-31 13:29:06 +02:00
anthony 977dac35d9 feat: add ebook MIME types, fix azw3/mobi detection collision, trust undetectable ebook formats 2026-07-31 13:25:46 +02:00
anthony 534630ab4e feat: give ebook conversions their own worker timeout and register the converter 2026-07-31 13:24:49 +02:00
anthony f796c0bd97 feat: add configurable ebookJobTimeoutMs to config 2026-07-31 13:23:30 +02:00
anthony b95e371989 feat: add ebook converter wrapping Calibre's ebook-convert CLI 2026-07-31 13:23:01 +02:00
anthony 0cef6842de docs: add ebook conversion design (Calibre ebook-convert wrapper) 2026-07-31 13:13:49 +02:00
anthonyandClaude Sonnet 5 e7c30202f5 feat: register font/dfont converters in the app and worker
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 12:59:19 +02:00
anthonyandClaude Sonnet 5 be50f1f076 feat: add font MIME types and fix dfont/ico detection collision
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 12:57:35 +02:00
anthonyandClaude Sonnet 5 2cde4ec035 feat: add source-only dfont font converter
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 12:56:13 +02:00
anthonyandClaude Sonnet 5 e5e4f31e9b feat: add bidirectional ttf/otf/woff font converter
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 12:55:19 +02:00
anthonyandClaude Sonnet 5 b61e6e2df3 feat: add font conversion dependencies and test fixtures
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 12:54:32 +02:00
anthony 1eb391242f Add implementation plan for font conversion (ttf/otf/woff/dfont)
Five TDD tasks: dependencies+fixtures, ttf/otf/woff converter,
dfont extraction converter, mime.js fixes, and wiring+API tests.
2026-07-31 10:58:53 +02:00
anthony eb211d5672 Fix fontkit import in font conversion spec
Verified empirically: fontkit has no default ESM export in this project's
"type": "module" setup (import fontkit from 'fontkit' throws). The working
form is import * as fontkit from 'fontkit'.
2026-07-31 10:53:07 +02:00
anthony bd13bc1c9a Add design spec for font conversion (ttf/otf/woff/dfont; cff/cid dropped)
Empirically verified library choices (fonteditor-core, opentype.js, fontkit)
against real fonts before committing to the scope, and root-caused a
file-type/dfont MIME collision that would otherwise silently break uploads.
2026-07-31 10:50:44 +02:00
anthonyandClaude Sonnet 5 25a95f1ea3 feat: add ICO size picker to the upload UI
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:18:07 +02:00
anthonyandClaude Sonnet 5 598781f417 feat: register ICO/HEIC/HEIF converters in the worker and pass iconSize through
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:16:25 +02:00
anthonyandClaude Sonnet 5 67bdfbf3de feat: wire ICO/HEIC/HEIF converters and iconSize validation into the API
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:15:14 +02:00
anthonyandClaude Sonnet 5 be43eac13a feat: thread iconSize through jobRepository
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:13:15 +02:00
anthonyandClaude Sonnet 5 1ff660a3d2 feat: add iconSize column to ConversionJob
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:12:32 +02:00
anthonyandClaude Sonnet 5 8795f65055 feat: add source-only HEIC/HEIF image converter
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 10:10:41 +02:00