who I am, and

How I work

I'm a full-stack and AI engineer who builds AI-native products end to end — architecture, backend, frontend, and the AI system underneath. I ship polished, production interfaces from a one-line brief, no handoff, and build the AI and agent systems beneath them.

I came to engineering the long way — first as a graphic designer, then an art director, before writing code became the part I couldn't put down. Design taught me how interfaces and systems communicate; directing complex projects taught me to weigh scope, priorities, and decisions that have to hold up over time. Design precision and code quality are the same concern.

Now I work across the whole product lifecycle — technical architecture, backend, front-end, and visual identity — usually leading a build end to end, solo or with a small team. The projects range from e-commerce and SaaS to membership platforms and learning apps. How I actually work is what follows.

Off the clock: pandeiro, music, and travelling with my family — mate 🧉 always on the desk.

How I approach the work

The principles behind how I start, shape, and decide on a build.

what kind of engineer I am, and what the design background adds

I'm a full-stack and AI engineer. That's the work: the architecture, the data model, the API, the deploy, and the thing still running in production years later — I've built and run products like Pixeden and Lingrem alone, end to end. I got here from design rather than from a computer science degree, and I don't bury that: I worked as a graphic designer and art director before I started writing code to finish what I was designing instead of handing it off. None of it got replaced — it stacked. What the design years actually buy me is judgment about what a product should feel like, so I build the right thing and not merely a correct one; the engineering is what makes it real. The AI work is the same move once more — one more material to build with, not a new career. It's an accumulation, not a pivot — the range is the point.

How I begin a product

I start from the problem and the specific solution it actually needs, not from a template or a stack I already like. Because I own things end to end, I'm mapping the whole lifecycle early (identity, architecture, data, the AI layer) and deciding where each part has to be solid. When there's AI in it, the first question isn't "which model." It's whether AI is the right material here at all, and which parts must stay deterministic no matter what.

grounded inLingremIdentity-to-product builds

Holding design and engineering at once

I hold design and engineering at once — they're not two phases handed between people. I design knowing what's feasible and code knowing what matters visually. With AI it compounds, because the model's behavior is now part of the interface: latency, uncertainty, how it fails, when it says "I don't know" — those are design decisions as much as engineering ones. Having both perspectives is the advantage.

grounded inIdentity-to-product buildsApertureVeggieSmileSpik

When I build vs. adopt

The pattern in almost everything I build: there's a gap no library handles well, or at all, so I build it. Over the years that's meant Orion's real-time SVG engine (its parser became svgson, an open-source library still used today), Floweden (my own web framework), Lingrem's SRS engine, Pixeden Music's audio pipeline, and Mockupccino's PSD renderer. None of those are AI; they're deterministic tools I built because the off-the-shelf option didn't exist. The same building instinct now points at the AI layer too: the tools an agent can call, the retrieval that keeps it grounded, the eval harness. The lesson is identical: the interesting work isn't the model, it's the tooling around it.

My approach when no library fits

When no library fits, I build the missing piece from first principles rather than bending the project around a tool that's almost-right. With AI the reflex is the same but inverted: when the model won't do something reliably, I don't just prompt harder — I redesign the loop, give it better tools, constrain the output, and measure until it holds. I reach for the architecture before I reach for the prompt.

what stack I reach for and why

I don't pick a stack and then bend the problem to fit it; the stack is downstream of what the work actually needs. My defaults are boring on purpose: TypeScript end to end, React with the framework doing the heavy lifting, styling that lives right next to the markup, and a thin, swappable seam anywhere a vendor could lock me in. When there's AI in it, the model sits behind an interface I can replace in a line — this very site swaps its provider that way — and the retrieval and orchestration run on my side where I can see them and test them. I reach for the smallest thing that's honest about the problem, and I keep the custom tool in reserve for the gap no library covers. The stack should be forgettable; the judgment about where to spend the complexity is the part that matters.

Building with AI

Using AI as a material: the two modes, the production bar, the lines I won't cross.

How I build with AI — the two modes

