Gemma 4 vs Claude vs Llama: Which Model Wins for Devs

This is a submission for the Gemma 4 Challenge: Write About Gemma 4

Okay, let me be honest with you for a second.

I’m tired of AI comparison posts that read like a press release had a baby with a spreadsheet. You know the ones. Big table. Green checkmarks. “Model X wins for enterprise use cases.” Thanks, very useful, completely useless.

So let me try something different. Let me tell you what I actually found after spending time digging into Gemma 4, Claude, and Llama 4 in 2026 — what surprised me, what annoyed me, and where each one genuinely earns your trust or loses it.

Because the honest answer is: it depends, but not in the way you think.

First — What Even Is Gemma 4?

If you haven’t been paying attention, Google DeepMind dropped Gemma 4 on April 2, 2026 and it quietly started breaking things.

Not in a bad way. In the “wait, this runs on what?” way.

Gemma 4 isn’t a single model. It’s a family:

  • E2B (~2.3B effective params) — designed for phones and Raspberry Pi. Yes, literally your Pi.
  • E4B (~4.5B effective params) — the sweet spot. Runs on integrated graphics or any 8GB+ GPU.
  • 26B A4B MoE — 26 billion total params, but only 3.8 billion active per inference thanks to Mixture-of-Experts routing. One A100 80GB can serve it.
  • 31B Dense — the big gun. All params active, maximum quality.

All of it built on the same research foundations as Gemini 3. All of it released under Apache 2.0. No MAU limits. No special permissions. No restrictive use clauses. Just: here, use it.

That last bit matters more than people are giving it credit for.

The Numbers Nobody’s Contextualizing

Let me throw some benchmarks at you, but I’m actually going to explain what they mean:

Gemma 4 31B on AIME 2026 (math): 89.2%

For context, Gemma 3 27B scored 20.8% on the same test. That’s a +330% jump. Not incremental. Not a rounding error. Something fundamentally changed.

LiveCodeBench v6: 80%

Gemma 3 was at 29.1%. So you’re looking at 175% improvement in coding benchmarks in one generation.

Codeforces ELO: 2,150

That’s expert competitive programmer territory. Running locally. On your machine.

Agentic Tool Use (τ2-bench Retail): went from 6.6% to 86.4%

That’s +1200%. The model went from basically failing at multi-step tool use to crushing it. This is the benchmark I’d bet money on being the most meaningful one for 2026 workflows.

The 31B Dense model currently sits at #3 on the Arena AI text leaderboard among all open models — outcompeting models with 20x more parameters.

And look — I know benchmarks lie sometimes. I know labs cherry-pick. But when every benchmark jumps by 100-300% simultaneously, that’s not cherry-picking. Something real happened here.

Claude: The One You Pay For (And Why You Still Might)

Let me be clear: I respect what Anthropic has built. Claude is genuinely different from most models in ways that are hard to benchmark.

As of early 2026, the main Claude options are:

  • Sonnet 4.6 — $3/$15 per million tokens. 79.6% on SWE-bench Verified.
  • Opus 4.6 — $5/$25 per million tokens. 80.8% on SWE-bench Verified.
  • Opus 4.7 — $5/$25 per million tokens. 87.6% on SWE-bench Verified. Released April 16, 2026.

The gap between Sonnet 4.6 and Opus 4.6 is 1.2 percentage points on the benchmark that matters most for developers. That’s it. One point. At 40% lower cost and 17% faster output. Most production teams route 80% of work to Sonnet and reserve Opus for the genuinely hard stuff.

Cursor’s co-founder called Sonnet 4.6 “a notable improvement over Sonnet 4.5 across the board, including long-horizon tasks.” GitHub reported strong performance on complex code fixes. Cognition said it “meaningfully closed the gap with Opus on bug detection.”

So what’s the catch?

Claude has no weights. Full stop.

You cannot run Claude locally. You cannot fine-tune it on your data. You cannot deploy it on your own infrastructure. There’s no local option, no open version, nothing. It’s a pure API play.

Constitutional AI baked into the architecture means you will occasionally hit refusals that feel arbitrary — requests the model could handle but won’t. The reason-based constitution introduced in January 2026 made these responses more nuanced, but you’ll still encounter them if you push edge cases.

The 200K context window is solid. The 1M beta (via header) is there for Opus if you need it. But if your use case requires data sovereignty, EU compliance, or offline deployment? Claude is a non-starter. Full stop. No negotiation.

Llama 4: The “Free” Option That Has Fine Print

Meta dropped Llama 4 in early 2026 and the internet exploded. Two models released:

  • Scout — 17B active params (16 experts), 10M context window. Fits on a single H100.
  • Maverick — 17B active params (128 experts). 400B total params. The flagship.

The 10 million token context window on Scout is genuinely staggering. Nothing else touches it. If you need to feed an entire codebase, years of logs, or a library of documents into a single context — Scout is the only realistic option today.

Maverick is positioned as a generalist, and for everyday writing, analysis, and conversation? It’s good enough that the quality gap versus paid models often doesn’t justify the cost.

But here’s what doesn’t get talked about:

The benchmark gaming incident. In April 2025, Meta submitted a variant called “Llama-4-Maverick-03-26-Experimental” to LMArena. It topped the leaderboard. The public release performs noticeably worse. LMSYS later acknowledged the variant wasn’t labeled clearly. Meta’s VP denied training on test sets. The AI community read it as benchmark gaming regardless. Until that trust is rebuilt, take any single LMArena number for Llama 4 with healthy skepticism.

The license isn’t what you think. It looks open. It isn’t OSI-certified open source. There’s a 700M MAU clause — if your service exceeds 700 million monthly active users, you need a separate Meta license. For most devs that’s irrelevant. But it also means you can’t legally call it Apache or MIT. Attribution requirements exist on derivatives. Enterprise legal teams in regulated industries will flag this.

EU multimodal restriction. Vision is unavailable for EU-domiciled licensees. Hard block.

