<?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: Chirag Rasane</title>
    <description>The latest articles on DEV Community by Chirag Rasane (@chiragrasane).</description>
    <link>https://dev.to/chiragrasane</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%2F4213740%2F43763751-ffd3-4f3e-acb4-3cb0be603aaa.jpg</url>
      <title>DEV Community: Chirag Rasane</title>
      <link>https://dev.to/chiragrasane</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chiragrasane"/>
    <language>en</language>
    <item>
      <title>Heatmapify: Summoning the Ghosts of Everyone Who Hit Replay</title>
      <dc:creator>Chirag Rasane</dc:creator>
      <pubDate>Wed, 28 Oct 2026 19:21:29 +0000</pubDate>
      <link>https://dev.to/chiragrasane/heatmapify-summoning-the-ghosts-of-everyone-who-hit-replay-649</link>
      <guid>https://dev.to/chiragrasane/heatmapify-summoning-the-ghosts-of-everyone-who-hit-replay-649</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every YouTube video is haunted.&lt;/p&gt;

&lt;p&gt;Thousands, sometimes millions, of people have watched it before you. You never see them, but they leave traces. They drag the playhead back to a moment and watch it again. They leave comments like &lt;em&gt;"4:12 🤯"&lt;/em&gt;. They drop off when the video drags. YouTube collects all of this into the &lt;strong&gt;"Most replayed"&lt;/strong&gt; curve, the faint grey wave above the progress bar.&lt;/p&gt;

&lt;p&gt;On a lot of videos, though, that curve isn't there. Newer videos, smaller channels and many long videos simply don't show it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heatmapify&lt;/strong&gt; brings those viewers back. Paste a YouTube link and it tells you the &lt;strong&gt;most and least engaging moments&lt;/strong&gt; of the video:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If YouTube publishes "Most replayed" data&lt;/strong&gt;, Heatmapify reads it directly and marks it &lt;code&gt;official&lt;/code&gt; with &lt;code&gt;high&lt;/code&gt; confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it doesn't&lt;/strong&gt;, Heatmapify builds an estimate from the traces people and the video leave behind:

&lt;ul&gt;
&lt;li&gt;💬 &lt;strong&gt;Comments&lt;/strong&gt;: every timestamp people mention ("3:42") becomes a bump on the curve&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Captions&lt;/strong&gt;: transcript windows are scored for hooks, emphasis, questions, claims and topic shifts&lt;/li&gt;
&lt;li&gt;🔊 &lt;strong&gt;Audio&lt;/strong&gt;: loudness, onsets and spectral flatness&lt;/li&gt;
&lt;li&gt;🎞️ &lt;strong&gt;Visuals&lt;/strong&gt;: motion and cut density from a low-res ffmpeg stream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If none of that is usable&lt;/strong&gt;, it says &lt;code&gt;no_data_available&lt;/code&gt;. It never makes up a curve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every estimate is labelled as one, with a confidence level, the signals used, and the signals skipped and why.&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%2Fsc73psjsii1nnpnuocc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsc73psjsii1nnpnuocc5.png" alt="Heatmapify estimate for a video with no official Most-replayed curve: engagement curve with top 3 moments, plus the four signals underneath." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why "Ghost in the Machine"?&lt;/strong&gt; The heatmap is a record of past viewers: people no longer watching whose attention still shapes the video. When YouTube won't show that record, Heatmapify reconstructs it from what they left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live dashboard:&lt;/strong&gt; &lt;a href="https://heatmapify.onrender.com" rel="noopener noreferrer"&gt;https://heatmapify.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;"See a sample result →"&lt;/strong&gt; for a full result with no setup.&lt;/li&gt;
&lt;li&gt;To analyse your own links, run the open-source server on your Windows or Mac (one double-click, about 5 minutes) and connect the dashboard to it. YouTube blocks most cloud IPs, so this is how it stays reliable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/velvetthunder15" rel="noopener noreferrer"&gt;
        velvetthunder15
      &lt;/a&gt; / &lt;a href="https://github.com/velvetthunder15/heatmapify" rel="noopener noreferrer"&gt;
        heatmapify
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Extracts the most and the least engaging parts of any given Youtube video. Gives an elaborate estimation when 'Most Replayed' data is unavailable using comments, captions, audio and visuals. 
    &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;Heatmapify&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Runs on your own Windows or Mac for free. Paste a YouTube link, get the &lt;strong&gt;most&lt;/strong&gt; and &lt;strong&gt;least engaging moments&lt;/strong&gt; of the video, with a
