<?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: Nayim Imrit</title>
    <description>The latest articles on DEV Community by Nayim Imrit (@naim_im_d327582a887633a6e).</description>
    <link>https://dev.to/naim_im_d327582a887633a6e</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%2F4047758%2F51104c1d-3fb5-4765-82b9-6fe0ba07bf0b.jpg</url>
      <title>DEV Community: Nayim Imrit</title>
      <link>https://dev.to/naim_im_d327582a887633a6e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naim_im_d327582a887633a6e"/>
    <language>en</language>
    <item>
      <title>How I Built a Full AI Content Pipeline for an iGaming Platform Using n8n, Gemini, Anthropic and Vertex AI</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Sun, 27 Sep 2026 06:58:00 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/how-i-built-a-full-ai-content-pipeline-for-an-igaming-platform-using-n8n-gemini-anthropic-and-2fl5</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/how-i-built-a-full-ai-content-pipeline-for-an-igaming-platform-using-n8n-gemini-anthropic-and-2fl5</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Running an online casino platform means keeping thousands of game listings, multilingual descriptions, structured reviews and player-facing copy fresh — work that simply doesn't scale by hand. I built the whole production line in &lt;strong&gt;n8n&lt;/strong&gt;, orchestrated across &lt;strong&gt;Google Gemini&lt;/strong&gt;, &lt;strong&gt;Anthropic Claude&lt;/strong&gt; and &lt;strong&gt;Vertex AI RAG&lt;/strong&gt;, with &lt;strong&gt;Scrapfly&lt;/strong&gt; for scraping and &lt;strong&gt;Google Cloud Storage&lt;/strong&gt; for the corpus, all landing in a &lt;strong&gt;Payload CMS&lt;/strong&gt; running on Next.js. Six of the seven workflows are the editorial operation, run by content managers who never see anything but a form; the seventh is a developer harness that exists so engineers can test layouts and the publishing API without hand-filling &lt;code&gt;lorem ipsum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The seven workflows and what they do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Casino 1 — Scrapfly scraper.&lt;/strong&gt; The data ingestion layer. It scrapes casino websites via Scrapfly, converts HTML to clean Markdown, and pushes the content into Google Cloud Storage ready for RAG indexing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Storage.&lt;/strong&gt; A reusable utility subworkflow. Called by other workflows whenever they need to fetch a stored document from GCS. Accepts &lt;code&gt;casino_domain&lt;/code&gt; and &lt;code&gt;casino_slug&lt;/code&gt; via webhook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Casino Subworkflow — Vertex RAG.&lt;/strong&gt; The RAG engine. Handles corpus lookup, filtering and semantic search against Vertex AI. Also reusable — called by the main casino pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Casino 2 — Main review pipeline.&lt;/strong&gt; The most complex workflow. Combines Cloud Storage retrieval, Vertex AI RAG, Gemini for structured outline generation, Gemini for section-by-section writing, and Anthropic Claude for multilingual translation. The full end-to-end review factory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games.&lt;/strong&gt; Manages the game catalog: reconciles the Celesta provider list against NovaSpins, deletes stale games, then enriches new ones with Gemini-written descriptions and reviews, provider/tag/bonus taxonomy mapping, and multilingual support. Publishes as Lexical JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews.&lt;/strong&gt; Form-triggered player review generator. Loops to produce multiple realistic player reviews per casino, with Google Translate plus Gemini post-editing for non-English targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publishing.&lt;/strong&gt; Not part of the editorial operation — a nine-lane developer harness, one lane per CMS content type, each following the same &lt;code&gt;Schedule Trigger → AI Agent → Lexical conversion → Publish&lt;/code&gt; shape. It exists to get real content into a real layout in seconds and to confirm the publishing API still works after a deploy.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&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%2Fmjtmj6azd1khmmqjjjid.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%2Fmjtmj6azd1khmmqjjjid.jpg" alt="System architecture, from content ingestion through to publishing" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The whole pipeline in one picture: content ingested from casino sites and source documents, processed through n8n, passed to Gemini, Claude and Vertex AI for generation, held in Cloud Storage and the Vertex RAG index, then assembled, translated, quality-checked, converted to Lexical JSON and published into the Payload CMS running on Next.js.&lt;/em&gt;&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%2Fyusk4dzo2jz088xuw3ze.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%2Fyusk4dzo2jz088xuw3ze.png" alt="The seven workflows and the calls between them" width="800" height="1223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Every workflow laid out node by node, with the cross-workflow calls drawn as dashed lines — the review pipeline calls the RAG engine and the Cloud Storage utility rather than reimplementing either, while the nine publishing lanes sit alongside the content types they write. The colour coding separates storage and fetch steps from Vertex AI RAG, Gemini, Claude, translation/QA and publish nodes.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Casino 1&lt;/strong&gt; — Scrapfly scraper&lt;/td&gt;
&lt;td&gt;Scrape casino pages and prepare raw content for RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cloud Storage&lt;/strong&gt; — fetch utility&lt;/td&gt;
&lt;td&gt;Retrieve and summarise stored documents from GCS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Casino Subworkflow&lt;/strong&gt; — Vertex RAG&lt;/td&gt;
&lt;td&gt;RAG corpus management and semantic search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Casino 2&lt;/strong&gt; — main review pipeline&lt;/td&gt;
&lt;td&gt;The end-to-end review factory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Games&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Catalog reconciliation and AI-generated game content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reviews&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Player review generation from a form submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Publishing&lt;/strong&gt; — developer harness&lt;/td&gt;
&lt;td&gt;One lane per CMS content type, for layout testing and API verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The ingestion layer
&lt;/h2&gt;

&lt;p&gt;Two workflows do the plumbing: one pulls content in, the other hands it back out on request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Casino 1 — Scrapfly scraper
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56cehjtmetn14dsxm7wb.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%2F56cehjtmetn14dsxm7wb.png" alt="The Casino 1 canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The full Casino 1 canvas: form trigger and domain validation, the Scrapfly → Markdown chain, and the Cloud Storage upload fan-out.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;data ingestion layer&lt;/strong&gt;. A trigger takes a casino domain or a list of URLs, a Code node normalises it and builds the page list, and Scrapfly then fetches each page &lt;strong&gt;rendered server-side&lt;/strong&gt; — the part that matters, because casino sites are JavaScript-heavy and a plain HTTP fetch returns an empty shell. The HTML is converted to clean Markdown, aggregated into one array, and written to Cloud Storage as a &lt;code&gt;.txt&lt;/code&gt;, ready to be vectorised and indexed in Vertex AI Search. Validation happens up front: a missing domain stops the run before anything is scraped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Storage — the fetch utility
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frmq9dbk7w4dhsyxnpa0v.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%2Frmq9dbk7w4dhsyxnpa0v.png" alt="The Cloud Storage canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The smallest canvas in the system: a webhook, three guard clauses, and a loop over the file array.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The other half of the plumbing, and deliberately minimal: a webhook accepts &lt;code&gt;casino_domain&lt;/code&gt; and &lt;code&gt;casino_slug&lt;/code&gt;, guard clauses check the parameters exist and the bucket resolves through a Google Service Account, and the stored Markdown goes back out through &lt;code&gt;Respond to Webhook&lt;/code&gt;. It has no ideas of its own, and that's the point — retrieval lives in one place instead of being duplicated across every workflow that needs a document.&lt;/p&gt;




&lt;h2&gt;
  
  
  The RAG engine
