<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: fikuri</title>
    <description>The latest articles on DEV Community by fikuri (@fikuri).</description>
    <link>https://dev.to/fikuri</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F342077%2F740d0344-91b4-4024-b956-50a831fcabd7.jpg</url>
      <title>DEV Community: fikuri</title>
      <link>https://dev.to/fikuri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fikuri"/>
    <language>en</language>
    <item>
      <title>Building Shoots: a hybrid event-driven agent system for photography</title>
      <dc:creator>fikuri</dc:creator>
      <pubDate>Mon, 31 Aug 2026 09:23:06 +0000</pubDate>
      <link>https://dev.to/fikuri/building-shoots-a-hybrid-event-driven-agent-system-for-photography-3a58</link>
      <guid>https://dev.to/fikuri/building-shoots-a-hybrid-event-driven-agent-system-for-photography-3a58</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I created this article for the purposes of entering the All Things Agentic Hackathon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Shoots is an Android and web photography Companion. A photographer takes ordinary&lt;br&gt;
Shots. Shoots reviews them in the background, preserves the Evidence behind its&lt;br&gt;
reading, and can offer one optional Experiment when the record supports it.&lt;/p&gt;

&lt;p&gt;This is the technical version of the project. It is about how a file becomes a&lt;br&gt;
durable learning record, how the agents communicate, and where I deliberately&lt;br&gt;
refused to let a model make the decision.&lt;/p&gt;
&lt;h2&gt;
  
  
  The design in one sentence
&lt;/h2&gt;

&lt;p&gt;The model panel reads a single Shot. The system around it does the work: it&lt;br&gt;
creates a durable Run, moves tiny events through independently retryable stages,&lt;br&gt;
re-reads state at every boundary, records every outcome, and only settles a Shoot&lt;br&gt;
after every member Run is accounted for.&lt;/p&gt;

&lt;p&gt;That distinction matters. I did not want a chain of agents passing prose to one&lt;br&gt;
another until it sounded convincing. I wanted constrained model calls inside a&lt;br&gt;
workflow whose state, retries, and outputs could be inspected later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Repository structure
&lt;/h2&gt;

&lt;p&gt;The codebase is deliberately split by responsibility rather than by screen or&lt;br&gt;
agent name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android/
  phone/         # approved Camera media
  work/          # background upload and retry
  data/          # cache, API, identity
  ui/            # Android screens

backend/app/
  api/           # FastAPI ingress and push endpoints
  domain/        # pure rules and state transitions
  imaging/       # EXIF, pixels, visual artifacts
  agents/        # ADK agents and prompts
  services/      # workflow orchestration
  infra/         # storage, Pub/Sub, Drive, secrets

frontend/src/
  stores/        # API and SSE state
  pages/         # web audit desk
  components/    # receipts and visual Evidence

infra/           # Google Cloud deployment and Scheduler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important boundary is &lt;code&gt;domain/&lt;/code&gt;. It has no I/O. It owns the rules that must be&lt;br&gt;
reproducible: grid-cell conversion, taxonomy validation, panel consensus, Criteria&lt;br&gt;
checks, Technique Map projections, and Run state transitions. &lt;code&gt;services/&lt;/code&gt; can call&lt;br&gt;
models and storage. &lt;code&gt;domain/&lt;/code&gt; cannot.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two kinds of orchestration
&lt;/h2&gt;

&lt;p&gt;Shoots has two coordination layers, because model orchestration and background&lt;br&gt;
work have different failure modes.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. An in-process ADK panel reads one Shot
&lt;/h3&gt;

&lt;p&gt;The Analyst is an ADK &lt;code&gt;SequentialAgent&lt;/code&gt;. Its first step is a &lt;code&gt;ParallelAgent&lt;/code&gt; with&lt;br&gt;
three readers. Its second step is a Synthesizer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gridded Shot + camera facts ──&amp;gt; Technician
gridded Shot                ──&amp;gt; Composer
clean Shot                  ──&amp;gt; Storyteller
                                  │
                                  ▼
                    structured readings + measured facts
                                  │
                                  ▼
                   Synthesizer, with no image input
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The readers do not all see the same prompt and image. The Technician gets EXIF and&lt;br&gt;
the gridded Shot. The Composer gets the gridded Shot for composition and light. The&lt;br&gt;
Storyteller gets the clean Shot. The Synthesizer gets their structured readings and&lt;br&gt;
the measurements, but no image.&lt;/p&gt;

&lt;p&gt;Each reader returns a Pydantic schema, not an unbounded paragraph. Before a model&lt;br&gt;
claim reaches storage, code drops unknown Technique IDs, invalid cell references,&lt;br&gt;
and unsupported geometry. &lt;code&gt;domain/panel.py&lt;/code&gt; then requires agreement between&lt;br&gt;
readers, or a higher-confidence read from the Technique's accountable reader.&lt;br&gt;
Measured facts can veto a conflicting visual claim.&lt;/p&gt;

&lt;p&gt;For example, a model can say where it sees a motion technique, but phase-correlation&lt;br&gt;
code can rule out a locked-off camera. A model can locate a region with grid cells,&lt;br&gt;
but it never emits pixels or a hand-drawn overlay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjp38xztb8e3l0ymx8zy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjp38xztb8e3l0ymx8zy9.png" alt="The hybrid event-driven Shoots workflow on Google Cloud" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ADK coordinates the small panel inside the Analyst. Pub/Sub coordinates the durable work outside it.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Pub/Sub coordinates independently retryable stages
&lt;/h3&gt;

