Vol. 01 · No. 01 · The engine room · Mostly invisible

Under the hood

A lot of work went into making this look easy.

A dozen specific decisions about how to play sixteen videos at once on a Mac without setting it on fire. Mostly invisible. Quietly the entire point.

Live data flow
1Drop folderURLs only — no copies2Progressive scan60+ fields cached3Compose gridAspect-aware in 1ms4AVPlayerLooperGapless under each cell

The pipeline runs progressive — playback fires from stage four before stage two has finished. The scanner keeps working in the background, appending to the live grid as it goes. There is no “loading complete” moment because there is no waiting for it.

01. Reads the room — at the kernel level

Your Mac talks. flexGrid listens.

MemoryMonitor pulls live numbers straight from the Mach kernel — task_info for resident memory, thread_info for per-thread CPU. The same data Activity Monitor uses.

When the room warms up, flexGrid tunes itself across four graduated tiers. Caches get trimmed, off-screen players get recycled, pricey Vision passes get paused. The grid stays smooth. The fan stays quiet. You stop having to think about settings.

Live memory pressure

Current tier: Normal

34%
RSS
Normal
Full quality, all caches warm.
Elevated
Drops thumbnail cache, throttles prefetch.
High
Recycles off-screen players, pauses Vision.
Critical
Lowers cell quality, hard-caps active players.

MemoryMonitor pulls live numbers straight from the Mach kernel — the same data Activity Monitor uses — and trims caches before macOS would.

MemoryMonitor.swift · task_info, thread_info
02. Seams that aren't there

AVPlayerLooper, under every cell.

Naïve looping seeks the player back to frame zero — a tiny black flash, an audio click, every time. AVPlayerLooper keeps a second media replica running across the boundary. The seam isn't fixed; it isn't there.

Most video playersStitched

Naïve looping seeks back to frame zero. The decoder catches up, the player blinks, the audio clicks. You stop noticing it; you never stop seeing it.

AVPlayerLooperSeamless

AVPlayerLooper keeps a second media replica running across the loop boundary. There's no seek, no rebuffer, no flash. The seam isn't fixed — it isn't there.

03. ScanReadinessGate

Invisible until ready.

Every Vision-dependent surface in the app — filters, Smart Collections, Editorial Layout's hero picker, Aspect Match — checks data coverage before it appears. If the data isn't in yet, the control isn't there. No half-empty filter menus, no controls pretending to work before they actually can.

A small "Analyzing N/M" pill on the status bar reports progress. The features arrive when they're real. It's a small architectural rule with a calming surface effect.

In the status bar, right now

Analyzing media · 1,843 / 4,212
Vision tags will appear when coverage is sufficient.
Vision tags hidden
Smart Collections hidden
Editorial heroes hidden
Aspect Match ready
Smart cell display ready
Subject Cutout hidden
04. All twelve, then

The list, with the work it leans on.

Most of these never come up in conversation with the app. They're the reason the app feels calm. That's not bullet-list material — it's the result of the bullets.

01 of 12

Plays before the folder finishes loading

The scanner runs progressively. A cultivated first batch lands in ~1.5 seconds even on a folder of 25,000 files, and the rest streams in behind it. Instant playback isn't gated on scanning being done.

You don't sit through a loading bar. Drop the folder, the grid plays, the library catches up underneath.

02 of 12

Seams that aren't there

Every cell uses AVPlayerLooper, which keeps a second media replica running across the loop boundary. No seek, no buffer, no black flash.

Looping a video most places gives you a tiny stutter you stop noticing. Here, you literally cannot see it happen.

03 of 12

Fullscreen, with no rebuffer

Click a tile and the fullscreen overlay borrows the player that was already running in the cell. The same engine just changes where it's drawing — implemented as an in-window ZStack overlay, not a system panel.

No rebuffer, no poster frame, no spinner. The grid keeps its place. You walk away and back.

04 of 12

Reads the room — at the kernel level

MemoryMonitor pulls live numbers straight from the Mach kernel: task_info for resident memory, thread_info for per-thread CPU. The same data Activity Monitor uses.

flexGrid tunes itself across four graduated tiers — Normal, Elevated, High, Critical — trimming caches, recycling off-screen players, and skipping the pricey stuff. You don't have to babysit a settings panel.

05 of 12

AVPlayers don't get destroyed — they get reused.

A PlayerPool keeps a small set of media players warm and recycles them across cells. When a tile changes content, the least-recently-used off-screen player has its URL swapped in — same engine, new file, no setup cost.

Spinning up a fresh AVPlayer drags a whole decode pipeline behind it. Recycling is why a sixteen-tile grid feels like four.

06 of 12

Schema-v8 metadata cache

Every scanned file's metadata persists across launches — aspect ratio, duration, codec, frame rate, Vision tags, saliency rectangles, pixel dimensions. Change detection compares (fileSize, dateModified) and only re-reads what actually changed.

Big folders that took seconds the first time load in milliseconds the next. The library remembers itself.

07 of 12

Aspect ratios, without decoding pixels

For images, flexGrid reads EXIF dimensions and orientation straight out of CGImageSource — including all eight EXIF rotation cases — without decoding a single pixel.

Layout math runs before the photos are even drawn. Grid composition is instant and never wrong about which way is up.

08 of 12

ScanReadinessGate — invisible until ready

Every Vision-dependent surface checks coverage before it appears. Filters, Smart Collections, Editorial templates, and Aspect Match stay hidden until the data they need is in. A small "Analyzing N/M" pill on the status bar reports progress.

The app never shows you a control that wouldn't work. Plus you never get a half-empty filter list pretending to be complete.

09 of 12

SmartShuffle plans ahead while you watch

Press R and the next batch is already cooked. The engine pre-computes the next three batches of unseen items in the background after every shuffle, and pre-warms the thumbnails too.

The second shuffle is faster than the first. The third is faster than the second. You stop waiting for randomness.

10 of 12

Multi-dimensional library coverage

SmartShuffle scores every candidate against a sliding window of what just played — kind, aspect, source folder, date, and duration — and bag-draws every item once before any repeat.

A naïve shuffle clusters similar items by accident. This one feels hand-curated because the math is doing the curating.

11 of 12

Four Vision passes in one render

Composite detection, brightness classification, monochrome detection, and letterbox detection share a single CGContext render — one pixel buffer, four analyses.

Four separate GPU-to-CPU copies would be the normal way. One copy is the considered way.

12 of 12 🔗

Files don't break when you move them

FileRelinker resolves moved or renamed media by matching filename and file size, with sibling-folder inference for the cases where the rename took the parent with it.

Your saved collections survive a reorganisation. The wall stays whole.

None of these are flagship features on their own. The flagship is that you don't have to know about any of them — you just notice that the wall plays, the loops are clean, the seams don't show, and your fan stays quiet.

A closing note

All the gossip. None of the spinner.

The engine notes are here because they should be. The app is here because that's where they stop being notes and start being the experience.