Afterhours Film Collection — 8 film cameras and 10 film stocks on iPhone and Android

ENGINEERING ● September 12, 2026

The Film Collection, Generative Cameras, and Android Parity

Everything after the launch stack — a second shader engine for film, DAILY 01's generative presets, ProRAW-develop film stocks, CREATE, an asset CDN, and full Android parity.

By late August 2026 the camcorder shelf was mature and the app's next act was film cameras — a second shelf with its own shader engine, its own grammar, and eventually a stock-emulation pro tier. This post covers the Film Collection, the generative-preset camera DAILY 01, ProRAW-based linear-light develop, the CREATE text-composition feature, the asset migration to Cloudflare R2, and Android parity. The current shipping lineup lives at afterhourscamera.com.

Aug 24 – Sep 12, 2026 (v1.1 → v1.5) — everything after the launch stack.

By late August the camcorder shelf was doing what it needed to do, but the app's next act was film cameras — a second shelf with its own shader stage, its own grammar, and eventually a stock-emulation pro tier.

Film infrastructure (v1.1)

A second RuntimeEffect (FILM_EFFECT) alongside the AFTERHOURS shader, with merged-params stacking so film cameras can compose stages the camcorders can't. Baskerville as the film-shelf typography. 3:2 and 4:3 formats. Dual shelf in the picker.

  • MONO 100 (real tonal separation across variations — the "five-look board")
  • MORNING 01 (per-variation LUT curves)

Both free entry points. STILL 02, FADE-200, VERDE 50 shipped paid at $4.99 as of v1.1.

DAILY 01 (v1.1) — the generative-preset camera

60 baked presets across 15 north-star families (A25/B24/C11 tone variations each). An AUTO-MODE stage 0 normalizes scene exposure so rotating presets land on comparable baselines. Seeded shuffle so the day's roll has coherent variety. Dedicated per-preset LUTs, shipped as PNG strips instead of text .cube files (25MB → 432KB).

Date-as-title. No exposure rulers. CALENDAR tab. A dedicated dev tool (preset lab) that imports one photo and renders it through all 60 presets for tuning.

Film Stocks (v1.3) — the biggest arc

10-stock lineup + Explorer/viewfinder UX. A parametric tone stage (11 stages, 51-float contract) instead of LUTs, so the emulation curves can be tuned without re-baking.

The pro-tier feature: ProRAW capture wired through a native NightshotRawDevelop module bridging CIRAWFilter. Getting VC 4.7.3 to co-exist with a live frame processor and a ProRAW capture path took a week of spikes:

  • ProRAW rejects virtual devices → pin the physical wide lens in stock mode
  • Full-sensor photo format for ProRAW → format selection changes per stock
  • Jetsam kills under full-sensor buffers → preview-sized FP buffers + 12MP RAW cap
  • Fix RAW orientation → geometry from the DNG companion, not capture EXIF
  • Reconcile Skia frame with companion → drop the manual EXIF and stop double-rotating

The reveal: a companion underlay with cross-fade + DEVELOPING pill, so the preview stays visible while the RAW develops. Explorer went through several rounds (film-counter layout, loaded-stock card at 70% with peek, CHANGE button and grid removed, TONE swipe ruler). Ship prep stripped the RAW spike instrumentation.

CREATE / DEPTH TEXT (v1.2)

The subject-first photo composition feature — subject-lift animation, phrase library, per-element effects, unified z-stack, template packs, procedural grunge text (a stage 5 RuntimeEffect: WORN look, seed FX chips, Grunge Lab). 96 baked templates across 6 packs by v1.4. Template art flipped to Cloudflare R2 to keep the bundle small.

Asset remote migration

Multi-slice pipeline moving samples, camera packs, LUTs, and template art to R2. WebP-convert cameras/ and light-leaks/. Gzip .cube files on disk. Across the migration: -100MB+ off the bundle with device-verified pipelines and CDN paths on cdn.bricksandcanvas.design.

Android port (Sep 11 onward)