&lt;p&gt;Agent stages do not call the next remote stage directly. They publish a small,&lt;br&gt;
ID-only message, then the next handler re-reads the Shot and its current state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source accepted
  -&amp;gt; create Shot + durable Run
  -&amp;gt; media.new
     -&amp;gt; Ingest
  -&amp;gt; media.ingested
     -&amp;gt; Analyst
  -&amp;gt; media.analyzed
     -&amp;gt; Cartographer
     -&amp;gt; Judge
  -&amp;gt; media.judged
     -&amp;gt; Scribe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual message is intentionally boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOPICS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;media.analyzed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shot_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;shot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one choice avoids a lot of accidental complexity. Pub/Sub never carries a&lt;br&gt;
stale Analysis object or an agent's prose. A handler loads the authoritative&lt;br&gt;
records it needs, writes one idempotent outcome, and can safely see the same event&lt;br&gt;
again.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;media.analyzed&lt;/code&gt; fans out to Cartographer and Judge. They get separate push&lt;br&gt;
subscriptions, retry policies, and dead-letter paths even though they start from&lt;br&gt;
the same event. Judge always emits &lt;code&gt;media.judged&lt;/code&gt;, including when there is no&lt;br&gt;
Experiment Verdict, so Scribe can still write the reviewed output.&lt;/p&gt;

&lt;p&gt;Local development uses an &lt;code&gt;InProcessBus&lt;/code&gt;. Production uses Pub/Sub push requests to&lt;br&gt;
&lt;code&gt;/pubsub/&amp;lt;stage&amp;gt;&lt;/code&gt; on Cloud Run. The handlers are registered the same way in both&lt;br&gt;
modes. Transport changes, but the stage code does not.&lt;/p&gt;
&lt;h2&gt;
  
  
  The state machine is more important than event order
&lt;/h2&gt;

&lt;p&gt;Every accepted Shot gets a durable &lt;code&gt;Run&lt;/code&gt; before the first event is published. A Run&lt;br&gt;
has a separate outcome for Ingest, Analyst, Cartographer, Judge, Scout, and Scribe.&lt;br&gt;
The outcomes can be complete, skipped, retrying, or terminal.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ActivityEvent&lt;/code&gt; records explain what happened. &lt;code&gt;Run&lt;/code&gt; state decides whether the&lt;br&gt;
work is finished. This prevents a misleading result such as "review complete"&lt;br&gt;
because Scribe happened to finish while Cartographer was still retrying.&lt;/p&gt;

&lt;p&gt;Once every member Run of a natural camera period has settled, Shoots creates a&lt;br&gt;
Shoot Record. Only then does the Shoot-level Scout choose a typed route: explain&lt;br&gt;
supported work, ask one consequential question, offer an evidence-backed&lt;br&gt;
Experiment, or stay silent. The model writes within a route that code already&lt;br&gt;
selected. It does not get to invent a new task for the photographer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;many Shot Runs settle
        │
        ▼
Shoot barrier
        │
        ▼
Shoot synthesis -&amp;gt; typed Scout decision -&amp;gt; Shoot Record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is also why a Shoot is not just a time window. It is a revisioned record with&lt;br&gt;
exact member Shots. A later Camera Shot can create a newer revision without&lt;br&gt;
rewriting the earlier record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making retries safe, including model cost
&lt;/h2&gt;

&lt;p&gt;At-least-once delivery is normal with Pub/Sub. I treated it as a design condition,&lt;br&gt;
not an error case.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A stable source reference makes a redelivered import a no-op.&lt;/li&gt;
&lt;li&gt;Ingest and Analyst claim the Shot before doing expensive work. The Analyst uses a
timed &lt;code&gt;ANALYSING&lt;/code&gt; lease, so a duplicate delivery does not buy another panel run.
A genuinely abandoned lease can later be reclaimed.&lt;/li&gt;
&lt;li&gt;The process-local &lt;code&gt;StageGate&lt;/code&gt; limits expensive Analyst panels on one Cloud Run
instance. Pub/Sub owns the durable backlog, so the gate is not a fake global queue.&lt;/li&gt;
&lt;li&gt;Failed deliveries go to a dead-letter path, but that is not considered finished.
Cloud Scheduler scans durable retrying Runs and republishes the original stage
event. It does not mutate the Run to "complete" behind the normal handler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a repair path I can audit. A replay records which stage was retried&lt;br&gt;
and when. It does not pretend the failure never happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where model authority ends
&lt;/h2&gt;

&lt;p&gt;I use Gemini 3.7 Flash for bounded visual interpretation and writing. Deterministic&lt;br&gt;
code owns evidence rules, state changes, and anything that sounds like a fact.&lt;/p&gt;

&lt;p&gt;The boundary is easiest to see in three places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Panel consensus.&lt;/strong&gt; Gemini can propose Technique Evidence, but code validates
IDs and grid cells, applies quorum rules, and lets hard evidence veto a claim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Evidence.&lt;/strong&gt; A model can bound a possible area using grid cells. OpenCV
and NumPy then render a measurable artifact inside that boundary. For edge
evidence, the renderer uses Canny edges. For detail, it uses a Laplacian map.
If the renderer cannot support the location, the interface shows no persuasive
overlay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crops.&lt;/strong&gt; The Composer may propose a crop. Pillow renders it, then a separate
Gemini rater compares the original and crop for at most two rounds. Shoots only
keeps the crop when that comparison explicitly improves. It remains a tested
suggestion, not an objective quality score.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1aj820t2ccvalpfxvxes.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1aj820t2ccvalpfxvxes.jpg" alt="A rice-field Shot with measured contrast edges in the named pattern area" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The cyan marks are measured contrast edges in the model-located area. They support a narrow claim about visible edge structure, not a verdict on the composition.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is why Shoots does not store an overall aesthetic score. It stores Evidence,&lt;br&gt;
Findings, a labelled visual reading, and the exact model and prompt version that&lt;br&gt;
produced that reading. A Reproduce Verdict is reserved for Criteria that were&lt;br&gt;
declared before the photographer tried again. Explore and Compare do not get a&lt;br&gt;
pass/fail label.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable artifacts, not a chat history
&lt;/h2&gt;