Hardware reality. Llama 4 Scout needs 24GB VRAM minimum even quantized. Gemma 4 E4B runs on 6-8GB. If you’re on a laptop or consumer GPU, this comparison basically ends here.

Llama 4 on coding specifically? It’s competitive but not dominant. If your primary workload is code generation or agentic refactoring, it’s not the strongest open-weight choice in 2026.

The Comparison Nobody Actually Makes

Let me put this plainly, because most posts won’t:

The real trade-off isn’t quality. It’s the question of: *who controls the model?*

What You Need Best Pick
Highest raw reasoning quality Claude Opus 4.7
Best local deployment, low VRAM Gemma 4 E4B
Coding on a budget Gemma 4 31B locally, or Claude Sonnet 4.6 via API
10M+ token context Llama 4 Scout
Full data sovereignty Gemma 4 (Apache 2.0, no restrictions)
Commercial use, no legal headaches Gemma 4 (Apache 2.0 beats Llama’s custom license)
Privacy-first, runs on a phone Gemma 4 E2B
Agentic workflows, tool use Gemma 4 31B (86.4% on τ2-bench) or Claude Sonnet 4.6
You’re in the EU with vision needs Not Llama 4
You need fine-tuning freedom Gemma 4 or Llama 4 (not Claude)

Where Gemma 4 Actually Wins the Argument

The thing that keeps pulling me back to Gemma 4 isn’t the benchmark numbers. It’s the combination of things nobody else is offering together:

Edge-to-server coverage under one license. E2B runs on a Raspberry Pi at ~48 tokens per second on a ROG Phone 9 Pro. The 31B Dense runs on a workstation. The 26B MoE runs on a single A100. One model family. One license. One mental model for your entire stack.

The Apache 2.0 shift is a big deal. Earlier Gemma releases had custom licenses that enterprise legal teams routinely flagged as ambiguous. Apache 2.0 means: modify it, fine-tune it, deploy it commercially, redistribute derivatives — no royalties, no MAU limits, no acceptable use policy headaches. In 2026, as companies build always-on AI agents that process customer data continuously, the licensing terms of the underlying model are a strategic decision. Gemma 4 made that decision easy.

Multimodal natively, not bolted on. Text, image, video, audio — not as separate pipeline steps, but as native capabilities built from the Gemini 3 foundation. The smaller models (E2B, E4B) support video and audio. The larger models handle all modalities. This matters for real applications, not benchmark demos.

The reasoning jump is real. When Gemma 4 “thinks,” it can produce 4,000+ tokens of reasoning before committing to an answer. The Codeforces ELO of 2,150 puts it at expert programmer level — locally, on your GPU, free.

The Honest Verdict

If I had to give you one paragraph:

Use Claude when you need the absolute ceiling on reasoning and you’re okay with API costs, black-box architecture, and no local option. Sonnet 4.6 is the value play; Opus 4.7 is for the problems that genuinely require the best thing available.

Use Llama 4 Scout when you need the 10M token context window and you have the hardware for it. For everything else, its coding performance lags and the licensing is messier than it looks.

Use Gemma 4 when you want the freedom to actually own your AI stack. Run it on a phone for edge apps, a consumer GPU for development, a workstation for production — all with the same model family, the same license, the same mental model. The performance is now genuinely competitive at frontier level. The agentic tool use numbers in 2026 suggest it’s not just catching up; in specific areas, it’s already leading.

The era of “open source AI is just good enough to tinker with” is over.

Gemma 4 31B sitting at #3 on Arena AI, outscoring models with 20x the parameter count, running on hardware you already own, under a license that puts zero friction between you and shipping — that’s not a compromise. That’s just the better option for most use cases.

The question isn’t “which model is best” anymore.

The question is: which model fits the kind of developer you want to be?

If your answer involves ownership, privacy, cost control, and the freedom to deploy wherever you want — the answer in 2026 is becoming increasingly obvious.

References:

You can find me across the web here:

Macchiato Día 1: La Terminal Agentica que Nace de un Café

Serie: Bitácora de Macchiato

Hoy no tomé café. Tomé Macchiato.

Tengo cuatro proyectos abiertos ahora mismo. Vue, Spring Boot, un worker en Node y el landing de Guayoyo. Cada uno usa Claude Code o OpenCode dependiendo del día, del ánimo, de qué CLI no rompió algo esa semana.

El ritual es siempre el mismo y siempre me rompe las pelotas: cd ~/projects/loquesea, which claude — no, era OpenCode — y cuando arranca el CLI ya perdí el hilo.

La fricción no está en usar la IA. Está en llegar a usarla. Entre la idea y el prompt hay un desierto de navegación de directorios, verificación de instalaciones y contexto perdido.

Así que en vez de putear la terminal una vez más, abrí Electron.

Día 1 entregó:

  • Shell PTY completo dentro de Electron (no un wrapper — una terminal real)
  • Detecta Claude Code y OpenCode automáticamente en tu PATH
  • Cada CLI en su propia pestaña con contexto independiente
  • Persistencia con SQLite — cierras, abres, retomas donde estabas
  • Cero dependencias externas. Tu data es tuya.

Próximamente en guayoyo.tech. Gratis para empezar, porque nadie debería pagar por abrir su propia terminal con un botón.

— Jesús Manrique, construyendo en voz alta desde Caracas.

Hermes Skill HQ: a knowledge base that teaches agents when to use skills

This is a submission for the Hermes Agent Challenge

What I Built

I built hermes-skill-hq, a skill knowledge base for Hermes Agent.

The problem it solves is simple: once an agent has access to hundreds or thousands of skills, the hard part is no longer “can the agent do this?” It becomes “does the agent know the right skill exists, and will it load it before improvising?”

Hermes Skill HQ gives the agent a structured operating model for that:

  1. Navigator — map a task to the right skill quickly.
  2. Advisor — proactively notice when a skill would help.
  3. Authoring companion — identify gaps and help create new skills when no good one exists.