dashboard that shows exactly why.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses YouTube's own &lt;strong&gt;"Most replayed"&lt;/strong&gt; data when the video has it.&lt;/li&gt;
&lt;li&gt;Otherwise builds a clearly labelled &lt;strong&gt;estimate&lt;/strong&gt; from four signals: comments, captions, audio and visuals.&lt;/li&gt;
&lt;li&gt;Never makes numbers up: if nothing usable exists, you get a clear error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dashboard:&lt;/strong&gt; &lt;a href="https://heatmapify.onrender.com" rel="nofollow noopener noreferrer"&gt;https://heatmapify.onrender.com&lt;/a&gt;  Host your own copy: &lt;a href="https://render.com/deploy?repo=https://github.com/velvetthunder15/heatmapify" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c3053e93bc9f0a2cd84050a5ff9f07cc5e639621a72e50dce48781f4a38f10e2/68747470733a2f2f72656e6465722e636f6d2f696d616765732f6465706c6f792d746f2d72656e6465722d627574746f6e2e737667" alt="Deploy to Render"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick start:&lt;/strong&gt; &lt;a href="https://github.com/velvetthunder15/heatmapify#quick-start-windows-about-5-minutes" rel="noopener noreferrer"&gt;Windows&lt;/a&gt; · &lt;a href="https://github.com/velvetthunder15/heatmapify#quick-start-macos-about-5-minutes" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Confidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;official&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YouTube publishes "Most replayed" data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;estimated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No official data, so comments, captions, audio and visuals are scored&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;high&lt;/code&gt; / &lt;code&gt;medium&lt;/code&gt; / &lt;code&gt;low&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;error&lt;/td&gt;
&lt;td&gt;Nothing usable&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;no_data_available&lt;/code&gt; (never fabricated)&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;Quick start (Windows, about 5 minutes)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;You need Windows 10 or 11 and nothing else. No Docker, no WSL, no Redis, no paid hosting.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Get the code&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Either clone it:&lt;/p&gt;
&lt;div class="highlight highlight-source-batchfile notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/velvetthunder15/heatmapify.git
&lt;span class="pl-k"&gt;cd&lt;/span&gt; heatmapify&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;or…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/velvetthunder15/heatmapify" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. FastAPI + RQ + Redis (or single-process in-memory mode), yt-dlp, librosa, ffmpeg, plus a plain HTML/CSS/JS dashboard.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Timeline note:&lt;/strong&gt; the repository was created on Oct 26 at about 01:00 PDT, roughly 8 hours before the challenge window opened at 09:00 PDT. The first two commits (the v1 API and a self-hosting script) came before 09:00 PDT. Everything else, including the dashboard, Render deploy, Windows/macOS runners, security hardening and score calibration, was built during the challenge week.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YouTube URL
   │
   ▼
official "Most replayed"? ──yes──▶ segments (source: official, confidence: high)
   │ no
   ▼
split the video into 10-second windows
   │
   ├─ comments   → timestamp density
   ├─ captions   → hook / emphasis / topic-shift scoring
   ├─ audio      → loudness / onsets / flatness (librosa)
   └─ visuals    → motion &amp;amp; cut density (ffmpeg frames)
   │
   ▼
weighted blend → reshaped to look like real "Most replayed" data → top &amp;amp; bottom moments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official data first.&lt;/strong&gt; yt-dlp's &lt;code&gt;heatmap&lt;/code&gt; field, then a fallback that parses &lt;code&gt;ytInitialData&lt;/code&gt; from the watch page (old &lt;code&gt;heatMarkers&lt;/code&gt; and newer &lt;code&gt;macroMarkersListEntity&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jobs.&lt;/strong&gt; Official lookups return at once; full estimates run as RQ background jobs while the dashboard shows progress. Results are cached (24 h official, 7 days estimates).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calibration.&lt;/strong&gt; A reshaping step and a small &lt;code&gt;calibrate&lt;/code&gt; tool make a typical estimated segment score like a typical official one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional LLM pass.&lt;/strong&gt; Caption scoring can be blended with an LLM rating through any OpenAI-compatible endpoint, including a local open-weight model. It's off by default, and Heatmapify works fully without it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest output.&lt;/strong&gt; Every response includes &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;confidence&lt;/code&gt;, &lt;code&gt;confidence_reason&lt;/code&gt;, &lt;code&gt;signals_used&lt;/code&gt; and &lt;code&gt;signals_skipped&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Used Render
&lt;/h2&gt;

&lt;p&gt;Render is the public face of Heatmapify: it's where anyone opens it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The dashboard is a Render Static Site, defined as code.&lt;/strong&gt; &lt;code&gt;render.yaml&lt;/code&gt; is a Render Blueprint that publishes &lt;code&gt;dashboard/&lt;/code&gt; and auto-deploys on every push to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security headers live in the Blueprint.&lt;/strong&gt; A strict Content-Security-Policy (only YouTube's image CDN and &lt;code&gt;youtube-nocookie.com&lt;/code&gt; embeds), &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;, &lt;code&gt;nosniff&lt;/code&gt;, a referrer policy, a locked-down Permissions-Policy and COOP. Every deploy and every fork ships the same protections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click self-hosting.&lt;/strong&gt; A &lt;strong&gt;Deploy to Render&lt;/strong&gt; button in the README stands up your own copy from the Blueprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Splitting the parts.&lt;/strong&gt; The UI runs on Render; YouTube processing runs on hardware the user controls. The dashboard talks to their server over HTTPS with a session-only key, so nobody's history or key sits on a shared server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs where YouTube lets it.&lt;/strong&gt; A closed SaaS version would spend its life fighting captchas. Open source means anyone can run it on their own connection, free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The scoring isn't a black box.&lt;/strong&gt; Weights, calibration and keyword lists are plain config and plain Python. Think comments should count more than visuals on gaming videos? Change &lt;code&gt;WEIGHT_COMMENTS&lt;/code&gt; and see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's built on open shoulders:&lt;/strong&gt; yt-dlp, youtube-transcript-api, librosa, ffmpeg, FastAPI, RQ and Redis. Heatmapify is MIT licensed, so the next person can take it further.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt;: dashboard deployed from a Render Blueprint with auto-deploys, security headers in code, and a one-click Deploy to Render button.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
