AI-Native Apps Will Swallow the Web

Here is my prediction: AI-native apps will swallow the web. Not in ten years, but before 2026 is over – and the transition is already underway.

MCP – the Model Context Protocol Anthropic introduced in November 2024 – has already been adopted by Google, Microsoft, and the W3C. Every major LLM speaks it. The browser vendors are integrating it directly: WebMCP is a draft at the W3C with an early implementation already shipped in Chrome. The naming is still loose – agentic apps, agent-native apps, in-chat applications – but the category is real.

MCP is going to swallow the web just as the web did the desktop. AI-native apps (or whatever they come to be called) are the next web.

MCP is going to swallow the web just as the web did the desktop.

The web we have will not vanish. It will be subsumed. Before 2026 is over, AI-native-only will be a viable path: a product that exists as MCP-callable tools and machine-readable state, with no browser, no mobile app, no human-facing surface – and a real customer base. The agents are already there. The protocol is in place.

Users will pull this forward because the AI becomes both the access point and the source of enrichment. One conversation instead of a dozen tabs. The AI knows the sneakers, knows the cars, knows how you like to travel. Like the whole of the web, the merchant’s site becomes raw material.

Like the whole of the web, the merchant’s site becomes raw material.

This sounds extreme, but it is also already underway. Shopify has built a Storefront MCP for AI-mediated commerce. AI-native apps are bringing back the constraints that shaped the early web – stateless protocols, server-side logic, forms for input – for a new class of consumer.

It is because of this seismic shift that our client work has reorganized around it, and it is why we just published a new cluster of MCP guides – eight pieces written for product leaders deciding whether and how to be present inside leading AI clients. We start with the working vocabulary the category has not yet settled, lay out a strategic decision framework that determines posture, set the client comparison matrix for choosing where to ship first, walk through the embedding-types breakdown that distinguishes read-only from actions from agent-resident, frame the auth and security expectations enterprise procurement actually wants, work the build-vs-buy economics of in-house engineering versus a development partner, give you a partner evaluation checklist for a category too young for the usual portfolio signals, and tie it together in a hub guide. The category is moving fast enough that vague advice ages quickly. These guides are specific, current, and built to be useful for the decisions our clients are making right now.

AI-native apps will swallow the web.

Originally published at launchdayadvisors.com

I switched my Gemma 4 model three times in 72 hours. Here’s the decision tree I wish I’d had.

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

I picked the wrong Gemma 4 model. Twice.

A 72-hour speedrun through E2B, E4B, and 31B-via-cloud — and the decision tree I wish I’d had on hour one.

Three days before the deadline, I sat down to build a multimodal Gemma 4 app for the challenge. I’d already decided which variant I’d use: E4B, because bigger is better, right?

I shipped on E4B. Then I shipped on E2B. Then I added OpenRouter’s 31B as a third option and let users pick.

Here is what each move cost me, what I learned, and the decision tree I’d hand to anyone starting today.

Quick context before the story: Gemma 4 is Google’s open AI model family — Google publishes the model weights for free, you download them and run them yourself, no API key required. It ships in four sizes; the two smallest (E2B and E4B) are tiny enough to run inside a browser tab via WebGPU (the browser’s graphics-card API), while the 31B Dense and 26B MoE variants are server-class. All four are multimodal — they read images and audio, not just text. That last part is why a real app inside a browser tab is suddenly possible: the model that categorizes your text transactions can also read a photo of a receipt, with no extra download.

The setup

