<?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: gia ly bui</title>
    <description>The latest articles on DEV Community by gia ly bui (@gia_lybui).</description>
    <link>https://dev.to/gia_lybui</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%2F4014348%2Faed3682f-c18c-4684-832b-3748091e7b72.png</url>
      <title>DEV Community: gia ly bui</title>
      <link>https://dev.to/gia_lybui</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gia_lybui"/>
    <language>en</language>
    <item>
      <title>I Cloned Myself with AI — The Honest, Step-by-Step Breakdown</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 25 Aug 2026 02:12:53 +0000</pubDate>
      <link>https://dev.to/gia_lybui/i-cloned-myself-with-ai-the-honest-step-by-step-breakdown-3oaf</link>
      <guid>https://dev.to/gia_lybui/i-cloned-myself-with-ai-the-honest-step-by-step-breakdown-3oaf</guid>
      <description>&lt;p&gt;AI cloning sounded like sci-fi to me until I actually did it. Upload a two-minute video of yourself, and a digital twin does your on-camera work forever after. In 2026 this is not just real — it's shockingly easy.&lt;/p&gt;

&lt;p&gt;First, a clarification: you cannot physically clone yourself. What tools like HeyGen do is build an &lt;strong&gt;AI clone&lt;/strong&gt; — a digital twin that looks and sounds like you in videos. It's the closest thing to cloning yourself that exists today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you actually need
&lt;/h2&gt;

&lt;p&gt;Two minutes of footage. That's it. But those two minutes should be your best take, because the clone inherits how you look in that clip forever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good lighting — face fully lit, no harsh shadows&lt;/li&gt;
&lt;li&gt;A plain background — solid color, nothing distracting&lt;/li&gt;
&lt;li&gt;A stable camera — tripod or propped phone&lt;/li&gt;
&lt;li&gt;Clear audio — quiet room, minimal echo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create an account (avatar cloning requires a paid plan — not on the free tier)&lt;/li&gt;
&lt;li&gt;Record two minutes of yourself talking naturally, looking at the camera&lt;/li&gt;
&lt;li&gt;Upload it to the avatar builder — it processes the footage in minutes to an hour&lt;/li&gt;
&lt;li&gt;Test your clone with a short script and check the lip-sync&lt;/li&gt;
&lt;li&gt;Use it everywhere — talking-head videos, translated into 40+ languages&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;HeyGen starts around $24/month, and cloning consumes credits each time you generate. The clone isn't a one-time buy — it's tied to the plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's good for (and not)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; faceless YouTube channels, multi-language content, client work, course content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not good for:&lt;/strong&gt; emotional or personal content (a clone can't replicate genuine human warmth), and real-time interaction (clones are for pre-scripted video, not live).&lt;/p&gt;

&lt;h2&gt;
  
  
  The one rule that matters
&lt;/h2&gt;

&lt;p&gt;Clone quality depends entirely on your source footage. Garbage in, garbage out. If the lip-sync looks off, it's almost always a source-footage problem, not a tool problem.&lt;/p&gt;

&lt;p&gt;One compliance note if you publish to YouTube: flag realistic AI-generated content through YouTube's altered-content disclosure.&lt;/p&gt;

&lt;p&gt;Full step-by-step guide: &lt;a href="https://aivideotest.com/clone-yourself" rel="noopener noreferrer"&gt;https://aivideotest.com/clone-yourself&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Reverse Engineering Android Apps to Extract Private API Endpoints</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Fri, 21 Aug 2026 14:44:45 +0000</pubDate>
      <link>https://dev.to/gia_lybui/reverse-engineering-android-apps-to-extract-private-api-endpoints-16ng</link>
      <guid>https://dev.to/gia_lybui/reverse-engineering-android-apps-to-extract-private-api-endpoints-16ng</guid>
      <description>&lt;p&gt;Ever needed to integrate with an app that has no public API? Or test your own app and understand what it's actually sending over the wire? Here's how I approach it — from a static decompile all the way to working API calls.&lt;/p&gt;

&lt;p&gt;What you'll need&lt;br&gt;
jadx — static decompilation&lt;br&gt;
apktool — repackaging / resource inspection&lt;br&gt;
Frida — dynamic instrumentation&lt;br&gt;
mitmproxy or Burp Suite — traffic interception&lt;br&gt;
A rooted Android device (recommended, not always required)&lt;br&gt;
Step 1: Static analysis with jadx&lt;br&gt;
Start by decompiling the APK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jadx &lt;span class="nt"&gt;-d&lt;/span&gt; output/ app.apk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most Android apps use Retrofit or OkHttp. Grep the decompiled source for the telltale annotations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rE&lt;/span&gt; &lt;span class="s2"&gt;"@GET|@POST|@PUT"&lt;/span&gt; output/ | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This often surfaces endpoint paths, base URLs, and even parameter names in minutes. But here's the catch: modern apps encrypt or obfuscate the interesting parts, so static analysis alone will leave you with dead ends.&lt;/p&gt;

