
Fotologue Lab: Data Model, Processing Pathways & Custodianship Whitepaper π¬ποΈπ
Version: 1.0.17 (Build 18) | Last Updated: September 2026 | Audience: Product Strategy, Darkroom Photographers & Core Engineering Team
[!IMPORTANT] Core Mission of Fotologue Lab: Once a roll of film leaves the camera body, Fotologue Lab takes over to track the physical negative, darkroom print, and digital asset through every stage of its lifecycleβfrom chemical development, to scanning, printing, framing, exhibition, and final sale or disposition.
Executive Summary
Fotologue Lab provides a complete, local-first management system for home darkroom processing, commercial lab tracking, silver-gelatin darkroom printing, and fine-art print edition custodianship.
1. The 5 Processing & Custodianship Pathways
Fotologue Lab models 5 distinct pathways that a physical roll or negative can take after exposure:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β FOTOLOGUE LAB PROCESSING PATHWAYS β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β PATH 1: Commercial Lab Processing β β Camera βββΊ Storage βββΊ Commercial Lab βββΊ Film Returned βββΊ Sleeve βββΊ Libraryβ β β β PATH 2: Self-Processing + Digitisation β β Camera βββΊ Storage βββΊ Home Dev βββΊ Macro Scan βββΊ Film Sleeve βββΊ Library β β βββΊ [Digitised Retrieval] βββΊ Printed βββΊ Library β β β β PATH 3: Full Self-Processing + Darkroom Printing β β Camera βββΊ Home Dev βββΊ Macro Scan βββΊ Darkroom Print βββΊ Archive βββΊ Libraryβ β β β PATH 4: Retrieval from Storage & Final Disposition / Custodianship β β 4.1: Film/Print βββΊ Printed βββΊ Sold β β 4.2: Film/Print βββΊ Printed βββΊ On Display (Gallery / Exhibition) β β 4.3: Film/Print βββΊ Sold (Original Negative or Vintage Print) β β 4.4: Film/Print βββΊ Disposed of / Lost / Destroyed β β 4.5: Film/Print βββΊ On Display (Original Negative on display - Risky!) β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2. The 3 Core Components of Fotologue Lab
Fotologue Lab is structured into 3 integrated modules:
1. Film Processing Module
Commercial Lab Orders: Track lab name (Rewind Photo Lab), order submission date, tracking numbers, and lab push/pull instructions.
Home Chemistry Processing:
Step-by-step dev process (Pre-wet, Developer, Stop Bath, Fixer, Hypo Clear, Final Wash, Wetting Agent).
Real-time timer with temperature compensation (e.g., D-76 at 20Β°C vs 22Β°C).
Agitation schedule alerts (Initial 30s continuous, 10s per minute).
2. Digitising & Scan Matching Module
Camera macro copy presets (_DSF1024.xmp) and flatbed scanner alignment.
Contact sheet generation and in-grid frame gap adjustment (+1 / -1 offset).
3. Darkroom Printing Module ("Print Recipes")
Enlarger height, aperture (Rodagon 80mm @ f/11), paper stock (Ilford FB Glossy 11x14").
Split-grade exposure seconds (Grade 00 + Grade 5).
Interactive Dodge & Burn diagram map.
3. Darkroom UI & Safelight Requirements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β RED SAFELIGHT MODE UI β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β β’ Pure Deep Red (#FF0000) text and icons on Pure Black (#000000) background β β β’ Zero blue/green subpixel emission to prevent darkroom paper fogging β β β’ User Confirmation Modal: "Verify OLED screen red output before opening" β β β’ Oversized Touch Targets (β₯ 64 dp) for darkroom gloves & dim lighting β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Red Safelight Mode (#FF0000 on #000000):
Uses pure red OLED pixels to prevent paper fogging during black-and-white printing.
Prompts user acceptance modal: "Please verify your device's screen renders pure red without light bleed before exposing sensitive photographic paper."
Oversized Field & Darkroom Inputs:
Large, high-contrast touch targets ($\ge 64 \text{ dp}$) and giant timer digits for easy reading across a darkroom sink or enlarger station.
4. Fotologue Lab Data Model
Fotologue Lab extends the Room database with 5 core data entities:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β FOTOLOGUE LAB DATA MODEL β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β 1. EQUIPMENT β Enlargers, Enlarger Lenses, Dev Tanks, Trays, Timers β β 2. CHEMICALS β Film/Paper Developers, Fixers, Stop Bath, Capacity Counts β β 3. ACTIONS β Temp (Β°C), Duration, Agitation Ratios, Split-Grade Times β β 4. STORAGE β Archival Binders, Negative Sleeves, Print Boxes, Shelves β β 5. OUTCOME β Editions (01/10), Gallery Exhibition, Sales, Disposition β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. Equipment (LabEquipment)
@Entity(tableName = "lab_equipment") data class LabEquipment( @PrimaryKey(autoGenerate = true) val id: Long = 0, val name: String, // e.g. "Beseler 23C II Enlarger" val category: String, // Enlarger, Enlarger Lens, Dev Tank, Tray, Light Table val notes: String = "" )
2. Chemicals & Solutions (LabChemical)
@Entity(tableName = "lab_chemicals") data class LabChemical( @PrimaryKey(autoGenerate = true) val id: Long = 0, val name: String, // e.g. "Kodak D-76" or "Ilford Rapid Fixer" val type: String, // Film Developer, Paper Developer, Stop Bath, Fixer val dilution: String = "1+1", // 1+1, 1+3, 1+25, Stock val mixDate: Long = System.currentTimeMillis(), val capacityRollsTotal: Int = 12, val capacityRollsUsed: Int = 0, val isExhausted: Boolean = false )
3. Processing Event / Darkroom Recipe (LabProcessEvent & PrintRecipe)
@Entity(tableName = "lab_process_events") data class LabProcessEvent( @PrimaryKey(autoGenerate = true) val id: Long = 0, val filmRollId: String, val developerName: String, // e.g. "D-76 (1+1)" val temperatureCelsius: Float = 20.0f, val durationSeconds: Int = 540, // 9 mins val agitationSchedule: String = "Initial 30s continuous, 10s/min", val pushPullStops: Float = 0.0f ) @Entity(tableName = "print_recipes") data class PrintRecipe( @PrimaryKey(autoGenerate = true) val id: Long = 0, val logEntryId: Long, val paperName: String, // e.g. "Ilford Multigrade FB Glossy" val paperSize: String = "11x14", val enlargerLens: String = "Rodagon 80mm f/4 @ f/11", val baseExposureSeconds: Float = 14.5f, val gradeFilter: String = "Grade 2.5", val dodgeBurnMapUri: String? = null // Hand-drawn dodge/burn diagram )
4. Physical Storage (LabStorageLocation)
@Entity(tableName = "lab_storage_locations") data class LabStorageLocation( @PrimaryKey(autoGenerate = true) val id: Long = 0, val name: String, // e.g. "Binder A - 2026 Urban Series" val sleeveNumber: String = "Sleeve #12", val locationType: String // Negative Sleeve, Print Box, Framing Case, Safe )
5. Outcome & Custodianship (PrintOutcome & CustodianshipRecord)
@Entity(tableName = "print_outcomes") data class PrintOutcome( @PrimaryKey(autoGenerate = true) val id: Long = 0, val printRecipeId: Long, val editionNumber: String, // "Edition 02/10" or "Artist Proof AP1" val status: String, // ARCHIVED, DISPLAY_EXHIBITION, SOLD, DISPOSED val exhibitionName: String? = null, // e.g. "Sydney Fine Art Gallery 2026" val buyerName: String? = null, val salePrice: String? = null, val saleDate: Long? = null, val notes: String = "" )
5. Summary Roadmap for v3.0 Implementation
Phase 1 (Chemistry & Film Dev): Home film processing timer, chemistry capacity counters, and commercial lab order tracking.
Phase 2 (Darkroom Printing & Red Safelight UI): Pure red OLED darkroom theme, enlargement exposure timers, and split-grade print recipe logging.
Phase 3 (Storage & Custodianship Ledger): Archival sleeve location tracking, limited print edition logging, gallery exhibition records, and sales history.