<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged hf26challenge</title>
<link>https://coderlegion.com/tag/hf26challenge</link>
<description>Powered by Question2Answer</description>
<item>
<title>I built my girlfriend a local Gemma football analyst that won't make up the stats</title>
<link>https://coderlegion.com/32607/i-built-my-girlfriend-a-local-gemma-football-analyst-that-wont-make-up-the-stats</link>
<description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/challenges/hacktoberfest-weekend-2026-10-01&quot;&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-i-built&quot;&gt;What I built&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;MatchMind&lt;/strong&gt; is a local AI analyst for Brazilian football, built for &lt;strong&gt;Bruna Boaventura, my girlfriend&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bruna had a hard time finding Brazilian clubs' results and historical data. So I built her one place to look things up — and a way to just ask.&lt;/p&gt;
&lt;p&gt;MatchMind puts the numbers together and lets her ask questions in Portuguese to an AI that runs &lt;strong&gt;on her own computer&lt;/strong&gt;. You pick a club and get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;Brasileirão 2026 table&lt;/strong&gt;, computed from the season's results, with all 20 crests;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;recent form&lt;/strong&gt; and the &lt;strong&gt;last three matches&lt;/strong&gt; with possession, shots, corners, fouls, &lt;strong&gt;goal scorers, cards, stadium and referee&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;&quot;Ver escalações&quot;&lt;/strong&gt; button that loads both line-ups: formation, coach, minutes and player ratings;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;squad&lt;/strong&gt; with appearances, goals, assists and ratings;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20+ years of Série A history&lt;/strong&gt; (2003–2024): titles, season-by-season position and coach, the club's top scorers, discipline, and head-to-head records with the scorers of the last meetings;&lt;/li&gt;
&lt;li&gt;a chat with &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; running locally through Ollama, which answers only from that data and separates &lt;strong&gt;FATO&lt;/strong&gt; (fact) from &lt;strong&gt;INTERPRETAÇÃO&lt;/strong&gt; (interpretation).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rule behind everything: &lt;strong&gt;the numbers come from data or from deterministic code, never from the model.&lt;/strong&gt; If something is missing, MatchMind says &quot;Indisponível&quot; instead of guessing.&lt;/p&gt;
&lt;h3 id=&quot;demo&quot;&gt;Demo&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Darrkkens/matchmind/main/docs/screenshots/landing.png&quot; alt=&quot;Landing page with the Brasileirão table&quot;&gt;&lt;/p&gt;
&lt;p&gt;A real answer generated locally by Gemma 3 4B (CPU only):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Darrkkens/matchmind/main/docs/screenshots/chat.png&quot; alt=&quot;Gemma answering where Palmeiras is in the table and how many titles it has&quot;&gt;&lt;/p&gt;
&lt;p&gt;Line-ups for a match, loaded on demand:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Darrkkens/matchmind/main/docs/screenshots/lineups.png&quot; alt=&quot;Line-ups dialog&quot;&gt;&lt;/p&gt;
&lt;p&gt;Série A history:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Darrkkens/matchmind/main/docs/screenshots/history.png&quot; alt=&quot;Série A history panel&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-bruna-said&quot;&gt;What Bruna said&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&quot;Interessante, pois traz dados históricos de 2003 até hoje, contendo gols e estatísticas.&quot;&lt;/em&gt;&lt;br&gt;
(&quot;Interesting, because it brings historical data from 2003 until today, with goals and statistics.&quot;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was exactly the gap she had: the history is what made it useful for her. (To be precise about coverage: the historical dataset runs from 2003 to 2024, and the current 2026 season comes from a separate live source.)&lt;/p&gt;
&lt;h3 id=&quot;code&quot;&gt;Code&lt;/h3&gt;
&lt;p&gt;{% github Darrkkens/matchmind %}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Go (standard library + &lt;code&gt;pgx&lt;/code&gt; for an optional PostgreSQL cache).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; Vue 3 + TypeScript, interface in Brazilian Portuguese.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI:&lt;/strong&gt; Gemma 3 4B through Ollama's &lt;code&gt;/api/chat&lt;/code&gt; with structured JSON output.&lt;/li&gt;
&lt;li&gt;MIT license, CI with &lt;code&gt;go vet&lt;/code&gt;, &lt;code&gt;go test -race&lt;/code&gt; and the frontend build, plus contributing guide and issue templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quick start: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, then &lt;code&gt;go run ./cmd/server&lt;/code&gt; in &lt;code&gt;backend/&lt;/code&gt; and &lt;code&gt;npm run dev&lt;/code&gt; in &lt;code&gt;frontend/&lt;/code&gt;. No account and no API key are needed.&lt;/p&gt;
&lt;h3 id=&quot;how-i-built-it&quot;&gt;How I built it&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;OpenFootball (results, CC0)  ──┐
Série A history CSVs (GPL-2.0) ┼─► Go API ─► deterministic stats, table, form
Optional stats API + cache  ───┘      │
                                      ▼
                     compact JSON context for this question
                                      ▼
                        Gemma 3 4B via Ollama (local)
                                      ▼
            Go validates the JSON and adds FATO / INTERPRETAÇÃO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Data I can trust.&lt;/strong&gt; Results come from &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/openfootball/football.json&quot;&gt;OpenFootball&lt;/a&gt; (CC0). The 2003–2024 history comes from Adão Duque's &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/adaoduque/Brasileirao_Dataset&quot;&gt;Brasileirão dataset&lt;/a&gt;, downloaded at runtime. I computed every season's final table from the results, and the champions match the official list for all 22 seasons; the scorers file matches the final score in 100% of matches since 2015. Where the source has gaps (its 2016 and 2024 statistics are mostly zeros), MatchMind drops those averages instead of showing fake numbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linking sources without guessing.&lt;/strong&gt; Per-match statistics, scorers and line-ups come from an optional API. A match only receives that data when round, opponent, home/away side and final score all agree with OpenFootball. Line-ups abbreviate names (&quot;G. Gómez&quot;) while player stats use full names (&quot;Gustavo Gómez&quot;), so I wrote a matcher that understands initials. It links 95% of starters; the rest (nickname vs. legal name) are shown without numbers rather than guessed. Every API response is cached — in PostgreSQL if you run &lt;code&gt;docker compose up&lt;/code&gt; — so a finished match costs one request, ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grounding the model.&lt;/strong&gt; The browser never sends context. For each question, Go rebuilds the club snapshot and sends Gemma a JSON envelope that keeps the data separate from the question and is explicitly treated as untrusted. Gemma returns &lt;code&gt;facts&lt;/code&gt;, &lt;code&gt;interpretation&lt;/code&gt; and &lt;code&gt;sources_used&lt;/code&gt;; Go validates the structure and the allowed source names and adds the labels itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What real testing taught me.&lt;/strong&gt; Mocked tests passed, but running the real model exposed two problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Too slow.&lt;/strong&gt; As I added history, line-ups and cards, a question on a CPU-only machine went past my 240-second timeout. The fix was to make the context depend on the question: the full table, the season history, the head-to-head records, the squad or the cards are only sent when the question is about them. The context for &quot;where are we in the table and how many titles?&quot; dropped from about 11,400 to 5,400 characters, and the answer came back in about three minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technically true, actually wrong.&lt;/strong&gt; Gemma answered that Palmeiras &quot;has 4 Brazilian titles&quot;. That's the count in the dataset, which only covers 2003–2024; Palmeiras has more. The prompt already said so, but a 4B model doesn't always follow a sentence buried in a prompt. So I renamed the field the model sees to &lt;code&gt;serie_a_titles_2003_2024_only&lt;/code&gt;. The next answer said &quot;4 Série A titles between 2003 and 2024&quot; — the answer you see in the screenshot above. When a rule really matters (like flagging sample data from an API test key), Go appends the warning itself instead of trusting the model.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;why-does-open-matter-&quot;&gt;Why does open matter?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It runs on her machine and costs nothing.&lt;/strong&gt; After &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, there's no per-question fee, no AI account and no key to protect. The football data sources used by default are open too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Her questions stay local.&lt;/strong&gt; With the default settings, the questions and the club data are processed on the same computer. Nothing goes to a model provider.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I control the whole stack.&lt;/strong&gt; When the model was too slow, I didn't wait for a vendor: I changed what the model sees. When it phrased something misleadingly, I changed the data contract. I can swap in &lt;code&gt;gemma3:12b&lt;/code&gt; on a stronger machine with one environment variable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The trade-off is honest.&lt;/strong&gt; A 4B model on a CPU is slow (1.5–3 minutes per answer) and can still omit something that is in its context. That's why the numbers on screen come from code, not from the model, and why every answer says which data it used. A big hosted model would answer faster, but it would cost money per question, need an account, and send everything off the machine — for a personal football tool, those trade-offs aren't worth it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ai-assistance&quot;&gt;AI assistance&lt;/h3&gt;
&lt;p&gt;I built MatchMind with the help of an AI coding assistant (Claude Code), which I directed, reviewed and tested throughout. All data, screenshots and the model answer shown above come from running the real application.&lt;/p&gt;
&lt;h3 id=&quot;prize-categories&quot;&gt;Prize categories&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 3 4B runs locally through Ollama as the analyst at the core of MatchMind. The project shapes its context per question, constrains it with structured JSON output, validates every answer in Go, and documents where the model still fails.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32607/i-built-my-girlfriend-a-local-gemma-football-analyst-that-wont-make-up-the-stats</guid>
<pubDate>Tue, 27 Oct 2026 02:20:22 +0000</pubDate>
</item>
<item>
<title>Interview Buddy: Private Interview Practice for a Friend’s First Developer Job</title>
<link>https://coderlegion.com/32468/interview-buddy-private-interview-practice-for-a-friends-first-developer-job</link>
<description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/challenges/hacktoberfest-weekend-2026-10-01&quot;&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-i-built-1&quot;&gt;What I Built&lt;/h3&gt;
&lt;p&gt;I built &lt;strong&gt;Interview Buddy&lt;/strong&gt; for a friend preparing for their first software engineering job. The focus is junior .NET / full stack development, especially practising how to explain technical answers clearly and confidently.&lt;/p&gt;
&lt;p&gt;The app turns a CV and job description into a short practice interview. You choose technical, behavioural, or mixed questions and a difficulty level, then answer one question at a time.&lt;/p&gt;
&lt;p&gt;Each answer receives feedback covering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What went well.&lt;/li&gt;
&lt;li&gt;Technical mistakes or missing points.&lt;/li&gt;
&lt;li&gt;How to explain the answer more clearly.&lt;/li&gt;
&lt;li&gt;An example improved answer.&lt;/li&gt;
&lt;li&gt;One relevant follow-up question.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can retry a question and finish with a reflection on strengths, topics to revise, and suggested next practice. Behavioural coaching asks the model to use STAR without inventing a personal story. Improved answers must stick to supplied experience or clearly label hypothetical examples.&lt;/p&gt;
&lt;p&gt;Privacy is part of the workflow: &lt;strong&gt;Save this session locally&lt;/strong&gt; is optional and unchecked by default. Temporary sessions disappear on refresh. Saved sessions can be revisited or deleted individually, and there is a &lt;strong&gt;Delete all local data&lt;/strong&gt; action. Users can also flag questionable feedback.&lt;/p&gt;
&lt;p&gt;The interface uses a calm navy, green, and neutral palette, with readable questions, labelled controls, loading states, and a local-AI connection indicator. A clearly labelled synthetic demo previews the workflow without pretending to assess answers using live AI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actual friend feedback:&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What helped: “Practising one question at a time made it easier to focus. The clearer answer examples helped me organise my explanations.”&lt;/li&gt;
&lt;li&gt;What confused them: “I wasn’t sure whether flagging feedback would correct it or just mark it for review.”&lt;/li&gt;
&lt;li&gt;What they would change: “I’d like a hint before answering and a way to practise only the topics I struggled with.”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;demo-1&quot;&gt;Demo&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Video walkthrough:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/HSC-Logic/InterviewBuddy/blob/main/docs/media/interview-buddy-demo.mp4&quot;&gt;Watch or download Interview Buddy on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://raw.githubusercontent.com/HSC-Logic/InterviewBuddy/main/docs/media/interview-buddy-demo.mp4&quot;&gt;Direct MP4 link&lt;/a&gt; · 74.5 seconds · 1080 × 1920 · silent, with explanatory text.&lt;/p&gt;
&lt;p&gt;Created with Remotion using actual captures of the running app’s synthetic workflow: context, saving consent, answers, feedback, retry, flagging, summary, and restored history. This is an edited browser-capture walkthrough, not continuous native screen recording or live AI inference.&lt;/p&gt;
&lt;p&gt;The app currently runs locally; it has not been publicly deployed. The repository includes startup instructions, synthetic sample inputs, and a short hand-off walkthrough. The synthetic demo can be explored without downloading a model.&lt;/p&gt;
&lt;h3 id=&quot;code-1&quot;&gt;Code&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/HSC-Logic/InterviewBuddy&quot;&gt;Interview Buddy repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The repository is public. The Remotion source and synthetic capture assets are included in &lt;code&gt;walkthrough/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;how-i-built-it-1&quot;&gt;How I Built It&lt;/h3&gt;
&lt;p&gt;The app uses &lt;strong&gt;React and TypeScript&lt;/strong&gt; for the frontend, &lt;strong&gt;Python FastAPI&lt;/strong&gt; for the backend, and &lt;strong&gt;SQLite&lt;/strong&gt; for sessions the user explicitly chooses to save.&lt;/p&gt;
&lt;p&gt;The inference integration uses &lt;strong&gt;Ollama&lt;/strong&gt; with &lt;strong&gt;Qwen2.5 7B Instruct&lt;/strong&gt;, an open-weight model released under &lt;strong&gt;Apache 2.0&lt;/strong&gt;. The model name and local endpoint are configurable. Only the backend sends inference requests to Ollama; there are no cloud AI calls.&lt;/p&gt;
&lt;p&gt;The backend requests structured JSON and validates responses with &lt;strong&gt;Pydantic&lt;/strong&gt;. Invalid output gets one repair attempt before a helpful error. The app handles missing models, unavailable Ollama, timeouts, and cancellation. CVs, job descriptions, and answers are treated as untrusted evidence rather than instructions.&lt;/p&gt;
&lt;p&gt;I kept the architecture small: no agent framework. Docker Compose provides a convenient setup, and the README includes instructions for running without Docker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validation:&lt;/strong&gt; six mocked tests passed, covering the API workflow, response validation, persistence and deletion, consent, repair, and failure handling. TypeScript checks, frontend formatting, Python lint, the production build, and Compose configuration validation also passed. The dependency audit reported zero vulnerabilities at the time of checking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current limits:&lt;/strong&gt; real inference has not been tested because Ollama was unavailable in the build environment. Docker execution remains unverified. The synthetic workflow was checked in the browser, including retries, flagging, summary, saving, and history restoration. Saved SQLite data is unencrypted, and model feedback can be wrong. The app is intended for single-user localhost use; real friend testing is still pending.&lt;/p&gt;
&lt;p&gt;The main lesson was that a focused workflow needs more than question generation: clear privacy choices, useful failure states, and honest feedback labels make practice easier to trust.&lt;/p&gt;
&lt;h3 id=&quot;why-does-open-innovation-matter-&quot;&gt;Why Does Open Innovation Matter?&lt;/h3&gt;
&lt;p&gt;CVs and interview answers can contain personal information. Open weights and local inference make it possible to practise without sending those details to a hosted AI provider, while retaining the freedom to inspect the integration and change models.&lt;/p&gt;
&lt;p&gt;After dependencies and weights are downloaded, the app is designed to support the core workflow offline. That complete local workflow would not be possible with a hosted-only, closed AI API. It also avoids per-request cloud AI charges, though local hardware, electricity, and inference speed remain tradeoffs.&lt;/p&gt;
&lt;p&gt;For this project, open innovation means control over where personal data goes and how the practice tool works. It makes a small, private app possible without tying its usefulness to a cloud service.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32468/interview-buddy-private-interview-practice-for-a-friends-first-developer-job</guid>
<pubDate>Mon, 26 Oct 2026 04:55:50 +0000</pubDate>
</item>
</channel>
</rss>