Skip to content

Releases: rohanpandula/ScanStudio

ScanStudio 0.5.0-beta.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Aug 21:35
4464082

ScanStudio 0.5.0-beta.2 supersedes beta.1 within hours, on purpose: a post-release adversarial review of beta.1's own power-on preview fix found a hole worth closing immediately, before anyone's film meets it.

Everything in beta.1 -- the wide-gap retry, the plain-English failure diagnosis, manual frame placement, and the rest of that changelog -- is unchanged and carries forward.

What changed since beta.1

The power-on preview acceptance is tighter. beta.1 taught the preview validator to accept a bookkeeping pattern the scanner emits after a cold start. The review found the acceptance also admitted a two-sided version of that pattern -- which is what a one-row slip inside the scanner's data stream looks like, and accepting it would have silently shifted every frame after the slip by one preview row: a wrong crop reported as a clean, confident preview. The validator now accepts exactly the shape observed on real hardware (one side of the stream changes, the other must hold steady) and refuses the slip signature with the same error it used before. The reviewer's construction ships as a permanent regression test; this morning's real cold-start capture still previews perfectly.

Small hardening in the failed-preview cleanup from the same review: the teardown path can no longer be preempted by a second error while releasing the capture worker.

Driver 0.2.1 on PyPI, in lockstep. pip install coolscanpy users get the identical fix; the release gate verified the match before this build existed.

ScanStudio 0.5.0-beta.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Aug 20:13
8ed3a03

ScanStudio 0.5.0-beta.1 is the first prerelease of the 0.5 line. The headline: when the roll detector cannot find your frames, the app now works with you instead of just refusing -- an automatic wider-gap retry, a plain-English explanation of what the film actually measures, and full manual frame placement as the last resort. This release exists because of the instrumented error reports several of you posted on #23 and #24: keep them coming.

