Skip to content

psousa.dev=#selectbiofromauthor;

I build the content infrastructure behind large multilingual websites, and tools for data that outgrew its container.

select*frompostswherefeatured= true;

2026-11-11

deck.cool, part 1: let the browser do the work · react · frontend · deck-cool

deck.cool is a family of unstyled React components built on what the browser already does: scroll snap, <dialog> and <video>. Plus Pagedeck, Astro for React. Part 1 of a series.

2024-01-13

SSR CSS modules as a library author · docs

Rollup-compiled CSS modules add a client-side script, raising concerns for server-side rendering. Navigate this quirk for seamless integration in both environments

select*frompostsorder bypub_datedesc;

2026-11-11

deck.cool, part 2: a carousel that lets the browser scroll · react · frontend · accessibility · deck-cool

Carouseldeck is a headless React 19 carousel built on native CSS scroll snap. The browser does the scrolling, and the library only tracks where the deck comes to rest. Part 2 of the deck.cool series.

2026-11-11

deck.cool, part 3: a drawer that lets the browser drag · react · frontend · accessibility · deck-cool

Drawerdeck is a headless React bottom sheet where the drag, momentum and snap points are native scroll snap, and <dialog> gives the top layer, focus trap and Escape. Part 3 of the deck.cool series.

2026-11-11

deck.cool, part 4: a video player that hides what it can't do · react · frontend · accessibility · deck-cool

Playdeck is a headless React 19 media player with one API across MP4, HLS, YouTube, Vimeo and Wistia. Every control checks what the active provider can do. Part 4 of the deck.cool series.

2026-11-11

deck.cool, part 5: Astro, if it were built for React · react · architecture · frontend · deck-cool

Pagedeck syncs content into SQLite, renders React to plain HTML, and ships JavaScript only for components marked "use client", on the pages that render them. Part 5 of the deck.cool series.

2026-07-20

A URL redirector that never watches you · browser-extension · privacy · typescript

Most URL redirectors work by reading every request. Ferry pushes the rules down to the browser with declarativeNetRequest, so it redirects without ever seeing where you go.

2026-07-08

Building a JSON viewer for large payloads · json · browser-extension · frontend

JSON viewers are easy to build until payloads get large. JSON Bonsai focuses on faster navigation, search, queries, and data fidelity.

2026-07-07

The content store, part 4: the fun stuff · storyblok · architecture · content-store

Once your CMS content lives in a real database, weird doors open: ranking components by fold position, generating your imports from usage data, and CI builds that never sync. Final part of the series.

2026-07-07

The content store, part 3: the read side · storyblok · architecture · content-store

Serving CMS content from a local database sounds trivial until stories start referencing each other. Relations, cycles, and why dev mode reads differently than production. Part 3 of a series.

-- more at /posts →

select*fromprojects;

typescript · extension

ferry

URL redirector that never watches you. Native declarativeNetRequest redirects, no telemetry.

go · tui

onda

Terminal radio for wandering the world's airwaves. Privacy-first, offline search, no telemetry.

typescript · extension

JSON Bonsai

Browser extension that keeps 100k-node JSON payloads navigable. Tree, table, schema, and query views.

go · cli

lnpm

Local npm package development without the reinstall loop. A faster yalc.