&lt;/h2&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%2Flpojp32q72nk5p2u4rtx.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%2Flpojp32q72nk5p2u4rtx.png" alt="The RAG engine canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three corpus POST/response triples across the top, the RAG query path along the bottom.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the most technically interesting piece of the system, and the point at which the pipeline stops being "an LLM writing casino copy" and starts being something you can actually trust. It handles every interaction with Vertex AI's RAG corpus — fetching, filtering, and semantic searching — and the review pipeline leans on it twice: once to ground the outline, then again for every section it writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Webhook Trigger&lt;/strong&gt; — Entry point for subworkflow calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate Parameters&lt;/strong&gt; — Checks for the required casino-specific parameters, throwing two different &lt;code&gt;Stop and Error&lt;/code&gt; nodes depending on which validation fails (general parameters versus casino-specific ones).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split Out: Extract Corpuses&lt;/strong&gt; — Splits the list of Vertex AI corpora into individual items for processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter: Corpus from Parameter&lt;/strong&gt; — Filters down to only the corpus matching the casino being processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If: Parameters Exist&lt;/strong&gt; — Final gate before querying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertex AI RAG Query&lt;/strong&gt; — Performs a semantic similarity search against the indexed casino content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract Summary&lt;/strong&gt; — Parses and returns the top relevant chunks to the parent workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Reusability is the design.&lt;/strong&gt; Any workflow needing RAG retrieval simply calls this webhook with a corpus and a query. Neither caller nor callee knows anything about the other's internals, which is what keeps the retrieval logic in one place as the corpus grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The corpus carries two kinds of truth.&lt;/strong&gt; The indexed content isn't only operator facts — bonus terms, game catalogues, payment methods, licence details. It also carries the &lt;strong&gt;per-country legal and regulatory rules&lt;/strong&gt; the copy has to comply with. That second kind is what makes the engine genuinely valuable in a regulated market: a review generated for one country can't carry claims that are unlawful in another, and retrieval enforces that without an editor looking the rules up from scratch on every draft. It is the difference between grounding that stops a model inventing bonus terms, and grounding that keeps the output legal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The review pipeline
&lt;/h2&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%2Fawjiuvvskm5smi118zn8.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%2Fawjiuvvskm5smi118zn8.png" alt="The review pipeline canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The core review pipeline: validation, Gemini/RAG generation, then aggregation and publish.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The centrepiece of the system and its most complex workflow. Everything the previous sections built — the scraped corpus, the stored documents, the RAG engine — converges here into a finished, publish-ready casino review, combining RAG retrieval, structured outline generation, section-by-section writing and multilingual translation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trigger
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;n8n Form Trigger&lt;/strong&gt; titled "Casino to Generate Overview" collects the casino domain, slug and target language from an operator. No developer involvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1 — Input validation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code: Extract Website Domain&lt;/strong&gt; — Normalises the submitted URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code: Validate URLs&lt;/strong&gt; — Custom JS validates URL format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If: Website Domain Exists&lt;/strong&gt; — Routes valid versus invalid inputs; invalid ones hit &lt;code&gt;Stop and Error: Missing Website&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 2 — Content retrieval
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Storage Subworkflow call&lt;/strong&gt; — Fetches the existing scraped Markdown content from GCS using the fetch utility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertex RAG Subworkflow call&lt;/strong&gt; — Queries the relevant Vertex AI corpus, retrieving semantically relevant content chunks for the casino being reviewed, together with the regulatory rules that apply to the target market. Both reach the model in the same retrieval step, which is what keeps a review compliant for its country without an editor looking the rules up separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 3 — Gemini outline generation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini API: Generate Outline&lt;/strong&gt; — Given the retrieved content, Gemini produces a structured outline for the casino review (sections like Welcome Bonus, Game Selection, Payments, and so on).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 4 — Section-by-section writing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini RAG Query per Section&lt;/strong&gt; — For each section in the outline, Gemini is called again with a targeted RAG query to fetch the most relevant source material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini: Write Section Content&lt;/strong&gt; — Each section is written using both the outline and the retrieved context, which is what keeps it factually grounded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 5 — Translation with Anthropic Claude
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If: Language != 'en'&lt;/strong&gt; — If the target language is not English, the content is routed to the translation branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Claude: Translate Sections&lt;/strong&gt; — Claude handles nuanced multilingual translation of each section, preserving tone and iGaming terminology.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge translated and non-translated&lt;/strong&gt; — Both branches converge before final publishing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 6 — Publishing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The final structured review is assembled and sent to the NovaSpins backend API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This workflow is the clearest example of &lt;strong&gt;multi-model AI orchestration&lt;/strong&gt; in the system: Gemini handles research and writing, Claude handles translation, and Vertex AI RAG provides the factual grounding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Games catalog
&lt;/h2&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%2Fv3ksylut7m9equim52dr.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%2Fv3ksylut7m9equim52dr.png" alt="The Games catalog canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reconciliation feeds the enrichment webhook, which fans out into Gemini search, review and description branches.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This workflow keeps the NovaSpins game library in sync with the upstream provider (Celesta) — and unlike everything else in the system, it &lt;strong&gt;deletes as well as creates&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reconciliation.&lt;/strong&gt; A scheduled run pulls the full Celesta list and the current live list, then hands both to Gemini to diff. What comes back isn't text but a decision: which games to add, which to remove. The workflow acts on the removals with a DELETE call. Treating catalog maintenance as a reconciliation problem rather than a content problem is the interesting part — the model is being used as a comparator, not a writer, and its output drives state changes on the platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enrichment.&lt;/strong&gt; Each new game fans out through Gemini for the game's details (RTP, volatility, features, provider), a full written review, and a shorter SEO description. Non-English targets go through Google Translate and then Gemini again as a post-editor. Finally the workflow resolves &lt;strong&gt;taxonomy relationships&lt;/strong&gt; — provider, tags, casinos, bonuses — fetching the existing entries and creating any that are missing, so a newly published game arrives already linked into the catalog instead of as an orphan record.&lt;/p&gt;




&lt;h2&gt;
  
  
  Player reviews
&lt;/h2&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%2Fauny94mynkjflu103pt7.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%2Fauny94mynkjflu103pt7.png" alt="The player reviews canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The review pipeline's validation front-end, with a multi-result player-review loop in place of the review stages.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A form-triggered generator for &lt;strong&gt;player-perspective&lt;/strong&gt; reviews — the first-person kind you'd see on a comparison site. It validates the domain, then loops a Gemini call to produce several reviews per casino rather than one, and for non-English targets passes each through Google Translate with Gemini post-editing. The reviews are aggregated into a single payload and emitted as JSON, ready to publish.&lt;/p&gt;




&lt;h2&gt;
  
  
  The developer harness
&lt;/h2&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%2Fzyw2ox1drhiq8zc0w7gp.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%2Fzyw2ox1drhiq8zc0w7gp.png" alt="The publishing canvas in n8n" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nine publishing lanes on one canvas, each wrapping the same Schedule Trigger → AI Agent → Lexical → Publish shape.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This one is not part of the editorial operation. Where the other six workflows each own a single pipeline, this packs &lt;strong&gt;nine independent lanes&lt;/strong&gt; into one canvas — one per content type the CMS accepts, &lt;strong&gt;54 nodes&lt;/strong&gt; in total — all sharing the same four-stage shape: &lt;code&gt;Schedule Trigger → AI Agent → Markdown-to-Lexical → Publish&lt;/code&gt;. Engineers run it by hand to get real content into a real layout within seconds, and to confirm the publishing API still behaves after a deploy; nothing it produces is meant to be read by a player.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lane&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Casino article&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Post Test Casino n8n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/casinos/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Casino update&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger n8n casino update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PATCH /api/casinos/{id}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Casino review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger n8n review Update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PATCH /api/casinos/{id}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bonus&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Post Bonus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/bonuses&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Games n8n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/games/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guide&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Guides n8n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/guides/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger News n8n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini 3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/news/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Review Casino&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none — static payload)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/reviews/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Schedule Trigger Review Casino jr letto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none — static payload)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/reviews/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six lanes run on &lt;code&gt;models/gemini-3-flash-preview&lt;/code&gt;. The exception is the casino-article lane, wired to &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; — the same split between Gemini for volume and Claude for the high-value piece that runs through the rest of the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the content lands: the CMS
&lt;/h2&gt;

