<?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: Shikhar Verma</title>
    <description>The latest articles on DEV Community by Shikhar Verma (@shikhyy).</description>
    <link>https://dev.to/shikhyy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Shikhar Verma</title>
      <link>https://dev.to/shikhyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shikhyy"/>
    <language>en</language>
    <item>
      <title>Precedent: an agent that knows which Solidity security advice has been overruled</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:34:05 +0000</pubDate>
      <link>https://dev.to/shikhyy/precedent-an-agent-that-knows-which-solidity-security-advice-has-been-overruled-i10</link>
      <guid>https://dev.to/shikhyy/precedent-an-agent-that-knows-which-solidity-security-advice-has-been-overruled-i10</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Security advice for Solidity goes stale, and stale advice in this field is expensive. Docs, EIPs, audit reports and old blog posts contradict each other, and much of that disagreement is just time passing: the compiler and the EVM changed underneath the advice. A keyword search or a plain LLM returns the outdated answer with full confidence, because both only see text, not the fact that one piece of text replaced another for a given version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precedent&lt;/strong&gt; treats security guidance like case law. Every claim carries a date and a compiler-version scope, and newer rulings overrule older ones. Ask "is &lt;code&gt;transfer()&lt;/code&gt; still safe on 0.8.28?" and you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;ruling&lt;/strong&gt; for your exact version,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;docket&lt;/strong&gt;: what the older advice said (struck through) and what overruled it, each linked to its original source,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;contested&lt;/strong&gt; status when sources genuinely disagree and nothing controls, instead of a guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It covers [[5]] patterns in depth: [[LIST, e.g. ETH sends with transfer/send, selfdestruct, SafeMath, ERC-4626 inflation attacks, and tx.origin as a no-change control]]. The control case matters: it checks that the agent doesn't invent drift where none exists.&lt;/p&gt;

&lt;p&gt;Precedent summarizes published sources. &lt;strong&gt;It is not an audit&lt;/strong&gt;, and every verdict says so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Solidity developers who need a citable answer for their compiler version, reviewers doing quick triage, and hackathon builders who don't want to ship a pattern that was deprecated last year.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; [[DEPLOYED URL]]&lt;/p&gt;

&lt;p&gt;[[VIDEO EMBED OR GIF: a verdict resolving, with overruled claims struck through and the controlling claim highlighted]]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try these questions&lt;/strong&gt; [[replace with the questions that work well in your build]]:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[[Question 1: a stale-trap pattern with a version]]&lt;/li&gt;
&lt;li&gt;[[Question 2: a genuinely contested pattern]]&lt;/li&gt;
&lt;li&gt;[[Question 3: the stable control, which should show no drift]]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;[[GITHUB REPO URL]]&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;Question + compiler version
        │
        ▼
  Precedent agent (Vercel AI SDK, multi-step tool loop)
        │
        ├──► Context MCP endpoint A (Knowledge Base)
        │       what do the sources say? where do they conflict?
        │
        ├──► Context MCP endpoint B (dataset, GROQ)
        │       verified claims in scope for this version,
        │       with supersession and sources
        ▼
  Verdict: status, stance, claim IDs only
        │
        ▼
  UI fetches claim text, dates, URLs from Sanity by ID
        │
        ▼
  Ruling card + docket timeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify&lt;/strong&gt; the pattern and version from the question and the version selector. If no version is given, the agent assumes the latest in the dataset and says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the sources&lt;/strong&gt; through the Knowledge Base endpoint to see what they say and where they conflict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query the claims&lt;/strong&gt; through the GROQ endpoint: the verified claims whose version range covers the version, plus which claims supersede which.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve.&lt;/strong&gt; Controlling claims are in-scope claims that no other in-scope claim supersedes. If their stances agree, the status is &lt;em&gt;settled&lt;/em&gt;. If they differ, it's &lt;em&gt;contested&lt;/em&gt; and no winner is picked. If none exist, it's &lt;em&gt;out of scope&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return IDs, not prose.&lt;/strong&gt; The agent emits a structured verdict containing claim IDs. The UI then loads the text, dates and URLs from Sanity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is deliberate. The model never writes a source, a URL or a date, so it can't fabricate a citation. The API route also re-checks that every ID exists and recomputes the status itself; on a mismatch the user sees an error, not a wrong answer.&lt;/p&gt;

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

