Senior Software Engineer  /  Ragusa, Sicily

Building the infrastructure between AI & data.

$ currently building MCP servers

I build the plumbing that connects AI agents to real-world data — MCP servers, evaluation tooling, observability, and the developer tools around them.

scroll
MCP / RAG / Elasticsearch / .NET / Python / Go / LLM Agents / Vector Search / Observability / Developer Tools / Local-first / FastAPI / CLI / Semantic Search / Docker / MCP / RAG / Elasticsearch / .NET / Python / Go / LLM Agents / Vector Search / Observability / Developer Tools / Local-first / FastAPI / CLI / Semantic Search / Docker /

// what I do

Three things,
done deeply.

I work where AI meets production data. Not demos — systems that run, observe themselves, and stay debuggable under load.

based
Ragusa, Sicily
focus
AI Infrastructure
core
.NET · Python · Go
shipping
since 2013
status
open to work
Ursa Major — still my favourite pointer.
01

AI & Search Systems

Semantic search engines, RAG pipelines, MCP servers, agent observability, and agentic workflows that connect LLMs to real data sources.

02

Backend Engineering

Scalable microservices with .NET, FastAPI, PostgreSQL and Elasticsearch — shipped with Docker and CI/CD pipelines that don’t page you at 3am.

03

Developer Tools

Terminal utilities, CLI tools, and open-source productivity software. Built for the people who live in the terminal — because I’m one of them.

// selected work

Things I’ve shipped.

Open-source tools at the intersection of AI infrastructure, backend engineering and developer experience. All on GitHub.

project-graveyard
$ grave scan ~/Projects
▸ met 12 projects — 9 new, 3 old acquaintances
▸ TinyLang may be paused (confidence: high)
▸ evidence: no commits for 43 days

project-graveyard

A memory for your unfinished projects

A local-first personal archivist for unfinished ideas and abandoned projects. Scans your repos, observes weak signals — commits, README language, silence — and remembers why each idea died, so the best parts can come back. No account, no cloud, no guilt.

GoSQLiteCLI + Web UILocal-first
domus-scope
$ pnpm --filter engine test
▸ golden vectors byte-exact · invariants hold
▸ verdict: buy beats rent in year 9

domus-scope

Rent vs. buy decision lab

Simulates renting vs. buying over time through two lenses — unrecoverable costs and net worth — with every number explainable down to its formula. Bilingual (EN/IT), no backend: everything stays in your browser.

TypeScriptReact 19IndexedDBfast-check
promptscore
$ promptscore analyze prompt.txt --model claude
▸ Profile: claude · 12 rules loaded
▸ Score: 62/100 — 1 error, 3 warnings

promptscore

Static analysis for LLM prompts

ESLint, but for prompts. Scores a prompt before it reaches the model — flags ambiguity, missing structure, and gaps against model-specific best practices. Deterministic rules, pluggable profiles, zero LLM calls.

TypeScriptNode.jsCLIYAML Profilesnpm
driftcut
$ driftcut evaluate --model gpt-4.1
▸ Sampling 150 prompts · 8 categories
✓ Decision: PROCEED

driftcut

Canary testing for model migrations

Decision gating for LLM model swaps. Evaluates quality, latency and cost on a stratified sample before you commit to a full migration.

PythonLiteLLMSQLitePydantic
elastic-mcp
$ elastic-mcp --index logs-*
▸ MCP server listening on stdio
▸ Tools: search, semantic, aggregate

elastic-mcp

MCP server for Elasticsearch

Lets any AI agent query Elasticsearch in natural language. A pure translator between the MCP protocol and the ES API.

C#.NET 10MCPElasticsearch 9
logq
$ logq app.log -f
▸ 142,891 records indexed in 0.3s
▸ 23 matches · 4 clusters

logq

Interactive log explorer for the terminal

Treats log files as queryable databases — live filtering, time histograms, JSON drill-down, pattern clustering. Zero external dependencies.

GoZero depsInverted index
steplight
$ steplight trace.json
▸ 42 spans · 3 tool calls · 2 retries
▸ 12,840 in / 3,210 out · $0.08

steplight

Local-first trace inspector for LLM agents

Load a trace, inspect what happened, and understand why. Timelines, tool calls, retries, token usage and latencies — all from the terminal.

PythonTextualOTELTyper
design-court
$ design-court review payment-rfc.md
▸ Parsed 5 sections · 1 judged finding
▸ F-OPS-001: missing rollback plan (high)

design-court

A technical court for design documents

Adversarial review for RFCs and ADRs: agents propose findings, evidence is machine-verified against the document, and a Judge accepts, rejects or escalates. Every finding cites verifiable evidence.

C#.NET 10AgentsEvidence-gated

// toolkit

What I reach for.

Languages

C# Python Go TypeScript

Backend

.NET 10 Blazor FastAPI ASP.NET Core

Data & Search

PostgreSQL Elasticsearch SQLite Vector DBs

AI / ML

RAG Pipelines Semantic Search LLM Agents Agent Observability MCP Protocol

DevOps

Docker GitHub Actions Fly.io Cloudflare
0
Public repos
0
Languages
0
GitHub stars
0
Years shipping

// the path

Where I’ve worked.

2024 — Now

Senior Software Engineer

@ Stuttgart IT

Leading AI-powered solutions and .NET microservices. Building MCP servers and LLM evaluation tooling, architecting data-exchange platforms across distributed systems.

AI Infrastructure.NET 10MCPElasticsearch
2019 — 2024

Software Engineer

@ Stuttgart IT

Designed enterprise-grade APIs and data pipelines. Migrated legacy systems to modern .NET, built internal tools and automation workflows.

.NET CoreREST APIsAzureCI/CD
2013 — 2019

Computer Engineer

@ Nat. Institute of Geophysics & Volcanology

Built real-time monitoring systems and collaborative data platforms for volcanological research — infrastructure for tephra observation networks and multi-hazard surveillance.

Data SystemsReal-timeScientific Computing

// let’s build something

Let’s connect.

Always up for discussing AI infrastructure, open-source tooling, and hard engineering problems. The inbox is open.