<?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: Krishna Kotikalapudi</title>
    <description>The latest articles on DEV Community by Krishna Kotikalapudi (@kpskrishnasastri).</description>
    <link>https://dev.to/kpskrishnasastri</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%2F4154854%2Fce276b1d-46c0-43e5-92eb-a864fd612b4c.png</url>
      <title>DEV Community: Krishna Kotikalapudi</title>
      <link>https://dev.to/kpskrishnasastri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kpskrishnasastri"/>
    <language>en</language>
    <item>
      <title>I built GridLens: a power system study tool that finds the outage your base-case load flow misses</title>
      <dc:creator>Krishna Kotikalapudi</dc:creator>
      <pubDate>Sun, 18 Oct 2026 19:38:39 +0000</pubDate>
      <link>https://dev.to/kpskrishnasastri/i-built-gridlens-a-power-system-study-tool-that-finds-the-outage-your-base-case-load-flow-misses-24eh</link>
      <guid>https://dev.to/kpskrishnasastri/i-built-gridlens-a-power-system-study-tool-that-finds-the-outage-your-base-case-load-flow-misses-24eh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GridLens&lt;/strong&gt; is a browser-based power system analysis tool. You enter a grid as two editable tables (bus data and line data) or upload a CSV. One click on &lt;strong&gt;Solve&lt;/strong&gt; runs a full study suite and shows the results in tabs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tab&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load flow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bus voltages, angles and injections, per-line P/Q flows and losses, a voltage profile checked against 0.95 / 1.10 pu limits, and a Newton-Raphson convergence plot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network diagram&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The grid drawn as a graph. Bus voltages are labelled, line thickness scales with MW flow, and arrows show power direction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method comparison&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same case run through Newton-Raphson, Fast Decoupled and Gauss-Seidel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;N-1 contingency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every line is removed in turn, the case is re-solved, and outages are ranked worst first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Export&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CSVs of bus results, line flows, N-1 results and the fault table, a &lt;code&gt;figures.zip&lt;/code&gt; PNG bundle, and the current input tables&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;strong&gt;short-circuit study&lt;/strong&gt; and an &lt;strong&gt;AI-written report&lt;/strong&gt; (a local open-weight model summarises the results in plain English) sit alongside these, and each can be toggled on or off in the sidebar. A summary strip under the Solve button shows convergence status, slack power, total generation and load, losses (as MW and % of load), and min/max voltage with the bus where each occurs. A red &lt;strong&gt;N-1 violations&lt;/strong&gt; badge appears when a contingency breaks limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inputs are plain per-unit tables.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bus table:&lt;/strong&gt; Type (Slack / PV / PQ), V setpoint or start guess, Pg, Qg, Pd, Qd.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line table:&lt;/strong&gt; From, To, R, X and total line-charging B, split B/2 at each end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other features: Quick / Standard / Advanced modes, a preset case dropdown, downloadable CSV templates, a dark theme, and a help tooltip on every control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay:&lt;/strong&gt; small power consultancies, solar and microgrid installers, and industrial plant engineers who need quick feasibility and contingency checks but can't justify a commercial license. University power-systems labs are a second market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem it solves:&lt;/strong&gt; commercial tools are expensive and heavy. Free scripts give you matrices and no interpretation. GridLens gives you the solve, the safety check and the explanation in one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  A result that shows why N-1 matters
&lt;/h3&gt;

&lt;p&gt;On the built-in 5-bus demo, the base case looks healthy: it converges, min voltage is &lt;strong&gt;1.011 pu&lt;/strong&gt; at bus 5, and losses are &lt;strong&gt;4.6 MW (2.8% of the 165 MW load)&lt;/strong&gt;. But the N-1 study shows that losing &lt;strong&gt;line 2-5&lt;/strong&gt; drops bus 5 to &lt;strong&gt;0.8975 pu&lt;/strong&gt;, well below the 0.95 limit. It's the only outage that causes a violation, and a base-case solve alone would never show it.&lt;/p&gt;

