Files
alchemist/CHANGELOG.md
bybrooklyn 9fb6b480eb chore: release v0.3.0
Since v0.2.9, Alchemist gains the first stable 0.3.0 release with:

Security:
- Fixed a critical bug where a config parse failure on a configured instance could re-enable unauthenticated setup endpoints.
- Session cookies are no longer marked Secure by default, restoring plain HTTP and LAN login flows unless ALCHEMIST_COOKIE_SECURE=true is set.
- Restricted /api/fs/* filesystem browsing to loopback clients during initial setup.
- Hardened proxy header handling with explicit trust configuration.

Library and encoding:
- Added per-library transcoding profiles with built-in presets.
- Added lossless MP4/MOV to MKV remuxing when a file is already in the target codec.
- Added subtitle sidecar extraction for text subtitle tracks.
- Added stream rules for commentary stripping, language filtering, and default-track retention.
- Added optional VMAF quality gating.
- Added duplicate detection in Library Intelligence.
- Added Library Doctor health scanning.
- Added mirrored output roots.

Job management:
- Added Skipped and Archived tabs.
- Added sort controls for jobs.
- Added per-job priority promotion.
- Added live retry countdowns.
- Added structured skip explanations.
- Added structured failure explanations.

Engine control:
- Added Background, Balanced, and Throughput runtime modes with manual overrides.
- Added drain mode.
- Added boot-time auto-analysis of queued jobs.

UI redesign:
- Replaced page h1 blocks with a compact engine control strip.
- Restructured the dashboard around compact stats, savings, and recent activity.
- Grouped log viewer entries by job.
- Rebuilt the setup wizard inside the main shell.
- Redesigned library selection around recommendations and chips.
- Replaced custom stats bars with Recharts area and bar charts.
- Merged hardware into Transcoding settings.
- Merged notifications and automation into one tab.
- Improved mobile navigation and jobs layout.
- Tightened typography and token usage across the design system.
- Added analyzing shimmer states and protected terminal job states from poll overwrites.

Reliability and stability:
- Added exponential retry backoff.
- Cleaned orphaned temp outputs and subtitle sidecar temp files on startup.
- Fixed infinite analysis loops and boot-analysis pagination.
- Kept the engine running when the queue drains so new watcher jobs are picked up.
- Serialized analysis passes and dropped overlapping watcher-triggered passes.
- Added job stall detection.
- Fixed graceful shutdown on Ctrl+C and SIGTERM.
- Added log retention pruning.
- Added auth session cleanup.
- Cached /api/system/resources for 500ms.
- Added a Drop guard for in_flight_jobs.
- Stopped re-probing completed job detail source files when encode_stats already exist.

Hardware and encoding:
- Fixed Apple VideoToolbox encodes with -allow_sw 1, yuv420p conversion, and hvc1 tagging.
- Switched Intel Arc selection to VAAPI-first with QSV as last resort.
- Improved audio planning so lossless codecs transcode while common Atmos/EAC3 tracks can copy.
- Added libopus runtime fallback to AAC when libopus is unavailable.
- Surfaced fuller FFmpeg failure logs and VideoToolbox-specific failure explanations.

Backend architecture:
- Upgraded to Rust 2024 and MSRV 1.85.
- Upgraded sqlx to 0.8 and rand to 0.9.
- Removed async-trait in favor of native async fn traits with trait-variant where needed.
- Split server.rs into focused submodules.
- Moved ffprobe execution to tokio::process::Command with a timeout.
- Split high-volume and low-volume broadcast channels.
- Hardened cancellation-lock recovery and stderr truncation.
- Added warnings for invalid notification and schedule JSON plus safer analysis pagination limits.

Database:
- Extended decisions with structured reason codes and payload JSON.
- Added job_failure_explanations with legacy fallback support.
- Added indexes for structured explanation filtering.
- Preserved automatic upgrades from 0.2.5 onward.

CI/CD and tooling:
- Added nightly workflows using the shared build pipeline.
- Added actionlint to release checks.
- Added the Playwright reliability suite to CI.
- Documented and validated the Windows contributor workflow.
- Expanded just release-check to cover fmt, clippy, tests, actionlint, web verify, docs build, E2E, and backend build.
- Standardized release binaries and checksums.
- Published multi-arch Docker images for linux/amd64 and linux/arm64.

Release metadata and docs cleanup:
- Bumped Cargo, VERSION, web, web-e2e, and docs manifests to 0.3.0.
- Updated stable changelog dates and nightly image references.
- Removed stale RC-era Windows wording from the README and docs.
- Clarified that the Windows core contributor path is supported while broader utility and release recipes remain Unix-first.
- Clarified that AMD AV1 remains outside the validated 0.3.0 support matrix.
- Aligned Docker Compose, Helm, and release-facing docs on ghcr.io/bybrooklyn/alchemist.
2026-04-06 11:25:48 -04:00

12 KiB
Raw Blame History

Changelog

All notable changes to this project will be documented in this file.

[0.3.0] - 2026-04-06

Security

  • Fixed a critical bug where a config parse failure on a configured instance would re-enable unauthenticated setup endpoints (filesystem browse, settings bundle) for any network client.
  • Session cookies are no longer marked Secure by default, which was breaking login over plain HTTP/LAN. Opt in with ALCHEMIST_COOKIE_SECURE=true for reverse-proxy deployments.
  • /api/fs/* filesystem browsing is now restricted to loopback connections only during the initial setup flow.
  • Proxy header handling hardened with explicit trust configuration for reverse-proxy deployments.

New Features

Library & Encoding

  • Per-library profiles — each watch folder gets its own transcoding profile. Four built-in presets (Space Saver, Quality First, Balanced, Streaming) are ready to use or customize.
  • Container remuxing — files already in the target codec but wrapped in MP4/MOV are remuxed to MKV losslessly, skipping a full re-encode.
  • Subtitle sidecar extraction — text-based subtitle tracks (SRT, ASS, VTT) can be extracted as separate files alongside the output rather than muxed in.
  • Stream rules — strip audio tracks by title keyword (e.g. commentary tracks), filter by language code, or keep only the default audio track.
  • VMAF quality gating — encodes scoring below a configurable threshold are rejected and the source is preserved.
  • Library Intelligence — duplicate detection surfaces files with matching stems across the library.
  • Library Doctor — health scanning detects corrupt or broken files directly from System Settings.
  • Mirrored output root — write transcoded files to a separate directory tree that mirrors the source structure, rather than alongside the source.

Job Management

  • Skipped tab — dedicated tab for skipped jobs with structured skip reasons.
  • Archived tab — cleared completed jobs are preserved in an Archived tab rather than disappearing permanently.
  • Sort controls — sort the job list by last updated, date added, file name, or file size.
  • Per-job priority — promote individual jobs up the queue from the job detail panel.
  • Retry countdown — failed jobs waiting to retry show "Retrying in 47m", updated live every 30 seconds.
  • Structured skip and failure explanations — skip reasons and failure summaries are stored as structured payloads with a code, plain-English summary, measured values, and operator guidance; surfaced in the job detail panel before the raw FFmpeg log.

Engine Control

  • Engine runtime modes — Background (1 job), Balanced (half CPU count, capped at 4), and Throughput (half CPU count, uncapped). Manual concurrency and thread overrides available in the Advanced panel.
  • Drain mode — stop accepting new jobs while letting active encodes finish cleanly.
  • Boot auto-analysis — ffprobe runs on all queued jobs at startup so skip/transcode decisions are pre-computed before the engine starts.

UI Redesign

  • Removed page h1 headers; replaced the old header block with a thin engine control strip showing the status dot, Start/Pause/Stop, mode pills, About, and Logout in one row.
  • Dashboard restructured around a compact stat row, savings summary card, and a larger Recent Activity panel.
  • Log viewer groups entries by job into collapsible sections; system-level log lines render inline between groups.
  • Setup wizard rebuilt inside the main app shell with a grayed sidebar, 2px solar progress line, and a welcome step (logo + tagline + Get Started) before the admin account form.
  • Library selection redesigned around a flat recommendation list with Add buttons, selected-folder chips, and a Browse/manual path option; the old preview panel was removed.
  • Statistics page uses recharts AreaChart for savings over time and BarChart for codec breakdown, replacing custom CSS bars.
  • Hardware settings merged into the Transcoding tab. Notifications and Automation merged into one tab.
  • Mobile layout: hamburger sidebar overlay, jobs table collapses date/priority columns below md breakpoint, stat cards use a 2×2 grid on small screens.
  • Font updated from Space Grotesk to DM Sans; sidebar active state uses a left accent bar; border radius scale tightened throughout.
  • Design system token compliance pass across all settings components: toggle switches, form labels, and text-on-color elements now use helios tokens exclusively.
  • Analyzing job rows show an indeterminate shimmer instead of a static 0.0% label.
  • Poll-based job state updates no longer overwrite terminal states that arrived via SSE.

Reliability & Stability

  • Exponential retry backoff for failed jobs: 5 / 15 / 60 / 360 minute delays by attempt count.
  • Orphaned temp file cleanup on startup: interrupted encodes and subtitle sidecar temp files no longer accumulate on disk.
  • Fixed infinite analysis loop: jobs with an existing decision row are excluded from analysis batches, preventing transcodable jobs from being re-analyzed on every pass.
  • Boot analysis processes jobs in batches of 100 from offset 0, fixing a pagination bug where transcodable jobs shifted out of later pages after earlier jobs were decided.
  • Engine no longer auto-pauses when the queue empties; it stays Running and picks up new files as the watcher delivers them.
  • Analysis semaphore serializes all analysis passes; watcher-triggered passes are dropped (not queued) when a pass is already running.
  • Job stall detection added to surface encodes that stop making progress.
  • Ctrl+C / SIGTERM exits cleanly after graceful shutdown. Background tasks no longer prevent process exit.
  • Log table pruning: configurable retention period (default 30 days) prevents unbounded log growth.
  • Auth session cleanup: expired sessions pruned on startup and every 24 hours.
  • Resource endpoint caching: /api/system/resources cached 500ms to prevent redundant OS probes from multiple open tabs.
  • Drop guard added to in_flight_jobs counter so it decrements correctly even on panic.
  • Completed job detail no longer re-runs ffprobe on the source file; encode_stats is the authoritative source for post-encode metadata.

Hardware & Encoding

  • Apple VideoToolbox — encode commands now include -allow_sw 1 (software fallback) and format=yuv420p (required pixel format), fixing all VideoToolbox encodes on macOS. HEVC output tagged as hvc1 for Apple device compatibility.
  • Intel Arc — VAAPI-first detection with i915/xe driver; QSV retained as last-resort fallback only.
  • Audio planning — lossless codecs (TrueHD, MLP, DTS-HD, FLAC, PCM) trigger transcoding; standard Atmos/EAC3 at any bitrate now copies through without re-encoding.
  • libopus fallback — audio transcoding for MKV now checks for libopus availability at runtime and falls back to AAC when it is absent (common on macOS FFmpeg builds).
  • FFmpeg encode failures write the full error (last 20 lines of stderr) to the job log; failure explanations in the UI include VideoToolbox-specific patterns (vt_compression, mediaserverd, no capable devices).

Backend Architecture

  • Upgraded from Rust 2021 to Rust 2024 edition, MSRV set to 1.85.
  • sqlx upgraded to 0.8 with runtime-tokio-rustls; rand upgraded to 0.9.
  • Removed async-trait; all traits use native async fn. trait-variant added for object-safe Arc<dyn ExecutionObserver>.
  • server.rs split into focused submodules: auth, jobs, scan, settings, stats, system, sse, middleware, wizard.
  • ffprobe execution moved to tokio::process::Command with a 120-second timeout.
  • Typed broadcast channels separate high-volume events (progress, logs) from low-volume system events (config, status).
  • Poisoned cancellation lock recovery added to the orchestrator; oversized FFmpeg stderr lines truncated before logging.
  • Invalid notification event JSON and invalid schedule day JSON now log a warning rather than silently disabling the target or treating it as empty.
  • Database connection pool capped; OOM protection added to analysis batch queries via LIMIT/OFFSET pagination.

Database

  • decisions table extended with reason_code and reason_payload_json for structured skip reason storage.
  • job_failure_explanations table added for structured failure explanations, with legacy_summary fallback for pre-0.3 rows.
  • Index on decisions(reason_code) and job_failure_explanations(code) for fast filtering.
  • All databases from v0.2.5 onwards upgrade automatically; no manual migration required.

CI/CD & Tooling

  • Nightly workflow: runs on every push to main after checks pass, builds all platforms, publishes ghcr.io/bybrooklyn/alchemist:nightly with {VERSION}-nightly+{short-sha} versioning.
  • Shared reusable build.yml workflow so nightly and release builds use identical pipelines.
  • actionlint added to just release-check.
  • E2E reliability suite (just test-e2e) runs in CI after the frontend check passes.
  • Windows contributor workflow documented and validated: just install-w, just dev, just check.
  • just release-check covers fmt, clippy (-D warnings -D clippy::unwrap_used -D clippy::expect_used), tests, actionlint, web verify, docs build, E2E, and backend build in sequence.
  • Release binaries ship as .tar.gz (Linux/macOS) and .exe (Windows), each with a SHA256 checksum. Multi-arch Docker images published for linux/amd64 and linux/arm64.

[v0.2.9] - 2026-03-06

  • Runtime reliability pass: watcher/scanner hardening, resilient event consumers, config reload improvements, and live hardware refresh.
  • Admin UX refresh across dashboard, settings, setup, logs, jobs, charts, and system status with stronger error handling and feedback.
  • Frontend workflow standardized on Bun, Playwright reliability coverage added under web-e2e, and deploy/docs/container updates shipped together.

[v0.2.8] - 2026-01-12

  • Setup wizard auth fixes, scheduler time validation, and watcher reliability improvements.
  • DB stability pass (WAL, FK enforcement, indexes, session cleanup, legacy watch_dirs compatibility).
  • Build pipeline updates (rustls for reqwest, cross-platform build script, WiX workflow fix).
  • Documentation and design philosophy updates.
  • More themes!!

[v0.2.5] - 2026-01-11

Fixes

  • Dashboard Crash: Fixed a critical bug where the dashboard would render as a blank screen if GPU utilization was null. Added strict null checks before toFixed() calls in ResourceMonitor.tsx.
  • Animation Glitch: Resolved an issue where the "Engine Status" button would fly in from the top-left corner on page navigation. Implemented unique layoutId generation using useId() to maintain the morph animation while preventing cross-page artifacts.
  • Migration Checksum: Fixed a startup error caused by a modified migration file. Reverted the original migration to restore checksum integrity and created a new migration for the version bump.

Improvements

  • Resource Monitor Layout: Repositioned the GPU Usage section to appear between "Active Jobs" and "Uptime" for better logical flow.
  • Animation Timing: Adjusted staggered animation delays in the Resource Monitor to match the new layout order.

Documentation

  • Codebase Overview: Added codebase_overview.md explaining the monolith architecture (Rust + API + Frontend) and directory structure.
  • Migration Policy: Updated MIGRATIONS.md to explicitly forbid modifying existing migration files to prevent checksum errors.
  • Walkthrough: Updated walkthrough.md with detailed debugging logs and verification steps for all recent changes.

Infrastructure

  • Version Bump: Updated project version to 0.2.5 in Cargo.toml, web/package.json, and VERSION.
  • Database: Established 0.2.5 as the new minimum compatible version schema baseline.