Two conversational assistants in production. An AI matching flow. A content pipeline that produced 109 published guides. And at NovaVista, a layer of automations that runs the company itself, from lifecycle email to the numbers our investors read. Everything on this page shipped.
// the whole page in one picture. everything in the green column is live.
// flip a card to see what
// flip a card for what it made. the full proof, tool by tool, is in the stack further down.
I design the interface and the data model first. Then I sit inside Claude Code, Cursor and Codex and direct the model to build them in real React and Next.js. My time goes into reviewing and steering working code, not into handing a Figma file to someone else and waiting for it to come back wrong.
On NovaVista this changed how the design conversation works. I bring a running prototype to the engineering team instead of a static mockup, which turns a two-week alignment loop into a two-day one. On PraticheEasy it went further. I shipped the whole thing.
Product shape, information architecture, the data model, every interface decision. And the final read on whether the output is actually right, which is the part the model is worst at.
Implementation and repetition at scale. On PraticheEasy that meant database migrations, row-level security enforcing free and paid plans at the database rather than only in the UI, Stripe checkout and webhooks, and the scheduled jobs that actually send the reminder emails.
The AI owns volume and speed. I own correctness.
Anyone can put a chat box on a product. The design work is everything around the confident answer: what the assistant is allowed to talk about, what it is grounded on, and where a person ends up when the model is not reliable.
On NovaVista I took an assistant to production: conversation flows, prompt and context design, error and uncertainty states, with an explicit exit to a human operator when confidence drops. On PraticheEasy I designed the scope and grounded the assistant on 109 verified guides. Same problem, two different escape hatches.
// the uncertainty model, drawn as a pattern. not a product screenshot.
Behind that behaviour there is a boring, mechanical question: what exactly goes into the model before it answers. This is the context assembly on PraticheEasy, where every source is public and you can go and check it.
// the violet path is the one that does the work. no grounded context, no answer worth trusting.
I chose admitting uncertainty over conversational fluency. It reads worse in a demo and works better in production.
Designed together with the people building the model. The design questions were never about the algorithm: what do we show, what do we deliberately hide, and how does the result get explained to the person reading it. A recommendation nobody understands is a recommendation nobody books.
The PraticheEasy assistant is live. You can open it, push it off-topic, and watch it fall back to the verified guide instead of guessing. That is the whole point of building in public.
This one is not in the product. It sits behind it, and it keeps a small team running a two-sided marketplace across three surfaces. We built it in n8n, and I designed what it says, when it fires and who it is talking to. Two of the three workflows funnel many signals into one action. The third does the opposite.
Sending is triggered by what a person actually did on the platform. The content is then assembled from three sources: their stated preferences, the kind of service or practitioner they were browsing, and what they have bought before.
The email arrives about a thing they were already looking at. Not a template with a first name in it.
// workflow diagram, not a screenshot of the canvas. the personalisation is the three inputs on the left.
Agendas and internal meetings get booked by a workflow that reads our internal chats and takes commands we send from WhatsApp, Telegram or Notion.
The design decision was the surface. We schedule from where we already are, not from a tool someone has to remember to open.
// the design decision is the left column. we schedule from the surfaces we are already on.
Data collection and reading run through AI, and land in three places on purpose. An alert when a number moves. A dashboard the team watches. And the reports our investors read.
Same pipeline underneath, three formats, because a founder scanning a phone and an investor reading a quarterly need very different things.
// the only workflow of the three that fans out. same data, three audiences, three shapes.
This is the part that surprises people in interviews, and it is why it gets its own page. It is evidence of something a portfolio of screens cannot show: I can look at how a business actually operates and automate the parts that were eating the team's week.
The instinct with a content problem this size is to prompt harder. I did the opposite. I designed the shape of the output first, then built a small machine that fills it. Every guide is structured data, which is also why the JSON-LD Google needs comes out for free, in five languages.
{ "slug": "pagare-f24", "intro": "one short paragraph, plain language", "requirements": [ "what you need before you start" ], "steps": [ { "n": 1, "title": "...", "detail": "..." } ], "faq": [ { "q": "...", "a": "..." } ], "office": { "name": "...", "phone": "...", "pec": "..." }, // a real office, not a link "related": [ "slugs" ], "locales": [ "it", "en", "ro", "es", "fr" ] }
// design the shape once, the pipeline fills it 109 times, i review all 109
Government pages, forms, circulars. Fragmented, jargon-heavy, often contradictory.
sourcedThe shape above. What a guide always contains, and in what order.
my designBuilt to turn raw information into a guide in that exact shape, every time.
my designVolume the model handles well, plus the JSON-LD that comes free from structure.
ai outputOne deadline template calculated a licence renewal from the expiry date instead of the last renewal. Wrong for every single user. I caught it.
my review
I didn't use AI to produce output. I designed a small pipeline with it, then stayed the editor.
A model working from memory invents plausible answers. Most of the failure modes people blame on AI are really a context problem. I run my tooling over MCP so the model queries actual sources instead of guessing at them. Claude Code, Cursor and Codex all sit on the same set of servers.
model │ ├── design-system → real components + tokens // stop reinventing the button ├── product-db → rag over production data // answer from the db, not from memory └── apify → market · competitors · news
// the gain is not speed. it is that the answer is grounded in something i can check.
// green column on the right is the point. every claim the model makes can be traced to something that actually exists.
Exposes the real components and tokens, so generated interface uses what already exists instead of reinventing a button. The design system stops being a document nobody opens.
Retrieval over the product data, so a question about what is actually happening gets answered from the database rather than from a guess.
Market research, competitor data and news, pulled in structured form. It turns "what is the market doing" from a two-day desk exercise into a query.
Grounding is a design problem before it is an engineering one. The same instinct that puts an MCP server between a model and the truth is the one that puts a verified guide behind an uncertain answer.
One small proof that this is a practice and not a slide: the icons on this page come from my own set, and four of them exist only because of this work. No library has an icon for a model admitting it is unsure, or for the handover from an assistant to a human. I had to draw them. See the icon system →
A list of logos proves nothing. So this one is paired: on the left the tool, on the right what came out of it. Nothing on this page is here because it looks good in a slide.
This page is the summary. The work is in these two, and one of them you can open and use in the next thirty seconds.
Wellness marketplace across three surfaces. The conversational assistant, the AI matching flow, and the n8n layer running the business. 2,000+ paying users, ~€50K MRR, a €500K pre-seed.
read the case study →An AI product for Italian bureaucracy, designed and shipped solo in about seven weeks. The content pipeline, the assistant, and a design system of 57 components that lives in production.
read the case study →Open the assistant, push it off-topic, and watch what it does when it isn't sure. That behaviour is the design decision this whole page is about.