loading
Turn sound on for the full experience
04GitHub
Things I build in public. Exploring ideas, testing technologies, solving real problems.
Three product teams shipping one platform, with design consistency enforced by convention alone.
Colloid, Synerise's open source design system: design tokens, typed React components and Storybook docs consumed by three product surfaces. I was a co-author, not the sole creator — I co-developed components and maintained the shared infrastructure alongside the Synerise design and frontend teams.
Co-author · 3 apps, 1 design system, in productionMost interactive backgrounds are either walls of hard-wired canvas code or heavy particle libraries that fight your bundle.
A declarative magnetic grid background component for React. Points sit at rest until the cursor moves near, leaning toward it and springing back. Rendered on a single canvas with mesh, line, and dot variants, and respects reduced motion out of the box.
1 requestAnimationFrame, 0 dependenciesLiquid glass effects everywhere — every implementation requires WebGL or canvas.
Pure CSS and SVG liquid glass refraction inspired by iOS and visionOS. Refraction via feDisplacementMap, chromatic edge aberration through blend modes, animated turbulence — zero WebGL, zero canvas, zero runtime dependencies.
0 WebGL, 0 canvas, 3 presets, React + vanillaCanvas effects on the main thread tax layout and block interaction.
Ready-to-use CSS Houdini Paint Worklets with a React hook API — noise, confetti, gradients, glitch, liquid blobs — all running entirely off the main thread. Published to npm.
5 worklets, 0 main-thread paint costGenerative animated backgrounds always come with a JS runtime cost.
Animated generative backgrounds via CSS Houdini Paint API — fBm noise, plasma, marble, film grain, mesh gradients. Zero JS after registration; animation is pure CSS @property + keyframes.
5 worklets, 0 JS after init, CSS-only animationOpening your app in 5 tabs creates 5 WebSocket connections.
One WebSocket shared across all browser tabs via SharedWorker. Each tab subscribes to topics; the worker routes messages only where needed. Falls back to BroadcastChannel + localStorage leader election on browsers without SharedWorker — same API, no code change.
N tabs → 1 connection, ~10 kB gzipEvery date picker still runs on the broken legacy Date API despite TC39 Temporal shipping in Chrome 144.
Headless date/time picker hooks built entirely on the TC39 Temporal API — useDatePicker, useTimePicker, useDateRangePicker, useTimeZonePicker. Zero Date calls, correct DST handling, polyfill lazy-loaded only when needed.
0 Date calls, correct DST, polyfill-optionalDirection-aware View Transitions require the same 30 lines of boilerplate in every app.
Router-agnostic React View Transitions. Detects forward/back direction, calls addTransitionType automatically, handles popstate — declarative API that works with any router. Requires React 19 canary or Next.js 15.2+.
0 boilerplate, router-agnostic, declarative APIVirtualizers are fast but break full-text search — Ctrl+F can't find text that isn't in the DOM.
Virtualized React list with full-text search across all data (not just visible items), scroll-to-match, and hybrid height estimation — 4-layer cascade from server hints to IndexedDB to off-thread measurement to EMA fallback.
Full search across all rows, not just visible ones