&lt;p&gt;Firestore holds the Photographer record, Shots, Analyses, Runs, ActivityEvents,&lt;br&gt;
Technique Map projections, Experiments, and Shoot Records. Cloud Storage holds&lt;br&gt;
original files and display assets. Google Drive is an optional import and reviewed&lt;br&gt;
output adapter.&lt;/p&gt;

&lt;p&gt;Scribe can prepare a Deconstruction draft from stored Evidence. It cannot treat the&lt;br&gt;
current image as permission to invent a new claim. The writer gets supported&lt;br&gt;
Evidence IDs; domain code validates those references and the photographer reviews&lt;br&gt;
the result before sharing or downloading it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjzq4doutfrdu77e5u47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjzq4doutfrdu77e5u47.png" alt="A visual story generated from a selected Shot and its stored Evidence" width="799" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Deconstruction is a draft built from already-stored Evidence. It never posts itself.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I measured
&lt;/h2&gt;

&lt;p&gt;I ran a recorded production Drive-import workflow with 75 test files in three&lt;br&gt;
batches. All 75 completed. Shoots wrote 75 reviewed copies to Google Drive and&lt;br&gt;
produced three settled Shoot Records. Five failed Shots recovered through six&lt;br&gt;
automatic repair replays.&lt;/p&gt;

&lt;p&gt;The median backend Run took 48.72 seconds. The complete session took 40 minutes and&lt;br&gt;
7 seconds from the first import request to the final Shoot Record. Because the&lt;br&gt;
batches overlapped, multiplying the median by 75 would be misleading.&lt;/p&gt;

&lt;p&gt;I also ran a separate five-Shot metered sample with real Gemini calls. The model-only&lt;br&gt;
estimate was about $0.039 per Shot, or $2.95 projected to 75. That is not the&lt;br&gt;
historical bill. It excludes cloud infrastructure, Drive transfer, discounts,&lt;br&gt;
credits, optional Experiments, and visual-story generation.&lt;/p&gt;

&lt;p&gt;The 75 files included repeats and deterministic variations of real hobbyist Shots.&lt;br&gt;
That proves the workflow, repair path, and delivery. It does not prove that Shoots&lt;br&gt;
makes someone a better photographer. That needs people using it over time and&lt;br&gt;
telling me whether the Experiment was useful.&lt;/p&gt;

&lt;p&gt;The source is open at &lt;a href="https://github.com/fikri2992/shoots" rel="noopener noreferrer"&gt;github.com/fikri2992/shoots&lt;/a&gt;. The project entry is &lt;a href="https://devpost.com/software/shoots" rel="noopener noreferrer"&gt;Shoots on Devpost&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>android</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I make an app to help you make money while traveling</title>
      <dc:creator>fikuri</dc:creator>
      <pubDate>Sun, 17 May 2026 18:07:57 +0000</pubDate>
      <link>https://dev.to/fikuri/i-make-an-app-to-help-you-make-money-while-traveling-293d</link>
      <guid>https://dev.to/fikuri/i-make-an-app-to-help-you-make-money-while-traveling-293d</guid>
      <description>&lt;p&gt;This is a series of content I created for the Build with MeDo Hackathon at &lt;a href="https://medo.devpost.com" rel="noopener noreferrer"&gt;MeDo&lt;/a&gt;.&lt;br&gt;
Read my first article about medo here &lt;a href="https://dev.to/fikuri/medodev-the-good-bad-and-ugly-from-my-personal-experience-1mc2"&gt;full review about medo.dev&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In Indonesia, Jastip (concierge service) is very common. China has a similar culture called Daigou (buying on behalf). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The key similarity between Daigou and Jastip is one simple thing: "Access". &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How Jastip works is basically someone from a different location with "access" to certain products offers them to others on social media. If people want to buy, the seller does not need to own the inventory or stock. They just need to be there at the store and ready to purchase. This Jastip service includes a service fee and sometimes delivery service. There are many kinds of products being sold, from snacks to luxury goods you cannot easily find in Indonesia. &lt;/p&gt;

&lt;p&gt;People in Indonesia take this to another level by making it a full side quest while travelling. They plan a trip for fun, and to help finance the travelling, they do a Jastip side quest with many products, often from cross-country travel. &lt;/p&gt;

&lt;p&gt;Then I found that China already has a similar culture with Daigou, but it is more focused on luxury items that are often hard to find in China or have some kind of rarity or reputation from the origin country (or so from what I read on the internet). &lt;/p&gt;

&lt;p&gt;The interesting thing about China and Indonesia's Jastip/Daigou culture is how they operate. In China, Daigou mostly operates on WeChat livestreaming, and the storefront is built inside WeChat using mini programs.&lt;br&gt;
On the other hand, in Indonesia, interaction and transaction usually happen on either WhatsApp groups or Instagram chat. It is very fragmented and causes multiple issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktkl6paklix6ng9e2i1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktkl6paklix6ng9e2i1r.png" alt="Jastip and Daigou flow diagram showing buyer, traveler, product access, payment, and delivery" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So to help my fellow Indonesians make money while travelling, I made an app to manage this kind of thing using medo.dev.&lt;/p&gt;


&lt;h2&gt;
  
  
  Show me the money
&lt;/h2&gt;

&lt;p&gt;To motivate you to read further, let me put a motivational image for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c32pvuw3ajpp98ef144.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c32pvuw3ajpp98ef144.png" alt="Money motivation image for the Jastip side income idea" width="377" height="815"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, the money. With this app, you can not only plan for travel, but also make some money with Jastip.&lt;/p&gt;