&lt;p&gt;Step 2: Intercept traffic with mitmproxy&lt;br&gt;
Point the device at your proxy and watch the real requests. You'll usually hit SSL pinning immediately — the app rejects your MITM certificate.&lt;/p&gt;

&lt;p&gt;Step 3: Bypass SSL pinning with Frida&lt;br&gt;
This is where dynamic analysis wins. Frida injects into the running process and patches the certificate validation at runtime. A short script hooks the trust managers and lets your proxy see the plaintext traffic.&lt;/p&gt;

&lt;p&gt;Static tools can't do this — the pinning logic only exists at runtime.&lt;/p&gt;

&lt;p&gt;Step 4: Reverse custom encryption&lt;br&gt;
Many apps sign their requests or encrypt the payload. The trick is to hook the encryption function with Frida, dump its input and output, and reconstruct the algorithm. Once you understand the signature generation, you can reproduce it in Python or any language you like.&lt;/p&gt;

&lt;p&gt;Step 5: Extract and document&lt;br&gt;
The output is a clean list of endpoints, their request/response schemas, and a reproducible script that makes working API calls. That's the difference between "here's a decompiled APK" and "here's something you can actually build on."&lt;/p&gt;

&lt;p&gt;A quick legal note&lt;br&gt;
Only do this on apps you own, or where you have explicit authorization. Reverse engineering third-party apps for unauthorized access is illegal in most jurisdictions.&lt;/p&gt;

&lt;p&gt;If you need this done professionally — private API extraction, custom encryption or protocol reverse engineering — I do this as a service: &lt;a href="https://www.fiverr.com/s/jyv78wa" rel="noopener noreferrer"&gt;www.fiverr.com/s/jyv78wa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>reverseengineering</category>
      <category>security</category>
      <category>frida</category>
    </item>
    <item>
      <title>CS2 Case Odds: The Real Drop Rates and Which Cases Are Worth Opening (2026)</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Thu, 20 Aug 2026 04:01:29 +0000</pubDate>
      <link>https://dev.to/gia_lybui/cs2-case-odds-the-real-drop-rates-and-which-cases-are-worth-opening-2026-2e3d</link>
      <guid>https://dev.to/gia_lybui/cs2-case-odds-the-real-drop-rates-and-which-cases-are-worth-opening-2026-2e3d</guid>
      <description>&lt;p&gt;Everyone wants to know which CS2 case has the "best odds." Here's the actual math, because most of what you read online is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fixed odds (they never change)
&lt;/h2&gt;

&lt;p&gt;Every standard case — official or third-party — uses the same published drop rates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rarity&lt;/th&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Odds&lt;/th&gt;
&lt;th&gt;1 in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mil-Spec&lt;/td&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;79.92%&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restricted&lt;/td&gt;
&lt;td&gt;Purple&lt;/td&gt;
&lt;td&gt;15.98%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classified&lt;/td&gt;
&lt;td&gt;Pink&lt;/td&gt;
&lt;td&gt;3.20%&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Covert&lt;/td&gt;
&lt;td&gt;Red&lt;/td&gt;
&lt;td&gt;0.64%&lt;/td&gt;
&lt;td&gt;156&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Special / Knife&lt;/td&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;td&gt;0.26%&lt;/td&gt;
&lt;td&gt;385&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that last line again: &lt;strong&gt;roughly 1 knife per 385 cases.&lt;/strong&gt; That's the cold math behind every "I'll just open until I get a knife" plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what actually determines ROI?
&lt;/h2&gt;

&lt;p&gt;The odds are fixed, so ROI swings on two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The market price of the coverts and knife inside&lt;/strong&gt; — a case whose red is a $2,000 AK-47 has far higher expected value than one whose red is a $50 pistol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case cost&lt;/strong&gt; — a cheap discontinued case with expensive skins is the best situation; an expensive new case with cheap skins is the worst.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's why &lt;strong&gt;discontinued cases with high-value coverts&lt;/strong&gt; dominate the ROI rankings over time. Once a case stops dropping, its skins stop entering the market and appreciate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;The house edge is built into those odds. Over enough openings, the skins you pull are worth less than what you paid to open. You can improve your position by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opening only high-ROI (discontinued, high-value covert) cases&lt;/li&gt;
&lt;li&gt;Using free daily cases and deposit bonuses&lt;/li&gt;
&lt;li&gt;Treating it as entertainment with a budget, not an income strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chasing a knife at 1-in-385 will lose you money over time. Play smart, not desperate.&lt;/p&gt;