Instead of treating skills as a passive folder of files, HQ turns them into an active knowledge base. It tells the agent where to look first, when to stop searching, how to avoid wasting context, and how to maintain the index over time.

In practice, it helps Hermes answer questions like:

  • “Is there already a skill for this task?”
  • “Should I load a specific workflow before touching files?”
  • “Is this a missing skill we should author?”
  • “How do I keep the skill catalog from becoming stale?”

Demo

A typical interaction looks like this:

User: Help me set up a ComfyUI workflow.
Hermes: Checked HQ's INDEX — there is a ComfyUI skill for image, video, and audio workflows. Want me to load it before we continue?

Or, when no skill exists:

User: I want to automate a workflow for a tool HQ has never seen.
Hermes: INDEX has no match. Hub search has no match. That looks like a gap. Want me to create a new skill and validate it with skill-creator?

The important part is not the wording; it is the behavior. Hermes stops guessing. It checks the knowledge base first, explains what it found, and either loads the right skill or identifies a skill gap.

Code

Repository:

GitHub logo

CodeSigils
/
hermes-skill-hq

THE definitive skill knowledge base for any Hermes AI agent. Curated task→skill INDEX, proactive advisor, marketplace navigation, skill-authoring companion.

hermes-skill-hq

THE skill knowledge base for any Hermes AI agent.

When you start a session, Hermes checks this first. It knows which skills exist, recommends ones you might need before you ask, and helps you create new ones for tasks that don’t have one yet.

How It Works For You

You don’t manage skills manually — Hermes does it.

At the start of each session, Hermes reads HQ’s INDEX and keeps skill opportunities in mind. When it detects you’re working on something that has a skill — even one you haven’t loaded — it tells you:

“I noticed you’re working with ComfyUI images — want me to load comfyui? It handles image and video generation.”

You say yes or no. That’s it.

What HQ Does For You

What How
Skill discovery Knows ~2043 skills from the Hermes hub + skills.sh ecosystem
Proactive recommendations Suggests skills based on what you’re

…

The project is designed to live at the standard Hermes knowledge-base path:

git clone https://github.com/CodeSigils/hermes-skill-hq.git ~/.hermes/kb

Then it can be added to Hermes through external_dirs:

external_dirs:
  - ~/.hermes/kb

After refreshing Hermes, the knowledge base becomes available as a normal skill named hermes-skill-hq.

My Tech Stack

  • Hermes Agent
  • Agent Skills / SKILL.md format
  • Markdown knowledge base files
  • A curated task-to-skill index
  • Local Hermes hub cache with roughly 2,000 skills
  • External skill marketplace references
  • GitHub for versioning and distribution

The repo is intentionally lightweight. Most of the value is in the structure and the operating contract, not in a big application framework.

How I Used Hermes Agent

Hermes Agent is both the runtime and the development environment for this project.

I used Hermes to inspect the existing skill ecosystem, compare local skills against hub and marketplace sources, update the task-to-skill index, trim overly large references, and keep the documentation accurate. The agent was especially useful for repetitive knowledge-maintenance work: searching files, checking stale references, editing Markdown, validating instructions, and updating related skill docs when a workflow changed.

The most useful agentic capabilities were:

  • Tool use: Hermes could inspect the repo, read source files, search across the knowledge base, and apply targeted edits.
  • Persistent skills: Workflows that proved useful could be turned into reusable skills instead of being re-explained every session.
  • Memory and session continuity: Hermes could remember durable conventions, like the canonical install path ~/.hermes/kb/, while avoiding stale task-progress notes.
  • Skill loading: The project depends on the idea that agents should load specialized instructions before acting. HQ makes that behavior explicit and systematic.
  • Self-improvement loop: When Hermes finds a gap, it can help author a new skill, validate it, and add it back into the index.

Hermes Skill HQ is essentially a meta-skill: it helps Hermes decide which other skill to use. That makes the agent more reliable, less ad hoc, and more transparent about why it is choosing a particular workflow.

The design goal is not to make the agent read everything. In fact, a major part of the project is teaching the agent when to stop. HQ uses a layered search strategy: check the index first, search the hub second, and only expand to marketplaces when simpler sources fail. That keeps context usage under control while still giving the agent a path to deeper discovery when needed.

For me, that is the core value: Hermes Skill HQ turns a large pile of reusable capabilities into a navigable, maintainable system.

I built an AI that filters what actually needs your attention — architecture, failures, and what works

I used to start every morning the same way: open Gmail, feel immediately overwhelmed, spend 40 minutes triaging emails that turned out not to matter — and then miss the one thing that actually did.

So I built Jigeum — an AI Chief of Staff that reads your inbox, scores every signal by urgency, and surfaces only what needs you. This is the architecture, the honest failures, and what actually changed my routine.

The first version completely failed

My original product was called EVE. The pitch: “AI employee — connect your tools, EVE handles the rest.”

It was too broad. Every demo, people nodded politely. Nobody knew what to do with it. I shipped features — Slack integration, task management, autonomous agent loops — but the core value proposition was muddy. Four months in, I was the only person using it daily.

Every morning I’d open it and quietly ask myself: why am I actually using this?

That question cracked it open.

The real problem: attention is the bottleneck

The problem isn’t having too many emails. It’s that every notification competes for the same finite resource: your decision-making capacity.

A GDPR newsletter. A contract waiting for signature. A customer reporting a critical bug. A LinkedIn request. Your inbox treats them identically.

I renamed the product Jigeum (지금 — Korean for right now) and rebuilt around a single question: what needs my attention right now, and what doesn’t?

Architecture: the Attention OS

The core model is a 5-tier escalation system. Every incoming signal — email, calendar event, extracted commitment — gets classified before it ever reaches me:

SILENT    → don't surface, don't notify
QUEUE     → add to review list, no interrupt
PUSH      → mobile push notification
CALL      → urgent interrupt (not yet built)
AUTO      → handle automatically without asking