&lt;p&gt;How, you may ask?&lt;/p&gt;
&lt;h3&gt;
  
  
  1. You can create a campaign
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9erldxzg7l883rec9gyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9erldxzg7l883rec9gyh.png" width="377" alt="Create a jastip campaign" height="812"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;When creating a campaign, you set the starting date and end date of your Jastip. &lt;br&gt;
But Jastip across countries is hard. You need to calculate currency, and I am also afraid of people doing hit and run. &lt;/p&gt;

&lt;p&gt;Don't worry, this app handles the currency exchange automatically for you, and there is deposit payment for your buyer. They can use that deposit to buy from you later, but if they do not buy, you can redeem the deposit. &lt;/p&gt;

&lt;p&gt;What's next after creating a campaign, you may ask?&lt;/p&gt;
&lt;h3&gt;
  
  
  2. You can open the campaign and check
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rq0wdienacb0806gzj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rq0wdienacb0806gzj0.png" width="375" alt="Open campaign dashboard" height="814"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Talk with the AI assistant so you are better informed about weather, currency, pricing strategy, adding products if you already have something in mind, or just reading the news in case something happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Talk with our smart AI agent
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forkqmtki2w47m82egvea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forkqmtki2w47m82egvea.png" width="375" alt="Campaign AI assistant" height="817"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Our AI is not like ChatGPT or Gemini, where you need to give information about what you are doing, where, or when. It understands your Jastip context, and it is integrated deeply with MeDo's large language model.&lt;br&gt;
You can also take notes for important information from the AI and check them from the notes tab.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m15a9zstvuhix1p8i3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m15a9zstvuhix1p8i3j.png" width="375" alt="AI notes tab" height="817"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Check who is already interested
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr5y2fii67iiqoyiemcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr5y2fii67iiqoyiemcs.png" width="375" alt="Campaign member deposits" height="814"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Check your member tab to see who is already interested and has put down deposit money.&lt;br&gt;
They actually pay with their debit/credit card (using MeDo Stripe skills). It will be yours to claim later.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Talk with your buyer directly
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y994o308lvodalifg8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y994o308lvodalifg8l.png" width="378" alt="Buyer seller chat" height="811"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Instead of information scattered in WhatsApp and Instagram, you can interact directly here in the app. You can also send images if you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Lastly, download the invoice or just export everything into Excel for later.
&lt;/h3&gt;

&lt;p&gt;You can enjoy your travel and manage the Jastip using our platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. and heres from buyer side of the app
&lt;/h3&gt;

&lt;p&gt;From the buyer side, the flow is browse campaign, join with deposit, send request, chat, and track the transaction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzlqcelnqie7n6o58daz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzlqcelnqie7n6o58daz.png" alt="Buyer-side app flow showing campaign browsing, product request, confirmation, transactions, and messages" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Next is how did I make this app?
&lt;/h2&gt;

&lt;p&gt;nd how did it only take me a week to do so...&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Register to &lt;a href="https://medo.dev" rel="noopener noreferrer"&gt;Medo.dev&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Ok, MeDo is a full-stack AI coding platform. It sounds very much like a buzzword, but trust me, it is real. You may already have heard about v0, Lovable, Bolt, or Replit, but there is nothing like it. MeDo is more complete, and you only need MeDo (and Stripe apparently for payment).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create new project
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjb2g20hmwxtosul0em4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjb2g20hmwxtosul0em4.png" width="800" alt="Create new MeDo project" height="282"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Next, you just wait until your idea is built
&lt;/h3&gt;

&lt;p&gt;Here's the fun part. Medo.dev is actually not frontend first. It is product first. It will create the full product spec and requirements before it even starts coding. Everything is included, from what should be built, how the folders and system are structured, and what is out of scope, which is very important to make your product align with your vision.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1gf58ryhoo6cgumbdfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1gf58ryhoo6cgumbdfa.png" width="703" alt="MeDo product spec before build" height="828"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;You can edit it or not, it is up to you. Next, click generate the app and then wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. PLUGINSSS (apparently now they call it skills)
&lt;/h3&gt;

&lt;p&gt;The skill integrations in medo.dev blew my mind. In v0, Lovable, and Bolt, you are kind of forced to register for an outside backend service like Supabase. But medo.dev does this automagically, so you do not have to have a Supabase account and click connect or something like that. It just &lt;strong&gt;WORKS&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;login just works&lt;/li&gt;
&lt;li&gt;crud just works&lt;/li&gt;
&lt;li&gt;upload image just works&lt;/li&gt;
&lt;li&gt;realtime chat app just works&lt;/li&gt;
&lt;li&gt;even payment using stripe is just &lt;strong&gt;WORKS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it is not only the backend. Even LLM, image generation, video generation, text-to-speech, and speech-to-text are included. No need to juggle multiple providers, grab API keys, store them, then integrate them. IT JUST WORKS.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F415myt0hzlljqr7pdfvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F415myt0hzlljqr7pdfvc.png" width="800" alt="MeDo skills and integrations" height="510"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;You can just pay using a single credit system for all of the services. No need to set up multiple payments or subscribe to multiple websites to get API keys anymore.&lt;/p&gt;

&lt;p&gt;I was really blown away by the depth of the integration, so I started to dig into the code. &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylnfwso3j2wvwq4hpx88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fylnfwso3j2wvwq4hpx88.png" width="800" alt="Digging into generated code" height="497"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The LLM skills
&lt;/h3&gt;

&lt;p&gt;So in my experience using the medo.dev LLM skills, the default is not really great, but you can just prompt it. Make sure to always prompt it to make the output token to the max. &lt;/p&gt;

&lt;p&gt;You can also ask it to call tools, using other skills as tool calls that the LLM can invoke. My biggest problem with the LLM skills is that it seems to be hardcoded to Gemini 2.5 Flash, while there are already newer models like 3 Flash or later.&lt;/p&gt;

