Building a design system in Tailwind v4
Tailwind v4 moved theming into CSS itself. Here is how I turned a Figma token set into a single @theme block that the whole portfolio reads from.
./fru-mark/home

Hello 👋 my name is Mark, and welcome to my portfolio site. Happy exploration 😎
carrington-115
Tailwind v4 moved theming into CSS itself. Here is how I turned a Figma token set into a single @theme block that the whole portfolio reads from.
mark-carrington
| Project name | Description | Tools | Stars |
|---|---|---|---|
| Mirrorverse for Agents | An AI automation platform that deploys agents to handle customer conversations and multi-step workflows across phone, chat, SMS and email — built so a team can scale operations without adding headcount. | AI agents, Automation, No-code | — |
| AgroSensor | Field-node firmware for precision agriculture. An ESP8266 samples a soil probe and a water board, applies calibration and temperature compensation, and publishes readings as versioned JSON. | C++, PlatformIO, ESP8266, IoT | 22 |
| AgroSmart | Precision agriculture for smallholder farms. Sensor nodes measure soil and water, a FastAPI backend ingests and serves the telemetry, and a Next.js dashboard turns it into decisions a farmer can act on. | TypeScript, Python, Supabase, Kubernetes | 2 |
An AI automation platform that deploys agents to handle customer conversations and multi-step workflows across phone, chat, SMS and email — built so a team can scale operations without adding headcount.
AI agents, Automation, No-code
Field-node firmware for precision agriculture. An ESP8266 samples a soil probe and a water board, applies calibration and temperature compensation, and publishes readings as versioned JSON.
C++, PlatformIO, ESP8266, IoT
Precision agriculture for smallholder farms. Sensor nodes measure soil and water, a FastAPI backend ingests and serves the telemetry, and a Next.js dashboard turns it into decisions a farmer can act on.
TypeScript, Python, Supabase, Kubernetes
Tailwind v4 moved theming into CSS itself. Here is how I turned a Figma token set into a single @theme block that the whole portfolio reads from.
A CMS is a lot of moving parts for a site with twelve pages. I keep content in markdown files and expose it through route handlers instead.
Sticky positioning gets the sidebar to stay put. Knowing which heading the reader is actually looking at takes an IntersectionObserver and a little care.