SharpHaw
Founder · Lisbon
My own studio, running websites, ads, content and automations for small businesses across Europe on software I built for it.
- SharpOS commits since March 2026
- 2,700+
- unit tests, written first
- 39,770
The components this site is built from, each one live. Drag the lens sliders, or open the menu from its tile.
Selected work.
Engineering with a designer’s eye.
Opens from anywhere on the site
Founder · Lisbon
My own studio, running websites, ads, content and automations for small businesses across Europe on software I built for it.
v2.0.0
A native iOS app that enforces the same access rules as the web from shared code.
v3.0.0
53 independently versioned modules, and reads no longer wait on four serial auth lookups.
type Lens = { focus: number }
// Pull the subject sharp.
export function rackFocus(
lens: Lens,
depth = 0.4,
): Lens {
const focus = lens.focus + depth
return { ...lens, focus }
}
Listen to this post· AI-narrated
0:00 / 8:41Both. I'm open to full-time senior full-stack roles and to contract builds of a product or platform.


| Week of | Commits |
|---|---|
| 23/03/2026 | 87 |
| 30/03/2026 | 116 |
| 06/04/2026 | 171 |
| 13/04/2026 | 105 |
| 20/04/2026 | 132 |
| 27/04/2026 | 89 |
| 04/05/2026 | 75 |
| 11/05/2026 | 133 |
| 18/05/2026 | 84 |
| 25/05/2026 | 21 |
| 01/06/2026 | 54 |
| 08/06/2026 | 58 |
| 15/06/2026 | 33 |
| 22/06/2026 | 194 |
| 29/06/2026 | 62 |
| 06/07/2026 | 87 |
| 13/07/2026 | 14 |
| 20/07/2026 | 47 |
| 27/07/2026 | 94 |
| 03/08/2026 | 65 |
| 10/08/2026 | 67 |
| 17/08/2026 | 99 |
| 24/08/2026 | 132 |
| 31/08/2026 | 358 |
| 07/09/2026 | 68 |
| 14/09/2026 | 41 |
| 21/09/2026 | 85 |
| 28/09/2026 | 1 |
| 05/10/2026 | 3 |

Night
Day
Each level carries its own text, worked out for it: the number is set in its text and the role in its muted text. Text keeps 13:1 wherever the surface allows and never falls under 7:1; muted text keeps 6.5:1 on every level. Under each swatch: the surface in hex, its OKLCH lightness and chroma on hue 258, then each text colour with its contrast.
Page1
Card3
Field5
Menu7
Page1
Card3
Field5
Menu7
A paragraph in Geist at 17px with loose leading, carrying bold, italic, bold italic, struck through, inline code and a link in the run of the text.
A quote sets in the serif’s italic, its opening mark hung in the margin so the words keep the edge of the column.
| Element | Face | Size |
|---|---|---|
| Headings one and two | Newsreader | 30–40px |
| Heading three | Newsreader | 28px |
| Headings four to six | Geist | 20, 17, 15px |
| Text | Geist | 17px |
| Code | Geist Mono | 15px |

const lens = rackFocus(shot, 0.4)