&lt;p&gt;Everything above is the production side. The workflows write into a &lt;strong&gt;Payload CMS&lt;/strong&gt; — a Next.js application hosted on AWS — that holds both the content and the taxonomy it hangs off.&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%2Ffk8u1kvnu4ptmbve0nz3.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%2Ffk8u1kvnu4ptmbve0nz3.png" alt="Payload CMS admin dashboard" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Payload admin. Collections map onto what the workflows post to, and the System Data block supplies the UUIDs they reference.&lt;/em&gt;&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%2Fx5soc869xbl4v7i1od5j.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%2Fx5soc869xbl4v7i1od5j.png" alt="Casinos collection, listing records created by the automation" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Casinos collection — records created by the workflows, not typed by hand.&lt;/em&gt;&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%2F37giq1rlnb9x5ajmcqfo.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%2F37giq1rlnb9x5ajmcqfo.png" alt="Rendered top-rated casinos block" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same records rendering on the public site: the homepage casino cards block.&lt;/em&gt;&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%2Fvo89fsullryogxqzwmw5.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%2Fvo89fsullryogxqzwmw5.png" alt="Rendered casino comparison row" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The comparison row — welcome offer, payment methods, withdrawal speed, RTP range and providers, all separate fields rather than free text.&lt;/em&gt;&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%2Fbgqdolufnxnfxydxf9mz.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%2Fbgqdolufnxnfxydxf9mz.png" alt="Rendered news and guides blocks" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;News and guides, through the same pipeline.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;n8n (self-hosted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Writing &amp;amp; Reasoning&lt;/td&gt;
&lt;td&gt;Google Gemini (via Vertex AI API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Translation QA&lt;/td&gt;
&lt;td&gt;Google Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Translation (multilingual)&lt;/td&gt;
&lt;td&gt;Anthropic Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic Search / RAG&lt;/td&gt;
&lt;td&gt;Vertex AI Search &amp;amp; Conversation (RAG)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Document Storage&lt;/td&gt;
&lt;td&gt;Google Cloud Storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Scraping&lt;/td&gt;
&lt;td&gt;Scrapfly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Google Service Account (OAuth2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMS&lt;/td&gt;
&lt;td&gt;Payload CMS (headless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content Format&lt;/td&gt;
&lt;td&gt;Lexical JSON (Payload rich text)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform API&lt;/td&gt;
&lt;td&gt;NovaSpins REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This system replaced what would otherwise be weeks of manual content work per month. It handles game catalog management, casino review writing, player review generation and multilingual localisation — all triggered from simple forms or schedules, with no developer intervention required for routine runs. It also ended up serving two very different audiences from one codebase: content managers, who only ever see a form, and engineers, who kept a harness workflow for testing layouts and the API.&lt;/p&gt;

&lt;p&gt;Two decisions did most of the work. The first was &lt;strong&gt;modularity over monoliths&lt;/strong&gt; — giving every workflow a single responsibility, and factoring the RAG engine and the Cloud Storage fetch into reusable subworkflows the review pipeline calls rather than copies. That is what makes the system cheap to extend: a new content type means a new lane, not a rebuilt pipeline. The second was &lt;strong&gt;RAG for factual grounding&lt;/strong&gt; — never letting a model invent casino details when retrieval can supply them. Because the corpus holds both operator facts and the per-country regulatory rules, a non-lawyer operator can generate market-appropriate copy without a compliance review on every draft.&lt;/p&gt;

&lt;p&gt;The key insight is that &lt;strong&gt;n8n is not just a task runner — it's a workflow orchestration layer&lt;/strong&gt; that lets you compose AI APIs, storage services and platform APIs into coherent, maintainable pipelines. Combined with the right models and a RAG backbone for factual grounding, it becomes a serious content production engine.&lt;/p&gt;

&lt;p&gt;If you're building content automation for a platform with a large and dynamic catalog, this modular approach — scrape → store → retrieve → generate → translate → publish — is a pattern worth stealing.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>ai</category>
      <category>automation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built a Fully Automated Brand Abuse Detection &amp; DMCA Pipeline in n8n</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Sun, 13 Sep 2026 06:16:41 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/how-i-built-a-fully-automated-brand-abuse-detection-dmca-pipeline-in-n8n-38nh</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/how-i-built-a-fully-automated-brand-abuse-detection-dmca-pipeline-in-n8n-38nh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;No lawyers on retainer. No manual monitoring. Just a scheduler, two search APIs, and some very strongly worded emails — sent automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A client runs multiple brands online. One day they noticed a clone of their app on the Play Store — same name, similar icon, fake reviews. They'd had it for weeks without knowing.&lt;/p&gt;

&lt;p&gt;That's when I realized: &lt;strong&gt;brand abuse is quiet&lt;/strong&gt;. Clones, impersonator websites, and fake apps don't announce themselves. By the time you find them, the damage is done — lost revenue, confused users, diluted SEO.&lt;/p&gt;

&lt;p&gt;The traditional fix? Hire an IP firm to monitor manually, or pay for expensive brand protection SaaS. Neither option made sense for an agency managing multiple mid-size brands.&lt;/p&gt;

&lt;p&gt;So I built my own — in n8n, over a few weekends.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the system does
&lt;/h2&gt;

&lt;p&gt;Three workflows, chained together, running silently on a schedule:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Workflow A&lt;/strong&gt; — Scans Google/Bing search results and app stores for unauthorized use of brand names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow C&lt;/strong&gt; — Enriches each detection with registrar and hosting data via RDAP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow B&lt;/strong&gt; — Generates and sends legally-structured DMCA takedown notices to the right targets, automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From detection to takedown notice: zero human intervention.&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%2Fjl4ju81m1cwv8it5znlj.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%2Fjl4ju81m1cwv8it5znlj.png" alt="brand_abuse_pipeline_diagram" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why two search APIs instead of one
&lt;/h2&gt;

&lt;p&gt;This is the architectural decision I get asked about most, so let me address it upfront.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;Monitorank&lt;/strong&gt; for web search (Google and Bing SERPs) and &lt;strong&gt;DataForSEO&lt;/strong&gt; for app store searches (Google Play and Apple App Store). Not because I couldn't find a single API that does both — but because each one is genuinely better at what it does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitorank&lt;/strong&gt; is built specifically for SERP monitoring. It handles ranking data cleanly, supports geolocation, and gives reliable results for web search across desktop and mobile. It was the natural fit for catching impersonator websites showing up in organic search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataForSEO&lt;/strong&gt; is where I go for app store data. Its Play Store and App Store search APIs are more mature, return richer metadata (developer name, ratings, install counts), and the async task model (&lt;code&gt;task_post&lt;/code&gt; → wait → &lt;code&gt;task_get&lt;/code&gt;) handles rate limits gracefully without me having to engineer a retry system from scratch.&lt;/p&gt;

&lt;p&gt;Using both means the pipeline covers the full surface area of brand abuse — web &lt;em&gt;and&lt;/em&gt; mobile — without compromising on data quality in either channel.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Workflow A works
&lt;/h2&gt;

&lt;p&gt;Workflow A is the detection engine. It runs on a schedule, reads a list of active brands from a Google Sheet (&lt;code&gt;config_brands&lt;/code&gt;), and loops through each one.&lt;/p&gt;

&lt;p&gt;For each brand, it runs two parallel tracks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web search via Monitorank&lt;/strong&gt; — brand search terms are batched and sent to the Monitorank API. Results come back as ranked URLs, which get filtered and deduped against previously known detections in the sheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App store search via DataForSEO&lt;/strong&gt; — two parallel requests hit the Google Play and Apple App Store endpoints. DataForSEO's async model means I post the task, wait for it to complete, then fetch the results. This is more reliable than hitting the live endpoint and hoping for a fast response.&lt;/p&gt;

&lt;p&gt;After both tracks complete, every surviving URL gets a live 404 check. If the infringing page is already gone, there's nothing to do — it gets dropped before it ever reaches enrichment. Only live detections make it forward.&lt;/p&gt;

&lt;p&gt;New findings get appended to the &lt;code&gt;detections&lt;/code&gt; sheet, and a Gmail alert fires summarizing what was found.&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%2F2ietksbwyt3lhcdnsthn.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%2F2ietksbwyt3lhcdnsthn.JPG" alt="Workflow A" width="800" height="405"&gt;&lt;/a&gt;&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%2F393zhrb7x5lwjmvqkwqn.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%2F393zhrb7x5lwjmvqkwqn.png" alt="Email Detection example" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How Workflow C works (RDAP enrichment)
&lt;/h2&gt;

&lt;p&gt;Before you can send a DMCA notice anywhere useful, you need to know &lt;em&gt;who&lt;/em&gt; to send it to. That's Workflow C's job.&lt;/p&gt;

&lt;p&gt;For each new detection, it runs three lookups in sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RDAP domain lookup&lt;/strong&gt; (&lt;code&gt;rdap.org/domain/{domain}&lt;/code&gt;) — returns the registrar, registration date, and crucially, the registrar's abuse contact email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS A record lookup&lt;/strong&gt; (&lt;code&gt;dns.google/resolve&lt;/code&gt;) — resolves the domain to an IP address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDAP IP lookup&lt;/strong&gt; (&lt;code&gt;rdap.org/ip/{ip}&lt;/code&gt;) — identifies who is hosting that IP and their abuse contact&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The results get written back to the &lt;code&gt;detections&lt;/code&gt; sheet, filling in &lt;code&gt;registrar_abuse_email&lt;/code&gt; and &lt;code&gt;hosting_abuse_email&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One gotcha here: RDAP APIs are public infrastructure and rate-limited. I added a wait node between detections to pace the loop — without it, you'll start getting throttled and silently losing data.&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%2Fue58b94z0sc430aldxyv.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%2Fue58b94z0sc430aldxyv.JPG" alt="Workflow C enrich host domain" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&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%2F58d2cesm7uredujkfu13.png" alt="Detection worksheet" width="800" height="403"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How Workflow B works (DMCA sending)
&lt;/h2&gt;

&lt;p&gt;Workflow B is where it gets interesting. It takes the enriched detections and builds the actual takedown notices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart routing by source&lt;/strong&gt; — the target of a DMCA notice depends on where the abuse was found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Emails sent to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google SERP&lt;/td&gt;
&lt;td&gt;Google DMCA agent + registrar + hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bing SERP&lt;/td&gt;
&lt;td&gt;Microsoft DMCA agent + registrar + hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;Google DMCA agent + registrar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple App Store&lt;/td&gt;
&lt;td&gt;Apple copyright agent (with CC) + registrar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Domain grouping&lt;/strong&gt; — if the same rogue domain has five infringing URLs, they all get bundled into one complaint rather than five separate emails. This is both more professional and less likely to get marked as spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two sending modes&lt;/strong&gt; — brands can configure whether notices go out directly in their name (&lt;code&gt;direct&lt;/code&gt;) or signed by an agency acting on their behalf (&lt;code&gt;on_behalf_of&lt;/code&gt;). The email template adjusts accordingly, pulling complainant or agent details from the config sheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-send gate&lt;/strong&gt; — each brand has an &lt;code&gt;auto_send&lt;/code&gt; flag. If it's off, the detection gets marked &lt;code&gt;skipped&lt;/code&gt; and nothing is sent. This lets cautious clients review detections before any emails go out.&lt;/p&gt;

&lt;p&gt;Every sent notice gets logged to a &lt;code&gt;complaints&lt;/code&gt; sheet with a &lt;code&gt;follow_up_date&lt;/code&gt; set 10 days out.&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%2Fok8ghaie8r31wiyqiqo3.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%2Fok8ghaie8r31wiyqiqo3.JPG" alt="workflow B send complaints" width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&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%2Fuug3x4u6s6zo51mvwd40.png" alt="DMCA email sent" width="800" height="403"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Filter aggressively before sending.&lt;/strong&gt; Early versions of the pipeline sent notices to hosting providers like Google Cloud and Akamai for domains they just happened to host. Those abuse desks ignore automated notices instantly. I added a filter to skip known CDN and hyperscaler abuse emails — they're useless targets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dedup at multiple stages.&lt;/strong&gt; I deduplicate at the detection level (to avoid re-reporting known infringers), at the domain level (to group URLs into one complaint), and again after sending (to update individual detection IDs back to &lt;code&gt;complaint_sent&lt;/code&gt;). Skipping any of these layers causes duplicate emails, which undermines your credibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RDAP returns inconsistent formats.&lt;/strong&gt; Some registrars follow the spec cleanly, others return abuse contacts buried in nested entities, and some return nothing at all. The parsing code needs to handle all three gracefully — don't assume the field you want is where the spec says it should be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build in the &lt;code&gt;auto_send&lt;/code&gt; flag from day one.&lt;/strong&gt; I almost shipped without it. It seems like overhead until the first false positive, at which point it becomes the most important feature in the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; (self-hosted) — orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitorank API&lt;/strong&gt; — web SERP monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DataForSEO API&lt;/strong&gt; — app store search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rdap.org + dns.google&lt;/strong&gt; — domain/IP enrichment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail&lt;/strong&gt; — outbound DMCA notices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets&lt;/strong&gt; — config, detections, complaints log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database, no custom backend. The whole thing runs on n8n and a spreadsheet.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The system handles detection and first-contact takedown well. What it doesn't do yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up tracking&lt;/strong&gt; — the &lt;code&gt;follow_up_date&lt;/code&gt; column is there, but I haven't built the follow-up workflow yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response parsing&lt;/strong&gt; — when a registrar replies, someone still has to read it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Counter-notice handling&lt;/strong&gt; — if a takedown gets disputed, that's currently a manual process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are Workflow D and beyond. For now, the pipeline catches real abusers, sends legally-sound notices automatically, and has saved my client hundreds of hours of manual monitoring.&lt;/p&gt;

&lt;p&gt;If you're managing brand protection for multiple clients and doing this by hand, it's worth automating. The hardest part is the first detection — everything after that is plumbing.&lt;/p&gt;

&lt;h2&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%2Fi7yly9neair8n2swqzez.JPG" alt="Workflow D in progress" width="800" height="407"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Built with n8n. Questions? Drop them in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>legaltech</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Using MonkeyCode 30M Free Tokens and Asked It to Build Tic-Tac-Toe — Here's What Happened</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Sun, 30 Aug 2026 12:33:53 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/using-monkeycode-30m-free-tokens-and-asked-it-to-build-tic-tac-toe-heres-what-happened-3cak</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/using-monkeycode-30m-free-tokens-and-asked-it-to-build-tic-tac-toe-heres-what-happened-3cak</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I tested MonkeyCode with its daily free token quota and DeepSeek-V4-Flash by giving it a complete front-end development task, then asked it to publish the result to GitHub.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What happens when you give an AI coding agent a fairly detailed software specification and let it actually build the project instead of just generating snippets?&lt;/p&gt;

&lt;p&gt;I decided to find out.&lt;/p&gt;

&lt;p&gt;For this experiment, I used &lt;strong&gt;MonkeyCode&lt;/strong&gt; with &lt;strong&gt;DeepSeek-V4-Flash&lt;/strong&gt; and its roughly &lt;strong&gt;30M-free-token daily quota&lt;/strong&gt; available in my account.&lt;/p&gt;

&lt;p&gt;My goal was deliberately simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a complete Tic-Tac-Toe web application from scratch, make it functional, preview it, and then push the finished project to GitHub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The interesting part wasn't the game itself.&lt;/p&gt;

&lt;p&gt;It was watching how much work the agent could perform autonomously — from creating files and implementing the UI to testing the application and eventually publishing the project to my GitHub repository.&lt;/p&gt;




&lt;h1&gt;
  
  
  The experiment
&lt;/h1&gt;

&lt;p&gt;I wanted to test MonkeyCode with something slightly more demanding than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a Tic-Tac-Toe game."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, I gave it an actual development specification.&lt;/p&gt;

&lt;p&gt;The requirements included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Modern JavaScript&lt;/li&gt;
&lt;li&gt;No frameworks&lt;/li&gt;
&lt;li&gt;No npm dependencies&lt;/li&gt;
&lt;li&gt;Responsive design&lt;/li&gt;
&lt;li&gt;Dark/light mode&lt;/li&gt;
&lt;li&gt;Player vs Player&lt;/li&gt;
&lt;li&gt;Player vs AI&lt;/li&gt;
&lt;li&gt;Easy AI&lt;/li&gt;
&lt;li&gt;Unbeatable Minimax AI&lt;/li&gt;
&lt;li&gt;Undo functionality&lt;/li&gt;
&lt;li&gt;Win detection&lt;/li&gt;
&lt;li&gt;Draw detection&lt;/li&gt;
&lt;li&gt;Persistent scoreboard&lt;/li&gt;
&lt;li&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Complete README documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I explicitly asked it to create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html
styles.css
script.js
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application also needed to work directly in a browser without a build process.&lt;/p&gt;

&lt;p&gt;That made it a nice little benchmark for an AI coding agent.&lt;/p&gt;




&lt;h1&gt;
  
  
  The prompt
&lt;/h1&gt;

&lt;p&gt;This is the exact prompt I used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Act as a front-end web developer. Create a lightweight, single-page Tic-Tac-Toe web application using ONLY vanilla HTML, CSS, and modern JavaScript, and update the project's README.md file.

### Technical Guidelines &amp;amp; Rules
1. Tech Stack Constraints:
   - Use standard HTML5, CSS3, and modern Vanilla ES6+ JavaScript.
   - NO external frameworks (React, Next.js, Vue, Tailwind, etc.).
   - Keep it zero-dependency: output files must run directly in a standard web browser without build tools or npm dependencies.

2. File Structure:
   - index.html — Clean, semantic structure.
   - styles.css — Responsive design using Flexbox/Grid, CSS custom variables (for themes), smooth transitions, and a clean modern aesthetic (dark theme default).
   - script.js — Modular, cleanly formatted JavaScript handling game state, UI rendering, event listeners, and AI logic.
   - README.md — Complete documentation.

3. Core Gameplay &amp;amp; Features:
   - Game Modes:
     - Player vs. Player (Local 2-player)
     - Player vs. AI (Include a toggle for Easy AI vs. Unbeatable Minimax AI).
   - Game Mechanics:
     - Interactive 3x3 grid with hover indicators and clear click feedback.
     - Turn indicator display showing active player (X or O).
     - Move History / Undo last move functionality.
     - Automatic win detection with a visual highlight/line on winning cells.
     - Draw detection.
     - Scoreboard (X Wins, O Wins, Ties) persisted in browser localStorage.
     - Reset Board button &amp;amp; Clear Scoreboard button.
   - UI Polish:
     - Light/Dark mode toggle switch.
     - Smooth animations for marking X and O.

4. Documentation Requirement:
   - Create or completely update README.md in the project root containing:
     - Overview
     - Features
     - File Structure
     - How to Run
     - AI Logic Explained
     - Brief explanation of the Minimax decision algorithm.

Generate all files (index.html, styles.css, script.js, and README.md) with fully functional, clean, and well-commented code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I intentionally made the prompt detailed.&lt;/p&gt;

&lt;p&gt;I wanted to see whether the agent could follow a specification rather than simply produce something that looked like a Tic-Tac-Toe game.&lt;/p&gt;




&lt;h1&gt;
  
  
  What MonkeyCode did
&lt;/h1&gt;

&lt;p&gt;After submitting the task, MonkeyCode started working through the requirements.&lt;/p&gt;

&lt;p&gt;The workflow was interesting because it wasn't just one giant response containing four code blocks.&lt;/p&gt;

&lt;p&gt;The agent went through individual tasks and file operations.&lt;/p&gt;

&lt;p&gt;It started by planning the implementation and then created the project files.&lt;/p&gt;

&lt;p&gt;Here it is in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ltj6xa43hubbimltwfu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ltj6xa43hubbimltwfu.gif" alt="MonkeyCode working through the Tic-Tac-Toe task — you can see it planning, creating files, and stepping through each implementation stage autonomously" width="720" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice how the interface exposes individual steps as they execute: planning first, then each file in sequence, then running a preview. That stepped visibility is one of the things that makes an agent feel meaningfully different from a chatbot.&lt;/p&gt;

&lt;p&gt;The workflow looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task
 ↓
Planning
 ↓
Create index.html
 ↓
Create styles.css
 ↓
Create script.js
 ↓
Create/update README.md
 ↓
Run / preview application
 ↓
Inspect result
 ↓
Publish to GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're not simply asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Give me the code."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're effectively delegating a development task.&lt;/p&gt;




&lt;h1&gt;
  
  
  The generated application
&lt;/h1&gt;

&lt;p&gt;The result was a complete zero-dependency Tic-Tac-Toe application.&lt;/p&gt;

&lt;p&gt;The repository contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tik-tak-toe_monkeyCode/
│
├── index.html
├── styles.css
├── script.js
├── README.md
└── LICENSE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated README documented the Minimax implementation and the different game modes.&lt;/p&gt;

&lt;p&gt;The GitHub repository is publicly available here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Nayim-Imrit/tik-tak-toe_monkeyCode" rel="noopener noreferrer"&gt;https://github.com/Nayim-Imrit/tik-tak-toe_monkeyCode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: the repo slug uses "tik-tak-toe" — that's intentional, not a typo.)&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  And yes, the game actually worked
&lt;/h1&gt;

&lt;p&gt;This was the most important part of the test.&lt;/p&gt;

&lt;p&gt;The generated application wasn't just visually complete.&lt;/p&gt;

&lt;p&gt;I could actually run it in the browser.&lt;/p&gt;

&lt;p&gt;The preview worked, and the core functionality was there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2-player mode&lt;/li&gt;
&lt;li&gt;AI mode&lt;/li&gt;
&lt;li&gt;Easy AI&lt;/li&gt;
&lt;li&gt;Minimax AI&lt;/li&gt;
&lt;li&gt;Score tracking&lt;/li&gt;
&lt;li&gt;Undo&lt;/li&gt;
&lt;li&gt;Reset&lt;/li&gt;
&lt;li&gt;Dark/light theme&lt;/li&gt;
&lt;li&gt;Persistent scores&lt;/li&gt;
&lt;li&gt;Responsive interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a task that started with one natural-language instruction, that was a pretty good result.&lt;/p&gt;




&lt;h1&gt;
  
  
  The token consumption surprised me
&lt;/h1&gt;

&lt;p&gt;This is where the experiment became more interesting.&lt;/p&gt;

&lt;p&gt;The platform gave me approximately &lt;strong&gt;30 million free tokens per day&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And I decided to actually use them.&lt;/p&gt;

&lt;p&gt;You can see the live quota counter in the GIF above — at the point I captured it, the interface showed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Daily quota: ~30M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the time the full task completed — application created, previewed, and pushed to GitHub — the quota had dropped to approximately &lt;strong&gt;27M&lt;/strong&gt;, meaning the entire workflow consumed &lt;strong&gt;roughly 3 million tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That sounds enormous for a Tic-Tac-Toe game.&lt;/p&gt;

&lt;p&gt;And honestly, it is.&lt;/p&gt;

&lt;p&gt;But there's an important distinction.&lt;/p&gt;

&lt;p&gt;The token usage isn't simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My prompt → 3M tokens → Tic-Tac-Toe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent performing software-development work can repeatedly interact with its environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read
 ↓
Think
 ↓
Edit
 ↓
Inspect
 ↓
Run
 ↓
Check
 ↓
Fix
 ↓
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every one of those interactions can contribute to the total context and token consumption.&lt;/p&gt;

&lt;p&gt;That's fundamentally different from asking a normal chatbot to generate four files once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 million tokens for a small project is still a lot.&lt;/strong&gt; A more efficient agent should minimize unnecessary file re-reads, avoid redundant context and reduce iterations. This is something I'll be tracking closely in future experiments — token efficiency matters as much as output quality.&lt;/p&gt;




&lt;h1&gt;
  
  
  The GitHub test
&lt;/h1&gt;

&lt;p&gt;After the application was working, I gave MonkeyCode another task:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Push the project to my GitHub repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The target repository was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nayim-Imrit/tik-tak-toe_monkeyCode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent handled the repository workflow and the finished project ended up on GitHub.&lt;/p&gt;

&lt;p&gt;This was an important part of my test.&lt;/p&gt;

&lt;p&gt;Generating code is one thing.&lt;/p&gt;

&lt;p&gt;Getting an agent to work with an actual development environment and source-control workflow is another.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why this feels different from ChatGPT generating code
&lt;/h1&gt;

&lt;p&gt;This experiment made me think about the difference between an &lt;strong&gt;AI assistant&lt;/strong&gt; and an &lt;strong&gt;AI coding agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A traditional coding assistant might do something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   ↓
Ask for code
   ↓
AI generates code
   ↓
Developer copies code
   ↓
Developer creates files
   ↓
Developer runs application
   ↓
Developer fixes errors
   ↓
Developer commits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent can potentially move more of that workflow into the AI environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   ↓
Specification
   ↓
AI Agent
   ├── Creates files
   ├── Edits files
   ├── Runs commands
   ├── Checks results
   ├── Iterates
   └── Publishes changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the real thing I wanted to test.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can AI write JavaScript?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We already know it can.&lt;/p&gt;

&lt;p&gt;The more interesting question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How much of the development workflow can an AI agent actually execute for you?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  DeepSeek-V4-Flash is an interesting model for this
&lt;/h1&gt;

&lt;p&gt;The timing of this experiment was also interesting because DeepSeek-V4-Flash had recently been released.&lt;/p&gt;

&lt;p&gt;DeepSeek describes V4-Flash as the faster, more cost-efficient member of the V4 family, built with a strong focus on agentic tasks — meaning it's designed for exactly this kind of multi-step, tool-using workflow rather than single-turn generation. In practice, that showed up in the planning phase: rather than immediately generating code, it broke the task down into discrete file operations first.&lt;/p&gt;

&lt;p&gt;That's why I wanted to run an actual task instead of just reading the benchmark numbers.&lt;/p&gt;




&lt;h1&gt;
  
  
  My test wasn't a benchmark
&lt;/h1&gt;

&lt;p&gt;I want to make this distinction very clear.&lt;/p&gt;

&lt;p&gt;This wasn't a scientific comparison between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;GPT&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;li&gt;GLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wasn't measuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tokens per second&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;benchmark scores&lt;/li&gt;
&lt;li&gt;coding accuracy across 100 repositories&lt;/li&gt;
&lt;li&gt;cost per accepted pull request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a practical experiment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give an AI coding agent a realistic specification and see what happens.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And for that particular task, the result was surprisingly good.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I liked
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The agent understood a detailed specification
&lt;/h2&gt;

&lt;p&gt;The prompt contained a lot of requirements.&lt;/p&gt;

&lt;p&gt;It wasn't just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make Tic-Tac-Toe."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It specified architecture, technology restrictions, features, documentation and AI behavior.&lt;/p&gt;

&lt;p&gt;The generated repository followed those requirements reasonably well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero-dependency development worked well
&lt;/h2&gt;

&lt;p&gt;I deliberately prohibited:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React
Next.js
Vue
Tailwind
npm
build tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result remained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTML
CSS
JavaScript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That made the application extremely portable.&lt;/p&gt;

&lt;p&gt;You can simply open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Minimax implementation was documented
&lt;/h2&gt;

&lt;p&gt;This was a nice detail.&lt;/p&gt;

&lt;p&gt;The README didn't simply say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The AI uses Minimax."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It explained the basic idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current board
     ↓
Possible moves
     ↓
Opponent responses
     ↓
Future states
     ↓
Score positions
     ↓
Choose best move
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Tic-Tac-Toe, the game tree is small enough that exhaustive search is perfectly practical.&lt;/p&gt;




&lt;h1&gt;
  
  
  Token consumption is a real concern
&lt;/h1&gt;

&lt;p&gt;Nearly 3 million tokens for a relatively small application is a lot.&lt;/p&gt;

&lt;p&gt;Even though the daily quota is huge, developers should not automatically assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;More tokens = better result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent efficiency matters.&lt;/p&gt;

&lt;p&gt;A better agent should ideally minimize unnecessary context, repeated file reads and redundant iterations.&lt;/p&gt;

&lt;p&gt;This is something I've become increasingly interested in: &lt;strong&gt;token-efficient AI development workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If an agent repeatedly reads the same files, re-evaluates the same architecture and regenerates context unnecessarily, the cost can grow very quickly.&lt;/p&gt;

&lt;p&gt;For production use, this isn't just a curiosity — it's a real cost and performance factor.&lt;/p&gt;




&lt;h1&gt;
  
  
  The local agent idea is even more interesting
&lt;/h1&gt;

&lt;p&gt;The part that really caught my attention is what happens when you move beyond a browser-based coding environment.&lt;/p&gt;

&lt;p&gt;The broader idea is to run an AI development agent locally on your own machine, connect it to tools, repositories and services, and give it controlled permissions.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌───────────────┐
                 │   AI Model    │
                 │ DeepSeek/GPT  │
                 │ Claude/GLM... │
                 └───────┬───────┘
                         │
                         ▼
                 ┌───────────────┐
                 │ Coding Agent  │
                 └───────┬───────┘
                         │
          ┌──────────────┼──────────────┐
          ▼              ▼              ▼
      Filesystem       GitHub          MCP
          │              │              │
          ▼              ▼              ▼
       Laptop         Repositories     Tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI, tell me what command I should run."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can move toward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI, implement this feature, run the tests, inspect the result and create the commit."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obviously, this comes with an important warning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't give an autonomous agent unrestricted access to your machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Permissions matter.&lt;/p&gt;

&lt;p&gt;Credentials matter.&lt;/p&gt;

&lt;p&gt;Repository access matters.&lt;/p&gt;

&lt;p&gt;Tool integrations can potentially give an agent the ability to do much more than edit a source file.&lt;/p&gt;

&lt;p&gt;The principle should always be &lt;strong&gt;least privilege&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What about connecting other AI subscriptions?
&lt;/h1&gt;

&lt;p&gt;This is another direction that I find interesting.&lt;/p&gt;

&lt;p&gt;Instead of thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which AI coding tool should I use?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;we can start thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which model should handle which task?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Simple coding task
        ↓
DeepSeek V4-Flash

Complex reasoning
        ↓
GPT / Claude

Large refactoring
        ↓
Another specialized model

Local/private task
        ↓
Local open-weight model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the possibility of treating AI models almost like interchangeable compute providers.&lt;/p&gt;

&lt;p&gt;The agent becomes the orchestration layer.&lt;/p&gt;

&lt;p&gt;The model becomes the engine.&lt;/p&gt;

&lt;p&gt;That separation is potentially much more interesting than simply choosing one AI subscription and using it for everything.&lt;/p&gt;




&lt;h1&gt;
  
  
  So, is MonkeyCode worth trying?
&lt;/h1&gt;

&lt;p&gt;Based on this experiment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes — if you're interested in AI agents rather than just AI chat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Tic-Tac-Toe project isn't impressive because Tic-Tac-Toe is difficult.&lt;/p&gt;

&lt;p&gt;It's interesting because I gave the system a specification and it was able to turn that specification into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requirements
     ↓
Implementation
     ↓
Files
     ↓
Working application
     ↓
Documentation
     ↓
Git repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with very little manual intervention from me.&lt;/p&gt;

&lt;p&gt;That's the direction AI-assisted development is moving toward.&lt;/p&gt;




&lt;h1&gt;
  
  
  But there's still a long way to go
&lt;/h1&gt;

&lt;p&gt;I wouldn't use this one experiment to conclude that AI coding agents can replace developers.&lt;/p&gt;

&lt;p&gt;They can't.&lt;/p&gt;

&lt;p&gt;At least, that's not what this test demonstrates.&lt;/p&gt;

&lt;p&gt;The developer is still responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining the requirements&lt;/li&gt;
&lt;li&gt;Reviewing the generated code&lt;/li&gt;
&lt;li&gt;Validating behavior&lt;/li&gt;
&lt;li&gt;Checking security&lt;/li&gt;
&lt;li&gt;Reviewing dependencies&lt;/li&gt;
&lt;li&gt;Managing credentials&lt;/li&gt;
&lt;li&gt;Controlling permissions&lt;/li&gt;
&lt;li&gt;Testing edge cases&lt;/li&gt;
&lt;li&gt;Reviewing Git changes&lt;/li&gt;
&lt;li&gt;Deciding whether the solution is actually production-ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can execute.&lt;/p&gt;

&lt;p&gt;The developer still needs to &lt;strong&gt;judge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that distinction is important.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final thoughts
&lt;/h1&gt;

&lt;p&gt;My first MonkeyCode experiment was intentionally small.&lt;/p&gt;

&lt;p&gt;A Tic-Tac-Toe game.&lt;/p&gt;

&lt;p&gt;Four main files.&lt;/p&gt;

&lt;p&gt;Vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;No backend.&lt;/p&gt;

&lt;p&gt;No database.&lt;/p&gt;

&lt;p&gt;No external APIs.&lt;/p&gt;

&lt;p&gt;Yet the agent was able to take the specification, implement the application, provide a working preview and eventually get the project into GitHub.&lt;/p&gt;

&lt;p&gt;The most interesting number wasn't actually the 30M token quota.&lt;/p&gt;

&lt;p&gt;It was the fact that an AI agent consumed roughly 3 million tokens of that budget while doing real development work — planning, creating, iterating, previewing, committing.&lt;/p&gt;

&lt;p&gt;That raises a much more interesting question for my next experiment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens when I give the same agent a real full-stack application?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Something with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Database migrations&lt;/li&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then measure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many tokens does it take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many iterations does it need?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much code does it generate?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much of the work actually needs human intervention?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a much more interesting benchmark.&lt;/p&gt;




&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Nayim-Imrit/tik-tak-toe_monkeyCode" rel="noopener noreferrer"&gt;https://github.com/Nayim-Imrit/tik-tak-toe_monkeyCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the generated HTML, CSS, JavaScript and README documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What should I test next?
&lt;/h2&gt;

&lt;p&gt;I'm thinking of taking this experiment much further.&lt;/p&gt;

&lt;p&gt;Instead of Tic-Tac-Toe, give an AI coding agent a &lt;strong&gt;real full-stack application&lt;/strong&gt; and track the entire process.&lt;br&gt;
If you'd like to see that experiment, let me know what kind of application I should throw at it. 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>coding</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Cut LLM Token Usage with OKF, CLAUDE.md, and Skills</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:35:00 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/stop-making-your-ai-re-read-your-codebase-every-session-36eh</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/stop-making-your-ai-re-read-your-codebase-every-session-36eh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Every time you ask an AI coding assistant a question, it often starts from scratch.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Where is authentication implemented?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Who calls &lt;code&gt;UserService&lt;/code&gt;?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"How does this API flow work?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of remembering your architecture, the model crawls dozens of files again. That means more tokens, higher cost, slower responses, and more opportunities for hallucinations.&lt;/p&gt;

&lt;p&gt;After experimenting with AI-assisted development, I found that the biggest optimization isn't choosing a different model --- it's changing &lt;strong&gt;what you send&lt;/strong&gt; to the model.&lt;/p&gt;

&lt;p&gt;This article covers a layered workflow for making AI agents dramatically more efficient using OKF, persistent project memory, on-demand skills, and token compression.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why token optimization matters
&lt;/h2&gt;

&lt;p&gt;LLMs don't read code the way humans do. Everything becomes tokens processed through transformer layers.&lt;/p&gt;

&lt;p&gt;Every unnecessary file, log, or repeated explanation increases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 Cost (for paid APIs)&lt;/li&gt;
&lt;li&gt;⏱️ Latency&lt;/li&gt;
&lt;li&gt;🧠 Context window usage&lt;/li&gt;
&lt;li&gt;❌ Risk of losing important information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to provide &lt;em&gt;less&lt;/em&gt; context. &lt;strong&gt;It's to provide better structured context.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 1: Replace raw code with structured knowledge
&lt;/h2&gt;

&lt;p&gt;The biggest improvement comes from avoiding repeated file reads entirely.&lt;/p&gt;

&lt;p&gt;Instead of feeding an LLM your repository every session, generate a knowledge bundle once and let the agent query that instead. This is the core idea behind &lt;strong&gt;OKF (Optimised Knowledge Format)&lt;/strong&gt;. It extracts your project's architecture --- classes, functions, APIs, relationships, and modules --- into structured Markdown that both humans and AI agents can navigate efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
│
▼
Read 40 files
│
▼
Understand architecture
│
▼
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OKF workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
│
▼
Read knowledge bundle
│
▼
Jump directly to implementation
│
▼
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is simple:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Without OKF&lt;/th&gt;
&lt;th&gt;With OKF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Re-reads source files&lt;/td&gt;
&lt;td&gt;Queries structured concepts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large token usage&lt;/td&gt;
&lt;td&gt;Small, focused context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slower reasoning&lt;/td&gt;
&lt;td&gt;Faster navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture rediscovered every session&lt;/td&gt;
&lt;td&gt;Architecture indexed once&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Meet OKF Generator
&lt;/h3&gt;

&lt;p&gt;The easiest way to generate these knowledge bundles is with &lt;strong&gt;OKF Generator&lt;/strong&gt;, an open-source CLI that scans a repository and produces an OKF bundle using static analysis --- no LLM required. It supports incremental updates, agent integrations, and even a zero-LLM workflow where you can generate and query bundles entirely offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/UmairBaig8/okf-generator" rel="noopener noreferrer"&gt;https://github.com/UmairBaig8/okf-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting started:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;okf-generator

&lt;span class="c"&gt;# Generate your first bundle&lt;/span&gt;
okf generate

&lt;span class="c"&gt;# Update it after new changes&lt;/span&gt;
okf update

&lt;span class="c"&gt;# Install integrations for AI agents&lt;/span&gt;
okf &lt;span class="nb"&gt;install &lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once generated, point your agent to the bundle instead of your entire repository. The bundle is plain Markdown, version-controllable, and designed to live alongside your source code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not Just Claude: OKF Works With Any Agent
&lt;/h3&gt;

&lt;p&gt;OKF goes beyond token optimization. When onboarding developers to a large codebase, you can give any LLM the generated &lt;code&gt;okf_bundle&lt;/code&gt; and ask it to explain the project, identify key components and their relationships, and generate a &lt;strong&gt;Mermaid diagram&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This provides a quick, high-level overview of the codebase and can significantly reduce onboarding time.&lt;/p&gt;

&lt;p&gt;For this example, using a local LLM(gpt-oss20b), I asked it to analyze &lt;code&gt;C:\Code\uigen\okf_bundle&lt;/code&gt; and generate a Mermaid diagram with an explanation of the project's key components and how they interact.&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%2Foqq1ssxoqx1wt59al170.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%2Foqq1ssxoqx1wt59al170.png" alt=" " width="799" height="322"&gt;&lt;/a&gt;&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%2Fjv7yajs5dxa6raq1y0u3.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%2Fjv7yajs5dxa6raq1y0u3.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the components, explanations, and web flow were generated in less than 2 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2: Give your project a memory (CLAUDE.md)
&lt;/h2&gt;

&lt;p&gt;Most developers repeatedly explain the same things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to run the project&lt;/li&gt;
&lt;li&gt;Coding conventions&lt;/li&gt;
&lt;li&gt;Folder structure&lt;/li&gt;
&lt;li&gt;Architectural decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That information belongs in &lt;strong&gt;CLAUDE.md&lt;/strong&gt;, a persistent Markdown file automatically loaded at the beginning of every session. It eliminates repeated briefings and keeps foundational project knowledge available without bloating every prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good CLAUDE.md contains:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use pnpm instead of npm

This project has an OKF knowledge bundle at ./okf_bundle/.
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`okf lookup &amp;lt;Name&amp;gt;`&lt;/span&gt; for full concept context.
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`okf lookup --type &amp;lt;Type&amp;gt;`&lt;/span&gt; to filter by type.
&lt;span class="p"&gt;-&lt;/span&gt; Read &lt;span class="sb"&gt;`SUMMARY.md`&lt;/span&gt; for the full knowledge map.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of repeating these instructions across conversations, they're loaded automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File locations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project-level&lt;/span&gt;
./CLAUDE.md
./.claude/CLAUDE.md
&lt;span class="gh"&gt;# User-level&lt;/span&gt;
~/.claude/CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Layer 3: Load knowledge only when needed (Skills)
&lt;/h2&gt;

&lt;p&gt;Not everything deserves permanent context.&lt;/p&gt;

&lt;p&gt;Deployment guides, review checklists, compliance docs, and long API references are better stored as &lt;strong&gt;Skills&lt;/strong&gt;. Skills are reusable &lt;code&gt;SKILL.md&lt;/code&gt; files that stay out of the main context until the task requires them, keeping the default prompt lean while still making detailed workflows instantly available.&lt;/p&gt;

&lt;p&gt;Good examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/deploy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/release&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/database-migration&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your default context stays small, but expertise is always one command away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File locations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;.claude/skills/&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;/SKILL.md
&lt;span class="gh"&gt;# or&lt;/span&gt;
~/.claude/skills/&lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Layer 4: Automate consistency with Hooks
&lt;/h2&gt;

&lt;p&gt;Hooks aren't about saving tokens directly. &lt;strong&gt;They're about preventing expensive mistakes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-format after every edit&lt;/li&gt;
&lt;li&gt;Block dangerous shell commands&lt;/li&gt;
&lt;li&gt;Notify you when an agent finishes&lt;/li&gt;
&lt;li&gt;Run linting automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since hooks fire at predefined lifecycle events, they remove repetitive instructions from your prompts entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File locations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;.claude/settings.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;or&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;~/.claude/settings.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Keep your knowledge bundle up to date
&lt;/h2&gt;

&lt;p&gt;A stale architecture is almost as bad as no architecture.&lt;/p&gt;

&lt;p&gt;You can regenerate your OKF bundle automatically using GitHub Actions whenever someone pushes to &lt;code&gt;main&lt;/code&gt; or opens a pull request. The workflow keeps your AI context synchronized with your codebase and can even generate impact summaries for reviews.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OKF Bundle&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install okf-generator&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;okf generate . okf_bundle&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your AI always understands the latest architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reduce output tokens too
&lt;/h2&gt;

&lt;p&gt;Optimizing input is only half the story.&lt;/p&gt;

&lt;p&gt;Two complementary tools solve different problems:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Optimizes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OKF&lt;/td&gt;
&lt;td&gt;What the model reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;caveman&lt;/td&gt;
&lt;td&gt;What the model writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rtk&lt;/td&gt;
&lt;td&gt;Terminal and tool output&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your context is filled with &lt;code&gt;git diff&lt;/code&gt;, build logs, or test output, &lt;strong&gt;rtk&lt;/strong&gt; trims that before it ever reaches the model. If your assistant tends to produce verbose explanations, &lt;strong&gt;caveman&lt;/strong&gt; keeps responses concise. Together they reduce both sides of the token equation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The complete token-efficient workflow
&lt;/h2&gt;

&lt;p&gt;Each layer removes a different source of waste:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it eliminates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OKF&lt;/td&gt;
&lt;td&gt;Re-reading source files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLAUDE.md&lt;/td&gt;
&lt;td&gt;Repeating project briefings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;Loading reference docs unnecessarily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;Repeating operational instructions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;caveman / rtk&lt;/td&gt;
&lt;td&gt;Verbose output and noisy logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The future of AI development isn't about endlessly increasing context windows. &lt;strong&gt;It's about making context intentional.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A well-structured repository gives AI assistants the same advantage it gives human developers: they spend less time searching and more time solving problems.&lt;/p&gt;

&lt;p&gt;If you're already using Claude Code, Cursor, Copilot, or another AI coding assistant, try generating an OKF bundle for your next project. You'll probably notice the difference long before you notice the token savings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/UmairBaig8/okf-generator" rel="noopener noreferrer"&gt;OKF Generator (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rtk-ai/rtk" rel="noopener noreferrer"&gt;rtk (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/juliusbrussee/caveman" rel="noopener noreferrer"&gt;caveman (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If you've been experimenting with token optimization or AI developer workflows, I'd love to hear what's working for you in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Testing 3 Local LLMs on a CPU-Only Laptop — Here's What Actually Happened</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Wed, 05 Aug 2026 08:29:51 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/testing-3-local-llms-on-a-cpu-only-laptop-heres-what-actually-happened-1fe</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/testing-3-local-llms-on-a-cpu-only-laptop-heres-what-actually-happened-1fe</guid>
      <description>&lt;p&gt;As developers, we keep hearing that powerful LLMs require expensive GPUs. I wanted to find out how far local AI could actually go on a modest machine — no cloud, no cost, no GPU.&lt;/p&gt;

&lt;p&gt;So I ran a practical experiment using &lt;strong&gt;LM Studio&lt;/strong&gt; on a &lt;strong&gt;40 GB RAM laptop without a dedicated GPU&lt;/strong&gt;, pitting three open-weight models against each other on a real coding task.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Environment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard laptop&lt;/li&gt;
&lt;li&gt;40 GB RAM&lt;/li&gt;
&lt;li&gt;No dedicated GPU (CPU inference only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LM Studio (context length: 8192 tokens)&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;100% local inference — no API calls, no internet required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Models tested&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qwen 3 14B&lt;/li&gt;
&lt;li&gt;GPT-OSS 20B&lt;/li&gt;
&lt;li&gt;Gemma 4 26B A4B QAT&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;Each model received the &lt;strong&gt;exact same prompt&lt;/strong&gt;: generate a complete Snake Game using only HTML, CSS, and JavaScript — no frameworks, no external libraries.&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%2Fmuqq2at61higzaiiqc48.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%2Fmuqq2at61higzaiiqc48.png" alt=" " width="719" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I evaluated each result on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏱ Generation time&lt;/li&gt;
&lt;li&gt;🪙 Token usage&lt;/li&gt;
&lt;li&gt;🎨 Quality of the generated UI&lt;/li&gt;
&lt;li&gt;🔧 Whether manual corrections were needed&lt;/li&gt;
&lt;li&gt;🧑‍💻 Overall developer experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟡 Qwen 3 14B
&lt;/h3&gt;

&lt;p&gt;Generation took approximately &lt;strong&gt;9 minutes&lt;/strong&gt; and produced &lt;strong&gt;3 separate files&lt;/strong&gt; (HTML, CSS, JS).&lt;/p&gt;

&lt;p&gt;After testing, the snake moved too fast. I had to send a follow-up prompt, which triggered another full 9-minute generation cycle — and only around five lines of code actually changed.&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%2F2ptagum0it56snlqwxaz.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%2F2ptagum0it56snlqwxaz.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&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%2Fc0s1oq5klkoyl6ct5ak4.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%2Fc0s1oq5klkoyl6ct5ak4.png" alt=" " width="164" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functional game on the second attempt&lt;/li&gt;
&lt;li&gt;Game instructions included&lt;/li&gt;
&lt;li&gt;Low token usage (~651)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow generation&lt;/li&gt;
&lt;li&gt;Required a second iteration to fix gameplay speed&lt;/li&gt;
&lt;li&gt;Basic UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🟢 GPT-OSS 20B
&lt;/h3&gt;

&lt;p&gt;This was the &lt;strong&gt;biggest surprise&lt;/strong&gt; of the experiment.&lt;/p&gt;

&lt;p&gt;Generation completed in approximately &lt;strong&gt;3 minutes&lt;/strong&gt;, producing a &lt;strong&gt;single self-contained HTML file&lt;/strong&gt; with all HTML, CSS, and JS included. Token usage clocked in at ~51 — significantly lower than the other models (worth noting: token counting may differ across models, so treat this as directional rather than a strict apples-to-apples comparison).&lt;/p&gt;

&lt;p&gt;Unlike Qwen, the game worked correctly on the &lt;strong&gt;first attempt&lt;/strong&gt;.&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%2Fkc77t1sjgkcmjm39scdf.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%2Fkc77t1sjgkcmjm39scdf.png" alt=" " width="799" height="421"&gt;&lt;/a&gt;&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%2Fo60kb58ehjmu6jbr1m4k.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%2Fo60kb58ehjmu6jbr1m4k.png" alt=" " width="157" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fastest generation by far&lt;/li&gt;
&lt;li&gt;Lowest token usage&lt;/li&gt;
&lt;li&gt;No code changes required&lt;/li&gt;
&lt;li&gt;Score displayed during gameplay&lt;/li&gt;
&lt;li&gt;Instructions included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI is functional but not the most polished&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔵 Gemma 4 26B A4B QAT
&lt;/h3&gt;

&lt;p&gt;Gemma required some extra setup before running correctly — specifically, adding capability entries in LM Studio's model configuration. If you're not comfortable editing model configs, budget a few extra minutes here.&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%2Fo18ay1qzb91byzfilsj3.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%2Fo18ay1qzb91byzfilsj3.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generation took approximately &lt;strong&gt;8 minutes&lt;/strong&gt; and produced &lt;strong&gt;3 files&lt;/strong&gt; (HTML, CSS, JS).&lt;/p&gt;

&lt;p&gt;The output was noticeably more polished visually than the other two models.&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%2F6fqpsgwtyi9un8e66ze7.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%2F6fqpsgwtyi9un8e66ze7.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&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%2Fbd1ud082slm41h0rf5q5.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%2Fbd1ud082slm41h0rf5q5.png" alt=" " width="191" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best-looking interface of the three&lt;/li&gt;
&lt;li&gt;Well-structured project output&lt;/li&gt;
&lt;li&gt;Instructions included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highest token usage (~2170)&lt;/li&gt;
&lt;li&gt;Slower than GPT-OSS&lt;/li&gt;
&lt;li&gt;Requires extra LM Studio configuration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Files&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;UI Quality&lt;/th&gt;
&lt;th&gt;Needed Changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;~3 min&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~51&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B&lt;/td&gt;
&lt;td&gt;~8 min&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;~2170&lt;/td&gt;
&lt;td&gt;⭐ Best&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3 14B&lt;/td&gt;
&lt;td&gt;~9 min&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;~651&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Observations
&lt;/h2&gt;

&lt;p&gt;A few patterns stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-OSS prioritised efficiency&lt;/strong&gt; — working code, fast, no fuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma prioritised presentation&lt;/strong&gt; — the cleanest interface, though it needs configuration upfront.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen produced functional code&lt;/strong&gt; but needed a second pass to be usable.&lt;/li&gt;
&lt;li&gt;All three models completed a real coding task without touching the cloud.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;For my workflow, &lt;strong&gt;GPT-OSS was the clear winner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gemma produced the most polished result, but GPT-OSS delivered the best overall developer experience:&lt;/p&gt;

&lt;p&gt;✅ Fastest generation time&lt;br&gt;&lt;br&gt;
✅ Lowest token consumption&lt;br&gt;&lt;br&gt;
✅ Working solution on the first attempt&lt;br&gt;&lt;br&gt;
✅ Zero additional configuration&lt;br&gt;&lt;br&gt;
✅ Single-file output — easy to review and ship  &lt;/p&gt;

&lt;p&gt;On CPU-only hardware, these differences compound quickly. Waiting 3 minutes instead of 9 — and skipping multiple iterations — makes a real difference to your flow.&lt;/p&gt;

&lt;p&gt;More broadly, this experiment shows how capable modern open-weight models have become. Even on a mid-range laptop with no GPU, you can generate complete applications locally, maintain full privacy, and avoid cloud inference costs entirely.&lt;/p&gt;

&lt;p&gt;If you've tested local models on constrained hardware, I'd love to hear what you found — drop a comment below. 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tested with LM Studio on a 40 GB RAM, CPU-only laptop. Models: GPT-OSS 20B, Qwen 3 14B, Gemma 4 26B A4B QAT.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building a PHP Wedding Planner with Omniroute: My First Experience</title>
      <dc:creator>Nayim Imrit</dc:creator>
      <pubDate>Sun, 26 Jul 2026 10:16:36 +0000</pubDate>
      <link>https://dev.to/naim_im_d327582a887633a6e/building-a-php-wedding-planner-with-omniroute-my-first-experience-jjp</link>
      <guid>https://dev.to/naim_im_d327582a887633a6e/building-a-php-wedding-planner-with-omniroute-my-first-experience-jjp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I tested an AI coding agent with a real university project spec — here's exactly what happened, token by token.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Artificial Intelligence is rapidly changing how we build software. Instead of spending hours scaffolding projects or writing repetitive boilerplate code, AI coding agents are now capable of planning, generating, and even refining applications with minimal input.&lt;/p&gt;

&lt;p&gt;Recently, I had the opportunity to test &lt;strong&gt;Omniroute&lt;/strong&gt; while helping a friend with her final-year university project. She already had a detailed project specification and needed a working PHP template to kick-start her development. Since I had never worked with Twig templating before, I decided this would be the perfect opportunity to see how far an AI-assisted development workflow could go.&lt;/p&gt;

&lt;p&gt;This article shares my experience — from setting up Omniroute to generating a complete project and evaluating the results.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Setting Up Omniroute
&lt;/h2&gt;

&lt;p&gt;I already had an old Claude API key with approximately &lt;strong&gt;$0.20&lt;/strong&gt; of credit remaining, so I decided to use it for this experiment.&lt;/p&gt;

&lt;p&gt;To install and configure Omniroute, I followed this setup tutorial:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CMzyOiUyEVc?start=92"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;After following the installation steps, my directory structure looked like this:&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%2Fqrquz0civ4ejx1dp8fmd.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%2Fqrquz0civ4ejx1dp8fmd.png" alt="Initial Omniroute directory" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Improving the AI's Coding Standards
&lt;/h2&gt;

&lt;p&gt;One feature I particularly liked was Omniroute's ability to customise the AI's behaviour through the &lt;code&gt;.agent&lt;/code&gt; configuration file.&lt;/p&gt;

&lt;p&gt;I configured Claude with modern development guidance so that it would generate code following current best practices instead of relying on outdated programming patterns.&lt;/p&gt;

&lt;p&gt;I used the following guide as inspiration:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://share.google/oRK9QBgjXKQogYPYA" rel="noopener noreferrer"&gt;How to Stop Your AI Coding Agent from Writing Outdated Code with Modern Web Guidance&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Although this step is optional, I would highly recommend it. Small improvements to the agent's instructions can significantly improve the quality and consistency of the generated code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📋 Preparing the Project
&lt;/h2&gt;

&lt;p&gt;My friend had already written all of the project requirements, including both the functional and non-functional specifications.&lt;/p&gt;

&lt;p&gt;I created a new project folder called &lt;code&gt;wedmauritius&lt;/code&gt; inside my XAMPP &lt;code&gt;htdocs&lt;/code&gt; directory and copied her requirements into a file named:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;newProjectRequirement.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything was ready, I simply asked Claude whether it could access and understand the requirements document.&lt;/p&gt;

&lt;p&gt;Instead of immediately generating code, Omniroute &lt;strong&gt;analysed the project and asked whether I wanted it to create a development plan&lt;/strong&gt; before executing the implementation.&lt;/p&gt;

&lt;p&gt;I found this particularly impressive because it approached the project much like an experienced software developer would — understanding the requirements first before writing any code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Generating the Application
&lt;/h2&gt;

&lt;p&gt;After confirming the execution plan, Omniroute began building the project automatically.&lt;/p&gt;

&lt;p&gt;The development process required very little manual intervention. It generated the project structure, organised the files appropriately, and implemented the requested functionality based on the specification document.&lt;/p&gt;

&lt;p&gt;The final project directory looked like this:&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%2Fj2ukt3hmtnvbf5vy9sod.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%2Fj2ukt3hmtnvbf5vy9sod.png" alt="Final project directory" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Omniroute Dashboard
&lt;/h2&gt;

&lt;p&gt;When Omniroute starts, it automatically launches its web dashboard. From here you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor development sessions&lt;/li&gt;
&lt;li&gt;Configure quotas&lt;/li&gt;
&lt;li&gt;Review usage statistics&lt;/li&gt;
&lt;li&gt;Manage other application settings&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Security note:&lt;/strong&gt; The default login password is &lt;code&gt;CHANGEME&lt;/code&gt;. If you're installing Omniroute for the first time, remember to change this before using it regularly.&lt;/p&gt;
&lt;/blockquote&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%2F66y2x4670085qptz9usc.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%2F66y2x4670085qptz9usc.png" alt="Omniroute dashboard" width="696" height="406"&gt;&lt;/a&gt;&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%2Fwqik775928zq8iw99w5g.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%2Fwqik775928zq8iw99w5g.png" alt="Omniroute dashboard settings" width="753" height="383"&gt;&lt;/a&gt;&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%2F4rabdut6267kco8ibwt3.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%2F4rabdut6267kco8ibwt3.png" alt="Omniroute quota config" width="691" height="351"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ The Results
&lt;/h2&gt;

&lt;p&gt;Overall, I was pleasantly surprised by the quality of the generated application.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total tokens consumed&lt;/td&gt;
&lt;td&gt;~250,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional API cost&lt;/td&gt;
&lt;td&gt;~$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual interventions needed&lt;/td&gt;
&lt;td&gt;1 (CSS fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output quality&lt;/td&gt;
&lt;td&gt;Production-ready starting point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rather than producing a rough prototype, Omniroute generated a &lt;strong&gt;solid starting point&lt;/strong&gt; that my friend could immediately continue developing. For anyone beginning a university project or building an internal prototype, this can save many hours of initial setup work.&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%2Fl6f724d6wl9ia799eplo.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%2Fl6f724d6wl9ia799eplo.png" alt="Generated application result" width="586" height="268"&gt;&lt;/a&gt;&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%2Flgtjfp5x4o2wjofmm593.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%2Flgtjfp5x4o2wjofmm593.png" alt="Application pages" width="588" height="314"&gt;&lt;/a&gt;&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%2Ft7l13vwz0ozjiyyjjch8.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%2Ft7l13vwz0ozjiyyjjch8.png" alt="Application pages continued" width="594" height="319"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔢 Token Usage
&lt;/h2&gt;

&lt;p&gt;One of the more interesting parts of this experiment was the token consumption.&lt;/p&gt;

&lt;p&gt;Although my Claude account had virtually no remaining credit, Omniroute continued the development using available free-tier endpoints to complete the project.&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%2F2xavhkvphgg87qbkldja.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%2F2xavhkvphgg87qbkldja.png" alt="Token consumption summary" width="641" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An additional &lt;strong&gt;$0.50&lt;/strong&gt; worth of tokens was consumed during the process — remarkably cost-effective for what was generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Testing the Generated Website
&lt;/h2&gt;

&lt;p&gt;Once the project had been generated, I tested the application manually. Overall, everything worked remarkably well.&lt;/p&gt;

&lt;p&gt;The only issue I noticed was a small CSS problem — &lt;strong&gt;the navigation bar was not remaining sticky while scrolling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than fixing it manually, I simply opened another Omniroute session and asked Claude to correct the issue. It did so without any fuss, which demonstrates one of the biggest advantages of AI-assisted development: &lt;strong&gt;rapid iteration&lt;/strong&gt;.&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%2Flvapl4onpomg9rtq9zqz.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%2Flvapl4onpomg9rtq9zqz.png" alt="Generated website preview" width="718" height="416"&gt;&lt;/a&gt;&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%2F3awkyolt4hnz35ulr56q.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%2F3awkyolt4hnz35ulr56q.png" alt="Website pages" width="715" height="416"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;This was my first real project using Omniroute, and I came away genuinely impressed.&lt;/p&gt;

&lt;p&gt;What stood out most wasn't just its ability to generate code — it was &lt;strong&gt;the workflow&lt;/strong&gt;. Omniroute analysed the requirements, proposed a development plan, and then executed that plan with very little guidance. That makes it feel less like an autocomplete tool and more like collaborating with a junior developer who can rapidly scaffold an application.&lt;/p&gt;

&lt;p&gt;Of course, AI-generated applications still require testing, code review, and refinement. Minor issues — such as the CSS bug I encountered — are to be expected. However, those are small trade-offs considering the amount of time saved during the initial development phase.&lt;/p&gt;

&lt;p&gt;If you're looking for a way to bootstrap small PHP applications, university projects, proof-of-concepts, or internal tools, &lt;strong&gt;Omniroute is worth exploring&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don't see it replacing software developers anytime soon — but it certainly makes them significantly more productive.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Have you tried Omniroute or a similar AI coding agent? I'd love to hear about your experience in the comments below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