The app — a private personal-finance dashboard that runs Gemma 4 entirely in the browser — needed three things from the model:

  1. Categorize transaction text (“STARBUCKS #1234” → restaurants).
  2. Read paper receipts (image → merchant, amount, date).
  3. Answer free-form questions about a year of statements in one prompt.

So: multimodal, long context, must run client-side (in the user’s browser, not on a server I rent). That’s how I narrowed to the E-series Gemma 4 variants in the first place. The 31B Dense and 26B MoE were never candidates — they’re just too big for a browser tab. That left E2B (~1.5 GB on disk once quantized) and E4B (~2.5 GB).

I picked E4B without thinking. That was mistake #1.

Pick #1: E4B, because “bigger is better”

E4B is the larger of the two browser-tier Gemma 4 models. It scored higher on every benchmark in Google’s release. I figured the extra GB of weights would buy me cleaner categorization and smarter answers, and I’d ship a more impressive demo.

It worked. Categorization was crisp. The chat panel handled “which restaurant did I visit the most?” without breaking a sweat. I wrote the entire project around the assumption that E4B was the right call and shipped a first cut.

Then a user opened the deployed link.

Cold-load was a 2.5 GB download. On a normal connection that’s somewhere between three and ten minutes of staring at a progress bar before the app does anything. My first beta tester typed “is there other solution its time consuming” before the model had finished downloading.

I’d optimized for what the model could do and ignored what the user would experience before it did anything. That’s mistake #1.

Pick #2: E2B, because respecting people’s bandwidth is part of the product

E2B is the smaller browser variant. Same multimodal capability. Same 128K context window (meaning it can read about a 300-page book in one prompt — important if you want to ask questions across a whole year of bank statements). Same compression. About 40% less to download. Slightly thinner reasoning on multi-step questions.

The swap was a one-line code change:

// before
export const MODEL_ID = "onnx-community/gemma-4-E4B-it-ONNX";

// after
export const MODEL_ID = "onnx-community/gemma-4-E2B-it-ONNX";

The interesting thing wasn’t the code — it was the trade-off math.

The “thinner reasoning” I was worried about cost me maybe 5–10% of categorization accuracy on long-tail merchants. That’s a tiny gap. The “40% less to download” turned a five-minute wait into a two-minute wait, which is the difference between a user trying your app and a user closing the tab.

The general lesson, written down where I won’t forget it:

The smaller capable model usually wins. Cold-load time is the most expensive thing your app does. Trim it ruthlessly.

This held even when the larger model would have produced marginally better outputs. The output gap was invisible to the user. The download gap was the only thing they could see.

That should have been the end of it. It wasn’t.

Pick #3: 31B in the cloud, because some users won’t wait at all

The same user came back: “no user wait for loading 1.5 gb 2.5 gb will add selection and add openrouter selection also.”

They were right. Even E2B’s ~1.5 GB is a wall for someone on a phone, on a flaky connection, or just trying a demo for thirty seconds to decide if it’s worth more attention. The honest answer was that the right model depends on who’s using the app right now.

So I added a third option: Gemma 4 31B Dense via OpenRouter’s free tier. OpenRouter is a service that lets you call lots of different AI models through one API. They expose Gemma 4 31B on a free tier — no credit card, no download. Zero download. Highest quality of the three. The trade-off is brutal and has to be explicit: your prompts and receipt photos are sent to a third-party server for inference. Privacy goes from “on-device, never uploaded” to “trust OpenRouter’s logs policy.”

Two practical things bit me adding the cloud path:

The free tier is 16 requests per minute. My categorization loop fired one API request per transaction. For a 71-row sample statement, that hit the rate limit in three seconds. Fix: batch up to 25 transactions per prompt — instead of asking the model “what category is this?” 71 times, ask it “here are 25 transactions, classify each” three times. With Gemma 4’s 128K context, this is free — the model handles a whole statement in one shot, and your three batched requests stay comfortably under any free-tier limit.

// One prompt, 25 transactions, one response. Free-tier safe.
const prompt = `Classify each transaction with one category from this list.
Output ONE LINE per transaction as "<n>. <category>".

${chunk.map((t, i) => `${i + 1}. ${t.rawDescription} (${t.amount})`).join("n")}`;

The model ID format is strict. OpenRouter wants google/gemma-4-31b-it:free (the :free suffix matters). Hit the /v1/models endpoint with your key once to confirm the exact ID before you spend an hour debugging 400 errors.

The decision tree I wish I’d had

Here it is, no theory, just the thing I’d tape to my wall:

Question If yes → If no →
Will users get more than 30 seconds before they leave? Local model OK Cloud-only (OpenRouter 31B or similar)
Is the data on the user’s machine sensitive (finance, health, journals, work)? Local model required Cloud is fine
Is the task multi-step reasoning (agentic, planning) or simple classification? Lean E4B / 31B E2B is enough
Will users return many times, making the one-time download amortize? Local OK at any size Smallest model that does the job
Are you charging users / can you eat the API cost? Cloud OK Local or free-tier cloud only

You can stop here. Most projects only need the first two rows.

The real answer: don’t pick. Let the user pick.

What I actually shipped in the end was a model picker. Three cards. Each one shows: name, download size, where inference happens (on-device vs cloud), and one sentence on the trade-off.

The picker doesn’t avoid the decision; it moves it to the person who has the right information to make it. The product manager in me cringed at exposing a “model selection” UI to consumer users. The engineer in me realized that the alternative — picking one model for everyone — meant always being wrong for somebody.

“Intentional model selection” is one of the Gemma 4 Challenge’s judging criteria. I’d bet that on most submissions, that intention lives in the writeup, not in the product. In mine, it lives in the user’s first click.

If you’re starting a Gemma 4 build right now, I’d save yourself the 72 hours and start there.

The app is PocketCFO — open source, MIT. Drop a CSV bank statement and pick a model. Built for the Gemma 4 Challenge. Live demo · code.

Tags: #gemmachallenge #ai #webgpu #javascript

Inside #100DaysofSolana: A Guided Path into Web3

TL;DR – 100 Days of Solana is a four-epoch program from MLH and Solana that walks hackers from curiosity about Web3 to building applications on a real blockchain. As of this week:

  • Where it is now: 29 days in, starting Epoch 2.
  • What Epoch 1 covered: Reading data from Solana, finding your way around the ecosystem, the fundamentals.
  • What’s coming: Epoch 2 moves into writing data on-chain (token economics, digital assets, NFTs). Epoch 3 covers writing programs. Epoch 4 is shipping and exploring.
  • How it works: A flexible weekly rhythm – Try, Build, Stretch, Document, Amplify – designed so participants don’t need to hit every day to benefit.

Sign up or follow along at mlh.link/solana-100

Just over a month ago, we kicked off #100DaysofSolana, a program designed to walk hackers from “I’ve heard of blockchain” to “I built something on it.” As an introduction to Solana, we spent Epoch 1 working through the basics and giving all of our participants the chance to get comfortable with concepts that, for most developers, have always lived behind a wall of jargon.

As we get ready for Epoch 2, we invite you to learn about the opportunity and consider joining us: The beauty of #100DaysofSolana is that you can do just that. Start today. Walk away in another 70 days with a new set of skills, a new understanding of web3, and an understanding of how to build on Solana’s blockchain.

What is Solana?

Solana is a blockchain platform – part of the broader web3 ecosystem that also includes Bitcoin and Ethereum. (If you’re not familiar, a quick explanation on web3 can be found here, and you can explore more in DEV’s web3 tag. And here’s a blockchain explanation too.)

What makes Solana different is speed and cost. Blockchain platforms have struggled with both; at one point, Bitcoin’s annual electricity consumption was higher than the country of Switzerland. Solana was built to make everyday transactions practical rather than purely theoretical – which is what makes it a useful place to actually build.

The platform also supports small programs that run on-chain when a transaction calls for them. They are the building blocks for some of the most interesting work happening on the chain.

Why #100DaysofSolana Right Now?

Web3 is still in its youth as a concept and a practice. And we often get the question from next gen developers who are still learning, “How can I learn more?” The honest answer is that the path to learning in this one case is a bit more challenging than most: A lot of the available material – including Solana’s own documentation – is written for people who already understand it, and the existing community has a vernacular all its own, where familiar words can mean unfamiliar things. A developer who is curious about web3 can spend a long time bouncing off resources that assume they already “get it” to a certain extent.

We wanted to close that gap and #100DaysofSolana was developed to help do just that.

The program assumes a participant already knows the world of web and mobile development, and can bridge from there into Solana. For instance, we started off our program by aligning the idea of Solana with the idea of a global database. And then we worked through accessing and reading data from it as you would learn how to find and read data in a database you are familiar with navigating.

Solana is exactly the right partner for this kind of program.

  • Compared with earlier blockchains, it is faster and more affordable to use, which makes it practical for real applications rather than purely theoretical ones.
  • It hosts a meaningful share of stablecoins – digital currencies pegged to traditional ones – and the things people are building on it span payments, digital assets, loyalty and incentive systems, and ownership models with no obvious Web2 parallel.
  • The platform is still early enough that developers working with it now have a real chance of being part of figuring out what works.

And 100 days, rather than a weekend or a month, is deliberate. Learning Solana isn’t just learning a new library…it is a different mental model so you need more than a few days to really wrap your mind around it and let it sink in. Smart contracts, on-chain data, token economics, and digital assets don’t map cleanly onto anything most developers have built before, so that shift takes time. The career math lines up too: as AI reshapes entry-level software work, picking up a specialization is one of the most useful things an early-career developer can do, and a hundred days of hands-on Solana experience is something concrete to point to.

What #100DaysofSolana Looks Like for Participants

We built #100DaysofSolana with our participants in mind, and the belief that a little bit every day goes a long way to learning new skills. Every week follows a pattern that’s designed to be flexible (with even more flexibility on the weekend because we know you need rest).

  • Monday – Try: A new topic gets introduced.
  • Tuesday – Build: Participants put hands on the keyboard and put the idea into practice.
  • Thursday – Stretch: A deeper challenge that pushes the week’s concept further.
  • Saturday – Document: Participants write about what they’ve learned on DEV.
  • Sunday – Amplify: Engage with other participants on DEV or social platforms and see what everyone else is learning and trying out.

The structure is built so no participant has to complete all 100 days perfectly to benefit. A developer who does just Try and Build in a given week still walks away with enough to understand the topic and move on. The Saturday and Sunday rhythm – write it down, share it – borrows from the way working developers actually build expertise: in public, with feedback.

We just finished Epoch 1 where we focused on the fundamentals: where Solana data lives, how to read it, and how to get oriented in the ecosystem. The goal was less about writing code and more about building familiarity – making the platform feel less like a black box and more like something a developer can actually navigate.

We’re just getting started with Epoch 2.

What’s Next for #100DaysofSolana in Epoch 2

Next we are going to move from reading to writing. Participants start manipulating data on Solana, beginning with concepts like token economics, incentives, and digital assets. The first challenge asks a deliberately concrete question: What would it look like to build a tokenized reward system on Solana, like a supermarket loyalty card? Or a Reddit-style karma system?

Those questions are also the door into the concept of NFTs, which, despite their reputation, aren’t limited to expensive jpegs of memes and monkeys. An NFT is a unique token recorded on a blockchain, usually with metadata that points to or describes a specific digital or real-world item, and the range of practical uses is much wider than the headlines suggest. This is the point in the program where the learning starts to feel applied. Participants are no longer just reading from the chain. They’re putting things on it.

Where #100DaysofSolana Goes Next

Epoch 3 moves into writing programs on Solana directly. This is where the foundational concepts from the first two epochs become tools, and participants start building software that runs on-chain.

Epoch 4 is shipping and exploring. The structure loosens, the projects get more independent, and participants get the chance to combine everything they’ve learned into something of their own design.

By the end of the 100 days, the goal is to have moved a hacker from curiosity about Web3 to confidence in actually building on it.

There is no shortage of opinions about Web3. But there is a need for patient, sequenced learning material that gets a working developer from the outside of the conversation to the inside without asking them to take anything on faith. #100DaysofSolana is built to be that material: a guided path, paced for someone learning from scratch, designed around the assumption that the best way to understand any new technology is to spend enough time with it to form an actual opinion.

Hackers can follow along, join in late, or come back at any epoch. The program is built to accommodate all of those. More information, and signup, is available at https://mlh.link/solana-100. You can also explore our DEV content for the program here: https://dev.to/100daysofsolana

FAQ

Do I need to know anything about Solana or Web3 to join 100 Days of Solana?

No. The program is built for developers who already know web or mobile development but have never worked on a blockchain. Epoch 1 covers the fundamentals from scratch – what Solana is, where its data lives, and how to read from it.

Can I join now that the program is already underway?

Yes. The weekly structure is designed to accommodate people joining late, taking breaks, or moving at their own pace. A developer who picks it up partway through can still go back and work through earlier epoch material on their own time.

How much time does 100 Days of Solana take per week?

The week has five themed days (Try, Build, Stretch, Document, Amplify), but no participant is expected to do all five every week. Completing just Try and Build is enough to walk away with the week’s concept and move on to the next one.

What do I need to participate?

A computer, a code editor, and a Solana wallet for the on-chain challenges. The program guides participants through wallet setup as part of Epoch 1.

Is 100 Days of Solana free?

Yes.

Do I need to buy SOL to participate?

No, you don’t need to buy SOL. Just like Web2 development, Solana gives you the equivalent of a dev environment where you can practice. It’s called devnet and you can request free devnet SOL from a system called the faucet.

Why Solana, and not Ethereum or Bitcoin?

Solana was built to be faster and cheaper to operate than earlier blockchains, which makes it practical for everyday transactions rather than purely theoretical ones. The program is specifically Solana-focused, but most of the underlying concepts – smart contracts, on-chain data, token economics – apply broadly across Web3.

What happens after the 100 days?

Epoch 4 is shipping and exploring – the structure loosens and participants are given room to combine what they’ve learned into independent projects. The work and writing produced during the program become portfolio pieces showing real, hands-on Solana experience.

I Built and Shipped TinyHab: an ADHD-Friendly Habit Tracker for iOS

I recently shipped TinyHab, an ADHD-friendly habit tracker for iPhone.

The idea was simple: most habit apps look clean on day one, but they become stressful the moment you miss a day. I wanted to build something calmer. Something focused on today, small wins, reminders that actually work, and a recovery path when routines fall apart.

So I built the full product myself: the iOS app, backend, landing page, admin panel, push notifications, subscriptions, App Store setup, and the release process.

App Store link: https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917

The Stack

TinyHab is built with:

  • Flutter for the iOS app
  • Django for the backend API and admin panel
  • PostgreSQL for the database
  • Firebase Auth / Cloud Messaging for auth support and push notifications
  • Apple Sign In and Google Sign In
  • RevenueCat for App Store subscriptions
  • Dokploy + Docker for deployment
  • Django Admin for managing users, campaigns, tokens, and notification logs

I like this stack because it lets me move fast without giving up structure. Flutter gave me a clean app surface, Django gave me a reliable backend and admin panel, and Firebase/RevenueCat handled the parts that are painful to rebuild from scratch.

What I Wanted the App to Feel Like

TinyHab is not trying to be a loud productivity app.

I wanted the app to feel quiet and practical. The core flow is:

  1. Open the app
  2. See what matters today
  3. Mark a habit done
  4. Move on

No guilt-heavy streak system. No overwhelming dashboard. No complicated setup before the user gets value.

The app includes habit scheduling, daily progress, reminders, insights, profile settings, App Store subscriptions, home screen widgets, and a small admin system behind the scenes.

The Hardest Part Was Not the UI

The hardest parts were the production details.

Apple Sign In had to work from both login and registration. Push notification tokens had to be saved correctly after permission was granted. Firebase Cloud Messaging had to be connected to APNs correctly. App Store subscriptions had to sync with the backend. The backend needed enough logging so I could see what actually happened when something failed.

One example: push notifications were not just “install Firebase and done.” I had to handle APNs token timing on iOS, register the FCM token with the backend, store device tokens per user, connect Firebase to the correct APNs key, and test direct backend sends from production.

When it finally worked, I could send a notification from the admin panel and see it arrive instantly on the device. That was a good moment.

App Store Review Was a Real Test

The first submission did not go through.

Apple rejected the app because the Continue with Apple button was unresponsive in one flow. The login screen was fine, but the registration screen had a button that looked ready and was not wired to the Apple auth flow yet.

That was a useful reminder: App Review will test the product like a real user, and any visible control needs to work.

I fixed the Apple Sign In flow, checked the release build again, fixed a few production issues around push token registration and profile plan display, rebuilt the IPA, uploaded a new build, and resubmitted.

The next review passed.

What the Backend Handles

The Django backend is not just a simple auth API.

It handles:

  • User accounts and auth sessions
  • Habit CRUD
  • Habit completions
  • Reminder settings
  • Device notification tokens
  • Push notification campaigns
  • Push notification logs
  • Daily summaries
  • Subscription state
  • Legal documents
  • Landing page content
  • Admin workflows

I also added admin tooling so I can inspect device tokens, see failed push messages, send campaigns, and debug real user issues without guessing.

That saved a lot of time during launch.

What I Learned

Shipping a real mobile app is mostly about the small details that do not show up in screenshots.

The UI matters, but production readiness matters more:

  • Does Apple Sign In work in every auth flow?
  • Does the app still work after a fresh install?
  • Are push tokens saved after permission changes?
  • Can the backend send to the latest device token?
  • Can I see why a push failed?
  • Does the App Store build match the version I think I uploaded?
  • Does the landing page point to the live App Store URL?

None of these are exciting individually, but together they decide whether the app feels real.

Why I Built TinyHab

I built TinyHab because I wanted a habit tracker that is easier to come back to after a bad day.

Most habit apps are optimized for perfect consistency. TinyHab is designed for imperfect consistency: missed days, low energy, friction, and restarting without shame.

That product direction shaped both the design and the engineering. The app needed to be simple on the surface, but reliable underneath.

Final Thoughts

This was a full-stack mobile build from zero to App Store approval.

I worked across Flutter, Django, Firebase, APNs, RevenueCat, Docker deployment, admin tooling, and App Store Connect. The result is now live on the App Store, and I am continuing to improve it based on real usage.

If you are building a mobile app, my biggest advice is simple: test the boring production flows early. Login, registration, push notifications, subscriptions, release builds, and admin visibility are where most launch problems hide.

TinyHab is live here:

https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917

I’m an ECE Student Who Vibe Codes Hardware Projects — Here’s What Google I/O 2026 Actually Changed for Me

Submitted as part of the Google I/O 2026 Writing Challenge

Most Google I/O recaps look the same: benchmark tables, pricing comparisons, model spec sheets.

This one won’t.

I’m an Electronics & Communication Engineering student and the person behind BlinkNBuild, a YouTube channel where I build ESP32, Arduino, and Raspberry Pi projects. I also vibe code a lot: browser-based OLED pixel editors, circuit diagram tools, IoT dashboards — all shipped from a single HTML file to Netlify on zero budget.

When I watched the Google I/O 2026 developer keynote, I wasn’t evaluating these announcements as an ML researcher or a senior web developer. I was asking one question: does any of this actually change what I can build on a Tuesday night with no sleep and a free API tier?

For the first time in a while — yes. Genuinely.

The Shift That Actually Matters

Something Sundar Pichai said in the keynote stuck with me:

“We’ve transitioned from AI that simply assists you, to agents that can independently navigate complex tasks across your entire workflow.”

If you’ve spent time babysitting an LLM through a multi-step project — manually copy-pasting between steps, correcting it after every tool call, re-explaining context it forgot — you know exactly why this matters. The gap between “AI that helps” and “AI that owns a task” is enormous in practice. Google just made a serious move toward closing it.

Here’s what actually shipped, and why I think it matters for builders like us.

Gemini 3.5 Flash: The First Flash That Beats a Pro Model

This is the headline announcement, and it deserves more than a spec table.

The Flash series has always been the “fast and cheap” tier — you trade capability for speed and cost. Gemini 3.5 Flash breaks that tradeoff entirely. It outperforms Gemini 3.1 Pro on coding and agentic benchmarks:

  • 76.2% on Terminal-Bench 2.1 (coding) vs 70.3% for 3.1 Pro
  • 1656 Elo on GDPval-AA (real-world agentic tasks)
  • 83.6% on MCP Atlas (tool-use reliability)
  • 84.2% on CharXiv Reasoning (multimodal understanding)

Meanwhile it runs at 4× the speed of comparable frontier models with a price of $1.50/$9 per 1M tokens — less than half what GPT-5.5 costs for the same output.

For a student building hobby projects on a free or low-cost API plan, that last sentence is everything.

The context window is 1M tokens (1,048,576 to be exact), with dynamic thinking on by default — meaning the model auto-allocates extra compute when the problem is hard and skips it when it’s simple. You don’t tune this. It just works.

One honest caveat: there’s a regression on 128k long-context retrieval (MRCR v2 dropped 7.6 points versus the preview). If you’re doing RAG over massive multi-hundred-page documents, that’s worth knowing. For the typical IoT/maker project — sensor code, dashboard logic, firmware debugging — it’s not relevant. 3.5 Flash is still the best thing in the Flash tier by a wide margin.

I tested it immediately via AI Studio after the keynote. I gave it a prompt to generate Arduino sensor code with a web dashboard interface. The output was noticeably more structured and the code ran first-try in a way that older Flash models didn’t always manage.

For makers and side-project builders: if you’re still on 3.1 Pro for budget reasons, you can now get better results at lower cost. That’s a direct upgrade.

Google AI Studio: More Than a Key Generator

I’ll be honest — I’ve always thought of AI Studio as “the place you go to get an API key.” I didn’t think of it as a serious development environment.

I/O 2026 changed that framing entirely.

Native Android vibe coding is now in AI Studio. You can describe what you want, and it generates a Kotlin Android app — not a web wrapper, an actual native Android project. Combined with one-click deploy to Cloud Run and Firebase integration, you can go from idea to deployed app without ever leaving the browser.

There’s also an Export to Antigravity button — one click and your entire project state, including all context, moves to local Antigravity development. No re-explaining, no re-scaffolding.

And a new AI Studio mobile app is available for pre-registration this week, so you can capture ideas on the go and have a prototype waiting when you get back to your desk.

For someone who builds projects that need a companion app (sensor dashboards, remote control interfaces, IoT monitors), the setup overhead for native apps just collapsed.

Managed Agents: The Feature I’m Most Excited to Build With

This is the one that’s going to change my actual projects.

Google introduced Managed Agents in the Gemini API — a single API call that spins up a fully provisioned agent running inside an isolated Linux container. Files and state persist across follow-up calls. The agent can reason, use tools, execute code, and iterate without you manually orchestrating every step.

Why does this matter for makers?

Because most IoT projects need more than one-shot generation. You want to describe a problem — “I have a noisy ADC reading from my soil moisture sensor, help me clean it and write the data to a CSV” — and have something that can work through it. Run the code, see it failed, debug it, retry. Not just hand you a code block and wish you luck.

Managed Agents are designed for exactly that loop. One API call. Persistent state. Real execution environment. I’m planning to build a small agent that reads ESP32 serial output and iterates on firmware fixes autonomously. That workflow was genuinely not practical before this.

Antigravity 2.0: The Bigger Picture

Underneath all of this is Antigravity 2.0 — Google’s agent-first development platform, now a full three-component rebuild: a standalone desktop app, a new CLI (written in Go, replacing the old Gemini CLI), and an SDK for custom agents.

A few things worth noting if you’re evaluating it:

The desktop app orchestrates multiple agents in parallel, schedules background tasks, and has native voice command support. You describe a problem; specialized subagents divide the work.

The Antigravity CLI replaces the Gemini CLI entirely — Google is asking existing users to migrate. For makers, this is good news: you can now script around it, pipe results into your own tooling, and integrate it into terminal-based workflows naturally.

The Managed Agents in the Gemini API give you the Antigravity agent harness without the full local setup. One API call provisions a sandboxed Linux environment. This is the lowest-friction entry point for builders who don’t want to install a full desktop tool.

I Built Something With It — Here’s the Receipt

This isn’t just theory. I used Antigravity 2.0 to build and ship a real project: a free, browser-based PDF to Image converter that runs 100% offline, no server, no uploads, no account required.

The entire thing — from idea to live app on Netlify — took under an hour.

That’s not a marketing claim. That’s what it felt like to go from “I have a problem” to “this is deployed and usable by anyone.” The old workflow would’ve taken me an evening at minimum: scaffolding the PDF.js rendering pipeline, debugging canvas GPU memory exhaustion on large documents, wiring the File System Access API fallback for Firefox. Antigravity handled the architecture and iteration. I steered.

🔗 Live App → pdf-2-image.netlify.app
📦 GitHub → pdf-2-image source code

The use case matters too: most AI tools (including Gemini and ChatGPT) parse PDFs as raw text streams, which silently mangles math equations, circuit diagrams, and scanned notes. Converting each page to a high-res image first — before uploading to an AI tool — fixes that entirely. It’s a problem every ECE student hits.

If you want the full technical writeup (PDF.js rendering loop, canvas memory management, File System Access API), I’ve covered it in detail here.

What I’m Building Next

Based on what shipped at I/O 2026, here’s what I’m immediately trying:

  1. ESP32 firmware debug agent — using Managed Agents to read serial output, identify errors, and iterate on fixes autonomously, without me manually copy-pasting error messages back and forth
  2. Android companion app — using AI Studio’s Kotlin vibe coding to generate a native sensor dashboard, deployed with one click to Cloud Run
  3. Antigravity CLI pipeline — a terminal-scripted subagent workflow that takes a GitHub README, extracts a bill of materials, and auto-generates an Instructables-style writeup

None of these were practical to build before this week.

The Honest Take

Google I/O 2026 wasn’t one moonshot announcement. It was a lot of things getting meaningfully better at the same time — the model, the tooling, the agent infrastructure, the developer experience — in a way that adds up to a real shift in what a solo builder can accomplish.

The old Flash tradeoff (speed vs. capability) is gone. The old AI Studio limitation (great for prompts, not for building) is gone. The old agent friction (manually orchestrate everything yourself) is shrinking fast.

For ECE students, makers, and side-project builders on a tight budget: this is the best the Gemini stack has ever been, and it’s available right now on the free tier.

Go build something.

Useful Links

What’s the first thing you’d build with Managed Agents + Gemini 3.5 Flash? Drop it in the comments — I’m especially curious what the embedded and IoT folks here are thinking.

From Fragmented Pipelines to Coherent Intelligence — Why Gemma 4 Actually Changes How I Work

Two months ago, I was stuck in the same fragmented workflow most developers still accept: paying $50/month for OCR APIs, aggressively chunking logs for RAG, and stitching together multiple AI services just to get basic work done. Gemma 4 didn’t just replace parts of that stack — it made the entire fragmented approach feel obsolete.

This is my submission for the “Write about Gemma 4” track.

Two months ago, I was doing what most developers still do: maintaining complex RAG pipelines, managing brittle document transformations, and chopping files into tiny pieces because local models couldn’t handle real-world scale.

Today, I default to Gemma 4 running locally for most of my diagnostic and automation workflows. Not because it beats every closed cloud model on massive hyper-specific leaderboards, but because it finally makes coherent, private, and simple intelligence practical on consumer hardware.

The Two Problems That Defined My Old Workflow

I was fighting my development tools instead of solving actual code problems across two parallel engineering tasks:

  1. Document Intelligence: I was feeding messy contractor invoice photographs into a paid, cloud-based OCR + LLM pipeline. The results were inconsistent, multi-column tables frequently broke, network round-trips introduced lag, and sensitive accounting data had to leave my local machine.
  2. Temporal Reasoning: A critical background job was crashing every Tuesday at exactly 3:14 AM with a generic context deadline exceeded error. Twelve months of production logs (~115K tokens) were being sliced into arbitrary 30-day chunks to fit into standard local model context windows. The root cause remained entirely invisible because no single context window could see the continuous timeline.

Gemma 4 cleanly eliminated both bottlenecks.

Case Study 1: Killing the Paid OCR Pipeline

Gemma 4’s native visual footprint (especially the 26B MoE and 31B Dense variants) processes image matrices down at the weight layer. It doesn’t need a separate visual parser or an intermediate text conversion engine; it reasons over spatial pixel layouts directly.

By leveraging the official Python SDK, I hooked a unified local processing pipeline straight into my environment:

import ollama

def extract_invoice_fields(image_path):
    # Ensure "gemma4:26b" matches your local alias from "ollama list"
    response = ollama.chat(
        model="gemma4:26b",
        messages=[{
            'role': 'user',
            'content': """You are a strict data extraction engine. Analyze this document image and return ONLY a valid JSON object matching this exact schema:
{
 "date": "YYYY-MM-DD",
 "amount": number_no_symbols,
 "description": "concise_summary"
}
If a field is completely unidentifiable, set its value to null. Do not include markdown wraps, conversational intros, or post-explanations."""
        }],
        images=[image_path],
        options={'temperature': 0.1}
    )
    return response['message']['content']

By adding a basic two-line adaptive contrast enhancement pass via opencv-python to clean up shadows and tilted angles before running inference, my extraction accuracy reached 94% on complex real-world receipts—matching the performance of my previous paid cloud API at zero marginal cost.

💻 Hardware Baseline: All tests were executed locally on an M1 MacBook Pro (16GB unified memory). The 26B MoE model variant maps comfortably inside ~12GB of active memory, completing localized visual inference in 2.3 seconds per page.

Case Study 2: The Return of Temporal Coherence

To solve the recurring system crash, I completely stopped chunking the log files. I passed the entire continuous 115K-token historical stream into Gemma 4’s native 128K context window using a strict forensic analyst system prompt.

Within roughly 70 seconds of local execution, the engine traced an explicit causal chain across distant chronological boundaries:

  • January 12 (Line 1,450): A quiet database configuration tweak reduced the active connection pool size from 50 to 20.
  • March 28 (Line 58,200): A separate DevOps commit flipped the network retry backoff strategy from exponential to linear.
  • June 3 (Line 112,400): A seasonal traffic spike hit the server. The restricted connection pool choked, and the linear retries instantly amplified the backlog into a recursive queue crash.

Neither event was an error on its own. They were two pieces of a shattered plate separated by months of high-volume logging noise.

FRAGMENTED APPROACH (Chunking / RAG)
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  JANUARY CHUNK  │     │   MARCH CHUNK   │     │   JUNE CHUNK    │
│ [Pool: 50→20]   │     │ [Linear Backoff]│     │ [System Crash!] │
└────────┬────────┘     └────────┬────────┘     └────────┬────────┘
         │                       │                       │
         └──── Severed Link ─────┴──── Severed Link ─────┘
              (Zero structural correlation across windows)

TEMPORAL COHERENCE APPROACH (Gemma 4 · 128K context)
┌──────────────────────────────────────────────────────────────────┐
│  JAN: Pool 50→20  ──►  MAR: Linear Backoff  ──►  JUN: Crash     │
└──────────────────────────────────────────────────────────────────┘
   └──── Native attention weights trace the full causal chain ────┘

Vector-based RAG pipelines fail here because a January pool adjustment and a June timeout share absolutely no semantic similarity or keyword vectors. You need temporal coherence—the ability of a model’s internal attention mechanisms to hold the unbroken timeline live in working memory to calculate long-range dependencies.

To prove the power of temporal coherence over traditional chunking patterns on analytical data, consider this sample snippet of a raw financial transaction ledger covering the same fiscal period:

Timestamp,TransactionID,Vendor,Amount,Category,AuthCode
2026-01-15,TX-9012,Office_Supply_Corp,9850.00,Operations,AUTH-882
2026-02-11,TX-9412,Consulting_Group_LLC,14500.00,Legal,AUTH-109
2026-05-18,TX-1044,Office_Supply_Global,9850.00,Operations,AUTH-882
2026-09-04,TX-1299,Freelance_Network,4200.00,Marketing,AUTH-455
2026-11-12,TX-1522,Office_Sup_Direct,9850.00,Operations,AUTH-901

Reviewed monthly or quarterly, these entries are clean, well-spaced, and unremarkable. However, when passed whole into the 128K context window, the model cross-references across all 12 months simultaneously and flags a red-alert pattern of structured threshold evasion that month-by-month chunking misses entirely:

{
  "audit_status": "CRITICAL_FLAG",
  "anomaly_detected": "Layered Threshold Evasion (Structuring)",
  "confidence_score": 0.96,
  "forensic_trail": {
    "nodes": [
      {"timestamp": "2026-01-15", "id": "TX-9012", "amount": 9850.00, "vendor": "Office_Supply_Corp"},
      {"timestamp": "2026-05-18", "id": "TX-1044", "amount": 9850.00, "vendor": "Office_Supply_Global"},
      {"timestamp": "2026-11-12", "id": "TX-1522", "amount": 9850.00, "vendor": "Office_Sup_Direct"}
    ],
    "analysis": "Identical transaction values of $9,850.00 executed at 10-month intervals. Target amounts sit precisely beneath the $10,000 corporate manager sign-off threshold. Vendor name variations suggest an intentional attempt to evade standard monthly pattern matchers."
  }
}

Why This Feels Different: Workflow Simplification

The true value of open-weight models of this caliber isn’t minor benchmark gains; it is the radical simplification of software architecture.

Old Fragile Stack New Gemma 4 Way Real Engineering Impact
Cloud OCR API ➔ Text Cleaner ➔ Cloud LLM Single localized multimodal inference call Eliminates third-party API dependencies and reduces formatting hallucinations.
Chunking Scripts ➔ Vector DB Embedding ➔ RAG Retrieval ➔ Target Window Context Single unbroken 128K context pass over raw historical source arrays Preserves chronological continuity and captures deep systemic drift.
Multiple proprietary paid subscription keys One unified open-weight model family deployed completely on-device Guarantees absolute data privacy and introduces predictable, flat infrastructure costs.
Complex multi-agent coordination frameworks Deep, single-pass reasoning loops via native weights Drastically reduces code scaffolding complexity and shortens prototyping cycles.

Practical Context Budget Guide

Running long-context inference locally requires intentional resource balancing. Here is the framework I use to match my task parameters to the correct model distribution:

Target Engineering Task Required Context Budget Optimal Model Variant Practical System Rationale
Deep forensic logs, transaction tracking, annual ledger audits 64K–128K Gemma 4 26B MoE Retains long-range causal links across multi-month chronologies.
Multi-file code repository dependency mapping & architecture audits 32K–64K Gemma 4 26B MoE Maps cross-module structural relationships without dropping core definitions.
Automated unit test generation & localized workspace refactoring 8K–16K Gemma 4 4B High-throughput execution speeds with minimal VRAM and memory footprints.
Real-time inline code documentation & terminal autocomplete loops 2K–4K Gemma 4 2B Near-instant token generation running seamlessly on lightweight edge devices.

💡 An Honest Operational Note: Don’t default to the 128K window for basic programming tasks. Processing over 100K tokens on consumer hardware takes 50 to 90 seconds. Treat it as a high-leverage analytical tool for deep diagnostic workloads, not an autocomplete engine.

Honest Technical Limitations

Open-weight architectures are powerful, but engineers should avoid treating them like magic:

  • Severely Degraded Inputs: If an invoice photograph is completely blurry or features highly complex cursive handwriting, specialized commercial cloud HTR pipelines still retain an accuracy edge.
  • Real-Time Thresholds: Processing massive document arrays introduces inescapable local hardware compute cycles. If your app requires sub-second streaming feedback, scale down to the ultra-fast 4B parameter models or leverage targeted API setups.
  • Knowledge Cutoffs: Long-context windows do not replace live knowledge. If you are tracking system updates or breaking news that occurred after the model’s training threshold, you still need a local web search or RAG pipeline to ground the output.

Try This in Your Workspace Today

The next time you face an intractable bug or a messy data extraction problem, try this layout experiment:

  1. Fire up your terminal and pull down the weights: ollama pull gemma4:26b
  2. Take your longest, unchunked log file or your messiest visual document data stream.
  3. Pass the entire timeline whole into the context window.
  4. Ask it a question that requires tracing an explicit chronological link between two events separated by weeks of lines.

You will likely experience the exact same paradigm shift that I did—moving away from the constant friction of fighting and managing your data processing tools, and returning to simply thinking about the engineering problem.

Final Thoughts

Gemma 4’s most significant contribution to the open-source community isn’t its raw leaderboard metrics. It is the fact that it makes coherent, private, and local intelligence completely practical for everyday developer workflows.

By delivering clean multi-modal vision and an expansive context footprint under a true commercial Apache 2.0 license, it allows independent developers to tear down complex infrastructure scaffolding. It transforms local-first design from an interesting, idealistic experiment into the most rational engineering default.

🔗 Core Developer Resources

🤖 AI Transparency Disclosure

In full compliance with the official challenge evaluation criteria:

  • Writing and Layout Assistance: I utilized AI workflows to restructure raw text blocks into scannable markdown comparison tables, verify code parameter keys inside script wrappers, and balance the thematic flow of the text segments. All system metrics, operational logs, pipeline designs, and technical viewpoints are entirely my own.
  • Hardware Validation: The software integration scripts, local open-weight runtime benchmarking passes, and document filter evaluations were verified and executed on my local development hardware.

Our AI Inference Bill Dropped 65% After We Stopped Treating Every Query the Same

  • Every query hitting our AI layer was going straight to the most powerful model we had. A user asking “what does HIPAA Section 164.312 say?” got the same compute budget as one asking “should we shut down the payment processor during this active incident?” That was expensive and stupid, and it took embarrassingly long to fix.

This is the story of how we built a routing layer called CascadeFlow into SentinelOps AI, an enterprise decision intelligence platform, and what actually happened when we turned it on.

The Problem With “One Model Fits All”

When you’re building an AI system for enterprise operations teams—people making real decisions about infrastructure, compliance posture, and incident response—you face a genuine tension. You need the model to be good when it matters. But “good” on a documentation lookup is a different thing from “good” on “we have a potential SOC2 violation, walk me through the remediation path.”

Before routing, every query went to our primary reasoning model (Llama 3.3 70B via Groq). The latency was fine. The quality was fine. The cost was not fine. At scale, routing simple factual queries through a 70B parameter model is just burning money.

The naive fix is to have engineers triage queries manually, which doesn’t scale. The correct fix is a classifier that does it automatically.

CascadeFlow: A Lightweight Routing Engine

We integrated @cascadeflow/core as our routing middleware. The idea is straightforward: before a query hits the expensive model, a cheap, fast classifier decides which tier it belongs to.

Our routing logic looks roughly like this:

import { CascadeFlow } from '@cascadeflow/core';

const cascade = new CascadeFlow({
  classifier: {
    model: 'llama-3.1-8b-instant', // fast, cheap
    provider: 'groq',
  },
  tiers: [
    {
      name: 'simple',
      model: 'llama-3.1-8b-instant',
      triggers: ['documentation', 'lookup', 'definition', 'what is'],
    },
    {
      name: 'complex',
      model: 'llama-3.3-70b-versatile',
      triggers: ['incident', 'compliance', 'risk', 'critical', 'breach'],
    },
  ],
});

The classifier runs first—it’s an 8B model, so it’s fast and cheap—and classifies the incoming query into a complexity tier. Simple queries (policy lookups, definition requests, status checks) stay on the 8B model. Complex queries (active incidents, compliance risk assessments, multi-system decisions) escalate to the 70B.

From our LLM service layer, the routing call is transparent:

async function routeAndExecute(query, context) {
  const tier = await cascade.classify(query);
  const model = tier === 'complex'
    ? 'llama-3.3-70b-versatile'
    : 'llama-3.1-8b-instant';

  return groq.chat.completions.create({
    model,
    messages: buildMessages(query, context),
    response_format: { type: 'json_object' },
  });
}

That response_format: json_object constraint is important—we’ll come back to it.

What Routing Actually Costs You

There’s a hidden cost to routing that nobody talks about: the classifier itself can be wrong.

In our early testing, the 8B classifier was misrouting about 12% of complex queries down to the cheap tier. A question like “is our current encryption at rest sufficient for PHI storage?” looks superficially like a documentation query. The classifier saw “encryption” and “PHI” as lookup-adjacent terms and routed it to the cheap model, which gave a technically accurate but shallow answer that lacked the risk-weighted framing an auditor would need.

We fixed this in two ways:

  1. Conservative misclassification bias. When the classifier’s confidence is below a threshold, escalate to the expensive tier. False positives (routing simple queries high) cost money. False negatives (routing complex queries low) cost credibility. In an enterprise governance context, credibility is more expensive.

  2. Domain keyword pre-checks. Before the classifier even runs, we scan for a hardcoded list of high-stakes terms. If a query contains words like breach, PHI, incident, remediation, or SOC2, it goes to the 70B model unconditionally.

const HIGH_STAKES_KEYWORDS = [
  'breach', 'incident', 'PHI', 'PII', 'SOC2', 'HIPAA',
  'remediation', 'critical', 'violation', 'audit', 'penalty'
];

function requiresComplexModel(query) {
  const lower = query.toLowerCase();
  return HIGH_STAKES_KEYWORDS.some(kw => lower.includes(kw));
}

This is not elegant, but it’s safe. The performance overhead is a single .includes() check per query.

The Numbers

After deploying CascadeFlow routing against a realistic mix of enterprise queries, roughly 68% of queries fell into the “simple” tier. The remaining 32% were genuinely complex—incident-related, compliance-heavy, or multi-system risk assessments that benefited from the more capable model.

That routing split—combined with the price difference between an 8B and 70B parameter model—accounts for most of the cost reduction. The exact figure depends on your query distribution and your provider’s pricing, but 60-65% is a reasonable estimate for an enterprise operational workload where most interactions are informational rather than analytical.

Forcing Structure Out of Both Models

One consequence of routing to two different models is that you now have two sources of unstructured text to deal with. We solved this by enforcing a strict JSON response schema at the prompt level, regardless of which model is running.

Every response from SentinelOps AI conforms to this shape:

{
  "summary": "One-sentence decision summary",
  "risk_level": "LOW | MEDIUM | HIGH | CRITICAL",
  "confidence": 0.87,
  "recommendation": "Specific, actionable recommendation",
  "tradeoffs": ["Tradeoff A", "Tradeoff B"],
  "governance_flags": [],
  "citations": []
}

The frontend renders this as a Decision Card—not a chat bubble. Risk level gets a color-coded badge. Confidence is displayed as a progress bar. Tradeoffs are rendered as a checklist. Governance flags trigger a separate UI element that routes to the compliance dashboard.

When you force both the cheap and expensive model into the same output schema, the quality difference between tiers becomes measurable. You can compare confidence scores, count governance_flags, and track whether the 8B model’s recommendations match the 70B model’s on borderline queries. This becomes a feedback loop for improving your routing thresholds over time.

Lessons

1. Start with keyword gating, not just ML classification. A simple list of high-stakes terms as a pre-filter saved us from the worst misrouting failures. ML classifiers are probabilistic. Safety-critical routing decisions shouldn’t be.

2. Misrouting in the wrong direction is asymmetric. Routing a simple query to a powerful model costs you money. Routing a complex query to a weak model costs you trust. Size your misclassification bias accordingly.

3. A common output schema across tiers is essential. Without it, you’re comparing apples and oranges and your frontend needs to handle two different response shapes. Force the schema at the prompt level.

4. Routing is a product decision, not just an infrastructure one. The thresholds you set for escalation reflect your platform’s risk tolerance. In a governance context, we erred conservative. A developer tool might err aggressive. Know which direction your users would rather you fail.

You can read more about how CascadeFlow handles multi-tier routing in the cascadeflow docs. The cost savings are real, but the more important outcome is that complex queries now get the compute they actually need instead of competing on the same tier as “what does this acronym stand for.”

Why P95 Latency Is the Only Metric That Matters at 3 AM

If your checkout endpoint serves 10,000 requests per minute, a 5% latency spike means 500 users are having a bad experience every minute.

Averages compress that pain into a single comfortable number.
P95 latency — the latency at the 95th percentile — tells you what your slowest users are actually experiencing.

It’s the metric that catches the spike average hides.
This is why I track P95 as the primary health signal, not averages.

*How Latency Spikes Actually Propagate
*

A latency spike rarely starts in your application.It usually starts somewhere else and cascades inward.

The typical pattern looks like this:

Slow upstream dependency
↓
Connection pool saturation
↓
Request queue growth
↓
Latency spike propagation
↓
Timeouts and failures

The Cascade Pattern
An upstream dependency (database, payment gateway, third-party API) slows down
Your FastAPI app keeps accepting requests while waiting for responses.
Your connection pool fills up – new requests queue behind existing ones.
Queue depth grows, memory pressure builds
Response times climb across all endpoints, not just the affected one. Eventually requests start timing out or failing entirely

By stage 3, you have a problem. By stage 5, your customers know about it before you do.
The cascade failure pattern is particularly nasty.A slow database query holds a connection.

That held connection blocks another request.That blocked request ties up execution capacity.Multiply that by concurrent users and you get full service degradation from a single slow dependency.

Under async workloads, the failure mode becomes especially deceptive because the application continues accepting requests while upstream awaits accumulation in the background.

High Traffic Spikes Make This Worse. Under normal load, a slow upstream dependency is annoying.
Under a traffic spike, it’s catastrophic.

Here’s why:

Connection pool saturation happens faster. If you have 20 database connections and traffic doubles, you hit the ceiling twice as fast.
Queue depth explodes. Requests piling up behind a slow dependency compound each other’s wait time.
Memory pressure builds. Each queued request holds state. Enough of them and you drift toward OOM territory.
Recovery is non-linear. Once a connection pool is saturated, it often stays saturated even after the upstream issue resolves — because the backlog keeps it full.

The cruel irony is that traffic spikes happen when your service matters most.

A flash sale. A viral moment. A major announcement.
Exactly the wrong time to be debugging latency from a dashboard.

What Didn’t Work For Me

Monitoring sounds easy in theory. In practice, most setups failed me in one of four ways.

Prometheus + Grafana. Powerful, but operationally heavy.

Setting up exporters, configuring dashboards, maintaining the stack — all before writing a single alert rule.

And when the alert fires at 3am, one still has to log in and interpret charts under pressure.

Simple Health Checks

GET /health → 200 OK tells you the service is alive.
It doesn’t tell you it’s running at 8x normal latency while technically responding.

Average Latency Monitoring

Averages mask the spikes that actually hurt users.

In one case, a payment provider slowdown pushed P95 latency from roughly 180 ms to over 2 seconds within minutes — while average latency still looked acceptable.

By the time averages reflected the issue, checkout failures had already started.

Alert Fatigue

I added more monitors to catch more things. Which meant more alerts. Most of them were noise. When everything is urgent, nothing is. Monitoring systems usually optimise for data collection.

Operators actually need decision compression.

What I Built Instead

I wanted something that:
Tracked P95, not averages
Produced a single health score instead of 15 metrics to interpret
Caught degradation trends early, before full failure
Required zero config to add to an existing FastAPI app

The result is a FastAPI middleware that continuously computes degradation signals directly from live request traffic.

from fastapi import FastAPI
from fastapi_alertengine import instrument

app = FastAPI()
instrument(app)

The middleware exposes a structured /health/alerts endpoint:

{
“status”: “warning”,
“health_score”: {
“score”: 61,
“trend”: “degrading”
},
“metrics”: {
“overall_p95_ms”: 1847.3,
“error_rate”: 0.08,
“anomaly_score”: 0.9
}
}

One status.One score.One trend direction.No dashboards to configure.No agents to run.No Prometheus exporters.

The Human-in-the-Loop Layer

Once I had a reliable health signal, the next question was:
What do I do with it?

I built a managed orchestration layer that polls /health/alerts every 5 seconds.When the score drops below threshold, it:

Runs Claude AI diagnosis on the metric context
Sends a WhatsApp or Telegram message with a plain-English summary
Generates a single-use recovery link

Most AI incident tooling jumps straight to autonomous remediation.I intentionally didn’t.

Production systems deserve human authorization before recovery actions execute.I read the diagnosis, preview the recovery action, and tap approve – from my phone.

Nothing executes automatically.Every action is logged immutably.

I built the mobile-first delivery because I work in Zimbabwe, where engineers aren’t always at laptops when things break.

WhatsApp is the operational control plane here.

That constraint produced something better than I expected:

Alerts that find you, rather than dashboards you have to find.

The Open Source Core
The telemetry middleware is free and MIT licensed.
pip install fastapi-alertengine

The managed orchestration layer (AI diagnosis, WhatsApp/Telegram alerts, human-authorized recovery) is a commercial service.

GitHub: https://github.com/Tandem-Media/fastapi-alertengine
Docs: https://tandem-media.github.io/fastapi-alertengine/

Most monitoring stacks are good at detecting incidents.
Very few are good at reducing operator uncertainty during one.
How are you handling that gap today?

Recycling made easy: a Polish recycling assistant powered by Gemma 4

Photo of Polish color-coded recycling bins

This is a submission for the Gemma 4 Challenge: Build with Gemma 4

I clearly remember this scene: my mom and I are dyeing our hair together. I’m holding a small plastic bottle that still has some dye inside, and I’m asking myself: where the hell do I throw this? I ask my mom – she has no idea either. Plastic bin, even though the bottle is contaminated with dye? Or is it mixed waste now?

Sorting waste in Poland has improved a lot over the last few years. The system is based on six colourful bins that you’ll see in any backyard:

Bin Color What goes in
PLASTIC/METAL 🟡 (yellow) plastic bottles, cans
PAPER 🔵 (blue) paper, cardboard
GLASS 🟢 (green) glass jars, bottles
BIO 🟤 (brown) food scraps, garden waste
MIXED ⚫ (black/grey) mixed waste: contaminated or composite items
TEXTILE 🟣 (violet) clothes, shoes (separate collection mandatory since Jan 2026)

Photo of Polish color-coded recycling bins

Obvious stuff like cardboard or an old pair of socks is easy. But there are traps – you can’t throw an old mug or a broken mirror into the glass bin, even though it seems to be the right choice. And then there’s the hair dye bottle with dye still inside. The pizza box with grease on the bottom. The blister pack from your pills.

Real debates are happening on the Polish internet about this stuff. Type “gdzie wyrzucić…” into Google and you’ll see how much people struggle. I once watched two friends argue about where a used coffee cup goes — one swore it was paper, the other said mixed waste because of the plastic lining.

Confusing? Hell yeah, it is! 😩

What I Built

That’s why I built a web app called Gdzie to wyrzucić? [ENG: Where to throw it?]. It’s a Polish recycling assistant – you take a photo of an item with your camera and send it to a Gemma 4-backed AI assistant. As a response, it tells you which bin the waste goes in.

The photos are not stored anywhere – they are processed in-memory by the API route, sent to Gemma 4 for analysis, and discarded immediately after the response is returned.

The recycling rules live in a ~200-line system prompt. What you see now is v4 – there were a lot of iterations and a lot of live testing along the way. At this point, my entire phone gallery has turned into one big collection of trash photos 🙈 And my neighbours probably think I’ve gone nuts, because I keep photographing “interesting” items from the backyard bin to see how Gemma will handle them 😅

The app is Polish-only by design – Polish recycling rules apply to people in Poland, and the system prompt is built around Polish categories. I’m planning to add English and Ukrainian translations, though, because there are minorities living in Poland who could really use this, too. Until then, I hope the app is intuitive enough for a non-Polish speaker.

Demo

To test the project, go to Gdzie to wyrzucić?. The walkthrough is as follows:

  1. Take a photo of the wasted item or choose one from your gallery. Press the Aparat or Galeria button, respectively.
  2. Click Analizuj and wait ~15-30 seconds to get the sorting result. Alternatively, click Zrób ponownie if you are not satisfied with the photo and want to retake it.
  3. The app returns the answer to which bin you should throw your waste, together with the explanation and some additional remarks (if any).
  4. If you want to try another waste item, press Sprawdź inny przedmiot.

For the English-speaking dev.to users, I prepared a walkthrough video with some explanation:

Code

All the code lives in the recycling-app repository on GitHub.

At this point, let me be honest with you – I vibe-coded this. I am a Technical Writer, not a Developer, and even though I have experience with git and done some small code updates in the past, this is the first bigger project I’ve built myself.

It was a multi-agent work. I used Claude Code for the boilerplate code and for turning business logic into reality. I used Gemini’s deep search to dig up current recycling rules from Polish government sources and eco-experts. I was the brain behind everything else – the idea, the business logic, the testing, the improvements, leading each next step, holding it all together. And Gemma is the heart of the project 💛

How I Used Gemma 4

The app sends the photo to Gemma 4 with a detailed system prompt that encodes the current Polish recycling rules. Gemma looks at the image and returns a structured JSON: which bin, how to prepare the item, an explanation, and an extra note if relevant. The frontend turns that into a result card in the right bin colour.

I went with Gemma 4 26B Mixture-of-Experts (gemma-4-26b-a4b-it) via Google AI Studio’s free tier. The MoE architecture only activates around 4B parameters per token out of ~26B total. It’s efficient enough to run on the free tier and smart enough to handle the actually hard cases.

Gemma 4 26B A4B model listing on Google AI Studio

The free tier means the demo runs 24/7 without costs. And because Gemma is open-weights, the same app could one day ship with Gemma 4 E2B or E4B running directly on the user’s device. That’s a path I’d like to explore.

Known limitations

The test phase revealed that some photos trigger an immediate error before Gemma is even reached. The failing photos share the same characteristics: detailed scenes, multiple objects, busy compositions, and possibly larger file sizes than simple isolated-item photos. I think that the issue is about image size or encoding, but I need to confirm it yet.

Also, analysis takes 10–15 seconds. Free-tier cloud inference is slow. It is acceptable for the initial phase and the challenge, but I’d need to think about some other options in the future.

What’s Next

The roadmap is in the issue tracker. A few highlights:

  • Multilingual support for English and Ukrainian – many Ukrainians have moved to Poland in recent years, and there are also exchange students and expats living in Poland who would find an English translation handy.
  • Interactive clarification – when Gemma isn’t sure what’s in the photo, let it ask the user a yes/no question instead of guessing.
  • Suggesting reuse before recycling for books, clean clothes, working electronics, old furniture, and so on. Recycling is good. Reusing is better.

Closing sentence

If you’re in Poland, try out Gdzie to wyrzucić?. If you spot a misclassification or a rule the app gets wrong, please open an issue — I’d love to keep improving it.

Thanks to the dev.to challenge for the deadline, to my colleagues and friends who tested the app, and to Gemma 4 for actually making it all happen 💛