β Back to ZoneLab
Release Notes
What's New in ZoneLab
Version History
Beta 0.78.0 - February 9, 2026
Lambrecht Methodology Integration
π Lambrecht Film Testing Methodology
Integration with "Way Beyond Monochrome"
Complete implementation of Ralph Lambrecht's industry-standard film testing methodology:
Gradient Calculation: Calculates film gradient over working range (Zones II-VIII): ΞD / 1.8 log E
Adaptive Density Per Stop: Replaced hardcoded 0.3 density/stop with gradient-adjusted calculation: 0.3 Γ (gradient / 0.57)
More Accurate EI: Effective ISO calculation now accounts for actual film contrast variations
Normal Gradient Target: 0.57 gradient represents "normal" contrast from Lambrecht's methodology
High Contrast Compensation: Higher gradient films (>0.57) get proportionally adjusted density per stop
Low Contrast Compensation: Lower gradient films (<0.57) get proportionally adjusted density per stop
π¬ Fog-Adjusted Densities
Lambrecht Fog Compensation
Professional fog-adjusted density tracking separates film base from actual response:
Base + Fog: Zone 0 density represents film base plus fog layer
Absolute Dmin: Minimum density minus base+fog (true clear film response)
Absolute Dmax: Maximum density minus base+fog (true maximum exposure response)
Fog Separation: Distinguishes film base characteristics from actual film response to light
Industry Standard: Matches Lambrecht's spreadsheet methodology
π LogH Range Tracking
Standard Exposure Terminology
Professional log exposure (logH) range tracking aligned with industry standards:
LogH Range: 0.0 to 3.0 (Zone 0 to Zone X = 10 stops = 3.0 log H)
Each Zone = 0.3 log H: Standard 1-stop increments in log exposure
Lambrecht Terminology: Uses logH notation matching "Way Beyond Monochrome"
Exposure Documentation: Tracks useful exposure range for film characterization
π New Metrics Display
Gradient Shown in Session List
Session list now displays gradient alongside CI and Gamma:
Gradient Display: Shows "G: 0.57" for each full mode session
Automatic Hiding: Only displays when gradient > 0 (hides for legacy sessions)
Card View: Gradient appears alongside CI and Gamma in metrics row
Compact View: Gradient included in compact metrics display
π·οΈ Terminology Update: ISO β EI
Correct Photographic Terminology
Updated display terminology to match Zone System standards:
ISO: Film's rated/box speed (e.g., "Kodak TMax 400" = ISO 400)
EI (Exposure Index): Calculated effective speed from testing (e.g., "rated at EI 320")
Session List: Changed "ISO 100" β "EI 100" for calculated values
Alert Message: "Effective ISO:" β "Effective ISO (EI):" for clarity
CSV Export: Header now reads "Effective ISO (EI)"
Industry Alignment: Matches Lambrecht and Zone System literature terminology
πΎ Enhanced CSV Export/Import
7 New Lambrecht Metric Columns
CSV format expanded with full Lambrecht methodology support:
New Columns: Gradient, Base+Fog, Absolute Dmin, Absolute Dmax, logH Min, logH Max, logH Range
Format Detection: Auto-detects old (37 columns) vs new (43 columns) format
Backward Compatible: Old CSV files import successfully with new metrics defaulting to 0.0
Forward Compatible: New CSV files export all Lambrecht metrics
Dynamic Column Mapping: Automatically adjusts zone and lighting column offsets based on format
Precision: Gradient (2 decimals), fog-adjusted densities (3 decimals), logH (2 decimals)
Backward Compatibility
Legacy Sessions: Old sessions display normally with gradient hidden (default 0.0)
Legacy CSVs: Import successfully with Lambrecht metrics defaulting to 0.0
Database Migration: Seamless - new attributes default to 0.0 for existing sessions
Re-editing: Old sessions recalculate with new methodology when edited for improved accuracy
No Data Loss: All existing session data preserved during upgrade
Technical Implementation
Core Data Extensions: 7 new Session attributes with @NSManaged properties
Calculation Sync: SessionState and EditSessionView both use gradient-adjusted formulas
ISO-only Mode: Defaults to normal gradient (0.57) when zone data unavailable
Full Mode: Calculates actual gradient from Zones II-VIII density readings
CSV Format Version: Column count determines format (43 = new, 37 = old)
Example: High Contrast Film
Scenario: Kodak TMax-100 in Rodinal (high contrast developer)
Measured Gradient: 0.68 (higher than normal 0.57)
Old Calculation: Used fixed 0.3 density/stop β EI 120
New Calculation: Adjusted to 0.358 density/stop β EI 117
Result: More accurate EI accounts for actual film contrast
Beta 0.77.0 - January 22, 2026
Dynamic Version Display & Chart Fix
π Version Management Enhancement
Automatic Version Display
Improved version management to prevent hardcoded version mismatches:
Dynamic Version Reading: Footer now reads version from Bundle.main.infoDictionary instead of hardcoded string
Single Source of Truth: Version defined in Xcode project settings, automatically displayed throughout app
Prevents Mismatches: No more outdated version strings (e.g., showing "Beta 0.73" when app is 0.77)
Fallback Protection: Gracefully falls back to current version if Bundle info unavailable
Consistency: Follows same pattern as About dialog for version display
π Bug Fix: Y-Axis Density Scale
Fixed incomplete density scale labels: Chart Y-axis was missing labels at 1.0, 1.1, 1.8, 2.0, and other values
Complete scale now displayed: All density labels appear at correct 0.2D intervals (0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, etc.)
Root cause: Floating point precision errors accumulated when generating ticks with stride(by: 0.1)
Solution: Using integer arithmetic to generate major tick positions avoids precision errors
Benefits
Automatic Updates: Version display updates automatically when version changed in Xcode
No Manual Updates: UI no longer needs manual version string updates when bumping versions
Reduced Errors: Eliminates human error in version synchronization
Better Maintenance: One less thing to remember when releasing new versions
Improved Chart Readability: Complete Y-axis scale makes density measurements easier to read
Beta 0.76.0 - January 22, 2026
Session Editing Enhancements & Documentation Cleanup
βοΈ Zone Reading Editing
Complete Session Edit Functionality
Edit zone density readings directly within existing sessions:
Zone Reading Updates: Edit any zone density value in both ISO-only and full mode sessions
Two Save Modes: "Save" for metadata-only updates, "Recalculate & Save" to update metrics from edited zone data
Smart Recalculation: Automatically recomputes Effective ISO, Contrast Index, Gamma, and Tonal Range from updated zone readings
Visual Layout: Zone readings displayed in intuitive 2-row grid (Zones 0-V, Zones VI-X)
Mode Detection: Automatically adapts UI to show only Zone V for ISO-only sessions or all 11 zones for full mode
Validation: Input validation ensures density values are valid numbers within acceptable range
π Documentation Improvements
Clarified Technical Implementation
Comprehensive documentation cleanup to eliminate confusion:
App Sandbox Status: Clarified that sandbox IS enabled via entitlements file, not Xcode build setting
Serial Communication: Documented current POSIX serial implementation with device.serial entitlement
IOKit History: Archived IOKit USB implementation documentation as completed alternative approach
Build Settings: Explained that ENABLE_APP_SANDBOX = NO build setting is misleading - entitlements control sandbox at runtime
Calibration Notes: Updated placeholder calibration comments to clarify they're intentionally unused
Technical Details
EditSessionView Enhancements: Added zone reading state management, updateZoneReadings(), and recalculateMetrics() methods
Modal Size: Increased from 500Γ700 to 550Γ800 to accommodate zone editing UI
Save Workflow: Clear separation between metadata-only saves and full recalculation
Sandbox Configuration: App Sandbox enabled via com.apple.security.app-sandbox in ZoneLabApp.entitlements
Serial Access: POSIX serial port access granted via com.apple.security.device.serial entitlement
Beta 0.75.0 - January 20, 2026
B&W Filter Support & Chart Improvements
ποΈ B&W Filter Tracking
Comprehensive Filter Documentation
Track B&W filters used during Zone System testing with accurate specifications:
9 Common B&W Filters: Yellow #8, Deep Yellow #12, Orange #21, Red #25, Deep Red #29, Green #11, Blue #47, Polarizer, and None
Complete Specifications: Wratten numbers, filter factors (e.g., 2Γ, 4Γ), and stop compensation (e.g., +1, +2)
Filter Management: Add, edit, and delete custom filters with FilterToolPanel
Session Metadata: Filters tracked as additional equipment metadata, do not affect calculations
CSV Export/Import: Filter data included in CSV files with 4 columns (name, Wratten number, factor, stops)
Equipment Integration: Filters displayed alongside camera, lens, and grey card in session details
π Chart Visualization
Enhanced Zone V Target Display
Improved chart readability and Zone V target visualization:
Fixed Zone V Target: Target box now stays at fixed density range (0.75β0.85D), not session-dependent
Semi-transparent Fill: Zone V target box has 50% white fill for better visibility against zone bands
"Zone V Target" Label: Clear text label overlaid on target box for identification
Consistent Reference: Target box no longer moves when switching between sessions
β¨ Session Display Improvements
Consolidated Equipment Section: Camera, lens, filter, and grey card now under single "Equipment" header
Consistent Spacing: Fixed line spacing in Equipment section (uniform 2pt spacing)
Lighting Conditions: Now shows "N/A" when no lighting data entered instead of hiding section
Better Organization: Cleaner, more consistent session detail layout
π Bug Fixes
CSV Import: Fixed column indexing after adding filter columns
Filter Seeding: Filters now seed independently of films (no longer blocked by existing data)
Spacing Issues: Corrected inconsistent spacing in session detail views
Beta 0.74.0 - January 11, 2026
Densitometer Reliability & Onboarding UX
π§ Densitometer Improvements
Enhanced Connection Reliability
Significant improvements to USB densitometer stability and user experience:
Simplified disconnection handling: Single "OK" alert instead of complex reconnection dialog
Fixed reconnection functionality: Proper state reset after disconnection errors
Auto-cleanup on read errors: Automatic connection reset when errors occur
Improved status indicators: "Disconnected" shown with red indicator when connection lost
Red status dot when disabled: Clear visual feedback when densitometer feature is off
Better error recovery: Handles connection errors gracefully without hanging
β¨ Onboarding Experience
Searchable Equipment Selection
First-run onboarding now includes powerful search capabilities:
Searchable film selection: Live filtering as you type, making it easy to find your favorite films
Searchable developer selection: Quick access to specific developers from the large library
Search UI: Magnifying glass icon with clear button (X) for easy text clearing
Empty states: "No films found" / "No developers found" messages when search returns no results
Better for large libraries: Navigate 200+ films and 100+ developers efficiently
π§Ή Data Cleanup
Refined default equipment library for black & white photography focus:
Removed color films: Kodak Aerocolor IV 2460 and Kosmo Ultramax 800 no longer in defaults
Removed C-41 developer: Color-only processing removed from defaults
B&W focus: All default films and developers now black & white only
Cleaner experience: More relevant defaults for Zone System testing
π Documentation Organization
Documentation cleanup: 22 historical markdown files archived to `/archive` folder
Added ROADMAP_FUTURE_FEATURES.md: Comprehensive future planning document
Added ROADMAP_REALITY_CHECK.md: Project status audit comparing plans vs. reality
IOKit documentation: Added USB rewrite planning and status documents
Print Context spec: Added v2.0 darkroom workflow design document
Hardware Status: IOKit USB implementation has been fully tested with actual Printalyzer hardware. All read/write operations, connection handling, and error recovery verified. App Sandbox re-enabled and production-ready.
Beta 0.73.0 - January 4, 2026
POSIX Serial Port & App Sandbox
π§ Major Technical Improvements
Printalyzer Serial Port Rewrite
Complete rewrite of USB densitometer communication using POSIX serial ports instead of IOKit. This provides better reliability and compatibility with macOS App Sandbox requirements.
POSIX serial I/O: Direct /dev/cu.usbmodem* access with termios configuration
115200 baud, 8N1: Standard serial port settings for CDC ACM devices
Background threading: Continuous read loop without blocking UI
Automatic device discovery: Scans /dev for connected Printalyzer
Simplified architecture: SerialPortManager replaces complex IOKit code
β¨ New Features
Automatic Mode Validation
ZoneLab now validates that your Printalyzer is in the correct mode for film density measurements:
Transmission mode required: Film density measurements need T mode readings
Error alerts: Clear warnings if device is in Reflection (R) or UV (U) mode
User guidance: Instructions to switch device mode when necessary
Prevents invalid data: Won't accept R or U readings for film tests
π App Sandbox Compliance
Full macOS App Sandbox support for App Store distribution:
App Sandbox enabled: Required for Mac App Store submission
Serial device entitlement: Allows USB serial port access within sandbox
USB device entitlement: Future-proofing for additional hardware support
File access entitlement: User-selected file read/write operations
Print entitlement: Printing capabilities preserved
π Bug Fixes
Line processing bug: Fixed double CRLF splitting that prevented readings from being processed
Connection reliability: Improved auto-connect and reconnect behavior
Permission errors: Resolved "Operation not permitted" errors in sandboxed builds
Reading flow: Fixed callback chain from SerialPortManager β DensitometerManager β DensitometerState
For Printalyzer Users: Make sure your device is in Transmission (T) mode before starting a reading session. The app will alert you if you need to switch modes.
Technical Note: This update abandons the complex IOKit USB approach in favor of standard POSIX serial port I/O. The Printalyzer appears as a CDC ACM class device, which macOS treats as a virtual serial port (/dev/cu.usbmodem*). This approach is simpler, more reliable, and compatible with App Sandbox restrictions.
Beta 0.72.0 - January 1, 2026
Public Beta Launch
π Public Beta Release
TestFlight distribution: First public beta available via TestFlight
Public testing: Opened to external beta testers
User feedback integration: TestFlight feedback system enabled
β¨ Features
Zone System testing methodology: 10-stop wedge test (Zones I-X) plus Zone 0 (base + fog)
Effective ISO determination: Calculate the effective ISO (EI) for your specific film/developer/camera/lens combination and procedures
Full 11-zone analysis: Complete characteristic curve analysis with CI and Gamma measurements
Zone V quick mode: Single grey card measurement for fast effective ISO testing
Printalyzer USB integration (Phase 1): Initial USB densitometer support
Session comparison: Compare up to 5 tests simultaneously with overlay charting
Process documentation: Log developer, time, temp, dilution, and agitation for each test
Equipment library: Manage films, developers, cameras, lenses, grey cards
CSV export/import: Data portability and backup
Dark theme UI: with a 3 column design
About Effective ISO: ZoneLab determines the effective ISO (EI) for your specific process by finding where 18% grey (0.72 density) falls in your exposure range. This is not ISO 6:1993 laboratory film speed testingβit's practical Zone System testing for optimizing your personal workflows.
Beta 0.7 - January 1, 2026
Tabbed Three-Column Layout
β¨ Major UI Redesign
Three-column layout: Tool panels (left), chart (center), session library (right)
Collapsible sidebars: Toggle visibility with keyboard shortcuts
Chart improvements: Hover interactions, better legend, session colors
Session filtering: Filter by film, developer, camera, lens
Drag-and-drop reordering: Organize sessions in library
Older Versions
Alpha 0.11 - December 18, 2025
Printalyzer densitometer planning and initial implementation
USB integration architecture design
Protocol analysis and documentation
Alpha 0.1 - November 18, 2025
Initial internal alpha release
Core ISO calculation functionality
Basic UI and data model
Equipment library foundation
Need Help?
For additional support, bug reports, or feature requests: