惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
GbyAI
GbyAI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
量子位
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
CERT Recently Published Vulnerability Notes
Recent Announcements
Recent Announcements
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
NISL@THU
NISL@THU
博客园 - Franky
C
Cybersecurity and Infrastructure Security Agency CISA
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
A
Arctic Wolf
F
Full Disclosure
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
博客园 - 【当耐特】
D
Docker
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
Help Net Security
Help Net Security
V
Visual Studio Blog
小众软件
小众软件
B
Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
Forbes - Security
Forbes - Security
N
Netflix TechBlog - Medium
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
How Hermes AI Agent can help corner "kioskos" in Caracas, Venezuela
Saulo Linares · 2026-05-29 · via DEV Community

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.

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
"""

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)

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

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