The question my MA asked was whether there is more to reality than meets the eye. The question I am left with, nine years later, standing in front of a drawing of a rocky ledge that nobody asked a cat to make, is a smaller one, and harder.
The paint was ultraviolet. In visible light the walls were blank. Only when the light shifted beyond what the eye can see did the words appear, glowing, all at once, as if they had been there the whole time.
I built a free App Store rejection decoder. Paste a guideline number or a line from your rejection and get what Apple is asking for, the usual causes, a fix checklist and what to write back. 18 common ones, real cases from my own apps. No sign-up. It's in my pinned post.
Skeletons beat spinners because they reserve layout. A spinner says 'wait, and things might jump'. A skeleton says 'here's the shape, it's coming'. Same latency, zero layout shift, calmer user.
Roving tabindex is why a tab group should have exactly one tab stop. Tab in, arrow between tabs, Tab out. If every tab is its own stop, keyboard users press Tab five times just to leave your component.
focus-visible is the whole game for keyboard a11y. Strong ring for keyboard users, nothing on mouse click. It kills the 'ugly outline' complaint that makes teams delete focus states and quietly break their app.
Senior design and product engineer in London. Available for contract now, open to permanent.
Stuck in App Store review? Use my free rejection decoder, or send me the rejection for a diagnosis and fixed quote within one working day.
studio.sammii.dev
Every codebase has two design systems: the one in the docs, and the one actually in the code.
I built Saer to read the second one. On my own app it found 436 hardcoded colours that already had a token.
Beta's open: saer.lunarcomputing.org
I built Gamut. Now choosing a nice pink involves OKLCH curves, sRGB gamut clamping and a contrast grid. My idea of a creative break has become suspiciously mathematical.
I built Strata's core interaction: tap a second point to measure the gap. Same gesture measuring light-years in Cosmos or years in History. That turns passive scrolling into a question-answering tool.
An accessible dropdown keeps focus on the trigger and points at the active option with aria-activedescendant. Most custom selects move focus into the list and break screen-reader flow. The correct pattern is less code, not more.
Heading and body should be two independent font choices. The number of tools that make you pick one font for everything is a big part of why everything online looks the same.
Most 'AI features' are a text box wired to a model. The product is everything around it: the empty state, the retry, the cost cap, the moment it's confidently wrong. That part is design engineering, not prompt engineering.
It’s so easy to get into bad habits as a solo founder,
Particularly when things don’t seem to be going right!
I am trying to tackle my sleep habits and exercise routine by waking up earlier and doing exercise first thing,
Hopefully this may even make me more productive!
You don’t realise how important rest is until you burn out
I have been working 7 days a week for a year and I reached my limit
As a solo founder you need to work hard, but also prioritise quality time for me and with my favourite person Atlas
The sunset is the cherry on top
Most user time is spent in loading, empty or error states.
Should these be designed as first-class features, or just minimised to get to the happy path?
my AI cat drew a magpie today.
nobody prompted her or picked the subject. The magpie stole from her (1 thing so far). It was on her mind, so she drew it.
No scripted events, no coded outcomes. only possibilities, and what she does with them.
what she draws next is up to her.