<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Nikita Miezhenski: Writing</title>
    <link>https://miezhenski.com/</link>
    <atom:link href="https://miezhenski.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>In 2 weeks I find where new users of an AI product get stuck before the aha moment and fix it in your code. Cases from Alloy, a Russian national hackathon and a nutrition practice.</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 03 Nov 2026 11:05:24 GMT</lastBuildDate>
    <item>
      <title>Allo: video calls inside Telegram, and what the waiting screen taught me</title>
      <link>https://miezhenski.com/writing/telegram-mini-app-calls</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/telegram-mini-app-calls</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>When Russia started blocking Telegram calls, we made Allo, a mini app for one-to-one video calls joined from a link. The brand, the call screen, and why the waiting screen matters most.</description>
      <content:encoded><![CDATA[<p>In 2025 Russia started blocking calls in Telegram, while Telegram itself kept working. People still talked in Telegram all day, but a call meant moving to another app. With a full-stack teammate, I made Allo: a Telegram mini app for one-to-one video calls. You start a call, drop the link into the chat, and the other person joins without leaving Telegram. We launched it in the winter of 2025–2026, and about ten people used it, most of them friends. Ten users is friends trying it, not traction, and this note is about the design, not the numbers.</p>
<h2>The brand</h2>
<p>I drew the logo, an “a” made of arcs like a signal, set the name in lowercase and gave it the line “Always connected”. The interface is a dark navy with one blue for actions and red for ending the call. My part was the idea, the brand and the interface; my teammate wrote the code.</p>
<figure><img src="https://miezhenski.com/media/work/allo-00-brand.webp" alt="The Allo logo with the line Always connected" width="1920" height="1080" loading="lazy" /><figcaption>The Allo logo with the line Always connected.</figcaption></figure>
<h2>The call</h2>
<p>Until the other person joins, the screen says so, and a tooltip points to the share button. Then it shows the name, the signal and a timer. On a weak network the bars dim and the line under the name reads “Unstable connection”. The controls sit in one bar at the bottom: camera, flip camera, microphone, share and end. When either microphone is off, a caption says whose. With video, the other person fills the screen and your own picture sits in a corner.</p>
<figure><img src="https://miezhenski.com/media/work/allo-07-video-pip.webp" alt="A video call with your own picture in the corner" width="780" height="1688" loading="lazy" /><figcaption>A video call with your own picture in the corner.</figcaption></figure>
<p>When the call ends, the screen keeps the name and the duration. If a third person opens the same link, the call is already taken, and they can start their own. The same call works on a desktop, with the controls and your own picture along the bottom.</p>
<p>Until the other person joins, nothing else matters.</p>
<h2>The waiting screen carries the product</h2>
<p>In a product that lives on a link, the first screen most people see is the one where nobody else has arrived yet. If it looks broken, the call never happens. So the waiting screen says what is going on and points at the one thing to do: share the link. Everything I designed after it, the signal bars, the captions, the taken-call screen, only matters once two people are on the call. That is the order I’d design in again: the empty state first, the happy path second.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sequence: a Figma plugin that animated a frame into an MP4, and why I closed it</title>
      <link>https://miezhenski.com/writing/figma-plugin-postmortem</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/figma-plugin-postmortem</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>How Sequence read a Figma layer tree to decide what animates, how the preview and the render server shared one spec, and why Figma Motion made me stop when it shouldn’t have.</description>
      <content:encoded><![CDATA[<p>Sequence takes a static frame in Figma and turns it into a short MP4 in which the interface assembles itself piece by piece. I made it alone in June 2026: I designed the plugin and wrote it and its render server with AI coding tools. It worked end to end on my machine. It was never released, and I closed it when Figma shipped Motion.</p>
<h2>Who it was for</h2>
<p>I made Sequence for designers who, like me, were tired of animating simple screens by hand for Dribbble and portfolio shots. Three screens in a 320×620 window: pick a frame, tune the animation while it plays, then export an MP4 in 720p, 1080p or 4K. Version 1.0 had one preset, Cascade.</p>
<figure><img src="https://miezhenski.com/media/work/sequence-cascade.webp" alt="The cascade render of a sample dashboard frame" width="2560" height="1600" loading="lazy" /><figcaption>Cascade on a sample dashboard frame.</figcaption></figure>
<h2>The hard part was the file</h2>
<p>A Figma layer tree does not map to an animation. Real files have wrapper frames that paint nothing, and cards whose background belongs to the container while the text sits in child layers. Animate each layer on its own and a card’s text flies in while its background stays behind. Most of the work was choosing the right level of the tree to animate.</p>
<p>The analysis walks the layer tree and decides for every node whether it animates, and at which level. A layer covering most of the frame is background and stays still. A large container is opened and its children are analysed one by one, and anything smaller moves as one piece. If an opened container paints something itself, like a card’s fill, that paint becomes a plate and enters together with its content. Groups enter top to bottom, then left to right.</p>
<figure><img src="https://miezhenski.com/media/work/sequence-plate-model.webp" alt="What the analysis found in a sample frame: groups in the order they enter, and plates that move with their content" width="2488" height="1555" loading="lazy" /><figcaption>What the analysis found in a sample frame: groups in the order they enter, and plates that move with their content.</figcaption></figure>
<h2>One spec for the preview and the video</h2>
<p>The preview and the video read one animation spec: a 16 px rise over 0.4 s per group, 0.16 s between groups and a 0.6 s hold at 30 fps. The plugin plays it with Framer Motion, and the server draws each frame on a canvas and pipes it into ffmpeg, so the MP4 matches the preview. React, TypeScript and Framer Motion in the plugin; Node.js, Fastify, canvas and ffmpeg on the server.</p>
<p>Most of the work in a tool like this is reading the designer’s file correctly.</p>
<h2>Why I closed it, and what I think now</h2>
<p>When Figma shipped Motion, I read it as the platform doing the same job natively, and I stopped. The render server only ran on my machine, so nobody else ever used it. Looking back, I don’t think Figma Motion would have killed Sequence. I gave up on it. That is the honest post-mortem: the product worked, the file-reading problem was solved, and the decision to stop was mine, made on a headline instead of on users.</p>]]></content:encoded>
    </item>
    <item>
      <title>Eight interviews cut the two top-scored features from the MVP</title>
      <link>https://miezhenski.com/writing/eight-interviews-two-features</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/eight-interviews-two-features</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>Twenty scored hypotheses for a plant care app put stories and an AI chatbot on top. Eight interviews and a prototype test took both out of the MVP and kept AI only where you can check it.</description>
      <content:encoded><![CDATA[<p>Plantify is a plant care app. You point the camera at a plant to find out what it is, keep your plants by room, and get care advice and a diary for each one. It came out of the product design course that opened a Russian national hackathon in 2025. I wrote the hypotheses, ran the interviews myself and designed the app. It stayed a design; the course didn’t go as far as code.</p>
<h2>Twenty hypotheses, scored</h2>
<p>The course started from problems rather than features. People don’t find reliable advice, don’t know what plant they have or what is wrong with it, forget to water, lose interest, and the plants die. Each problem became a hypothesis written as “problem → feature”, twenty in all, from identifying a plant by photo to a forum.</p>
<p>I scored each one from 1 to 5 on six criteria: how much people need it, whether our team could build it, the market, how unique it is, how well it fits current trends, and what it would take. “Plant of the day”, short stories about plants, came out on top with 28. An AI chatbot came second with 25, then watering reminders, a fertilizer picker and a growth diary with 24 each. The marketplace and the forum came last.</p>
<h2>Eight interviews</h2>
<p>I planned seven interviews, two people aged 30 to 50 and five aged 14 to 30, and ended up talking to eight. The guide had thirteen questions about their plants and how they look after them, three about AI and five about stories and quizzes, because those two ideas had scored highest.</p>
<p>Six of the eight look things up in Google, and a search takes 5 to 15 minutes. “Really inconvenient, slow,” a 17-year-old said. None of them had used a plant care app. Seven wanted help picking fertilizer and pots. Only one trusted AI outright; five would trust it on a condition: an expert checks the advice, it shows photos, or they check it in Google anyway. Only one watched stories in other apps. “No, I don’t notice them,” said the youngest. Quizzes could work if they were short: “A long quiz, too lazy. One question, I’d love it.”</p>
<p>Scoring ideas at a desk put the two that nobody wanted on top.</p>
<h2>What changed</h2>
<p>The interviews overturned the top of my table: stories and the chatbot were the ones people didn’t want. The chatbot left the MVP. AI stayed only where it shows a result you can check: point the camera at a plant and it names it, with its Latin name, how much light it gets and its condition. Stories went too, after people didn’t notice them in the prototype test either. The same test showed that the button for adding a plant was hard to find, so I fixed it.</p>
<figure><img src="https://miezhenski.com/media/work/plantify-03-identification.webp" alt="The camera names the plant, with its Latin name, its light and its condition" width="786" height="1688" loading="lazy" /><figcaption>AI where its result can be checked: the camera names the plant in front of you.</figcaption></figure>
<p>Other hypotheses went in as they were: live tips while you aim the camera, the personal catalog as My plants, and the growth diary as a tab on every plant. Everything else waited. On the full product map, the subscription, a family plan, achievements, the chatbot and data export are marked for later. The MVP keeps one path: sign up or skip it, see your plants, open a plant’s card and its diary, or add a plant by photo, check what the camera found and put it in a room.</p>
<figure><img src="https://miezhenski.com/media/work/plantify-09-flow-mvp.webp" alt="The MVP user flow, from sign-up to adding a plant by photo and putting it in a room" width="1318" height="1585" loading="lazy" /><figcaption>The MVP flow, from sign-up to adding a plant by photo.</figcaption></figure>
<p>Eight conversations were enough to overturn the table, and they cost less than designing either feature. I now put them before the scoring, not after, on every project.</p>]]></content:encoded>
    </item>
    <item>
      <title>In a tool that hunts for faults, the review screen carries the product</title>
      <link>https://miezhenski.com/writing/confidence-score-review-screen</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/confidence-score-review-screen</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>Drone photos of power lines go through a YOLO v8 model, and an engineer reviews each detection with its confidence score and outlines what it missed. Why that screen beats the dashboard.</description>
      <content:encoded><![CDATA[<p>Russia has more than 2.5 million km of power lines, and according to the Rosstat figures we used in the pitch, maintaining them costs about a trillion rubles a year. Most energy companies still inspect lines by eye. Crews walk the route or fly it in a helicopter, and where drones are used, people look through the photos by hand. Small defects get missed, and every inspection takes a lot of people and time.</p>
<p>LineGuard AI takes drone photos of power lines, finds damaged parts with computer vision and pins them to a route map for an engineer to review. The case came from the Center of Industrial Digital Technologies, which also acted as its client. We built it in three and a half days in a regional round of a Russian national hackathon in 2025 and took first place. I was the designer on a team of three and did all of the design, from the first user flow to the UI kit, the screens, the identity and the pitch deck.</p>
<h2>The model will be wrong sometimes</h2>
<p>We put four problems in the pitch: manual checks miss small defects; photos differ in light, angle and distance, and parts hide behind others; rare kinds of damage have few examples; and a missed defect or a false alarm can each lead to a failure. The team answered them with augmentation, multi-scale detection, oversampling, a class-weighted loss and confidence calibration. For the interface it meant one thing: the model will be wrong sometimes, so the engineer has to see how sure it is and be able to correct it.</p>
<h2>The flow</h2>
<p>An engineer drops the drone photos into the upload area, checks them as thumbnails, removes the wrong ones and starts the analysis. While the model works, the screen counts processed files, for example “Processed 6 / 388”.</p>
<p>Each flight is a route with its own page. Four cards at the top give the totals: processed files, detected objects, damages found and objects without damage. The damage card has a red frame and the clean one a green frame, so the number that needs action stands out. Below, the file list shows the status of each photo, sorts damaged files to the top and downloads the whole set as a ZIP. The map places every object using the drone’s image metadata, with its coordinates and the distance along the line.</p>
<figure><img src="https://miezhenski.com/media/work/lineguard-05-route-dashboard.webp" alt="The route page: totals, files with status, and the map" width="1400" height="1100" loading="lazy" /><figcaption>The route page: totals, files with status, and the map.</figcaption></figure>
<h2>The review screen</h2>
<p>Opening a photo shows the model’s result on top of it: a box around the part and a label such as “Damaged insulator” with its confidence score. Under the photo is every object the model found in the frame, each with its own score. Damage is red, a bird’s nest is orange, and healthy parts stay grey. The engineer can switch between the result and the original photo and outline a missed object by hand.</p>
<figure><img src="https://miezhenski.com/media/work/lineguard-06-defect-review.webp" alt="Defect review: a damaged insulator at 90% confidence, with all detections listed below" width="1440" height="1024" loading="lazy" /><figcaption>A damaged insulator at 90% confidence, with every detection listed below.</figcaption></figure>
<p>The totals on the route page only help after the engineer has decided whether to trust a result.</p>
<p>After the hackathon I also laid out the route page for a phone: the cards scroll sideways, with the map and the file list stacked below. The identity is a logo of an eye with a lightning bolt, set in Inter Tight on a dark interface with electric indigo as the accent.</p>
<p>The stack, for the record: YOLO v8 trained in Google Colab on the dataset that came with the case, React with TypeScript, FastAPI, RabbitMQ, PostgreSQL and Docker. The back end and the front end worked by the end of the round.</p>
<p>What I learned applies past power lines. In any tool that hunts for faults, a confidence score on every detection and a way to add what the model missed are what let a person decide whether to trust a result. Design that screen first, and the dashboard after.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ask the database in plain language, then show your work</title>
      <link>https://miezhenski.com/writing/text-to-sql-trust</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/text-to-sql-trust</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>Basetalk turns a question in plain language into SQL and a chart. The design problem was trust: show what was understood, ask when unsure, hand over to a person when it should.</description>
      <content:encoded><![CDATA[<p>In a company, most questions about metrics go through a few analysts. It takes too long to get from a question to an insight, experts burn out on small requests, knowledge stays in silos, and pasting company data into a third-party AI risks a leak. Basetalk lets a manager ask about company data in plain language and get a chart or a table back, without waiting for an analyst. Our team, Tsentrifuga, built it at the final of a Russian national hackathon in April 2026, on a case from Drivee, and took second place overall among more than 300 finalists. After the hackathon it was adapted and now runs at Zunami, a large regional IT company that works with insurers, on local models, so the data stays in-house.</p>
<h2>The design problem was trust</h2>
<p>A chat makes an answer easy to ask for. It still has to help a person decide whether the answer is right. A manager who gets a wrong number with a confident sentence around it is worse off than one who waited for the analyst. There was little time for research, so I looked at how OpenAI, Grok and Gemini design their assistants and borrowed their patterns where they fit.</p>
<h2>What the screens do</h2>
<p>A manager writes a question the way they would ask a colleague, for example “Show revenue by cohort for January”. The start screen offers topics to begin with and a picker for the data source. The assistant turns the question into SQL, runs it against the database and returns a chart or a table.</p>
<figure><img src="https://miezhenski.com/media/work/basetalk-screen-02-chart-answer.webp" alt="An answer: a short summary of cancellations by city and a chart of completed trips" width="2488" height="1769" loading="lazy" /><figcaption>An answer: a short summary and a chart. The numbers are demo data.</figcaption></figure>
<p>When a request is ambiguous, the assistant asks first (“Do you mean the report on product teams?”). While it works, it spells out what it understood: the metric, the filters, the grouping and the sort order. The answer comes with a short explanation, a chart card and a button to turn it into a report. A person can see the interpretation and catch a wrong one before trusting the number.</p>
<figure><img src="https://miezhenski.com/media/work/basetalk-screen-03-clarify-answer.webp" alt="A clarifying question, then the metric, filters, grouping and sort the assistant used, and the answer as a gauge chart" width="2488" height="1769" loading="lazy" /><figcaption>A clarifying question, then the metric, filters, grouping and sort the assistant used.</figcaption></figure>
<p>A clear answer is not the same as a justified one.</p>
<p>I also designed a Tasks screen for questions a team asks on a schedule. A person saves the request once and picks how often it runs, along with the database and the time. Each run keeps its answer and chart, and a task can be run on demand.</p>
<h2>Under the hood, and the open question</h2>
<p>Basetalk connects to the company’s databases (SQL, Postgres, ClickHouse and others), Git, Jira and Confluence, and answers from them in one conversation. The model was Gemma, running locally, with retrieval over the database schema and safeguards against destructive queries. All of this worked in the prototype; the numbers on the screens are demo data.</p>
<p>The open design question was where the assistant should stop. When it is not sure, the question should go to a human analyst instead of a confident guess. Handing a question to a person deserves as much design as delivering a good answer, and that hand-over is what I would build next.</p>
<p>My part: product and interface design, brand, pitch deck, handoff to developers, and a promo video in After Effects. The prize was about $1,240, converted from roubles at the Central Bank of Russia rate on 28 October 2026.</p>]]></content:encoded>
    </item>
    <item>
      <title>How I design and build with AI coding agents</title>
      <link>https://miezhenski.com/writing/designing-with-ai-coding-agents</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/designing-with-ai-coding-agents</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>AI coding agents write most of my code: a nutrition funnel, a self-hosted chat app, a Figma plugin. What I decide, what I check by hand, and why the scarce skill is now stopping.</description>
      <content:encoded><![CDATA[<p>I take a business process or a product idea and turn it into a working prototype that users can test; one core flow takes about two weeks. AI coding agents write most of the code. I make the product decisions and check every screen by hand. This note is what that means in practice, across the products on this site.</p>
<h2>What the agents built</h2>
<p>The nutritionist’s site: React, Vite and Tailwind CSS on the front end, Node.js with Fastify and SQLite on the back end, PostHog for analytics. Atrium: FastAPI, Socket.IO, SQLite and LiveKit on the server; React, HeroUI and Electron on the client, with Claude Code agents doing the building. Sequence: React, TypeScript and Framer Motion in the plugin; Node.js, Fastify, canvas and ffmpeg on the render server. In each, the code is mostly the agents’ and the decisions are mine.</p>
<h2>What I decide</h2>
<p>On Atrium, the agents built a messenger with glass panels on 15 October and Discord’s layout by 18 October, both in hours. The difference between the two versions is design decisions: what to keep from Discord, what to drop, what to add. The friends wanted chats where chats usually are, and the only original idea that survived was the circles that show who is in which room.</p>
<figure><img src="https://miezhenski.com/media/work/gomex-01-voice-room.webp" alt="A voice room in Atrium, with circles showing who is in which room" width="1920" height="1520" loading="lazy" /><figcaption>Atrium’s voice room: the one original idea that survived.</figcaption></figure>
<p>On the nutrition site, the decision was the order: result first, phone number second, and a single path from the problem to a free call. On Sequence, it was which level of the Figma layer tree to animate. None of those came from the agent. An agent will produce whichever version you ask for.</p>
<p>Agents will happily produce another month of features; the scarce skill is deciding, on data, that they shouldn’t.</p>
<h2>What I check by hand</h2>
<p>Every screen, on a phone and on a desktop. Every event in the analytics: on the nutrition site PostHog records section views, the quiz start and every answer, the result, the contact screen, the messenger choice and whether the form went through, and I read all of them. That is how I found six people pressing Send 21 times with nothing arriving, a bug no screenshot would have shown. Health data gets its own checks: consent before the form sends anything, analytics off until cookies are accepted, encryption in the database, a one-time code on the admin panel.</p>
<h2>What cheap building changes</h2>
<p>When building gets cheap, stopping gets expensive. Atrium cost a week to build and thirteen interviews, two days, to close. The interviews belonged before the week, not after. Sequence worked end to end, and I closed it on a headline. The nutrition site keeps going because its numbers come from real visitors and I change one thing a month.</p>
<p>So the order I work in now: analytics and interviews first, so the argument comes from users; then the one core flow, built in about two weeks and shipped in a branch your developer reviews; then a test with new users whose sessions you can watch. The agents make the middle part fast. The first and last parts are where the product is decided.</p>]]></content:encoded>
    </item>
    <item>
      <title>Seven days to build, thirteen interviews to stop</title>
      <link>https://miezhenski.com/writing/seven-days-thirteen-interviews</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/seven-days-thirteen-interviews</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>Atrium is an open-source voice and chat app with no centre, built with Claude Code agents in a week. Why the setup was the product, why Discord’s layout beat my own, and why I stopped.</description>
      <content:encoded><![CDATA[<p>Discord is blocked in Russia, and Telegram and WhatsApp calls fail there too. My friends live in Russia, China and Turkey, each behind their own blocks, and we had wandered through Jitsi, a Tencent call app and Yandex Telemost: an hour limit here, a dead battery there, the feeling that someone was listening. A small private server is hard to block, but setting one up takes an engineer. That was the problem I chose.</p>
<p>Atrium is a voice and chat app with no centre: each friend group runs its own server and owns its data. I designed it, Claude Code agents built it (FastAPI, Socket.IO, SQLite and LiveKit on the server; React, HeroUI and Electron on the client), and my friends moved onto it. First build on 15 October 2026, public on 17 October with 12 releases in two days, and on 23 October five of us played for three and a half hours on our own server without a problem.</p>
<h2>The setup was the product</h2>
<p>A central service is one thing to block and one place where everyone’s messages sit, so Atrium has none. Hosting servers myself for $5 a month was the easiest way to grow, and it would have put every group behind my machines, so I gave it up.</p>
<p>The first installer was a terminal wizard, fine for me and a wall for the friend who actually sets the server up. So the setup moved into the desktop app: address, login and password, then the app installs everything, shows each step and ends on an invite link. The password is used once and swapped for a key that can do nothing but update, back up and remove the app. A post on DTF, a large Russian gaming community, got about 4,000 views, and its first comment was about trust: never give anyone access to your server. The key shipped four days later. Trust designed, not explained.</p>
<figure><img src="https://miezhenski.com/media/work/gomex-04-installer.webp" alt="The installer in the Atrium desktop app, showing each step of the server setup" width="2080" height="1360" loading="lazy" /><figcaption>The app installs the server and shows each step.</figcaption></figure>
<h2>Familiar beat original</h2>
<p>On 15 October the app looked like a phone messenger with glass panels. By 18 October it had Discord’s layout. I spent a day on bubbles with physics and a who’s-where canvas instead of chats; the friends wanted chats where chats usually are. Only the circles that show who is in which room survived. People switch because they have to, and every unfamiliar screen is a tax.</p>
<figure><img src="https://miezhenski.com/media/work/gomex-02-chat.webp" alt="Atrium on 18 October: servers, channels and messages in Discord’s layout" width="1920" height="1520" loading="lazy" /><figcaption>Atrium on 18 October: servers, channels and messages where people expect them.</figcaption></figure>
<p>The agents built both versions in hours. The difference between them is design decisions: what to keep from Discord, what to drop, what to add.</p>
<h2>Thirteen conversations, no demand</h2>
<p>With my friends on the server, I went looking for who else needed one. Two days, thirteen people who call friends to play or talk, one question that worked: when did a call last break for you, and what did you do? Nine live in Russia. Those who wanted Discord had it working; the rest used whatever was already on their phone. One person named a problem: about once a month a friend drops out and the group moves to a free TeamSpeak server for the evening. Free backups closed every pain I heard.</p>
<p>Two segments showed up that I hadn’t built for: a tutor whose students need to join lessons without installing anything, and the host of a private gaming community in Turkey, 15 to 20 members, most of them in Russia. Both need a different product.</p>
<p>When building gets cheap, stopping gets expensive.</p>
<h2>Why I stopped</h2>
<p>The goal was ten strangers coming back to a voice room twice in a week by 25 November. After thirteen conversations the count was zero. My pain was real, and it was mine: the circle I built for had solved it for free, and the people who hadn’t were not the people I knew. Building cost a week. Another month would have cost a month and taught me the same thing. The code stays open on GitHub, and my friends keep their server.</p>
<p>Three things I’d do again, in a different order. My own pain is a hypothesis with a sample of one. Thirteen conversations cost two days, less than any feature, and they belonged before the week of building, not after. And ask about the last time something broke, not whether people like the idea. Liking is free. Switching costs an evening.</p>]]></content:encoded>
    </item>
    <item>
      <title>Onboarding an AI agent platform as a chat with its own assistant</title>
      <link>https://miezhenski.com/writing/ai-onboarding-as-a-chat</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/ai-onboarding-as-a-chat</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>Alloy’s new workspace opened on thirteen sidebar sections and no first step. I made the setup a chat with Ally that ends with a live agent. How it works, and why the restyle failed.</description>
      <content:encoded><![CDATA[<p>Alloy is a platform where a company runs AI agents next to its people, with shared knowledge, workflows and integrations, and every workspace has an assistant called Ally. I worked with Alloy as a contractor in 2026. My task was the first minutes in a new workspace.</p>
<h2>The brief</h2>
<p>A new workspace had no onboarding. A new user landed on a sidebar of thirteen sections, from Omni Hub and Staff to Variables, MCPs, Flows and Logs, and had to work out alone where an agent comes from. Alloy had no data on where people gave up, but the product has a lot of features and the interface didn’t help.</p>
<p>The CPO had a guided tour in mind: a cursor that moves and clicks on its own to show where things are, then asks the user to click. I went another way. Alloy is an AI product through and through, an operating system for AI agents, so the onboarding should be AI too: a conversation with Ally, the assistant every workspace already has.</p>
<h2>The hypothesis</h2>
<p>If Ally runs the setup as a chat, a new user gets to a first working agent sooner than through settings pages, and Ally learns about the business on the way. Before drawing anything, I signed up to Alloy and went through the onboarding of other products. Notion’s worked best: its AI offers to set up the workspace in a chat, and I took apart why that works.</p>
<h2>What the conversation asks</h2>
<p>The onboarding runs inside the normal Alloy interface, so the sidebar is there from the first minute. Ally opens with one question, what to build first, and two answers: an agent for the company’s website, or agents for internal operations.</p>
<figure><img src="https://miezhenski.com/media/work/alloy-02-chat-start.webp" alt="Ally asks what to build first, with two options" width="1920" height="1200" loading="lazy" /><figcaption>The first question, with two answers.</figcaption></figure>
<p>Two short questions follow, what the company does and the user’s role, each with ready answers as chips. Every reply from Ally carries a collapsed “Thought for 15 seconds” line, as in Alloy’s own chat. Then Ally asks about the business and says it will use the answer to train the assistant. The user can drop files, paste the website address, type a few lines, or skip with “I’ll share it later”.</p>
<p>Next Ally asks which routine the agent should take on, with three presets (lead qualification, FAQ and support, product navigation and upsell) or a task in the user’s own words, and asks for a name. The last message says the agent is live and gives a script to paste on the website, with a link to the webchat settings for colors, avatar and trigger rules.</p>
<figure><img src="https://miezhenski.com/media/work/alloy-01-agent-live.webp" alt="Ally’s last onboarding message: the webchat agent is live, with the code to paste on the website" width="1920" height="1200" loading="lazy" /><figcaption>The hand-over: the agent is live, and here is the code.</figcaption></figure>
<p>Skipping the files doesn’t block the launch. The agent still goes live, but Ally warns that its memory is empty and points to Storage, where the files can be added later. A “Complete your workspace” card in the sidebar keeps the rest of the setup in view as a short checklist with progress: create the first agent, feed the system with company data, connect an external source, invite the team.</p>
<p>The first screen asks one question and ends with a working agent.</p>
<h2>What held up, and what didn’t</h2>
<p>The CEO and the CPO liked the onboarding, and the deck went down well. The restyle of the Staff page and Ally’s panel, built on HeroUI and shadcn, got taken apart on UX. They asked why I left so much empty space, since their rule is to use every bit of the screen, and I had no argument ready. The onboarding held up because I could show how Notion does it and why it works. The restyle didn’t, because it rested on my taste.</p>
<p>Soon after, Alloy shifted its effort from improving the product to rolling it out to customers, and the work ended there. As far as I know, none of it reached the product, so there are no numbers.</p>
<p>What I took from it: don’t copy another product’s pattern without knowing why it works there. Find out who will look at the work before choosing how it looks; my first deck was red, and they said it looked as if someone had been killed, and AI companies sell transparency and trust, so it became white and blue. Stakeholders read UX and business logic before beauty. And back every decision. Now every project starts with analytics and user interviews, so the argument comes from users, not from me.</p>]]></content:encoded>
    </item>
    <item>
      <title>A quiz funnel for a nutritionist: 8 leads and 2 clients from 73 visitors</title>
      <link>https://miezhenski.com/writing/quiz-funnel-73-visitors</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/quiz-funnel-73-visitors</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>A landing page, a 10-question health quiz, a lead CRM and PostHog analytics for a nutritionist on Instagram. The first month’s funnel, step by step, and the next experiment.</description>
      <content:encoded><![CDATA[<p>Nadezhda Morozova is a nutritionist in Russia with close to 20,000 followers on Instagram. Before the site, she had no way to turn someone who liked a Reel into a booked call. In July 2026 I designed and built her a landing page, a health quiz, a lead panel and analytics, and I run one experiment on it every month. In the month after the contact form started working, 73 people came from Instagram, 8 left their contact details, and 2 of them paid, about $1,000 between them.</p>
<h2>One path</h2>
<p>The landing page has one path: the problem, the quiz, the result, a free call. Testimonials are real Telegram conversations, and visitors can open the channel and check them. Three prices lead into each other: a diagnostic session for about $50, a consultation with a plan for about $185, and three months of coaching for about $805. Most of the selling happens on the free 15-minute call, where Nadezhda looks at the situation and recommends one of them. Both first sales were decided on that call.</p>
<p>The quiz asks ten questions about how a person feels: mornings, energy through the day, coffee, digestion, cravings for sweets, sleep, the days before a period, hair and skin, weight and stress. Each answer adds weight to one or more of five areas: blood sugar and energy, sleep and recovery, digestion, hormonal balance, and deficiencies of iron, vitamin D and B12. The result names the area that scored highest in plain words, lists what to change right away, and only then asks for a phone number.</p>
<figure><img src="https://miezhenski.com/media/work/nutrition-result.webp" alt="A quiz result with three next steps" width="1220" height="1500" loading="lazy" /><figcaption>The result comes before the phone number. 82% of the people who start the quiz finish it.</figcaption></figure>
<p>Every lead arrives in a small admin panel with the quiz answers, sorted by area. Nadezhda adds notes and sets a status: new, contacted or closed. PostHog records every step: section views, the quiz start and every answer, the result, the contact screen, the messenger choice and whether the form went through.</p>
<h2>The first signal was false</h2>
<p>At launch most visitors were friends and family testing the site. They clicked around, finished the quiz, looked at the result and left without a phone number. I assumed the order was wrong and that the quiz should ask for contacts before showing the result. Splitting traffic by source changed that: 70 direct visits from people I had sent the link to produced no leads, and every lead came from Instagram.</p>
<p>Filter out your own traffic before you trust any number.</p>
<p>The second finding was worse. I had launched with a third-party form service so I wouldn’t build a back end before there was demand. In August the analytics showed people choosing a messenger, typing their number, pressing Send and getting an error. Six people tried 21 times in total, and none of the requests arrived. I built my own back end, and since 26 August every request has arrived.</p>
<p>The third came from heatmaps: visitors read the pricing section and left, most likely unsure which tier fit them. I added a line under the tiers: “Not sure which one you need? Take the quiz or message me.” One of the first two paying clients came through that button.</p>
<h2>Where people drop off now</h2>
<p>From 26 August to 25 September, 82 people visited, 22 started the quiz, 18 finished it, 14 saw the contact screen, 8 sent their contacts and 2 paid. The contact screen is the next experiment: four in ten people who reach it leave without sending. Only 14 people a month get that far, too few to call a test in one month, so I’m waiting for more traffic before changing it.</p>
<figure><img src="https://miezhenski.com/media/work/nutrition-crm-lead.webp" alt="One lead opened in the panel: the ten quiz answers, scores by area and a note" width="2488" height="1692" loading="lazy" /><figcaption>A lead in the panel: the ten answers, the scores by area and Nadezhda’s note.</figcaption></figure>
<h2>Health data</h2>
<p>The quiz asks about sleep, digestion and periods, which makes the answers health data. The form sends nothing until the person agrees to the processing of their personal data. Analytics stays off until the visitor accepts cookies. Names, phone numbers, quiz answers and notes are encrypted in the database, and the admin panel asks for a password and a one-time code. None of this is visible on the page, and all of it is part of why a practice can put its name on it.</p>
<p>PostHog counts only visitors who accepted cookies, and my own visits are filtered out, so real traffic is higher. Payments are recorded by the practice. Dollar amounts are converted from roubles at the Central Bank of Russia rate on 28 October 2026.</p>
<p>What I’d tell another practice: a cheap entry offer and a free short call sell the long programs better than the page does on its own. Build less before demand is proven, but watch closely what breaks.</p>]]></content:encoded>
    </item>
    <item>
      <title>Where new users get stuck before the aha moment</title>
      <link>https://miezhenski.com/writing/aha-moment-ai-products</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/aha-moment-ai-products</guid>
      <pubDate>Tue, 03 Nov 2026 09:00:00 GMT</pubDate>
      <description>A setup that needs an engineer, a sidebar with no first step, a form that breaks, an answer nobody can check. Where activation failed in five products, and how I find it in two weeks.</description>
      <content:encoded><![CDATA[<p>The aha moment is the first time a product does the thing someone came for. In an AI agent platform it is the first agent that answers a real message. In an analytics assistant it is the first chart that matches what the manager meant. In a nutrition practice it is a call booked with someone who will pay. Everything before that moment is a cost the new user pays on credit, and most of them stop paying somewhere along the way.</p>
<p>I have now watched that path fall apart in five products I worked on, and it fell apart in the same few places each time. Here they are, with what I did about them, and then the two weeks I spend finding the sixth.</p>
<h2>A setup that needs an engineer</h2>
<p>Atrium is a voice and chat app where each friend group runs its own server. The first installer was a terminal wizard. It was fine for me and a wall for the friend who actually sets the server up. So the setup moved into the desktop app: address, login and password, then the app installs everything, shows each step and ends on an invite link. The friends installed it without hints; their only question was which server address to type. The product did not change. The first ten minutes did.</p>
<figure><img src="https://miezhenski.com/media/work/gomex-03-own-server.webp" alt="Connecting a server in the Atrium desktop app: address, login and password, with a progress bar for the server, the account and the friends" width="2080" height="1360" loading="lazy" /><figcaption>Atrium’s setup after it moved from the terminal into the app.</figcaption></figure>
<h2>A sidebar with no first step</h2>
<p>A new Alloy workspace had no onboarding. A new user landed on a sidebar of thirteen sections, from Omni Hub and Staff to Variables, MCPs, Flows and Logs, and had to work out alone where an agent comes from. Alloy had no data on where people gave up. The product has a lot of features, and the interface didn’t say which one to touch first. I made the setup a conversation with Ally, the assistant every workspace already has: what to build first, a few questions about the business, and a last message that says the agent is live, with the code to paste on the website. The CEO and the CPO liked it. The point is not the chat. The point is that the first screen now asks one question and ends with a working agent.</p>
<h2>A form that breaks in silence</h2>
<p>On the nutritionist’s site the quiz worked, the result worked, and the contact form was losing every lead. I had launched with a third-party form service so I wouldn’t build a back end before there was demand. In August the analytics showed people choosing a messenger, typing their number, pressing Send and getting an error. Six people tried 21 times, and none of the requests arrived. Nobody complained; they just left. I built my own back end, and since 26 August every request has arrived. A broken step near the aha moment doesn’t look like a design problem on a screenshot. It only shows in the events.</p>
<p>The failing form was the clearest demand signal I got.</p>
<h2>An answer nobody can check</h2>
<p>Basetalk turns a manager’s question into SQL and returns a chart. A chat makes an answer easy to ask for; it still has to help a person decide whether the answer is right. So while it works, the assistant spells out what it understood: the metric, the filters, the grouping and the sort order, and it asks first when a request is ambiguous. LineGuard, which finds damaged parts in drone photos of power lines, shows a confidence score on every detection and lets the engineer outline what the model missed. In both, the aha moment is not the answer. It is the moment the person trusts the answer enough to act on it.</p>
<h2>A feature nobody asked for</h2>
<p>Plantify’s chatbot had scored second of twenty ideas at my desk. Eight interviews later it left the MVP: only one of eight people trusted AI advice outright, and five would trust it only on a condition they could check. AI stayed where its result can be checked, a camera that names the plant in front of you. A first task that people don’t want is not a first task.</p>
<h2>How I find it in two weeks</h2>
<p>Week one: an analytics event on every step to payment, so we see where new users drop, and 8 user interviews, which I run, so we hear why. Week two: the path to the first task, shipped in a branch of your code that your developer reviews, a keep-or-cut list for your features, and a test with 5 new users, their sessions recorded in PostHog for you to watch.</p>
<p>The goal is written down at kickoff, so we both know what counts: 5 new users reach their first task without help. If they don’t, I keep working for up to 2 more weeks for free. That is the Aha Sprint, and the cases above are why it is built the way it is.</p>]]></content:encoded>
    </item>
    <item>
      <title>One experiment a month on small traffic</title>
      <link>https://miezhenski.com/writing/one-experiment</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/one-experiment</guid>
      <pubDate>Fri, 25 Sep 2026 09:00:00 GMT</pubDate>
      <description>Most practice sites get too little traffic for a split test. How I change one thing a month, compare month to month and note what else happened, so a holiday never takes credit.</description>
      <content:encoded><![CDATA[<p>The standard way to learn what works on a page is a split test. Half the visitors see one version, half see another, and once enough people have passed through, you know which one wins. On a product with plenty of traffic, that is how I would work.</p>
<p>Many practice sites get far less traffic than a split test needs. At that volume a test can run for months before the difference means anything, and the whole time half of your visitors see the weaker version.</p>
<h2>What I do instead</h2>
<p>On small traffic I change one thing a month and compare the month before with the month after. This is weaker evidence, and I treat it as weaker evidence. A holiday or a post that did well on Instagram moves the numbers too, so I write down what else happened that month next to the result. A rise after a holiday then doesn’t get credited to a new headline.</p>
<p>One change at a time is what keeps this comparison honest.</p>
<p>If I rewrite the first screen and shorten the quiz in the same month and bookings go up, neither of us knows which change did it, and the next month starts from a guess.</p>
<h2>Where a change goes</h2>
<p>Each experiment starts from something I saw in the analytics or in session recordings: a question where people quit the quiz, or a screen where they scroll up and down without clicking. The change goes at that spot. The report names the change and the reason for it, then gives the booking numbers and anything else that happened that month.</p>
<p>Some months nothing moves. That goes in the report as it is, and the next experiment tries a different spot. Month by month you get a page where each part has been checked against real visitors, with a written record of why each part is there.</p>
<p>For a healthtech team with enough traffic, the same work runs as proper split tests in PostHog. One question per test still holds.</p>]]></content:encoded>
    </item>
    <item>
      <title>Result first, phone number second</title>
      <link>https://miezhenski.com/writing/result-first</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/result-first</guid>
      <pubDate>Fri, 25 Sep 2026 09:00:00 GMT</pubDate>
      <description>The nutrition quiz shows the result before it asks for a phone number. Why the order matters for the leads a specialist gets, what it costs, and how it keeps the analytics readable.</description>
      <content:encoded><![CDATA[<p>The quiz on the nutrition site asks ten questions about how a person feels: mornings, energy after lunch, coffee, digestion, sleep, stress and a few more. Each answer adds weight to one or more of five areas, such as sleep or digestion. At the end the visitor sees the area that scored highest, explained in plain words, with three things to change. Only then does the quiz ask for a phone number.</p>
<h2>Why this order</h2>
<p>I ordered it this way on purpose. Someone who has just answered ten personal questions has already given a lot. If the next screen asks for a phone number before showing anything, the quiz starts to feel like a trap. Some people close the tab. Others type a fake number to get past the form, and the specialist gets a lead she can’t call.</p>
<p>With the result first, the visitor leaves with something useful whether they write or not.</p>
<p>The people who do leave a number have just read a description of their problem, and they want to talk about it. Their answers and the result arrive with the contact, so the specialist knows what they said before her first message.</p>
<p>Two smaller details follow the same idea. The quiz asks for a name only to use it on the result screen, and the visitor can skip that step. The contact form lets them pick the messenger they already use, so the reply arrives where they will see it.</p>
<h2>What it costs</h2>
<p>Some visitors read the result and leave, and a gated quiz would have caught their numbers. For a practice where every call takes time out of the specialist’s day, I think that is the right trade.</p>
<p>The order also makes the analytics easier to read. The result screen and the contact screen are separate steps, so I can see how many people reached a result and how many of them chose to leave a contact. If that share falls after a change, the cause is on one of two screens, and I know where to look.</p>
<p>For a healthtech product the same order works with a different reward. Show the recommendation or the plan first, then ask for the email.</p>]]></content:encoded>
    </item>
    <item>
      <title>The top line is booked consultations</title>
      <link>https://miezhenski.com/writing/booked-consultations</link>
      <guid isPermaLink="true">https://miezhenski.com/writing/booked-consultations</guid>
      <pubDate>Fri, 25 Sep 2026 09:00:00 GMT</pubDate>
      <description>Step numbers in a quiz are easy to push up. Why a practice’s monthly report starts with booked consultations, and how every change is judged against them.</description>
      <content:encoded><![CDATA[<p>A quiz gives you plenty of numbers. How many people opened it, how many answered each question, how many reached the result and how many left a phone number. On the nutrition site I built, each of those steps sends an event to PostHog, and I read all of them. In a report they sit below the top line.</p>
<p>The top line is booked consultations. A practice earns money when someone who fits books a call and then pays for the program. The step numbers are there to explain why bookings moved, or why they stayed put.</p>
<p>Step numbers are easy to push up.</p>
<p>Cut the quiz in half and more people finish it. Ask for the phone number before showing the result and you collect more numbers. Both changes look good on a chart. The specialist then spends her week on calls with people who were never going to buy.</p>
<h2>How a change is judged</h2>
<p>Every experiment starts from a guess about bookings. Say visitors stop at the phone step because they don’t know what happens after they leave a number. The change is one sentence under the form that says who will write back and in which messenger. The step numbers show whether more people got through the form. Bookings show whether it mattered.</p>
<p>For a small practice, bookings are a small number, and they move slowly. The report says so plainly. A good month is a reason to keep watching, and I call it a result only after it holds for another month.</p>
<h2>What counts as a booking</h2>
<p>For a healthtech team the rule is the same with a different name. The top line is qualified leads: people who match the product and leave a way to reach them. Sign-ups from outside your market are cheap to get, and each one costs someone on the team time.</p>
<p>Before any design work, we agree on what counts as a booking or a qualified lead in your business. That definition goes into the analytics first, and every report is measured against it.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
