<?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: Yuval</title>
    <description>The latest articles on DEV Community by Yuval (@suede).</description>
    <link>https://dev.to/suede</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%2F1039565%2F22d54942-7848-4dca-9943-72b37d54026d.jpeg</url>
      <title>DEV Community: Yuval</title>
      <link>https://dev.to/suede</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suede"/>
    <language>en</language>
    <item>
      <title>I built an MCP server that turns one app screenshot into a 10-second video ad</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:17:21 +0000</pubDate>
      <link>https://dev.to/suede/i-built-an-mcp-server-that-turns-one-app-screenshot-into-a-10-second-video-ad-56c3</link>
      <guid>https://dev.to/suede/i-built-an-mcp-server-that-turns-one-app-screenshot-into-a-10-second-video-ad-56c3</guid>
      <description>&lt;p&gt;I'm Yuval, a solo founder. I built agent-media to solve a small, annoying problem: you have an app or a product, you need a short vertical video ad, and you don't want to film anything or hire creators.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You give it one app screenshot or one product photo. It returns a 10-second vertical UGC-style video ad: an AI creator holding your phone or product and talking about it. It's made for TikTok, Reels and Shorts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use it from your AI client through MCP
&lt;/h2&gt;

&lt;p&gt;agent-media runs a remote MCP server. You connect it once in Claude, ChatGPT, Cursor or Codex, describe the ad in plain language, and the video comes back in the chat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote MCP server: &lt;a href="https://api.agent-media.ai/mcp" rel="noopener noreferrer"&gt;https://api.agent-media.ai/mcp&lt;/a&gt; (sign-in required)- Setup for each client: &lt;a href="https://agent-media.ai/connect-" rel="noopener noreferrer"&gt;https://agent-media.ai/connect-&lt;/a&gt; Docs: &lt;a href="https://docs.agent-media.ai-" rel="noopener noreferrer"&gt;https://docs.agent-media.ai-&lt;/a&gt; Local option: npx -y -p @agentmedia/mcp-server@latest agent-media-mcp, with AGENT_MEDIA_API_KEY set## Why MCP
Ad creation usually means switching between a script doc, a video tool and a file manager. Calling it from the tool you already work in (your editor or your chat assistant) removes most of that switching. The web Studio is there too if you prefer a normal interface.
## Try it
Plans start at $14.90/month, with no watermark. We launch on Product Hunt on Nov 1: &lt;a href="https://www.producthunt.com/products/agent-media?launch=agent-media" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/agent-media?launch=agent-media&lt;/a&gt;
Site: &lt;a href="https://agent-media.ai/?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;https://agent-media.ai/?utm_source=devto&amp;amp;utm_medium=article&lt;/a&gt;
I'd love feedback from anyone who tries the MCP server, especially on which clients and workflows you'd want next.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>showdev</category>
      <category>ai</category>
      <category>startup</category>
    </item>
    <item>
      <title>Arcads Alternative: How to Choose an AI UGC Ad Tool When You Are a Solo Founder</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:47:53 +0000</pubDate>
      <link>https://dev.to/suede/arcads-alternative-how-to-choose-an-ai-ugc-ad-tool-when-you-are-a-solo-founder-jlg</link>
      <guid>https://dev.to/suede/arcads-alternative-how-to-choose-an-ai-ugc-ad-tool-when-you-are-a-solo-founder-jlg</guid>
      <description>&lt;p&gt;If you are searching for an Arcads alternative, the short answer is this: decide what you actually need for your next month of ads (how many videos, what format, what budget), then compare tools on five things: entry price, watermark and usage rights, speed, how you make the ads, and what you have to give the tool. The right alternative is the one that lets you test the most hooks for the least money. This guide gives you a checklist to do that comparison honestly, without relying on marketing pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why people look for an Arcads alternative
&lt;/h2&gt;

&lt;p&gt;Arcads helped make AI UGC ads a normal thing to try. AI-generated creators talking to camera about a product are now a standard format on TikTok, Reels and Shorts. When a category grows, the reasons to look around grow with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Budget.&lt;/strong&gt; A solo founder testing their first ads has a very different budget from an agency running dozens of clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume.&lt;/strong&gt; Some people need a few videos a month to test hooks. Others need hundreds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow.&lt;/strong&gt; Some want a web editor. Others want to make ads without leaving the tools they already use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format.&lt;/strong&gt; An app founder needs a phone on screen. A physical product brand needs the product in hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these mean one tool is "bad". They mean the best fit depends on your stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist: how to compare Arcads alternatives
&lt;/h2&gt;

&lt;p&gt;Open each tool's pricing page and write down the answers. Pricing pages change often, so check the date and do not trust old blog posts or old tweets (including comparison posts like this one).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Entry price and what it buys
&lt;/h3&gt;

&lt;p&gt;Look at the cheapest plan and ask: how many finished videos does it actually produce? Many tools price in credits, so convert credits into "ads per month" at the length and resolution you need. A cheap plan that only makes two videos may cost more per test than a pricier plan that makes twenty.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Watermark and commercial rights
&lt;/h3&gt;

&lt;p&gt;Check whether the cheapest plan adds a watermark, and whether commercial use, including running the video as a paid ad, is included. A watermarked video is fine for a pitch deck but useless on a paid campaign.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Speed
&lt;/h3&gt;

&lt;p&gt;How long from "make this" to a downloadable file? If you want to test five hooks this afternoon, minutes matter. Try one video before committing to a yearly plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How you make the ads
&lt;/h3&gt;

&lt;p&gt;There are two broad workflows now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Web editor.&lt;/strong&gt; You open a studio, upload assets, pick a creator and a script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From an AI chat.&lt;/strong&gt; Some tools offer an MCP server (Model Context Protocol, the standard way to plug tools into AI assistants), so you can ask Claude, ChatGPT or Cursor for an ad in plain language and get the video back in the chat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you already spend your day in an AI assistant, the second workflow removes a lot of clicking.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. What you have to give the tool
&lt;/h3&gt;

&lt;p&gt;Some tools want a full script. Others work from a product link, one photo or one line of text. Less input means faster tests, but check that the output still shows your real product clearly.&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%2Fhd2jztiblzqkaz0ahbww.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%2Fhd2jztiblzqkaz0ahbww.jpg" alt="The agent-media Studio" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick way to test any alternative
&lt;/h2&gt;

&lt;p&gt;Do not decide from feature tables. Run the same small test on every tool you shortlist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick one product and one problem it solves.&lt;/li&gt;
&lt;li&gt;Write three hooks for that problem (a problem hook, a discovery hook, a before and after hook).&lt;/li&gt;
&lt;li&gt;Make one 10-second vertical video per hook on each tool.&lt;/li&gt;
&lt;li&gt;Compare the results side by side: does the product look real, is the screen or label readable, does the first second grab you?&lt;/li&gt;
&lt;li&gt;Put a small budget behind the best version of each hook and let the numbers decide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This costs a little time but saves you from paying for months of a tool that does not fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where agent-media fits
&lt;/h2&gt;

&lt;p&gt;I am a solo founder and I built &lt;a href="https://agent-media.ai/?utm_source=devto&amp;amp;utm_medium=seo&amp;amp;utm_campaign=arcads-alternative" rel="noopener noreferrer"&gt;agent-media&lt;/a&gt; for the testing stage described above. You give it an app screenshot or a product photo and get back a 10-second vertical UGC video ad: an AI creator holding your phone or product and talking about it. No filming, no actors. The creators are AI-generated, and the site says so.&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%2Fuv8nvbts8i3fmfnz76ci.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%2Fuv8nvbts8i3fmfnz76ci.jpg" alt="An AI creator made with agent-media" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it lines up with the checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entry price:&lt;/strong&gt; plans start at $14.90/mo (Just checking), then $39 (Solo founder) and $99 (Real business).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watermark and rights:&lt;/strong&gt; no watermark, and commercial use including paid ads is included on paid plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; minutes per ad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow:&lt;/strong&gt; the web Studio, or straight from Claude, ChatGPT or Cursor via MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; one app screenshot, one product photo, a product link, or one line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no free trial. If you pay and make no ad, the first payment is refunded within 7 days. You download the MP4 and post it yourself.&lt;/p&gt;

&lt;p&gt;If you want a side by side view, we keep a dated comparison page here: &lt;a href="https://agent-media.ai/compare/arcads-alternative" rel="noopener noreferrer"&gt;agent-media vs Arcads&lt;/a&gt;. We also compare &lt;a href="https://agent-media.ai/compare/makeugc-alternative" rel="noopener noreferrer"&gt;MakeUGC&lt;/a&gt;, &lt;a href="https://agent-media.ai/compare/creatify-alternative" rel="noopener noreferrer"&gt;Creatify&lt;/a&gt; and the &lt;a href="https://agent-media.ai/compare/cheapest-ai-video" rel="noopener noreferrer"&gt;cheapest AI video tools&lt;/a&gt;. Check each tool's own pricing page too, since prices move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes when switching tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comparing on monthly price only.&lt;/strong&gt; Compare cost per usable ad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring the watermark.&lt;/strong&gt; Check the plan you will actually buy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing one video.&lt;/strong&gt; One output tells you nothing. Test three hooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switching mid-test.&lt;/strong&gt; Finish a test on one tool before judging it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting rights.&lt;/strong&gt; Make sure paid ad use is allowed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best Arcads alternative is not a single name. It is the tool that fits your budget, your workflow and your format, and lets you find a winning hook fast. Run the checklist, run the three-hook test, and let your own numbers pick.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>startup</category>
      <category>saas</category>
    </item>
    <item>
      <title>How to Make TikTok Ads for an App: A Practical Guide for Solo Founders</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Sun, 25 Oct 2026 20:25:18 +0000</pubDate>
      <link>https://dev.to/suede/how-to-make-tiktok-ads-for-an-app-a-practical-guide-for-solo-founders-1m0l</link>
      <guid>https://dev.to/suede/how-to-make-tiktok-ads-for-an-app-a-practical-guide-for-solo-founders-1m0l</guid>
      <description>&lt;p&gt;If you want to know how to make TikTok ads for an app, here is the short answer: pick one problem your app solves, write three different hooks for it, film or generate a vertical video around 10 seconds long that shows the app on a phone, and test the hooks with a small budget before you spend real money on creators. The hook matters more than the edit. The rest of this guide walks through each step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why app ads on TikTok are different
&lt;/h2&gt;

&lt;p&gt;People on TikTok are not looking for apps. They are scrolling. Your ad has to look like the content around it, earn the next second, and make the app feel useful before the viewer swipes away. Polished brand videos with a logo intro usually lose to a person holding a phone and talking plainly about a problem.&lt;/p&gt;

&lt;p&gt;That is good news if you are a solo founder. You do not need a studio. You need a clear message and a way to test many versions quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step: how to make TikTok ads for an app
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pick one problem, not a feature list
&lt;/h3&gt;