&lt;p&gt;You can actually make an agent in the LLM skills, not just a placeholder. For example, I built this AI assistant to be able to talk to its own CRUD API, so it can change the title at the top on the fly in realtime by calling directly to the internal API. Mind = blown.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm88mpzgtdvtuvvhc79ub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm88mpzgtdvtuvvhc79ub.png" width="374" alt="MeDo LLM skill setup" height="810"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Some tips and tricks using MeDo
&lt;/h2&gt;

&lt;p&gt;Based on my few weeks using medo.dev, here are some tips and tricks that helped me boost productivity and save credits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basics
&lt;/h3&gt;

&lt;p&gt;MeDo gives you an integrated backend and frontend workspace. You can look at the code, but you can also access files, logs, and infrastructure directly inside the app.&lt;/p&gt;

&lt;p&gt;A single Fast Build prompt costs about &lt;strong&gt;15 credits&lt;/strong&gt;, while Deep Build costs &lt;strong&gt;30 credits&lt;/strong&gt;. As of writing this, new accounts usually get 300 credits on registration and 100 credits from daily login. That is around 10 Deep Build prompts or 20 Fast Build prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip 1: Put related tasks in one prompt
&lt;/h3&gt;

&lt;p&gt;From my experience, credits are counted per message, not by how hard the problem is or how many tool calls it uses.&lt;/p&gt;

&lt;p&gt;There are limits if you ask for too many things at once, but if the tasks are related, it is usually better to put them in one prompt. This helps you get more value from each credit spend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip 2: When debugging, ask for logs and checks
&lt;/h3&gt;

&lt;p&gt;When something breaks, do not only ask MeDo to fix it. Ask it to add logs and checks first so it can understand the real problem.&lt;/p&gt;

&lt;p&gt;Example prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the best approach to fix this [issue]? Please add logging and checks to help identify the issue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This helped me a lot when a problem was not fixed in one run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip 3: Ask for design suggestions before giving strict direction
&lt;/h3&gt;

&lt;p&gt;MeDo can be overly eager when you give it very strict design direction.&lt;/p&gt;

&lt;p&gt;In my case, I gave it a reference and told it exactly what I wanted, but it still tried to be "creative" and the result was frustrating.&lt;/p&gt;

&lt;p&gt;What worked better was asking for a few options first.&lt;/p&gt;

&lt;p&gt;Example prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give me 3 design variants for this particular [problem]. The goal is to [specific goal], and I prefer it to look like [your preferences].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This way, MeDo gives you a few layout and style directions first. You can then choose one, adjust it, or ask for another variant.&lt;/p&gt;

&lt;p&gt;This saved me a lot of credits because I stopped forcing one direction through many follow-up prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip 4: when stuck, try to clear the context before sending a new prompt
&lt;/h3&gt;

&lt;p&gt;Sometimes you get that little annoying bug, whether it is frontend or backend. &lt;br&gt;
In my experience, it always helps to use the clear context button before sending another prompt. Clearing context can make the agent think and do the task better and faster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foadxwtyz8mqqbysp0in8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foadxwtyz8mqqbysp0in8.png" alt="this is the button, don't mind my negative credits i overused it lol" width="560" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;this is the button, don't mind my negative credits i overused it lol&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So that's what I am building and how I am building it, with tips and tricks.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xgwvn3ke999mwrfiwzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xgwvn3ke999mwrfiwzy.png" width="800" alt="Final jastip product" height="800"&gt;&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>builtwithmedo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>medo.dev the good, bad and ugly from my personal experience</title>
      <dc:creator>fikuri</dc:creator>
      <pubDate>Sun, 17 May 2026 13:58:57 +0000</pubDate>
      <link>https://dev.to/fikuri/medodev-the-good-bad-and-ugly-from-my-personal-experience-1mc2</link>
      <guid>https://dev.to/fikuri/medodev-the-good-bad-and-ugly-from-my-personal-experience-1mc2</guid>
      <description>&lt;p&gt;So I joined the &lt;a href="https://medo.devpost.com" rel="noopener noreferrer"&gt;MeDo hackathon&lt;/a&gt; and used their platform for several days. At first, I thought it was just another v0, Lovable, or Bolt. But after building with it, I realized MeDo offers a very different way to prompt, build, and ship a product.&lt;/p&gt;

&lt;p&gt;This is my personal review after around two weeks of using it: the good, the bad, and the ugly. I was genuinely impressed by the deep integrations and some unique features that I think many people might miss. But the platform also has rough edges that are worth talking about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;In today's developer world, many programmers use tools like Claude Code and Codex. They are powerful and flexible. You can build almost anything with them, but you still need to manage everything yourself: setup, environment, dependencies, backend, database, deployment, and debugging.&lt;/p&gt;

&lt;p&gt;Of course, you can ask Claude Code or Codex to help with that. But if you do not already know what you need, things can get messy fast.&lt;/p&gt;

&lt;p&gt;For non-technical users, or developers who do not mainly build web apps, tools like v0, Lovable, and Bolt feel easier. You do not need to set up much. You prompt, and you see the output quickly.&lt;/p&gt;

&lt;p&gt;But once you want to build a complete product, you still need more than a frontend. You need backend, database, authentication, AI APIs, image generation, payments, and many other services.&lt;/p&gt;

&lt;p&gt;Yes, tools like v0, Lovable, and Bolt can connect to those things. But you still usually need to create your own Supabase account, connect it, manage API keys, register for OpenAI, Anthropic, GCP, or another provider, and wire everything together.&lt;/p&gt;

&lt;p&gt;And then there is the classic problem: API keys. The same API keys people accidentally push to GitHub and then get abused by someone else.&lt;/p&gt;

&lt;p&gt;That is where MeDo starts to feel different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Good
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. You do not need to open another service, mostly
&lt;/h3&gt;

&lt;p&gt;At first glance, MeDo looks similar to v0 or Lovable. But the difference is that many things are already built into the platform.&lt;/p&gt;

