Build Dazz Cam
YESreplaces $6.99/mosaves $83.88/yrback to the verdict
A camera application with a live filtered viewfinder running at frame rate on the graphics processor, a carousel of film looks built from real transforms rather than overlays, full resolution capture applying the identical pipeline, and a develop mode that applies the same looks to photographs you already have.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installfree if you own a Mac
Why There is no supported way to build or sign an iPhone application without it.
Get it Install Xcode from the Mac App Store or developer.apple.com. It is a large download. open ↗
Verify
xcodebuild -version prints 16 or higher - have readyfree if you have one
Why The simulator has no camera and no graphics processor characteristics worth measuring. Every claim in this build is a device claim.
Get it Any recent iPhone with a developer profile installed. Free provisioning allows installing your own build for a limited period, which is enough to start.
Verify
A build runs on the device and shows a camera preview - decidefree
Why The preview and capture pipeline is Metal, and doing this on the processor produces a slideshow rather than a viewfinder.
Get it Work through a shader tutorial before Phase 1 if you have not written one. The first shader is the hard part; the rest is arithmetic.
Verify
You can write and run a shader that inverts colours on the preview - have readyfree if you build your own, which is also the more interesting work
Why Shipping a table extracted from another application or licensed for personal use only is a redistribution problem, and it is the most noticeable thing to copy.
Get it Build your own from photographed colour references, or use tables explicitly licensed for redistribution. Record the source of each.
Verify
Every table has a recorded source and a licence permitting distribution - have readyfree
Why A look that flatters one scene is easy; the differences appear on a dark room, a bright window, and a face. Those three are where a filter reveals itself as an overlay.
Get it Shoot a high contrast scene, a flat overcast one, a dark interior and a portrait. Keep them for comparing looks.
Verify
Four reference scenes are captured and used for every look
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- looks(id, name, ordinal, lut_key, grain_params_json, vignette_params_json, leak_params_json, date_stamp) - captures(id, look_id, taken_at, width, height, original_path, rendered_path, params_hash) - develops(id, source_asset_id, look_id, rendered_path, at) · applying a look to an existing photograph - settings(key, value) · selected look, whether to keep originals, date stamp format - The parameters hash on every capture is what lets a photograph be re-rendered later with the same look, which matters when a look is adjusted.
Environment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
PREVIEW_TARGET_FPS | required | 30 | Frame rate the viewfinder holds. Measured on device rather than assumed. |
GRAIN_SCALE_MODE | required | relative | Effects are expressed relative to image dimensions. The alternative is the bug this build is built around. |
KEEP_ORIGINALS | required | true | Whether the unfiltered capture is saved alongside. True by default, because photographs are irreplaceable. |
DATE_STAMP_FORMAT | required | yy MM dd | Format for looks that carry a stamp. Configurable and disableable. |
LUT_DIR | required | Resources/LUTs | Colour lookup tables with their licence file alongside. |
The build, in order
A viewfinder that runs at frame rate
The live preview shows a filtered image without dropping frames.
Feeding a Metal view directly. No conversion through an image object per frame.
Files
Camera.swiftA simple colour transform first. Instrument the per-frame time before adding anything.
Files
Shaders/Base.metalA call, another camera application, backgrounding. All three end the session.
Files
Camera.swift
done when · tick each as it passeswatch out- Filtering on the processor rather than the graphics processor drops the preview to a slideshow, and converting each frame through an image object allocates memory every frame which the collector then has to reclaim. Keep the pixel buffer on the graphics processor from capture to display and allocate nothing per frame.
Capture that matches the preview
The saved photograph looks like what the viewfinder showed.
One shader chain applied to both paths. Two pipelines diverge immediately.
Files
Capture.swiftRelative units throughout. This is the phase's whole point.
Files
Shaders/Effects.metalSame framing, side by side at full size. Fix every difference before moving on.
done when · tick each as it passeswatch out- Grain, vignette and light leaks written in pixel units look right on the small preview buffer and wrong at full resolution, and the difference is obvious as soon as someone looks at the file. Express every effect in units relative to the image dimensions and pass those dimensions into the shader.
Looks that are colour transforms
Each film look is a real transform rather than a coloured overlay.
Undo the transfer function on input, apply, reapply at the end. Everything between is linear.
Files
Shaders/Colour.metalA real colour transform. Overlays are the thing being avoided.
Files
Looks.swiftSwitching updates within a frame or two. A pause here makes browsing looks unpleasant.
Files
LookCarousel.swift
done when · tick each as it passeswatch out- A semi-transparent coloured overlay is what a filter looks like when it is not a colour transform: it lifts the blacks, flattens contrast and looks the same on every photograph. A lookup table applied in linear space changes colours the way film does, differently depending on what is in the frame.
The date stamp and the deliberately imperfect looks
A camcorder or disposable look reads as that thing rather than as a filter.
Position and size as fractions. The same rule as every other effect.
Files
Shaders/Stamp.metalAberration and falloff increasing towards the edges, which is what real lenses do.
Files
Shaders/Lens.metalStamp and scan lines are the two people notice. Compare at full size.
done when · tick each as it passeswatch out- A date stamp drawn at a fixed pixel size sits in a different place and a different proportion on the capture than on the preview, which is the same resolution problem as the effects and the one most likely to be forgotten because it feels like a text overlay rather than an effect.
Developing photographs you already have
A look can be applied to an existing photograph with the same result.
Identical shader chain. A second path for develop mode would diverge from the camera.
Files
Develop.swiftNever in place. This is the rule that protects irreplaceable photographs.
Files
Library.swiftA full resolution photograph can exhaust memory on a phone. Tile with overlap if needed.
Files
Develop.swift
done when · tick each as it passeswatch out- Overwriting the original when applying a filter destroys the only copy of a photograph, and it is the complaint that ends an application's reviews. Always write a new asset, and make keeping the original the default rather than a setting people have to find.
Permissions, distribution and honest looksproduct builder
It installs from the store and the looks are yours to ship.
With usage descriptions that explain rather than restate the permission name.
Files
Info.plistSource and licence per lookup table and typeface. Checked rather than assumed.
Files
docs/looks.mdOne that never had it. Installing on your development phone proves less than you think.
done when · tick each as it passeswatch out- Colour lookup tables extracted from someone else's application or sold under a personal use licence are not yours to redistribute, and a look copied from a commercial product is the most likely thing to be noticed. Build your own from photographed reference or use tables licensed for redistribution, and record the provenance of each.
That is the whole plan for Dazz Cam. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- The hand-tuned film stocks of the commercial application.
- Video modes with stabilisation and camcorder motion.
- Convincing special effect lenses.
- Tuning across skin tones and lighting conditions.
- dozens of hand-tuned film stocks refined over years of color work
- the polished video modes - 8mm, camcorder wobble, stabilization
- special-effect lenses like fisheye, prism, and starburst done well
- ongoing filter drops that chase whatever look TikTok wants this month
- one-tap install for friends who will never sideload anything
- A half-frame or double exposure mode, which the pipeline already supports
- Per-look strength, which is a single blend parameter and much requested
- A contact sheet view of a shoot, which is how people actually pick a keeper
Need the files? The project pack on the verdict page hands your agent the whole brief · more photo editing.