ENOGU

← All the investigations

Research

Six reviews

The owner asked for five points of view on the app as it stands: a business developer, an artist, a marketing specialist, an engineer, and a user who wonders where their painting went. This is the first run of these reviews, on version 53 of the app, by reading the code and the research and using the app in the test browser. It wasn't run on a phone, and no competitor was reopened for it, so nothing here claims to be unique.

Checked in the code before writing:

  • A painting isn't saved. Only the ten stored colours survive a restart (impasto.slots in local storage). Close the app, or let iOS end the page's process, and the painting is gone.
  • Nothing can be exported or shared. No image, no video, no file.
  • There's no colour picker on the canvas. Colours come only from the colour rings.

Those three facts come up in every review below.


1. Business developer: what will make it stand out

The first customer is the second audience in Value: someone who loves oils but can't paint daily, for lack of time, space or the smell of solvents. They already know what oil does, so they'll notice when paint behaves like it, and they'll pay for a sketchbook that fits in a pocket. Learners are the second wave. They need guidance the app doesn't have yet.

What a buyer sees in ten seconds is thick paint catching light as the phone tilts. It's the one thing a screenshot can't show and a five-second video can. Psykopaint showed it before, over a photo filter. Here it's the buyer's own brushwork, and that's the difference to lead with. Fresco's Live Oils is free and good, so "real oil paint" alone isn't a reason to switch.

The model: one purchase, not a subscription, priced like a good brush rather than an app. $9.99 to $14.99 on iPhone sits at Procreate's anchor. A free tier could hold the Zorn palette and two brushes, with the full palette, the knife and export in the paid version. A subscription would need ongoing content (lessons, palettes of masters), which the app doesn't have.

What stops a purchase: no way to keep or show the result. Someone who paints for twenty minutes and loses it doesn't come back, and a painting nobody else sees doesn't bring the next buyer.

Channels worth more than ads: oil-painting YouTubers who'd film the tilt, and paint makers (Winsor & Newton, Michael Harding, Gamblin). A named palette "mixed as our tubes mix" is credible because the pigments are modelled one by one. Apple editorial likes a calm, well-made, no-AI app from an independent maker, and that fits the family of Neshi and Nijimi.

Five changes, ranked

  1. Save paintings, and a gallery (large). Without it, nothing else counts.
  2. Export a short video of the light moving across the painting (medium). It's the product's own advertisement.
  3. The first-minute experience: a primed canvas and a suggested palette, so the first stroke looks like oil (small).
  4. Earth pigments (burnt umber, burnt sienna) (medium). Every oil painter's palette has them, and their absence is noticed at once.
  5. The side-by-side test (small). It decides what can be claimed.

2. Artist: what's missing, what's not needed

What behaves like oil: paint has body and holds a ridge. A loaded flat lays a stroke that runs dry. Wet into wet, it mixes the way pigments mix, not the way screen colours average: ultramarine and cadmium yellow make a dull green, as they should. Drying and then glazing over it works as it does in the studio. The canvas tooth shows through thin paint, and the rag lifts paint off.

What doesn't, yet: the knife lays a brick-shaped slab rather than paint off its loaded edge (open work), and knife work is half of impasto. The palette is six pigments, and a painter reaches for burnt umber and a cool red (alizarin) in the first minute. Without an earth, darks come out cold or muddy. The "stiff to oily" medium lives deep in Settings, while a painter changes it constantly. It belongs near the brush.

Missing in every session:

  • Pick a colour from the canvas (touch and hold). Matching a colour already laid down is constant work.
  • A value check: a quick greyscale or squint view. Values matter more than hue, and every teacher says so.
  • A mirror (flip the view). Painters flip the canvas to see drawing errors fresh.
  • The reference photo beside the canvas, not only under it. Trace is useful. Painting from a photo also means looking at it next to the painting.

Not needed, or in the way:

  • Sway light. It moves when nothing moved, which pulls the eye while judging colour. Keep tilt, and a fixed lamp for judging.
  • The Finger and Surface toggles (gloss, highlight, shadows, sharp). They're engine options, not painting decisions. Keep them for the engineer, hidden.
  • Ten stored colours may be more than needed. Painters mix on the palette and return to a few piles. Watch whether slots 6 to 10 are ever used before adding more.

Does the light help judging? Tilt helps to read thickness and edges, as turning a real painting to the window does. For colour judgement a painter wants even, fixed light, so the lamp setting should be one tap away.

Would I use it to practise? For mixing, yes: it teaches that complements dull each other, that white cools and that ultramarine is weak in tints, which a phone app rarely teaches. It would mislead on drying time (instant on request, never on its own) and on brush handling, since a finger isn't a brush. Say so in the app.