&lt;p&gt;Need a backend? It is already built in through Supabase.&lt;/p&gt;

&lt;p&gt;Want to add an LLM? Just prompt it. It is already integrated.&lt;/p&gt;

&lt;p&gt;Want image generation? It is already built in.&lt;/p&gt;

&lt;p&gt;Want text-to-speech? It is already built in.&lt;/p&gt;

&lt;p&gt;Want a weather API? It is already available.&lt;/p&gt;

&lt;p&gt;Want payment? You still need Stripe, and you still need to register your business and get the API keys. So yes, the legal/business side still exists.&lt;/p&gt;

&lt;p&gt;But overall, many services that usually require separate setup are either built in or available through plugins. I think this is MeDo's strongest USP. You do not need to manage and pay for many separate services. You mostly manage MeDo.&lt;/p&gt;

&lt;p&gt;Imagine your vibe-coded app starts getting traction. If you use v0, Lovable, or Bolt, you may need to upgrade Supabase, top up credits on GCP or another AI provider, and manage other API services separately.&lt;/p&gt;

&lt;p&gt;With MeDo, the experience feels more centralized. You pay and top up credits in one place. As a product builder, I think this is very useful, especially for non-developers who just want to build and publish a real app.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Deep backend and frontend integration
&lt;/h3&gt;

&lt;p&gt;Because the backend and frontend live inside one platform and one codebase, the AI agent can understand more of the full product.&lt;/p&gt;

&lt;p&gt;That makes building and debugging easier.&lt;/p&gt;

&lt;p&gt;For example, I had an issue where a service integration returned a 403 error. The problem was not really in the frontend code. The backend had not redeployed with the correct key. The agent checked the Supabase function logs, looked at the backend code, understood that the problem was the backend not restarting, restarted it manually, and the bug was fixed.&lt;/p&gt;

&lt;p&gt;That kind of end-to-end debugging is where MeDo feels powerful.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Plugins, plugins, plugins
&lt;/h3&gt;

&lt;p&gt;The plugin system is one of the most interesting parts of MeDo.&lt;/p&gt;

&lt;p&gt;The available plugins are diverse and keep growing. I saw plugins for exchange rates, global stock data, data analysis, Word documents, PowerPoint, and more.&lt;/p&gt;

&lt;p&gt;To be clear, these plugins are not always like traditional third-party integrations where you connect an external service yourself. Many of them feel more like skills or templates integrated into the platform and database.&lt;/p&gt;

&lt;p&gt;But because the model can use them inside the same environment, they become very useful. You do not need to manage every integration manually. MeDo handles a lot of that inside the platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Design direction and starter templates
&lt;/h3&gt;

&lt;p&gt;I still think v0 is stronger for frontend design. That is probably the thing v0 does best.&lt;/p&gt;

&lt;p&gt;MeDo is slightly below v0 in pure frontend polish, but I like that it gives starter references and does not always force the same visual style. It gives you enough structure to begin, while still leaving room to push the app in a different direction.&lt;/p&gt;

&lt;p&gt;This part still needs more testing from me, but so far the design workflow feels promising.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bad
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. It is still buggy
&lt;/h3&gt;

&lt;p&gt;The biggest downside, in my opinion, is that the platform still buggy. Maybe this is because it is new, but sometimes messages fail multiple times and you need to clear the context manually.&lt;/p&gt;

&lt;p&gt;this can be frustrating in my personal experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The platform feels slow
&lt;/h3&gt;

&lt;p&gt;The slowness is not always about the model generation itself. The platform UI can also feel slow.&lt;/p&gt;

&lt;p&gt;Opening the plugin list takes a few seconds. Some images seem unoptimized or not cached well, so they load slowly again and again.&lt;/p&gt;

&lt;p&gt;This is not a deal breaker, but it makes the product feel less smooth than it could be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ugly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Language inconsistency
&lt;/h3&gt;

&lt;p&gt;The platform still feels China-first in some places, with English as a second layer. Some parts of the UI are not translated, or the interface suddenly switches to Chinese.&lt;/p&gt;

&lt;p&gt;Sometimes the model also replies in Chinese or uses Chinese placeholder text in the generated UI.&lt;/p&gt;

&lt;p&gt;This is probably fixable on their side, but it stood out during my usage.&lt;br&gt;
for example &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0io4kkwfn6t8otyeugfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0io4kkwfn6t8otyeugfj.png" alt=" " width="546" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unclear model identity
&lt;/h3&gt;

&lt;p&gt;MeDo has "fast" and "deep build" models. I assume they use their own proprietary model, although the behavior sometimes feels close to Claude model in my opinion.&lt;/p&gt;

&lt;p&gt;The problem is that I do not know what model is actually being used. I do not know the benchmark, the strengths, the weaknesses, or how I should prompt it.&lt;/p&gt;

&lt;p&gt;Should I prompt it like Claude? Like Codex? Like another coding model?&lt;/p&gt;

&lt;p&gt;That uncertainty is annoying as a builder. I wish the platform was more transparent about what model is being used, or at least how users should think about each mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;MeDo is not just another frontend generator. for me it is feels like the true "full-stack" development platform, you only need this platform to get your app from zero to one from above and beyond&lt;/p&gt;

&lt;p&gt;It is still buggy. It can be slow. Some parts still feel rough for English-speaking users. But the core idea is strong.&lt;/p&gt;

</description>
      <category>builtwithmedo</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Kiro: the good, bad and ugly part in my personal experience</title>
      <dc:creator>fikuri</dc:creator>
      <pubDate>Sat, 13 Sep 2025 14:58:39 +0000</pubDate>
      <link>https://dev.to/fikuri/kiro-the-good-bad-and-ugly-part-in-my-personal-experience-1neh</link>
      <guid>https://dev.to/fikuri/kiro-the-good-bad-and-ugly-part-in-my-personal-experience-1neh</guid>
      <description>&lt;p&gt;As a developer who's worked with various IDEs, AI-coding tools, and agent-assisted workflows, I recently spent some time using Kiro. It bills itself as an agentic IDE that brings "Spec-driven" development into the mainstream. In this post I'll walk through what’s great, what's frustrating, and what downright exposes rough edges from my hands-on experience. &lt;/p&gt;