&lt;p&gt;The agent reads Sanity through &lt;strong&gt;two Context MCP endpoints&lt;/strong&gt;, because they do different jobs. An endpoint backed by a Knowledge Base serves Knowledge Base mode, and an endpoint backed by a dataset serves GROQ mode, so I use one of each.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoint A: Knowledge Base
&lt;/h3&gt;

&lt;p&gt;I pointed Sanity Context at [[N]] source documents: [[e.g. Solidity docs and changelogs, EIPs, OpenZeppelin docs and release notes, N public audit reports]]. Sanity distills them into a navigable Knowledge Base where each entry stays linked to the source it came from, and where conflicting claims surface side by side with their sources. [[Add what you saw: how many entries it produced, an example of a contradiction it surfaced on its own, and any decision you made about a conflict.]]&lt;/p&gt;

&lt;p&gt;I stayed well within the beta's ~150-document budget on purpose: a small, curated set of primary sources beats a large noisy one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoint B: the dataset, in GROQ mode
&lt;/h3&gt;

&lt;p&gt;Knowledge Base mode can't express "this claim applies only to 0.8.x and was replaced by that one", so I modeled that as structured content:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pattern&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A named pattern, a short summary, and aliases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Title, URL, publisher, kind (docs, EIP, audit, release notes, blog), publish date, license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A paraphrased statement (280 characters max), a stance (safe, unsafe, deprecated, mixed), &lt;code&gt;fromVersion&lt;/code&gt; / &lt;code&gt;toVersion&lt;/code&gt;, &lt;code&gt;supersedes[]&lt;/code&gt;, &lt;code&gt;contradicts[]&lt;/code&gt;, and a confidence flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compiler versions are stored as numbers (for example 0.8.28 becomes 8028) so GROQ can compare them. Only claims I had checked by hand against the primary source are marked &lt;code&gt;verified&lt;/code&gt;, and only those are used. [[N]] claims across [[5]] patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ruling is computed, not stored.&lt;/strong&gt; This query returns every in-scope claim and which other claims supersede it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "claim" &amp;amp;&amp;amp; confidence == "verified" &amp;amp;&amp;amp; pattern._ref == $patternId
  &amp;amp;&amp;amp; (!defined(fromVersion) || fromVersion &amp;lt;= $v)
  &amp;amp;&amp;amp; (!defined(toVersion)   || toVersion   &amp;gt;= $v)]{
    _id, statement, stance,
    "source": source-&amp;gt;{title, url, publishedAt},
    "supersededBy": *[_type == "claim" &amp;amp;&amp;amp; ^._id in supersedes[]._ref]._id
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The controlling claims are the ones with no in-scope claim in &lt;code&gt;supersededBy&lt;/code&gt;. Because the ruling is derived, fixing one claim or adding a newer one changes every affected answer immediately, with no re-curation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why structure matters here
&lt;/h3&gt;

&lt;p&gt;Keyword search finds passages that mention a pattern. It has no way to know that one passage replaced another for a specific compiler version. The &lt;code&gt;supersedes&lt;/code&gt; chain and the version scope are the content model, and the agent's correctness depends on them. The Knowledge Base shows what the sources say; the dataset says which statement controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools the agent used
&lt;/h3&gt;

&lt;p&gt;[[List the actual tool names each endpoint exposed, discovered at runtime, and what the agent used each one for. Example format: &lt;code&gt;tool_name&lt;/code&gt; (endpoint A): used to ... ]]&lt;/p&gt;

&lt;p&gt;The Context endpoints are read-only, so the agent can't change the content. Claims are seeded by a script and edited in Studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does It Actually Beat the Alternatives?
&lt;/h2&gt;

&lt;p&gt;I wrote [[N]] "Stale-Trap" questions where the obvious answer is outdated: [[N]] stale traps, [[N]] genuinely contested cases, [[N]] stable controls, and [[N]] out-of-scope. I labeled the ground truth by hand from the verified claims, then ran three systems with the &lt;strong&gt;same model, same output schema, and [[3]] runs per question&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A: keyword search&lt;/strong&gt; over the raw sources (top passages given to the model, no tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B: Knowledge Base only&lt;/strong&gt; (Endpoint A without the claims layer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C: Precedent&lt;/strong&gt; (both endpoints)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because every system returns the same structured verdict, grading is deterministic rather than a model judging a model: an answer is &lt;em&gt;stale&lt;/em&gt; if it matches a superseded claim, and a citation is &lt;em&gt;correct&lt;/em&gt; if it includes a controlling claim.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Stale-answer rate (lower is better)&lt;/th&gt;
&lt;th&gt;Cites the controlling source&lt;/th&gt;
&lt;th&gt;Says "contested" when it should&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A: keyword search&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B: Knowledge Base only&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C: Precedent&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;[[Two or three sentences in your own words: which system did best, where B failed and why, and one specific question that shows the difference.]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Decisions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IDs only from the model.&lt;/strong&gt; Prevents fabricated citations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contested is a first-class outcome.&lt;/strong&gt; A security tool that picks a winner between genuinely conflicting sources is worse than one that says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified claims only.&lt;/strong&gt; Unreviewed claims never reach the ruling path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No fallback to model memory.&lt;/strong&gt; If the endpoints fail, the user gets an error, not a guess from the model's training data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small and deep.&lt;/strong&gt; [[5]] patterns done properly beat 50 done loosely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A control case.&lt;/strong&gt; &lt;code&gt;tx.origin&lt;/code&gt; has no drift, so a correct agent should report a stable answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guardrails
&lt;/h2&gt;

&lt;p&gt;Precedent never writes exploit code and never audits user code. Every verdict shows "Summarizes published sources. Not an audit." Claims are my paraphrases with links to the originals, and I used permissively licensed sources where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and What I Learned
&lt;/h2&gt;

&lt;p&gt;[[Write 3 to 4 honest items from your actual build. Prompts to answer: What broke first? What did the Knowledge Base do better or worse than expected? Where did the model misread supersession, and how did you fix it? How long did verifying claims by hand take, and what did you find?]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits, Honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[[N]] questions is a small sample, so treat the percentages as indicative, not conclusive.&lt;/li&gt;
&lt;li&gt;Only [[5]] patterns are covered.&lt;/li&gt;
&lt;li&gt;Claims are paraphrased and hand-verified, so errors are possible. Check the linked sources before relying on a ruling.&lt;/li&gt;
&lt;li&gt;[[Knowledge Bases are in beta; mention anything that didn't work as expected.]]&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;More patterns and more eras of the EVM&lt;/li&gt;
&lt;li&gt;Paste a code snippet and detect which patterns it touches&lt;/li&gt;
&lt;li&gt;A compare mode: the same pattern across two compiler versions&lt;/li&gt;
&lt;li&gt;[[Anything else you genuinely plan]]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; Next.js, TypeScript, Vercel AI SDK, Sanity Studio and Sanity Context, [[model name and provider]], deployed on [[Vercel]], with Google Antigravity as the coding environment. &lt;strong&gt;(keep only if true)&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: &lt;code&gt;[[YOUR SANITY PROJECT ID]]&lt;/code&gt; (dataset: &lt;code&gt;[[DATASET NAME]]&lt;/code&gt;)&lt;br&gt;
[[OR: public dataset URL, and confirm the dataset is public]]&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>First Light: The Privacy-First Morning Brief &amp; Radar for Hackathon Hunters</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:18:31 +0000</pubDate>
      <link>https://dev.to/shikhyy/first-light-the-privacy-first-morning-brief-radar-for-hackathon-hunters-2a0o</link>
      <guid>https://dev.to/shikhyy/first-light-the-privacy-first-morning-brief-radar-for-hackathon-hunters-2a0o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My friend Anant is a machine learning engineer, backend enthusiast, and avid hackathon hunter. Between tracking global tech affairs, web3 releases, ML benchmarks, hackathon registration windows, and daily personal tasks, his mornings were overwhelmed by a storm of notification badges, spam newsletters, and calendar alerts. He needed a way to wake up, glance at his phone, and see &lt;strong&gt;only the top 5 things that actually matter to him today&lt;/strong&gt;—without shipping his entire personal calendar, private to-do list, and unreleased project ideas to a third-party cloud LLM.&lt;br&gt;
To solve this, I built &lt;strong&gt;First Light&lt;/strong&gt;: a privacy-first, 100% locally-run morning intelligence brief and hackathon radar. Every morning at 6:30 AM, First Light:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gathers events from local ICS calendars, markdown to-do files, RSS news feeds, and a curated hackathon radar (DEV, Devpost, MLH, Kaggle, and Web3/ETHGlobal).&lt;/li&gt;
&lt;li&gt;Mathematically calculates urgency windows and deduplicates cross-posted hackathons across platforms.&lt;/li&gt;
&lt;li&gt;Uses a local open-weight model (&lt;strong&gt;Google Gemma 2B&lt;/strong&gt;) to synthesize the noise into a concise, prioritized 5-bullet morning brief tailored to Anant's profile.&lt;/li&gt;
&lt;li&gt;Delivers a native, lock-screen Web Push notification to his phone via a self-hosted PWA, complete with an interactive dashboard and an ElevenLabs audio briefing.
&amp;gt; &lt;em&gt;"Waking up to just 5 bullet points that actually matter to me—instead of 40 noisy emails and calendar popups—has completely changed my mornings. And knowing it's all running locally on my own machine makes me trust it enough to feed it my real daily to-do list."&lt;/em&gt; — Anant&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video Walkthrough:&lt;/strong&gt; &lt;a href="https://drive.google.com/drive/folders/14fRchsZYuhaCknnAouboAmxr66C3aRZ1?usp=share_link" rel="noopener noreferrer"&gt;Watch the Full Demo on Google Drive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Interface &amp;amp; Features:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;🔔 &lt;strong&gt;Native PWA Web Push:&lt;/strong&gt; Lock-screen notification delivered directly to mobile without third-party messaging apps.&lt;/li&gt;
&lt;li&gt;🌅 &lt;strong&gt;Dawn-Themed Dashboard:&lt;/strong&gt; Frosted glass UI displaying the AI briefing, deadline countdowns, and urgency meters.&lt;/li&gt;
&lt;li&gt;🎧 &lt;strong&gt;First Light Audio:&lt;/strong&gt; On-demand text-to-speech briefing player powered by ElevenLabs.&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Hackathon Radar:&lt;/strong&gt; Filterable list of competitions with direct registration links and AI "Should I enter?" verdicts.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Interactive To-Dos:&lt;/strong&gt; Real-time task completion synced directly to the local SQLite database.&lt;/li&gt;
&lt;/ul&gt;
&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/Shikhyy" rel="noopener noreferrer"&gt;
        Shikhyy
      &lt;/a&gt; / &lt;a href="https://github.com/Shikhyy/firstlight" rel="noopener noreferrer"&gt;
        firstlight
      &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;First Light 🌅&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A privacy-first, locally-run morning brief and hackathon radar. First Light cuts through the noise by summarizing your calendar, markdown to-do lists, RSS feeds, and upcoming hackathons into a single, personalized push notification every morning at 6:30 AM.&lt;/p&gt;

&lt;p&gt;All data fetching, deduplication, and AI summarization (using &lt;code&gt;gemma:2b&lt;/code&gt; via Ollama) runs 100% locally on your machine. Your schedule never leaves your device.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c673dbf44f5505c3f99efa7acea3ab186076ae5bc55ff3f5d07bff14bf5ed952/68747470733a2f2f7669612e706c616365686f6c6465722e636f6d2f383030783430302e706e673f746578743d46697273742b4c696768742b5057412b50726576696577"&gt;&lt;img src="https://camo.githubusercontent.com/c673dbf44f5505c3f99efa7acea3ab186076ae5bc55ff3f5d07bff14bf5ed952/68747470733a2f2f7669612e706c616365686f6c6465722e636f6d2f383030783430302e706e673f746578743d46697273742b4c696768742b5057412b50726576696577" alt="First Light PWA Preview"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hackathon Radar&lt;/strong&gt;: Aggregates and deduplicates hackathons from DEV, Devpost, MLH, Kaggle, and Web3 sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local AI Summarization&lt;/strong&gt;: Uses Ollama to read your top events and tell you &lt;em&gt;why&lt;/em&gt; they matter based on your configured interests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-First&lt;/strong&gt;: No cloud APIs for your personal data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA Web Push&lt;/strong&gt;: Sends a native lock-screen notification to your phone without relying on third-party apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Math&lt;/strong&gt;: LLMs are bad at math, so all deadline urgency and countdowns ("closes in 13h") are calculated entirely in Python before…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shikhyy/firstlight" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;strong&gt;Repository URL:&lt;/strong&gt; &lt;a href="https://github.com/Shikhyy/firstlight" rel="noopener noreferrer"&gt;https://github.com/Shikhyy/firstlight&lt;/a&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;First Light is engineered in Python with an installable CLI (&lt;code&gt;pip install -e .&lt;/code&gt;), backed by SQLite and a lightweight Flask PWA with a custom Service Worker.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Open-Source AI Architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-First Core:&lt;/strong&gt; We run Google's &lt;strong&gt;Gemma 2B&lt;/strong&gt; (&lt;code&gt;gemma:2b&lt;/code&gt;) locally via &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. It runs on consumer hardware (such as an Apple Silicon Mac) with near-zero latency and zero operational cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic Structured Outputs:&lt;/strong&gt; The pipeline enforces structured JSON schema validation (&lt;code&gt;BriefSummary&lt;/code&gt;) directly on the model's output to guarantee schema compliance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Cloud Fallbacks:&lt;/strong&gt; For cloud deployments where local Ollama is inaccessible, First Light seamlessly falls back to &lt;strong&gt;Hugging Face Serverless Inference&lt;/strong&gt; (&lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;) or Groq, keeping the architecture strictly on open Gemma models.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The "Code Does Dates, AI Judges" Architecture
&lt;/h3&gt;

&lt;p&gt;LLMs frequently hallucinate calendar math and relative dates. First Light enforces a strict architectural separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Engine (Python):&lt;/strong&gt; Date parsing, deadline countdowns (e.g., &lt;code&gt;"closes in 13h"&lt;/code&gt;), urgency scores ([0.0, 1.0]), and deduplication (canonical URL normalization + RapidFuzz token matching) are calculated purely in Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment Engine (Gemma):&lt;/strong&gt; The LLM receives pre-calculated facts and strictly evaluates relevance: &lt;em&gt;"Why does this matter to Shikhar based on his interests in ML, Web3, and Backend?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Resilient Pipeline &amp;amp; Fail-Safe Delivery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each data connector (DEV, Devpost, MLH, Kaggle, RSS, Calendar) is isolated in a try/except sandbox; if one scraper fails, the pipeline logs the error in a &lt;code&gt;source_runs&lt;/code&gt; health table and continues uninterrupted.&lt;/li&gt;
&lt;li&gt;If Ollama is offline or times out, the pipeline triggers a deterministic fallback generator, ensuring a morning brief is &lt;em&gt;always&lt;/em&gt; delivered on time.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Open innovation and open-weights models are essential for personal software like First Light:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Data Privacy:&lt;/strong&gt; Your personal calendar, daily tasks, health appointments, and unreleased project ideas are deeply intimate data. Routing this stream through proprietary closed APIs means sharing your life with centralized corporate servers. With Gemma running locally, your personal data literally never leaves your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Marginal Cost &amp;amp; No Rate Limits:&lt;/strong&gt; Closed APIs charge per token, rate-limit automated jobs, and risk breaking changes. Open models allow automated morning pipelines and background cron jobs to run indefinitely for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience &amp;amp; Vendor Independence:&lt;/strong&gt; Open innovation ensures First Light will function offline, on an airplane, or years in the future without risk of API deprecation, subscription price hikes, or account suspensions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;First Light was designed, implemented, and tested through an intensive pair-programming session using &lt;strong&gt;Google Antigravity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orchestrated the full project lifecycle: data connectors, SQLite schema design, fuzzy deduplication algorithms, Pydantic schema validation, and PWA Web Push implementation with VAPID crypto keys.&lt;/li&gt;
&lt;li&gt;Iterated rapidly on prompt engineering and deterministic fallback logic to guarantee sub-minute pipeline execution on lightweight hardware.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We are entering the following partner categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; Core intelligence is built entirely around Google's &lt;code&gt;gemma:2b&lt;/code&gt; via Ollama for fast, local, privacy-first summarization, with Hugging Face Serverless integration for &lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs:&lt;/strong&gt; Integrated ElevenLabs Text-to-Speech into &lt;code&gt;firstlight/delivery/audio.py&lt;/code&gt; to synthesize a natural, spoken morning briefing playable directly from the PWA dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; Provided a turnkey &lt;code&gt;render.yaml&lt;/code&gt; Infrastructure-as-Code Blueprint with persistent disk mounts to deploy First Light as a cloud web service and automated cron worker with a single click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing:&lt;/strong&gt; Integrated &lt;code&gt;sentry-sdk&lt;/code&gt; to trace pipeline transactions, monitor scraper reliability, and observe local LLM inference performance.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
