DEV Community

Cover image for How Hermes AI Agent can help corner "kioskos" in Caracas, Venezuela
Saulo Linares
Saulo Linares

Posted on

How Hermes AI Agent can help corner "kioskos" in Caracas, Venezuela

Hermes Agent Challenge Submission: Build With Hermes Agent

This is a submission for the Hermes Agent Challenge: Build With Hermes Agent

What I Built

There is a kiosko on Avenida El Limón in El Cafetal, Caracas called Wuilander. I walked past it hundreds of times growing up. It has 134,000 Instagram followers — more than most startups — because it became a symbol of something: a Venezuelan small business that survived everything and kept going.

El Cafetal it's a middle-class neighborhood in eastern Caracas that lived through what Venezuela lived through — hyperinflation that peaked at 130,000% in a single year, rolling blackouts, four currency conversions in a decade, 7 million people leaving the country including, eventually, me.

The businesses that stayed open did so on memory, on trust, and on WhatsApp. Not on software. Not on systems. There was no Shopify for this. No QuickBooks. No Stripe. The tools that exist assume things that aren't true in the informal Latin American economy: a credit card, a stable email address, reliable electricity, English literacy, time to learn something new.

I'm a Data Lead, working in PE consulting in Colombia, building on Claude's API in my spare time... But I kept thinking about Wuilander. About what it would look like if the default design assumption for an AI tool was a WhatsApp number instead of an email address....

So I built Vecino

Vecino is a Hermes Agent-powered WhatsApp business assistant for Latin American small businesses. No app to download. No dashboard to learn. No onboarding. You talk to it the way you already talk to everyone — on WhatsApp, in Spanish, in the informal register of someone who grew up in El Cafetal.

You tell it what arrived:

"llegaron 48 bolsas de café"

You ask what you have:

"cuánto tengo de arroz"

You log a sale:

"vendí 5 aceites"

Every night at 9pm, without being asked, it sends you a summary of the day. Every Monday at 8am, the week's P&L. After 30 days, it knows your business patterns better than the notebook did.

It's named Vecino — the neighbor — because that's what it is. The one who knows your business, shows up every day, never forgets.


Demo

The demo below shows Vecino in action: a pixel-perfect WhatsApp simulation on the left, and the Hermes Agent execution layer on the right — showing in real time how each message flows through the agent: intent parsing, memory reads and writes, skill loading, event hooks firing, and the scheduled 9pm summary arriving automatically.

🎥 [Video walkthrough — watch the conversation play out and the Hermes execution trace update in real time]
https://youtu.be/3uCOtGmXepw

🔗 Interactive demo · github.com/saulolinares10/vecino

Three moments worth watching:

  • "llegaron 48 bolsas de café" → watch MEMORY write and SKILL load appear in the execution trace within the same second
  • "vendí 5 aceites" → watch EVENT HOOKS fire low_stock_alert automatically — the owner never asked for the warning
  • 9:00 PM → CRON job triggers, SUBAGENT spawns to format the summary, the message arrives without any user input

Code

github.com/saulolinares10/vecino

SOUL.md — the agent's personality file

# Vecino — Identidad del Agente

Eres Vecino. Un asistente de negocios para abastos y tiendas pequeñas
en América Latina. Vives en WhatsApp.

## Personalidad
- Cálido, directo, como un vecino de confianza — no un sistema
- Nunca dices "procesando su solicitud" ni "entendido, procederé"
- Dices "listo", "anotado", "ojo con esto", "que descanses"
- Usas emojis con moderación: ☕ 🌾 ⚠️ 🌙 🙌
- Respondes corto — esto es WhatsApp, no un correo
- Cuando el inventario está bajo, lo mencionas sin que te pregunten

## Idioma
Siempre en español. Registro informal venezolano/latinoamericano.
Enter fullscreen mode Exit fullscreen mode

Hermes loads SOUL.md as a context file automatically — it shapes every response the agent generates. This is how you give an AI agent a personality that fits a specific cultural context without fine-tuning a model. The line "Nunca dices 'procesando su solicitud'" is doing real work: it's the difference between a chatbot and a neighbor.

Intent parsing in Spanish — agent/nlp.py

INTENT_SYSTEM = """\
Eres el cerebro de Vecino, un agente de inteligencia de negocios para pequeños comerciantes latinoamericanos.
Tu trabajo es analizar mensajes de WhatsApp en español e identificar la intención del negociante y las entidades relevantes.

Responde SIEMPRE con JSON válido. Sin explicaciones. Sin texto extra. Solo el JSON.

Intenciones:
STOCK_IN    — "llegaron 50 cajas de harina", "entró un bulto de arroz", "recibí 200 unidades de aceite"
SALE_LOG    — "vendí 5 bolsas de café", "salieron 12 unidades de refresco hoy"
STOCK_QUERY — "cuánto tengo de arroz", "qué me queda de aceite"
SUMMARY_REQUEST — "resumen del día", "cómo voy hoy", "dame el cierre"
UNKNOWN     — no se puede determinar la intención
"""
Enter fullscreen mode Exit fullscreen mode

Claude is not optional here. "llegaron", "me trajeron", "recibí", "entró mercancía" all mean the same thing — and a Venezuelan shopkeeper will use all four in the same week. Keyword matching cannot handle this. Claude parses intent reliably across all of them because it understands context, not just surface patterns. The prompt is written in Spanish, not English translated into Spanish — that distinction matters.