&lt;h2&gt;
  
  
  What is Kiro
&lt;/h2&gt;

&lt;p&gt;Before we go into the pros &amp;amp; cons, a quick overview to set the context. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kiro (by AWS) is an AI-powered IDE built on a VS Code core. &lt;/li&gt;
&lt;li&gt;Its standout idea is &lt;strong&gt;spec-driven development (SDD)&lt;/strong&gt;. Instead of just vibe coding (talk with an AI to jump in and code), you start by defining requirements, then design, then implementation tasks. &lt;/li&gt;
&lt;li&gt;Supports "steering" (steering files: product.md, tech.md, structure.md) to give context so the AI agent has real project context to work with. Kinda like rules to be honest but more transparency since Kiro shows you whats steering that loaded to context. &lt;/li&gt;
&lt;li&gt;Hooks / agent hooks: automations or triggers that run on file events etc., to enforce standards, generate docs/tests, etc. &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. Spec
&lt;/h3&gt;

&lt;p&gt;This feature basically gives you three documents &lt;code&gt;requirements.md&lt;/code&gt;, &lt;code&gt;design.md&lt;/code&gt;, and &lt;code&gt;tasks.md&lt;/code&gt; that flow naturally from one another. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;requirements.md&lt;/code&gt;&lt;/strong&gt; is a collection of user stories generated from your prompt. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;design.md&lt;/code&gt;&lt;/strong&gt; is a technical guideline created using both the requirements and your original prompt, with some extra research to make sure it uses correct technical terms, diagrams, and architectural notes. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tasks.md&lt;/code&gt;&lt;/strong&gt; pulls it all together, breaking the design down into actionable checklists with states like &lt;em&gt;in progress&lt;/em&gt;, &lt;em&gt;done&lt;/em&gt;, and &lt;em&gt;failed&lt;/em&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The Good
&lt;/h4&gt;

&lt;p&gt;In my month of working with Kiro, the Spec feature stood out as a surprisingly useful thinking partner. It's great at taking a rough prompt and slicing it into different perspectives-whether that-s from a user's point of view, from a developer’s perspective, or even through acceptance criteria. The benefit I felt from this structure was the ability to &lt;strong&gt;self-assess my own prompt&lt;/strong&gt; and refine it into manageable chunks with clear success criteria. Sometimes I'd start with a very broad, messy prompt. Running it through &lt;code&gt;requirements.md&lt;/code&gt; gave me a spread of user stories that became a kind of &lt;strong&gt;prompt inspiration engine&lt;/strong&gt; that I could select, refine, or even pivot based on what it generated. &lt;br&gt;
The &lt;code&gt;design.md&lt;/code&gt; stage was also a game changer. It translated my vague ideas into more concrete, technical language. There were times when I didn’t know the exact term or pattern I needed, but the design doc filled that gap, often pointing me toward the right flow, architecture type, or even the correct jargon. It wasn't just generating code it was helping me learn more from it. &lt;br&gt;
Finally, the &lt;code&gt;tasks.md&lt;/code&gt; output turned that high-level thinking into a neat checklist. What I loved most is how it integrated with my workflow. For example, I could tell it to create a new branch and commits from the requirement, and it would produce proper branch names and git messages without me having to overly explain. When I started the tasks, it automatically followed the flow outlined in the spec. In practice, this meant I could &lt;strong&gt;automate my git flow&lt;/strong&gt; through the spec alone, without hand-holding the AI every step of the way. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulmrg79c8omvgdrjk241.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulmrg79c8omvgdrjk241.png" alt="example of my spec with workflow" width="800" height="385"&gt;&lt;/a&gt; Another success case I had with the Spec feature was using it to create a design system, basically a UI template guideline. At first, it was just an experiment, because my app looked like every other vibe-coded project. You can’t just tell Kiro “make it pretty,” but you can be precise in the spec prompt. For example: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a spec for a design system. Scan through the #codebase and transform every component into [your style]." &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it worked like magic. In one run, I transformed a standard shadcn look and feel into a full neobrutalist UI style. All from a single Spec. That moment genuinely impressed me. It felt less like AI throwing random CSS at the wall, and more like having a design system generator built right into my workflow. The neat part? You can even use images as references, and Kiro will generate a surprisingly solid design system spec doc around them. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzf1nc255tvvodpjptn2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzf1nc255tvvodpjptn2.png" alt="here my standard looking shadcn page" width="386" height="489"&gt;&lt;/a&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9wtinvhsrnksm66y2dh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9wtinvhsrnksm66y2dh.png" alt="here after i run the spec of changing the overall design" width="395" height="537"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  The Bad
&lt;/h4&gt;

&lt;p&gt;My first frustration with the Spec feature is how rigid the flow is. It only comes in three flavors requirements, design, and tasks. You have to follow them in that order. Let's say I just want a design doc. Nope, I have to generate requirements first. Or maybe I want to jump straight to tasks from my prompt. Again, not possible. I'm forced to walk through the same steps every single time. What frustrated me even more was the pricing model. Apparently, creating a spec is charged as a "vibe" request because it's generated through the chatbox. But… why? Specs are supposed to be structured, not casual chat. This means every time I try to refine or have a conversation about a spec, I’m burning vibe credits. That felt like paying extra just to use the feature the way it’s meant to be used. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Ugly
&lt;/h4&gt;