&lt;p&gt;Write down the single problem your app solves for one type of person. "Track your expenses" is a feature. "I never know where my money went at the end of the month" is a problem. One ad, one problem. If your app solves three problems, that is three ads, not one ad with three points.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Write three hooks for that problem
&lt;/h3&gt;

&lt;p&gt;The hook is the first one to two seconds. It decides whether anyone sees the rest. Write three hooks with different angles so you can learn which one works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. &lt;strong&gt;Problem hook:&lt;/strong&gt; "If you never know where your money went this month, watch this."- 2. &lt;strong&gt;Discovery hook:&lt;/strong&gt; "I found an app that finally made me stop overspending."- 3. &lt;strong&gt;Before and after hook:&lt;/strong&gt; "This was my budget in January. This is it now."
Do not open with your app name or logo. Nobody knows it yet, so it gives them no reason to stay.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Keep it short and vertical
&lt;/h3&gt;

&lt;p&gt;Use 9:16 vertical video. Aim for around 10 seconds for a first test. Short ads are cheaper to make, easier to watch to the end, and faster to iterate. A simple structure works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seconds 0 to 2: the hook- Seconds 2 to 7: show the app on a phone solving the problem- Seconds 7 to 10: one clear next step, like "link in bio" or "try it today"
### 4. Show the phone, with a person&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most common format for app ads is a person holding a phone and talking to the camera as if recommending it to a friend. This is the UGC (user generated content) style. It works because it looks native to the feed and shows the product in use.&lt;/p&gt;

&lt;p&gt;Make sure the screen is readable. Use your best screen: the moment the app delivers value, not the login page or the settings menu.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Add captions
&lt;/h3&gt;

&lt;p&gt;Many people watch with the sound off. Burn in captions for the key lines, especially the hook. Keep the text large and inside the safe area, away from the bottom where TikTok puts its own buttons and caption.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Make several versions at once
&lt;/h3&gt;

&lt;p&gt;Do not make one ad and wait. Make three to five versions: same app, different hooks, maybe a different person or setting. You are not trying to make the perfect ad on day one. You are trying to find which angle gets attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Test with a small budget, then scale the winner
&lt;/h3&gt;

&lt;p&gt;Run the versions side by side with a small daily budget. Watch the early signals: how many people watch past the first seconds, and how many click. Kill the losers fast. When one hook clearly wins, put more budget behind it and make new variations of that winning angle.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Pay real creators only for proven angles
&lt;/h3&gt;

&lt;p&gt;Real creators can be great, but they cost time and money, and most first ideas do not work. Test the hook cheaply first. Once you know which message gets clicks, brief a real creator to redo that exact angle. You will waste far less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ways to produce the video
&lt;/h2&gt;

