<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Federico Meini · Blog</title><description>Technical writing on real-time messaging, WhatsApp Business Platform, Elixir, PostgreSQL, Elasticsearch, AI agents and evals.</description><link>https://fedme.dev/</link><language>en</language><item><title>Testing a medical triage agent with LangWatch Scenario and pytest</title><link>https://fedme.dev/blog/testing-medical-triage-agents-with-langwatch-scenario/</link><guid isPermaLink="true">https://fedme.dev/blog/testing-medical-triage-agents-with-langwatch-scenario/</guid><description>How I test a medical triage AI agent with LangWatch Scenario: a simulated user, judge criteria, scripted and free-running conversations, in pytest and CI.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>llm-evals</category><category>python</category><category>testing</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Building a reliable WhatsApp Cloud API webhook receiver at scale</title><link>https://fedme.dev/blog/whatsapp-cloud-api-webhooks-at-scale/</link><guid isPermaLink="true">https://fedme.dev/blog/whatsapp-cloud-api-webhooks-at-scale/</guid><description>How to build a WhatsApp Cloud API webhook receiver that holds up: signature checks on the raw body, fast 200s, dedup, per-contact ordering and media handling.</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><category>whatsapp</category><category>webhooks</category><category>elixir</category><category>phoenix</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Backpressure in Elixir: sending millions of WhatsApp messages without falling over</title><link>https://fedme.dev/blog/backpressure-bulk-whatsapp-sends-elixir/</link><guid isPermaLink="true">https://fedme.dev/blog/backpressure-bulk-whatsapp-sends-elixir/</guid><description>Designing a bulk WhatsApp send engine in Elixir: demand-driven Broadway pipelines, per-number token buckets, retries with jitter and batched status tracking.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><category>elixir</category><category>whatsapp</category><category>backpressure</category><category>broadway</category><category>oban</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>How to partition a 1 TB PostgreSQL table without downtime: the default-partition method</title><link>https://fedme.dev/blog/partitioning-a-1tb-postgres-table-without-downtime/</link><guid isPermaLink="true">https://fedme.dev/blog/partitioning-a-1tb-postgres-table-without-downtime/</guid><description>Partition a live 1 TB Postgres table without downtime: attach it as the DEFAULT partition, copy history out with Oban jobs, then swap in one short transaction.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>partitioning</category><category>performance</category><category>elixir</category><category>oban</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>PostgreSQL partitioning in practice: partition keys, pruning, indexes and retention</title><link>https://fedme.dev/blog/postgresql-partitioning-in-practice/</link><guid isPermaLink="true">https://fedme.dev/blog/postgresql-partitioning-in-practice/</guid><description>How PostgreSQL partitioning behaves in practice: choosing the key and size, checking pruning with EXPLAIN, indexes, keys, retention and the Ecto gotchas.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><category>postgresql</category><category>partitioning</category><category>performance</category><category>elixir</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Letting AI agents run code safely in Elixir with tv-labs/lua</title><link>https://fedme.dev/blog/lua-sandbox-for-ai-agent-tools-in-elixir/</link><guid isPermaLink="true">https://fedme.dev/blog/lua-sandbox-for-ai-agent-tools-in-elixir/</guid><description>How tv-labs/lua gives AI agents a sandboxed Lua runtime inside Elixir: exposing safe functions, setting limits and wiring code execution into the agent loop.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>elixir</category><category>ai-agents</category><category>lua</category><category>sandboxing</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Serving MedGemma 27B on Modal: FP8, vLLM sleep mode and 21-second cold starts</title><link>https://fedme.dev/blog/serving-medgemma-27b-on-modal-vllm/</link><guid isPermaLink="true">https://fedme.dev/blog/serving-medgemma-27b-on-modal-vllm/</guid><description>How I self-host MedGemma 27B as a scale-to-zero, OpenAI-compatible API on Modal: FP8 quantisation, GPU snapshots, two vLLM bugs and Gemma 3 tool calling.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><category>llm</category><category>vllm</category><category>self-hosting</category><category>medgemma</category><category>ai-agents</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Designing AI agents that know when to hand over: to other agents, to rules, to humans</title><link>https://fedme.dev/blog/agent-handover-architecture-whatsapp/</link><guid isPermaLink="true">https://fedme.dev/blog/agent-handover-architecture-whatsapp/</guid><description>A practical architecture for AI agents that hand over safely: multi-agent transfers, a deterministic rules engine for high-risk calls, sandboxed tools, evals.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>multi-agent</category><category>guardrails</category><category>llm-evals</category><category>whatsapp</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Simulation evals: letting an LLM play the user to test your chatbot before real users do</title><link>https://fedme.dev/blog/simulation-evals-for-llm-chatbots/</link><guid isPermaLink="true">https://fedme.dev/blog/simulation-evals-for-llm-chatbots/</guid><description>How to build simulation evals for LLM chatbots: persona-driven simulated users, LLM-as-judge rubrics, error rates for high-stakes flows and a feedback loop.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>llm-evals</category><category>llm-as-judge</category><category>python</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>CPUSim: the CPU simulator I built for Zanichelli</title><link>https://fedme.dev/blog/cpusim-a-cpu-simulator-for-zanichelli/</link><guid isPermaLink="true">https://fedme.dev/blog/cpusim-a-cpu-simulator-for-zanichelli/</guid><description>I was reminded today of CPUSim, a browser CPU simulator I built for Zanichelli in 2020 to show students how machine code runs, one glowing register at a time.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><category>freelance</category><category>education</category><category>computer-architecture</category><category>typescript</category><author>federico.meini@gmail.com (Federico Meini)</author></item><item><title>Keeping custom state across the Überauth OAuth flow in Elixir</title><link>https://fedme.dev/blog/2021_08_12_ueberauth_state/</link><guid isPermaLink="true">https://fedme.dev/blog/2021_08_12_ueberauth_state/</guid><description>Überauth now uses the OAuth state parameter for CSRF protection, so custom state gets overwritten. Keep it in the session between request and callback instead.</description><pubDate>Thu, 12 Aug 2021 00:00:00 GMT</pubDate><category>elixir</category><category>ueberauth</category><category>oauth</category><category>authentication</category><author>federico.meini@gmail.com (Federico Meini)</author></item></channel></rss>