&lt;p&gt;Full breakdown with a ranked ROI list and the expected-value math: &lt;a href="https://cs2caseguide.com/cs2-case-odds" rel="noopener noreferrer"&gt;https://cs2caseguide.com/cs2-case-odds&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gaming</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I built a faceless YouTube channel with AI video tools — here's the workflow</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 18 Aug 2026 15:02:07 +0000</pubDate>
      <link>https://dev.to/gia_lybui/publish-test-gm</link>
      <guid>https://dev.to/gia_lybui/publish-test-gm</guid>
      <description>&lt;p&gt;I wanted to publish videos without showing my face or filming anything. After a month of experimenting, here's the workflow that actually works — and the one thing most people get wrong.&lt;/p&gt;

&lt;p&gt;The workflow&lt;br&gt;
Every AI video starts with a script. The tool can't fix bad writing, so I spend most of my time there: short sentences, written for the ear, roughly 150 words per minute of video.&lt;/p&gt;

&lt;p&gt;Then I pick a tool based on what the video needs:&lt;/p&gt;

&lt;p&gt;A talking presenter? Use an AI avatar tool — you paste the script and a digital presenter reads it. (HeyGen clones your own face from a two-minute video; Synthesia offers a library of stock avatars.)&lt;br&gt;
Original footage? Use a text-to-video tool — describe each scene and it generates the clip.&lt;br&gt;
Repurposing an article? There are tools that turn a blog post into a video automatically.&lt;br&gt;
The trick is matching the tool to the job. A presenter tool can't generate b-roll, and a text-to-video tool can't make someone talk to camera. Most "which tool is best" confusion online comes from comparing tools that don't compete.&lt;/p&gt;

&lt;p&gt;What actually matters&lt;br&gt;
After the video is generated, three things decide whether anyone watches: a hook in the first three seconds, captions (most short-form is watched muted), and a clean vertical export. The AI handles the visuals — the distribution is still on you.&lt;/p&gt;




&lt;p&gt;I wrote up the full comparison and step-by-step setup here: &lt;a href="https://aivideotest.com/" rel="noopener noreferrer"&gt;https://aivideotest.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Single Canonical Tag Was Crashing My Google Rankings</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 18 Aug 2026 14:46:03 +0000</pubDate>
      <link>https://dev.to/gia_lybui/a-single-tag-was-crashing-my-google-rankings-4m28</link>
      <guid>https://dev.to/gia_lybui/a-single-tag-was-crashing-my-google-rankings-4m28</guid>
      <description>&lt;p&gt;I shipped a content site in a niche most devs don't build for — adult-lifestyle product reviews. The stack is boring on purpose: &lt;strong&gt;FastAPI + Jinja2 + JSON data files&lt;/strong&gt;, served from Fly.io's free tier behind Cloudflare. 68 pages, zero CMS, zero build step.&lt;/p&gt;

&lt;p&gt;Two months in, Google Search Console started emailing me something that explained &lt;em&gt;everything&lt;/em&gt; about my dead traffic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Duplicate without user-selected canonical"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the bug, the fix, and what the data looked like before and after.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI + Jinja2Templates&lt;/strong&gt; — server-side rendering, no JS framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content as JSON&lt;/strong&gt; — &lt;code&gt;hubs.json&lt;/code&gt;, &lt;code&gt;categories.json&lt;/code&gt;, &lt;code&gt;articles.json&lt;/code&gt;, versioned in git&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standalone Jinja2 templates&lt;/strong&gt; per pillar page, plus a few pre-rendered static HTML files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fly.io free tier&lt;/strong&gt; + Cloudflare, with a Python script that regenerates a static &lt;code&gt;sitemap.xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why JSON + templates instead of a CMS? Because I wanted content in version control and zero database to babysit. 68 pages, no admin panel, no migration anxiety.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that was tanking my rankings
&lt;/h2&gt;