&lt;p&gt;The very first time I ran tasks, I noticed how over-eager Kiro was about testing. Unit tests? ✅ Integration tests? ✅ E2E tests? ✅ ✅ ✅. It was like Kiro assumed I was building software for a billion users with an enterprise QA department on standby. Meanwhile, I wasn’t even sure if I had the core feature right, and my vibe credits were burning away on a mountain of tests, half of which didn’t even pass. Instead of helping me move fast, I ended up with this over-engineered jungle of tests, no working feature, and a sinking feeling that the AI was planning for “999 updates from 999 developers” when in reality it was just me, alone, trying to get one feature working. Yes, this is tweakable via &lt;strong&gt;steering&lt;/strong&gt; and that's exactly what I did. Pro tip: if you're not sure what you're building yet, strip out all the tests and optimizations from the design spec. Even if you are sure, limit them as much as possible. Otherwise, you’ll watch your vibe requests evaporate faster than you can say npm run test. &lt;/p&gt;




&lt;h3&gt;
  
  
  2. Hooks
&lt;/h3&gt;

&lt;p&gt;Hooks in Kiro are basically automations that trigger on file events. They can enforce standards, generate docs, or even keep your tests up to date. Think of them as little invisible helpers running alongside your workflow. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Good
&lt;/h4&gt;

&lt;p&gt;Hooks shine when they take care of the boring stuff. Generating API docs when I change an endpoint, scaffolding a test file when I add a new module . Those things just happen without me lifting a finger. It really does feel like having a junior dev who quietly cleans up after me, making sure nothing slips through the cracks. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Bad
&lt;/h4&gt;

&lt;p&gt;The downside is that every hook run costs a &lt;strong&gt;full vibe request&lt;/strong&gt;, no matter how small the automation. If the only available model is Claude Sonnet, I get why it’s expensive, but burning the same credit for a tiny linting fix as for a big multi-file refactor feels… off. I often catch myself hesitating to set up hooks for small, tedious tasks, because the “cost to benefit” just isn’t there. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Ugly
&lt;/h4&gt;

&lt;p&gt;Here’s where it got frustrating: hooks only trigger if you explicitly save a file or create a new one inside the editor. 🙃 So when I tried to drive automation from outside the IDE, nothing happened. I had a bunch of ideas for how hooks could turbocharge my workflow, but the "automatic" part turned out to be not so automatic. That killed a lot of the excitement for me. &lt;/p&gt;




&lt;h3&gt;
  
  
  3. Overall Agentic Experience
&lt;/h3&gt;

&lt;p&gt;Kiro calls itself an &lt;strong&gt;agentic IDE&lt;/strong&gt;, and it delivers on that promise in several ways: a chat sidebar, context management, RAG-style indexing of the codebase, terminal execution, and multi-file awareness. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Good
&lt;/h4&gt;

&lt;p&gt;The context management is excellent, especially with &lt;strong&gt;Steering&lt;/strong&gt;. I found steering a far better approach than static &lt;code&gt;rules&lt;/code&gt; or &lt;code&gt;agent.md&lt;/code&gt; files. You can create multiple steering files and decide which ones apply to which folders or files, which gives you far more control. And then there’s the main course: the &lt;strong&gt;chat sidebar&lt;/strong&gt;. This is where agentic coding really shines. Powered by Claude Sonnet 4, Kiro can handle long prompts, write huge chunks of code (I’ve seen it generate 2k+ lines in one go), and search context quickly with the &lt;code&gt;#codebase&lt;/code&gt; keyword. With a clear, well-structured prompt, it rarely fails. When it works, it feels like coding with a diligent, context-aware partner. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Bad
&lt;/h4&gt;

&lt;p&gt;But the agent isn’t perfect. Terminal execution, for example, constantly hangs unless I type commands manually. And yes, it still insists on generating tests (sometimes too many). Those are annoyances, but the real headache is &lt;strong&gt;pricing&lt;/strong&gt;. Kiro’s vibe requests sit in a strange middle ground. The free tier is generous (50 per month), but I’ve blown through all of them in a single 2-hour session. Each task the agent works on takes about 5–10 minutes, and with back-and-forth clarification, 20 messages is enough to wipe you out. The pricing feels confusing and opaque: it’s marketed like Windsurf, but tallies up like Cursor. Somehow landing in the worst of both worlds. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Ugly
&lt;/h4&gt;

&lt;p&gt;If pricing is the "bad" then the &lt;strong&gt;ugly&lt;/strong&gt; part is how vibe requests are consumed by context summarization. Asking Kiro to summarize context burns 1 vibe request. Then re-entering a refined prompt burns another. It feels like the system punishes you for trying to debug or iterate quickly. More than once, I found myself losing momentum. Not because the AI failed, but because I was too busy watching my credits drain away. It’s a real buzzkill when you’re excited to implement a feature and the meter is working against you. &lt;/p&gt;




&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;Kiro is one of the boldest takes on AI-assisted coding I’ve tried. The Spec feature is structured and surprisingly educational. Hooks are powerful when they work, though they cost too much for small tasks. And the agentic experience is genuinely impressive, but dragged down by confusing pricing and rough edges in automation.&lt;/p&gt;

&lt;p&gt;For medium-to-large projects, it feels like a promising glimpse of the future. But for fast-moving, vibe-coded sessions, Kiro’s structure, costs, and quirks can get in the way. It’s not the magic bullet for every dev, but it’s definitely one of the most ambitious steps toward making AI a true coding partner.&lt;/p&gt;

&lt;p&gt;I believe more IDEs will soon offer features like planning, documenting, diagnosing, and generating checklists. Right now, Kiro is one of the few that does spec-driven development well, but if it doesn’t refine its approach and fix some of the flaws I’ve highlighted, it risks being left behind as the space matures. The competition is moving fast, and “good at specs” won’t be enough if the overall developer experience feels costly, rigid, or frustrating.&lt;/p&gt;

</description>
      <category>kiro</category>
    </item>
  </channel>
</rss>