I call this the Attention Firewall. Before anything reaches my conscious attention, it passes through classification.

Trust Score

Each sender gets a Trust Score (0–100). Higher score means more likely to escalate. It’s derived from:

  • Historical reply frequency
  • Whether I’ve responded before, and how fast
  • Explicit feedback (“always notify me from this person”)
  • Domain-level signals (my own domain scores higher than cold outreach)
interface TrustScore {
  userId: string;
  contactEmail: string;
  score: number;               // 0–100
  interactionCount: number;
  avgResponseMinutes: number | null;
  lastInteractionAt: Date | null;
}

A newsletter I’ve never replied to scores ~10. My co-founder scores 95. The escalation tier is calculated from trust score combined with content analysis of the email itself.

Voice Profile

The AI needs to know how I communicate, not just what to do. Voice Profile stores the patterns extracted from my sent mail:

interface VoiceProfile {
  userId: string;
  tone: string;                // "direct", "warm", "formal"
  signatureStyle: string;
  preferredLength: "short" | "medium" | "long";
  phrases: string[];           // things I actually say
  avoidPhrases: string[];      // things I never say
}

When drafting a reply suggestion, the AI pulls this profile. The goal is that a suggested reply reads like me — not like a generic AI assistant.

Commitment Ledger

This is the feature that made me realize the product had real value.

Every email where I wrote “I’ll send this by Friday” or “Let me get back to you next week” — those are commitments. They disappear into threads. I forget them. The other person doesn’t.

The commitment extractor runs on every processed email and populates a ledger:

interface Commitment {
  id: string;
  userId: string;
  title: string;
  kind: "DELIVERABLE" | "MEETING" | "FOLLOW_UP" | "DECISION";
  owner: "USER" | "COUNTERPART";
  dueAt: Date | null;
  dueText: string | null;      // "by Friday", "next week"
  confidence: number;          // 0–1
  status: "OPEN" | "DONE" | "OVERDUE";
}

The confidence field matters a lot. “Let’s sync sometime” → confidence 0.3, stays quiet. “Please send the NDA by Tuesday EOD” → confidence 0.9, surfaced immediately in the Command Center.

The Command Center

The UI is a single page. This replaced my inbox as the first screen I open each morning.

Layout (left → right on desktop):

  • Morning Briefing — AI summary of what happened overnight and what needs attention today, full width at top
  • Approval Queue — actions Jigeum wants to take but needs my sign-off first
  • Commitment Ledger — things I promised, things others promised me
  • Reply Needed — emails where someone asked a direct question

The Reply Needed surface was the hardest to get right. Naive approach (detect ? in email body) had terrible precision — questions in automated receipts, rhetorical questions, quoted threads all triggered false positives.