Five changes, ranked

  1. Missing: earth pigments, burnt umber and burnt sienna, then alizarin. (The knife fix already in the open work is a close second.)
  2. Missing: pick a colour from the canvas with touch and hold.
  3. Missing: a value check and a mirror, as two tiles in the view column.
  4. Remove: Sway, and hide the engine toggles. Keep tilt and a fixed lamp.
  5. Missing: the reference photo beside the painting, as a small movable panel.

3. Marketing specialist: what will you advertise

The sentence: "Real oil paint on your phone. Tilt it, and the light moves." (Eleven words.)

The 15-second video:

  1. (0–3 s) A finger lays one loaded stroke of ultramarine and ochre across cream linen. The paint piles at the edge of the stroke.
  2. (3–7 s) The knife drags white through it. The colours marble without going grey.
  3. (7–12 s) The phone tilts in the hand. A raking light crosses the ridges, and the brush marks stand up and cast shadows.
  4. (12–15 s) The finished small study, turning in the light. The name, the family's wordmark.

What it must show that a still can't: the light moving, and paint mixing as pigments do.

The five screenshots:

  1. A finished study in raking light: "Paint with body."
  2. A close-up of a ridge and its shadow: "Every stroke has height."
  3. The colour rings open: "Six real pigments, mixed as real paint mixes."
  4. The Zorn palette with a portrait sketch: "Four colours, the whole portrait."
  5. Tilt, before and after: "Turn your phone to the window."

Claims held back until proven (the correction in Value):

  • "The most realistic oil paint on a phone": needs the side-by-side test against Fresco and Infinite Painter.
  • "Unique tilt light": Psykopaint shipped it. Say what's true instead: the light falls on your own brushwork.
  • "Mixes like real paint": needs the mixing chart photographed against real tubes (Mixing), then it's the strongest claim of all.

Five things the product needs before it can be advertised

  1. Saving and a gallery. A review will say "it lost my painting" in the first week.
  2. Export: a photo, and a short video of the light moving. Shared videos are the free marketing.
  3. A finished painting to show. The robot painter (The robot painter) or the owner paints three small studies, from life, for the store page.
  4. The first minute: the first stroke must look like oil without instructions.
  5. One proven claim: the mixing chart against real paint, published on the site.

4. Engineer: what will you improve

What breaks first on a phone: memory, then the page's process. The grid holds five float arrays of about 2.2 million cells: about 180 MB, plus about 105 MB of textures, plus undo (capped at 48 MB), plus the web view itself. iOS ends a web view's content process under memory pressure. The app now reloads the page when that happens (version 53), but the painting is lost with it, because nothing is saved. Heat is second: the light pass runs a 16-step shadow march per pixel while tilting, so there's a frame budget but no thermal limit.

The riskiest part of the architecture is the simulation in JavaScript on the main thread. It's fast enough today (painting frames at about 17 ms at the 95th percentile in the test browser), but every feature adds to one thread that also handles touch. The move to a native Metal engine is the right end state. Before that, packing the float arrays (W1 and D1 are half empty) cuts memory by about 30% cheaply, and that's what adding earth pigments needs.

What's untested:

  • The Swift code has never been compiled here. Every change to it is written blind, and a build error only appears on the owner's Mac.
  • No timing from a phone has arrived. The launch numbers, frame times and memory are from a desktop browser with a software GPU.
  • The touch tests and the pigment check run only when someone runs them.

What loses work: everything. No save, no autosave, a process that iOS can end at any time, and New canvas one double-tap away.

Five improvements, ranked

  1. Autosave (large, risky if done naively). Save only the tiles strokes touched, as undo already does, in half floats, to IndexedDB, after each stroke and when the app goes to the background. Reload them at launch. A full save is about 180 MB, and a painting touches a fraction of it.
  2. CI on GitHub (medium): run the touch test and the pigment check on every push, and build the Swift app with xcodebuild on a macOS runner, so a compile error shows before it reaches the phone.
  3. Pack the float arrays (medium): about 30% less memory, room for two more pigments.
  4. Numbers from the phone (small): the launch readout exists. Also log frame times and memory to the Console app, so one session gives real data.
  5. Crash reports (small): collect the page's errors and the process ends in a file the owner can send, instead of relying on screenshots.

5. A user: do I miss a file picker?

Where's my painting? I painted for twenty minutes, switched apps to answer a message, came back later, and it was gone. I expected it to be there, as a photo in Photos or a note in Notes would be. Nothing told me it wasn't saved.

