Build log

What shipped, and when.

This site is maintained as a working product rather than a finished brochure. Every meaningful change is recorded here with the date it went live.

Entries
5
Last shipped
21 August 2026
Delivery
GitHub → Cloudflare Pages

ROOZ is published, and Slate joins the product shelf

ROOZ, the minimal weather app, is live on Myket and under review for Bazaar — the site, the case study and the structured data now say so instead of "awaiting release". Alongside it, Slate is added: a personal to-do app with named tabs, repeats, reminders and attachments, built for my own daily use and not listed in any store. Its screenshots are real, with the task text and account details deliberately obscured.

A drawn character now runs through the whole site

The interface moved from a purely typographic identity to an illustrated one. A single line-drawn character appears at the desk in the hero, presenting the project controls work, on the about page, and looking puzzled on the 404 — with smaller spot drawings for each service, the estimate form and the build log. Every drawing is inline SVG rather than an image file: about three kilobytes each, sharp at any size, and it follows the light and dark theme on its own instead of needing a second asset.

Pages now readable without JavaScript, and briefs no longer depend on a mail client

Every route is rendered to real HTML at build time instead of being assembled in the browser, so search engines, assistants and anyone on a slow connection get the content immediately rather than an empty container. The project estimate form now posts to a server endpoint that stores the brief and sends both a notification and an instant acknowledgement, replacing a mailto link that silently did nothing for anyone using webmail. Also new: this build log, an availability line in the hero, a downloadable sample project controls report, and structured data describing the three service packages as distinct offerings.

Half the homepage weight removed, and a chart that renders for everyone

The social-share card was being served as an on-page thumbnail at 648 KB — more than half the homepage. It now loads as a 29 KB WebP, taking a full mobile page load from 1,147 KB to 508 KB. Separately, the planned-versus-actual curve on the project controls dashboard was disappearing for visitors who use the reduced-motion accessibility setting: the reveal animation was switched off without restoring the line it was meant to reveal. Both fixed, along with a sideways scroll on 320 px screens, a proper 404 page, home-screen icons, and a content-security policy.

Separate route shells for every page, in both languages

Each of the site's routes now builds its own HTML file with its own title, description, canonical URL, hreflang pairing and structured data, rather than sharing one generic set. English and Persian are treated as equal versions of the same page rather than a translation bolted onto a default.