• DarkRoom 0.13.0
    Benchmarks / CPU and I/O (per commit) (push) Successful in 12m2s
    Benchmarks / Frame budget (on demand) (push) Skipped
    Build and test / Desktop (Linux) (push) Successful in 1h41m17s
    Build and test / Layer separation (push) Successful in 50s
    Traceability / Requirement traces (push) Failing after 1m6s
    🐳 Android image / Build and push (push) Successful in 16m7s
    Build and test / android-image (push) Successful in 16m9s
    🐳 Windows image / Build and push (push) Successful in 6m11s
    Build and test / windows-image (push) Successful in 6m13s
    Build and test / Android (aarch64) (push) Failing after 40m26s
    Build and test / Windows (x86_64, cross) (push) Failing after 1h4m8s

    dtourolle released this 2026-09-19 18:43:35 +00:00 | 437 commits to master since this release

    Panoramas from the grid, models on the hardware, and eyes you can filter by.

    • Select two or more frames and merge them. The merge page shows the
      alignment first — every frame outlined on the preview, the projection
      it chose (perspective, cylindrical or spherical, from the field of view)
      and the three chips to change it — and writes nothing until you confirm.

    • The result is a RAW. A linear DNG at the source's native scale and
      bit depth, exposure-balanced across frames, that opens in the develop
      view like any camera file: white balance, profile, everything applied
      to the whole panorama afterwards. Its sidecar records which frames it
      came from and how.

    • The border is cropped, not cut. The largest inscribed rectangle is
      the file's default crop; reset it and the whole merge is there.

    • Or filled — experimental. Fill the border paints the uncovered
      edge with MI-GAN (MIT), previewed before you confirm and declared in the
      sidecar. It is right in thin borders and wrong in deep corners, where the
      model invents clouds in sky and water under grass, so every knob it has
      is on the page — working scale, edge erosion, coarse pass, band width,
      mirror depth, seam feather — and each redraws the preview. Expect to
      crop; try the fill.

    • The frames are warped, accumulated and resolved on the GPU in chunks, so
      a composite larger than memory still merges; the twelve-frame reference
      set (137 megapixels) takes about half a minute on the desktop.

    • Models run on what the device has. One engine chooses per device:
      TensorRT or the CUDA provider on NVIDIA desktops, the Hexagon NPU in
      int8 on the tablet, ONNX Runtime's CPU pool otherwise, and tract when no
      runtime is installed — a slower app, never a broken one. The choice is
      measured by building a real session, cached, and shown in Settings ›
      About beside Graphics.

    • The tablet detects faces in milliseconds. Int8 detectors calibrated
      on real photographs run the whole graph on the Hexagon; the embedder
      stays f32 everywhere so identities compare across devices.

    • Compiled engines are built in the background after first launch and
      cached; a model runs on the rung below until its engine lands. On this
      release's desktop the first TensorRT compile of the fill model is long
      (minutes) and happens once.

    • The Android build bundles ONNX Runtime and the Qualcomm HTP libraries.
      The desktop packages carry no runtime: install a system ONNX Runtime, or
      point DARKROOM_ORT_DIR at one with the providers your GPU needs.

    • Eyes open. Each face carries a reading — open, closed, sunglasses,
      unreadable — from three small models beside the pair, cut from a
      landmark contour so turned and smiling heads are read where the eye is.
      An Eyes open chip beside a chosen person filters the grid to frames
      where they are not blinking; the People screen badges the rest. A soft
      or tiny eye is never read as closed: it is unreadable, and no filter
      drops it.

    • A re-detection keeps every identity. When faces are found again on
      an image, the old faces are matched to the new by box and by embedding,
      and the assignment, the suggestions and the rejections all carry over.
      Before this, only confirmations did.

    • One completeness job. Faces missing a quality, an eye reading, a
      crop or the landmarks, images examined by a weaker detector on a proxy,
      images with no capture date: one pass over one work list now fetches
      each original once and fills every gap. Index faces converges on
      coverage; a new Re-index every face button converges on the chosen
      detector.

    • One face population per embedder, whichever detector found them, and a
      size budget for the sweep so a panorama is never fetched.

    • The photographs around the open one are fetched ahead of the step to
      them.

    • A file the decoder cannot open is marked, not retried; a panic inside
      the decoder is an error, not the end of the thread.

    darkroom-0.13.0-arm64-v8a.apk is the release-signed Android build (API
    28+, arm64). darkroom-desktop-0.13.0-x86_64-linux is the desktop binary.
    SHA256SUMS covers both.

    Downloads