The project-card prototype is now the home page: a carousel that extends to both window edges and a large drawer with full-image galleries. Screenshots keep their original proportions, images open in a lightbox, and the original landing-page links remain available beside the project details. Pixel Office now has twelve screenshots and a welcome-screen cover, showing the shared workspace, task board, calendar, focus tools and other parts of the product.
A clearer introduction
The profile and project descriptions now reflect my current work as a UI/UX and Visual Designer: SaaS, web apps, dashboards, design systems and visual craft, with a growing implementation practice. The Wiki describes Design Engineering as the direction I am building toward. A few old links and technical descriptions were corrected too, so the public record matches what the site actually does today.
The content now comes from a studio of my own
Until today every person, course, reading, reference, prompt and project on this site lived in two JavaScript files, and changing a line meant a pull request and a deploy. There is now a small content studio behind a login: eleven collections, a structured editor, drafts, a trash that can restore, a live preview and an export. The public pages read the content from a database at the edge, so an edit shows up on the next reload, and the files in the repository became the seed the studio starts from. The studio lives on its own host, not on this domain, and nothing about it is reachable from here.
Messages moved house
The archive that started on Aug 29 moved from a hosted Postgres to the same edge database, along with the three messages it held, and the studio grew an inbox for them: unread markers, search, archive and restore, and a reply that opens your mail client. The composer on this site is unchanged; it now archives through a route on this domain instead of calling the old database directly, and the page carries no database key at all anymore.
What it took to trust it
Content the studio writes is plain text everywhere except the glossary marks the wiki already used, and those are filtered before they reach the page. A review in eight passes went over the new code before it shipped; what it found is fixed or listed in the repository’s changelog for later.
The Writing rows are the first thing designed in Figma first
Until now, craft changes on this site were described in words and iterated in pull requests. From today they are drawn by hand in a Figma file and implemented from the frame — spacing, weight and rhythm are easier to decide by looking than by describing. The Writing rows on the home page are the first result: tighter padding and a smaller corner radius, rows sitting 4px apart, and a second line that is now a short tagline instead of the full summary that used to wrap. Hovering a row fills it with a flat gray that carries the page's warm hue — a neutral gray reads faintly blue on this background — and no longer lifts it as a card. The document icon was redrawn too: a 50×60 outlined shell, no shadow, with five 4px lines that read as a title and two paragraphs; under a hovered row its page gets a whisper of shadow. Every measurement was checked against the frame on the served page, light and dark. And every other list on the site — people, courses, readings, references, prompts, the project rows — follows the same hover from today: the same warm fill, no more card lifting off the page.
The reply address is checked before a message sends
The email step in the mail composer used to be skippable, which meant some messages arrived with nowhere to reply to. It is now required and checked: a blank or malformed address (name@gmail with no dot after the @ counts as a typo) keeps you on the step with a short hint under the field and a small shake, and the hint clears as you type. And if a send fails on every route, the sheet now says so — "Couldn't send — try again." — instead of quietly logging an error.
Messages are archived, and the composer is harder to abuse
Every message now also lands in a database of my own, alongside the mail delivery, so a hiccup on the mail service no longer loses it; the key the page carries can only write a row, never read one back. The email step says what the address is for — "Used only to reply." — and a few quiet guards went in with it: a hidden field that bots fill and people never see, length limits on both fields that match the database, a rate limit on inserts, and stricter security headers on every page. The site still sets no cookies and runs no analytics, so there is still nothing to consent to.
Scrolling eases instead of stepping
Wheel and trackpad scrolling on every page now glides with Lenis, vendored like the interaction sounds. Touch scrolling on phones stays native, the sidebar, sheets and the ⌘K list keep scrolling on their own, and with reduced motion turned on the page moves instantly, as before.
FinQ Edu gets its real favicon back
The project row and its two links were showing a generic globe: the favicon service answers with a placeholder image when it cannot reach a site, and an image that loads is not an error, so the fallback chain never ran. The icons now point at the files the sites themselves declare.
Link rows open from anywhere on the row
In a person, course, reading or reference detail, the rows under "Links" looked like every other row on the site but only the word itself was the link, so a click on the rest of the row went nowhere. A few readers wrote in about that ghost click. The whole row is now the link, the same way the people rows inside an entry already worked — and the landing-page cards in a portfolio project (image, name, description) open from anywhere on the card too, not just the name.
The CI check is green again
Two UI smoke tests had been failing on every pull request since Aug 26 for reasons unrelated to the changes they flagged: one still expected the lowercase navbar labels, the other tried to load the prompts module in Node, where the vendored sound library's browser path cannot resolve. Both fixed, so a red check means something real again.
Two Craft references go deeper: Simile and Fey
Simile (an AI company simulating human behaviour) and Fey (the investment research app three Montreal design engineers built and later sold to Wealthsimple) now open with more than a single link. Each carries a short story plus the people behind it: Natasha Tenggoro, Mihika Kapoor, Christopher Pondoc and Jenning Chen for Simile, and Dennis Brotzky, Thiago Costa and TJ Russell for Fey. Clicking a person swaps the same window for their own detail instead of opening a new one, with a way back.
Six more people join the list
Thomas Cullen, Seth Thompson, Hamza Alabou, Josh Grazier, Preston Booth and Kosta Canatselis are now in The People, under show more.
The site makes sound now
A few interactions get a quiet sound cue, synthesized live rather than played from an audio file: a soft tick on hover across the navbar, the mail icon, and every list row; a warm swell when a row opens into its full detail; a short glide down when you close it with the ×; and a mechanical click on the dark-mode toggle. Kept deliberately restrained — a detail, not a soundtrack. Built on cuelume, an open-source sound library by Daniel Belyi.
Small top-bar polish
Nav labels are capitalized now (Home, Wiki, Changelog, Prompts), and the home page's link to this plan reads "Read the wiki" instead of "Read the plan".
The mail composer actually sends now
The envelope in the topbar used to build a mailto: link — pointed at a stale email address on top of that, so a reply had nowhere real to land. Even with the right address, mailto: itself was unreliable: a visitor with no mail client registered in their browser just got left staring at a blank page. The composer now sends the message straight from the page instead, so nothing ever navigates away. It also asks for a reply email first — optional, skippable — before the message, so a reply can actually reach back, and shows a real "sent" confirmation instead of just closing the sheet.
Dark mode goes "Dim" — navy, not flat black
The whole dark palette moved off flat black to a navy tone, studied against Twitter/X's own Dim theme, with the gray ramp picking up one consistent blue undertone instead of staying colorless. Two shadow-clipping bugs turned up along the way and got fixed — one cutting hover shadows sideways on every row, the other only on rows revealed by "show more" — plus shadows that had gone invisible on the darkest surfaces were removed, and navbar text that had faded too far into the background was lightened back to a comfortable read.
The Dim background goes darker still
Later the same day, dark mode's background dropped further into navy for a more comfortable read in a dark room. Cards, borders, and hover states shifted with it to keep the same sense of depth, and every bit of text stayed easy to read against the new background.
A Projects section joins the home
Six real studio pieces — Sphera Academy, Caderno de Erros, CloudFaster Academy, DascIA, FinQ Edu, Escola da Bel — now sit between the contributions graph and personal projects, each with a favicon pulled from its own site and a show-more past the first three.
A warmer page; cards and the navbar stay crisp white
The background moved off pure white to a warm, paper-like off-white. Cards, the navbar, and every glass surface stay pure white on purpose, so they read as chrome floating over the page instead of blending into it. Hovering a row now lifts it into a white card with a soft shadow, instead of just filling it gray.
The intro's word centers itself, and drops its bullet
The greeting used to anchor to a small bullet on its left, so short words drifted up to 65px off center depending on the language. The bullet is gone, and the word lands at the same true center in all six languages now.
The photo gallery is paused, for now
The small placeholder gallery that used to show under Personal projects is hidden again — real photos are pending. Nothing was deleted; turning it back on later is a one-line change.
The home says hello too; mail and X reach every navbar
The six-language greeting used to play only on the plan page — the home skipped straight to content. It now plays on whichever of the two you land on first, once per tab. And the navbar's envelope and X buttons, wiki-only until now, sit next to the theme toggle on the home, changelog and prompts as well; the message composer opens the same sheet everywhere.
Writing opens in place; sections pulled closer
On the portfolio, a piece of writing now opens in the same card as a project instead of leaving the page, and the contributions graph sits right under "What I do". Across the site, sections came back to 72px apart — the wider gap measured on Emil's site read too loose here after a day of real use.
The portfolio page is live
"Portfólio · coming soon" in the navbar is now a page: what I do, writing, a year of GitHub contributions in the site's blue (refreshed daily, real numbers), client work, personal projects, life, and a small photo gallery with a lightbox. Projects open in the same card the ⌘K search uses, and ⌘K finds them from any page. Client entries are placeholders for now — they stay hidden until real ones replace them.
The navbar icons come from Phosphor now, inlined. Courses lost their third column — the status folded into the description. And the hover fill on list rows breathes 12px past the text instead of 8, so a favicon no longer sits against its edge.
The page breathes: spacing and type recalibrated against Emil's site
Everything sat a little too close. Measured emilkowal.ski in a real browser and matched its rhythm: a wider reading column, sections almost twice as far apart, more air between list rows (and no more hairline under each one) and plan items, and type back at 16px with a single step of weight for titles instead of one weight everywhere. Same content, same layout — it just stops feeling crammed.
⌘K works on every page and finds prompts too
The command palette used to live only on the plan page. It now opens on the changelog and prompts pages as well, and it searches everything saved on the site — people, plan phases, craft references, courses, readings, and now the prompts (by title, category and tag) — plus the pages themselves, so it doubles as a way to hop between them. Picking a prompt opens the same detail sheet as on the prompts page, copy button included.
People open in a modal; the plan keeps the sidebar
Clicking a person, a craft reference, a course or a reading now opens a centered modal over a soft wash — the same surface and motion the ⌘K detail already uses — instead of sliding the sidebar in from the right. Only the plan's phases still open there, where reading alongside the page makes sense.
Changelog groups a day's updates under one date
Days with more than one change — like this one — now show a single date and dot with the updates stacked beneath, instead of repeating the date for every entry.
That navbar now hides and reveals like the plan page's
Hidden on load, shown on scroll, tucked away again after a moment of stillness unless you're hovering it — the same reveal behavior the plan page's navbar already had, now matched here too.
Changelog and Prompts get the real navbar back
Both pages were missing the primary nav entirely — logo and theme toggle only, no index/changelog/prompts links. They now carry the same navbar as the plan page.
Prompt modal caps its height and scrolls quietly
The detail sheet a prompt opens into now stops growing at 600px tall and scrolls internally past that, with a thin, near-invisible scrollbar in the same delicate style used elsewhere on the site — closer to a native overlay scrollbar than a browser default.
Three curated prompts join the collection
An animated toast/drawer component brief and a motion-audit brief, both referencing Emil Kowalski's Sonner/Vaul craft, plus a minimal typographic landing-page brief referencing Jakub Krehel's portfolio.
Prompts become a list, not a page-length dump
Each prompt is now a single row — title and category — that opens the same modal surface as the ⌘K command palette: same wash, same motion curve, same Escape and focus-return behavior, instead of running the full prompt body down the page. The search field also switched from a bordered input to a pill matching the navbar's, with its own gray clear icon replacing the browser's default blue one.
A smaller, more honest navbar
The primary nav drops its six in-page anchors down to three real pages — index, changelog, prompts — plus a "portfólio" item wearing a small "coming soon" tag. It isn't a link yet, and doesn't pretend to be one: no href, no hover, no keyboard stop.
A dedicated page for prompts
/prompts joins /changelog as a clean-URL sibling: instant search across each prompt's metadata and content, and a copy action that reproduces the exact raw multiline text. It shipped with the same Storybook, accessibility, and visual-regression coverage as the rest of the site.
This log moves into the navbar
The changelog link used to live only in the footer. It became the primary nav's seventh item, replacing "aesthetics", with a short section under "The principle" explaining why the log exists at all.
Dominik Kandravý's row, trimmed to fit
His inline summary ran 47 characters into a layout budgeted for about 35 before ellipsizing. Cut down to what the unchanged bio already said, without losing anything.
Dark mode, and the tools behind the scenes
A theme toggle that follows the OS live until you override it, with no flash on load — the choice is read and applied before any stylesheet paints. Alongside it, a Storybook MVP: a visual inventory for development only, not a rewrite of the site into components.
Nineteen more names
The people, references, and courses lists grew: 19 more people, 3 craft references, a new course entry. A tag-pill experiment on those rows got reverted back to plain text summaries after it broke horizontal scroll on mobile.
Flat typography, on trial
An experiment collapsing every heading and paragraph to one size and one weight, testing whether gray, space, and rhythm alone can carry the whole hierarchy. Fully revertible — remove one stylesheet link and it's gone. Alongside it, hovering a list now dims every row but the one under the cursor.
Hello, in six languages
An Apple-style intro greeting plays once per tab before the homepage appears, cutting between languages on a metronome and landing on the mark. It shipped at 20 languages and got trimmed four times chasing the right runtime and feel — 7, then 6, then 5 — plus a Safari bug fix that had kept it from playing at all.
Recovered, split into files, tokenized
The starting point: the site recovered from production, split from one HTML file into markup, stylesheet, and script, a nonexistent browser storage API removed, and — by the end of the day — every color, timing, spacing, type, and radius value pulled out into its own token file.