Mojave Paint: A new macOS image editor for Apple Silicon

Blog RSS

Dogfood, and announcing Dark Mode

I first heard the term "eating your own dogfood" in about 2000, in Gary Kimura's software engineering class at UW. He had been on the Windows NT team, where they developed that version of Windows on the nightly builds of that version of Windows. This creates a lot of pressure to fix the broken things quickly, otherwise you obviously can't any make forward progress.

I've heard the term misused a lot also since then, particular at Google, where they just used it to mean "internal testing." What it actually means is putting software product X into the critical path of development of product X. Blue screen of death while you're trying to compile Windows. GMail going down so the GMail team can't send each other CLs to review. That kind of thing. Not just like "ok everybody, try out Google Photos and report any bugs you see."

When I build the graphical assets for Mojave Paint in Mojave Paint, that's real dogfooding and I love it. One example would be hand drawing all the icons, during which I found a number of bugs in the Pencil tool including "shift to constrain direction locks in before you've even moved the cursor" and "long shift-connected 1px lines could have small gaps due to float imprecision" and plenty of others.

dark-tab-detail-4ot20y_672_78@2x

But this latest release really takes the cake. I added a Dark Mode theme, and took the opportunity to update the document tab graphics which were always kind of placeholders. The new tab design uses the new layer styles I only recently added, including drop shadow and inner shadow, and it all comes together in one virtuous dogfood cycle. Once again I found bugs and/or usability issues, including "Merge Down" doing unwanted layer style rasterization when you're just trying to compose shapes together to make a certain silhouette.1

So I'm pleased to announce this 1.4.3 release today with an often-requested Dark Mode theme, and a handful of bug fixes. Here's a preview of the new look, side by side with the original Light Mode theme.

dark-theme-uk4wd9_2692_1926@2x light-theme-rlndw5_2692_1926@2x

P.S. At this point the only thing I can't use Mojave Paint for while building Mojave Paint is rasterizing SVGs at a particular resolution. Say I purchase some vector art on istockphoto.com and want to rasterize at a particular size, Mojave Paint has no vector art support as of yet. So I'm stuck with Affinity there.

Footnotes

  1. The new merge down now behaves as Photoshop 2026 does with respect to layer styles. I often look at Photopea as a proxy for what Photoshop does, as it's 99% similar, but Photopea actually has the old Mojave Paint behavior, where the bottom layer gets its layer styles rasterized on merge down. I would check Photoshop more often but I keep all my Adobe software quarantined on my laptop rather than pollute my main dev machine (Mac Mini) with any of the Adobe shit.

Version 1.4 with Character/Paragraph Styles

I'm very excited to announce the latest version of Mojave Paint, now with much more powerful typographic options. The basics like font, size and color are still available in the Type tool options strip, and these can be used both for "preloading" for your next type layer or for changing an existing type layer.

But now, you can select a type layer and a whole plethora of typographic options appear in the Properties panel. It looks like this:

type-properties-2-ni8uqa_682_556@2x

Type layers in Mojave Paint can be framed or unframed, similar to how Photoshop works. You click to place an unframed type layer, which never wraps until you give it a linebreak. Or you can drag a rectangle which defines a frame width, and the text will flow within that frame. 1.4 adds the ability to toggle this frame on and off, and it adds left/center/right alignment, which does behave a bit differently depending on if the type layer is framed or not. Easy to figure out once you start playing with it.

Character styles have been expanded to include tracking, kerning, and horizontal/vertical scaling. The tracking and kerning units are in 1/1000th of an em, so -200 would mean push the characters together by 0.2em in CSS terminology.

And paragraph styles introduce adjustable leading, which can either be relative or absolute. Relative is proportional to whatever the native leading would be, and is a great option for when you have mixed font sizes within the same paragraph. Absolute leading puts your lines on a rigid cadence defined in points, useful for getting e.g. "10 on 12" as you would in desktop publishing software.

share-with-app-developers-clgpvo_1654_1474@2x

