All Articles
Deciding overlay text legibility at ingest time instead of on device — four metrics measured side by side
Moving the question of whether text stays readable over a wallpaper out of the device and into the content pipeline. Four candidate metrics measured across 240 images, including what downscaled judging actually computes.
A JSON File 19% Smaller That Ships Only 3% Smaller — Measuring Catalog Payloads Against gzip
Five payload formats measured on a 20,000-item wallpaper catalog. Key shortening saves just 3.2% after gzip, while a columnar layout cuts 26.8%. Real numbers for Brotli, paging, and JSON.parse time.
When 1.10.0 Gets Locked Out: Measuring Four Version Comparison Approaches for Forced Updates
A remote-config gate for minimum supported version, rebuilt after measuring four version comparison approaches. Includes the cases where localeCompare reports equality, the fail-open boundary, and the incident caused by gating on a build still in review.
My generated wallpaper catalog hashed differently on every run — isolating five sources of nondeterminism
The same image folder refused to produce the same catalog.json twice. Directory enumeration order, JSON.stringify key reordering, collation, Unicode normalization, and async completion order — measured one at a time across 1,225 files until the output settled on a single hash.
The same wallpaper appeared twice in my catalog — measuring perceptual hash thresholds across 324 images
Four approaches to image catalog deduplication measured end to end: SHA-256, dHash, a hue signature, and a block signature. dHash alone scored 0.9% precision. Here is why perceptual hashes collapse on smooth images, and how the ground truth turned out to be the thing that was wrong.
Walk Through an App Store Submission Without Writing Code — Sticker Packs as a Dress Rehearsal
An iMessage sticker pack is one of the few things you can ship to the App Store with zero code. It cannot make money — and that constraint is exactly what makes it a clean rehearsal for the submission process.
Placing Native Ads in a Masonry Wallpaper Grid: Designing the Lifetime of an Ad Cell
One native ad in a masonry gallery pushed memory from 180 MB to 420 MB over twenty minutes of scrolling. Here is why cell recycling and ad object lifetime never line up, the pool-based implementation that fixed it, and how I picked the insertion interval from measured numbers.
Long-Press Context Menus for a Gallery Item in a Rork Expo App
Long-pressing a wallpaper card does nothing, yet iOS users expect a preview and a menu. From why Pressable alone falls short, to a native context menu with zeego, resolving the scroll-vs-long-press conflict, wiring up save and share, and a custom overlay fallback for Android — all with working code.
You Only Need to Capture the 6.9-inch iPhone for App Store Screenshots
App Store Connect only requires two screenshot sizes: the 6.9-inch iPhone and the 13-inch iPad. Building on Apple auto-downscaling for smaller devices, here is how I use fastlane snapshot and frameit to cut the screenshot count for a multi-language app.
Answering the New App Store Age Ratings — Field Notes From Updating Several Live Apps
Notes from re-answering the updated App Store age rating questions across live apps, covering the new 13+/16+/18+ tiers, the four new question categories, setting a higher minimum age, and what it means for apps you ship with Rork.
Laying Out Variable-Height Images in Two Columns: A Masonry Wallpaper Gallery in a Rork Expo App
From why numColumns cannot pack variable-aspect images cleanly, to a dependency-free column-balancing algorithm, to keeping virtualization with FlashList masonry and a pragmatic no-dependency fallback, building a wallpaper gallery with real code.
Building a One-Time Code Field in Expo — SMS Autofill and Segmented Display Together
A six-digit verification screen looks trivial, but once you account for SMS autofill, pasting, and deleting one digit at a time, it needs real care. Here is how to nail the iOS and Android autofill first, then build a segmented look on top of a single TextInput that does not break.