I have a friend who never makes it to the end of the month. He isn't reckless. He just doesn't know, at the moment he's looking at something in an online shop, whether he can actually afford it today. The salary arrived on the 1st, rent and bills are gone, and somewhere around the 20th the money runs out.
Banking apps tell you what you've already spent. He needed something that answers the question before he clicks "Add to cart".
So I built Should I Buy, a browser extension for Chrome and Edge. When you open a product page in any online shop, a small card appears in the corner with a traffic light:
🟢 You can afford it. It fits your spending pace for the month, and it shows how much you'd have left per day until payday.
🟡 You can, but it's tight. You have the money, but you're ahead of your pace. It tells you how many days to wait until it fits.
🔴 Not now. It tells you how many months it would take to buy it without touching your savings.
On top of the numbers, a local model writes one short, honest sentence the way a friend would say it.
You configure it once with four numbers: monthly net income, fixed expenses, how much you want to save, and your payday. Everything else happens on its own while you browse.
Demo
Settings. Four numbers, and you immediately see how much free money you really have each month.
Thinking… As soon as a page looks like a shop, the card appears while Gemma reads the page.
🟢 Green. A pack of spoons for €3.99: easy yes. Note that Gemma ignored the €13.03 shipping line and the €0.04/unit price and picked the actual price.
🟡 Yellow. Headphones for €179.99 early in the month. Affordable, but at €7.86/day for the next 28 days it's tight, and waiting 10 days makes it fit the pace. (This is my demo shop, which deliberately has a crossed-out price, a shipping cost, an instalment price and related products to try to confuse the model.)
🔴 Red. A €1,207.72 laptop with €400 of free money a month: 3 months putting aside all your free money, or 5 putting aside half. No lecture, just the math and a nudge.
The I bought it button logs the purchase, so the next verdicts take it into account.
What my friend said
I handed it over and he used it while browsing. Two things stood out to him:
It doesn't feel slow. While he's reading the product's features, the model is already thinking, so by the time he's ready to decide, the verdict is there. The wait happens while he's busy reading anyway.
He really appreciated the realistic comment and the estimate. A plain "no" would be useless; "3 months without touching your savings" is a plan.
Plain JavaScript, Manifest V3, no build step. MIT licensed.
How I Built It
The whole thing is three pieces: a content script that decides whether a page is worth looking at, a background worker that talks to the model, and a small budget module.
1. Gemma reads the shop, so I don't have to write a scraper per site.
Every shop marks up prices differently: crossed-out prices, unit prices, shipping, instalments, "customers also bought"… Instead of writing selectors for each site, the extension sends the visible text of the page to Gemma 3 4B running locally with Ollama, and asks for structured JSON using Ollama's format parameter:
The prompt asks it to decide whether this is one product page (not a listing, search results or cart) and to return the price the buyer would actually pay. In my tests it correctly rejected a search results page, picked €179.99 over the crossed-out €249.99, and picked $749 over a "List Price" of $899.99 on an English page. It works the same on Spanish and English Amazon pages. If a shop publishes clean schema.org/Product data, the extension uses it directly and skips the model call.
To avoid sending every page to the model, the content script only wakes it up when the page looks like a shop: product structured data, a product og:type, or a price next to an "add to cart"-style button (in several languages).
2. The math is NOT done by the AI.
This was a deliberate choice. A language model is great at reading a messy page and bad at being trusted with your money, so the verdict is plain, tested JavaScript:
Free money = income − fixed expenses − savings.
Spending pace: free money is "earned" day by day from payday. On day 3 you haven't earned what you have on day 28, so a big purchase early in the month turns yellow even if the money is technically in the account.
Red verdicts compute how many months of free money you'd need, so the answer is always "without touching your savings".
3. Gemma writes the friendly sentence, with guardrails.
A second, non-blocking call gives Gemma the verdict and the computed facts, and asks for one casual sentence of 25 words max, with the instruction to use only the numbers it's given. The traffic light appears first and the sentence fills in a few seconds later.
Making it fast enough on a normal laptop. On my laptop (16 GB RAM, CPU inference), a verdict takes about 9 seconds and the sentence about 6. The very first call after starting the browser took around 90 seconds, because the model has to load into memory. So the extension pre-loads the model when the browser starts, and keeps it loaded for 30 minutes (keep_alive). That's why my friend found it quick: by the time he's done reading the product, it's ready.
One gotcha worth sharing: Ollama rejects requests from browser extensions by default (HTTP 403). You have to allow them with OLLAMA_ORIGINS="chrome-extension://*" and restart Ollama. That's in the README for Windows, macOS and Linux.
I built it in an evening, pairing with Claude Code as my coding agent.
Why Does Open Innovation Matter?
Think about what this extension sees: every shop you visit, plus your income, your fixed expenses and your savings. That is about as personal as data gets. I would not ask my friend to send that to a cloud API, and he wouldn't agree to it anyway.
With an open-weight model running locally:
Nothing leaves his computer. No page text, no prices, no salary. The only network call goes to localhost:11434. His settings live in the extension's local storage.
It costs nothing to run. Someone who struggles to make it to the end of the month shouldn't need a paid API key to be told whether he can afford a pair of headphones. And because it calls the model on every product page, a per-request API bill would add up fast.
No account, no key, no sign-up. Install Ollama, pull the model, load the extension.
The model is swappable. If his laptop struggles, he can switch to gemma3:1b in the settings. If a better open model comes out, it's a one-line change.
A closed API would have made this either a privacy problem or a subscription. With an open model it's just a tool he owns.
Running locally isn't automatically private, though (this post is a good reminder). Ollama only listens on localhost, and the extension only has host permission for that address. It's in the same spirit as PocketCFO, which also keeps personal finance data on-device with Gemma.
My Agent Session
Here is the full session with my coding agent, from "what hackathons are open this month?" to the finished extension. It's mostly in Spanish, my native language. You can see the idea taking shape, the disk filling up halfway through the model download (and moving Ollama's models to another drive), the 403 from Ollama when an extension calls it, testing Gemma against tricky price layouts, and the switch to English for the judges.
Building Should I Buy: a local-AI budget traffic light for a friend
You
¿Qué hackathons hay abiertos este mes? Usa DevRelay
Agent
Input
{"skill":"devrelay-challenges","args":"Hackathons abiertos en octubre 2026"}
{"Ok":[{"id":82,"title":"Hacktoberfest Open-Source AI Challenge: Week 4","slug":"hacktoberfest-week4-2026-10-26","description":"Register now to be notified as details drop.","details":null,"full_details":"","type_of":"challenge","starts_at":"2026-10-26T16:00:00.000Z","ends_at":"2026-10-31T06:59:00.000Z","published":true,"cover_image":"https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/event
… [15668 more characters trimmed]
Build for a Friend: hay que construir algo con IA open-source como pieza central (un modelo open-weight, un framework open-source o inferencia local) que resuelva un problema real de una persona concreta. Tiene que ser un proyecto nuevo. Se entrega publicando un post en DEV con el tag #hf26challenge. Hay $2,450 en premios para 17 ganadores. Al jurado lo que más le pesa es la calidad del post. Hay categorías de patrocinador, entre ellas Gemma, DigitalOcean, Render, MongoDB Atlas y ElevenLabs.
Kaggle: el organizador todavía no ha publicado las reglas detalladas.
Próximos: la serie Hacktoberfest Open-Source AI Challenge sigue con el mismo prompt y un tema nuevo cada lunes. Cada semana es una entrega aparte:
- Semana 1: del 5 oct, 16:00, al 12 oct, 06:59
- Semana 2: del 12 al 18 oct
- Semana 3: del 19 al 25 oct
- Semana 4: del 26 al 31 oct
El Sanity Challenge ya cerró (4 oct, 06:59).
Hackathons MLH (presenciales; la inscripción sigue abierta)
Dejé fuera los cancelados y los de este fin de semana, que terminan hoy.
16–18 oct: SwampHacks XII, Hack the Valley, HackGB, Girls Hoo Hack, DubHacks, IKU Womxn in STEM (Reino Unido), Technica, LA Hacks AI Hackathon
23–25 oct: Cal Hacks 13.0, SBUHacks, OxHack '26 (Oxford), HackTX 26, Hack at Penn State
31 oct – 1 nov: hackCBS 9.0 (India)
Tu carpeta se llama Hacktoberfest/2026/DEV Challenges/1, así que puede que ya estés con el Weekend Challenge. Si es así, cierra en menos de un día. Puedo revisar tu proyecto contra las reglas y dejarte el post de entrega como borrador. También puedo inscribirte en alguno de los hackathons MLH.
You
Efectivamente, quiero participar en Build for a Friend, pero no se ni por donde empezar, no se como hacer lo que hay que hacer
Agent
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && ls -la && date -u; which ollama node python git 2>/dev/null; ollama list 2>/dev/null
Output
Exit code 127
total 0
drwxr-xr-x 1 david 197609 0 Oct 4 10:30 .
drwxr-xr-x 1 david 197609 0 Oct 4 10:30 ..
Sun Oct 4 15:43:36 UTC 2026
~/AppData/Local/Microsoft/WindowsApps/python
/mingw64/bin/git
Tranquilo, es más sencillo de lo que parece. Te cuento lo que hay que hacer y el tiempo que queda.
Tiempo
Son las 15:43 UTC y la entrega cierra el 5 oct a las 06:59 UTC, así que quedan unas 15 horas. Da para algo pequeño, y el reto lo pide así: "No tiene que ser grande. Tiene que importarle a esa persona."
Lo que hay que entregar
Al final todo es un post en DEV con el tag #hf26challenge que incluya:
1. Qué construiste y para quién: una persona real (tu madre, un amigo, tu abuelo...).
2. Una demo: capturas, un GIF o un vídeo corto.
3. El código: un repo público en GitHub.
4. Por qué es importante que sea open-source: por ejemplo, que funciona sin internet, que los datos no salen de su ordenador o que no cuesta nada usarlo.
El jurado puntúa sobre todo la calidad del post. Una herramienta sencilla con una buena historia gana a un proyecto complejo mal contado.
El plan (yo me encargo de la parte técnica)
Tú eliges la persona y el problema. Es lo único que no puedo decidir yo.
Yo construyo con tu ayuda una app pequeña con un modelo abierto (por ejemplo Gemma con Ollama, que corre en tu PC). Usar Gemma además te hace optar a la categoría "Best Use of Gemma", de $200.
Tú la pruebas y, si puedes, se la enseñas a esa persona y apuntas qué te dice. Eso da puntos extra.
Yo te redacto el post como borrador en DEV y tú lo revisas y lo publicas.
Tu carpeta está vacía y no tienes Ollama instalado. Lo instalamos en el paso 2: tarda unos 10 minutos.
Lo que necesito de ti ahora
¿Para quién lo vas a construir y qué le cuesta en su día a día? Basta con una frase. Por ejemplo:
- "Mi madre recibe cartas del banco o de Hacienda y no las entiende": una app que se las explica en lenguaje sencillo, sin subir sus documentos a ningún sitio.
- "Mi abuelo se olvida de qué pastillas toma": un asistente que lee la caja del medicamento y le recuerda la pauta.
- "Un amigo está aprendiendo inglés": un compañero de conversación con paciencia infinita que funciona sin conexión.
- "Mi compañero de piso tiene alergias": un planificador de comidas que las tiene en cuenta.
Dime la tuya, aunque sea solo una idea a medias, y empezamos.
You
Para ese amigo que nunca llega a fin de més, una extensión de navegador o una aplicación que detecte que está en una web de tienda, y que indique de manera visual si el producto que está viendo se lo puede permitir o no. La aplicación pediría como configuración el income mensual, los gastos fijos mensuales y, si ahorra dinero cada més, para, en función del día del mes en el que estás, decirte si te lo deberías permitir o no. También decirte en cuantos meses podrías permitirtelo sin descapitalizarte. No se si se puede hacer una aplicación así con IA en local.
Agent
Sí, se puede hacer, y que la IA corra en local es justamente lo mejor de la idea para el post: ni lo que navega tu amigo ni sus datos de dinero salen nunca de su ordenador. Empiezo instalando Ollama, que es el programa que ejecuta el modelo de IA en local.
Command running in background with ID: bn91zozdg. Output is being written to: <scratchpad> You will be notified when it completes. To check interim output, use Read on that file path.
{"url":"https://ollama.com/library","prompt":"List the Gemma model families available (gemma, gemma2, gemma3, gemma4, etc.) with their tags/sizes, especially small ones (1b-4b) suitable for a laptop."}
Output
# Gemma Model Families Available
Based on the Ollama library, here are the Gemma model families suitable for laptops:
**Gemma** (Original)
- Sizes: 2B, 7B
- "Gemma is a family of lightweight, state-of-the-art open models built by Google DeepMind"
**Gemma2**
- Sizes: 2B, 9B, 27B
- "Google Gemma 2 is a high-performing and efficient model available in three sizes"
**Gemma3**
- Sizes: 270M, 1B, 4B
… [544 more characters trimmed]
Input
Chrome extension calling local Ollama API CORS OLLAMA_ORIGINS
Output
{"Ok":[{"id":4573937,"title":"Ollama API: A Practical Guide with Examples","description":"A practical Ollama API guide: generate and chat endpoints, streaming, options, structured JSON, tool calling, Python, and the OpenAI-compatible route.","tags":["ollama","api","llm","python"],"path":"/amareswer/ollama-api-a-practical-guide-with-examples-4di9","url":"https://dev.to/amareswer/ollama-api-a-practi
… [1832 more characters trimmed]
Gemma 3 está disponible en Ollama. Para un portátil la mejor opción es gemma3:4b, que además te hace optar al premio "Best Use of Gemma". Mientras se instala Ollama, escribo la extensión.
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\manifest.json
{
"manifest_version": 3,
"name": "FinDeMes",
"version": "0.1.0",
"description": "¿Me lo puedo permitir? Un semáforo para cada producto que miras, con IA que corre en tu ordenador.",
"permissions": ["storage"],
"host_permissions": ["http://localhost:11434/*", "http://127.0.0.1:11434/*"],
"background": {
"serv
… [433 more characters trimmed]
Output
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\manifest.json (file state is current in your context — no need to Read it back)
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\budget.js
// Lógica del presupuesto. Sin IA: las cuentas tienen que ser exactas y explicables.
export const DEFAULT_SETTINGS = {
name: "",
income: 0, // ingresos netos al mes
fixed: 0, // gastos fijos al mes (alquiler, facturas, suscripciones...)
savings: 0, // lo que aparta cada mes para ahorrar
payday: 1,
… [2835 more characters trimmed]
Output
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\budget.js (file state is current in your context — no need to Read it back)
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\background.js (file state is current in your context — no need to Read it back)
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\content.js
// Se ejecuta en cada página. Solo despierta a la IA si la página "huele" a tienda.
(() => {
const BUY_WORDS = /añadir al carrito|añadir a la cesta|comprar ahora|add to (cart|basket|bag)|buy now|in den warenkorb|ajouter au panier|aggiungi al carrello|adicionar ao carrinho/i;
const PRICE_RE = /(\d{1,3}([.,\s]\d{3})*([.,]\d{2}
… [7061 more characters trimmed]
Output
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\content.js (file state is current in your context — no need to Read it back)
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\options.html (file state is current in your context — no need to Read it back)
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\options.js
import { DEFAULT_SETTINGS, money } from "./budget.js";
const FIELDS = ["name", "income", "fixed", "savings", "payday", "currency", "model", "ollamaUrl"];
const NUMERIC = new Set(["income", "fixed", "savings", "payday"]);
const $ = (id) => document.getElementById(id);
function read() {
const s = {};
for (const f of FIELDS)
… [1471 more characters trimmed]
Output
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\options.js (file state is current in your context — no need to Read it back)
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\popup.html (file state is current in your context — no need to Read it back)
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\popup.js (file state is current in your context — no need to Read it back)
Input
$ cat "<scratchpad>" | tail -5; ls "%LOCALAPPDATA%/Programs/Ollama" 2>/dev/null
Output
El hash del instalador se verificó correctamente
Iniciando instalación de paquete...
Instalado correctamente
[exited with code 0]
app.ico
lib
ollama app.exe
ollama.exe
unins000.dat
unins000.exe
unins000.msg
Ollama ya está instalado. Ahora descargo el modelo Gemma, que pesa unos 3 GB.
Command running in background with ID: bml7x7e0e. Output is being written to: <scratchpad> You will be notified when it completes. To check interim output, use Read on that file path.
Ollama rechaza las peticiones que vienen de extensiones del navegador. Para que la extensión pueda hablar con él hay que darle permiso con una variable de entorno:
Mientras termina la descarga, escribo el README y la licencia, que el reto pide que el código sea abierto:
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md
# FinDeMes 💸
**¿Me lo puedo permitir?** Una extensión de navegador que, cuando estás mirando un producto en cualquier tienda online, te enseña un semáforo:
- 🟢 **Te lo puedes permitir**: entra en tu ritmo de gasto del mes.
- 🟡 **Puedes, pero te aprieta**: te dice cuánto te quedaría al día hasta que cobres y cuántos días esperar para que
… [2510 more characters trimmed]
Output
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md (file state is current in your context — no need to Read it back)
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && cat > LICENSE <<'EOF'
MIT License
Copyright (c) 2026 David Antón
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distrib
… [793 more characters trimmed]
Output
David Anton Alvarez
<email>
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && sed -i 's/Copyright (c) 2026 David Antón/Copyright (c) 2026 David Anton Alvarez/' LICENSE; "%LOCALAPPDATA%/Programs/Ollama/ollama.exe" list; cat "<scratchpad>" | tr '\r' '\n' | tail -2
Output
NAME ID SIZE MODIFIED
{"version":"0.35.1"}
Input
until "%LOCALAPPDATA%/Programs/Ollama/ollama.exe" list | grep -q gemma3; do sleep 15; done; echo listo
Output
<tool_use_error>InputValidationError: Monitor failed due to the following issue:
The required parameter `description` is missing
This tool's schema was not sent to the API — it was not in the discovered-tool set derived from message history. Without the schema in your prompt, typed parameters (arrays, numbers, booleans) get emitted as strings and the client-side parser rejects them. Load the tool
… [1178 more characters trimmed]
File created successfully at: ~\Documents\Hacktoberfest\2026\DEV Challenges\1\demo\index.html (file state is current in your context — no need to Read it back)
Input
$ until "%LOCALAPPDATA%/Programs/Ollama/ollama.exe" list | grep -q gemma3; do sleep 10; done; "%LOCALAPPDATA%/Programs/Ollama/ollama.exe" list
Output
Command did not complete within its 600s timeout and was moved to the background (ID: blahiryga). Output is being written to: <scratchpad> You will be notified when it completes. To check interim output, use Read on that file path.
pulling aeda25e63ebd: 6% ▕█ ▏ 210 MB/3.3 GB [K[?25h[?2026l
Error: max retries exceeded: write ~\.ollama\models\blobs\sha256-aeda25e63ebd698fab8638ffb778e68bed908b960d39d0becc650fa981609d25-partial: There is not enough space on the disk.
[exited with code 0]
NAME ID SIZE MODIFIED
La descarga ha fallado porque no queda espacio en el disco. Miro cuánto espacio libre hay:
Command running in background with ID: bjuggsm9z. Output is being written to: <scratchpad> You will be notified when it completes. To check interim output, use Read on that file path.
Input
<scratchpad>
# Reproduce la llamada de extracción de background.js contra varias páginas de texto.
import json, re, time, urllib.request
bg = open(r"~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\background.js", encoding="utf-8").read()
prompt = re.search(r"const EXTRACT_PROMPT = `(.*?)`;", bg, re.S).group(1)
schema = {"type": "object", "properties": {"is_product_page": {"type": "bool
… [1619 more characters trimmed]
Output
File created successfully at: <scratchpad> (file state is current in your context — no need to Read it back)
Input
$ until grep -qE "success|Error" "<scratchpad>"; do sleep 10; done; cat "<scratchpad>"
Output
success [K[?25h[?2026l
NAME ID SIZE MODIFIED
gemma3:4b a2af6cc3eb7f 3.3 GB Less than a second ago
[exited with code 0]
Gemma ya está descargado. Pruebo si sabe leer bien las páginas:
Input
$ PYTHONIOENCODING=utf-8 python "<scratchpad>"
Output
demo 92.9s {"is_product_page":true, "product_name":"SonoMax Pro", "price":179.99, "currency":"EUR"}
listado 8.1s {"is_product_page":false,"product_name":"zapatillas","price":129.95,"currency":"EUR"}
en 9.4s {"is_product_page": true, "product_name": "Acer Swift Go 14 Laptop", "price": 749.00, "currency": "USD"}
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\background.js
--- old
chrome.runtime.onInstalled.addListener(({ reason }) => {
if (reason === "install") chrome.runtime.openOptionsPage();
});
+++ new
// Cargar el modelo en memoria al abrir el navegador: la primera respuesta en frío puede tardar más de un minuto.
async function warmUp() {
const settings = await getSettings();
fetch(`
… [336 more characters trimmed]
Output
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\background.js has been updated successfully. (file state is current in your context — no need to Read it back)
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && sed -i 's/keep_alive: "15m"/keep_alive: "30m"/' extension/background.js && cat > "$TEMP/note.json" <<'EOF'
{"model":"gemma3:4b","stream":false,"options":{"temperature":0.7},"messages":[{"role":"system","content":"Eres un amigo cercano, sincero y con humor que ayuda a llegar a fin de mes. Hablas con Pablo. Escribe UNA sola frase en español (má
… [436 more characters trimmed]
Output
Oye, con 11 euros al día y un SonoMax Pro que te aprieta, ¡es el momento de priorizar tu paz mental, ¿no?
real 0m6.356s
user 0m0.015s
sys 0m0.046s
La frase del amigo sale en unos 6 s. Guardo el trabajo en git:
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && git add -A && git commit -q -m "FinDeMes: extensión que dice si te puedes permitir un producto, con Gemma en local
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>" && git log --oneline && git status --short
Output
warning: in the working copy of 'LICENSE', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'demo/index.html', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/background.js', LF will be replaced by CRLF the
… [909 more characters trimmed]
Y arranco la tienda de prueba para que puedas verla funcionar ya mismo:
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/demo" && python -m http.server 8000
Output
Command running in background with ID: bochs308p. Output is being written to: <scratchpad> You will be notified when it completes. To check interim output, use Read on that file path.
Session cwd remains ~\Documents\Hacktoberfest\2026\DEV Challenges\1; directory changes made by the backgrounded command do not apply to subsequent commands.
Sí se podía hacer con IA en local, y FinDeMes ya está construido. Es una extensión para Chrome o Edge que, al abrir la ficha de un producto en cualquier tienda, enseña un semáforo en la esquina:
🟢 Te lo puedes permitir: dice cuánto le quedaría al día hasta cobrar.
🟡 Puedes, pero te aprieta: además dice cuántos días esperar para que entre en su ritmo de gasto.
🔴 Ahora no: dice en cuántos meses podría comprarlo sin tocar sus ahorros.
Lleva también una frase corta escrita por Gemma, como lo diría un amigo, y un botón "Lo he comprado" que resta el gasto del mes. Le he añadido el día de cobro, porque el mes de tu amigo empieza cuando cobra, no el día 1.
El reparto de trabajo, que es lo que contarás en el post: Gemma lee la página, decide si es un producto y saca el precio real, sin programar un lector para cada tienda. Las cuentas del presupuesto son código normal, porque tienen que ser exactas.
Lo que he comprobado:
- Las cuentas del presupuesto dan lo esperado en todos los casos que probé.
- Gemma acierta en tres páginas de prueba: elige el precio bueno y no el tachado, el del envío ni el de plazos; distingue un listado de búsqueda de una ficha de producto; y funciona en inglés.
- La frase del amigo tarda unos 6 s y el semáforo unos 9 s. La primera vez que se carga el modelo tarda más de un minuto; por eso la extensión lo precarga al abrir el navegador.
Lo que no he probado: la extensión cargada en el navegador de principio a fin, porque Chrome no me deja instalarla por ti. Si algo falla al probarla, pégame el error.
Dos cosas que he cambiado en tu PC:
- Tu disco C: estaba lleno (le quedaban 50 MB) y la primera descarga del modelo falló. He movido los modelos de Ollama a D:\ollama\models y C: tiene ahora unos 2 GB libres. Te conviene liberar más espacio pronto, porque Windows va mal con el disco tan lleno.
- He añadido una variable de entorno para que Ollama acepte peticiones de extensiones del navegador.
Pruébala ahora (5 minutos)
En Chrome abre chrome://extensions, activa Modo desarrollador, pulsa Cargar descomprimida y elige la carpeta extension.
Se abre la configuración. Mete los números de tu amigo (o unos inventados) y pulsa Probar conexión en "IA local", que debería decir "Todo listo ✔".
Abre la tienda de prueba que tengo arrancada en http://localhost:8000 y después prueba en una tienda real.
Lo que queda (cierra en ~13 h, el 5 oct a las 06:59 UTC; en España, a las 08:59)
Que la pruebe tu amigo y apuntar qué dice. Da puntos extra y es lo mejor del post.
Capturas o un GIF del semáforo en los tres colores.
Subir el código a GitHub. Ya está guardado en git en local. Si quieres, creo el repo público y lo subo, pero confírmamelo antes porque lo publica.
El post en DEV. Te lo redacto como borrador con el tag #hf26challenge, centrado en tu amigo y en por qué es importante que todo sea local: sus webs y su dinero no salen de su ordenador. Tú lo revisas y lo publicas.
¿Lo pruebas y me cuentas qué tal?
You
Antes de hacer nada, quiero dos cosas:
Agent
Vale, no toco nada. Tu mensaje se ha cortado después de "dos cosas:" y no me ha llegado cuáles son. ¿Me las escribes?
You
Antes de hacer nada, quiero dos cosas:
[Request interrupted by user]
Antes de hacer nada quiero dos cosas: la primera, es que el readme lo quiero en inglés primero (el organizador del hacktoberfest es angloparlante) y después en Español. Por esta misma razón, hay que cambiar el nombre de la app, que quiero que sea Should I Buy, y que los textos de meter los datos estén también en inglés
extension\content.js:105: title.textContent = "FinDeMes no puede pensar";
extension\options.html:5: <title>FinDeMes · Configuración</title>
extension\options.html:21: <h1>FinDeMes 💸</h1>
extension\popup.html:18: <h2>FinDeMes 💸</h2>
README.md:1:# FinDeMes 💸
README.md:13:FinDeMes ve **todas las tiendas que visitas** y conoce **tu sueldo, tus gastos y tus ahorros**. Esos datos no deberían sal
… [126 more characters trimmed]
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/extension" && sed -i 's/"name": "FinDeMes"/"name": "Should I Buy"/; s/"default_title": "FinDeMes"/"default_title": "Should I Buy"/; s/"description": ".*"/"description": "Can I afford it? A traffic light for every product you look at, powered by AI that runs on your own computer."/' manifest.json && sed -i 's/FinDeMes no puede pensar/Should I Buy
… [134 more characters trimmed]
Output
3: "name": "Should I Buy",
5: "description": "Can I afford it? A traffic light for every product you look at, powered by AI that runs on your own computer.",
21: "default_title": "Should I Buy"
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\options.html has been updated successfully. (file state is current in your context — no need to Read it back)
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/extension" && sed -i \
-e 's/`Te quedan ${money(free, s.currency)} libres al mes para el día a día y los caprichos.`/`You have ${money(free, s.currency)} free each month for day-to-day spending and treats.`/' \
-e 's/"Con estos números no te queda dinero libre al mes."/"With these numbers you have no free money left each month."/' \
-e 's/"Gua
… [361 more characters trimmed]
Output
17: $("free").textContent =
32: $("status").textContent = "Saved ✔";
33: setTimeout(() => ($("status").textContent = ""), 2000);
38: $("ollama").textContent = "Testing…";
41: $("ollama").textContent = `Cannot connect: ${res.error}`;
43: $("ollama").textContent = `Connected, but the model is missing. Run: ollama pull ${read().model}`;
45: $("ollama").textContent = "All set ✔";
Ahora el README, primero en inglés y después en español:
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md
# Should I Buy 💸
[English](#english) · [Español](#español)
## English
**Can I afford it?** A browser extension that shows you a traffic light whenever you're looking at a product in any online shop:
- 🟢 **You can afford it**: it fits your spending pace for the month.
- 🟡 **You can, but it's tight**: it tells you how much you'd have lef
… [5060 more characters trimmed]
Output
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md has been updated successfully. (file state is current in your context — no need to Read it back)
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && grep -rni findemes . --exclude-dir=.git; python -c "import json;json.load(open('extension/manifest.json',encoding='utf-8'))" && git add -A && git commit -q -m "Rename to Should I Buy; English settings page and bilingual README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>" && git log --oneline | head -1
Output
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/content.js', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/manifest.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/options.html', LF will be
… [346 more characters trimmed]
He hecho los dos cambios y los he guardado en git:
README bilingüe: ahora va primero en inglés y después en español, con enlaces arriba para saltar a cada idioma.
La app se llama Should I Buy: he cambiado el nombre en el manifest, en la descripción de la extensión (ahora en inglés), en el popup y en el aviso de error. Toda la página de configuración está en inglés: los campos, las ayudas y los mensajes de guardar y de probar la conexión.
Si ya habías cargado la extensión en Chrome, pulsa el botón de recargar en chrome://extensions para ver los cambios.
Lo que sigue en español:
- El semáforo que aparece en las tiendas: "Te lo puedes permitir", el botón "Lo he comprado", etc.
- El popup con el resumen del mes.
- La frase que escribe Gemma.
- Las cantidades se escriben al estilo español ("179,99 €").
Si tu amigo habla español puede tener sentido dejarlo así, pero los jueces verán las capturas con textos en español. ¿Lo paso todo a inglés o lo dejo como está?
You
Pásalo todo al inglés, pero deja los presupuestos en Euros
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension\background.js has been updated successfully. (file state is current in your context — no need to Read it back)
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/extension" && sed -i \
-e 's|// Lógica del presupuesto. Sin IA: las cuentas tienen que ser exactas y explicables.|// Budget logic. No AI here: the maths has to be exact and explainable.|' \
-e 's|// ingresos netos al mes|// monthly net income|' \
-e 's|// gastos fijos al mes (alquiler, facturas, suscripciones...)|// monthly fixed expenses (ren
… [1169 more characters trimmed]
Output
1:// Budget logic. No AI here: the maths has to be exact and explainable.
5: income: 0, // monthly net income
6: fixed: 0, // monthly fixed expenses (rent, bills, subscriptions...)
7: savings: 0, // what gets put aside every month
8: payday: 1, // day of the month the salary arrives (1-28)
11: ollamaUrl: "http://localhost:11434",
20:// Current pay cycle: from the l
… [547 more characters trimmed]
Ahora el semáforo de las tiendas y el popup:
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/extension" && sed -i \
-e 's|// Se ejecuta en cada página. Solo despierta a la IA si la página "huele" a tienda.|// Runs on every page. Only wakes the AI up if the page "smells" like a shop.|' \
-e 's|// ---------- Interfaz ----------|// ---------- UI ----------|' \
-e 's|green: "Te lo puedes permitir", yellow: "Puedes, pero te aprieta", red:
… [1926 more characters trimmed]
Output
Exit code 2
grep: -P supports only unibyte and UTF-8 locales
content.js:3: const BUY_WORDS = /añadir al carrito|añadir a la cesta|comprar ahora|add to (cart|basket|bag)|buy now|in den warenkorb|ajouter au panier|aggiungi al carrello|adicionar ao carrinho/i;
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1/demo" && sed -i \
-e 's|lang="es"|lang="en"|' \
-e 's|Auriculares SonoMax Pro – TiendaDemo|SonoMax Pro Headphones – DemoShop|' \
-e 's|TiendaDemo · Carrito (0)|DemoShop · Cart (0)|' \
-e 's|Auriculares inalámbricos SonoMax Pro|SonoMax Pro Wireless Headphones|' \
-e 's|1.284 valoraciones|1,284 ratings|' \
-e 's|249,99 €|€249.99|' -e 's|179,9
… [468 more characters trimmed]
Output
13: button { padding: 12px 24px; font-size: 16px; background: #f6ad55; border: 0; border-radius: 8px; }
22: <h1>SonoMax Pro Wireless Headphones</h1>
24: <p><span class="old">€249.99</span> −28%</p>
25: <p class="price">€179.99</p>
26: <p>Shipping: €4.95 · Free over €199</p>
27: <p>Or 3 instalments of €60.00</p>
28: <button>Add to cart</button>
33: <p>SonoMax Cas
… [64 more characters trimmed]
Actualizo las menciones al botón en el README y vuelvo a probar a Gemma con las instrucciones ya en inglés:
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && sed -i -e 's|The \*\*Lo he comprado\*\* ("I bought it") button|The **I bought it** button|' -e 's|Con el botón \*\*Lo he comprado\*\* apuntas|Con el botón **I bought it** apuntas|' README.md && grep -n "bought" README.md
S="<scratchpad>"
sed -i 's|"demo": "TiendaDemo.*",$|"demo": "DemoShop · Cart (0) 🎧 SonoMax Pro Wireless Headphones ⭐⭐⭐⭐☆ 1,
… [989 more characters trimmed]
Output
37: - The **I bought it** button logs the purchase and subtracts it from the month.
83: - Con el botón **I bought it** apuntas el gasto y se resta del mes.
demo 28.5s {"is_product_page":true, "product_name":"SonoMax Pro Wireless Headphones", "price":179.99, "currency":"EUR"}
listado 8.8s {"is_product_page":false,"product_name":"","price":0,"currency":""}
en 11.9s {"is_product_
… [205 more characters trimmed]
Con las instrucciones en inglés Gemma sigue acertando en los tres casos. Guardo:
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && git add -A && git commit -q -m "Translate the whole extension and demo shop to English; keep budgets in euros
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>" 2>/dev/null; git log --oneline | head -1; git status --short
Output
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'demo/index.html', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/background.js', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'extension/budget.js', LF will be replaced
… [460 more characters trimmed]
Toda la extensión está ya en inglés y los presupuestos siguen en euros. Los cambios están guardados en git.
Semáforo de las tiendas: "You can afford it", "You can, but it's tight" y "Not now". El botón es I bought it, y los textos de "Thinking…" y de error también están en inglés.
Popup: el resumen del mes (Free money this month, Purchases logged, Left) y el enlace a Settings.
La frase de Gemma: ahora la escribe en inglés. Ejemplo de la prueba: "Okay, Pablo, that SonoMax Pro sounds… intense, but hey, €320 and €11 a day could work, just chill for a bit!"
Euros: EUR sigue siendo la moneda por defecto y las cantidades se escriben al estilo inglés, "€179.99".
Las instrucciones internas que le da la extensión a Gemma y los comentarios del código también están en inglés, porque el jurado puede leer el repo.
La tienda de prueba está en inglés con precios en euros. El README ya nombra el botón como I bought it en las dos versiones.
He vuelto a probar a Gemma con las instrucciones en inglés y sigue acertando en los tres casos:
Tienda demo: elige €179.99, no el precio tachado ni el envío.
Listado de búsqueda: dice correctamente que no es un producto.
Página en inglés: elige $749, no el precio de lista.
Sigue reconociendo tiendas en español, francés, alemán, etc., porque esas palabras de "añadir al carrito" se quedan a propósito.
La extensión sigue sin probarse en el navegador de principio a fin, porque eso tienes que hacerlo tú. Si ya la habías cargado, pulsa recargar en chrome://extensions. La tienda de prueba sigue en http://localhost:8000.
Lo que queda antes del cierre (5 oct, 06:59 UTC):
1. Que la pruebe tu amigo y apuntar su reacción.
2. Capturas o un GIF del semáforo en verde, amarillo y rojo.
3. Subir el repo a GitHub, cuando me confirmes que lo publique.
4. El post en DEV, que te dejo como borrador para que lo revises. ¿En inglés también?
You
ya estoy en chrome://extensions en modo desarrollador, ¿que hago ahora?
Ollama y la tienda de prueba están funcionando. Sigue estos pasos:
1. Cargar la extensión
- Arriba a la izquierda, pulsa "Cargar descomprimida" (en inglés, "Load unpacked").
- En la ventana que se abre, ve a esta carpeta y pulsa "Seleccionar carpeta":
~\Documents\Hacktoberfest\2026\DEV Challenges\1\extension
Elige la carpeta extension, no la 1 que está por encima.
- Aparecerá la tarjeta Should I Buy y se abrirá sola la página de configuración. Si no se abre, en la tarjeta pulsa Detalles y luego Opciones de extensión.
2. Configurarla
- Rellena los campos con los números de tu amigo, o con unos de prueba como Income 1500, Fixed expenses 900, Savings 100 y Payday 1.
- Abre "Local AI (Ollama)" y pulsa Test connection. Debe decir "All set ✔".
- Pulsa Save.
3. Fijarla en la barra
- Pulsa el icono de la pieza de puzle 🧩, arriba a la derecha de Chrome, y luego la chincheta 📌 junto a Should I Buy. Así verás el icono del semáforo para abrir el resumen del mes.
4. Probarla
- Abre http://localhost:8000. Abajo a la derecha saldrá "🤔 Thinking…" y, unos segundos después, el semáforo con los auriculares a €179.99.
- Prueba también en una tienda real, por ejemplo la ficha de cualquier producto de Amazon o PcComponentes.
Si en algún paso ves un error en rojo en la tarjeta de la extensión o el semáforo no aparece, pégame lo que te sale o mándame una captura.
You
veo bien la aplicación, tengo varias capturas, voy a crear en github el repo
Agent
¡Genial que funcione! Al crear el repo en GitHub:
Hazlo público, porque el reto pide que se pueda ver el código.
Déjalo vacío: no marques "Add a README", ni licencia, ni .gitignore. Ya los tenemos en local y, si GitHub crea los suyos, chocarían al subir.
Un nombre que encaja: should-i-buy.
Cuando lo tengas, pásame la URL y lo subo yo con tus 3 commits. Si prefieres hacerlo tú, son estos comandos desde la carpeta del proyecto:
git remote add origin https://github.com/TU_USUARIO/should-i-buy.git
git branch -M main
git push -u origin main
Y las capturas: si me dices en qué carpeta las tienes, las meto en el repo (en docs/screenshots/) y las enseño en el README antes de subirlo. Quedan muy bien para el jurado y luego las reutilizamos en el post de DEV.
fcd27f48922d8d357488cf86e34f04971ff53318 HEAD
fcd27f48922d8d357488cf86e34f04971ff53318 refs/heads/main
fcd27f4 Translate the whole extension and demo shop to English; keep budgets in euros
c96a6a0 Rename to Should I Buy; English settings page and bilingual README
59421c6 FinDeMes: extensión que dice si te puedes permitir un producto, con Gemma en local
El código ya está en GitHub: https://github.com/Virien84/Should-I-Buy. Lo que hay en GitHub coincide con tu copia local: los 3 commits en la rama main, con la extensión, la tienda de prueba, el README bilingüe y la licencia MIT. El primer commit todavía se llama "FinDeMes" en su mensaje; no pasa nada, es solo el historial.
Siguientes pasos, para los que necesito dos datos tuyos:
Capturas: ¿en qué carpeta las tienes? Las meto en docs/screenshots/, las enseño en el README y lo subo. Así el repo se ve bien cuando lo abra el jurado.
El post en DEV: ¿lo escribo en inglés, como el resto? Y si tu amigo ya lo ha probado, cuéntame qué dijo, aunque sea en una frase. Esa reacción da puntos extra y es lo que más luce en el post.
You
Las capturas están en ~\Documents\Hacktoberfest\2026\DEV Challenges\1\screenshots. Los nombres deberían ser bastante explicativos. El post de DEV escríbelo en inglés, como el resto. Mi amigo lo ha probado y le ha gustado, primero, que no tarda tanto, ya que mientras el mira las características del producto, el proceso piensa y el tiempo es óptimo, y lo segundo, es que agradece mucho el comentario realista y la estimación.
Agent
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && ls -la screenshots; git status --short
Output
total 1612
drwxr-xr-x 1 david 197609 0 Oct 4 23:08 .
drwxr-xr-x 1 david 197609 0 Oct 4 23:06 ..
-rw-r--r-- 1 david 197609 72989 Oct 4 23:06 Data introduction.jpg
-rw-r--r-- 1 david 197609 286352 Oct 4 23:08 green light after bought it.jpg
-rw-r--r-- 1 david 197609 276901 Oct 4 23:07 green light thinking.jpg
-rw-r--r-- 1 david 197609 294467 Oct 4 23:08 green light veredict.jpg
-rw-
… [221 more characters trimmed]
Antes de subirlas las miro, por si se ve algún dato personal (números reales, pestañas, cuentas):
~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md
--- old
I built it for a friend who never makes it to the end of the month.
### Why open, local AI
+++ new
I built it for a friend who never makes it to the end of the month.
### Screenshots
| 🟢 You can afford it | 🟡 You can, but it's tight | 🔴 Not now |
|---|---|---|
|  | ![Yellow
… [300 more characters trimmed]
Output
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md has been updated successfully.
Input
~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md
--- old
La hice para un amigo que nunca llega a fin de mes.
+++ new
La hice para un amigo que nunca llega a fin de mes.
Las capturas están en la [sección en inglés](#screenshots).
Output
The file ~\Documents\Hacktoberfest\2026\DEV Challenges\1\README.md has been updated successfully.
Input
$ cd "~/Documents/Hacktoberfest/2026/DEV Challenges/1" && git add -A && git commit -q -m "Add screenshots to the README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>" 2>/dev/null; git push -q 2>&1 | tail -2; git ls-remote origin main; git log --oneline -1; curl -s -o /dev/null -w "%{http_code}\n" https://raw.githubusercontent.com/Virien84/Should-I-Buy/main/screenshots/green-verdict.jpg
Output
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
de12cff8308ab58f7bab2b6fcd5d246ee25b33f2 refs/heads/main
de12cff Add screenshots to the README
200
Las capturas ya están en GitHub. Ahora el post para DEV:
Input
{"skill":"devrelay-publishing","args":"Draft DEV post for Hacktoberfest Weekend Challenge: Build for a Friend (#hf26challenge), project Should I Buy, in English"}
Busco la plantilla oficial de entrega del reto y si ya tienes algún borrador:
Input
Hacktoberfest Weekend Challenge Build for a Friend announcement submission template hf26challenge
Output
{"Ok":[{"id":4793441,"title":"This is a submission for the [Hacktoberfest Weekend Challenge: Build for a Friend]","description":"This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend What I...","tags":["devchallenge","weekendchallenge","hf26challenge"],"path":"/devapraveen/this-is-a-submission-for-the-hacktoberfest-weekend-challenge-build-for-a-friend-1751","ur
… [2022 more characters trimmed]
Input
{"state":"unpublished"}
Output
{"Ok":[]}
Input
browser extension local LLM Ollama privacy personal finance budgeting
Output
{"Ok":[{"id":4564332,"title":"A small privacy decision that changed my web calculator","description":"I built Calculator Toolkit for a narrow moment: someone has a restaurant bill, wants to check the tip...","tags":["webdev","privacy","ux","discuss"],"path":"/laconicleon/a-small-privacy-decision-that-changed-my-web-calculator-5c99","url":"https://dev.to/laconicleon/a-small-privacy-decision-that-ch
… [2170 more characters trimmed]
Input
{"id":4779462}
Output
{"Ok":"Hacktoberfest is here, and so is the first of our [**five Hacktoberfest DEV Challenges**](https://dev.to/devteam/hacktoberfest-2026-dev-challenges-five-challenges-one-prompt-a-new-theme-every-week-1e54): a **[Weekend Challenge](https://dev.to/challenges/hacktoberfest-weekend-2026-10-01)** sized to fit into your weekend. We've set the timing so that wherever you are in the world, you'll hav
… [9362 more characters trimmed]
Ya tengo la plantilla oficial y no tienes ningún borrador previo. Redacto el post:
Input
{"title": "Should I Buy: a traffic light for my friend who never makes it to the end of the month", "description": "A browser extension that tells you, on any shop page, whether you can afford what you're looking at, powered by Gemma running locally with Ollama.", "tags": ["devchallenge", "weekendchallenge", "hf26challenge", "gemma"], "main_image": "https://raw.githubusercontent.com/Virien84/Shoul
… [9462 more characters trimmed]
Output
{"Ok":{"id":4797614,"title":"Should I Buy: a traffic light for my friend who never makes it to the end of the month","description":"A browser extension that tells you, on any shop page, whether you can afford what you're looking at, powered by Gemma running locally with Ollama.","tag_list":["devchallenge","weekendchallenge","hf26challenge","gemma"],"user":{"name":"David Anton Alvarez","username":"
… [9825 more characters trimmed]
Las capturas también están ya en el README del repo en GitHub.
Cómo está hecho el post:
- Sigue la plantilla oficial del reto: What I Built, Demo, Code, How I Built It, Why Does Open Innovation Matter? y Prize Categories.
- Lleva las etiquetas obligatorias devchallenge, weekendchallenge y hf26challenge, más gemma. Opta a Best Use of Gemma.
- Incluye tus 6 capturas, cada una con una explicación, y el repo de GitHub embebido.
- Hay una sección "What my friend said" con sus dos comentarios: que no se hace lento porque el modelo piensa mientras él lee las características del producto, y que valora el comentario realista y la estimación.
- La parte técnica explica que Gemma lee la tienda pero las cuentas no las hace la IA, la precarga del modelo para que vaya rápido y el error 403 de Ollama con las extensiones.
- Dice que lo construiste con Claude Code como agente. DEV lo marca como "some AI", que es lo honesto.
Revisa estas cosas antes de publicar:
1. El género de tu amigo: en el post me refiero a él como "he/him" porque dijiste "ese amigo". Si prefieres que no quede claro o es una amiga, lo cambio.
2. La captura de configuración muestra tu nombre y 1900/1100/400. Si son tus números reales y no quieres que se vean, la quito.
3. "I built it in an evening": cámbialo si no te parece exacto.
Plazo: se entrega hasta las 08:59 hora española de mañana (5 oct). Se publica desde DEV con el botón Publish, o puedes pedirme que lo publique yo.
Opcional: el reto anima a enseñar la sesión con el agente y a los jueces les gusta. Puedo guardar esta conversación con DevRelay y añadirla al post en la sección "My Agent Session". ¿Quieres?
You
sí, guarda la sesión y añádela al post
Prize Categories
Best Use of Gemma: Gemma 3 4B runs locally through Ollama and does both AI jobs: reading arbitrary shop pages into structured product data (with JSON-schema constrained output), and writing the short, honest verdict sentence.