&lt;p&gt;I opened one of the flagged pages and found &lt;strong&gt;two canonical tags&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://safeadultguide.com/hub/bdsm-gear-complete-guide"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://safeadultguide.com/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second one pointed at the &lt;strong&gt;homepage&lt;/strong&gt;. I'd left a "default canonical" line in the base template's &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and forgotten it existed. Every article on the site was telling Google: &lt;em&gt;"my canonical page is the homepage."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Google did exactly what I asked it to: treated all 68 pages as duplicates of the homepage, collapsed their ranking signals, and parked me at an &lt;strong&gt;average position of 77.5 — page 8 of results&lt;/strong&gt;. Zero clicks across ~230 impressions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Move the default canonical &lt;em&gt;inside&lt;/em&gt; the Jinja2 block so child templates can override it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jinja"&gt;&lt;code&gt;&lt;span class="c"&gt;{# base.html #}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;canonical&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://safeadultguide.com&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;request.url.path&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages with no override get a &lt;strong&gt;correct self-canonical&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Pages needing a fixed URL override the block&lt;/li&gt;
&lt;li&gt;Exactly &lt;strong&gt;one&lt;/strong&gt; canonical per page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But a second bug was hiding behind the first. Four of my "hub" pages were served as &lt;strong&gt;pre-rendered static HTML files&lt;/strong&gt; via &lt;code&gt;open().read()&lt;/code&gt; — which bypasses Jinja2 entirely. My template fix didn't touch them; they still had the broken canonical baked into the file. I had to patch those four files individually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson: if you mix template-rendered and pre-rendered static pages, a template fix silently does NOT propagate to the static ones.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and after
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; ~230 impressions / 2 weeks, 0 clicks, average position 77.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~1 week after deploy:&lt;/strong&gt; impressions up ~35%, and the &lt;strong&gt;first click&lt;/strong&gt; landed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a slow climb — Google has to re-crawl 68 pages — but the direction finally flipped from "invisible" to "climbing."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell past me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Topic clusters beat thin sites.&lt;/strong&gt; 3–5 pillar articles (3,000+ words) + 30–50 cluster articles beats 68 disconnected pages. Google rewards depth over sprawl.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare "Always Use HTTPS" only works if DNS records are proxied&lt;/strong&gt; (orange cloud). Grey-cloud means traffic bypasses Cloudflare, and http/https serve duplicate content — feeding the exact "duplicate" flag above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fly.io's Jinja2 has a dict-hashing bug&lt;/strong&gt; with &lt;code&gt;TemplateResponse()&lt;/code&gt; — wrap it in a &lt;code&gt;render()&lt;/code&gt; helper or it crashes on deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mine GSC query data to pick your next article.&lt;/strong&gt; Write for keywords already earning impressions, not a random list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your canonical tags right now.&lt;/strong&gt; One stray &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; in a shared layout can silently de-index every page you own.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can see the site here: &lt;a href="https://safeadultguide.com" rel="noopener noreferrer"&gt;safeadultguide.com&lt;/a&gt; — and if you run a content site, go grep your own &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; for duplicate canonicals. It's a 30-second check that might be costing you page one.&lt;/p&gt;

</description>
      <category>python</category>
      <category>seo</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Tested 5 AI Video Generators in 2026 So You Don't Have To</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Sun, 16 Aug 2026 14:41:42 +0000</pubDate>
      <link>https://dev.to/gia_lybui/i-tested-5-ai-video-generators-in-2026-so-you-dont-have-to-3p5m</link>
      <guid>https://dev.to/gia_lybui/i-tested-5-ai-video-generators-in-2026-so-you-dont-have-to-3p5m</guid>
      <description>&lt;p&gt;The AI video tool market exploded in 2026 — and now it's genuinely hard&lt;br&gt;
to tell which tool is for you, because most comparisons compare tools that&lt;br&gt;
don't even do the same job.&lt;/p&gt;

&lt;p&gt;I went hands-on with the leading platforms. Here's what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Jobs (Most People Miss This)
&lt;/h2&gt;

&lt;p&gt;AI video tools split into three categories, and they don't compete:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI avatars&lt;/strong&gt; — a realistic digital presenter reads your script.&lt;br&gt;
→ Synthesia (enterprise standard), HeyGen (clone yourself)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text-to-video&lt;/strong&gt; — type a prompt, get a video clip.&lt;br&gt;
→ Runway (Gen-3, most powerful), Pika (budget)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Article-to-video&lt;/strong&gt; — paste a blog post, get a video.&lt;br&gt;
→ Pictory&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The #1 mistake I see: buying a text-to-video tool when you actually&lt;br&gt;
needed an avatar, or vice versa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Picks by Use Case
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Professional avatars&lt;/td&gt;
&lt;td&gt;Synthesia&lt;/td&gt;
&lt;td&gt;from $22/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone your own face&lt;/td&gt;
&lt;td&gt;HeyGen&lt;/td&gt;
&lt;td&gt;from $24/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cinematic text-to-video&lt;/td&gt;
&lt;td&gt;Runway&lt;/td&gt;
&lt;td&gt;from $12/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Article → video&lt;/td&gt;
&lt;td&gt;Pictory&lt;/td&gt;
&lt;td&gt;from $19/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget social clips&lt;/td&gt;
&lt;td&gt;Pika&lt;/td&gt;
&lt;td&gt;from $8/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Hidden Cost: Credits
&lt;/h2&gt;