&lt;p&gt;The ranking also separates two kinds of "worst". Losing &lt;strong&gt;line 1-2&lt;/strong&gt; causes no voltage violation, but losses jump to &lt;strong&gt;0.1667 pu (16.7 MW)&lt;/strong&gt;, about 3.6 times the base case. GridLens shows both views, so you can tell which outages threaten voltage and which are just expensive to run.&lt;/p&gt;

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

&lt;p&gt;📹 &lt;a href="https://drive.google.com/drive/folders/1M8gKTQTloMLEMOQ-RuyOM77DfJG4lgPi?usp=sharing" rel="noopener noreferrer"&gt;Watch the GridLens demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Walkthrough of the 5-bus demo case (base 100 MVA):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Setup:&lt;/strong&gt; bus 1 is the slack at 1.06 pu, bus 2 is a PV bus at 1.04 pu with 0.4 pu generation and 0.2 + j0.1 pu load, and buses 3, 4 and 5 are PQ load buses (0.45, 0.40 and 0.60 pu real power). There are 7 lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve:&lt;/strong&gt; Newton-Raphson converges in &lt;strong&gt;3 iterations&lt;/strong&gt; at tol 1e-8. The slack supplies 129.6 MW, bus 2 supplies 40 MW, total generation is 169.6 MW against 165.0 MW of load, so losses are 4.6 MW.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bus results:&lt;/strong&gt; voltage falls smoothly from 1.060 pu at bus 1 to 1.011 pu at bus 5, with the angle reaching −6.09° at bus 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line flows:&lt;/strong&gt; the heaviest corridor is 1→2 at about 89 MW, followed by 2→5 at 55 MW. Both ends of every line are reported, so you can see the loss per line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convergence:&lt;/strong&gt; the max mismatch drops below 1e-8 in three steps, the quadratic convergence Newton-Raphson should show.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network diagram:&lt;/strong&gt; bus voltages on the nodes, MW flows on the lines, and arrows showing direction. Line 4-5 carries only 6 MW, because that part of the grid is nearly balanced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method comparison:&lt;/strong&gt; all three solvers land on the same answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Converged&lt;/th&gt;
&lt;th&gt;Iterations&lt;/th&gt;
&lt;th&gt;Loss (MW)&lt;/th&gt;
&lt;th&gt;Min V (pu)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Newton-Raphson&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4.6289&lt;/td&gt;
&lt;td&gt;1.0107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast Decoupled&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;4.6289&lt;/td&gt;
&lt;td&gt;1.0107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gauss-Seidel&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;4.6287&lt;/td&gt;
&lt;td&gt;1.0107&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gauss-Seidel needs 43 iterations to NR's 3. Its loss differs in the fourth decimal because it uses its own, looser default tolerance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;N-1:&lt;/strong&gt; the ranked outage table described above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export:&lt;/strong&gt; every table and figure can be downloaded for reports.&lt;/li&gt;
&lt;/ol&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/haki-overflow" rel="noopener noreferrer"&gt;
        haki-overflow
      &lt;/a&gt; / &lt;a href="https://github.com/haki-overflow/GridLens" rel="noopener noreferrer"&gt;
        GridLens
      &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;CAPSA — Power System Analysis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A Python tool that solves an N-bus power system and turns the results into something readable: load flow by three classical methods, an N-1 contingency sweep, a three-phase fault study, and plots plus a plain-English summary. It was built for Hacktoberfest and uses only open-source libraries and open-weight models: the solver does every calculation, and a local Gemma model served by LM Studio only explains the numbers it is given.&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;Three load flow methods: Newton-Raphson, Fast Decoupled (XB), Gauss-Seidel.&lt;/li&gt;