Do I miss a file picker? Not a file picker in the Files-app sense, but a gallery: my paintings as small pictures, the newest first, one tap to open. And "New canvas" should start a new painting and keep the old one, not erase it.

What Nijimi already does, and what to reuse. Nijimi's ink canvas (InkCanvasHandle in erezkg/nijimi-abstract, src/sim/InkCanvas.tsx on the continuous-ink branch) keeps paintings in a gallery with four patterns worth copying:

  • No blank paper in the gallery. Its snapshot returns nothing for an untouched sheet, so opening the app and leaving doesn't file an empty canvas. → Enogu keeps a painting only once a stroke has been laid.
  • Nothing lost: markKept and hasUnkept. The canvas knows whether anything has changed since it was last kept. → New canvas keeps the current painting first, if it has changes, instead of asking to erase it. The two-tap confirmation can go.
  • Pick a painting up again: resume. A kept sheet comes back dry, as a backdrop you can paint over, "which is exactly what picking up a finished painting the next day gives you." → In oil this is truer still: a painting you return to is dry, and you glaze or paint over it. Enogu already has Dry, so a resumed painting can load as dry paint, and wet work goes on top.
  • The keep happens without asking. No save button. → Autosave in the background, with the gallery as the only place paintings appear.

Nijimi's gallery screen itself isn't in that repository. The patterns above come from the canvas's own interface and comments.

How I'd share: a photo for messages, and a five-second video of the light crossing the painting for Instagram. That's the thing friends ask about.

Trace: the photo picker is enough for photos. It would be good to also trace over one of my own paintings, which the gallery makes possible.

Five changes that would make me trust it with an hour's work

  1. Autosave, and the painting is there when I come back.
  2. A gallery in the canvas menu (top left): my paintings, newest first; tap to continue.
  3. New canvas keeps the old one in the gallery, with no erase confirmation needed.
  4. Share a photo or a short light video from the canvas menu.
  5. Continue a kept painting as dry paint, to glaze over it, as Nijimi's resume does.

6. UX architect: what should change, taxonomy-wise

Added after the first five, at the owner's request, and run on version 60.

The map today

Bottom right: the brush's colour (well)
  inner ring   "Colours 1–5" / "Colours 6–10": stored mixes, one selected · ✕ clear
  outer ring   pages "Pigments" (8) · "Zorn" (4) · "Warm shades" · "Cool shades"
  tap          more of the selected colour
  arc          brush size
Bottom left: the tool (well)
  inner ring   Knife · Finger · Rag · Clean
  outer ring   Flat · Filbert · Round · Bright · Angle · Fan · Rigger
  tap          the previous tool
Top left: the canvas (easel)
  column       Undo · Redo · New canvas · Your paintings · Let it dry · Settings
Top right: the view (eye)
  column       Zoom in · Zoom out · Fit · Value check · Mirror · Trace
Settings (a sheet with the wordmark)
  Light (Tilt, Lamp) · Mixing (Pigment K–M, RGB average) · Surface (gloss, highlight follows
  stroke, shadows, sharp) · Ground (Toned, White gesso) · Paint (Stiff–Oily, Relief, press
  flatter for more paint) · Finger (Nib above, Trails, Under) · Studio (Let it dry) · Canvas
  (New canvas, Paint a sample study, timing readouts)
Canvas gesture   hold still: pick up a colour · two fingers: undo · pinch: zoom

The four corners are a good first split, and three of them already match a painter's space: the palette, the brushes, the easel. The problems are inside the groups.

Items in the wrong group

  • Clean sits among the tools, but it's an action on the tool you hold, not a tool you pick. It belongs with the brush: the tool well's centre, or its own tile in the tool ring's first place, named "Clean the brush".
  • Trace is in the view, but it's reference material, like a photo pinned beside the easel. It stays in the view corner only if that corner becomes "looking": view plus reference.
  • Settings mixes three kinds of thing: studio choices a painter makes (light, ground, medium), how the finger works (nib, trails, under), and engine switches no painter decides (Pigment K–M against RGB, the Surface toggles, Sharp, the timing readouts).

One idea, several names

Idea Names in use One name
A colour you mixed and kept colour, stored colour, mix, slot, "Colours 1–5", "colour 1" Mix ("Mix 3", "Your mixes")
The four corner buttons well, circle, ring, button Users never need a name. In the docs, well for the button and ring or column for what opens
The painting canvas, painting, sheet, board Painting for what you keep; canvas for the surface you paint on
The corner at top left canvas, easel, menu Easel (its icon already), holding the painting and your paintings