&lt;p&gt;Every tool charges a monthly fee AND burns credits per video. Run out&lt;br&gt;
before month-end and you either wait or upgrade. A cheap plan that runs&lt;br&gt;
out fast can cost more than a pricier plan that covers your output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Faceless Channel Stack
&lt;/h2&gt;

&lt;p&gt;For creators, the smart setup is two tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One avatar tool (Synthesia or HeyGen) for talking-head content&lt;/li&gt;
&lt;li&gt;One generation tool (Runway or Pika) for b-roll&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pair with CapCut for auto captions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full rankings, pricing breakdown, and step-by-step workflows:&lt;br&gt;
&lt;a href="https://aivideotest.com/" rel="noopener noreferrer"&gt;https://aivideotest.com/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>tools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a 68-Page Adult Wellness Review Site With Zero Budget</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Sat, 08 Aug 2026 03:31:49 +0000</pubDate>
      <link>https://dev.to/gia_lybui/how-i-built-a-68-page-adult-wellness-review-site-with-zero-budget-54dd</link>
      <guid>https://dev.to/gia_lybui/how-i-built-a-68-page-adult-wellness-review-site-with-zero-budget-54dd</guid>
      <description>&lt;p&gt;I built a content site from scratch — no paid tools, no CMS, no hosting fees. Here's exactly what I did and what worked.&lt;/p&gt;

&lt;p&gt;The Niche&lt;br&gt;
Adult wellness products. It sounds oversaturated until you look at the actual SERPs. The top 10 results are either thinly-disguised affiliate farms or decade-old forum threads. Almost nobody is writing genuinely helpful, research-backed guides.&lt;/p&gt;

&lt;p&gt;My bet: write the content others won't, and Google will reward it eventually.&lt;/p&gt;

&lt;p&gt;The Tech Stack (Total Cost: $0)&lt;br&gt;
FastAPI (Python) — serves the site&lt;br&gt;
Fly.io — free hosting tier (up to 3 apps)&lt;br&gt;
Jinja2 — templating&lt;br&gt;
JSON — all content stored as structured data&lt;br&gt;
Cloudflare — free CDN + SSL&lt;br&gt;
GitHub — version control&lt;br&gt;
The key decision: separating content (JSON) from code. Adding a new article means editing one JSON file. No touching the app code. This alone has saved me from breaking the site at least 5 times.&lt;/p&gt;

&lt;p&gt;The SEO Approach&lt;br&gt;
I read Google's official documentation. All of it. Not blog posts about SEO — the actual 关于改进 SEO 的文档 | Google 搜索中心 | Documentation | Google for Developers guides.&lt;/p&gt;

&lt;p&gt;What I implemented:&lt;/p&gt;

&lt;p&gt;Article + FAQ + BreadcrumbList + VideoObject Schema on every pillar page&lt;br&gt;
meta rating="adult" tag to help SafeSearch classification&lt;br&gt;
Googlebot bypass for age gate (verified user-agent on server side)&lt;br&gt;
Canonical URLs across old and new domains&lt;br&gt;
Video sitemap with family_friendly=no tags&lt;br&gt;
Descriptive URLs, one H1 per page, author bylines&lt;br&gt;
Sitemap with lastmod dates submitted to GSC&lt;br&gt;
The Content&lt;br&gt;
7 pillar guides (4,000+ words each):&lt;/p&gt;

&lt;p&gt;Remote-controlled toys for long-distance couples&lt;br&gt;
Body-safe materials (silicone vs TPE)&lt;br&gt;
Cam site pricing and platform comparison&lt;br&gt;
BDSM gear for beginners&lt;br&gt;
Senior intimacy after 60&lt;br&gt;
Sex dolls — TPE vs silicone&lt;br&gt;
LGBTQ+ inclusive products&lt;br&gt;
Every guide cites data from Reddit, scientific research, and real owner experiences. No ChatGPT filler.&lt;/p&gt;

&lt;p&gt;Monetization&lt;br&gt;
8 affiliate platforms, 67 products total:&lt;/p&gt;

&lt;p&gt;Lovense (direct)&lt;br&gt;
Awin (5 brands)&lt;br&gt;
CrakRevenue (12 offers)&lt;br&gt;
Chaturbate&lt;br&gt;
The site is 2 weeks old. Zero traffic, zero revenue. But the infrastructure is ready.&lt;/p&gt;

