<?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: Malay-dev</title>
    <description>The latest articles on DEV Community by Malay-dev (@malaydev).</description>
    <link>https://dev.to/malaydev</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%2F956164%2Fc0538d99-4b9b-4554-9877-357f79361d4a.png</url>
      <title>DEV Community: Malay-dev</title>
      <link>https://dev.to/malaydev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/malaydev"/>
    <language>en</language>
    <item>
      <title>My Browser History Wrote Its Own Horror Story. I Just Watched.</title>
      <dc:creator>Malay-dev</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:20:01 +0000</pubDate>
      <link>https://dev.to/malaydev/my-browser-history-wrote-its-own-horror-story-i-just-watched-1bb4</link>
      <guid>https://dev.to/malaydev/my-browser-history-wrote-its-own-horror-story-i-just-watched-1bb4</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;It's 2am. You're on Stack Overflow. Again. For the seventh time this week. You know how to reverse a string. You've known for years. You just need to hear it from a stranger who asked in 2009.&lt;/p&gt;

&lt;p&gt;Nobody sees your browser history. But what if something did — and narrated it back to you like a Victorian ghost story?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser History Horror&lt;/strong&gt; reads your Chrome history, detects your most unhinged browsing sessions using anomaly detection, and feeds them to Gemma running locally. Gemma writes it back as gothic horror. ElevenLabs reads it aloud in a creepy voice. You sit there and take it.&lt;/p&gt;

&lt;p&gt;Your history never leaves your machine. The AI that judges you lives on your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Archivist Speaks
&lt;/h2&gt;

&lt;p&gt;This is real output from my actual browsing history. I wish I was making this up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;It began on Monday at 23:47. A single search — innocent enough on its face.
The developer already possessed this knowledge. They had possessed it for
years. Yet here they were, returning to the eternal repository of unanswered
questions, seeking the validation of strangers who had asked the same thing
in 2009.

They left. They returned. They left again. Eight times between 23:47 and
00:31, the same domain welcomed them back with the patience of a very old
spider.

The orange forum came next — a brief interlude, a glance at the horrors
others had inflicted upon their codebases. Reassuring in its way. At least
they were not that.

At 01:15, something shifted. The work-adjacent sites fell away. What replaced
them was a video labyrinth, vast and illuminated, designed by engineers who
understood that the human soul has no natural stopping point.

The last entry: 01:44. A search that shall remain unrecorded. The browser
was closed, and the darkness of the room was left to do what darkness does.

Tomorrow was Tuesday. It had already begun.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Stack Overflow is &lt;em&gt;"the eternal repository of unanswered questions."&lt;/em&gt; Reddit is &lt;em&gt;"the orange forum."&lt;/em&gt; YouTube is &lt;em&gt;"the video labyrinth."&lt;/em&gt; LinkedIn is &lt;em&gt;"the professional purgatory."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Gemma never uses real URLs. It gives every site a gothic alias and writes about your habits like a disappointed Victorian ghost.&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser SQLite ──► History Reader ──► Anomaly Detector ──► Gemma Narrator ──► Gothic UI
     (local)         (pandas)        (TabPFN/heuristic)    (Ollama local)    (FastAPI + SSE)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 1: Summon Your History
&lt;/h3&gt;

&lt;p&gt;Chrome stores everything in a SQLite file. The tool copies it to temp (bypasses the browser lock), extracts the last 7 days, and engineers features — hour of visit, domain frequency, session gaps, rapid revisits.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  📖 History found: ~/Library/Application Support/Google/Chrome/Default/History
  1,395 rows extracted in 0.1s
  1,215 marked as heuristically haunted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;87% of my browsing is "heuristically haunted." I don't want to talk about it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Detect the Hauntings
&lt;/h3&gt;

&lt;p&gt;The heuristic rules catch the obvious sins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visits between midnight and 4am&lt;/li&gt;
&lt;li&gt;5+ visits to the same domain within 30 minutes&lt;/li&gt;
&lt;li&gt;Rapid-fire revisits (&amp;lt; 30 seconds apart)&lt;/li&gt;
&lt;li&gt;Unknown domains after 10pm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TabPFN (tabular foundation model from Prior Labs) refines this — it picks up subtler patterns like a slow drift from work tools → entertainment → doom-scrolling that only looks haunted in context. If TabPFN isn't available, heuristic scoring works fine on its own.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 chapters extracted:
  Saturday, Oct 24  | 16:09 | MALEVOLENT (1.00) | claude.ai
  Sunday, Oct 25    | 07:09–17:37 | MALEVOLENT (1.00) | gitlab, google
  Monday, Oct 26    | 04:16–15:12 | MALEVOLENT (1.00) | jira, google, docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every single session: MALEVOLENT. The algorithm is not wrong.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: The Archivist Writes