Thanks for checking this out and don't forget to enable "Share with app developers" under System Settings > Analytics & Improvements so I can see any crash reports!

Version 1.3 with Layer Styles

This is a big one! 120-some commits, a couple weeks of working pretty much every waking hour. I present: Layer Styles (aka Layer Effects).

  • Stroke
  • Bevel
  • Drop Shadow
  • Outer Glow
  • Inner Glow
  • Inner Shadow
  • Satin
  • Color Overlay
  • Gradient Overlay

This is the most-upvoted feature on the Interactive Roadmap, and getting it in there extends Mojave Paint's abilities as a design tool enormously. Stroke, Drop Shadow, and Color Overlay in particular are effects you'll be using constantly if you're designing a flyer or a website.

big-rock-yl7tv9_2624_1824@2x rolling-slope-bevel-5zadg8_2624_1824@2x layer-styles-window-trimmed-x6o5gb_1201_838@2x

There's a bulletin board at my local coffee shop (Cafe Feva in Seattle) and I often stare at it thinking about how I'd recreate each piece in Mojave Paint. With layer styles I could do most of them now.

You add layer styles by selecting a layer and clicking the new fx button in the layer panel, which opens this new Layer Styles window. Layer styles copy and paste with the layer, and they also come along when you drag layer content to another document with the move tool. Moreover, you can copy just the layer styles with the right click context menu and paste them onto another set of selected layers.

Hope you give them a try! As always go to https://mojavepaint.app/contact to report bugs.

Tacoma Porch Stairs

My friend Eric has a house in Tacoma, a Sears kit home shipped in by rail in 1920. We spend a lot of time there playing darts and grilling meats. Last week we pressure washed his side entry porch and he was wondering what color to paint it.

woody-porch-orig-6icclq_2624_1824@2x

Did we use AI to help us visualize colors? Did we tell the AI what kind of vibe to go for, what emotions to evoke, what neighboring architectural features the color could tie into? Shit no man, I pulled the photo into Mojave Paint and did it by hand. Because knobs you can twiddle are way more direct than telling the AI "no, give me slightly darker shade of red please. Wait, no, go back the other way a little." Good grief.

This shape is angular so it was easy to get a selection on it with the poly lasso tool. Then I subtracted out the handrails with Quickmask. Once I had a selection I stashed that as an alpha channel so I wouldn't lose it, and made 3 "Solid Color" adjustment layers, each with their own color but sharing the same layer mask. Playing with the knobs a little, Overlay blend mode at 70% opacity was looking pretty good. (Never you mind that "fx" icon in the layer panel, more on that soon…)

The end result was three color options: burgundy red, grass green, and Volvo 122 blue. What's your favorite?

And in case you're wondering, the steak we made that day turned out awesome. Done-ness determined by poking it not by using a meat thermometer, because you can't always trust technology.

woody-porch-red-od0wv1_2624_1824@2x woody-porch-green-si4k3o_2624_1824@2x woody-porch-blue-30iqb7_2624_1824@2x

Normal Linear blend mode

As a paid user of Acorn 8 I always look forward to their release notes, and in the Acorn 8.6 release notes I saw linear interpolation for brushes and thought [in kind of a Jon Stewart voice] "maybe add to Mojave Paint?"

The technical implementation was easy; I already had srgbToLinear() and linearToSrgb() from the gradient interpolation modes. The hard part, as always, is the UI. I decided to make it optional but default (for the paintbrush), and optional but not default for the pencil (which has hard edges, so it could only matter when you have opacity < 1). This way, if you want the brush to use the Normal blending mode you still can, which is traditional and expected behavior probably.

normal-linear-7tp610_2732_1750@2x

Here's a screenshot comparing the two. Regular Normal gives you a green fringe around the soft yellow stroke, while the Normal Linear mode looks like the yellow simply fades out, no green. There actually is green – there kind of has to be if you blend blue and yellow – but when mixing in linear space the greens get muted here and the overall effect is much more natural looking.

Look for it in the 1.2.5 release that just came out today.