&lt;p&gt;What I'd Do Differently&lt;br&gt;
Start with the JSON data architecture from day 1&lt;br&gt;
Not edit main.py at 2 AM (lost 4 hours of routes once)&lt;br&gt;
Get a custom domain immediately (safeadultguide.com, $10/year)&lt;br&gt;
Use Cloudflare from the start instead of relying on Fly.io SSL&lt;br&gt;
The Result&lt;br&gt;
68 pages indexed on Google&lt;br&gt;
7 video sitemap entries&lt;br&gt;
15+ external backlinks&lt;br&gt;
Zero manual actions&lt;br&gt;
$0 spent total&lt;br&gt;
The site: &lt;a href="https://safeadultguide.com" rel="noopener noreferrer"&gt;safeadultguide.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>seo</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CS2 Knife Guide 2026 — How Much Is Your Doppler Really Worth?</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Wed, 05 Aug 2026 16:05:21 +0000</pubDate>
      <link>https://dev.to/gia_lybui/cs2-knife-guide-2026-how-much-is-your-doppler-really-worth-252c</link>
      <guid>https://dev.to/gia_lybui/cs2-knife-guide-2026-how-much-is-your-doppler-really-worth-252c</guid>
      <description>&lt;p&gt;You unboxed a Doppler knife in CS2. Congratulations. Now the question that could be worth thousands of dollars — which phase is it?&lt;/p&gt;

&lt;p&gt;Most players never check. They see "Doppler" and assume they know the value. But the difference between a Phase 1 and a Sapphire is literally ten thousand dollars.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Standard Phases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Phase 1&lt;/strong&gt; — Black with dark red and pink. Most common. Market price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2&lt;/strong&gt; — Pink and purple dominant. Worth 10-30% more than Phase 1. This is the best standard phase for value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3&lt;/strong&gt; — Black with blue and green tones. Similar to Phase 1 in value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4&lt;/strong&gt; — Dark blue dominant. The most desired standard phase. 10-20% premium. This is what everyone hopes for.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ultra-Rare Variants
&lt;/h2&gt;

&lt;p&gt;These three variants account for less than 1% of all Dopplers unboxed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby&lt;/strong&gt; — Pure red. No black. No blue. 4-8x value. A Karambit Ruby goes for $4,000-$8,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sapphire&lt;/strong&gt; — Pure blue. The holy grail. 5-10x value. A Karambit Sapphire Factory New? $10,000+.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Black Pearl&lt;/strong&gt; — Dark purple and black, almost no color. 3-6x value. Extremely rare. Most players don't even know this exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Float Values Matter
&lt;/h2&gt;

&lt;p&gt;Same knife. Same phase. Different float. Here's the brutal math:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Factory New 0.01 → $1,000&lt;/li&gt;
&lt;li&gt;Factory New 0.06 → $500&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That 0.05 difference just cost you $500.&lt;/p&gt;

&lt;p&gt;Always check your float. Lower is always better. Use FloatDB or inspect servers before you trade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Case Hardened Blue Gem
&lt;/h2&gt;

&lt;p&gt;The most valuable unbox in CS2 history. Pattern 387 on a Karambit: 95% blue playside. Over $100,000.&lt;/p&gt;

&lt;p&gt;You don't need the rarest pattern to profit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30-50% blue → 2-3x value&lt;/li&gt;
&lt;li&gt;60-80% blue → 5-10x value&lt;/li&gt;
&lt;li&gt;85%+ blue → 50-200x value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most people trade these away without checking the pattern index.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Value Patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slaughter&lt;/strong&gt; — Heart or diamond on the blade. Centered = 2x value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marble Fade Fire &amp;amp; Ice&lt;/strong&gt; — Red and blue separated, no yellow. 3-5x value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crimson Web&lt;/strong&gt; — Large centered web + low float = 2-4x collector value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patterns aren't on the Steam Market price list. You have to know them to profit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Written Guide
&lt;/h2&gt;

&lt;p&gt;Every knife ranked. Every pattern explained. All values:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://cs2caseguide.com/knife-guide" rel="noopener noreferrer"&gt;https://cs2caseguide.com/knife-guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cs2</category>
      <category>counterstrike</category>
      <category>gaming</category>
      <category>skins</category>
    </item>
    <item>
      <title>How to Choose the Best CS2 Case Opening Site — 2026 Comparison Guide</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:50:42 +0000</pubDate>
      <link>https://dev.to/gia_lybui/how-to-choose-the-best-cs2-case-opening-site-2026-comparison-guide-1cbb</link>
      <guid>https://dev.to/gia_lybui/how-to-choose-the-best-cs2-case-opening-site-2026-comparison-guide-1cbb</guid>
      <description>&lt;p&gt;After testing 20+ CS2 case opening sites over 6 months, here's what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Criteria That Actually Matter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provably Fair&lt;/strong&gt; — Can you independently verify each roll? If not, skip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Withdrawal Speed&lt;/strong&gt; — Top sites process under 10 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deposit Bonuses&lt;/strong&gt; — Hellcase gives +10% on your first 3 deposits + a free daily case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Trust&lt;/strong&gt; — Check Trustpilot and Reddit r/csgo before depositing anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Longevity&lt;/strong&gt; — Sites operating 5+ years are significantly safer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Top 3
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;Since&lt;/th&gt;
&lt;th&gt;Users&lt;/th&gt;
&lt;th&gt;Bonus&lt;/th&gt;
&lt;th&gt;Withdrawal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hellcase&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;5M+&lt;/td&gt;
&lt;td&gt;+10% deposit + free daily case&lt;/td&gt;
&lt;td&gt;&amp;lt;10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DatDrop&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;2M+&lt;/td&gt;
&lt;td&gt;5% deposit bonus&lt;/td&gt;
&lt;td&gt;&amp;lt;15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSGOFast&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;1M+&lt;/td&gt;
&lt;td&gt;Loyalty rewards&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Stick to trusted platforms, always claim your free daily case, and never deposit more than you can afford to lose.&lt;/p&gt;