&lt;p&gt;You have three realistic options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. &lt;strong&gt;Film it yourself.&lt;/strong&gt; Free, but slow, and not everyone is comfortable on camera.- 2. &lt;strong&gt;Hire UGC creators.&lt;/strong&gt; Authentic, but you pay per video and wait for delivery, which makes testing many hooks expensive.- 3. &lt;strong&gt;Use an AI UGC tool.&lt;/strong&gt; Fast and cheap for testing many versions. The creators are AI-generated, so use it to find the winning angle quickly.
For option 3, I built agent-media (&lt;a href="https://agent-media.ai/?utm_source=devto&amp;amp;utm_medium=seo&amp;amp;utm_campaign=how-to-make-tiktok-ads-for-an-app" rel="noopener noreferrer"&gt;https://agent-media.ai/?utm_source=devto&amp;amp;utm_medium=seo&amp;amp;utm_campaign=how-to-make-tiktok-ads-for-an-app&lt;/a&gt;) for exactly this testing stage. You give it an app screenshot and get back a 10-second vertical UGC video ad: an AI creator holding your phone and talking about it. No filming, no actors. You can use it in the web Studio or straight from Claude, ChatGPT or Cursor via MCP. Plans start at $14.90/mo with no watermark. You download the MP4 and post it yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are comparing AI video tools by price, we keep a dated comparison here: cheapest AI video tools for ads (&lt;a href="https://agent-media.ai/compare/cheapest-ai-video" rel="noopener noreferrer"&gt;https://agent-media.ai/compare/cheapest-ai-video&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opening with the logo.&lt;/strong&gt; Start with the problem.- &lt;strong&gt;Explaining every feature.&lt;/strong&gt; One problem per ad.- &lt;strong&gt;Unreadable screens.&lt;/strong&gt; Zoom in on the moment that matters.- &lt;strong&gt;One version only.&lt;/strong&gt; You cannot learn from a single ad.- &lt;strong&gt;Scaling too early.&lt;/strong&gt; Wait until one hook clearly beats the others.
Making TikTok ads for an app is mostly a testing game. The founders who win are not the ones with the best first ad. They are the ones who test the most hooks for the least money and double down on what works.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>marketing</category>
      <category>startup</category>
      <category>mobile</category>
      <category>ai</category>
    </item>
    <item>
      <title>Nice article</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Sun, 28 Jun 2026 17:00:33 +0000</pubDate>
      <link>https://dev.to/suede/nice-article-261j</link>
      <guid>https://dev.to/suede/nice-article-261j</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackneuron/i-put-cloudflare-in-front-of-my-site-then-found-my-origin-one-dns-record-away-from-undoing-it-49bf" class="crayons-story__hidden-navigation-link"&gt;I put Cloudflare in front of my site, then found my origin one DNS record away from undoing it&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackneuron" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4006713%2Ffdd4a936-d6b9-4e89-a8e7-439de7b232c8.png" alt="blackneuron profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackneuron" class="crayons-story__secondary fw-medium m:hidden"&gt;
              BlackNeuron
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                BlackNeuron
                
              
              &lt;div id="story-author-preview-content-4013677" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackneuron" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4006713%2Ffdd4a936-d6b9-4e89-a8e7-439de7b232c8.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;BlackNeuron&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackneuron/i-put-cloudflare-in-front-of-my-site-then-found-my-origin-one-dns-record-away-from-undoing-it-49bf" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackneuron/i-put-cloudflare-in-front-of-my-site-then-found-my-origin-one-dns-record-away-from-undoing-it-49bf" id="article-link-4013677"&gt;
          I put Cloudflare in front of my site, then found my origin one DNS record away from undoing it
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cybersecurity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cybersecurity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/infrastructure"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;infrastructure&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/networking"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;networking&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackneuron/i-put-cloudflare-in-front-of-my-site-then-found-my-origin-one-dns-record-away-from-undoing-it-49bf" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackneuron/i-put-cloudflare-in-front-of-my-site-then-found-my-origin-one-dns-record-away-from-undoing-it-49bf#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>networking</category>
      <category>security</category>
    </item>
    <item>
      <title>I Made My Claude AI Agents Invent Their Own Language. It Cut Token Costs by 63%.</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Fri, 06 Feb 2026 09:11:53 +0000</pubDate>
      <link>https://dev.to/suede/i-made-my-claude-ai-agents-invent-their-own-language-it-cut-token-costs-by-63-1lag</link>
      <guid>https://dev.to/suede/i-made-my-claude-ai-agents-invent-their-own-language-it-cut-token-costs-by-63-1lag</guid>
      <description>&lt;h2&gt;
  
  
  The Moment I Realized Agents Are Terrible at Talking to Each Other
&lt;/h2&gt;

&lt;p&gt;I was running a team of 4 AI agents on a real project — a TikTok-style kids video platform built with Next.js and Fastify. One agent rewrites the scroll system, one audits for bugs, one fixes them, one polishes the UI.&lt;/p&gt;

&lt;p&gt;They were crushing it. 24 bugs found, 16 fixed, a full component rewrite — all in ~8 minutes.&lt;/p&gt;

&lt;p&gt;But when I looked at the inter-agent messages, I saw this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hi team! I've finished working on the VideoFeed component. I removed all the console.log statements (there were 12 of them) and changed the animation from translateY to CSS scroll-snap. Everything compiles cleanly now. Let me know if you need anything else!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;~40 tokens.&lt;/strong&gt; For a status update. Multiply that by hundreds of messages across 4 agents, and you're burning tokens on &lt;em&gt;"Hi team!"&lt;/em&gt; and &lt;em&gt;"Let me know if you need anything!"&lt;/em&gt; — words that add zero value to an AI-to-AI conversation.&lt;/p&gt;

&lt;p&gt;So I asked: &lt;strong&gt;what if agents spoke their own language?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet AgentSpeak: A Protocol Agents Actually Want to Use
&lt;/h2&gt;

&lt;p&gt;The same message in AgentSpeak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;delta VF ~translateY-&amp;gt;scroll-snap -12log. tsc clean.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;~15 tokens.&lt;/strong&gt; Same information. No filler.&lt;/p&gt;

&lt;p&gt;Here's how it breaks down:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Status: Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File: VideoFeed.tsx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~translateY-&amp;gt;scroll-snap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Changed: old method to new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-12log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed 12 console.logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tsc clean.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TypeScript compiler passes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  The Building Blocks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Status codes&lt;/strong&gt; use Greek letters — short, distinctive, no ambiguity:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alpha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Starting&lt;/td&gt;
&lt;td&gt;Agent picks up a task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;td&gt;Progress update, no blockers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gamma&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Blocked&lt;/td&gt;
&lt;td&gt;Waiting on another agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;td&gt;Task complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;epsilon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bug&lt;/td&gt;
&lt;td&gt;Reporting an issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;omega&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shutdown&lt;/td&gt;
&lt;td&gt;Wrapping up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt; are single characters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+adminOnly middleware&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-12 console.logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Changed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~SHA256-&amp;gt;bcrypt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Broken&lt;/td&gt;
&lt;td&gt;&lt;code&gt;!auth bypass L140&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Need&lt;/td&gt;
&lt;td&gt;&lt;code&gt;? coder: VF status&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Becomes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~translateY-&amp;gt;scroll-snap&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;File shortcodes&lt;/strong&gt; eliminate long paths:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VF = VideoFeed.tsx      VS = VideoSlide.tsx
AC = api-client.ts      GC = globals.css
CF = config/index.ts    RT = routes file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World: A 4-Agent Sprint
&lt;/h2&gt;

&lt;p&gt;Here's how the protocol played out in a real session. Five agents (lead + 4 teammates) working on a Next.js + Fastify codebase simultaneously.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Flow
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lead ──&amp;gt; Coder:     "Rewrite VF scroll-snap"
Lead ──&amp;gt; QA:        "Audit codebase"
Lead ──&amp;gt; Bugfix:    "Fix imports, types, cleanup"
Lead ──&amp;gt; UI Expert: "TikTok UI polish"

         ╔══════════════════════════════╗
         ║   All 4 work in parallel     ║
         ╚══════════════════════════════╝

Bugfix  ──&amp;gt; Lead:  "delta EN +3vars, VS ~share btn"
QA      ──&amp;gt; Lead:  "24 findings: 4xP0, 3xP1, 5xP2..."

         ╔══════════════════════════════╗
         ║   Lead routes QA findings    ║
         ╚══════════════════════════════╝

Lead ──&amp;gt; Bugfix:    11 bugs (auth, config, hash)
Lead ──&amp;gt; Coder:     5 VF/VS items
Lead ──&amp;gt; UI Expert: 3 styling items

Bugfix    ──&amp;gt; Lead: "delta 11 fixes. tsc clean."
UI Expert ──&amp;gt; Lead: "delta GC+VS polish. tsc clean."
Coder     ──&amp;gt; Lead: "delta VF+VS+GC scroll-snap. tsc clean."

Lead shuts down: QA → Bugfix → UI → Coder → Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  What QA's Report Looked Like
&lt;/h3&gt;

&lt;p&gt;Instead of paragraphs of prose, QA delivered this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;epsilon P0 content.routes !auth bypass L140-166 missing adminOnly
epsilon P0 engagement.routes !no ownership check L9-19
epsilon P0 content.routes !save/unsave no ownership L86-111
epsilon P1 CF !insecure SIGNING_SECRET default L26
epsilon P1 hash.ts !weak SHA-256 PIN hashing L13
epsilon P2 feed.monitoring !redis.keys O(N) L315
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Six lines. Six critical findings. With file names, line numbers, and severity — everything a bugfix agent needs to act immediately, no follow-up questions.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Bugfix's Completion Report Looked Like
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;delta BUGFIX all QA bugs fixed:
- epsilon0 content.routes +adminOnly L140-166
- epsilon0 engagement.routes +ownership check L9-19
- epsilon1 CF -insecure .default() L26
- epsilon1 hash.ts ~SHA256-&amp;gt;bcrypt
- epsilon2 feed.monitoring ~KEYS-&amp;gt;SCAN
- epsilon2 content.service cursor fix L265
tsc clean. 11 files changed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every fix mapped back to the original finding by severity code and line number. The lead can verify at a glance without reading any code.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Benchmarks (Real Data, Not Theory)
&lt;/h2&gt;

&lt;p&gt;I tokenized 10 real messages from the session using &lt;code&gt;tiktoken&lt;/code&gt; (&lt;code&gt;cl100k_base&lt;/code&gt;) and compared each AgentSpeak message against what the verbose English equivalent would have been.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────┬──────────────────────────┬──────────┬──────────┬─────────┬─────────┐
│ #  │ Message Type             │ AgentSpk │ Verbose  │ Savings │ Ratio   │
├────┼──────────────────────────┼──────────┼──────────┼─────────┼─────────┤
│  1 │ status_start             │      29  │      82  │  64.6%  │   2.8x  │
│  2 │ progress_report          │     325  │     557  │  41.7%  │   1.7x  │
│  3 │ qa_report                │     360  │     986  │  63.5%  │   2.7x  │
│  4 │ lead_routing             │     196  │     503  │  61.0%  │   2.6x  │
│  5 │ task_complete            │     232  │     516  │  55.0%  │   2.2x  │
│  6 │ task_complete_coder      │      59  │     325  │  81.8%  │   5.5x  │
│  7 │ task_complete_ui         │     242  │     784  │  69.1%  │   3.2x  │
│  8 │ lead_routing_coder       │      84  │     393  │  78.6%  │   4.7x  │
│  9 │ shutdown_ack             │      19  │      69  │  72.5%  │   3.6x  │
│ 10 │ cross_agent_coord        │      40  │     100  │  60.0%  │   2.5x  │
├────┼──────────────────────────┼──────────┼──────────┼─────────┼─────────┤
│ ΣΣ │ TOTAL                    │    1586  │    4315  │  63.2%  │   2.7x  │
└────┴──────────────────────────┴──────────┴──────────┴─────────┴─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Per-Agent Breakdown
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;th&gt;Ratio&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coder&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.8%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.5x&lt;/td&gt;
&lt;td&gt;Code status updates compress best&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead&lt;/td&gt;
&lt;td&gt;68.8%&lt;/td&gt;
&lt;td&gt;3.2x&lt;/td&gt;
&lt;td&gt;Routing/assignment messages are formulaic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Expert&lt;/td&gt;
&lt;td&gt;68.1%&lt;/td&gt;
&lt;td&gt;3.2x&lt;/td&gt;
&lt;td&gt;Component-level updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA&lt;/td&gt;
&lt;td&gt;64.1%&lt;/td&gt;
&lt;td&gt;2.8x&lt;/td&gt;
&lt;td&gt;Bug reports with line numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bugfix&lt;/td&gt;
&lt;td&gt;49.3%&lt;/td&gt;
&lt;td&gt;2.0x&lt;/td&gt;
&lt;td&gt;Detailed progress is harder to compress&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;coder&lt;/strong&gt; saw 5.5x compression — code-related status updates (&lt;code&gt;delta VF ~translateY-&amp;gt;scroll-snap&lt;/code&gt;) are the most compressible because they're so formulaic. &lt;strong&gt;Bugfix&lt;/strong&gt; had the lowest ratio at 49.3% because detailed multi-item completion reports inherently carry more information.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cost at Scale (Claude Opus 4.6 Pricing)
&lt;/h3&gt;

&lt;p&gt;Each agent message is &lt;strong&gt;output&lt;/strong&gt; for the sender ($25/MTok) and &lt;strong&gt;input&lt;/strong&gt; for the receiver ($5/MTok). Savings hit both sides:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;th&gt;Tokens Saved&lt;/th&gt;
&lt;th&gt;Input ($5/MTok)&lt;/th&gt;
&lt;th&gt;Output ($25/MTok)&lt;/th&gt;
&lt;th&gt;Combined&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Per session&lt;/td&gt;
&lt;td&gt;2,729&lt;/td&gt;
&lt;td&gt;$0.014&lt;/td&gt;
&lt;td&gt;$0.068&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.082&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 sessions/day&lt;/td&gt;
&lt;td&gt;272,900&lt;/td&gt;
&lt;td&gt;$1.36/day&lt;/td&gt;
&lt;td&gt;$6.82/day&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$8.19/day&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3,000 sessions/mo&lt;/td&gt;
&lt;td&gt;8,187,000&lt;/td&gt;
&lt;td&gt;$40.94/mo&lt;/td&gt;
&lt;td&gt;$204.68/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$245.61/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But the real win isn't dollars — it's &lt;strong&gt;context window&lt;/strong&gt;. Every token you don't waste on "Hi team!" is a token available for actual code reasoning. When your agents hit context limits and start compressing earlier, quality degrades. AgentSpeak pushes that cliff further out.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Patterns That Made It Work
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Hub-and-Spoke, Not Mesh
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         ┌─────────┐
         │  Lead   │
         └────┬────┘
      ┌───────┼───────┐
      ▼       ▼       ▼
  ┌──────┐ ┌──────┐ ┌──────┐
  │Coder │ │Bugfix│ │  QA  │
  └──────┘ └──────┘ └──────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;All messages route through the lead. When QA found 24 bugs, the lead filtered them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;11 bugs to bugfix (backend, auth, config)&lt;/li&gt;
&lt;li&gt;5 items to coder (relevant to the scroll rewrite)&lt;/li&gt;
&lt;li&gt;3 items to UI expert (styling only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without routing, all 4 agents would process all 24 items = wasted tokens on irrelevant findings.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. QA Is Read-Only
&lt;/h3&gt;

&lt;p&gt;QA agents that can edit files will try to fix things. Then they clash with bugfix. Then you get merge conflicts. Then everyone wastes tokens coordinating.&lt;/p&gt;

&lt;p&gt;Instead: &lt;strong&gt;QA reads everything, edits nothing, produces one comprehensive report, shuts down immediately.&lt;/strong&gt; One message, zero conflicts.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. File Ownership = Zero Merge Conflicts
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Coder:     VideoFeed.tsx, VideoSlide.tsx, globals.css (scroll)
Bugfix:    Backend routes, config, api-client.ts
UI Expert: globals.css (visual only), VideoSlide.tsx (styling)
QA:        READ-ONLY (no files)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;4 agents, ~25 files changed, &lt;strong&gt;0 merge conflicts&lt;/strong&gt;. The constraint sounds restrictive but it eliminates an entire class of coordination overhead.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Shut Down Agents Immediately
&lt;/h3&gt;

&lt;p&gt;An idle agent still processes incoming messages and burns tokens. The moment QA delivers their report — shut them down. Don't keep agents around "just in case."&lt;/p&gt;


&lt;h2&gt;
  
  
  The Lesson I Learned the Hard Way
&lt;/h2&gt;

&lt;p&gt;After all 4 agents reported &lt;code&gt;delta ... tsc clean&lt;/code&gt;, I trusted them. Everything compiles, right? Ship it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The scroll was completely broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Turns out the break suggestion component was doing an early return that unmounted the entire scroll container. 3 fast scrolls inflated the video counter, triggered the break screen, and snapped back to video 1. &lt;code&gt;tsc --noEmit&lt;/code&gt; can't catch UX bugs.&lt;/p&gt;

&lt;p&gt;The fix was simple (overlay instead of early return, debounced counter), but the lesson was expensive:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The team lead MUST verify in the actual product.&lt;/strong&gt; Compiler green != working. Always test in the browser.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Add to your project
&lt;/h3&gt;

&lt;p&gt;Drop the protocol file into your &lt;code&gt;CLAUDE.md&lt;/code&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="gu"&gt;## Team Communication Protocol&lt;/span&gt;
All inter-agent messages MUST use AgentSpeak format.
See TEAM_PROTOCOL.md for the full specification.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Define your file shortcodes
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VF = VideoFeed.tsx
VS = VideoSlide.tsx
AC = api-client.ts
# ... your project's key files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Include in spawn prompts
&lt;/h3&gt;

&lt;p&gt;When creating team agents, include the protocol in each agent's spawn prompt. They'll adopt it immediately.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Run the benchmark on your own data
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yuvalsuede/claude-teams-language-protocol
&lt;span class="nb"&gt;cd &lt;/span&gt;claude-teams-language-protocol/benchmarks
npm &lt;span class="nb"&gt;install
&lt;/span&gt;node run-benchmark.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;The full protocol, team patterns, task decomposition guide, token optimization strategies, and real session transcripts are all open source:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yuvalsuede" rel="noopener noreferrer"&gt;
        yuvalsuede
      &lt;/a&gt; / &lt;a href="https://github.com/yuvalsuede/claude-teams-language-protocol" rel="noopener noreferrer"&gt;
        claude-teams-language-protocol
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AgentSpeak: A token-efficient protocol for Claude Code agent teams. Cut inter-agent messaging tokens by 60-70%.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AgentSpeak v2: Token-Efficient Protocol for Claude Code Agent Teams&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cut inter-agent communication tokens by 60-70%&lt;/strong&gt; with a structured, compressed language protocol for &lt;a href="https://code.claude.com/docs/en/agent-teams" rel="nofollow noopener noreferrer"&gt;Claude Code Agent Teams&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;When Claude Code agents communicate in a team, each message consumes tokens. With 4-5 agents messaging each other, token costs scale fast. Default English messages like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I've finished fixing the VideoFeed component. I removed 12 console.log statements and changed the translateY animation to use CSS scroll-snap instead. TypeScript compiles cleanly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;...cost &lt;strong&gt;~40 tokens&lt;/strong&gt;. The same message in AgentSpeak:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;deltaT1 VF ~translateY-&amp;gt;scroll-snap -12log. tsc clean.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;...costs &lt;strong&gt;~15 tokens&lt;/strong&gt;. Multiply across hundreds of inter-agent messages per session.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What's New in v2&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;AgentSpeak v2 integrates with Claude Code's native &lt;a href="https://code.claude.com/docs/en/agent-teams" rel="nofollow noopener noreferrer"&gt;Agent Teams&lt;/a&gt; system, bridging the protocol with shared task lists, hooks, and dependency tracking.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Feature&lt;/th&gt;

&lt;th&gt;v1&lt;/th&gt;

&lt;th&gt;v2&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Status codes + actions&lt;/td&gt;

&lt;td&gt;Yes&lt;/td&gt;

&lt;td&gt;Yes&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;File shortcodes&lt;/td&gt;

&lt;td&gt;Yes&lt;/td&gt;

&lt;td&gt;Yes&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Task ID references&lt;/strong&gt; (&lt;code&gt;T#&lt;/code&gt;)&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yuvalsuede/claude-teams-language-protocol" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;p&gt;What's included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protocol specification&lt;/strong&gt; (drop-in ready)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team composition patterns&lt;/strong&gt; (sprint team, research team, review team)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token optimization playbook&lt;/strong&gt; (5 strategies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task decomposition guide&lt;/strong&gt; (how to split work so agents don't collide)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annotated real-world session transcript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark with real data&lt;/strong&gt; and reproducible results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md template&lt;/strong&gt; ready to copy&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built during a late-night sprint where I got tired of watching agents say "Great work, team!" to each other on my dime.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Architecture of Persistent Memory for Claude Code</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Wed, 28 Jan 2026 10:25:41 +0000</pubDate>
      <link>https://dev.to/suede/the-architecture-of-persistent-memory-for-claude-code-17d</link>
      <guid>https://dev.to/suede/the-architecture-of-persistent-memory-for-claude-code-17d</guid>
      <description>&lt;p&gt;Claude Code is powerful inside a session. But between sessions, it has amnesia. Every new conversation starts from zero. On a complex project, this means spending the first few minutes re-explaining your architecture, your decisions, your conventions, before you can do any real work.&lt;/p&gt;

&lt;p&gt;I built an open-source MCP server called memory-mcp that fixes this. Here's how the architecture works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint that shaped everything
&lt;/h2&gt;

&lt;p&gt;Claude Code already reads a file called CLAUDE.md on every session start. This is baked into how Claude Code works. Whatever is in that file becomes part of Claude's initial context.&lt;/p&gt;

&lt;p&gt;Claude Code also has a hook system. You can register shell commands that fire after every response (Stop), before context compaction (PreCompact), and at session end (SessionEnd).&lt;/p&gt;

&lt;p&gt;These two features, combined, are everything you need for persistent memory. The hooks capture knowledge. CLAUDE.md delivers it. No custom protocols, no external databases, no changes to how Claude Code works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two-tier memory
&lt;/h2&gt;

&lt;p&gt;Not all memory is equal. Some context is needed every session. Some is only needed occasionally. Putting everything into CLAUDE.md wastes the context window. Putting everything into a database means Claude has to actively search for basics.&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIHN1YmdyYXBoICJUaWVyIDE6IEF1dG9tYXRpYyIKICAgICAgICBBWyJDTEFVREUubWQ8YnIvPih%2BMTUwIGxpbmVzKSJdIC0tPnxSZWFkIG9uIHN0YXJ0dXB8IEJbQ2xhdWRlIGhhcyBjb250ZXh0XQogICAgZW5kCiAgICBzdWJncmFwaCAiVGllciAyOiBPbiBEZW1hbmQiCiAgICAgICAgQ1sic3RhdGUuanNvbjxici8%2BKHVubGltaXRlZCkiXSAtLT58TUNQIHRvb2xzfCBEWyJTZWFyY2ggLyBBc2sgLyBSZWxhdGVkIl0KICAgICAgICBEIC0tPiBCCiAgICBlbmQ%3D" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIHN1YmdyYXBoICJUaWVyIDE6IEF1dG9tYXRpYyIKICAgICAgICBBWyJDTEFVREUubWQ8YnIvPih%2BMTUwIGxpbmVzKSJdIC0tPnxSZWFkIG9uIHN0YXJ0dXB8IEJbQ2xhdWRlIGhhcyBjb250ZXh0XQogICAgZW5kCiAgICBzdWJncmFwaCAiVGllciAyOiBPbiBEZW1hbmQiCiAgICAgICAgQ1sic3RhdGUuanNvbjxici8%2BKHVubGltaXRlZCkiXSAtLT58TUNQIHRvb2xzfCBEWyJTZWFyY2ggLyBBc2sgLyBSZWxhdGVkIl0KICAgICAgICBEIC0tPiBCCiAgICBlbmQ%3D" alt="Two-tier memory architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1: CLAUDE.md (~150 lines)&lt;/strong&gt;&lt;br&gt;
A compact briefing document, auto-generated and auto-updated. Contains the most important project knowledge ranked by confidence and access frequency. Claude reads this automatically on startup with zero prompting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2: .memory/state.json (unlimited)&lt;/strong&gt;&lt;br&gt;
The full memory store. Every fact, decision, and observation ever captured. Accessible mid-conversation through MCP tools: keyword search, tag-based queries, and natural language questions synthesized by Haiku.&lt;/p&gt;

&lt;p&gt;80% of sessions need only Tier 1. The other 20% can pull from Tier 2 on demand.&lt;/p&gt;
&lt;h2&gt;
  
  
  The capture 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbSG9vayBmaXJlc10gLS0%2BIEJbUmVhZCB0cmFuc2NyaXB0IGZyb20gY3Vyc29yXQogICAgQiAtLT4gQ3tPdmVyIDYwMDAgY2hhcnN9CiAgICBDIC0tPnxZZXN8IERbU3BsaXQgaW50byBjaHVua3NdCiAgICBDIC0tPnxOb3wgRVtTaW5nbGUgY2h1bmtdCiAgICBEIC0tPiBGW1NlbmQgdG8gSGFpa3Ugd2l0aCBleGlzdGluZyBtZW1vcmllc10KICAgIEUgLS0%2BIEYKICAgIEYgLS0%2BIEdbU3RydWN0dXJlZCBKU09OIHJlc3BvbnNlXQogICAgRyAtLT4gSHtKYWNjYXJkIHNpbWlsYXJpdHkgb3ZlciA2MCBwY3R9CiAgICBIIC0tPnxEdXBsaWNhdGV8IElbU3VwZXJzZWRlIG9sZCBtZW1vcnldCiAgICBIIC0tPnxOZXd8IEpbU2F2ZSBuZXcgbWVtb3J5XQogICAgSSAtLT4gS1tVcGRhdGUgY29uZmlkZW5jZSBhbmQgZGVjYXldCiAgICBKIC0tPiBLCiAgICBLIC0tPiBMe092ZXIgODAgbWVtb3JpZXMgb3IgMTAgZXh0cmFjdGlvbnN9CiAgICBMIC0tPnxZZXN8IE1bTExNIGNvbnNvbGlkYXRpb25dCiAgICBMIC0tPnxOb3wgTltTeW5jIENMQVVERS5tZF0KICAgIE0gLS0%2BIE4%3D" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbSG9vayBmaXJlc10gLS0%2BIEJbUmVhZCB0cmFuc2NyaXB0IGZyb20gY3Vyc29yXQogICAgQiAtLT4gQ3tPdmVyIDYwMDAgY2hhcnN9CiAgICBDIC0tPnxZZXN8IERbU3BsaXQgaW50byBjaHVua3NdCiAgICBDIC0tPnxOb3wgRVtTaW5nbGUgY2h1bmtdCiAgICBEIC0tPiBGW1NlbmQgdG8gSGFpa3Ugd2l0aCBleGlzdGluZyBtZW1vcmllc10KICAgIEUgLS0%2BIEYKICAgIEYgLS0%2BIEdbU3RydWN0dXJlZCBKU09OIHJlc3BvbnNlXQogICAgRyAtLT4gSHtKYWNjYXJkIHNpbWlsYXJpdHkgb3ZlciA2MCBwY3R9CiAgICBIIC0tPnxEdXBsaWNhdGV8IElbU3VwZXJzZWRlIG9sZCBtZW1vcnldCiAgICBIIC0tPnxOZXd8IEpbU2F2ZSBuZXcgbWVtb3J5XQogICAgSSAtLT4gS1tVcGRhdGUgY29uZmlkZW5jZSBhbmQgZGVjYXldCiAgICBKIC0tPiBLCiAgICBLIC0tPiBMe092ZXIgODAgbWVtb3JpZXMgb3IgMTAgZXh0cmFjdGlvbnN9CiAgICBMIC0tPnxZZXN8IE1bTExNIGNvbnNvbGlkYXRpb25dCiAgICBMIC0tPnxOb3wgTltTeW5jIENMQVVERS5tZF0KICAgIE0gLS0%2BIE4%3D" alt="Capture pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a hook fires, the extractor reads the conversation transcript from where it last left off (tracked by a cursor file). If the new content exceeds 6,000 characters, it's chunked to stay within Haiku's sweet spot.&lt;/p&gt;

&lt;p&gt;Each chunk is sent to Haiku with a structured prompt that includes existing memories. This is critical. Without existing context, Haiku would re-extract the same facts every time. With it, Haiku focuses only on genuinely new information.&lt;/p&gt;

&lt;p&gt;Haiku returns JSON. Each memory has a type:&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIHN1YmdyYXBoICJQZXJtYW5lbnQiCiAgICAgICAgQVthcmNoaXRlY3R1cmVdCiAgICAgICAgQltkZWNpc2lvbl0KICAgICAgICBDW3BhdHRlcm5dCiAgICAgICAgRFtnb3RjaGFdCiAgICBlbmQKICAgIHN1YmdyYXBoICJEZWNheWluZyIKICAgICAgICBFWyJwcm9ncmVzczxici8%2BKDcgZGF5IGhhbGYtbGlmZSkiXQogICAgICAgIEZbImNvbnRleHQ8YnIvPigzMCBkYXkgaGFsZi1saWZlKSJdCiAgICBlbmQ%3D" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIHN1YmdyYXBoICJQZXJtYW5lbnQiCiAgICAgICAgQVthcmNoaXRlY3R1cmVdCiAgICAgICAgQltkZWNpc2lvbl0KICAgICAgICBDW3BhdHRlcm5dCiAgICAgICAgRFtnb3RjaGFdCiAgICBlbmQKICAgIHN1YmdyYXBoICJEZWNheWluZyIKICAgICAgICBFWyJwcm9ncmVzczxici8%2BKDcgZGF5IGhhbGYtbGlmZSkiXQogICAgICAgIEZbImNvbnRleHQ8YnIvPigzMCBkYXkgaGFsZi1saWZlKSJdCiAgICBlbmQ%3D" alt="Memory types and lifespans"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Types matter because they have different lifespans, which feeds into the decay system. Architecture, decisions, patterns, and gotchas are permanent. Progress fades after 7 days. Context fades after 30.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deduplication: the hard problem
&lt;/h2&gt;

&lt;p&gt;A naive memory system drowns in duplicates within days. The same architectural fact gets mentioned in five conversations. A decision gets re-explained with slightly different wording each time.&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbSW5jb21pbmcgbWVtb3J5XSAtLT4gQltXcml0ZS10aW1lIGRlZHVwIHZpYSBKYWNjYXJkXQogICAgQiAtLT58T3ZlciA2MCBwY3Qgb3ZlcmxhcHwgQ1tTdXBlcnNlZGUgb2xkIGVudHJ5XQogICAgQiAtLT58TmV3IGZhY3R8IERbU2F2ZSB0byBzdG9yZV0KICAgIEQgLS0%2BIEV7RXZlcnkgMTAgZXh0cmFjdGlvbnMgb3Igb3ZlciA4MCBtZW1vcmllc30KICAgIEUgLS0%2BfFllc3wgRltMTE0gY29uc29saWRhdGlvbiBieSBIYWlrdV0KICAgIEUgLS0%2BfE5vfCBHW0FwcGx5IGNvbmZpZGVuY2UgZGVjYXldCiAgICBGIC0tPiBHCiAgICBHIC0tPiBIe0NvbmZpZGVuY2UgYmVsb3cgMC4zfQogICAgSCAtLT58WWVzfCBJW0hpZGRlbiBmcm9tIENMQVVERS5tZCBidXQgc2VhcmNoYWJsZV0KICAgIEggLS0%2BfE5vfCBKW1Zpc2libGUgaW4gQ0xBVURFLm1kXQ%3D%3D" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbSW5jb21pbmcgbWVtb3J5XSAtLT4gQltXcml0ZS10aW1lIGRlZHVwIHZpYSBKYWNjYXJkXQogICAgQiAtLT58T3ZlciA2MCBwY3Qgb3ZlcmxhcHwgQ1tTdXBlcnNlZGUgb2xkIGVudHJ5XQogICAgQiAtLT58TmV3IGZhY3R8IERbU2F2ZSB0byBzdG9yZV0KICAgIEQgLS0%2BIEV7RXZlcnkgMTAgZXh0cmFjdGlvbnMgb3Igb3ZlciA4MCBtZW1vcmllc30KICAgIEUgLS0%2BfFllc3wgRltMTE0gY29uc29saWRhdGlvbiBieSBIYWlrdV0KICAgIEUgLS0%2BfE5vfCBHW0FwcGx5IGNvbmZpZGVuY2UgZGVjYXldCiAgICBGIC0tPiBHCiAgICBHIC0tPiBIe0NvbmZpZGVuY2UgYmVsb3cgMC4zfQogICAgSCAtLT58WWVzfCBJW0hpZGRlbiBmcm9tIENMQVVERS5tZCBidXQgc2VhcmNoYWJsZV0KICAgIEggLS0%2BfE5vfCBKW1Zpc2libGUgaW4gQ0xBVURFLm1kXQ%3D%3D" alt="Deduplication pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three mechanisms prevent this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write-time dedup&lt;/strong&gt;: Every incoming memory is tokenized and compared against existing memories of the same type using Jaccard similarity. If token overlap exceeds 60%, the new memory supersedes the old one rather than creating a duplicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM consolidation&lt;/strong&gt;: Every 10 extractions (or when active memories exceed 80), Haiku reviews all memories grouped by type. It identifies overlapping entries to merge, outdated entries to drop, and contradictions to resolve. This is garbage collection for knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidence decay&lt;/strong&gt;: Each memory has a confidence score (0 to 1). Progress memories decay toward zero over 7 days. Context decays over 30 days. Architecture, decisions, patterns, and gotchas never decay.&lt;/p&gt;

&lt;p&gt;Memories below 0.3 confidence are excluded from CLAUDE.md but remain in the full store, searchable via MCP tools. Nothing is permanently lost, but the active surface area stays clean.&lt;/p&gt;
&lt;h2&gt;
  
  
  The CLAUDE.md budget system
&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbQWxsIGFjdGl2ZSBtZW1vcmllc10gLS0%2BIEJbR3JvdXAgYnkgdHlwZV0KICAgIEIgLS0%2BIENbYXJjaGl0ZWN0dXJlOiAyNSBsaW5lc10KICAgIEIgLS0%2BIERbZGVjaXNpb246IDI1IGxpbmVzXQogICAgQiAtLT4gRVtwYXR0ZXJuOiAyNSBsaW5lc10KICAgIEIgLS0%2BIEZbZ290Y2hhOiAyMCBsaW5lc10KICAgIEIgLS0%2BIEdbcHJvZ3Jlc3M6IDMwIGxpbmVzXQogICAgQiAtLT4gSFtjb250ZXh0OiAxNSBsaW5lc10KICAgIEMgLS0%2BIElbUmFuayBieSBjb25maWRlbmNlIHggYWNjZXNzQ291bnRdCiAgICBEIC0tPiBJCiAgICBFIC0tPiBJCiAgICBGIC0tPiBJCiAgICBHIC0tPiBJCiAgICBIIC0tPiBJCiAgICBJIC0tPiBKW1JlZGlzdHJpYnV0ZSB1bnVzZWQgYnVkZ2V0XQogICAgSiAtLT4gS1tHZW5lcmF0ZSBDTEFVREUubWQgfjE1MCBsaW5lcyBtYXhd" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggVEIKICAgIEFbQWxsIGFjdGl2ZSBtZW1vcmllc10gLS0%2BIEJbR3JvdXAgYnkgdHlwZV0KICAgIEIgLS0%2BIENbYXJjaGl0ZWN0dXJlOiAyNSBsaW5lc10KICAgIEIgLS0%2BIERbZGVjaXNpb246IDI1IGxpbmVzXQogICAgQiAtLT4gRVtwYXR0ZXJuOiAyNSBsaW5lc10KICAgIEIgLS0%2BIEZbZ290Y2hhOiAyMCBsaW5lc10KICAgIEIgLS0%2BIEdbcHJvZ3Jlc3M6IDMwIGxpbmVzXQogICAgQiAtLT4gSFtjb250ZXh0OiAxNSBsaW5lc10KICAgIEMgLS0%2BIElbUmFuayBieSBjb25maWRlbmNlIHggYWNjZXNzQ291bnRdCiAgICBEIC0tPiBJCiAgICBFIC0tPiBJCiAgICBGIC0tPiBJCiAgICBHIC0tPiBJCiAgICBIIC0tPiBJCiAgICBJIC0tPiBKW1JlZGlzdHJpYnV0ZSB1bnVzZWQgYnVkZ2V0XQogICAgSiAtLT4gS1tHZW5lcmF0ZSBDTEFVREUubWQgfjE1MCBsaW5lcyBtYXhd" alt="CLAUDE.md budget allocation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An unbounded CLAUDE.md defeats the purpose. If it grows to 500 lines, you're wasting context window on low-value information.&lt;/p&gt;

&lt;p&gt;The generator allocates a fixed line budget per section: 25 lines for architecture, 25 for decisions, 25 for patterns, 20 for gotchas, 30 for progress, 15 for context. Within each section, memories are ranked by &lt;code&gt;confidence * accessCount&lt;/code&gt;. Frequently recalled, high-confidence memories surface first.&lt;/p&gt;

&lt;p&gt;If a section has unused budget, the surplus redistributes to sections that need more space. If a section overflows, it gets truncated with a note pointing to the MCP search tools.&lt;/p&gt;

&lt;p&gt;The output reads like a briefing document written by someone who deeply understands your project and knows exactly what you need to know right now.&lt;/p&gt;
&lt;h2&gt;
  
  
  MCP tools for deep recall
&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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIEFbQ2xhdWRlIG5lZWRzIGNvbnRleHRdIC0tPiBCe1doaWNoIHRvb2x9CiAgICBCIC0tPnxLZXl3b3Jkc3wgQ1ttZW1vcnlfc2VhcmNoXQogICAgQiAtLT58VG9waWN8IERbbWVtb3J5X3JlbGF0ZWRdCiAgICBCIC0tPnxRdWVzdGlvbnwgRVttZW1vcnlfYXNrIHZpYSBIYWlrdV0KICAgIEMgLS0%2BIEZbUmVzdWx0cyByZXR1cm5lZCB0byBDbGF1ZGVdCiAgICBEIC0tPiBGCiAgICBFIC0tPiBG" 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%2Fmermaid.ink%2Fimg%2FZ3JhcGggTFIKICAgIEFbQ2xhdWRlIG5lZWRzIGNvbnRleHRdIC0tPiBCe1doaWNoIHRvb2x9CiAgICBCIC0tPnxLZXl3b3Jkc3wgQ1ttZW1vcnlfc2VhcmNoXQogICAgQiAtLT58VG9waWN8IERbbWVtb3J5X3JlbGF0ZWRdCiAgICBCIC0tPnxRdWVzdGlvbnwgRVttZW1vcnlfYXNrIHZpYSBIYWlrdV0KICAgIEMgLS0%2BIEZbUmVzdWx0cyByZXR1cm5lZCB0byBDbGF1ZGVdCiAgICBEIC0tPiBGCiAgICBFIC0tPiBG" alt="MCP tools for deep recall"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes Tier 1 isn't enough. Claude might need to remember a specific API design decision from three weeks ago, or the rationale behind a database schema choice. That's where the MCP tools come in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;memory_search&lt;/strong&gt;: keyword search across all memories, ranked by relevance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;memory_related&lt;/strong&gt;: retrieve memories by tag for exploring a topic in depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;memory_ask&lt;/strong&gt;: ask a natural language question, get a synthesized answer from the top 30 matching memories via Haiku&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude uses these tools naturally during conversation when it needs more context than CLAUDE.md provides.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;Haiku is the only external dependency. Each extraction costs ~$0.001. Consolidation costs ~$0.002 every 10 extractions. A full day of active development runs $0.05-0.10. There's no vector database, no embedding API, no infrastructure to maintain.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;This is a focused tool. It doesn't orchestrate multiple agents. It doesn't do vector search. It doesn't coordinate swarms or run consensus algorithms. If you need multi-agent orchestration, look at something like &lt;a href="https://github.com/ruvnet/claude-flow" rel="noopener noreferrer"&gt;claude-flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;memory-mcp does one thing: it makes sure Claude never forgets your project. Silent capture, smart storage, automatic recovery. The simplest architecture that solves the problem.&lt;/p&gt;



&lt;p&gt;&lt;code&gt;npm install -g claude-code-memory &amp;amp;&amp;amp; memory-mcp setup&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yuvalsuede" rel="noopener noreferrer"&gt;
        yuvalsuede
      &lt;/a&gt; / &lt;a href="https://github.com/yuvalsuede/memory-mcp" rel="noopener noreferrer"&gt;
        memory-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Persistent memory for Claude Code — never lose context between sessions
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;memory-mcp&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/claude-code-memory" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b8ca88398860138e17215d4b00b7d021585d0c788757ff53a5a7709327534087/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f636c617564652d636f64652d6d656d6f72792e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/claude-code-memory" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fe0efa241ca3d10619b968dd62b69639768e5a38f2690fc749bcea032900f1a5/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f636c617564652d636f64652d6d656d6f72792e737667" alt="npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/yuvalsuede/memory-mcp/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/yuvalsuede/memory-mcp/package.json" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8f0aa01709dafbe9f00aba61e321d4549bf3de348f23e14f1df46fd6edc2c69b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d25334525334431382d627269676874677265656e2e737667" alt="Node"&gt;&lt;/a&gt;
&lt;a href="https://github.com/yuvalsuede/memory-mcp/tsconfig.json" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/873c146a0ff18b0403e9bbcab20d1ee2e475f57d65014ccd98fa2c61b81087a3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d7374726963742d626c75652e737667" alt="TypeScript"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Persistent memory + automatic git snapshots for Claude Code.&lt;/strong&gt; Never lose context. Never lose code.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;🧠 45 memories | 📊 2.8K tokens | 📸 23 snapshots | ⏱️ 5m ago
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why memory-mcp?&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Re-explaining your project every session&lt;/td&gt;
&lt;td&gt;Auto-captures decisions, patterns, architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context window fills up, knowledge lost&lt;/td&gt;
&lt;td&gt;Two-tier memory: CLAUDE.md (instant) + deep search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broke something, can't remember what worked&lt;/td&gt;
&lt;td&gt;Git snapshots on every save, instant rollback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No idea what Claude "knows" about your project&lt;/td&gt;
&lt;td&gt;Visual dashboard shows all context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worried about cloud storage&lt;/td&gt;
&lt;td&gt;100% local files, your git repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What makes it different&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git Snapshots&lt;/strong&gt; — Every memory save commits your entire project. Roll back anytime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-Tier Memory&lt;/strong&gt; — CLAUDE.md loads instantly, deep store searchable mid-conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-Powered&lt;/strong&gt; — Haiku extracts what matters, consolidates duplicates, prunes stale info.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Dashboard&lt;/strong&gt; — See your context: tokens, memories by type, snapshot history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero friction&lt;/strong&gt; — No commands to run…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yuvalsuede/memory-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>ai</category>
      <category>claude</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Sun, 18 Jan 2026 14:49:13 +0000</pubDate>
      <link>https://dev.to/suede/-12p0</link>
      <guid>https://dev.to/suede/-12p0</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/suede" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1039565%2F22d54942-7848-4dca-9943-72b37d54026d.jpeg" alt="suede"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/suede/i-built-a-markup-language-for-ai-agent-task-output-2l65" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Built a Markup Language for AI Agent Task Output&lt;/h2&gt;
      &lt;h3&gt;Yuval ・ Jan 18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#claude&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>claude</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Markup Language for AI Agent Task Output</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Sun, 18 Jan 2026 13:30:50 +0000</pubDate>
      <link>https://dev.to/suede/i-built-a-markup-language-for-ai-agent-task-output-2l65</link>
      <guid>https://dev.to/suede/i-built-a-markup-language-for-ai-agent-task-output-2l65</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs97biqw8j7bhw9tjqluh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs97biqw8j7bhw9tjqluh.gif" alt=" " width="720" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time I asked Claude or ChatGPT to help me plan a project, I got... chaos.&lt;/p&gt;

&lt;p&gt;Sometimes markdown lists. Sometimes numbered steps. Sometimes JSON. Sometimes a wall of text with tasks buried somewhere in the middle.&lt;/p&gt;

&lt;p&gt;I wanted to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Parse&lt;/strong&gt; the output reliably&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualize&lt;/strong&gt; it in different ways&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track progress&lt;/strong&gt; without copy-pasting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built TaskML.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is TaskML?
&lt;/h2&gt;

&lt;p&gt;TaskML is a lightweight markup language designed for task management. It's human-readable, AI-writable, and instantly parseable.&lt;/p&gt;

&lt;p&gt;Here's what it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@project Website Redesign
@sprint Week 1

[ ] Design homepage #p0 @alice
  [x] Create wireframes
  [~] Build prototype ~2h
[ ] Write copy #p1 @bob ~4h !2024-02-15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a real TaskML document. Let me break it down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@project&lt;/code&gt; / &lt;code&gt;@sprint&lt;/code&gt; - Context blocks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[ ]&lt;/code&gt; - Pending task&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[x]&lt;/code&gt; - Completed task&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[~]&lt;/code&gt; - In progress&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#p0&lt;/code&gt; - Priority (p0 = critical, p3 = low)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@alice&lt;/code&gt; - Assignee&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~4h&lt;/code&gt; - Time estimate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!2024-02-15&lt;/code&gt; - Due date&lt;/li&gt;
&lt;li&gt;Indentation = subtasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Seven Views, One Syntax
&lt;/h2&gt;

&lt;p&gt;The magic happens when you visualize it. TaskML supports seven different views:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. List View
&lt;/h3&gt;

&lt;p&gt;Classic nested task list with status indicators and metadata.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kanban View
&lt;/h3&gt;

&lt;p&gt;Automatic columns based on task status (Pending, In Progress, Completed).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Timeline View
&lt;/h3&gt;

&lt;p&gt;Gantt-chart style view showing duration and due dates.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Table View
&lt;/h3&gt;

&lt;p&gt;Spreadsheet-style with sortable columns for status, priority, assignee, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Tree View
&lt;/h3&gt;

&lt;p&gt;Hierarchical view showing parent-child relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Graph View
&lt;/h3&gt;

&lt;p&gt;Visual node graph showing task dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Summary View
&lt;/h3&gt;

&lt;p&gt;Dashboard with stats: total tasks, completion rate, time estimates, priority breakdown.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The AI Integration Story
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. You can teach any AI to output TaskML with a simple system prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When tracking tasks, projects, or to-dos, always use TaskML format:

@project Project Name
@sprint Sprint Name (optional)

Tasks use checkbox syntax:
[ ] Pending task
[x] Completed task
[~] In progress task
[!] Blocked task

Add metadata inline:
- #p0-#p3 for priority
- @name for assignee
- ~Xh for estimates
- !YYYY-MM-DD for due dates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Claude, ChatGPT, Cursor - they all pick it up instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero Dependencies, Tiny Bundle
&lt;/h2&gt;

&lt;p&gt;As a developer, I have opinions about dependencies. TaskML has none.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero runtime dependencies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~15KB minified + gzipped&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript native&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Works in Node.js and browsers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT licensed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;taskml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;taskml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
  @project My Tasks
  [ ] First task
  [x] Done task
`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Render to HTML&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kanban&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;

&lt;p&gt;I built an interactive playground where you can write TaskML and see it render in real-time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://taskml.dev/playground" rel="noopener noreferrer"&gt;taskml.dev/playground&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The playground includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live editor with syntax highlighting&lt;/li&gt;
&lt;li&gt;All seven view types&lt;/li&gt;
&lt;li&gt;Template examples&lt;/li&gt;
&lt;li&gt;One-click copy/share&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;TaskML is just getting started. On the roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code extension&lt;/li&gt;
&lt;li&gt;Obsidian plugin&lt;/li&gt;
&lt;li&gt;React components&lt;/li&gt;
&lt;li&gt;More AI integrations&lt;/li&gt;
&lt;li&gt;CLI tool&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playground&lt;/strong&gt;: &lt;a href="https://taskml.dev/playground" rel="noopener noreferrer"&gt;taskml.dev/playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/yuvalsuede/taskml" rel="noopener noreferrer"&gt;github.com/yuvalsuede/taskml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://npmjs.com/package/taskml" rel="noopener noreferrer"&gt;npmjs.com/package/taskml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you build something with TaskML, I'd love to see it.&lt;/p&gt;

&lt;p&gt;And if you found this useful, a star on GitHub would mean a lot.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I built a Midjourney API</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Mon, 29 May 2023 12:00:00 +0000</pubDate>
      <link>https://dev.to/suede/how-i-built-a-midjourney-api-2j8h</link>
      <guid>https://dev.to/suede/how-i-built-a-midjourney-api-2j8h</guid>
      <description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/yuval-suede" rel="noopener noreferrer"&gt;Want to see it in action? Follow me on LinkedIn and text me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a Midjourney API:  Breaking Down the Process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/UbGBm1sId2YAxlWZXO/giphy-downsized-large.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/UbGBm1sId2YAxlWZXO/giphy-downsized-large.gif" alt="MidjourneyAPI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're in the world of AI, you've probably heard of Midjourney. It's a powerful tool that transforms text into high-resolution, high-quality images, all within Discord. With an easy-to-use platform and a dynamic user community, it's become a standout tool in the digital landscape.&lt;/p&gt;

&lt;p&gt;If you have your SaaS product, an idea that you need midjourney API for, this can be done. &lt;a href="https://www.linkedin.com/in/yuval-suede/" rel="noopener noreferrer"&gt;Talk to me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/yuval-suede" rel="noopener noreferrer"&gt;Want to see it in action? Follow me on LinkedIn and text me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, while Midjourney doesn't offer an official API, we can still build one to better leverage its capabilities. Here's a breakdown of the process:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Understanding Midjourney:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First things first, we need to grasp how Mindjourney operates on Discord. Users simply interact with an AI bot using commands, and the bot processes these commands to generate images based on the descriptions provided.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting to Midjourney:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without an official API, establishing a connection to Mindjourney involves a Discord bot. To achieve this, we take the following steps:&lt;/p&gt;

&lt;p&gt;Identify and connect a Mindjourney token of your account. This acts as the unique identifier allowing your bot to interact with the Mindjourney platform.&lt;/p&gt;

&lt;p&gt;Clarification: Keep in mind - this is not an API for production, it just a technical article explaining the architecture of a midjourney request, it is not a suggestion to use it in production, or at all. Other than playing around, it is not a business application. &lt;/p&gt;

&lt;p&gt;Create a Discord bot that can listen to our channel. This bot serves as our link between our own systems and Midjourney's image generation capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16aitm5wv5bq1946q388.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16aitm5wv5bq1946q388.png" alt="Adding a Midjourney bot to your server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrating the API:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Upon establishing the connection, we develop a mechanism to interact with our channel and the Midjourney bot. Our API integration requires:&lt;/p&gt;

&lt;p&gt;Posting commands to our channel: The commands instruct the bot to generate specific images.&lt;/p&gt;

&lt;p&gt;Fetching results: After posting commands, our bot listens for and fetches the image generation results.&lt;/p&gt;

&lt;p&gt;Here is an example of how I fetch results using FastAPI and my Discord bot:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

def get_result_from_midjourney():
    '''
        Get request for getting the result of post request
    '''
    get_url = "&amp;lt;your api url&amp;gt;"
    get_payload = {}
    get_headers = {
        'Authorization': some key,
        'Content-Type': 'application/json',
        'Cookie': &amp;lt;my cookie here&amp;gt;
    }
    get_response = requests.request(
        "GET", get_url, headers=get_headers, data=get_payload
    )
    return get_response


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Uploading images to cloud hosting: We use a cloud hosting service (like AWS S3) to store the generated images. This step ensures the scalability and accessibility of our image storage.&lt;/p&gt;

&lt;p&gt;Cropping: The initial response from Midjourney usually delivers images structured as a grid. We need to intelligently crop these images for use in different contexts.&lt;/p&gt;

&lt;p&gt;Returning final images: Once images are processed and stored, we return them through our API, ready for use wherever they are needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oskd02859jzxuzmwuqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oskd02859jzxuzmwuqx.png" alt="Creating images with FastAPI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Facing the Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Naturally, building this interface comes with its fair share of challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do we determine when images are ready? &lt;/li&gt;
&lt;li&gt;How do we handle the cropping of images given the grid structure of the initial response?&lt;/li&gt;
&lt;li&gt;How do we ensure that a returned image corresponds to the specific command we issued?&lt;/li&gt;
&lt;li&gt;How to scale, so I can server multiple concurrent calls? &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Despite these challenges, creating a Midjourney API has the potential to revolutionize how we generate and use digital images. I invite you to join me on this exciting journey as we navigate through these challenges and uncover new possibilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foexr6whrvig8qx91n9o2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foexr6whrvig8qx91n9o2.png" alt="I create AI that works"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out the final solution, &lt;a href="https://www.linkedin.com/mynetwork/discovery-see-all/?usecase=PEOPLE_FOLLOWS&amp;amp;followMember=yuval-suede" rel="noopener noreferrer"&gt;just follow me on linkedin and DM me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have also built a great website that converts any JS code to Typescript - check this out!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://js2ts.com/" rel="noopener noreferrer"&gt;https://js2ts.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>nextjs</category>
      <category>midjourne</category>
      <category>python</category>
    </item>
    <item>
      <title>Build AI Template Engine to create amazing content with Next.js and ChatGPT</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Mon, 20 Mar 2023 11:01:09 +0000</pubDate>
      <link>https://dev.to/suede/build-ai-template-engine-to-create-amazing-content-with-nextjs-and-chatgpt-3f89</link>
      <guid>https://dev.to/suede/build-ai-template-engine-to-create-amazing-content-with-nextjs-and-chatgpt-3f89</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Do you want to master ChatGPT API and build &lt;strong&gt;your own&lt;/strong&gt; generative AI template engine for content creation? &lt;br&gt;
I will show you exactly how I have built and open sourced &lt;a href="https://jema.ai" rel="noopener noreferrer"&gt;&lt;/a&gt;, a jasper.ai clone for creating SEO, blog posts, marketing and basically any content that you will ever need to generate, with AI 🚀&lt;/p&gt;

&lt;p&gt;I have launched it on &lt;a href="https://www.producthunt.com/posts/jema-ai" rel="noopener noreferrer"&gt;ProductHunt&lt;/a&gt; - go ahead and &lt;a href="https://www.producthunt.com/posts/jema-ai" rel="noopener noreferrer"&gt;visit me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can check &lt;a href="https://jema.ai" rel="noopener noreferrer"&gt;this demo&lt;/a&gt; already, it is super cool. And then, let me show you how to build one for yourself (or you can clone my &lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;open source code&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2E5NzNmZTNkYTI3MTZkNzIxZTdjMDg5OTVlMzVhMGY1YmNlODZkMSZjdD1n/Pm8cTtWy4kd7OO94n2/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2E5NzNmZTNkYTI3MTZkNzIxZTdjMDg5OTVlMzVhMGY1YmNlODZkMSZjdD1n/Pm8cTtWy4kd7OO94n2/giphy.gif" alt="Jeam.ai" width="768" height="432"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  About the technologies
&lt;/h2&gt;

&lt;p&gt;We are going to use &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; as our framework and TailwindCSS for styling. I am also going to use Next.js in its TypeScript version. If TS is not your cup of tea, don't worry, it is really straight forward. After so many years of being a web developer, I definitely find Next.js as the fastest go-to-market framework and really one of the best.&lt;/p&gt;

&lt;p&gt;For our AI completion model (well, actually, chat model) we are going to use ChatGPT-3.5 turbo Rest API by &lt;a href="https://platform.openai.com/docs/guides/chat/introduction" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; which was released just recently, and is a real superpower.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a href="https://jema.ai" rel="noopener noreferrer"&gt;Jema.ai&lt;/a&gt; - the first open-source content creator platform.
&lt;/h2&gt;

&lt;p&gt;About myself. I am a full stack developer with over 17 years of experience. My drive for life is building game-changing solutions. As an entrepreneur at heart , I ❤️ building end-to-end systems that not only look amazing and feel state-of-the-art, but also have real meaning and impact.&lt;/p&gt;

&lt;p&gt;I've been working on a generative AI project for the past 7 months, developing impressive platforms for both content and image creation. When the ChatGPT API was released, I began constructing a Jasper.ai alternative capable of generating any type of content in mere seconds. The results were so outstanding that I couldn't resist open-sourcing the project and sharing it with the community.&lt;/p&gt;

&lt;p&gt;I would be very grateful if you can help me out by starring the library ❤️‍🔥❤️‍🔥❤️‍🔥&lt;br&gt;
&lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;https://github.com/yuvalsuede/jasper-alternative-gpt&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's start
&lt;/h2&gt;

&lt;p&gt;Assuming that you have &lt;a href="https://nextjs.org/docs/getting-started" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; project already installed, make sure you have added &lt;a href="https://tailwindcss.com/docs/installation" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; to the project. &lt;/p&gt;

&lt;p&gt;A basic project structure will look somewhat like this one:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xuddr14chu8jgtosi8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xuddr14chu8jgtosi8x.png" alt="Directories" width="372" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first thing I usually do is adding a &lt;code&gt;Layout&lt;/code&gt; component. This will later facilitate adding more pages to our project. &lt;br&gt;
For Jema.ai I used the following layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;min-h-screen relative w-full md:flex md:flex-row&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;md:hidden z-10 fixed left-0 top-0 h-full&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Sidebar&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SIDEBAR_ITEMS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden md:block md:relative &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Sidebar&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SIDEBAR_ITEMS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full md:flex-grow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-black text-2xl font-bold mb-4 mt-10 pr-4 pl-4 pt-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&amp;gt; &lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Fragment&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
javascript&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SIDEBAR_ITEMS&lt;/code&gt; is the list of our menu items, I have used the following, you can add your own of course.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const SIDEBAR_ITEMS: any = [
    {
        label: "Templates",
        url: "/",
    },
    {
        label: "Contact",
        url: "",
        target: "blank"
    },
];

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the sidebar create the following component&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Sidebar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRouter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleSidebar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
                &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;
                z-50
                w-10 h-10 fixed top-4 left-4 z-10 md:hidden bg-white border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toggleSidebar&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`fas fa-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;times&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; text-primary`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;aside&lt;/span&gt;
                &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`bg-white min-h-screen min-h-screen flex flex-col border-r border-gray-200 transition-transform duration-300 ease-in-out transform &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                    &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;translate-x-0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-translate-x-full&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; md:translate-x-0 md:static fixed top-0 left-0 h-full md:min-h-0 md:relative md:w-60 overflow-y-hidden`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-60 flex flex-col items-center justify-center p-4 hover:cursor-pointer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                     &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex flex-col&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/images/Jemaai-logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jema.ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;250&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-lg font-normal text-gray-700 text-center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Open&lt;/span&gt; &lt;span class="nx"&gt;Source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-lg font-semibold text-gray-700  text-center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Jasper&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;
                            &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fas fa-arrow-right text-primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;alternative&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;nav&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;py-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mb-10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex flex-row align-middle justify-center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;
                                    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex max-w-fit items-center justify-center space-x-2 rounded-full border border-gray-300 bg-white px-4 py-2 text-sm text-gray-600 shadow-md transition-colors hover:bg-gray-100 mt-5 animate-wobble&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                                    &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://github.com/yuvalsuede/jasper-alternative-gpt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                                    &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                                    &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noopener noreferrer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Github&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
                                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Star&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;Github&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mb-2 ml-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;
                                        &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blank&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                                        &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                                        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`text-gray-500 hover:text-gray-700 transition duration-300 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                                            &lt;span class="nf"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
                                        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Fragment&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="p"&gt;))}&lt;/span&gt;


                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/nav&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/aside&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Sidebar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this should give you a nice layout of a responsive sidebar and a place to populate our templates, exactly like in Jasper.ai. You should see something like this:&lt;/p&gt;

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