Six Colors wrap-up

On Reddit there's about 100,000 posts asking "OK I built an awesome app, now how do I promote it?" It's a bit easier for iOS where you can buy ads in the App Store itself. For Mac you're on your own.

My first foray into advertising was to buy an exclusive weekly sponsorship over at sixcolors.com, which just wrapped up yesterday. Was it worth the $750? Absolutely!

Downloads are up and I moved as high #56 in the Mac App Store in the "Graphics & Design" category (currently sitting at #93 as I write this).

app-store-56-s9qibx_1671_1010

Purchase numbers are still tiny but also up. It's a lot to ask for someone to pay $10 not for the app that is, but the app that will be. It's basically a "donate to support development" button. I've had a purchase the last 4 consecutive days, which if that trend continues is $300/month and starting to be some real money, which both motivates me to develop faster, and helps me be able to do so financially.

But the most important thing I saw was engagement with my "Interactive Roadmap" on the website. It's clear that Layer Styles, Shape Layers, and more complete Chararacter/Paragraph formatting options are the highest priority. This really lights a fire under my kettle to get moving.

Thanks to writers over at Six Colors, and anyone who's downloaded, reviewed, or purchased Mojave Paint thus far!

The Drake Equation

An estimation of the potential worldwide userbase of Mojave Paint, estimated Drake Equation style. The Drake equation – for estimating how many civilizations might be trying to communicate with us.

Read my very unscientific analysis at https://mojavepaint.app/articles/drake-equation.

Getting onboard with RSS

I purchased a weeklong sponsorship over at sixcolors.com, check it out at the top of every page:

sixcolor-one-line-kflrr9_2246_1430@2x

And as part of the package I get a sponsored "thank you" post both on the site and in their RSS feed. RSS feeds… that's not part of my media consumption currently, but it sure makes a lot of sense. It's indie, it's diy, it's a "screw you" to the big tech algorithms.

So I got NetNewsWire and added a few feeds including Six Colors, and while I'm at it, I added an RSS feed to this very blog.

Check it out at https://mojavepaint.app/rss.

Recreating the basicappleguy.com "six years" graphic

I saw this post marking six years of basicappleguy.com and I thought it would be fun to make a similar graphic in Mojave Paint. First thing would be to save the file and open in Mojave Paint, and pick the colors out as saved swatches.

Next I drop the size down to 16x17 so I can work in true pixel art style, and draw some colorful worms. I started with the single pixel row/column selection to get a basic lattice, then I hand drew some irregularities with the pencil tool (shift for straight lines was useful here).

Then it's just finding a reasonable-looking six figure to put on top. There are no antialiasing options in Mojave Paint yet for type, but I can cmd-click the type layer to get a selection, put a layer mask on a solid white layer, and threshold the layer mask to make it hard edged. Finally, I upscaled by 94x to get something on a similar scale as the original. The six figure looks pretty crappy, probably better to hand draw or trace something, but you get the idea!

Guides and Snapping

Too much snapping annoys me -- you're just trying to reposition something and it's snapping to midpoints and all the other objects on all the other layers. So for Mojave Paint we do something a little different and only snap to guides.

But the guides themselves snap, so if you want to align things to the midpoint of the document, just put a guide there. Also, you can hold Option to snap them in thirds, making it easy to divide the canvas into thirds or sixths or twelfths.

With guides in place, the move tool and the marquee selection tools will snap to those guides, unless you hold Control to disable snapping, or uncheck View > Snap in the menu items, or hide the guides.

Found these old Photoshop books on Marketplace

These "learn Photoshop" tutorials really take me back to 2003, when I was doing continuing education at Shoreline Community College to learn graphic design. The computer labs at that time were all Mac, half OS 9 half OS X, with laminated "Think Different" posters on the walls.

photoshop-books-b3y5p4_2000_2000@2x photoshop-book-colored-solarization-baqa86_3194_2000@2x

I plan to do a regular series walking through some of these lessons in Mojave Paint, many are doable as is with no changes!