&lt;/h3&gt;

&lt;p&gt;Gemma 3 4B runs locally via Ollama. Each chapter gets a system prompt that enforces the gothic voice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Second person (&lt;em&gt;"the developer"&lt;/em&gt;, &lt;em&gt;"they"&lt;/em&gt;) — never breaks character&lt;/li&gt;
&lt;li&gt;Sites become gothic aliases — never raw URLs&lt;/li&gt;
&lt;li&gt;One darkly comic observation per chapter&lt;/li&gt;
&lt;li&gt;One ominous closing line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prompt also includes visit patterns, timestamps, and intensity scores so Gemma can reference your actual behavior without ever seeing the raw data.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: The Séance
&lt;/h3&gt;

&lt;p&gt;A gothic web UI streams everything in real time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flickering candle SVGs in the header&lt;/li&gt;
&lt;li&gt;Chapters stream in with a typewriter effect as Gemma generates them&lt;/li&gt;
&lt;li&gt;Each chapter shows a &lt;strong&gt;Haunting Intensity&lt;/strong&gt; bar powered by the anomaly score&lt;/li&gt;
&lt;li&gt;ElevenLabs reads each chapter aloud in a measured, deliberate voice&lt;/li&gt;
&lt;li&gt;A fog layer drifts at the bottom of the page because atmosphere matters&lt;/li&gt;
&lt;li&gt;When it's over, download your &lt;strong&gt;Grimoire&lt;/strong&gt; — a self-contained HTML file of your sins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No React. No build step. One HTML file with vanilla JS. The séance needs no bundler.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Privacy Argument
&lt;/h2&gt;

&lt;p&gt;This is the slide I'd put in a conference talk if I gave conference talks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Where it goes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser history&lt;/td&gt;
&lt;td&gt;Copied to temp, queried, deleted. Never leaves your machine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature vectors&lt;/td&gt;
&lt;td&gt;Processed locally by TabPFN. Never sent anywhere.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narration prompts&lt;/td&gt;
&lt;td&gt;Sent to local Ollama. Never touches a cloud API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generated prose&lt;/td&gt;
&lt;td&gt;Sent to ElevenLabs for TTS — &lt;strong&gt;only&lt;/strong&gt; the gothic text, not your history.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentry traces&lt;/td&gt;
&lt;td&gt;Latency numbers and model names only. No content.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Your browser history is a confessional. The only AI that should read it is one that lives on your hardware and can't phone home. Gemma running locally via Ollama is the only appropriate choice here. A cloud API would mean shipping your 2am Stack Overflow spiral to someone else's server. No.&lt;/p&gt;
&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Prerequisites: Python 3.11+, Ollama running&lt;/span&gt;
ollama pull gemma3:4b

git clone https://github.com/Malay-dev/browser-history-horror.git
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-history-horror
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python seance.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Browser opens. Click the button. Face your sins. Three commands.&lt;/p&gt;