Event hook for low-stock alerts — agent/hooks/low_stock_alert.py

@agent.on("after:log_sale")
def after_sale(tool: str, input: dict, result: dict, **kwargs):
    _check_and_alert(result.get("product", input.get("product", "")))

def _check_and_alert(updated_product: str) -> None:
    low_items = memory.get_low_stock(LOW_STOCK_THRESHOLD)
    if not low_items:
        return
    new_alerts = [i for i in low_items if i["product"] not in _already_alerted]
    if not new_alerts:
        return
    alert_text = _format_alert(new_alerts)
    twilio_client.send_message(OWNER_PHONE, alert_text)
Enter fullscreen mode Exit fullscreen mode

The owner never asked for this warning. They just said "vendí 5 aceites." The agent watched, noticed the remaining stock crossed the threshold, and acted. That is the difference between a tool that waits and an agent that watches.

Scheduled tasks — cron.yaml

jobs:
  - name: vecino-daily-summary
    schedule: "0 21 * * *"
    skill: vecino-summary
    task: "Genera el resumen del día en español y envíalo por WhatsApp"
    deliver_to: whatsapp

  - name: vecino-weekly-pl
    schedule: "0 8 * * 1"
    skill: vecino-summary
    task: "Genera el resumen semanal con P&L en español y envíalo por WhatsApp"
    deliver_to: whatsapp
Enter fullscreen mode Exit fullscreen mode

One constraint worth noting: Hermes does not allow scheduled tasks to spawn new scheduled tasks. A cron job can spawn a subagent. That subagent cannot register a new cron job. This is a deliberate safety constraint — automation that can replicate its own scheduling is automation you can't trust.


My Tech Stack

Component What it does
Hermes Agent v0.14.0 Messaging gateway, persistent memory, skill system, scheduled tasks, event hooks, subagent delegation
Claude API (claude-sonnet-4) Intent parsing in Spanish, response generation, summary formatting
FastAPI + Python 3.11 Operator dashboard API
SQLite Local inventory and sales persistence
React + Vite Operator dashboard frontend
Railway Deployment

How I Used Hermes Agent

1. Messaging Gateway — WhatsApp as first-class interface

Hermes treats WhatsApp as a native platform, not a webhook integration. The agent lives in the conversation. Sessions persist across messages. The owner doesn't re-explain their inventory every time — Hermes maintains conversational state natively.

Wuilander's owner isn't going to install an app. They're not going to visit a dashboard. They're going to send a WhatsApp message the same way they send one to their daughter. Without a gateway that handles session persistence natively, every message exchange would require the developer to reconstruct context from scratch. Hermes does this without any custom infrastructure.

2. Persistent Memory + FTS5 Cross-Session Recall

When the owner asks "cuánto tengo de arroz" three weeks after last updating their rice inventory, Vecino finds it — not because of a database query the developer wrote, but because Hermes's FTS5 recall searches across all prior sessions automatically.

A neighbor remembers. That's the entire premise. A stateless API call can be impressive in a demo and useless after day three. The persistent memory is what makes Vecino useful after day one instead of just impressive during a demonstration.

3. Skill System + Self-Improvement Loop

Every 15 interactions, Hermes pauses, examines what it learned, and writes or rewrites a skill file. After 30 days of Vecino running for a specific business, the skill file contains patterns the developer never wrote: peak hours, top products, restock frequency, seasonal patterns.

The skill file for Wuilander after 30 days might read: "Fridays: high rotation on harina de maíz. Restock Tuesdays. Coffee margin highest. Owner messages peak 11am–1pm."

No developer wrote that. The agent learned it.

4. Scheduled Tasks + Subagent Delegation

The 9pm daily summary and Monday P&L are native Hermes cron jobs. They run without the owner asking. They delegate formatting to a child subagent — keeping the main agent responsive to incoming messages during the formatting step.

This is the moment in the demo that makes people understand what an agent actually is. The owner didn't ask. The message arrived. That's not a feature. That's a different relationship between software and the people it serves.


Venezuela has 7.7 million people living outside the country. That's one of the largest displacement crises in the Western Hemisphere. Most of us have someone back home — a parent, a cousin, a neighbor — running a small business, keeping a family fed, doing the math in their head because no system ever bothered to reach them.

Vecino is one attempt to close that gap. One abasto. One WhatsApp number. One neighbor who never forgets.


This is just the beginning — and it could be yours too

Vecino started as a challenge submission. But the more I built it, the more I realized: this is a real startup idea.

Every country in Latin America has its version of Wuilander. So does West Africa. Southeast Asia. Any place where WhatsApp is infrastructure and enterprise software is a foreign concept. The architecture is the same. The language changes. The cultural register changes. The need doesn't.

Should I build this for real? Should we?

The repo is open. The architecture works. If you're in Colombia, México, Perú, Nigeria, Indonesia — anywhere with a WhatsApp-first informal economy — and you want to build the version for your community, in your language:

Come find me. You are welcome here.

Saulo Linares · Born in Caracas · Building in Bogotá, Colombia
LinkedIn · GitHub

Top comments (1)

Collapse
 
mara_pauladiazmantilla profile image
María Paula Diaz Mantilla

Amazing 🤩🤩🤩🤩🤩