&lt;li&gt;Two editable presets: 5-bus demo and IEEE 14-bus.&lt;/li&gt;
&lt;li&gt;N-1 contingency sweep: each line removed in turn, case re-solved, ranked worst-first.&lt;/li&gt;
&lt;li&gt;Three-phase fault analysis at every bus via the Zbus matrix.&lt;/li&gt;
&lt;li&gt;Network diagram coloured by bus voltage, plus voltage-profile and post-fault charts.&lt;/li&gt;
&lt;li&gt;Method comparison table (convergence, iterations, loss, minimum voltage).&lt;/li&gt;
&lt;li&gt;Optional report written by a local Gemma model via LM Studio, given only the solver's numbers.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&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/haki-overflow/GridLens" 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;App layer:&lt;/strong&gt; Python and Streamlit. The bus and line tables are editable data grids, so users can change a load or a line impedance and re-solve immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Numerics:&lt;/strong&gt; the three load-flow methods are implemented from scratch: Newton-Raphson, Fast Decoupled and Gauss-Seidel. Each one reports convergence status and iteration count, so the method comparison is honest. The N-1 study re-runs the Newton-Raphson solver once per line outage and ranks the results by number of violations, then by minimum voltage. The short-circuit module produces the fault table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plots:&lt;/strong&gt; Matplotlib for the voltage profile with limit lines, the log-scale convergence history, and the flow-weighted network diagram. All figures can be bundled into a zip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source AI:&lt;/strong&gt; the report is written by &lt;strong&gt;Gemma running locally through LM Studio&lt;/strong&gt;. After a solve, GridLens passes the numerical results to the model (convergence, losses, voltage extremes, the N-1 ranking, the fault table), and the model writes an engineer-readable summary. The numbers come from the solvers and the model only does the explaining, so it can't invent results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev workflow:&lt;/strong&gt; built with &lt;strong&gt;opencode&lt;/strong&gt;, with a project-context file so the agent kept the architecture in mind between sessions. The code is split into separate modules (solvers, contingency, short circuit, plotting, report) to keep it easy to debug.&lt;/p&gt;

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

&lt;p&gt;Network models are sensitive. Utilities and industrial plants usually can't send grid topology and load data to a third-party API. Because the report model is open-weight and runs locally, the AI feature works on confidential data, offline, with no per-token cost.&lt;/p&gt;

&lt;p&gt;A closed API would have blocked the people most likely to pay: the privacy problem rules out the customers, and per-call pricing makes a cheap side-hustle tier hard to offer. With open weights, anyone can also swap in a different model or adapt one to their own reporting style, without waiting for a vendor.&lt;/p&gt;

&lt;p&gt;The same idea applies to the solvers: the code is open, so an engineer can read exactly how Newton-Raphson and the contingency ranking are computed and verify it against a textbook. That matters in a field where you have to trust the numbers.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I built a weekly recap of the Premier League for a friend.</title>
      <dc:creator>Krishna Kotikalapudi</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:55:52 +0000</pubDate>
      <link>https://dev.to/kpskrishnasastri/i-built-a-weekly-recap-of-the-premier-league-for-a-friend-408o</link>
      <guid>https://dev.to/kpskrishnasastri/i-built-a-weekly-recap-of-the-premier-league-for-a-friend-408o</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 is a die-hard Arsenal fan. Between early classes, late labs, and a hectic FSAE Formula Student workload, he prefers to listen to what happened in the Premier League over the weekend.&lt;/p&gt;

&lt;p&gt;He prefers to listen en route to classes, so I built &lt;strong&gt;TheGoonerBriefing&lt;/strong&gt;: a weekly matchday recap made for the walk to class. It pulls the latest Premier League results, turns them into a conversational script, and reads it out loud as a &lt;strong&gt;2.5-minute&lt;/strong&gt; audio file. That's roughly one walk to class, or one very optimistic bus ride, and he can play it without looking at his phone.&lt;/p&gt;

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