&lt;p&gt;ElevenLabs is optional — without an API key, the browser's built-in speech synthesis does the reading (less creepy, still functional). Sentry tracing is optional too. The core experience is Gemma + your history + guilt.&lt;/p&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/Malay-dev" rel="noopener noreferrer"&gt;
        Malay-dev
      &lt;/a&gt; / &lt;a href="https://github.com/Malay-dev/browser-history-horror" rel="noopener noreferrer"&gt;
        browser-history-horror
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;🕯️ Browser History Horror&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"On Tuesday at 2am, the developer returned to Stack Overflow for the seventh time
They searched for 'how to center a div.' They knew the answer. They just needed to hear it again."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A fully local, privacy-first tool that reads your browser history, detects anomalous
browsing patterns, and narrates your week as a gothic horror story — complete with
creepy voice narration and a downloadable "grimoire" of your sins.&lt;/p&gt;
&lt;p&gt;Your browsing history &lt;strong&gt;never leaves your machine&lt;/strong&gt; during analysis. The only data that
touches an external service is the generated narration text sent to ElevenLabs for
text-to-speech (and that's optional).&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href="https://hacktoberfest.com" rel="nofollow noopener noreferrer"&gt;Hacktoberfest 2026&lt;/a&gt; &lt;strong&gt;Ghost in the Machine&lt;/strong&gt; challenge.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Browser SQLite ──► History Reader ──► Anomaly Detector ──► Gemma Narrator ──► Gothic UI
     (local)         (pandas)          (TabPFN/heuristic)    (Ollama local)    (FastAPI + SSE)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt; — Copies your Chrome/Chromium/Brave/Edge history from SQLite (bypasses the browser lock)&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Malay-dev/browser-history-horror" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser-history-horror/
├── seance.py              # Entry point — checks Ollama, finds history, starts server
├── src/
│   ├── history.py         # SQLite reader + feature engineering (8 features)
│   ├── detector.py        # TabPFN scoring + session grouping
│   ├── narrator.py        # Gothic prompt design + Ollama streaming
│   ├── tts.py             # ElevenLabs with speechSynthesis fallback
│   ├── api.py             # FastAPI + SSE streaming + grimoire generation
│   └── tracer.py          # Sentry span instrumentation
├── frontend/
│   └── index.html         # Self-contained gothic UI (19KB, zero deps)
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Gemma 3 4B via Ollama&lt;/strong&gt; — local inference, streaming. The system prompt is doing the heavy lifting — it enforces the gothic voice, prevents URL leakage, and structures each chapter with a comic beat and an ominous closer. Domain aliasing happens post-generation as a safety net: even if Gemma slips, &lt;code&gt;sanitize_narration()&lt;/code&gt; catches raw domains and replaces them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TabPFN&lt;/strong&gt; — in-context tabular classification. No train/test split needed. The heuristic seed labels ("obviously haunted" by simple rules) become training signal, and TabPFN picks up cross-feature interactions. The fallback to heuristic-only scoring means the tool works even without the gated model weights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FastAPI + SSE&lt;/strong&gt; — the narrator streams chunks as Gemma generates them. The browser consumes Server-Sent Events and renders text character by character. No WebSocket complexity, no polling. TTS audio is generated async and served via a separate endpoint when ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt; — &lt;code&gt;eleven_turbo_v2_5&lt;/code&gt; for low latency. The free tier gives 10,000 characters/month — enough for one full séance (~7,500 chars across 5 chapters). Falls back to the Web Speech API with pitch dropped to 0.75 for a budget-gothic effect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry&lt;/strong&gt; — every pipeline stage is a span: history extraction, feature engineering, TabPFN scoring, each Gemma chapter, each ElevenLabs call. The trace waterfall shows exactly where the time goes (spoiler: it's Gemma, always Gemma).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt; — one HTML file. CSS custom properties for the color palette. SVG candles with randomized flicker animations. Typewriter effect via JS chunked rendering. The haunting intensity bar is a CSS gradient driven by the anomaly score. The grimoire download generates a self-contained HTML file server-side.&lt;/p&gt;

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

&lt;p&gt;Browser history is the most personal dataset on your computer. Every anxious 2am search, every rabbit hole, every time you Googled something you already knew — it's all there in plain SQLite.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;only&lt;/em&gt; way to build something like this responsibly is with open-weight models running locally. Gemma on Ollama means the model that reads your history lives on your hardware. No API keys for the scary part. No telemetry. No "we improved our model using your data."&lt;/p&gt;

&lt;p&gt;Open-source also means you can read exactly what data goes where. The privacy model isn't a policy document — it's six Python files you can audit in 10 minutes.&lt;/p&gt;

&lt;p&gt;I built a tool that reads your most private data and turns it into entertainment. If that doesn't make the case for local AI, I don't know what does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gothic Payoff
&lt;/h2&gt;

&lt;p&gt;Before: Browser history is a log file you never look at.&lt;/p&gt;

&lt;p&gt;After: Browser history is a horror story you can't stop reading.&lt;/p&gt;

&lt;p&gt;I ran this on my own history and learned that I visited claude.ai 9 times in one sitting on a Saturday afternoon. The Archivist called it &lt;em&gt;"a peculiar fixation"&lt;/em&gt; and &lt;em&gt;"a futile endeavour mirroring the human condition itself."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's not wrong. Ship it. Face your sins.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Gemma&lt;/strong&gt; — Core narrative engine. Local inference via Ollama, streaming generation, gothic system prompt with domain aliasing and output sanitization. Every word of the horror story is Gemma. #Gemma&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TabPFN&lt;/strong&gt; — Anomaly detection on browsing session features. In-context classification on 8 engineered features with heuristic seed labels. Surfaces the sessions that become chapters. #TabPFN&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt; — Chapter narration voiced in-browser. Turbo v2.5 for low latency, with Web Speech API fallback. Only receives generated prose, never raw history. #ElevenLabs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry&lt;/strong&gt; — Full pipeline traced with spans. History extraction → feature engineering → TabPFN scoring → per-chapter Gemma generation → per-chapter TTS. Latency, token counts, audio sizes — all in one trace waterfall. #Sentry&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt; — Gothic web UI deployed as a static site for the public demo. Anonymized fixture data so visitors can experience the séance without exposing their own history. #Render&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ghostinthemachine</category>
      <category>python</category>
    </item>
    <item>
      <title>The Ticket Sold Out While I Was Lazyinhh... So I Built Clutch.</title>
      <dc:creator>Malay-dev</dc:creator>
      <pubDate>Sun, 25 Oct 2026 16:38:24 +0000</pubDate>
      <link>https://dev.to/malaydev/the-ticket-sold-out-while-i-was-lazyinhh-so-i-built-clutch-542f</link>
      <guid>https://dev.to/malaydev/the-ticket-sold-out-while-i-was-lazyinhh-so-i-built-clutch-542f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I missed GDG DevFest Bengaluru by one day. The announcement sat unread in my Discord (cause too much clutter and procrastination on reading all those) while the last ticket sold.&lt;/p&gt;

&lt;p&gt;I don't need more notifications. I need something that knows what I can't afford to miss.&lt;/p&gt;

&lt;p&gt;Clutch watches your communities — Discord, Luma, KonfHub, Hacktoberfest, RSS - scores every event against your interests using Gemma 3 locally, and puts only what matters on your Google Calendar with colors that escalate as deadlines approach.&lt;/p&gt;

&lt;p&gt;330+ events. 5 sources. One calendar || feed || any form factor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma knows the difference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Profile: AI/ML, open source, hackathons, robotics, Bengaluru

[HIGH    ] 0.79  Build Agents with Omega (Bengaluru)
[HIGH    ] 0.77  Physical AI Demo Night (Bengaluru)
[HIGH    ] 0.76  Hacktober Hack (Bengaluru)
[INFO    ] 0.19  10 Tips for CSS Grid Layouts
[INFO    ] 0.05  Flower Bouquet Out Of Pipecleaners
[INFO    ] 0.05  Social dynamics of toxic metal in medieval Europe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;A flower bouquet workshop never even reaches the model. Pre-filter catches it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Calendar does the nagging
&lt;/h3&gt;

&lt;p&gt;Google Calendar's native colors. No emojis. Time drives the escalation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time left&lt;/th&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Suffix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;7 days&lt;/td&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-7 days&lt;/td&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;td&gt;[5d left]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;3 days&lt;/td&gt;
&lt;td&gt;Red&lt;/td&gt;
&lt;td&gt;[TOMORROW]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Past&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;auto-deleted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fpo90d47ijps6ffr8lox7.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%2Fpo90d47ijps6ffr8lox7.png" alt="Google Calendar showing Clutch Radar with orange and red color-coded events approaching their deadlines" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77tp9f3p6kg2wzg32tai.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%2F77tp9f3p6kg2wzg32tai.png" alt="Clutch architecture diagram showing connectors flowing through pre-filter and Gemma scoring to Google Calendar, backed by Tiger Data and Temporal" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Connectors
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F562bz750q70vp9nxe3qd.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%2F562bz750q70vp9nxe3qd.png" alt="Terminal output of clutch connectors command showing 5 auto-discovered plugins - discord, hacktoberfest, konfhub, luma, and rss" width="799" height="200"&gt;&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;Events&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Luma&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KonfHub&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacktoberfest&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSS&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discord&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;Bot token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Every connector is a standalone pip package. &lt;code&gt;pip install&lt;/code&gt; and Clutch discovers it. We want the community to add Telegram, Slack, GitHub, Meetup — any source where opportunities hide in noise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Escalation in action
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3os9cl4noyjmqk68mt33.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%2F3os9cl4noyjmqk68mt33.png" alt="Terminal output of clutch escalate showing time-based color changes - red for expired and today, orange for events 4 days away" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The radar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdimhbmc7ca1dal8hkpc.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%2Fsdimhbmc7ca1dal8hkpc.png" alt="Terminal output of clutch radar showing a priority table with 20 scored events sorted by relevance" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Temporal workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6npwvtyxjbccfti67623.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%2F6npwvtyxjbccfti67623.png" alt="Temporal UI showing the Clutch one-shot workflow with 6 completed activities - fetch, dedup, score, persist, and calendar sync" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&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/Malay-dev" rel="noopener noreferrer"&gt;
        Malay-dev
      &lt;/a&gt; / &lt;a href="https://github.com/Malay-dev/clutch" rel="noopener noreferrer"&gt;
        clutch
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Clutch&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;The AI that won't let you miss what matters.&lt;/p&gt;

&lt;p&gt;Clutch is a local-first AI agent that monitors your communities — Discord, Luma, KonfHub, Hacktoberfest, RSS — scores every event against your interest profile using Gemma 3, and puts what matters on your Google Calendar with escalating color-coded reminders.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;5 Connectors (330+ events)
  -&amp;gt; Pre-filter (keyword match, drops obvious noise)
  -&amp;gt; Gemma 3 scoring (interest, urgency, scarcity, impact)
  -&amp;gt; Google Calendar (time-based color escalation)
  -&amp;gt; Temporal (durable 4h cycle, survives restarts)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Events start blue on your calendar. As deadlines approach, they turn orange, then red. Past events are auto-deleted. You never configure this — time does it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Prerequisites: Python 3.12+, Ollama with gemma3:4b, Podman (optional)&lt;/span&gt;
ollama pull gemma3:4b
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Clone and install&lt;/span&gt;
git clone https://github.com/Malay-dev/clutch.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; clutch
uv venv &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate
uv pip install -e &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;.[dev]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
uv pip install -e connectors/rss&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Malay-dev/clutch" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Gemma 3 4B via Ollama&lt;/strong&gt; — local inference, no cloud. Four-dimension scoring (interest, urgency, scarcity, impact) as structured JSON. Batch mode, 5 events per LLM call. Pre-filter drops noise before the model sees anything.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The prompt does the heavy lifting — it checks attending eligibility (same city? online? worth traveling?), penalizes expired events, and scores conservatively. Most things are noise. Only what you can realistically act on gets through.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scoring guide baked into the prompt:
- Generic blog post: 0.1-0.2
- Hackathon in your city matching interests: 0.8+
- Great topic but wrong city: 0.2-0.4 (unless online)
- Online workshop matching interests: 0.6-0.8
- Expired event: urgency 0.0 regardless of topic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Temporal&lt;/strong&gt; — 6-activity durable workflow. Connectors fetch in parallel. If one fails, the rest proceed. 4-hour durable timer survives restarts. Every activity visible in the Temporal UI. - Durable code, best observability, native OSS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Calendar API&lt;/strong&gt; — native color IDs, time-based escalation, triple dedup (in-memory + SQLite + Calendar-side), capped at 10 active events. (Google here, but any calendar app with API support could be used)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pgvector (Tiger Data)&lt;/strong&gt; — Temporal persistence backend + future interest graph. - all in one&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Podman&lt;/strong&gt; — full stack in containers. Ollama native on host for GPU.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your interest profile is a YAML file. Your data stays on your machine. The model runs on your hardware. That's the whole point.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Clutch monitors your Discord messages, your event feeds, your community channels. That is attention data. With Gemma running locally, none of it leaves your machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A closed API would mean every community message gets shipped somewhere you don't control. Open weight means offline, on a plane, behind a firewall. Swap the model whenever — Gemma today, Llama tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Before: 6 Discord servers, 3 Telegram groups, Luma, KonfHub, RSS. Checked manually. Usually too late.&lt;/p&gt;

&lt;p&gt;After: I check my calendar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I used Clutch this week to track this hackathon's own deadline. It worked.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ship your own
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's the thing — don't run this on your MacBook while you work. Deploy it on a Raspberry Pi, an old laptop, any machine gathering dust. Let it run 24/7 as your personal attention server. Gemma runs slow on a Pi — ~30s per event instead of 4. But for a 4-hour cycle, that's fine. Slow and steady is literally the point.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We move fast. The tech world moves faster. Conferences sell out. CFPs close quietly. Hackathon deadlines pass while you're "going to get to it."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't just read about it. Deploy it. Level up.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set it up once. Forget about it. Your calendar fills itself with what matters. Opportunities stop slipping through the cracks while you're busy shipping code or, you know, lazying.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Gemma&lt;/strong&gt; — Core scoring engine. Local inference, batch mode, structured output. 100+ events per cycle on consumer hardware. #Gemma&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temporal&lt;/strong&gt; — 6-activity workflow. Parallel fetches, retries, durable timers, full UI observability. #Temporal&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tiger Data&lt;/strong&gt; — pgvector as Temporal backend and interest graph store. #Tiger&lt;/p&gt;

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