&lt;p&gt;Of course you can add your own logo and menu items to make it yours.&lt;/p&gt;

&lt;p&gt;Next, lets take care of the top categories of our Dashboard (homepage), where we can select our AI templates. Start with the selection menu. Here's a *&lt;em&gt;secret: *&lt;/em&gt; use give ChatGPT-4 a copy of the component that you wish to create (copy element using from any website that you like) and just ask it to create something similar. Here's my code for our &lt;code&gt;category list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;categoriesData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;All&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Blog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;linkedin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LinkedIn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;marketing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Marketing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ecommerce&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ecommerce&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ads&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ads&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Google&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;seo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SEO&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;social-media&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Social Media&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CategoriesList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;onSelectedCategory&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedCategoryId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSelectedCategoryId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;onSelectedCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedCategoryId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedCategoryId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleCategoryChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;categoryId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setSelectedCategoryId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;categoryId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex flex-wrap gap-2 justify-start my-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;categoriesData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
                    &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`cursor-pointer border inline-flex items-center justify-center mr-2 mb-2 px-3.5 py-1 text-sm font-medium rounded-full &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                        &lt;span class="nx"&gt;selectedCategoryId&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
                            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;border-blue-400 bg-blue-400 text-white hover:bg-opacity-100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;border-gray-300 bg-white text-gray-600 hover:text-gray-800 hover:shadow hover:ring-gray-200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleCategoryChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="p"&gt;))}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;CategoriesList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;onSelectedCategory&lt;/code&gt; that we will later use to filter our templates. &lt;/p&gt;

&lt;p&gt;Next, create the cards grid for our template. I wanted it to have an icon, a title, description, and on click to navigate to my specific template page. I have started with the UI, and later added some logic to each template. &lt;/p&gt;

&lt;p&gt;We are going to create something like this one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2y1jihou6qgyw5768s5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2y1jihou6qgyw5768s5.gif" alt="Categories" width="768" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the code of our card grid wrapper. Notice the filter function that filters templates based on category selection made by the &lt;code&gt;onSelectedCategory&lt;/code&gt; of our &lt;code&gt;CategoriesList&lt;/code&gt; component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CategoriesList&lt;/span&gt; &lt;span class="nx"&gt;onSelectedCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSelectCategory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;
                    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-10 justify-items-center place-items-center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;cards&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;selectedCategory&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedCategory&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Card&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                    &lt;span class="p"&gt;))}&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;minHeight&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;300px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#6366F1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;relative p-6 h-full rounded-2xl shadow-sm bg-white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;
                            &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex items-center justify-center w-16 h-16 text-3xl rounded-full mb-4 bg-white text-indigo-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fas fa-robot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h3&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mb-2 text-lg font-bold text-white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Want&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;integrate&lt;/span&gt; &lt;span class="nx"&gt;AI&lt;/span&gt; &lt;span class="nx"&gt;into&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;business&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h3&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.linkedin.com/in/yuval-suede/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                           &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noopener noreferrer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
                           &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mt-5 inline-block px-6 py-2 text-sm font-medium bg-white text-indigo-500 rounded-full shadow-md hover:bg-opacity-90&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Talk&lt;/span&gt;
                            &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check the full &lt;code&gt;Card.tsx&lt;/code&gt; and &lt;code&gt;CategoriesList.tsx&lt;/code&gt; on &lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;my open source repo&lt;/a&gt;. Please don't forget to Start it on Github - this will help a lot  🚀 🔥 🎉&lt;/p&gt;

&lt;p&gt;Lets talk a little bit about ChatGPT 3.5-turbo. &lt;br&gt;
Unlike older models, this is &lt;strong&gt;not a text completion&lt;/strong&gt; model but a &lt;strong&gt;Chat completion&lt;/strong&gt; model, which is entirely different - as this one does not require prior training at all (in fact, for now you cannot train it even if you want to). &lt;/p&gt;

&lt;p&gt;I really recommend playing with ChatGPT turbo model on OpenAI, it's free to try and really great. Go ahead and check their playground:&lt;br&gt;
&lt;a href="https://platform.openai.com/playground?mode=chat&amp;amp;model=gpt-3.5-turbo" rel="noopener noreferrer"&gt;https://platform.openai.com/playground?mode=chat&amp;amp;model=gpt-3.5-turbo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also have a look at their nice and easy documentation &lt;/p&gt;

&lt;p&gt;&lt;a href="https://platform.openai.com/docs/guides/chat" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now here comes the great part. Adding chat completion to our project. Here is the call to &lt;code&gt;ChatGPT 3.5-turbo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Your task is: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mainGoal&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;".\n\nHere are the details:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;instruction&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. 
            Please suggest 3 outputs. number them 1,2,3`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createChatCompletion&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-3.5-turbo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="c1"&gt;// @ts-ignore&lt;/span&gt;
                &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;reply&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error while making the API call:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error while making the API call.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code is very straight forward. We start with a &lt;code&gt;user&lt;/code&gt; message that tells that chat how to act (currently, it's a general role, but you can tell it that he/she is a doctor..).&lt;/p&gt;

&lt;p&gt;Next we focus on user most important command. The structure is : &lt;code&gt;Your task is ... Here are some more details ...&lt;/code&gt; and finally we ask it to generate 3 numbered outputs (this will be important for later parsing the result) &lt;/p&gt;

&lt;p&gt;Since I already know that instructions are a set of inputs of the user, based on my template, I have created the following function to make a list of instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createInstruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TemplateInput&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;inputsData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InputsData&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;inputsData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I made a list of templates that can easily created and added to it. In fact, it takes about 5 minutes to add a new template, while drinking some coffee. &lt;/p&gt;

&lt;p&gt;Here's a basic template structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a1b2-34c5-678d-90ef&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LinkedIn Topic Ideas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get inspired with LinkedIn topic ideas to share with your network.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;command&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Suggest LinkedIn topic ideas to share with my network.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;icon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;i class='fas fab fa-linkedin text-primary'&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;categories&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;linkedin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;social_media&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inputs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;topic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Topic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;placeholder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Marketing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;audience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Audience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;placeholder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Marketers, companies, business owners&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; is used to display the template in a new page (&lt;code&gt;/templates/:id&lt;/code&gt; route)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;categories&lt;/code&gt; are used to filter templates based on our category selection. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;command&lt;/code&gt; is the actual task that we send to ChatGPT ("mainGoal")&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inputs&lt;/code&gt; is a list of input by user, based on our template. You can have as many as you like, you can extend them and chatgpt will understand what you want. That actually works🔥&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now create any layout that you wish to ask users for their inputs, and send the request to ChatGPT (don't forget to set your &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;). Here we call to &lt;code&gt;api/chatgpt.ts&lt;/code&gt; with the code above.&lt;/p&gt;