One name, several ideas

  • Finger is a tool (smudging with a fingertip) and a Settings section (where paint lands relative to the finger). Rename the section Nib, the word its best option already uses.
  • Dry appears as "Let it dry" in the easel column and in Settings → Studio.
  • New canvas appears in the easel column, in Settings → Canvas and in the gallery.
  • Light is a Settings section, and Lamp one of its options. That's fine; keep it.

The painter's words

  • "Warm shades" and "Cool shades" are ready-mixed hues. To a painter, a shade is a colour with black added. Call them Ready mixes: warm and Ready mixes: cool.
  • "Pigments" is right, but a painter says tubes. Keep "Pigments" on the tab (it's precise, and the Kubelka–Munk model is literally per pigment) and use the pigment's full name in tooltips, never "B. sienna" or "Ultram.".
  • "Zorn" is right. Label it Zorn palette, and make it the first of a set of named limited palettes as they're added.
  • "Value check" is a painter's term and right; "Mirror" likewise.
  • "Surface" toggles and "Relief" are engine words. Relief is really thickness (how high paint stands); the Surface toggles leave the painter's view.
  • "Stiff–Oily" is the painter's medium: label the slider Medium, from "Stiff" to "Oily".
  • "Ground" is right (Toned, White gesso), and belongs with the canvas, not with light and paint.

Duplicates and orphans

  • Remove Dry and New canvas from Settings; the easel column holds both.
  • "Paint a sample study" is a demonstration. It fits the gallery ("Watch a study being painted") better than Settings.
  • The timing readouts are for the engineer: hide them behind a long press on the version line.

The proposed taxonomy

Palette, bottom right
  inner   Your mixes (Mix 1–10), ✕ clear
  outer   Pigments · Zorn palette · Ready mixes: warm · Ready mixes: cool
Brushes, bottom left
  centre  the brush you hold; tap: the previous one; a tile: Clean the brush
  inner   Knife · Finger · Rag
  outer   Flat · Filbert · Round · Bright · Angle · Fan · Rigger
Easel, top left
  Undo · Redo · New canvas · Your paintings · Let it dry · Studio
Looking, top right
  Zoom in · Zoom out · Fit · Values · Mirror · Reference photo (Trace)
Studio (was Settings)
  Light: Tilt, Lamp · Ground: Toned, White gesso · Medium: Stiff–Oily · Thickness ·
  Press flatter for more paint · Nib: above, trails, under
  (engine switches and readouts: hidden, for testing)

Five changes, ranked

  1. Rename stored colours to Mixes everywhere: the ring tab, tooltips, hints ("Mix 3"), and the picked-colour message.
  2. Rename and trim Settings to Studio: only painter choices (light, ground, medium, thickness, pressure, nib). Remove the engine switches and readouts from view, and the duplicate Dry and New canvas.
  3. Rename "Warm/Cool shades" to Ready mixes, "Zorn" to Zorn palette, and use full pigment names in tooltips.
  4. Move Clean out of the tool ring to the brush itself (the well's centre, or a "Clean the brush" tile first in line).
  5. Rename the Finger section to Nib, so Finger means only the tool.

Where the five agree

Change Business Artist Marketing Engineer User
Save paintings, autosave, a gallery 1 — 1 1 1, 2, 3
Export a photo and a light video 2 — 2 — 4
Earth pigments (and packed memory to fit them) 4 1 — 3 —
Pick a colour from the canvas — 2 — — —
Value check and mirror — 3 — — —
The first minute looks like oil 3 — 4 — —
Proof before claims (side-by-side, mixing chart) 5 — 5 — —
CI, a Swift build check, numbers from the phone — — — 2, 4, 5 —

The recommended order:

  1. Autosave and a gallery, Nijimi's patterns: keep only painted sheets, keep before New canvas, resume as dry paint. Every role asks for it, and the other steps depend on it.
  2. Export a photo and a short video of the light moving. It's the product's advertisement.
  3. Pack memory, then add burnt umber and burnt sienna. It's what painters notice first.
  4. Pick a colour from the canvas, then a value check and a mirror in the view column.
  5. CI with a Swift build, so changes stop reaching the phone untested.

Open questions for the owner

  • Should New canvas keep the old painting in the gallery (Nijimi's way), rather than erase it?
  • Remove Sway and hide the engine toggles, as the artist suggests?
  • Which audience comes first: people who love oils but can't paint daily, or learners?
  • The UX architect's renames: Mixes, Studio, Ready mixes, Easel. Apply them all, or some?

Written 2026-09-27. Kept as it was written; the app may have moved on since.