&lt;p&gt;🎧 &lt;a href="https://drive.google.com/file/d/1-q-vlWjKE1OdsWjbsM2QzLE2lWRKyYqN/view?usp=sharing" rel="noopener noreferrer"&gt;Listen to a sample briefing&lt;/a&gt;&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%2F4cc8k8hg9m5zpfc12561.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%2F4cc8k8hg9m5zpfc12561.png" alt="A test script" width="799" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Headphones recommended. Playing it in a lecture hall is between you and your conscience.)&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/haki-overflow" rel="noopener noreferrer"&gt;
        haki-overflow
      &lt;/a&gt; / &lt;a href="https://github.com/haki-overflow/TheGoonerBriefing" rel="noopener noreferrer"&gt;
        TheGoonerBriefing
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/haki-overflow/TheGoonerBriefing" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;The pipeline has three steps, and none of them involve me typing "so, anyway, Arsenal drew" into a voice memo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; Results, scorers and red cards come from the free &lt;a href="https://fantasy.premierleague.com/" rel="noopener noreferrer"&gt;Fantasy Premier League API&lt;/a&gt;, the one that powers the FPL site. It needs no account or API key. Plain Python picks out Arsenal's result, any hat-tricks or red cards, and their next fixture, then saves it all as one &lt;code&gt;facts.json&lt;/code&gt; file. So the scores are real, and not whatever the group chat remembers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Script:&lt;/strong&gt; &lt;strong&gt;Gemma (gemma-4-12b-qat)&lt;/strong&gt; turns the raw match data into a recap written the way people actually talk. It has all the confidence of a Twitter keyboard warrior, but with the facts to back it up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice:&lt;/strong&gt; &lt;strong&gt;Kokoro&lt;/strong&gt;, an open-weight text-to-speech model, reads the script aloud. It's no Peter Drury, so don't expect poetry about a 0-0 draw, but it is free and shows up every Monday.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I started with a user base of exactly one, which is the only audience guaranteed to text me back. It also meant real feedback from a real person: I could tweak the length, tone, and pace after each listen, which is what "build for a friend" is really about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it is today:&lt;/strong&gt; v1 is run manually, which is a fancy way of saying "I press the button." The next step is a weekly GitHub Action or cron job so the briefing is ready every Monday without me. Until then, I am the scheduler, and I accept no complaints about uptime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it could go:&lt;/strong&gt; the pipeline doesn't actually care that it's football. Data goes in, Gemma turns it into a spoken script, and Kokoro reads it out. Swap the data source and the same setup works for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Premier League:&lt;/strong&gt; the full league, not just Arsenal &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other football:&lt;/strong&gt; European leagues and cup competitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other sports:&lt;/strong&gt; cricket, F1, tennis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News:&lt;/strong&gt; a short morning headline briefing for anyone with a commute&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If it works for one friend, the rest is just new data sources.&lt;/p&gt;

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

&lt;p&gt;I wanted TheGoonerBriefing to be something that keeps working long after the weekend is over. Open models make that possible. Gemma writes the script and Kokoro speaks it, with no per-request billing, and the whole thing can keep running for as long as he keeps showing up to class.&lt;/p&gt;

&lt;h3&gt;
  
  
  A choice I actually had to make
&lt;/h3&gt;

&lt;p&gt;For the voice, I seriously considered ElevenLabs. Their voices are excellent, and the free months on offer made it tempting. I went with Kokoro for two reasons that came from this specific project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The challenge is about open-source AI at the core.&lt;/strong&gt; Kokoro is open-weight, so the voice layer fits that brief instead of sitting outside it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a gift, so it should keep working.&lt;/strong&gt; I'm not planning to maintain a subscription on his behalf, and I'd rather hand him a pipeline he can run himself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both tools are good at what they're built for, and for a weekly personal project that someone else can fork and own, open-weight won out. And since the code is open, he can fork it, change the length and tone to whatever suits his mornings. It's his briefing now, not mine.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma (gemma-4-12b-qat) is the brain of the operation. It turns raw match data into a spoken recap, and without it the briefing would just be Kokoro reading out a JSON file.&lt;/p&gt;




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