&lt;p&gt;That's it, you are done!&lt;br&gt;
You can fork the complete repository &lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and run it locally or deploy it to Vercel. &lt;/p&gt;

&lt;p&gt;Go ahead and build your own template engine. &lt;br&gt;
I encourage you to share your project in the comments 🤩 &lt;/p&gt;

&lt;p&gt;Again, you can find the source code here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;https://github.com/yuvalsuede/jasper-alternative-gpt&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you help me?
&lt;/h2&gt;

&lt;p&gt;I would be super grateful if you can star the repository 🤩&lt;/p&gt;

&lt;p&gt;The more stars I get, the more tutorials like this I can create 🚀🚀🚀🚀🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt" rel="noopener noreferrer"&gt;https://github.com/yuvalsuede/jasper-alternative-gpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/sXv0vaA4331Ti/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/sXv0vaA4331Ti/giphy.gif" alt="Categories" width="500" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>chatgpt</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>I open sourced Jasper.ai alternative</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Fri, 17 Mar 2023 10:52:56 +0000</pubDate>
      <link>https://dev.to/suede/i-open-sourced-jasperai-alternative-built-in-4-days-only-using-chatgpt-3a9a</link>
      <guid>https://dev.to/suede/i-open-sourced-jasperai-alternative-built-in-4-days-only-using-chatgpt-3a9a</guid>
      <description>&lt;p&gt;Jasper raises $125M at a $1.5B valuation on October 2022, building an AI platform that helps you be more creative and grow your brand. &lt;/p&gt;

