<?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: Prolific Virtual Assistant</title>
    <description>The latest articles on DEV Community by Prolific Virtual Assistant (@prolific_virtualassistan).</description>
    <link>https://dev.to/prolific_virtualassistan</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%2F4055021%2F3ba4a9cf-e824-4dee-99bd-a8b48ad2a3ac.png</url>
      <title>DEV Community: Prolific Virtual Assistant</title>
      <link>https://dev.to/prolific_virtualassistan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prolific_virtualassistan"/>
    <language>en</language>
    <item>
      <title>How I built a free deepfake detector that works directly from social media URLs</title>
      <dc:creator>Prolific Virtual Assistant</dc:creator>
      <pubDate>Thu, 30 Jul 2026 12:28:01 +0000</pubDate>
      <link>https://dev.to/prolific_virtualassistan/how-i-built-a-free-deepfake-detector-that-works-directly-from-social-media-urls-2g2b</link>
      <guid>https://dev.to/prolific_virtualassistan/how-i-built-a-free-deepfake-detector-that-works-directly-from-social-media-urls-2g2b</guid>
      <description>&lt;p&gt;I built &lt;a href="https://kweliai.com" rel="noopener noreferrer"&gt;KweliAI&lt;/a&gt; — a free tool that checks whether &lt;br&gt;
images and videos on social media are real, AI-generated, or deepfakes. &lt;br&gt;
The thing that makes it different from every other detector I found: &lt;br&gt;
you paste the post URL and it works. No downloading. No file upload. &lt;br&gt;
Just paste and get a verdict.&lt;/p&gt;

&lt;p&gt;This is how I built it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem I was solving
&lt;/h2&gt;

&lt;p&gt;Every deepfake detection tool I found required you to download the file &lt;br&gt;
first. That sounds simple until you try to download a TikTok video or &lt;br&gt;
an X post video — platforms deliberately make this difficult. &lt;/p&gt;

&lt;p&gt;People who suspect they're being catfished, or who want to verify a &lt;br&gt;
viral video before sharing it, don't want to fight with download tools. &lt;br&gt;
They want to paste a link and get an answer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Media extraction with yt-dlp
&lt;/h2&gt;

&lt;p&gt;The core of KweliAI is yt-dlp — the most comprehensive media extraction &lt;br&gt;
library available. It supports X, Reddit, TikTok, YouTube, Instagram, &lt;br&gt;
and Facebook out of the box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;yt_dlp&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;download_media&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ydl_opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;outtmpl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best[ext=mp4]/best&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quiet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;no_warnings&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;yt_dlp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;YoutubeDL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ydl_opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ydl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ydl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tricky parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each platform has different rate limits and URL structures&lt;/li&gt;
&lt;li&gt;Videos need ffmpeg to merge audio and video streams&lt;/li&gt;
&lt;li&gt;Private posts return authentication errors that need clear user messaging&lt;/li&gt;
&lt;li&gt;yt-dlp updates weekly to keep up with platform changes — pin loosely&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three detection models running in parallel
&lt;/h2&gt;

&lt;p&gt;Once the media is extracted, three models run simultaneously:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI image detection&lt;/strong&gt; — trained to identify images from Midjourney, &lt;br&gt;
DALL·E, Stable Diffusion, and Adobe Firefly. Looks for GAN fingerprints &lt;br&gt;
and diffusion model artifacts in pixel frequency patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deepfake detection&lt;/strong&gt; — analyses facial boundary consistency, &lt;br&gt;
blinking patterns, skin texture coherence, and temporal frame consistency &lt;br&gt;
across video frames.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. AI audio detection&lt;/strong&gt; — checks whether voices in video content are &lt;br&gt;
cloned or synthetic. Analyses spectral patterns and prosodic naturalness.&lt;/p&gt;

&lt;p&gt;All three run in parallel using Python's &lt;code&gt;concurrent.futures&lt;/code&gt;. The &lt;br&gt;
results are combined into a single clarity score and a plain-English &lt;br&gt;
verdict.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI on a DigitalOcean droplet behind Nginx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detection:&lt;/strong&gt; Hive Moderation API for the three model calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media extraction:&lt;/strong&gt; yt-dlp + ffmpeg inside Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth + database:&lt;/strong&gt; Supabase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Paystack (we're based in Kenya — Stripe wasn't an option)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Plain HTML/CSS/JS on Vercel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emails:&lt;/strong&gt; Resend for transactional sequences&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    ffmpeg curl &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;300 &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;useradd &lt;span class="nt"&gt;-m&lt;/span&gt; appuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; appuser /app
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/kweliai

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key thing here is ffmpeg — yt-dlp needs it to merge video and audio &lt;br&gt;
streams for most platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The use case I didn't expect.&lt;/strong&gt; I built this for journalists and &lt;br&gt;
fact-checkers. The actual users are people who met someone online and &lt;br&gt;
want to verify their photos before getting emotionally invested. &lt;br&gt;
Romance scam victims and people who've been catfished before. That &lt;br&gt;
realization changed how I write about the tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;yt-dlp breaks constantly.&lt;/strong&gt; Platforms change their APIs and &lt;br&gt;
authentication flows regularly. TikTok and Instagram are the worst. &lt;br&gt;
I use &lt;code&gt;&amp;gt;=&lt;/code&gt; version pinning for yt-dlp instead of &lt;code&gt;==&lt;/code&gt; so it always &lt;br&gt;
installs the latest version on build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GEO matters more than SEO for tools like this.&lt;/strong&gt; Getting indexed &lt;br&gt;
by Bing feeds ChatGPT, Copilot, and Perplexity simultaneously. &lt;br&gt;
ChatGPT started recommending KweliAI to users asking about deepfake &lt;br&gt;
detection within three weeks of launch — before we had significant &lt;br&gt;
Google rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for anyone building detection tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Work from URLs not file uploads — removes the biggest friction point&lt;/li&gt;
&lt;li&gt;Run multiple models in parallel — single model accuracy is never enough&lt;/li&gt;
&lt;li&gt;Return plain English — "AI-generated with high confidence" not a score&lt;/li&gt;
&lt;li&gt;Handle platform errors gracefully — private posts, rate limits, and 
unsupported URLs all need clear user-facing messages&lt;/li&gt;
&lt;li&gt;Pin yt-dlp loosely — &lt;code&gt;&amp;gt;=2026.1.1&lt;/code&gt; not &lt;code&gt;==2026.3.17&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;KweliAI is free to use — 5 scans per day on X and Reddit with no &lt;br&gt;
credit card required: &lt;a href="https://kweliai.com" rel="noopener noreferrer"&gt;kweliai.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The awesome-deepfake-detection resource list I maintain is here: &lt;br&gt;
&lt;a href="https://github.com/MohammadNyundo/awesome-deepfake-detection" rel="noopener noreferrer"&gt;github.com/MohammadNyundo/awesome-deepfake-detection&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the detection approach, the yt-dlp &lt;br&gt;
extraction layer, or the Paystack integration.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>socialmedia</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