What actually works: question detection + sender trust weighting + thread position analysis (a question in the first email of a thread means something different than the same question in reply #5).

// GET /api/inbox/reply-needed
const rows = await prisma.emailMessage.findMany({
  where: { userId, needsReply: true },
  orderBy: [
    { needsReplyConfidence: "desc" },
    { receivedAt: "desc" }
  ],
  take: 8,
  select: {
    id: true,
    subject: true,
    from: true,
    snippet: true,
    needsReplyReason: true,
    needsReplyConfidence: true,
    receivedAt: true,
  },
});

Tech stack

Layer Choice
API Fastify + TypeScript + Prisma
Database PostgreSQL (Supabase)
Web Next.js 15 App Router
AI OpenRouter — Claude Sonnet for analysis, Haiku for classification
Email Gmail API (OAuth2, incremental sync via historyId)
Push Web Push API + service workers
Deploy Render (API) + Vercel (web)

One thing I’d do differently: Gmail sync architecture. I built polling with historyId-based incremental sync when I should have used Gmail Push Notifications from day one. The polling works but introduces ~30s latency on new emails. That latency matters when something urgent arrives.

What failed (honestly)

Notification flood. The early version pushed a notification for every signal classified as PUSH tier. Within 24 hours I had disabled push notifications on my own app. Had to rebuild with rate limiting — same-sender notifications within 15 minutes now collapse into one.

Over-trusting AUTO. The autonomous tier where Jigeum acts without asking me — I thought I wanted this. Turns out I don’t trust it yet. I’ve pulled AUTO back to only unsubscribes and read-receipts. Anything that involves sending a message or making a decision goes through the Approval Queue.

The rebrand was a distraction. Spent a full week renaming EVE → Jigeum across the codebase, updating marketing copy, redoing the landing page. The code ran identically after. Should have shipped instead.

Mobile doesn’t exist yet. It’s web-only. For something meant to filter morning attention, the fact that you have to open a browser tab is a real friction point. Working on it.

Four weeks of dogfooding — what actually changed

  • I check the Commitment Ledger before every morning standup. It’s caught 3 things I would have genuinely dropped.
  • Reply Needed reduced my inbox-zero anxiety. If something actually needs me, it surfaces there. If it’s not there, I’m not missing anything.
  • Morning Briefing saves roughly 20 minutes of triage per day.
  • The AI still occasionally misclassifies cold outreach as high-priority. Trust Score calibration is ongoing.

Try it

Jigeum is in private beta at hire-eve-web.vercel.app. Connect Gmail + Calendar, initial sync takes about 30 seconds.

If you’re a founder, solo operator, or anyone who feels like their attention is being managed by their inbox rather than by themselves — I’d genuinely value the feedback. Especially where it gets the classification wrong.

Happy to answer architecture questions in the comments.

Built solo. Stack: Next.js, Fastify, PostgreSQL, Gmail API, and a lot of OpenRouter credits.

My Thoughts on Token-Maxxing: A Call for Learning, Creativity, and Real Impact Instead of Simple Token-Maxxing

OpenIA generated image

OpenIA generated image
Tokenmaxxing is an example of how a single parameter can push organizations toward either positive outcomes or harmful behavior.
How does the bad path begin? It starts very innocently. At the beginning, there is always a company-level initiative. Leaders and managers try to find the best way to optimize processes and boost company development. After 2025, there is mostly one direction – introducing AI tools.
So companies spend a lot of money introducing these tools, adapting them to their profile, and maintaining them. It is a significant investment. Over time, however, some disappointment may appear. There is neither massive optimization nor a visible boost in productivity. Of course, there is always some scale of improvement, as well as some scale of disappointment. Up to this point, there are no errors — this is simply reality.
The real problem may start afterward. At that stage, investigations begin to find where is the issue? Usually, the culprit is identified quite quickly — people who do not use the tools enough, or do not use them widely enough.
What happens next? Pressure to use AI as much as possible. And this is where tokenmaxxing begins. Managers can easily see who uses AI tools the most. They may not check what kinds of problems people are solving; instead, there is only one visible parameter: token usage. The more, the better. But is it really?
As a result, people start burning tokens everywhere simply to avoid negative consequences — even for tasks where AI is unnecessary or where the AI-generated outcome is mediocre.
This is the perfect recipe for disaster. And later it does not help when managers say that employees will not be judged by token usage. The show has already started, and stopping this snowball becomes very difficult. And from the employee’s perspective, there is always some kind of uncertainty: What can I do? How can I use it? What if I make mistakes? How will I find time to experiment? There are many more doubts, and it ultimately depends on the company culture how everything turns out.

I’m glad that the company I currently work for chose an experimentation-driven approach instead of simply following the tokenmaxxing approach.
During one week, we had an opportunity to experiment with AI tools at different levels and across different layers. We could split into different squads. There were no rigid rules regarding squad size or the types of employees involved. The idea was simple: experiment with AI tools as much as possible — but truly experiment. Define friction points, identify what works well and what does not.
From my engineering perspective, it was a great approach, and inspiring experience. In the team I was part of, we tried to implement a product-owner-defined concept starting from design and using spec-driven development. We used AI tools at every stage of the process.
The high-level idea was to create a top-level specification with interfaces, while each developer in the squad could introduce their own sub-specifications for the area they were responsible for.
We ended up with the first draft of an MVP for our feature, as well as many AI-agent-related skills that can now be developed, improved, and used more broadly in our engineering work. At the company level, we could see how other teams approached problems and what they experimented with. Basically, we could learn from each other at both the squad and company level.
But what was most inspiring, paradoxically, was that we cooperated as a squad more closely than we normally do. I could say that AI brought people closer together. And I think that should be the real idea. Inspiring, isn’t it?

AI tools should not separate people from the squad or team, pushing them toward working independently together with AI agents. The goal should be that AI tools help people collaborate more tightly, because we all know that AI still cannot replace human judgment, emotional intelligence, and creativity — at least not for now.
Could there be a future where the product of a single human brain working with AI becomes better than collective human collaboration? Maybe. We will see. But that is a story for another time.
My main takeaway is that AI tools are great. We should use them, and we need to use them more. But nothing is better than collective human work. Instead of forcing people to use AI tools and judging their engagement based on a single parameter, it is far more important to create space for experimentation and making mistakes. Because only in that process, there is a space for improvement, development, and real growth.

I got tired of typing nasm/ld/gcc by hand, so I built a tool that does it for me

If you’ve ever written assembly or C without CMake, Makefiles, or any build system — you know the ritual.

Open terminal. Remember the flags. Compile one file. Then another. Then link them. Then mess up the argument order. Then do it again. And again. Every. Single. Time.

I did this long enough to finally say: enough.

That’s how fz (ForgeZero) was born — a small CLI tool written in Go that takes all the assembly/C build drudgery off your plate. No extra dependencies. No 300-line config files. It just works.

What it actually does

Build a single file — one command

fz -asm hello.asm
fz -cc main.c

No need to remember nasm, fasm, or gcc flags. fz figures out what it’s looking at and spits out a binary.

Build an entire project — also one command

fz -dir ./src

Recursively finds all .asm, .s, .fasm, and .c files, compiles each into an object file, then links everything together. Object filenames are unique, so hello_asm.o and hello_s.o don’t step on each other.

SHA256 caching — because waiting is pain

Incremental builds without changes are near-instant. fz hashes each source file + build flags, and if nothing changed, the compiler doesn’t even get invoked. That’s it.

Strict mode for C — no escape from quality

C files are compiled with the full warnings-as-errors suite:

-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion

AddressSanitizer and UBSan are on by default. The -strict flag adds use-after-return and use-after-scope, and automatically prefers clang if it’s available, falling back to gcc with limited support.

Don’t want sanitizers? -no-sanitize. Done.

Watch mode — because hitting ↑ Enter is still too many keystrokes

fz -watch -dir ./src

Watches your source files and config for changes, rebuilds with a 500ms debounce. Save a file, and a second later you’ve got a fresh binary.

JSON output — for your CI/CD pipelines

fz -json -dir ./src

Returns structured JSON: status, exit code, build time, list of sources and object files, binary name, error message. Easy to parse in any pipeline, no string-scraping needed.

Config file — set it and forget it

Drop a .fz.yaml in your project root and stop passing flags every time:

source_dir: ./src
output: my_program
mode: auto
debug: false
keep_obj: false
exclude:
  - legacy/

Also accepts fz.yaml, .fz.yml, fz.yml — whatever you prefer.

Three linker modes

Not all projects are the same, so you can pick:

Mode What it does
auto Tries gcc, then gcc -no-pie, then ld
c Only gcc (for C projects)
raw Only ld (for pure assembly)

fz also checks for duplicate symbols before linking via nm / objdump, so you get a clean, readable error instead of a linker wall of text.

Linters & formatters

Since fz builds real C and assembly, it plays nicely with the tools you’re already using:

C:

  • clang-format — format your sources before/after build
  • clang-tidy — static analysis; pairs well with fz’s strict mode
  • cppcheck — extra static checks on top of GCC/clang warnings
  • splint — if you’re into really paranoid C checking

Assembly (NASM/GAS):

  • asmfmt — NASM formatter (like gofmt, but for asm)
  • nasm -E — preprocessor pass to inspect macro expansion
  • GAS has no official formatter, but indent-style scripts exist in the wild

Go (fz itself):

  • gofmt / goimports — standard Go formatting
  • golangci-lint — runs staticcheck, errcheck, govet and a bunch more in one shot
  • go vet — built-in static analysis

The philosophy: fz enforces quality at the compiler level (warnings as errors, sanitizers), and you layer your preferred linter on top.

Installation

go install github.com/forgezero-cli/ForgeZero/cmd/fz@latest

You just need Go, plus whatever compilers you’re already using (nasm, gcc, fasm). That’s it. No package manager drama.

Roadmap (v1.4.0 → v1.5.0)

Here’s what’s coming:

  • C++ support — .cpp files → g++, same strict flags
  • Custom flags — -asm-flag, -cc-flag, -ld-flag for when you need to pass something weird
  • Exclude patterns — -exclude in CLI and exclude: in config
  • Better error messages — with hints like “did you forget #include <stdio.h>?”
  • Colored output — errors in red, success in green, respects NO_COLOR
  • CI/CD matrix — automated tests on Linux, macOS, Windows
  • Packages — Homebrew tap and AUR package
  • Shell completions — bash, zsh, fish

Current state

Version 1.3.0 is stable, production-ready, with ~70% test coverage, a built-in man page (fz -man), and a colored --help with grouped options and examples.

If you write low-level code and this pain sounds familiar — give it a shot. Feedback and ⭐ on GitHub are always appreciated.

→ github.com/forgezero-cli/ForgeZero

Buying a WhatsApp Bot in 2026? Five Traps to Avoid

I build WhatsApp automation for small businesses, and in 2026 the first thing you notice about the market is how similar every offer looks. A dozen vendors, the same promises — 24/7 replies, appointment booking, lead capture — and quotes that all cluster in the same range.

After several years of these projects, the pattern is clear: the expensive mistakes are almost never in the build itself. They are in the buying decision — the questions nobody asked before signing. Here are the five that account for most of the regret.

Trap 1 — Judging the quote by its setup price

The visible number on a bot quote is the one-time build fee. In the market I work in (Israel), that is broadly ₪3,500 for a basic bot, around ₪6,500 for a mid-tier with CRM integration, and ₪12,000+ for a full AI agent. Buyers line those numbers up and pick the lowest.

But the setup fee varies least between serious vendors. What actually decides whether the bot is cheap or expensive over three years is the recurring cost: per-message template fees, language-model usage, hosting, maintenance. A bot with a low setup fee and an unexamined monthly tail can cost more over two years than a pricier build with a lean tail. Ask for the three-year total, not the sticker.

Trap 2 — Not asking which API the bot runs on

This is the single most consequential question, and most buyers never ask it.

A WhatsApp bot connects in one of two ways: through Meta’s official WhatsApp Business API, or through an unofficial route that automates the regular WhatsApp app (the best-known open-source project here is WAHA). The unofficial route is genuinely cheaper — no per-message fee — and at low volume it works.

It also runs against Meta’s terms of service, and the number it runs on can be suspended without warning or appeal. For most businesses the WhatsApp number is the customer database and the primary contact channel. Losing it is not an inconvenience; it is a small catastrophe. The unofficial route is reasonable for narrow cases — internal tools, low-stakes notifications — but you should know which one you are buying, and why. A quote that doesn’t specify is a quote to question.

Trap 3 — Paying for AI the bot will never use

“AI-powered” is the headline tier on most 2026 quotes. It is also the tier most often sold and least often delivered — not because vendors cut corners, but because an AI bot is only as good as what it is given.

A language model wired to WhatsApp but never fed the business’s real price list, policies, hours, and tone will underperform a plain, well-built menu bot. The capability is real; it just isn’t automatic. Before paying the AI premium, ask the concrete question: what exactly will the model be given to work from, who assembles that, and who keeps it current. If the answer is vague, you’re buying a label.

Trap 4 — Treating the bot as build-once

A WhatsApp bot is not an appliance. It is software sitting on top of three things that move constantly — Meta’s platform, the automation tooling, and the AI models underneath.

The pace is not theoretical. Inside one 90-day window in 2026, Meta repriced its message templates, n8n shipped native AI-agent capability, the major model vendors cut their cheapest production models by 40–60%, and Meta’s WhatsApp Calling API reached general availability. A bot specified in early 2025, on early-2025 assumptions, is already running on stale economics. Either budget for maintenance, or budget — unknowingly — for a rebuild.

Trap 5 — No exit ramp to a human

The last trap is the most human one. A bot with no clean handoff to a person frustrates customers more than no bot at all — everyone has been stuck in a loop with an automated system that won’t let them out.

The measure of a well-built bot is not how many conversations it handles end to end. It is how gracefully it recognizes the ones it cannot, and how fast it puts a real person in the chat. Ask any vendor to walk through exactly what happens when the bot doesn’t know the answer.

What good looks like

A strong vendor’s quote answers all five of these before you think to ask — it states the API, breaks out the recurring costs, is specific about what the AI is fed, includes a maintenance path, and treats the human handoff as a feature, not an afterthought.

If you want the longer version — the bot types, the official-vs-unofficial API tradeoff in detail, and current pricing — I keep a full guide here: WhatsApp Bot for Business: the complete guide.

The market is crowded, and from the outside the offers really do look alike. They stop looking alike the moment you ask the five questions.

I run an automation consultancy focused on WhatsApp chatbots, n8n workflows, and CRM integrations for small businesses.

Día 2 de Macchiato: Métricas Vivas, Atajos y Tres Terminales en Grid

Macchiato Día 2 — Header

Macchiato Día 2 — Header

Serie: Bitácora de Macchiato — Día 1 · Día 2

Ayer nació Macchiato. Hoy le crecieron dientes.

En el Día 1 dejamos un esqueleto que respira: Electron, Vue, PTY, SQLite, un botón que abre Claude Code u OpenCode sin que tengas que navegar carpetas como un arqueólogo. Lo publiqué, lo mandé por WhatsApp a un par de devs amigos, y en dos horas ya tenía feedback.

“Está cool, pero ¿cuánto estoy gastando?”

Esa pregunta me la hicieron tres personas distintas en menos de 24 horas. Y tenían razón. Abrir el CLI con un botón resuelve el problema de llegar. Pero una vez que estás dentro, disparándole prompts a Claude Code como si fuera un compañero de equipo con acceso ilimitado a tu cartera, la pregunta inevitable es: ¿esto cuánto me está costando?

Así que el Día 2 fue eso. Y más.

El Sidebar Que Te Mira el Bolsillo

Lo primero que metí fue un sidebar lateral — discreto, siempre visible, no molesta. Pero cuando le das a un prompt, se despierta.

Macchiato ahora intercepta el flujo de tokens entre tú y el CLI. No es un proxy ni una capa intermedia rara: es más elegante que eso. La app escucha el stream de respuestas del modelo — sea Claude Code o OpenCode — y extrae los metadatos de uso en tiempo real.

El sidebar te muestra tres números mientras escribes:

  • Tokens de entrada — lo que el modelo está leyendo (tu prompt + contexto)
  • Tokens de salida — lo que el modelo está generando
  • Costo estimado — en dólares, calculado contra el pricing oficial de cada modelo

Los números se actualizan en vivo, mientras el texto aparece en la terminal. No tienes que esperar a que termine la respuesta. No tienes que abrir una consola de Anthropic o revisar logs. Está ahí, en tu cara, en el momento exacto en que los tokens se están quemando.

Y sí, ver cómo sube el numerito en tiempo real cambia cómo escribes prompts. Te vuelves más preciso. Menos “a ver qué dice” y más “esto es exactamente lo que necesito.” La transparencia duele, pero educa.

Dashboard: Donde los Números No Mienten

El sidebar está bien para el minuto a minuto. Pero la gente que maneja presupuestos — o sea, cualquiera que no viva de una API key ajena — necesita ver la película completa.

En la pestaña de Dashboard, Macchiato ahora te muestra:

  • Consumo por sesión — cada conversación con su propio desglose de tokens y costo
  • Consumo diario, semanal y mensual — con gráficos de barra que te muestran la tendencia
  • Desglose por CLI — ¿gastas más en Claude Code o en OpenCode? Ahora lo sabes sin hacer arqueología
  • Prompt más caro del mes — ese que metiste con medio codebase de contexto y te salió más que un almuerzo

Todo esto vive en SQLite, local. Tus datos de consumo no salen de tu máquina. No hay analytics, no hay telemetría, no hay nada que le esté contando a nadie cuántos tokens quemas. Eso es importante decirlo: Macchiato no es SaaS. Es una app de escritorio. Tu data es tuya.

Atajos de Teclado: Manos en el Teclado, Cabeza en el Código

Una de las cosas que más odio de saltar entre apps es tener que tocar el mouse. Cada vez que mueves la mano derecha del teclado al trackpad pierdes unos segundos. Multiplicado por cincuenta veces al día, son minutos. Multiplicado por una semana, es tiempo que podría haber sido código.

El Día 2 metí atajos de teclado para todo lo que importa:

  • Ctrl+T — nueva pestaña de shell
  • Ctrl+W — cerrar pestaña actual
  • Ctrl+Tab / Ctrl+Shift+Tab — navegar entre pestañas abiertas
  • Ctrl+1 a Ctrl+9 — saltar directo a la pestaña N
  • Ctrl+Shift+1 — lanzar Claude Code en una pestaña nueva
  • Ctrl+Shift+2 — lanzar OpenCode en una pestaña nueva
  • Ctrl+Shift+D — ir al Dashboard
  • Ctrl+, — ir a Configuración
  • Ctrl+P — paleta de comandos, con búsqueda difusa de todas las acciones
  • Ctrl+Shift+C — copiar selección de la terminal
  • Ctrl+Shift+V — pegar en la terminal

En macOS es Cmd en vez de Ctrl, pero la idea es la misma.

No son atajos por ser atajos. Cada uno resuelve una micro-fricción que detecté usándola yo mismo durante horas. La paleta de comandos en particular me cambió la vida: escribes “claude” y te sugiere lanzar Claude Code en la carpeta actual, o “dashboard” y te lleva a las métricas. Es el tipo de fluidez que hace que una herramienta se vuelva una extensión de tu cerebro en vez de un obstáculo entre tu cerebro y el código.

Selección de Directorios: Porque No Todo Vive en ~/proyectos

El Día 1, Macchiato asumía que estabas en el directorio donde abriste la app. Funcionaba, pero era rígido.

Ahora, cuando lanzas Claude Code u OpenCode — ya sea con el botón o con Ctrl+Shift+1 / Ctrl+Shift+2 — la app te muestra un selector de carpetas. Eliges el proyecto, y el CLI arranca en ese contexto. Si siempre trabajas en la misma carpeta, Macchiato la recuerda y no te pregunta dos veces. Si saltas entre proyectos como yo — frontend, backend, worker, landing, script random que hiciste a las 2 AM — cambias de contexto en dos clics.

Esto parece un detalle. No lo es. Es la diferencia entre una herramienta que usas para un proyecto y una herramienta que usas para todos tus proyectos. Macchiato está apuntando a lo segundo.

Copiar y Pegar Que No Te Rompe las Bolas

Las terminales y el portapapeles nunca han sido amigos. O seleccionas texto y se va con espacios raros, o pegas algo y la shell lo interpreta como comandos separados, o el scroll te juega una mala pasada y seleccionaste tres líneas en vez de una.

Arreglé tres cosas puntuales:

  1. Selección inteligente — detecta si estás seleccionando un comando, una ruta de archivo, o un bloque de código, y Ctrl+Shift+C copia con el contexto correcto
  2. Pegado seguro — Ctrl+Shift+V inyecta el texto en la shell, pero antes Macchiato sanitiza saltos de línea y caracteres que podrían ejecutar comandos sin querer
  3. Historial de portapapeles interno — un mini historial de las últimas 10 cosas que copiaste de la terminal, porque siempre necesitas esa línea que copiaste hace tres mensajes

No es glamuroso. Pero cuando estás debugueando a las 11 PM y copias y pegas cien veces una traza de error, estas micro-optimizaciones son lo que te mantienen cuerdo.

Límites de Consumo: Paredes Que Te Salvan

Esta feature nació del miedo. Miedo a despertarme un lunes y ver la factura de Anthropic con un número que empieza con el código de área de Maracay.

Macchiato ahora te deja configurar límites de consumo:

  • Límite diario — “hoy no gasto más de $5”
  • Límite mensual — “este mes no paso de $100”
  • Límite por sesión — “esta conversación no se va a más de $3”

Cuando te acercas al 80% del límite, Macchiato te tira una notificación del sistema operativo. Un aviso, no un bloqueo. “Estás al 80% de tu límite diario de tokens.” Cuando llegas al 100%, te pregunta si quieres seguir o cortar. La decisión sigue siendo tuya, pero ahora es una decisión informada.

Las notificaciones usan la API nativa de cada SO — Notification API en macOS, dbus en Linux, Toast en Windows. Sin dependencias externas, sin servicios corriendo de fondo. Solo Electron haciendo lo que Electron sabe hacer.

Esto es importantísimo para equipos. Si tienes un dev que está aprendiendo a usar Claude Code y no tiene instinto de “esto está saliendo caro”, los límites son el cinturón de seguridad. No evitan el choque, pero evitan que te mates.

Grid View: Dos Terminales, Una Ventana, Cero Cambios de Contexto

Y la feature que más me emociona del Día 2: la vista grid.

Desde la paleta de comandos o con un atajo directo, partes la ventana en dos. O en tres. O en cuatro. Cada panel es una terminal independiente, cada una con su propio CLI corriendo, su propio contexto, su propio directorio.

¿Por qué esto es un game-changer?

  • Frontend + Backend en paralelo — Claude Code en una mitad trabajando en el frontend Vue, OpenCode en la otra refactorizando el API de Spring Boot
  • Dos enfoques al mismo problema — mismo prompt, dos CLIs distintos, compara las respuestas en tiempo real
  • Code review asistida — una terminal ejecuta cambios, la otra los revisa

El grid no es un gimmick visual. Es la diferencia entre trabajar en serie y trabajar en paralelo. Y en un mundo donde los agentes de IA ya escriben código más rápido que tú, el bottleneck no es la velocidad del modelo — es cuántos carriles tienes abiertos.

Cada panel es completamente independiente: su propia sesión de PTY, su propio tracking de tokens, sus propios límites. Si una terminal está a medio prompt y necesitas preguntar algo rápido en otra, no tienes que esperar. Abres un panel nuevo con Ctrl+T y sigues.

Multi-Ejecución: Un Comando, Todas las Terminales

Pero tener varios paneles abiertos trajo otra cosa. Imagínate esto: tienes tres terminales en grid. Necesitas hacer git pull en las tres. O npm install en el frontend y en el backend al mismo tiempo. O lanzar el mismo prompt en Claude Code y OpenCode para comparar respuestas.

Escribir el mismo comando tres veces es absurdo. Somos programadores. Automatizamos cosas.

Así que metí la multi-ejecución: un campo de input maestro que manda el mismo comando a todas las terminales activas simultáneamente.

Funciona así:

  • Escribes en el campo maestro y cada tecla se replica en tiempo real en todos los paneles — un broadcast de teclado
  • Enter ejecuta el comando en todos los paneles del grid a la vez
  • Puedes marcar un subconjunto de paneles y ejecutar solo en esos

No es solo mandar texto. La multi-ejecución respeta el contexto de cada panel: si estás en un grid con tres proyectos distintos, cada terminal ejecuta el comando en su propio directorio de trabajo, con su propio CLI, su propio estado. Un git status te muestra el estado de tres repos distintos al mismo tiempo. Un npm run dev levanta tres entornos de desarrollo con un solo atajo.

El caso de uso más salvaje que probé: un grid de cuatro paneles, cada uno con un contexto de Claude Code distinto, y el mismo prompt de refactorización en los cuatro. Cuatro respuestas diferentes, cuatro enfoques, y tú eliges cuál te sirve. Eso no es pair programming — es squad programming.

Lo Que Viene

El Día 1 fue el esqueleto. El Día 2 fue el sistema nervioso — métricas, control, fluidez, paralelismo. El Día 3 va a ser otra cosa.

Estoy cocinando:

  • Workspaces — conjuntos de pestañas y layouts grid que se guardan y se restauran con un clic
  • Exportación de sesiones — compartir logs, prompts y respuestas con tu equipo
  • Integración con Git — la terminal que sabe en qué branch estás y qué cambios hiciste antes de mandarle un prompt

Y más, siempre hay más. Esto es una maratón, no un sprint.

Macchiato sigue sin estar disponible para descargar. Pero el repo privado está recibiendo commits diarios, y el plan de betatesters sigue en pie. Si te sirve lo que estoy construyendo, escríbeme. Si quieres ser de los primeros en probarlo, escríbeme también. Y si piensas que es una locura, escríbeme igual — el feedback es gasolina.

Pronto en guayoyo.tech. Y sí, el Día 2 también fue gratis. Por ahora.

— Jesús Manrique, construyendo en voz alta desde Caracas, con tres terminales abiertas y un macchiato frío en la mesa.