Support levels are unchanged from 0.4.0-beta.1: macOS Apple Silicon is Beta (real-film validated, including this release's new detection paths live on real rolls); macOS Intel, Windows x64, and Linux x64 remain Preview (built and package-verified in CI, real-scanner validation pending).

Starting with this release, the standalone coolscanpy driver on PyPI ships in lockstep with the app -- 0.5.0-beta.1 bundles driver 0.2.0, and pip install coolscanpy gets the identical detection code. A release can no longer build with a driver PyPI does not have.

Everything that changed since 0.4.0-beta.1

Wide-gap recovery (#23, #24). Strips whose blank gaps run wider than the detector's window -- one reporter's payload measured a 14-row gap against the [3,12] accept window, with gap contrast riding the clear-film floor -- used to refuse outright. Detection now runs exactly as before, and only when it fails for lack of gaps does a second pass admit 13-20-row gaps as anchors. Everything it finds is flagged for review, capped at medium confidence, and can never scan unattended. Rolls the normal pass already handles are byte-for-byte unchanged -- replayed against every archived capture to prove it.

Plain-language failure diagnosis. A refusal now tells you what the film measures when the evidence clearly points at one cause: "this looks like half-frame film," "the blank strips between your frames measure about 0.5 mm -- too narrow," "the blank film is only slightly clearer than the frames -- could be fog or a dense base," "one edge of the film window looks partly blocked -- check the holder seating." The analyzer is structurally incapable of producing frames, so a wrong guess can never become a wrong crop, and it stays silent rather than speculating.

Manual frame placement. When detection genuinely cannot handle the film, the failure card offers "Place frames manually": the whole captured strip renders in an editor, you drag boundary lines onto it, and those frames flow through the normal approve-then-scan path. The scanner keeps every physical check it can still make -- each line is resolved against the scanner's own position readings using the same math the automatic path trusts (validated by feeding the automatic detector's own boundaries back through manual placement on every archived capture: exact agreement), frames taller than the scanner's fixed 38.7 mm capture window refuse at placement time instead of silently truncating, and a placement whose position data cannot be verified refuses with a plain sentence. Approvals are cryptographically tied to the exact placement they approved: a failed replacement can never inherit an old approval, approving a frame you were never shown is refused, and "use anyway" decisions die with the placement they were made for.

First preview after power-on no longer fails (found live during this release's own validation). After a cold start the scanner's preview stream changes its internal bookkeeping partway through the capture -- right past the film's end -- and the validator refused the whole preview with "index row framing mismatch." The exact shape is now recognized (and only that shape: corruption still refuses). If your very first preview after switching the scanner on ever failed this way, this was it.

A failed preview can no longer strand the scanner. When a preview failed at the validation stage, its background capture worker could be left holding the USB claim, making every later connection fail with a permissions error until the process was killed by hand. Every preview failure now tears that worker down before the error reaches you.

Partial-frame marker actually reaches the app. The bridge has always been able to mark a frame whose crop runs off the preview edge (common near a roll's start or end); the engine silently dropped the field. It now arrives, so partial frames can be shown as such.

C-41 derivative metadata corrected. Positive TIFFs and preview JPEGs embed a deterministic ICC profile compatible with Adobe RGB (1998); full-resolution positives carry the capture's real pixels-per-inch; downsampled previews no longer falsely claim capture resolution. Archival masters are never rewritten by this correction.

Capture receipts record real per-frame timing. An authoritative UTC start and measured duration per frame (metering through capture-quality checks), surviving every layer down to the app. Legacy receipts show timing as not recorded instead of inventing values.

Under the hood. The detection changes above went through four independent adversarial review rounds before landing; over twenty findings -- including one full rejection and rebuild of the manual-placement position math against real scanner position tables -- were fixed with committed regression tests. The archived-capture acceptance test now runs in the suite so synthetic-only blindness cannot recur. Suites at release: driver 1646, bridge 320, engine 523, app 456.

Known limits

  • A recovered (wide-gap) roll previews and shows its frames but still requires your approval before scanning -- unattended scanning of recovered detections is deliberately not enabled yet.
  • Manual placement caps frames at the scanner's single-pass capture window (38.7 mm). Panoramic frames need a future multi-window capture to be honest; today they refuse with an explanation instead of silently cropping.
  • Raw DNG / linear TIFF export (#41) is built and under final review on its own branch; it ships in the next prerelease.

ScanStudio 0.4.0-beta.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Aug 00:14
63ea50a

ScanStudio 0.4.0-beta.1 is the first prerelease of the 0.4 line. The headline: multi-batch roll capture now runs on one transport reservation from feed to eject, which fixes the mid-roll failure several of you hit past frame 30.

Support levels are unchanged from 0.3.0-beta.3:

  • macOS Apple Silicon: Beta. The Nikon LS-5000 real-film workflow has been validated, including the new multi-batch session shape on a full 36-exposure roll.
  • macOS Intel: Preview. Built and package-tested natively in CI; real-scanner validation is still pending.
  • Windows x64: Preview. The native installer is built, installed, and checked in CI. The portable archive requires Microsoft Edge WebView2 to already be installed, so clean systems should use setup.exe. Scanner access requires WSL2 with Ubuntu 24.04 and usbipd-win. Real-scanner validation is pending.
  • Linux x64: Preview. The AppImage and portable archive are built and package-verified on Ubuntu 22.04. The host must provide compatible SANE/libusb runtime packages and scanner permissions. Real-scanner validation is pending.

Everything that changed since 0.3.0-beta.3

One reservation from feed to eject (#30). Every scan_many() call used to open its own transport reservation. The second batch mid-roll replayed the SET_WINDOW preamble about 30 frames in, and the scanner answered sense 052600 -- the "ScanStudio could not complete that action (INTERNAL)" report. Now preview() keeps its reservation open and every scan_many()/scan() that follows resumes it, indefinitely, until eject_after=True, Roll.eject(), Roll.release(), or Roll.close() ends the session. This is the vendor's own traced session shape. Validated on real film: 34/34 frames across two batches on a single reservation, frame 31+ clean, single release, traced eject.

Behavior change: batches hold the reservation. scan_many() without eject_after no longer releases after the batch. If you scripted against the old per-batch release (for example to force a refeed between batches), call roll.release() explicitly.

Behavior change: eject goes through the held reservation. Roll.eject() replays the traced software eject sequence instead of delegating to the SANE path. A suspected transport wedge during that sequence raises FeederParked (power-cycle required) instead of silently falling back.

New padding dialect accepted (post-power-on scans). The LS-5000 stamps a previously unseen padding counter dialect (f6b1-prefixed) on the first fine scan after a power-on. The capture validator refused it -- correctly, fail-closed, with the full stream retained -- and it is now accepted as the sixth known stable form. If your very first scan after switching the scanner on ever failed with "packed-stream decode refused", this was it.

Streaming decoder enforces one dialect per stream. The offline decoder always refused streams whose padding dialect changed mid-stream; the streaming decoder validated each record independently and would have accepted them. Both paths now refuse identically. Never observed on real hardware; closed as a hardening fix.

Integration test for the exact live session shape. A new test drives the real capture worker (only the USB transport faked) through one feed-to-eject, two-batch reservation -- the shape that found four resume-path bugs on real film before it existed. The vendored suite is 1543 tests.

Fixed a flaky concurrent-close handshake test (#40).

Versioning going forward. Feature releases bump the minor version and start a new beta line (this release). Bug-fix rounds bump the prerelease number (0.4.0-beta.2, ...). A field-proven line cuts the plain stable so the updater's stable channel means something.

The macOS builds are ad-hoc signed and not notarized. The Windows installer is unsigned and may show a SmartScreen warning. The Linux packages are unsigned. Review SHA256SUMS before installing when downloading outside the GitHub Releases page.

ScanStudio 0.3.0-beta.3

Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Aug 05:23
1fcdf67

ScanStudio 0.3.0-beta.3 is one prerelease with four clearly separated support levels.

  • macOS Apple Silicon: Beta. The Nikon LS-5000 real-film workflow has been validated.
  • macOS Intel: Preview. Built and package-tested natively in CI; real-scanner validation is still pending.
  • Windows x64: Preview. The native installer is built, installed, and checked in CI. The portable archive's contents and engine sidecar are checked; it requires Microsoft Edge WebView2 to already be installed, so clean systems should use setup.exe. The bundled Python bridge and dependency wheelhouse install without PyPI access, but Ubuntu system prerequisites still require apt/network. Real-scanner validation is pending. Scanner access requires WSL2 with Ubuntu 24.04 and usbipd-win.
  • Linux x64: Preview. The AppImage and portable archive are built and package-verified on Ubuntu 22.04, including their contents, engine sidecar, bundled bridge launch/import, and python-sane imports. The Tauri GUI and real scanner have not been validated end to end. The host must provide compatible SANE/libusb runtime packages and scanner permissions.

The macOS builds are ad-hoc signed and not notarized. The Windows installer is unsigned and may show a SmartScreen warning. The Linux packages are unsigned. Review SHA256SUMS before installing when downloading outside the GitHub Releases page.

Choose the DMG matching your Mac. Windows users should use setup.exe on a clean system; the portable zip is for systems that already have WebView2. Linux users can choose the AppImage or extracted portable tarball.

ScanStudio 0.3.0-beta.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Aug 21:55
9a8e572

ScanStudio 0.3.0-beta.2 is one prerelease with four clearly separated support levels.

  • macOS Apple Silicon: Beta. The Nikon LS-5000 real-film workflow has been validated.
  • macOS Intel: Preview. Built and package-tested natively in CI; real-scanner validation is still pending.
  • Windows x64: Preview. The native installer is built, installed, and checked in CI. The portable archive's contents and engine sidecar are checked; it requires Microsoft Edge WebView2 to already be installed, so clean systems should use setup.exe. The bundled Python bridge and dependency wheelhouse install without PyPI access, but Ubuntu system prerequisites still require apt/network. Real-scanner validation is pending. Scanner access requires WSL2 with Ubuntu 24.04 and usbipd-win.
  • Linux x64: Preview. The AppImage and portable archive are built and package-verified on Ubuntu 22.04, including their contents, engine sidecar, bundled bridge launch/import, and python-sane imports. The Tauri GUI and real scanner have not been validated end to end. The host must provide compatible SANE/libusb runtime packages and scanner permissions.

The macOS builds are ad-hoc signed and not notarized. The Windows installer is unsigned and may show a SmartScreen warning. The Linux packages are unsigned. Review SHA256SUMS before installing when downloading outside the GitHub Releases page.

Choose the DMG matching your Mac. Windows users should use setup.exe on a clean system; the portable zip is for systems that already have WebView2. Linux users can choose the AppImage or extracted portable tarball.

Upgrading from an alpha: alphas have no in-app updater, so download this release manually once. From beta.1 onward, updates arrive in-app via Settings → Check for Updates.

ScanStudio 0.3.0-beta.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Aug 01:05
771b3b9

ScanStudio 0.3.0-beta.1

Apple Silicon (arm64): Beta. Validated with the real LS-5000 workflow.
Intel (x86_64): Preview. Built and tested natively in CI; real-scanner validation is still pending.

Both builds are ad-hoc signed and are not notarized. macOS may require Control-click > Open on first launch. Do not disable Gatekeeper globally.

arm64 SHA-256: 33e65a91ff6548f44f71b90089a33d367328b56ce9a5e8bc90b13032510cb17d
x86_64 SHA-256: 4f1806b34436ce0b3754ba35c8652dd92609034d5f680d5f975d52eefa248a16

ScanStudio 0.3.0 alpha 9

Pre-release

Choose a tag to compare

@rohanpandula rohanpandula released this 03 Aug 00:41
564dd53

ScanStudio 0.3.0 alpha 9

This alpha fixes saved frame orientation and makes interrupted film feeds safer and clearer.

  • Rotation, horizontal mirror, and vertical mirror are now applied to newly generated Positive TIFF/JPEG files and preview images.
  • Archival master RGB, infrared, and meter files remain untouched. Receipts record the exact saved orientation so the package stays reproducible.
  • If the scanner loses the film mid-batch, ScanStudio now reports a clear feed interruption, keeps completed frames, and tells you to refeed, acquire a fresh preview, and resume the unfinished frames.
  • ScanStudio never retries, ejects, or moves the film automatically after a feed interruption.
  • Scan startup and frame-alignment controls now lock each other safely, preventing overlapping scanner movement.
  • A flaky preview-detach test was made scheduler-safe without changing production scanner behavior.

ScanStudio is currently a macOS Apple-silicon alpha. The app is ad-hoc signed and not Apple-notarized, so macOS may require the documented first-launch approval.

ScanStudio 0.3.0 alpha 11

Pre-release

Choose a tag to compare

@rohanpandula rohanpandula released this 03 Aug 09:41
3f4d5aa

ScanStudio 0.3.0 alpha 11

This alpha fixes color metadata and scan-timing receipts.

  • C41 Positive TIFFs and JPEGs now include a ScanStudio RGB profile compatible with Adobe RGB (1998), so color-managed apps interpret them correctly.
  • Full-resolution Positive TIFFs now record the scanner's actual capture resolution instead of 1 × 1 undefined resolution.
  • New receipts now use the real per-frame capture start, end, and duration reported by the scanner worker.
  • Older receipts with no recorded timing now show “Not recorded” instead of presenting zero as a measured scan time.
  • Archive RGB masters, infrared layers, meter layers, and existing sealed receipts remain unchanged.

ScanStudio is currently a macOS Apple-silicon alpha for macOS 14 or later. The app is ad-hoc signed and not Apple-notarized, so macOS may require the documented first-launch approval.

Validation

  • Source commit: 3f4d5aa02da7a05d59f487f462ae3c124ab61006
  • Pull request: #13
  • Branch push CI: 30800471000 — passed
  • Pull-request CI: 30800670649 — passed
  • Merged-main CI: 30801165173 — passed
  • Tag CI: 30801712280 — passed
  • Every CI run passed app/engine, bridge, CoolScanPy, self-contained package, and macOS 14 package-floor verification.
  • Local suites passed: CoolScanPy 1,400 passed / 3 skipped / 1 expected failure; bridge 284 passed; Swift 401 tests in 40 suites; full Rust suite passed with two explicit real-archive tests intentionally ignored by default.
  • Real saved-archive replay passed with archive bytes unchanged, embedded ICC present, 4000 DPI retained, TIFF validation OK, and zero pixel difference from the existing Positive image.
  • Packaged launcher arming, bridge relocation, direct-helper execution, deep/strict signature verification, arm64 architecture, and macOS 14 deployment-floor checks passed.

Release artifact

  • Filename: ScanStudio-0.3.0-alpha.11-macOS-arm64.dmg
  • Size: 90,735,944 bytes
  • SHA-256: 2aa7f45a6309f171e6d1f48219f3619f87761580c49884fa5b1dc2d810ef1ed8

ScanStudio 0.3.0 alpha 10

Pre-release

Choose a tag to compare

@rohanpandula rohanpandula released this 03 Aug 02:01
964dfc9

ScanStudio 0.3.0 alpha 10

This alpha prevents a partly clipped first exposure from being silently hidden.

  • If enough of a leading frame is visible to prove that it exists but its full scan origin is outside the captured preview, ScanStudio stops and asks you to insert the film a little farther and preview again.
  • ScanStudio no longer presents frames 2–6 as a five-frame strip in that situation.
  • It does not offer the cropped first frame for scanning or clamp it into frame 2's area.
  • Normal clear leader remains accepted, and the existing safe one-row edge case remains available for manual review.
  • Rotation, horizontal mirror, and vertical mirror continue to be applied to newly generated Positive TIFF/JPEG and Preview files.
  • Archival RGB masters, infrared layers, and meter layers remain untouched, while receipts record the saved orientation.

ScanStudio is currently a macOS Apple-silicon alpha. The app is ad-hoc signed and not Apple-notarized, so macOS may require the documented first-launch approval.

ScanStudio 0.3.0 alpha 8

Pre-release

Choose a tag to compare

@rohanpandula rohanpandula released this 02 Aug 21:33
e3f4a49

Alpha 8 fixes the six-frame Save Roll loop and finishes the contact-sheet photo controls.

What changed

  • Save & Review now asks for the roll name once, preserves the original selected frames, and continues directly into required boundary review or scanning. It no longer loops back to the selector.
  • Scan selection and edit focus are separate, so all six photos can stay selected while you rotate or mirror one focused photo.
  • Rotated contact-sheet cards and filmstrip thumbnails switch to portrait proportions instead of adding black bars.
  • Added vertical mirror alongside horizontal mirror.
  • Added global shortcuts: Command-L rotate left, Command-R rotate right, Shift-Command-H flip left/right, Option-Command-V flip top/bottom.
  • ScanStudio is now explicitly single-window, matching its one physical scanner session and keeping shortcut focus unambiguous.

Important alpha note
Rotation and mirror are display-only in this release. They help inspect and organize previews, but saved scan output is unchanged.

Validation

  • Tested on the real Nikon LS-5000 ED with an SA-21 and a six-frame strip; no simulator was used.
  • The real preview found all six frames. All six stayed selected while only frame 3 rotated and mirrored.
  • Naming the roll opened the required frame 1/frame 6 boundary review with the original six-frame request intact. The test was cancelled before fine-scan motion.
  • 387 Swift tests, the full Rust engine suite, 272 bridge tests, and 1,367 CoolscanPy tests passed.
  • The self-contained package and macOS 14 runtime checks passed.

Install
Download the DMG, open it, and drag ScanStudio to Applications. This alpha is for Apple-silicon Macs running macOS 14 or newer.

SHA-256
333eb7dd43f8b2ced0699e9c7d864c47d00ae7f935dcf947ad9dfbeb9657f193 ScanStudio-0.3.0-alpha.8-macOS-arm64.dmg