Five phases, full parity minus ProRAW and Live Activity, "show-but-degrade" for missing capabilities via a src/native/capabilities.ts helper. The interesting Android-only gotchas started immediately:

  • VC 4.7.3's withRotatedFrame landscape-left branch translates X off-screen on Android front camera (iOS never trips this branch because AVCaptureVideoDataOutput pre-rotates). One-line patch to translate(0, frame.width).
  • MediaCodec NV12 input: U and V planes share a ByteBuffer; bulk-putting local stride-arranged arrays corrupts every other chroma sample. Fix: per-sample ByteBuffer.put(index, byte) at the plane's computed offset.
  • A closed gorhom BottomSheet swallows EVERY touch on Android Fabric even at index=-1 — invisible container becomes the touch target for the entire screen. Fix: mount the sheet only while open on Android; keep the always-mounted animation on iOS.
  • AppState on Android must dispose module-level SkImage caches — Vulkan's memory allocator does NOT purge on background. After browsing CREATE templates the app held 15 copies of 1024×1536 Vulkan surfaces (94 MB retained while sleeping). Fix: disposeCreateAssets() + disposeAllCameraPackImages() + disposeFluxPreviewCache() on background/inactive. Vulkan footprint dropped 70%.

Pose Guide (v1.5)

2-set authored library (editorial + street), tabbed drawer. Detection dormant, matching parked. Diagnosed on-device: VC's runAsync silently never executes inside useSkiaFrameProcessor — plugin calls run synchronously from the FP, throttled by a timestamp shared value at 12 Hz.

Where it landed

The v1.5 shape: full Android parity, POSE GUIDE shipped, R2 archive live, WHATSNEW 1.5 with the how-it-works second card. What started as a single-camera 640×480 shader is now a two-shelf lineup with a shared editor, a paid PASS bundle, a generative-preset camera, a RAW-develop pipeline, cross-platform, and an asset CDN.

The architecture from post 1 — one look implementation drives preview, stills, and video via offline re-render — never had to change.


FAQ

Does Afterhours Camera have film emulation? Yes. Afterhours ships a Film Collection — 8 film cameras (MONO 100, MORNING 01, STILL 02, FADE-200, VERDE 50, NOCT-800, HIBI-200, DAILY 01) and a Film Stocks Explorer with 10 free authored stocks. All 10 stocks are free at v1.5. Try it at afterhourscamera.com.

Is Afterhours Camera on Android? Yes. Android parity shipped in v1.5 (September 2026). Every camera and every film stock is available on both iPhone and Android, minus ProRAW capture (iPhone Pro only) and the Dynamic Island Live Activity (iOS only).

Does Afterhours support Apple ProRAW? Yes, on iPhone Pro devices in the Film Stocks Explorer. ProRAW DNG is developed through Apple's CIRAWFilter into linear P3, then run through a linear-domain FILM_EFFECT variant so tone curves, halation, and white balance happen in real light energy — resulting in physically correct highlight rolloff and tungsten WB on stocks like NIGHT 800T.

What is DAILY 01? DAILY 01 is the generative-preset camera in Afterhours. 60 baked presets across 15 families, an AUTO-MODE scene-normalizing exposure stage, a seeded daily shuffle so each day's roll has coherent variety, date-as-title, and a Calendar tab.

How does Afterhours keep the bundle small? Sample images, camera packs, LUTs, and CREATE template art live on Cloudflare R2 behind cdn.bricksandcanvas.design. WebP conversion for cameras and light-leaks, gzip for .cube files on disk. The R2 migration alone dropped -100 MB+ from the app bundle.

Where do I download Afterhours Camera? afterhourscamera.com links to the App Store and Google Play. The app is free with multiple free cameras (NS-8, SPECTRA-16, MONO 100, MORNING 01, DAILY 01) and all 10 film stocks; paid cameras are $3.99 each, or unlock everything with the AFTERHOURS PASS at $14.99/year or $29.99 lifetime.

Written by: Peter Garcia

Solo builder of Afterhours Camera. Ships on iPhone and Android with the full film shelf and stock lineup. See it all at www.afterhourscamera.com.