&lt;p&gt;Full comparison with detailed reviews: &lt;a href="https://cs2-case-sites.fly.dev" rel="noopener noreferrer"&gt;https://cs2-case-sites.fly.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cs2</category>
      <category>counterstrike</category>
      <category>gaming</category>
      <category>skins</category>
    </item>
    <item>
      <title>How to Build a WHOIS Lookup Tool for Free in 5 Minutes</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 21 Jul 2026 14:56:51 +0000</pubDate>
      <link>https://dev.to/gia_lybui/how-to-build-a-whois-lookup-tool-for-free-in-5-minutes-21ij</link>
      <guid>https://dev.to/gia_lybui/how-to-build-a-whois-lookup-tool-for-free-in-5-minutes-21ij</guid>
      <description>&lt;p&gt;Ever needed to check who owns a domain? Here's how to build one using a free API — no registration, no API key, just a GET request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;Domain WHOIS API on RapidAPI. 5,000 free requests/month. Read more at &lt;a href="https://rapidapi.com/buigialy30206/api/domain-whois-api1/playground/apiendpoint_72a4be4a-8f73-4b30-a5e8-75ef1f165b40" rel="noopener noreferrer"&gt;https://rapidapi.com/buigialy30206/api/domain-whois-api1/playground/apiendpoint_72a4be4a-8f73-4b30-a5e8-75ef1f165b40&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Make a request
&lt;/h2&gt;

&lt;p&gt;curl "&lt;a href="https://mega-api-mellowed-tidepool-1271.fly.dev/whois/lookup?domain=github.com" rel="noopener noreferrer"&gt;https://mega-api-mellowed-tidepool-1271.fly.dev/whois/lookup?domain=github.com&lt;/a&gt;"&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Parse the response
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"registrar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"MarkMonitor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2007-10-09"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"expires"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2028-10-09"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"nameservers"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"ns1.github.com"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Call it from JavaScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;lookupDomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&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;https://mega-api-mellowed-tidepool-1271.fly.dev/whois/lookup?domain=&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;domain&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;data&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;res&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;lookupDomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;github.com&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;p&gt;That's it. No API key. No registration. No rate limits. Copy-paste and it works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rapidapi.com/buigialy30206/api/domain-whois-api1/playground/apiendpoint_72a4be4a-8f73-4b30-a5e8-75ef1f165b40" rel="noopener noreferrer"&gt;https://rapidapi.com/buigialy30206/api/domain-whois-api1/playground/apiendpoint_72a4be4a-8f73-4b30-a5e8-75ef1f165b40&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.producthunt.com/posts/steam-data-api" rel="noopener noreferrer"&gt;https://www.producthunt.com/posts/steam-data-api&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>rapidapi</category>
    </item>
    <item>
      <title>I Built 21 Free APIs in 3 Months — Here's What I Learned</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Tue, 14 Jul 2026 03:14:48 +0000</pubDate>
      <link>https://dev.to/gia_lybui/i-built-21-free-apis-in-3-months-heres-what-i-learned-2cma</link>
      <guid>https://dev.to/gia_lybui/i-built-21-free-apis-in-3-months-heres-what-i-learned-2cma</guid>
      <description>&lt;p&gt;I'm a self-taught developer from China. Three months ago I had zero passive income. Today I have 21 APIs live on RapidAPI, all running on $0/month infrastructure.&lt;/p&gt;

&lt;p&gt;Here's exactly how I did it, what worked, and what I wish I knew earlier.&lt;/p&gt;

&lt;p&gt;The Stack (All Free)&lt;br&gt;
Backend: FastAPI — $0&lt;/p&gt;

&lt;p&gt;Hosting: Render Free Tier — $0&lt;/p&gt;

&lt;p&gt;Health Check: UptimeRobot — $0&lt;/p&gt;

