In social organisations, tracking grant calls is usually done by hand. Someone checks Spain's national grants database or the official state gazette, filters by eye, and shares it with the team. It works, but it depends on someone remembering to do it — and ends up happening every two weeks instead of every day, which is when it actually matters.
This use case led me to build this "grant radar" so that tracking happens on its own, every morning, without anyone having to open anything.
What Hermes does
Hermes is an agent: a program that reasons about a task and decides how to carry it out step by step. Every morning at 8am it receives a simple instruction — check today's grants — and from there it makes every decision itself:
- Queries the BDNS (Spain's National Grants Database)
- Queries the BOE (Spain's official state gazette)
- Analyses the results: filters by territory (Madrid, Catalonia, national, EU), discards what's irrelevant, scores what actually fits the organisation's mission
- Drafts a briefing
- Sends it to the team's Teams channel
The result arrives as a card with the day's summary, grants sorted by relevance (⭐ to ⭐⭐⭐), and a direct link to each one. Two minutes to read, no noise.

This is how the briefing lands in the team's Teams channel every morning.
How it's built
Three pieces, each with a distinct role:
Hermes (Python + LLM via OpenRouter) is the one that thinks. It uses a language model (Qwen3.7-flash) to read the data, judge what's relevant to the organisation, and draft the briefing. It never calls any API directly — it only decides what to do.
n8n is the one that executes. It runs in Docker and exposes three webhooks Hermes can call as tools: query_bdns, query_boe and send_teams. When Hermes decides to query the BDNS, it calls that webhook; n8n makes the request to the API, normalises the response, and hands it back. n8n never decides anything — it just does the work.

The three n8n tools Hermes can call, as seen from the editor.
Power Automate + Teams is the delivery layer. The send_teams webhook triggers a Power Automate flow that posts an Adaptive Card to the team's channel. The briefing reads just as well on desktop as on mobile.
The split between reasoning (Hermes) and execution (n8n) is the design decision that keeps this maintainable. If the BDNS API changes tomorrow, I touch the n8n workflow — Hermes doesn't notice. If I want the agent to also watch EU grant calls, I add a new webhook and tell Hermes it exists.
