Repository navigation
Fix dropdowns, photo metadata, queue sections and edge-case bugs - #7
Merged
Merged
Conversation
- Dropdowns: hide the native arrow and draw a chevron with padding, via a shared Select component used by every dropdown. - Photo metadata: "Keep photo metadata" only worked for JPEG to JPEG. EXIF is now read from JPEG, PNG, WebP and HEIC and written back into JPEG, PNG or WebP output (orientation reset to upright). AVIF says it can't store it. When the original file is returned (already optimized), EXIF/XMP is stripped losslessly unless metadata should be kept. The "removed" note only shows when the photo actually had metadata. - Queue: files added while others are processing are listed under "Newly added", with "Compress new files" and "Re-compress all" buttons. All batches share one concurrency limit; files waiting for a slot show "Waiting" and can be cancelled (previously their Cancel did nothing). Claude-Session: https://claude.ai/code/session_011UUBS4XF57trCnZcGwBu35
- Custom target at or above the file size: the original is kept ("Already
under your target") instead of being re-encoded at low quality; the
estimate no longer claims savings. Targets under 1 KB are rejected.
- Small image targets: when quality alone can't reach the target, the image
is shrunk step by step until it fits (5 KB target: 9 KB -> 3.9 KB).
- PDF "Smallest size" with a target: samples the first page at each quality
step and uses the best one that fits, instead of a fixed formula (708 KB
at a 100 KB target: 11 KB -> 68 KB). Rows say when a target couldn't be
reached, with a hint.
- Failures explain why: empty files are rejected on add; unreadable images
and PDFs, password-protected PDFs, unsupported media and a missing
internet connection for the first video each get their own message.
- Trims: end before start is flagged inline and rejected; a start past the
end of the clip is rejected instead of producing an empty file.
- Audio-only WebM recordings (reported as video) are handled as audio.
- Savings estimate covers only the new files when that's what the main
button compresses, and reads as approximate.
Claude-Session: https://claude.ai/code/session_011UUBS4XF57trCnZcGwBu35
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
compressly | e1554f0 | Oct 02 2026, 03:31 AM |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes the three issues reported from manual testing, plus ten edge-case bugs found by testing the production build.
Reported issues
Selectcomponent that hides the native arrow and draws a chevron with padding.src/lib/metadata.tsreads EXIF from JPEG, PNG, WebP and HEIC and writes it into JPEG, PNG or WebP output, resetting the orientation tag to upright. AVIF can't store EXIF, and the file's row says so. When the original is returned because it was already optimized, EXIF and XMP are now stripped losslessly unless metadata should be kept; previously GPS data leaked through in that case.Edge-case bugs
src/lib/errors.tsgives specific messages: empty file (rejected when added), unreadable image or PDF, password-protected PDF, unsupported media.mp4Testing
npm run lintandnpm test(25 unit tests, including new tests for the metadata module and target parsing): passnpm run test:e2e(15 Playwright tests, 5 of them new): pass. They cover keeping and removing metadata through JPEG and WebP, the queue sections and buttons, error messages for broken files, Custom targets (under target, a tiny invalid target, and a PDF target being met without collapsing), and trim validation.🤖 Generated with Claude Code
https://claude.ai/code/session_011UUBS4XF57trCnZcGwBu35
Generated by Claude Code