I work with AI in two modes, and picking the mode is itself a design decision. I orchestrate agents for repeatable, high-volume work — I design the loop, give it tools via MCP and structured outputs, and let it run while I architect and review. And I pair with it for novel or design-heavy work, where I stay at the wheel and it accelerates me. In practice that's Lingrem's internal engine generating lessons and tuning the spaced-repetition path (it's live on web and iOS), or pairing to build Mockupccino's PSD rendering engine while the model hunts bugs and clears the grunt work. The model is the least interesting part; the engineering around it is the product.

What "production AI" means to me

"Production AI" for me is a probabilistic core wrapped in deterministic scaffolding — validation, retries, structured outputs, fallbacks — so the model never touches production unguarded. Nothing ships on vibes: I put evals in front of it (LLM-as-judge, real test sets) and measure task-success, keep a human in the loop on anything published or acted on, and keep every answer grounded in real data so it retrieves instead of inventing.

grounded inLingremAperture

how I keep an AI feature from making things up — this one included

You're using an example of my production bar right now. This agent answers from a knowledge base I wrote by hand, retrieved by meaning with a relevance floor underneath it: if nothing clears the bar, it says so instead of padding the answer with something vaguely related. It's told, plainly, to ground every claim in what it retrieved and to invent nothing — no made-up numbers, no confident guesses. And I keep a set of questions it has to answer well, so I can tell when a change quietly makes it worse. The machinery is plain: retrieval, a threshold, guardrails, a way to measure. If I wouldn't trust it, I wouldn't put it in front of you.

What I believe about building with AI that others don't

A few things I believe about building with AI that others don't. AI is a material, not a feature: you design with it the way you'd design with type or motion, instead of bolting a chatbot on top. The engineering is the moat — most "AI products" are a prompt in a trenchcoat, and the hard part to copy is the loop, the evals, the tooling around the model. Agents beat chat: the interesting surface is software that does real work with tools and effects, not another box to type into. And small or self-hosted models are underrated — you rarely need the biggest one, and the right small model behind good engineering usually wins on cost and control.

The AI anti-patterns I refuse

Some things I won't do with AI. I won't ship model output I haven't evaluated; vibes aren't a QA process. I don't claim metrics I can't prove, let alone inflate them. Generated text never leaves my hands unedited — AI drafts, I own the final word. And a chatbot with no real job doesn't ship at all.

Delivery & leadership

Owning technical direction and keeping products alive well past launch.

Do you act as a technical lead or CTO on the products you build?

Whether I'm building solo or steering a dev team, someone has to own the technical direction and keep it coherent, and that's the role I take. On my own products I own it outright: I make the architecture calls, decide where to spend the complexity, and I'm on the hook when one turns out wrong. With teams I bring the same thing: the hard technical decisions and the direction the work moves in. Owning the whole stack end to end means the identity, data model, services and AI layer stay one coherent judgment instead of drifting apart across a handoff. I've run and rewritten Pixeden myself for close to a decade, carry Lingrem across web and iOS from one codebase, and built my own framework, Floweden, so my delivery has a spine I control. Owning it means answering for it — so I decide conservatively wherever being wrong is expensive.

grounded inPixedenLingremFloweden

How do you deliver a product and keep it running for years?

Shipping is the easy part. The test I actually care about is whether a thing is still alive, and still mine to evolve, years after launch — so for me delivery isn't the release, it's owning the whole lifecycle past it. That changes how I scope: I build for the version of me who has to maintain this in five years, not the demo on Friday. Pixeden has been live for close to a decade, and I've rewritten it underneath itself without the paying users ever feeling the migration. Floweden exists for the same instinct — a framework I own and apply wherever it's needed, so the sites built on it, like i-NEEA and The Collection Paris, stay one system I keep moving forward rather than a drawer of one-off builds. End to end includes the years after the launch.

How do you decide when to turn a specific build into a general platform?

I start from a problem that needs a specific solution — the narrow, real thing in front of me — not a generic platform I'm hoping someone will want. But I build it watching for one signal: whether the shape wants to become general. When a specific project proves it can, I let it grow to cover more. Aperture is exactly that: it grew out of a single-tenant photo-selling build, with Lu Photos as one of its use-case sources, into a multi-tenant platform where any photographer runs their own branded store. Floweden came the same way: enough sites needed the same spine that I turned it into a framework I now apply wherever it fits. I don't generalize on a hunch; the specific solution has to earn it first.

grounded inLu PhotosApertureFloweden

How I operate end to end

I operate end to end — solo or leading a team — and I talk to clients directly, translating between the technical and the creative without losing either. I'd rather scope tightly around the real problem than sell a big vague build.

grounded inIdentity-to-product buildsDharma Point

open source and maintaining tools people rely on

A lot of my most-used work started as a tool I needed once and decided to finish properly. A shake animation for a single project became CSShake, a CSS library nearly five thousand people have starred and still pull from a CDN a decade later; a way to onboard people into Orion became Reactour, a guided-tour library other teams build their onboarding on; parsing and reshaping SVG turned into svgson and a small family of tools I kept sharpening. Open source is how I work, not a side effect: I publish the tool I needed, then maintain it for years because people depend on it — a different discipline from shipping once and walking away. The reach is nice, but the habit is the point: keeping a tool alive for a decade teaches you what no launch ever will.

Selected work

The proof. Public work links out; explore any of it in depth with the agent.

  • Design-assets subscription marketplace I've run and rewritten end to end (~decade live): separate Node microservices for auth/payments, GraphQL handlers, and downloads behind a Next.js BFF, Mongo + Redis, self-hosted.

  • Spaced-repetition language-learning platform, live on web + iOS from one Next.js/Capacitor codebase.

  • A real-time SVG custom-icon web app (Next.js/React/Redux, MongoDB of icons stored as JSON): browse a styled gallery (line/solid/flat/color), recolor each named layer and adjust strokes live in the browser, export as SVG / sprite / icon-font / PDF, with accounts and paid licenses.

  • A Python engine that decodes Photoshop smart-object perspective/mesh warps (nonAffineTransform + customEnvelopeWarp) and composites artwork onto mockups near-interactively (slow one-time preprocess, ~110ms re-composite via cv2.remap), behind FastAPI + a Next.js editor.

  • A multi-tenant SaaS (Next.js 16, tRPC, Postgres/Drizzle with row-level security, Better-Auth organizations, Stripe Connect Express + Tax, subdomains) letting photographers run their own branded photo-selling stores; money routes to the photographer via Stripe Connect with a platform fee.

  • A map-first discovery app for vegetarian-friendly places — restaurants, bars, cafés, food trucks — across central Italy, shipped as a Next.js 16 website and iOS/Android apps from one Capacitor codebase: Mapbox tiles + geocoding, MongoDB Atlas via the native driver with $jsonSchema collection rules, Auth.js magic-link, Cloudinary signed uploads, and Resend for owner claim-invite campaigns; a place's star rating derives purely from its count of vegetarian dishes.

  • A basketball live-stats and digital scoresheet web app for a coach or statistician working a real game single-handed: a fixed 1180×820 landscape canvas that scale-to-fits any tablet, built on Vite/React with offline-first CRDT sync (Y.js + y-partykit, one Durable Object per game, persisted) and Italian-canonical i18n; the view-only observer share-link ships, the multi-writer slice is open work.

  • Spik — a photo-plus-voice-note capture app under my Inside Frame studio, on the App Store and as a browser app at spik.club: shoot or upload a photo, record an audio narration over it (waveform overlay), tag location, then save it locally (IndexedDB, offline, no account) or share via encrypted ephemeral links; built for web and iOS/Android from one Next.js 16 / Capacitor codebase, with a one-time Pro upgrade for unlimited, longer-lived links.

  • A members' club platform for car collectors: a Floweden/Next.js + MongoDB web CMS plus Capacitor iOS companion apps (a wine/champagne carte, a Bang & Olufsen sound guide, the member card) — where a native Swift CoreNFC plugin turns the member's iPhone into a physical access badge (Host Card Emulation).

  • A French restaurant-group site built twice in Next.js/Floweden, then wired to headless WordPress: WordPress serves Gutenberg blocks over WPGraphQL and a custom React block renderer maps each block to my own animated component — so the client edits content in WordPress while the animated Next.js frontend renders it untouched.

  • A school-photo-sales platform (Next.js/Floweden + Stripe) for a specific workflow: photographers manage grades/packages and bulk-upload; parents unlock only their own child's photos by access code, buy (card or bank transfer), and download them as a zip, with PDF invoices.

  • Website and headless CMS for Dharma Point, a Buddhist meditation center in Pomaia (Italy): a Next.js 16 App Router site (PPR via cacheComponents) over MongoDB Atlas, with a block-based visual editor (BlockNote/Tiptap), Cloudinary media, and stateless JWT auth — an events calendar, a magazine, and CMS-managed Italian pages the center edits itself.

  • A music/sound-effects licensing platform where I built both sides: a bespoke Puppeteer + music-metadata ingestion pipeline that scrapes public-domain sources and bakes the licensing-eligibility rule into the crawl (only Public Domain items pass), feeding a virtualized React player app with Apollo GraphQL subscriptions.

  • React guided-tour library (~4k★) that grew out of onboarding users into Orion's icon-customization UI, then became general-purpose; now a maintained monorepo — @reactour/tour, mask, popover, utils — with docs at reactour.dev.

  • CSShake4,879

    A Sass library of CSS shake animations (~4.9k★, distributed on cdnjs) that started as one shake needed for a bigger project and got finished into a proper, granular library; later re-expressed as a parameterized React component, reshake.

  • A small, framework-agnostic library (~470★) that parses SVG into a JSON AST and back — the SVG-as-data core extracted from Orion's engine, useful to manipulate SVG in JS and store it in noSQL; reused across the SVG tools and still a dependency of Orion.

  • A belt of small single-purpose SVG libraries — svg-outline-stroke (130★), element-to-path, path-that-svg, scale-that-svg, svg-path-tools, plus svg-spreact / svgsprit.es (179★) — each doing one transformation well, most also shipped as a CLI and a hosted endpoint; the preprocessing Orion's engine and exporters rely on.

  • Floweden

    My own config-driven full-stack framework and the evolution of an earlier scaffold: declare your data model once as typed 'Items' (kinds) and Floweden generates the GraphQL server, the Apollo client operations, and a kind-parameterized admin CRUD dashboard — auth, Mongo, email and chat included.

How this site works

You're using an example of my production bar right now. This agent answers from a knowledge base I wrote by hand, retrieved by meaning with a relevance floor underneath it: if nothing clears the bar, it says so instead of padding the answer with something vaguely related. It's told, plainly, to ground every claim in what it retrieved and to invent nothing — no made-up numbers, no confident guesses. And I keep a set of questions it has to answer well, so I can tell when a change quietly makes it worse. The machinery is plain: retrieval, a threshold, guardrails, a way to measure. If I wouldn't trust it, I wouldn't put it in front of you.

This page and the agent read from one curated knowledge base. The agent retrieves from it live, grounds every claim in a real project, and refuses to invent. Its retrieval is held to a deterministic eval suite of 25 cases, gated in CI. See the eval workflow

Want to go deeper?

Ask the agent anything about how I work — it answers from this same knowledge base, in my voice.