&lt;p&gt;On March 1st 2023, OpenAI has released its ChatGPT 3.5 API, that facilitates operations such text completion models and a very long training process in order to get great results. &lt;/p&gt;

&lt;p&gt;So I was thinking, "why not trying to build a Jasper alternative using ChatGPT?" &lt;/p&gt;

&lt;p&gt;So I started working on it, 4 days ago. I never thought I would actually build a working product, but worth trying..&lt;/p&gt;

&lt;p&gt;I knew that since no training is needed, the hard part will be building a nice UI and later just talk to my brother 😉 ChatGPT nicely, and get the job done. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1anmDu_G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlspeb0ewe6k3e789pmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1anmDu_G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlspeb0ewe6k3e789pmd.png" alt="Image description" width="880" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 days later - &lt;a href="https://jema.ai"&gt;https://jema.ai&lt;/a&gt; is alive, and an open source!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sqVgJhsZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6iw74sawjvfim12ifrv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sqVgJhsZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6iw74sawjvfim12ifrv.gif" alt="Image description" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I build a lot of web applications, writing dozens of components every week. ChatGPT IS changing the world&lt;/p&gt;

&lt;p&gt;Check the full open source repo :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yuvalsuede/jasper-alternative-gpt"&gt;https://github.com/yuvalsuede/jasper-alternative-gpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please give me a star so I know I did something good 🙌🏻&lt;/p&gt;

