Skip to content
James Builds Tech
Go back

Mixwell: a watercolour mixing companion

Product case study · Native iPhone & iPad

I built Mixwell for watercolour painters to explore the paints they own. It’s a native iPhone and iPad app with a paint catalogue, personal palettes, photo sampling and saved mixing recipes.

23 Augrecorded development began in 2026
3,179catalogue records by 9 October
40customer-requested colours covered
iOS + iPadOSnative experience

Starting with the paints you own

The starting point is a personal palette. You can sample a colour from a reference photo, look at suggested paints or mixtures from that palette, adjust the recipe and save it.

I worked on the app design and development, paint catalogue, colour matching, testing and release preparation.

Mixwell home screen with access to mixing, personal palettes, wishlist and reference photos
A clear starting point for each painting session.
Personal palette with paint swatches, pigment codes and colour-family filters
Recommendations grounded in the paints the artist owns.

Palettes, references and recipes

The app is organised around five areas: Home, Mix, Reference, Palette and Mixing Book. Personal and project palettes keep the working paint collection manageable; notes, favourites, filters and a wishlist support discovery without interrupting mixing.

The mixing workbench places the target and predicted result together, with adjustable paint ratios and dilution previews. Reference photos can be imported or captured, sampled and saved locally. Useful recipes can then be kept in the Mixing Book.

Mixing workbench comparing target and predicted colour with an adjustable two-paint recipe
Explore a recipe, adjust proportions and save the result.
Reference-photo workspace showing a watercolour house and locally saved reference images
Move from a reference image to a colour worth exploring.

How the colour matching works

Mixwell uses CIELAB conversion and CIEDE2000 colour comparison as the foundation for approximate recommendations. The current recommendation service searches single paints and pairs across a set of ratios. It can favour an existing paint when a more complicated recipe offers little improvement.

SwiftData stores owned paints and recipes locally, while StoreKit supports the trial and one-time unlock. Matching work moved off the main thread to keep interactions responsive, and reference images were downsampled before loading. Personal swatch calibration lets artists adjust digital references using their own paint samples.

Match scores and dilution previews are visual guidance. They do not establish measured manufacturer colour accuracy or simulate every physical behaviour of watercolour on paper.

Native architecture and local data

The interface is SwiftUI, with observable view models and services for the catalogue, persistence, purchasing and image sampling. SwiftData stores personal palettes, owned paints, saved recipes, notes and reference photos. The app does not need an account to use those local records.

Personal paint selections refer to immutable catalogue IDs. That keeps the bundled paint definitions separate from the artist’s own data: expanding the catalogue does not require recreating their palettes. The loader decodes the bundled JSON resources and rejects duplicate IDs rather than quietly treating two catalogue entries as the same paint.

The current bundled files contain 3,179 paint records. Brands include Schmincke, Daniel Smith, Holbein, Winsor & Newton, Sennelier and Jackson’s, alongside others. Records carry paint names, pigment codes and digital colour references. Those digital values are approximate; a pigment code or manufacturer name does not make a swatch a measured physical sample.

Why the mixing engine is replaceable

The colour-science layer exposes a ColourMixingEngine protocol. The current LAB implementation normalises paint ratios, combines their colour values and applies a chroma adjustment and dilution preview. The recommendation service compares candidates with CIEDE2000 and keeps a ranked set of results.

That is a useful computational model for comparing recipes, but it does not reproduce pigment chemistry, granulation or the texture of a wash. Keeping the engine behind a protocol leaves room to improve the model without tying every screen to one implementation.

The workbench also separates pigment matching from water strength. Recommendations are evaluated at masstone, while the dilution control changes the displayed wash. This avoids treating a lighter preview as evidence that the underlying paint combination has become a worse match.

Responsiveness when the palette changes

Searching paint pairs becomes more expensive as the palette grows. The view model debounces refreshes and moves the calculation into a detached task. It checks cancellation and the requested target before applying the result, so an older calculation does not overwrite a newer colour selection.