&lt;p&gt;Monetization: RapidAPI — 20% commission&lt;/p&gt;

&lt;p&gt;Total monthly infrastructure cost: $0.00&lt;/p&gt;

&lt;p&gt;The Playbook&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pure Algorithm APIs Are Cheat Codes
No external dependencies. No API keys. No rate limits. Write once, run forever.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;QR Code Generator — Pure Python — Zero maintenance&lt;/p&gt;

&lt;p&gt;Password Checker — Entropy math — Zero maintenance&lt;/p&gt;

&lt;p&gt;UUID Generator — Python uuid — Zero maintenance&lt;/p&gt;

&lt;p&gt;Markdown to HTML — Regex — Zero maintenance&lt;/p&gt;

&lt;p&gt;These took 4 hours each. They've never broken once.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Free Public Data Sources Are Goldmines
Wikidata → Company info for any business → Company Info API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RDAP Protocol → Domain registration data → Domain WHOIS API&lt;/p&gt;

&lt;p&gt;OpenStreetMap → Business listings worldwide → Places Search API&lt;/p&gt;

&lt;p&gt;All free. All global coverage. No API keys needed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Caching Prevents Cold Starts
Render's free tier sleeps after 15 minutes of inactivity. First request takes 50+ seconds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fix: UptimeRobot pings /health every 5 minutes. 50 monitors, all free.&lt;/p&gt;

&lt;p&gt;The Numbers&lt;br&gt;
After 3 months: 21 APIs, $0 monthly cost, 3+ APIs with growing traffic.&lt;/p&gt;

&lt;p&gt;Best performer: Domain WHOIS API — 7.6K calls per week from a single user in Germany.&lt;/p&gt;

&lt;p&gt;People are willing to pay for convenience. RDAP is free and well-documented, but wrapping it in a clean JSON API is worth real money.&lt;/p&gt;

&lt;p&gt;What I'd Do Differently&lt;br&gt;
Start with health endpoints. Lost weeks debugging cold starts that turned out to be missing /health routes.&lt;br&gt;
Vary your categories. Data, Finance, Tools, Security — different search terms catch different buyers.&lt;br&gt;
Write longer descriptions. RapidAPI search favors APIs with detailed markdown descriptions.&lt;br&gt;
The APIs&lt;br&gt;
Data: Domain WHOIS, Company Info, Email Validator, IP Geolocation, Places Search&lt;/p&gt;

&lt;p&gt;Finance: Currency Converter, Stock Price, EU VAT Validator&lt;/p&gt;

&lt;p&gt;Security: Password Checker&lt;/p&gt;

&lt;p&gt;Tools: QR Code, Barcode, UUID, Markdown, Slug, User Agent Parser, PDF to Text&lt;/p&gt;

&lt;p&gt;Search "buigialy30206" on RapidAPI to find all of them.&lt;/p&gt;

&lt;p&gt;The real lesson: you don't need venture capital, a team, or a SaaS product. You need one free hosting provider, one free data source, one afternoon per API, and the willingness to ship.&lt;/p&gt;

&lt;p&gt;The best passive income is the one that costs $0 to run.&lt;br&gt;
&lt;a href="https://www.producthunt.com/posts/steam-data-api" rel="noopener noreferrer"&gt;https://www.producthunt.com/posts/steam-data-api&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>20 Free APIs on RapidAPI — The Complete List</title>
      <dc:creator>gia ly bui</dc:creator>
      <pubDate>Fri, 10 Jul 2026 12:09:44 +0000</pubDate>
      <link>https://dev.to/gia_lybui/20-free-apis-on-rapidapi-the-complete-list-jab</link>
      <guid>https://dev.to/gia_lybui/20-free-apis-on-rapidapi-the-complete-list-jab</guid>
      <description>&lt;p&gt;Over the past 3 weeks, I've built and published 20 APIs on RapidAPI. All free. All $0/month to run.&lt;/p&gt;

&lt;p&gt;Categories:&lt;br&gt;
📊 Business Data (3)&lt;br&gt;
✅ Validation (4)&lt;br&gt;
🔧 Generators (5)&lt;br&gt;
🛠 Utilities (7)&lt;br&gt;
📍 Location (1)&lt;/p&gt;

&lt;p&gt;Every API listed on my profile. Free tiers on all of them.&lt;br&gt;
&lt;a href="https://www.producthunt.com/posts/steam-data-api" rel="noopener noreferrer"&gt;https://www.producthunt.com/posts/steam-data-api&lt;/a&gt;&lt;br&gt;
&lt;a href="https://rapidapi.com/user/buigialy30206" rel="noopener noreferrer"&gt;https://rapidapi.com/user/buigialy30206&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