&lt;p&gt;Love you all :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I open sourced an AI that creates any UI in seconds.</title>
      <dc:creator>Yuval</dc:creator>
      <pubDate>Mon, 06 Mar 2023 10:54:57 +0000</pubDate>
      <link>https://dev.to/suede/i-open-sourced-an-ai-that-creates-any-ui-in-seconds-8hf</link>
      <guid>https://dev.to/suede/i-open-sourced-an-ai-that-creates-any-ui-in-seconds-8hf</guid>
      <description>&lt;p&gt;I am not posting a lot over dev.to, but I think this is a great opportunity to show something great 🚀&lt;/p&gt;

&lt;p&gt;For the last 15 years, I have been playing the role of a full-stack developer and a team/tech leader for various companies.&lt;/p&gt;

&lt;p&gt;I never stop trying new technologies, I wake up in the morning with a lot of passion to build great things. &lt;/p&gt;

&lt;p&gt;I recently started playing with chatGPT and some generative AI technologies, but as chatGPT API was released, it became a great opportunity to make some really cool things 😎&lt;/p&gt;

&lt;p&gt;The world is changing fast, and I believe that very soon, most of the jobs, as we know them, will not be the same - AI will have its share in our life, involved in almost everything that we do. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9lc8hboqtmbqyqckqay.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9lc8hboqtmbqyqckqay.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I build a lot of web applications, writing dozens of components every week. So I was thinking, what if I could make my life really easier and just ask ChatGPT to make those components for me? It turns out it is easier than you may think. Check this out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai2ui.co/" rel="noopener noreferrer"&gt;https://ai2ui.co/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I open sourced it, so you are more than welcome to contribure make it better!&lt;/p&gt;

&lt;p&gt;Here's a link to the repo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yuvalsuede/ai-component-generator" rel="noopener noreferrer"&gt;https://github.com/yuvalsuede/ai-component-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l2sf5xws7zkol975i34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l2sf5xws7zkol975i34.png" alt="I create AI that works"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/yuval-suede/" rel="noopener noreferrer"&gt;Follow me and learn how to make AI business&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please give me a star so I know I did something good 🙌🏻&lt;/p&gt;

&lt;p&gt;Love you all :)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>chatgpt</category>
    </item>
  </channel>
</rss>