Photo sampling uses Core Image. Reference-photo handling downsamples imported images, while saved references remain local. That keeps a large camera image from becoming an unnecessary cost each time the painter returns to a reference.

StoreKit, localisation and release

The full unlock is a StoreKit non-consumable purchase. The purchase service verifies transactions, listens for transaction updates and supports restoring access. A verified purchase unlocks the interface immediately, including when the entitlement refresh has not yet caught up.

Localisation uses a string catalogue with English, German, French and Spanish entries. The app also has language-selection support. These are part of the native interface rather than separate versions of the application.

The XCTest suite covers colour comparison and recommendation behaviour, persistence of recipes and ingredients, and free-use limits. The recorded 9 October simulator run passed 16 tests with no failures. Release preparation included iPhone and iPad screenshots and StoreKit purchase and restore checks; the historical test count is not presented as a current App Store certification.

Mixwell is available on the App Store, with two-colour mixing, reference sampling and saved recipes. The catalogue and interface have continued to develop through the updates below.

Development timeline

Development started on 23 August 2026. These are the main changes through to the Holbein catalogue update on 9 October.

DevelopmentTestingCommercial
23 Aug2026
Development

First app and product identity

Built the initial Watercolour Companion app and renamed it Mixwell. Established the five main areas, SwiftData persistence, the catalogue and colour-science foundation. Added reference-image sampling, adjustable mixtures, dilution previews and branded artwork.

25 Aug2026
Product & commercial

Personalisation and purchase model

Added multiple and project palettes, notes, favourites, filters and paint substitutes. Implemented the trial and one-time unlock with StoreKit and prepared listing, privacy and support material.

1 Sep2026
Commercial

Clearer purchase pricing

Moved the unlock price to the top of the purchase screen so users could understand the cost immediately.

17 Sep2026
Engineering & testing

Reliability and catalogue expansion

Reviewed purchase verification, persistence, free-use limits and privacy documentation. Added regression tests, moved matching off the main thread and built a Jackson’s colour-chart import pipeline.

18 Sep2026
Release preparation

iPhone and iPad release assets

Prepared App Store screenshot sets covering recipes, reference sampling, catalogue browsing and the Mixing Book, with a repeatable screenshot-generation script.

19 Sep2026
Development

Matching and personal calibration

Expanded mixture search, introduced personal paint-swatch calibration, improved sampling confidence and clarified match-score guidance. Added localisation infrastructure and corrected a catalogue swatch.

21 Sep2026
Product development

Palette and reference-photo changes

Refined Home, the mixing workbench and paint-detail screens. Added clearer palette switching and renaming, wishlist access, camera capture, local photo storage and guided onboarding. Improved dilution controls and separated wash previews from pigment-match scoring.

6 Oct2026
Development

Simpler recommendations and scoring

Refined single-paint suggestions when extra mixing offered little benefit, and recalibrated match percentages to make guidance easier to interpret.

9 Oct2026
Customer-led development

40 requested Holbein colours covered

Responded to a paying customer by adding 39 catalogue entries and updating Cadmium Yellow Light, covering all 40 requested colours. The catalogue reached 3,179 records, including Chromashine, Chroma Pearl and granulating colours.

Added notices for special-effect previews and labelled estimated swatches as unverified digital approximations.

Testing

Catalogue update verified

The recorded simulator test run completed with 16 tests passed and no failures. This is the historical result for that update.

Mixwell promotional artwork announcing 40 Holbein colours across six collections
Customer-led catalogue expansion: 39 new records and one updated record covering 40 requested colours.

Android?

I also explored how an Android version might share the catalogue and colour-science logic. That stayed at the planning stage; I hadn’t built the Android app or extracted a shared package in the work covered here.

Explore more projects →


Share this post on:

Previous Post
Certinance: from product build to commercial launch
Next Post
QuikTax Waitlist is Live!