<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tommaso Bertocchi</title>
    <description>The latest articles on DEV Community by Tommaso Bertocchi (@sonotommy).</description>
    <link>https://dev.to/sonotommy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3399256%2F111d6919-72dc-4992-a6c6-2b20a4ccf85b.jpeg</url>
      <title>DEV Community: Tommaso Bertocchi</title>
      <link>https://dev.to/sonotommy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sonotommy"/>
    <language>en</language>
    <item>
      <title>OSINT Prompts for ChatGPT and Claude: 5 Templates and a Repeatable Method</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Tue, 09 Jun 2026 18:12:20 +0000</pubDate>
      <link>https://dev.to/sonotommy/osint-prompts-for-chatgpt-and-claude-5-templates-and-a-repeatable-method-4jnd</link>
      <guid>https://dev.to/sonotommy/osint-prompts-for-chatgpt-and-claude-5-templates-and-a-repeatable-method-4jnd</guid>
      <description>&lt;p&gt;Most people using AI for OSINT are doing it backwards.&lt;/p&gt;

&lt;p&gt;They open ChatGPT or Claude, type "find everything on this email," and hope. The model produces something that looks confident, reads well, and is often wrong. No sourcing, no verification, no idea what it actually checked.&lt;/p&gt;

&lt;p&gt;The problem isn't the model. It's the missing process behind the prompt. A language model with no structure will fill gaps with plausible text. An investigation is the opposite of that: it's the discipline of separating what you know from what you assume.&lt;/p&gt;

&lt;p&gt;This post gives you a method and five prompt templates you can paste into ChatGPT, Claude, or any assistant today. They're written for authorized, public-source work only.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on ethics and scope, before anything else
&lt;/h2&gt;

&lt;p&gt;OSINT means open-source intelligence: information that is publicly available and lawful to access. It does not mean breaking into accounts, scraping private data, social engineering, or surveilling people without authorization.&lt;/p&gt;

&lt;p&gt;Every prompt below assumes you have a legitimate reason and the authority to run the investigation: your own assets, a client engagement with a signed scope, due diligence on a company, journalism, or a CTF. If you can't point to that authorization, stop. The fastest way to turn a research skill into a legal problem is to skip this step.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method: scope, collect, pivot, verify, document
&lt;/h2&gt;

&lt;p&gt;Good investigations are boring in the best way. They follow the same five phases regardless of the target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scope    -&amp;gt; what am I authorized to do, and what answer do I need?
collect  -&amp;gt; gather public data from real sources
pivot    -&amp;gt; turn one data point into the next (email -&amp;gt; username -&amp;gt; domain)
verify   -&amp;gt; challenge every finding, rate confidence, kill assumptions
document -&amp;gt; a report someone else could reproduce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A model can help in every phase, but only if your prompt tells it which phase it's in. A prompt that says "investigate this" gets you a guess. A prompt that says "you are in the scoping phase, output only the plan" gets you something useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five prompts
&lt;/h2&gt;

&lt;p&gt;Paste these as-is. Replace the bracketed parts. Each one is built to keep the model honest about what it actually knows versus what it's inferring.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scoping
&lt;/h3&gt;

&lt;p&gt;Run this first, every time. It stops you from chasing the wrong thing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an OSINT analyst in the SCOPING phase. Do not collect or guess any
data yet.

Engagement: [one line on what you are authorized to investigate]
Objective: [the specific question you need answered]

Output:
1. A restated objective in one sentence.
2. In-scope vs out-of-scope (sources, identifiers, targets).
3. The 3-6 concrete questions that, if answered, satisfy the objective.
4. The public source types relevant to each question.
5. Legal/ethical flags I should confirm before proceeding.

Ask me anything ambiguous instead of assuming.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Email as a starting point
&lt;/h3&gt;

&lt;p&gt;An email rarely answers a question by itself. It's a seed you pivot from.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are in the COLLECT and PIVOT phases. The seed is an email address:
[email]

List, as a checklist, the public-source checks worth running and what each one
could reveal:
- public breach/exposure datasets (presence only, no credential content)
- account discovery on public platforms tied to this address
- associated public profiles, avatars, and usernames
- domain of the email (if not a free provider) and what it implies

For each check, state: the data point it could produce, and the next pivot it
unlocks. Mark anything that requires live data I still need to fetch. Do not
fabricate results.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Username pivot across platforms
&lt;/h3&gt;

&lt;p&gt;Usernames are the connective tissue of an identity online. Map them with confidence levels, not certainty.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are in the PIVOT and VERIFY phases. Seed username: [handle]

Produce a table of public platforms where this handle may exist. For each:
- platform
- how to confirm the account is the same person (signals: bio, links, avatar,
  writing style, cross-links)
- confidence: high / medium / low / unconfirmed
- what would raise or lower that confidence

Be explicit that handle reuse is not proof of the same person. Flag every
inference as an inference.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Domain and infrastructure
&lt;/h3&gt;

&lt;p&gt;This is the most clear-cut OSINT surface: infrastructure is meant to be public.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are in the COLLECT phase. Target: [domain or IP]

Outline the public infrastructure checks and what each tells me:
- WHOIS / registration data and registrar
- DNS records (A, MX, NS, TXT) and what they reveal about hosting and email
- passive DNS and historically associated records
- related infrastructure (shared hosting, certificates, subdomains)
- hosting provider and ASN

For each, note the pivot it enables and whether I need to pull live data.
Output a structure I can drop findings into.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Verify and report
&lt;/h3&gt;

&lt;p&gt;The phase everyone skips and the one that separates analysis from a vibe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are in the VERIFY and DOCUMENT phases. Here are my raw findings:
[paste findings]

Do three things:
1. For each finding, classify it as confirmed, probable, or assumption, and say
   what evidence supports it.
2. Attack the weakest links: what would make each finding wrong? What did I not
   check?
3. Produce a short report: objective, method, findings with confidence levels,
   gaps, and recommended next steps. Write it so another analyst could
   reproduce it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Make the prompts pull real data instead of guessing
&lt;/h2&gt;

&lt;p&gt;The honest limitation: a chat model alone cannot see live WHOIS, current DNS, or whether an account actually exists right now. It reasons; it doesn't fetch. That's why the prompts above keep saying "mark anything that requires live data."&lt;/p&gt;

&lt;p&gt;To close that gap, connect the model to real sources. OpenOSINT is a free, open-source OSINT agent and MCP server built exactly for this: the model plans the investigation, then calls real tools (DNS, WHOIS, account discovery, IP intelligence, and more) so the answers come from data, not from the model's imagination.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openosint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It runs as an interactive REPL, a CLI, an MCP server, or a small web UI, and works with Anthropic Claude or a local Ollama model. Repo and docs: &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;https://github.com/OpenOSINT/OpenOSINT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With it connected, the prompts above stop being templates for guesswork and become an actual investigation loop: prompt -&amp;gt; tool call -&amp;gt; real data -&amp;gt; pivot -&amp;gt; verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want the full set?
&lt;/h2&gt;

&lt;p&gt;These five cover the backbone. A real engagement needs more: phone numbers, image clues, company due diligence, social footprint, structured reporting templates, and a tighter ethics and legal primer so your work stays authorized and public-source.&lt;/p&gt;

&lt;p&gt;I packaged the 30+ prompts I actually use into one file: the AI OSINT Prompt Pack. It's a 7-page PDF, built to pair with OpenOSINT, with the full scope -&amp;gt; collect -&amp;gt; pivot -&amp;gt; verify -&amp;gt; document workflow baked into every prompt.&lt;/p&gt;

&lt;p&gt;If the five above saved you time, the complete set is here: &lt;a href="https://tommasodev.gumroad.com/l/ai-osint-prompt-pack?ref=devto" rel="noopener noreferrer"&gt;https://tommasodev.gumroad.com/l/ai-osint-prompt-pack?ref=devto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Either way, take the method with you. The tools change. The discipline of separating what you know from what you assume is what makes the work hold up.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>security</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>10 Best AI Agents for 2026</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Fri, 05 Jun 2026 15:55:45 +0000</pubDate>
      <link>https://dev.to/sonotommy/10-best-ai-agents-for-2026-20gn</link>
      <guid>https://dev.to/sonotommy/10-best-ai-agents-for-2026-20gn</guid>
      <description>&lt;p&gt;Every few weeks another "best AI agents" list appears. Most of them are the same six projects in a different order, with the same GitHub screenshots and the same copy-pasted descriptions.&lt;/p&gt;

&lt;p&gt;This isn't that.&lt;/p&gt;

&lt;p&gt;I put this together based on actual community traction, architectural decisions that matter, and honest answers to the question: &lt;em&gt;would a working developer actually reach for this when shipping something real?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The criteria I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does it actually act autonomously, or just autocomplete?&lt;/li&gt;
&lt;li&gt;is there real 2026 momentum — commits, contributors, production usage?&lt;/li&gt;
&lt;li&gt;can you deploy it without three days of config?&lt;/li&gt;
&lt;li&gt;does it have a coherent architecture, or is it just wrappers all the way down?&lt;/li&gt;
&lt;li&gt;does it solve a problem that's genuinely hard without it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This list covers ten projects. They don't all look the same, which is the point — the agent ecosystem in 2026 is plural, not monolithic.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; the best agents in 2026 are the ones that made a hard architectural call and stuck with it. Generalist everything-frameworks are losing to focused tools that do one thing without apology.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l3vRd3vZPrApPqzjq" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffon1preqgwa4wje04xm7.gif" alt="South Park computer code GIF" width="384" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;OpenOSINT — Claude-native AI agent for OSINT and security research&lt;/li&gt;
&lt;li&gt;Browser-Use — The browser automation layer the whole ecosystem builds on&lt;/li&gt;
&lt;li&gt;OpenHands — The open-source answer to Devin&lt;/li&gt;
&lt;li&gt;LangGraph — Production-grade stateful agent orchestration&lt;/li&gt;
&lt;li&gt;CrewAI — Multi-agent teams that actually ship work&lt;/li&gt;
&lt;li&gt;Letta — The agent framework that solved memory&lt;/li&gt;
&lt;li&gt;smolagents — Hugging Face's code-first, zero-bloat agent framework&lt;/li&gt;
&lt;li&gt;Dify — The LLM app platform with 80K+ stars and a serious workflow engine&lt;/li&gt;
&lt;li&gt;SWE-agent — Princeton's coding agent with a clean Agent-Computer Interface&lt;/li&gt;
&lt;li&gt;MetaGPT — Simulates an entire software company in your terminal&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southpark-south-park-T2NGN7lcMZAOMNXsiA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybexa2blew9wrvxfqbkc.gif" alt="South Park wow GIF" width="191" height="273"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1) OpenOSINT — Claude-native AI agent for OSINT and security research
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source AI-powered OSINT terminal agent built natively on Claude's Tool Use API — not retrofitted, not a wrapper, architecturally native.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; There's a category of AI agent that exists because the workflow genuinely needs it, and security research is the clearest example. Recon is repetitive, cross-source, and time-sensitive — exactly the class of problem agents should be solving. OpenOSINT doesn't pretend to be a general assistant. It's a &lt;strong&gt;domain-specific agent for OSINT workflows&lt;/strong&gt;: IP lookups, domain intelligence, breach data, threat correlation, all orchestrated through Claude's structured tool calls. The MCP-native architecture means it plugs into the modern AI toolchain without friction. If you work in security, threat intelligence, or are building on top of Claude's Tool Use API, this is a reference implementation worth studying. Check out &lt;a href="https://openosint.tech/" rel="noopener noreferrer"&gt;openosint.tech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; OSINT workflows, security reconnaissance, threat intelligence, developers building domain-specific agents on Claude.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F26600e0246832b61b3845f5710f28232b267420a2636520b247ed405c01195e3%2FOpenOSINT%2FOpenOSINT" alt="OpenOSINT preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l2Sq7WylCXgBfjHtm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuttcw6desp21swwydxq.gif" alt="South Park kids hacking GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Browser-Use — The browser automation layer the whole ecosystem builds on
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A Python library that gives AI agents a real browser — not a scraper, not a headless fetcher, an actual Chromium instance they can see, click, type into, and reason about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; 93K+ GitHub stars. YC W25. Their own fine-tuned models. A marketplace with 1,200+ community automations. At this point, Browser-Use isn't a library — it's the de facto substrate for web-capable agents. The core architectural insight was obvious in retrospect: scraping is brittle because the web isn't static. Agents that can render pages, interact with JavaScript, and handle dynamic content are an order of magnitude more capable than anything that pattern-matches HTML. Browser-Use made that the default. Every other framework that wants to interact with the web either builds on top of it or reinvents it poorly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; web automation, research pipelines, form filling, any agent that needs to interact with the live web rather than parse static HTML.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/browser-use/browser-use" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/browser-use/browser-use" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F881458615%2Ffddb1de9-5742-4037-8ea9-bf8f1cfd2f58" alt="Browser-Use preview" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/family-guy-family-guy-griffin-meg-fsyMR4HBUFk3lcQ2UE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a5c538a36riabclo5hr.gif" alt="Family Guy shocked GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3) OpenHands — The open-source answer to Devin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An autonomous AI software engineering platform — formerly OpenDevin — that writes code, runs tests, fixes bugs, and opens pull requests inside a sandboxed Docker environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; OpenHands began as a community-driven response to Cognition's Devin. It raised $18.8M Series A and reached 70K+ GitHub stars with meaningful contributions from engineers at AMD, Apple, Google, Amazon, Netflix, and NVIDIA — not just indie hackers. The difference between OpenHands and a code autocomplete tool is the &lt;strong&gt;CodeAct agent&lt;/strong&gt;: it doesn't propose a change, it makes the change, runs the tests, reads the output, and iterates. A &lt;strong&gt;72% SWE-Bench score&lt;/strong&gt; is competitive with proprietary alternatives that charge enterprise prices. Supports 100+ LLM backends including local models via Ollama. MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; autonomous code generation, GitHub issue resolution, brownfield codebase work, engineering automation without a cloud vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/All-Hands-AI/OpenHands" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/All-Hands-AI/OpenHands" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fe8fedbdda8b61ae6ca4ce6e81e1aad0fa80108ff4d23fe093dd344baea7f7862%2FOpenHands%2FOpenHands" alt="OpenHands preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/nickelodeon-funny-spongebob-squarepants-l2JhO9xvRGUHslQPu" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flizokwd418vucem617c4.gif" alt="SpongeBob writing GIF" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4) LangGraph — Production-grade stateful agent orchestration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A graph-based agent orchestration framework from LangChain — built specifically for cycles, branching, and persistent state across multi-step agent workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Most agent frameworks model execution as a linear chain. Real agents aren't linear — they loop, they branch, they pause and resume, they handle interrupts and human-in-the-loop confirmations. LangGraph's &lt;strong&gt;graph-first execution model&lt;/strong&gt; maps directly to how production agents actually behave. State is a first-class citizen: every node reads from and writes to a typed state object, which means you can checkpoint, replay, and debug any point in the execution. The 2025 Platform release added deployment infrastructure on top of the core framework, turning it from a library into something you can actually run at scale. If your agent workflow is genuinely complex, LangGraph is the honest choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; multi-step agent workflows, stateful agent pipelines, human-in-the-loop systems, any scenario where linear chains break down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/langchain-ai/langgraph" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/langchain-ai/langgraph" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Flangchain-ai%2Flanggraph" alt="LangGraph preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/popcorn-television-cartoon-u5BzptR1OTZ04" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffr86pbcxbsa41poyglv2.gif" alt="SpongeBob popcorn GIF" width="480" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5) CrewAI — Multi-agent teams that actually ship work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A framework for orchestrating role-based teams of AI agents that collaborate on complex tasks — independently of LangChain and with a clear production focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The mental model is intuitive and it turns out that matters: give each agent a role and a goal, assemble them into a crew, let them delegate. 44K+ stars and 5.2 million monthly downloads suggest the abstraction resonated. CrewAI is strongest in business workflow automation — &lt;strong&gt;content pipelines, lead qualification, customer support, research synthesis&lt;/strong&gt; — where the natural structure of the work maps well to a team of specialists. The streaming tool call events added in January 2026 fixed the main complaint that held teams back from production deployment. 82% task success rate, sub-2-second average latency in benchmarks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; multi-agent collaboration, business process automation, content pipelines, role-based task delegation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/crewAIInc/crewAI" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/crewAIInc/crewAI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F710601088%2Fb287b45c-081a-4001-884d-67374219f277" alt="CrewAI preview" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southpark2-3oriO5t2QB4IPKgxHi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsszqyb5w01i85myh1b5.gif" alt="South Park and it's gone GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6) Letta — The agent framework that solved memory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Formerly MemGPT — an open-source agent framework from UC Berkeley that gives LLMs a layered memory system modeled after OS virtual memory, letting agents maintain coherent state across unlimited context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The context window problem was always misframed. The real issue isn't length — it's that agents forget. Letta's approach is architectural: a tiered memory system where in-context memory, recall storage, and archival storage interact through explicit read/write operations. The agent controls what it remembers. This makes Letta the right tool for &lt;strong&gt;long-running agents&lt;/strong&gt; — customer-facing assistants, research companions, anything where the conversation history is measured in days or weeks rather than turns. The rename from MemGPT to Letta in late 2024 came with a production server, REST API, and multi-user support. MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; persistent agents, long-running workflows, stateful assistants, applications where memory is a core product requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/letta-ai/letta" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/letta-ai/letta" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fletta-ai%2Fletta" alt="Letta preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/nickelodeon-lol-spongebob-ss-imagination-OfXKySrn0Ej4s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz2ozo024t8oq50u6zrs.gif" alt="SpongeBob imagination GIF" width="250" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7) smolagents — Hugging Face's code-first, zero-bloat agent framework
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A minimal agent framework from Hugging Face where agents write and execute Python instead of parsing JSON tool schemas — removing the abstraction layer between the model and the action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The framework bloat problem in the agent space is real. Before you run your first task in most frameworks, you've configured tool schemas, defined graph nodes, and learned a DSL that only exists inside that library. smolagents skips it. &lt;strong&gt;The agent writes Python. Python runs. You read what happened.&lt;/strong&gt; That's the whole model. The tradeoff — less abstraction, more visibility — is exactly right for developers who want to actually understand their agent's behavior, not just watch it produce outputs. Hugging Face backing means first-class model hub integration and natural support for local open-weight models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; fast prototyping, local model workflows, developers who want minimal surface area, Hugging Face ecosystem integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/huggingface/smolagents" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/huggingface/smolagents" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fd3e408a0529c687858f458e6792ad999cd21a939e318b2e2f35b97f53bf89183%2Fhuggingface%2Fsmolagents" alt="smolagents preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l0HlNeVctOgi4BpjG" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fooq9gjk073mcjr2sigza.gif" alt="South Park computer checking GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8) Dify — The LLM app platform with 80K+ stars and a serious workflow engine
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source LLM application development platform with a visual workflow builder, RAG pipeline, agent runtime, model management layer, and observability tooling — all in one self-hostable package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Dify is what happens when you build for the team that ships the product, not just the engineer who prototypes it. The visual workflow editor lets non-engineers modify agent logic without touching code. The RAG pipeline is production-ready with chunking strategies, embedding model choices, and retrieval tuning built in. The &lt;strong&gt;observability layer&lt;/strong&gt; — traces, token costs, performance metrics — is the thing that actually matters when you're running agents in production and something goes wrong at 2am. 80K+ GitHub stars across a genuinely global contributor base. Apache 2.0 license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; production LLM apps, RAG pipelines, teams mixing technical and non-technical contributors, anyone who needs agent observability out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/langgenius/dify" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/langgenius/dify" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Flanggenius%2Fdify" alt="Dify preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-26ufcuGwTeMaonr8s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswlfmv69rrajc16nee2h.gif" alt="South Park old man hacking GIF" width="384" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9) SWE-agent — Princeton's coding agent with a clean Agent-Computer Interface
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A coding agent from the Princeton NLP group that formalizes agent-codebase interaction through a structured Agent-Computer Interface (ACI), designed around real GitHub issue resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; SWE-agent made a deliberate architectural choice that most frameworks avoided: instead of giving the agent unrestricted shell access, it built a &lt;strong&gt;constrained, purpose-fit interface&lt;/strong&gt; — specific tools for editing files, running tests, navigating codebases — and found that the constraints improved performance. The Agent-Computer Interface concept has since influenced how most serious coding agents are designed. This is the project researchers and practitioners use when they want to understand what's happening inside the agent loop rather than just see outputs. Actively maintained by the Princeton NLP group, MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; software engineering research, SWE-Bench work, coding agent experimentation, developers who want to inspect the agent internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/SWE-agent/SWE-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SWE-agent/SWE-agent" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F780737106%2F1ada7ff2-cc26-44f6-82b3-fd4869f422e6" alt="SWE-agent preview" width="1356" height="652"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/hulu-okay-bender-wont-8qKObbgohB8j9IA6Rr" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp88lqmgbi7rxwvt9gzf.gif" alt="Futurama Bender robot GIF" width="480" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10) MetaGPT — Simulates an entire software company in your terminal
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A multi-agent framework that assigns structured SOP roles — product manager, architect, engineer, QA — to LLMs and runs them through the actual process a software team would follow, from a one-line requirement to runnable code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The core thesis of MetaGPT — &lt;strong&gt;Code = SOP(Team)&lt;/strong&gt; — is more interesting than it sounds. Software isn't just code; it's the output of a structured process involving constraints, tradeoffs, and documentation. MetaGPT replicates that process in code and gets surprisingly coherent outputs: user stories, competitive analysis, data models, API specs, and working implementations that trace back to the original requirement. Crossed 50K GitHub stars. The MGX platform launched in early 2025 makes the multi-agent team interactive — you can direct it mid-execution rather than just watching it run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; automated spec generation, architecture documentation, complex planning pipelines, multi-role task decomposition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/FoundationAgents/MetaGPT" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/FoundationAgents/MetaGPT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F5b46ae0c49a31f946a4f6e72e7f355df7b77b2534033c60e8b7dcc00195a2131%2FFoundationAgents%2FMetaGPT" alt="MetaGPT preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;One pattern cuts across every project on this list: &lt;strong&gt;the ones that made a hard architectural call early are outperforming the ones that tried to be everything&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Browser-Use decided agents need real browsers. Letta decided memory is an OS problem. LangGraph decided execution graphs matter more than chains. smolagents decided the framework should disappear. OpenOSINT decided domain-specificity beats general-purpose. In every case, the constraint produced clarity.&lt;/p&gt;

&lt;p&gt;What the 2026 agent ecosystem looks like from this list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;specialization beats generality&lt;/strong&gt; in almost every real-world deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;observability is now table stakes&lt;/strong&gt; — if you can't trace what your agent did, you can't run it in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;memory is an architecture problem&lt;/strong&gt;, not a context window problem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sandboxed execution is non-negotiable&lt;/strong&gt; for any coding agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the OSINT/security category is real and underserved&lt;/strong&gt; — AI-native tooling here is early and high-leverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;local AI is the assumed baseline&lt;/strong&gt;, not a niche configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best agent stack in 2026 is probably a combination of two or three of these — not one framework to rule them all.&lt;/p&gt;

&lt;p&gt;What's your pick for the most underrated agent project heading into the second half of 2026?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 Best Open-Source AI Agents for 2026</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Tue, 26 May 2026 19:08:55 +0000</pubDate>
      <link>https://dev.to/sonotommy/10-best-open-source-ai-agents-for-2026-2l6p</link>
      <guid>https://dev.to/sonotommy/10-best-open-source-ai-agents-for-2026-2l6p</guid>
      <description>&lt;p&gt;Most "best AI agents" lists are just whatever showed up on Hacker News last month.&lt;/p&gt;

&lt;p&gt;This one is different.&lt;/p&gt;

&lt;p&gt;I picked these projects based on actual usage patterns, real GitHub momentum, and whether they solve a problem you'd plausibly care about in 2026 — not because they have a nice landing page.&lt;/p&gt;

&lt;p&gt;I'm ranking these by a mix of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;genuine autonomy — does it actually act, or just suggest?&lt;/li&gt;
&lt;li&gt;momentum in 2026 — commits, contributors, real community&lt;/li&gt;
&lt;li&gt;real-world deployability — can you ship it, or just demo it?&lt;/li&gt;
&lt;li&gt;architectural clarity — is it built around a solid idea, or just hype wrapped in Python?&lt;/li&gt;
&lt;li&gt;whether any actual developer would reach for it in a real project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build software, run automations, care about local AI, or want to see where the agent ecosystem is actually heading, this is the list.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; 2026 is the year autonomous agents stopped being demos and started being infrastructure — pick your stack carefully.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l3vRd3vZPrApPqzjq" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffon1preqgwa4wje04xm7.gif" alt="South Park computer code GIF" width="384" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;OpenOSINT — Terminal-first AI agent for security research&lt;/li&gt;
&lt;li&gt;Hermes Agent — Self-hosted agent that learns the longer it runs&lt;/li&gt;
&lt;li&gt;OpenClaw — Your personal AI in every app you already use&lt;/li&gt;
&lt;li&gt;OpenHands — The open-source answer to Devin&lt;/li&gt;
&lt;li&gt;Browser-Use — Give AI agents a real browser and watch what happens&lt;/li&gt;
&lt;li&gt;CrewAI — Multi-agent teams that actually ship work&lt;/li&gt;
&lt;li&gt;AutoGPT — The pioneer that grew up into a real platform&lt;/li&gt;
&lt;li&gt;MetaGPT — Simulates an entire software company in your terminal&lt;/li&gt;
&lt;li&gt;SWE-agent — Princeton's coding agent with a clean Agent-Computer Interface&lt;/li&gt;
&lt;li&gt;smolagents — Hugging Face's code-first, zero-bloat agent framework&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southpark-south-park-T2NGN7lcMZAOMNXsiA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybexa2blew9wrvxfqbkc.gif" alt="South Park wow GIF" width="191" height="273"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l2Sq7WylCXgBfjHtm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuttcw6desp21swwydxq.gif" alt="South Park kids hacking GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1) OpenOSINT — Terminal-first AI agent for security research
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source AI-powered OSINT terminal agent built natively on Claude's Tool Use API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Security research tooling is one of the few areas where AI agents have a genuinely justified reason to exist — the workflows are repetitive, data-heavy, and benefit directly from automation. OpenOSINT takes that seriously: it's &lt;strong&gt;built around Claude's Tool Use API&lt;/strong&gt; from the ground up, not bolted on. That means the agent doesn't just query things — it actually reasons through reconnaissance tasks using structured tool calls. It represents a growing category of &lt;strong&gt;AI-powered security research tooling&lt;/strong&gt; that's open-source, terminal-native, and designed for developers who care about how the underlying plumbing works. Find it at &lt;a href="https://openosint.tech/" rel="noopener noreferrer"&gt;openosint.tech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; OSINT workflows, security reconnaissance, threat intelligence gathering, developers building on top of Claude's Tool Use API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F26600e0246832b61b3845f5710f28232b267420a2636520b247ed405c01195e3%2FOpenOSINT%2FOpenOSINT" alt="OpenOSINT preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/hulu-okay-bender-wont-8qKObbgohB8j9IA6Rr" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp88lqmgbi7rxwvt9gzf.gif" alt="Futurama Bender robot GIF" width="480" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Hermes Agent — Self-hosted agent that learns the longer it runs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source autonomous AI agent by Nous Research with persistent cross-session memory and a self-improving skills system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The star explosion is the signal, not the product. What makes Hermes Agent interesting is the &lt;strong&gt;self-improving skills system&lt;/strong&gt; — it builds on its own past actions to get better at recurring tasks, not just session to session but permanently. It runs on any Linux server, connects to Telegram, Discord, Slack, WhatsApp, and Signal out of the box, and has a migration path directly from OpenClaw. &lt;strong&gt;2026 is the year Hermes went mainstream&lt;/strong&gt; — it crossed the threshold from an impressive research project to something teams are actually running in production. By Nous Research, MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; personal automation, self-hosted always-on agents, persistent memory workflows, developers who want an agent that compounds over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F43e354029649a5bae68be9d7a1f3a8a3ab6aa07d3c829423657b8594a3d96e68%2FNousResearch%2Fhermes-agent" alt="Hermes Agent preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/brittlestar-bart-simpson-nerd-glasses-corrective-shoes-mDUnKp3xy6Jh5gmGbk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y7m2kky1qsqtjtjqrkk.gif" alt="Bart Simpson nerd GIF" width="480" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3) OpenClaw — Your personal AI in every app you already use 🦞
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A personal AI assistant gateway — built by Peter Steinberger — that connects LLMs to your own devices and apps through messaging platforms you already use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; 374K+ stars and still climbing. OpenClaw isn't trying to give you another chat UI — it's built around the idea that &lt;strong&gt;your personal agent should live where you already spend time&lt;/strong&gt;: WhatsApp, Telegram, Signal, Discord, iMessage, and more. Molty 🦞, the lobster mascot, has become a symbol of the local-first agent movement. The &lt;strong&gt;local gateway model&lt;/strong&gt; is the right architectural bet for people who care about privacy and control — you run it, you own it, it answers through the apps you already have open. It became the fastest GitHub repo to reach 100K stars in history. MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; personal automation, messaging-based AI workflows, local-first assistants, power users, privacy-conscious setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F233d7c7d3f2978c1c5a244edcd1a3a973915a54d67220b91df6fe80942a3d698%2Fopenclaw%2Fopenclaw" alt="OpenClaw preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/family-guy-family-guy-griffin-meg-fsyMR4HBUFk3lcQ2UE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a5c538a36riabclo5hr.gif" alt="Family Guy shocked GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4) OpenHands — The open-source answer to Devin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An autonomous AI software engineering platform — formerly OpenDevin — that writes code, runs tests, fixes bugs, and opens pull requests inside a sandboxed Docker environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; OpenHands started as a community response to Cognition AI's Devin announcement. It has since raised $18.8M in Series A funding and reached 70K+ GitHub stars with contributions from engineers at AMD, Apple, Google, Amazon, Netflix, and NVIDIA. The &lt;strong&gt;CodeAct agent&lt;/strong&gt; doesn't just suggest edits — it executes them, checks the results, and iterates. A &lt;strong&gt;72% SWE-Bench score&lt;/strong&gt; puts it at or above proprietary alternatives on real-world software engineering benchmarks. Supports 100+ LLM providers including local models via Ollama. MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; autonomous coding, GitHub issue resolution, legacy codebase migration, software engineering automation, self-hosted Devin alternative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/All-Hands-AI/OpenHands" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/All-Hands-AI/OpenHands" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fe8fedbdda8b61ae6ca4ce6e81e1aad0fa80108ff4d23fe093dd344baea7f7862%2FOpenHands%2FOpenHands" alt="OpenHands preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/nickelodeon-funny-spongebob-squarepants-l2JhO9xvRGUHslQPu" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flizokwd418vucem617c4.gif" alt="SpongeBob writing GIF" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5) Browser-Use — Give AI agents a real browser and watch what happens
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A Python library that makes websites accessible for AI agents, letting any LLM drive a real browser to complete web-based tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; 93K+ stars and a YC W25 batch later, Browser-Use has become the default open-source answer to the question "how does my agent interact with a website." The architectural bet is simple and correct: &lt;strong&gt;agents need a real browser, not a scraper.&lt;/strong&gt; They've since trained their own models specifically optimized for browser automation, built a marketplace with 1,200+ community automations, and shipped a cloud layer on top of the MIT-licensed core. It's the browser automation layer the whole agent ecosystem is building on top of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; web automation, AI-driven form filling, scraping, research pipelines, any agent workflow involving the open web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/browser-use/browser-use" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/browser-use/browser-use" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F881458615%2Ffddb1de9-5742-4037-8ea9-bf8f1cfd2f58" alt="Browser-Use preview" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/popcorn-television-cartoon-u5BzptR1OTZ04" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffr86pbcxbsa41poyglv2.gif" alt="SpongeBob popcorn GIF" width="480" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6) CrewAI — Multi-agent teams that actually ship work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A framework for orchestrating role-based teams of AI agents that collaborate on complex tasks — independently of LangChain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; CrewAI's mental model clicked for a lot of developers: define agents with roles and goals, assemble them into a crew, and let them delegate to each other. 44K+ stars and 5.2 million monthly downloads later, it's one of the most-used agent frameworks among teams building real automations — &lt;strong&gt;content pipelines, sales prospecting, lead qualification, customer support&lt;/strong&gt;. The January 2026 addition of streaming tool call events fixed the biggest production-readiness complaint. It achieves an 82% task success rate in benchmarks with sub-2-second average latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; multi-agent collaboration, content generation pipelines, business process automation, role-based task delegation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/crewAIInc/crewAI" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/crewAIInc/crewAI" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F710601088%2Fb287b45c-081a-4001-884d-67374219f277" alt="CrewAI preview" width="1280" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southpark2-3oriO5t2QB4IPKgxHi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsszqyb5w01i85myh1b5.gif" alt="South Park and it's gone GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7) AutoGPT — The pioneer that grew up into a real platform
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; The project that started the modern autonomous AI agent movement — now a mature platform with a visual builder, an agent marketplace, and self-hosting via Docker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; AutoGPT is the most-starred project in the AI agent category on GitHub. Most people think of it as the 2023 demo that burned through GPT-4 credits. That version is gone. &lt;strong&gt;What exists in 2026 is a full platform&lt;/strong&gt; with a block-based visual builder, a marketplace of pre-packaged agents, and production-grade self-hosting. Every serious agent framework that came after AutoGPT either built on its ideas or reacted against them. You can't understand the 2026 agent landscape without knowing where it started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; general-purpose automation, visual agent building, non-developer teams, experimentation, multi-step task workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/Significant-Gravitas/AutoGPT" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Significant-Gravitas/AutoGPT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fa76e5e96d45fefbce54006176ffa596c5a8d18a41fc0af8390094858e899cfba%2FSignificant-Gravitas%2FAutoGPT" alt="AutoGPT preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-l0HlNeVctOgi4BpjG" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fooq9gjk073mcjr2sigza.gif" alt="South Park computer checking GIF" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8) MetaGPT — Simulates an entire software company in your terminal
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A multi-agent framework that assigns SOP roles — product manager, architect, engineer — to LLMs and simulates the full process of a software company from a one-line requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; MetaGPT crossed 50K GitHub stars and has earned it. The core idea is unusual and worth taking seriously: &lt;strong&gt;Code = SOP(Team)&lt;/strong&gt; — meaning software is the output of structured processes, and if you replicate those processes in code you get surprisingly coherent results. It takes a requirement as input and outputs user stories, competitive analysis, data structures, API specs, and actual code. The MGX (MetaGPT X) platform launched in early 2025 extends this into a collaborative agent dev team you can direct interactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; automated software spec generation, architecture documentation, complex planning pipelines, multi-role task decomposition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/FoundationAgents/MetaGPT" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/FoundationAgents/MetaGPT" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F5b46ae0c49a31f946a4f6e72e7f355df7b77b2534033c60e8b7dcc00195a2131%2FFoundationAgents%2FMetaGPT" alt="MetaGPT preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/southparkgifs-26ufcuGwTeMaonr8s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswlfmv69rrajc16nee2h.gif" alt="South Park old man hacking GIF" width="384" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9) SWE-agent — Princeton's coding agent with a clean Agent-Computer Interface
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A research-born coding agent from Princeton that introduces a structured Agent-Computer Interface (ACI) for interacting with codebases, designed specifically for real-world GitHub issue resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Where OpenHands went for enterprise-grade platform features, SWE-agent went the other direction — &lt;strong&gt;minimal footprint, clean interface, rigorous benchmarks.&lt;/strong&gt; The Agent-Computer Interface concept it pioneered — standardizing how agents interact with shells, editors, and test runners — has influenced how almost every serious coding agent is designed today. It's the framework researchers and serious practitioners reach for when they want to understand what's actually happening inside the agent loop. MIT license, actively maintained by the Princeton NLP group.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; software engineering research, SWE-Bench benchmarking, coding agent experimentation, developers who want to understand the internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/SWE-agent/SWE-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SWE-agent/SWE-agent" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F780737106%2F1ada7ff2-cc26-44f6-82b3-fd4869f422e6" alt="SWE-agent preview" width="1356" height="652"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://giphy.com/gifs/nickelodeon-lol-spongebob-ss-imagination-OfXKySrn0Ej4s" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz2ozo024t8oq50u6zrs.gif" alt="SpongeBob imagination GIF" width="250" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10) smolagents — Hugging Face's code-first, zero-bloat agent framework
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A minimal, code-first agent framework from Hugging Face where agents write and execute Python instead of calling JSON tool definitions — keeping the whole thing readable and debuggable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The agent framework space has a bloat problem. Most frameworks require you to define tools as JSON schemas, configure graph nodes, and learn a framework-specific DSL before you can do anything. smolagents skips all of that. &lt;strong&gt;Agents write Python, Python runs, you see what happened.&lt;/strong&gt; The Hugging Face backing means it has first-class integration with the model hub, Inference Endpoints, and the broader open-source model ecosystem. If you're running local models and want the smallest possible surface area between your code and the agent loop, smolagents is the honest choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; quick prototyping, local model workflows, Hugging Face ecosystem integrations, developers who hate framework complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/huggingface/smolagents" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/huggingface/smolagents" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fd3e408a0529c687858f458e6792ad999cd21a939e318b2e2f35b97f53bf89183%2Fhuggingface%2Fsmolagents" alt="smolagents preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;If I had to summarize the AI agent space in 2026 with one sentence, it would be this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the gap between "demo" and "production" is finally closing, and the projects that close it fastest are the ones that don't try to do everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best agents in this list share a pattern: they picked a specific problem, built a clean interface around it, and shipped. That's why Browser-Use at 93K stars and smolagents with almost no surface area can both belong on the same list.&lt;/p&gt;

&lt;p&gt;What these projects collectively represent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;specialization over generality&lt;/strong&gt; — purpose-built agents beat general-purpose frameworks in almost every real use case&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;local AI as the default&lt;/strong&gt; — not a niche setup, but the expected option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;messaging apps as agent interfaces&lt;/strong&gt; — WhatsApp and Telegram are becoming agent shells&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sandboxed execution&lt;/strong&gt; — no serious coding agent ships without isolated environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;open benchmarks&lt;/strong&gt; — SWE-Bench scores are the new leaderboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the OSINT and security category is real&lt;/strong&gt; — AI-native tooling for security research is no longer a gap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent ecosystem in 2026 isn't one thing. It's a set of independently useful primitives that you can assemble based on what you actually need.&lt;/p&gt;

&lt;p&gt;What's your #1 pick for the best AI agent in 2026?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built an MCP-native OSINT framework that lets AI agents investigate from your terminal</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Mon, 25 May 2026 10:11:55 +0000</pubDate>
      <link>https://dev.to/sonotommy/i-built-an-mcp-native-osint-framework-that-lets-ai-agents-investigate-from-your-terminal-4768</link>
      <guid>https://dev.to/sonotommy/i-built-an-mcp-native-osint-framework-that-lets-ai-agents-investigate-from-your-terminal-4768</guid>
      <description>&lt;p&gt;You give Claude a single prompt — "investigate this email address" — and it autonomously chains five tools: email enumeration, username search across 300+ platforms, breach lookup, WHOIS, and IP geolocation. No manual invocations, no copy-pasting output between scripts, no babysitting. That's what &lt;strong&gt;OpenOSINT&lt;/strong&gt; enables, and it works because the entire tool surface is exposed through the Model Context Protocol.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is OpenOSINT?
&lt;/h2&gt;

&lt;p&gt;OpenOSINT is a Python framework that acts as an &lt;strong&gt;MCP server&lt;/strong&gt;, exposing 9 OSINT tools to any MCP-compatible AI client — Claude Code, Claude Desktop, or anything else that speaks the protocol. It is not a scraper, not a dashboard, not a GUI. It is a structured tool surface that lets LLMs call real intelligence-gathering utilities the same way they call any other function.&lt;/p&gt;

&lt;p&gt;The framework wraps proven OSINT tools — holehe, sherlock, sublist3r, phoneinfoga, HaveIBeenPwned — in async, stateless Python functions that the MCP layer can discover and invoke.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlmgosy5bgt6phtjdbm0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlmgosy5bgt6phtjdbm0.gif" alt="OpenOSINT demo" width="480" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Version 2.1.0 is live on PyPI, the repo is MIT-licensed, and it runs on Python 3.10+. If you know what OSINT is but have never had an AI agent drive an investigation autonomously, this is the fastest path to that experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MCP?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol&lt;/strong&gt; is an open standard for connecting AI assistants to external tools and data sources. Instead of writing a custom function-calling wrapper for every LLM provider, you implement an MCP server once — define your tools, their input schemas, their descriptions — and any MCP-compatible client can discover and use them automatically.&lt;/p&gt;

&lt;p&gt;For OSINT tooling, this matters. Before MCP, you had two options: hard-code investigation logic into a prompt (fragile, unmaintainable) or build a custom agent that calls tools via a provider-specific function-calling API (works, but locked to one provider and one integration pattern). With MCP, you expose OSINT capabilities as a server once, and every compatible client — Claude Code, Claude Desktop, or any future client — can drive investigations autonomously.&lt;/p&gt;

&lt;p&gt;There's prior art here. A freeCodeCamp article explored building an autonomous OSINT agent using the Claude Tool Use API directly. OpenOSINT takes that concept and makes it protocol-native: the tools are not hard-wired to Claude's API, they're available to any MCP client. The result is that the same 9 tools work regardless of which AI client you're using, and you don't rewrite the integration every time the ecosystem changes.&lt;/p&gt;

&lt;p&gt;The practical payoff: once your MCP server is registered, you stop thinking about which tool to call. You describe the investigation goal, and the agent decides which tools to chain, in what order, based on what it finds at each step.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 9 Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;External dependency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email account enumeration&lt;/td&gt;
&lt;td&gt;holehe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Username search across 300+ platforms&lt;/td&gt;
&lt;td&gt;sherlock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data breach check&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned v3 API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WHOIS domain registration lookup&lt;/td&gt;
&lt;td&gt;python-whois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP geolocation + ASN&lt;/td&gt;
&lt;td&gt;ipinfo.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subdomain enumeration&lt;/td&gt;
&lt;td&gt;sublist3r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_dorks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates 12 targeted Google dork URLs&lt;/td&gt;
&lt;td&gt;none (no network calls)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_paste&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pastebin dump search&lt;/td&gt;
&lt;td&gt;psbdmp.ws&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Phone carrier + country + line type&lt;/td&gt;
&lt;td&gt;phoneinfoga binary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three tools worth showing in detail:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/strong&gt; runs an email address through holehe to check which online accounts are registered to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openosint search-email target@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] twitter.com        → registered
[+] github.com         → registered
[-] instagram.com      → not found
[+] spotify.com        → registered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/strong&gt; passes the username to sherlock and checks 300+ platforms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openosint search-username johndoe42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] GitHub     → https://github.com/johndoe42
[+] Reddit     → https://reddit.com/user/johndoe42
[+] Twitter    → https://twitter.com/johndoe42
[-] TikTok     → not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/strong&gt; queries ipinfo.io and returns geolocation, ASN, and organization data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openosint search-ip 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;IP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;           &lt;span class="s"&gt;8.8.8.8&lt;/span&gt;
&lt;span class="na"&gt;Hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;dns.google&lt;/span&gt;
&lt;span class="na"&gt;City&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;         &lt;span class="s"&gt;Mountain View&lt;/span&gt;
&lt;span class="na"&gt;Region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;California&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;US&lt;/span&gt;
&lt;span class="na"&gt;Organization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AS15169 Google LLC&lt;/span&gt;
&lt;span class="na"&gt;ASN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;          &lt;span class="s"&gt;AS15169&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;OpenOSINT has three strict layers with one architectural rule: no layer imports from a layer above it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core tools&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/tools/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Async wrappers — stateless, no I/O, no UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/mcp_server.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Translates tools to MCP schemas, handles stdio transport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/cli.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Human-facing interface, formats output for the terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The core tools layer is where all the actual work happens. Each tool is a stateless async function that accepts typed inputs and returns structured data. It knows nothing about how it's being called. The MCP server layer reads those functions and exposes them as MCP tool definitions with JSON schemas. The CLI layer calls the same functions directly and handles terminal rendering.&lt;/p&gt;

&lt;p&gt;This separation is what makes the MCP and CLI modes interchangeable. The same &lt;code&gt;search_email&lt;/code&gt; async function runs whether Claude is calling it via MCP or you're typing a command in your terminal. No duplication, no drift between the two interfaces, no special-casing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sijg4idr7270ndnve2v.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sijg4idr7270ndnve2v.gif" alt="agent investigation" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Clone the repo and install in editable mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/OpenOSINT/OpenOSINT.git
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenOSINT
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the external OSINT dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;holehe sherlock-project sublist3r
&lt;span class="c"&gt;# phoneinfoga: download the binary from its GitHub releases page&lt;/span&gt;
&lt;span class="c"&gt;# and ensure it's available on your PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To register OpenOSINT as an MCP server in &lt;strong&gt;Claude Code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add openosint python /absolute/path/to/OpenOSINT/openosint/mcp_server.py
claude mcp list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;Claude Desktop&lt;/strong&gt;, add the server entry to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openosint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/OpenOSINT/openosint/mcp_server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Desktop after saving. On next launch it will discover all 9 tools automatically — no further configuration needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agentic OSINT in action
&lt;/h2&gt;

&lt;p&gt;This is the use case that makes the MCP architecture worth it. Open Claude Code and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then give it a single prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Investigate target@example.com. If you find an associated username,
trace it across other platforms and compile a full report.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what happens internally, without any further input from you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude calls &lt;code&gt;search_email&lt;/code&gt; with &lt;code&gt;target@example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The tool returns a list of platforms where the email is registered — including a recognizable username pattern&lt;/li&gt;
&lt;li&gt;Claude calls &lt;code&gt;search_username&lt;/code&gt; with that username&lt;/li&gt;
&lt;li&gt;sherlock checks 300+ platforms and returns all profile URLs&lt;/li&gt;
&lt;li&gt;Claude calls &lt;code&gt;search_breach&lt;/code&gt; to check if the email has appeared in known data breaches&lt;/li&gt;
&lt;li&gt;Claude synthesizes all results into a structured investigation report&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No manual tool invocation. No copy-pasting output between commands. The agent decides the investigation path based on what it finds at each step. If &lt;code&gt;search_email&lt;/code&gt; returns nothing actionable, it pivots — tries &lt;code&gt;generate_dorks&lt;/code&gt;, calls &lt;code&gt;search_whois&lt;/code&gt;, or runs &lt;code&gt;search_paste&lt;/code&gt;. That's the difference between a collection of OSINT scripts and a tool surface that an agent can reason over.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqkxff3rxx9tsl2utxqe.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqkxff3rxx9tsl2utxqe.gif" alt="AI agent working" width="360" height="378"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Optional: Breach + Phone Intel
&lt;/h2&gt;

&lt;p&gt;Two tools require additional setup to return full results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/strong&gt; uses the HaveIBeenPwned v3 API, which requires a paid API key for programmatic access. Set it as an environment variable before running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HIBP_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once set, &lt;code&gt;search_breach&lt;/code&gt; returns breach metadata for an email address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;target@example.com found in 3 breaches:
&lt;span class="p"&gt;-&lt;/span&gt; LinkedIn (2012) — 164M accounts — passwords, emails
&lt;span class="p"&gt;-&lt;/span&gt; Adobe (2013) — 153M accounts — passwords, emails, usernames
&lt;span class="p"&gt;-&lt;/span&gt; Dropbox (2012) — 68M accounts — passwords, emails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/strong&gt; wraps the phoneinfoga binary, which must be on your &lt;code&gt;PATH&lt;/code&gt;. You can optionally set &lt;code&gt;IPINFO_TOKEN&lt;/code&gt; for enriched geolocation data on top of the carrier lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;IPINFO_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Phone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;+14155552671&lt;/span&gt;
&lt;span class="na"&gt;Country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;United States&lt;/span&gt;
&lt;span class="na"&gt;Carrier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;AT&amp;amp;T Mobility&lt;/span&gt;
&lt;span class="na"&gt;Line type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mobile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both tools degrade gracefully if env vars are missing — &lt;code&gt;search_breach&lt;/code&gt; returns a clear permissions error from the API, and &lt;code&gt;search_phone&lt;/code&gt; falls back to basic carrier data. The rest of the framework continues working regardless.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The current tool set covers the core OSINT surface well, but the obvious next directions are more tools and tighter workflows. Near-term additions that would fit naturally: a &lt;code&gt;search_certificate&lt;/code&gt; tool for certificate transparency log lookups (an underused source of subdomain and org data), a &lt;code&gt;search_social&lt;/code&gt; tool for public social metadata aggregation, and piped workflow support so you can chain tools in a single CLI command without needing an AI client at all.&lt;/p&gt;

&lt;p&gt;Longer term, a lightweight web UI that acts as an MCP client would make OpenOSINT accessible to teams who aren't running Claude Code. As more AI clients adopt the protocol, the value of the MCP architecture compounds — every new compatible client gets all 9 tools for free. If you want to add a tool, the contribution surface is clear: write a stateless async function in &lt;code&gt;openosint/tools/&lt;/code&gt;, and the MCP server and CLI will pick it up automatically. Open an issue with your idea first, or submit a PR directly.&lt;/p&gt;

&lt;p&gt;Star the repo if it's useful: &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;https://github.com/OpenOSINT/OpenOSINT&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;OpenOSINT is what happens when you stop treating OSINT tools as standalone scripts and start treating them as a structured capability surface for AI agents. The Model Context Protocol makes that surface discoverable, composable, and client-agnostic. You get nine real tools, a clean three-layer architecture, and agentic investigation workflows that chain those tools autonomously based on what they find.&lt;/p&gt;

&lt;p&gt;Install it, register the MCP server, and give Claude something to investigate. The half-hour setup is worth it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;https://github.com/OpenOSINT/OpenOSINT&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://openosint.tech/" rel="noopener noreferrer"&gt;https://openosint.tech/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/openosint/" rel="noopener noreferrer"&gt;https://pypi.org/project/openosint/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;OpenOSINT is for legal and authorized use only. Users are responsible for compliance with applicable laws in their jurisdiction.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>osint</category>
      <category>python</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>I Built an AI-Powered OSINT Agent That Investigates Targets Autonomously — From Your Terminal</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Thu, 21 May 2026 08:58:14 +0000</pubDate>
      <link>https://dev.to/sonotommy/i-built-an-ai-powered-osint-agent-that-investigates-targets-autonomously-from-your-terminal-4fli</link>
      <guid>https://dev.to/sonotommy/i-built-an-ai-powered-osint-agent-that-investigates-targets-autonomously-from-your-terminal-4fli</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Legal disclaimer&lt;/strong&gt;: OpenOSINT is intended for &lt;strong&gt;legal and authorized use only&lt;/strong&gt; — penetration testing with permission, investigating your own accounts, journalistic research. Users are solely responsible for compliance with applicable law. See &lt;a href="https://github.com/OpenOSINT/OpenOSINT/blob/main/DISCLAIMER.md" rel="noopener noreferrer"&gt;DISCLAIMER.md&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;You type a target. An AI agent decides which tools to run. It chains them based on findings. It writes you a structured report. You never touch a prompt.&lt;/p&gt;

&lt;p&gt;That's OpenOSINT.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" alt="OpenOSINT terminal demo" width="720" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been building this since early this year and just hit v2.12.0. The project started as a simple MCP server wrapping a handful of OSINT binaries. It's grown into something I actually use daily: a full agentic OSINT framework with a terminal REPL, a web UI, a direct CLI, and full MCP server support for Claude Code and Claude Desktop.&lt;/p&gt;

&lt;p&gt;Let me walk you through what it does and how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is OpenOSINT?
&lt;/h2&gt;

&lt;p&gt;OpenOSINT is a modular OSINT framework with &lt;strong&gt;three interfaces&lt;/strong&gt; that share the same 11-tool core:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;How to invoke&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI REPL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude-powered terminal. Type targets in natural language. Agent decides what to run.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direct CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint email addr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run individual tools without AI, for scripting or quick lookups.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;registered via &lt;code&gt;claude mcp add&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Exposes all 11 tools to any MCP-compatible client (Claude Code, Claude Desktop).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The framework is written in Python, built on &lt;code&gt;asyncio&lt;/code&gt;, uses &lt;code&gt;prompt_toolkit&lt;/code&gt; + &lt;code&gt;Rich&lt;/code&gt; in the REPL, and the AI layer talks to Anthropic's native tool use API directly.&lt;/p&gt;

&lt;p&gt;No embedded model. No output massaging. When the agent issues a tool call, the real binary executes and real stdout goes back. &lt;strong&gt;Hallucination in tool results is structurally impossible.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 11 Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;What it finds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;holehe&lt;/td&gt;
&lt;td&gt;Social accounts linked to an email (Spotify, Gravatar, Office365…)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sherlock&lt;/td&gt;
&lt;td&gt;Accounts across 300+ platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned v3 API&lt;/td&gt;
&lt;td&gt;Data breach exposure, leaked data types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;python-whois&lt;/td&gt;
&lt;td&gt;Domain registrant, registrar, creation/expiry dates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ipinfo.io&lt;/td&gt;
&lt;td&gt;Geolocation, ASN, hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip2location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP2Location API&lt;/td&gt;
&lt;td&gt;Enhanced geolocation + VPN/Proxy/Tor/datacenter detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sublist3r&lt;/td&gt;
&lt;td&gt;Subdomain enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_dorks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;built-in&lt;/td&gt;
&lt;td&gt;12 targeted Google dork URLs (no network call)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_paste&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;psbdmp.ws&lt;/td&gt;
&lt;td&gt;Pastebin dump mentions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phoneinfoga&lt;/td&gt;
&lt;td&gt;Carrier, country, line type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_censys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Censys API&lt;/td&gt;
&lt;td&gt;Open ports, services, certificate history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a binary is absent from &lt;code&gt;PATH&lt;/code&gt;, that tool returns a descriptive error — the rest of the framework keeps running.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI REPL
&lt;/h2&gt;

&lt;p&gt;This is my favourite part. Run &lt;code&gt;openosint&lt;/code&gt; with no arguments and you land in an interactive session powered by the Anthropic tool use API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;openosint ❯ investigate target@example.com

  → generate_dorks('target@example.com')
  → search_email('target@example.com')
  ✓ Found: Spotify, WordPress, Gravatar, Office365

  → search_breach('target@example.com')
  ✓ Found in 2 breaches: LinkedIn (2016), Adobe (2013)

  ╭──────────────── Report ────────────────╮
&lt;/span&gt;&lt;span class="gp"&gt;  │ #&lt;/span&gt;&lt;span class="c"&gt;# Summary                             │&lt;/span&gt;
&lt;span class="go"&gt;  │ Single target — high confidence.       │
  │                                        │
&lt;/span&gt;&lt;span class="gp"&gt;  │ #&lt;/span&gt;&lt;span class="c"&gt;# Online Presence                     │&lt;/span&gt;
&lt;span class="go"&gt;  │ Spotify · WordPress · Gravatar         │
  │                                        │
&lt;/span&gt;&lt;span class="gp"&gt;  │ #&lt;/span&gt;&lt;span class="c"&gt;# Data Breaches                       │&lt;/span&gt;
&lt;span class="go"&gt;  │ LinkedIn (2016) · Adobe (2013)         │
  ╰────────────────────────────────────────╯

  ✓ Report saved → reports/2026-05-11_report.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't have to specify which tools to run. Type a natural language instruction and the agent figures it out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;investigate target@example.com&lt;/code&gt; → email + breach + dorks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find all accounts for johndoe99&lt;/code&gt; → username search across 300+ platforms&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;what subdomains does example.com have?&lt;/code&gt; → domain tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;check if +14155552671 is mobile&lt;/code&gt; → phone tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reports are auto-saved after every investigation containing structured findings. Available REPL commands:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reset conversation memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save last report to &lt;code&gt;reports/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List available tools and their status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show current configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;exit&lt;/code&gt; / Ctrl-D&lt;/td&gt;
&lt;td&gt;Exit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Web Interface
&lt;/h2&gt;

&lt;p&gt;The website (&lt;a href="https://openosint.tech" rel="noopener noreferrer"&gt;openosint.tech&lt;/a&gt;) ships with full documentation in the classic &lt;code&gt;man(1)&lt;/code&gt; style. But there's also a local web UI — a browser-based AI chat interface with real-time streaming, tool result cards, and light/dark theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3lmseb5l4pv3tc3dm5i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3lmseb5l4pv3tc3dm5i.gif" alt="OpenOSINT web interface demo" width="600" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"openosint[web]"&lt;/span&gt;
openosint web
&lt;span class="c"&gt;# → opens automatically at http://localhost:8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI chat with inline tool results&lt;/li&gt;
&lt;li&gt;Full conversation history per session&lt;/li&gt;
&lt;li&gt;Light/dark theme (preference saved in browser)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama support&lt;/strong&gt; — run it with local models, no API key required&lt;/li&gt;
&lt;li&gt;API key management via Settings modal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A hosted version at &lt;code&gt;openosint.tech/app&lt;/code&gt; is coming soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP Server Mode
&lt;/h2&gt;

&lt;p&gt;This was actually the original reason I built the project. OpenOSINT exposes all 11 tools to any MCP-compatible client. Once registered, you can run full autonomous OSINT investigations directly from Claude Code without leaving your editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add openosint python /absolute/path/to/OpenOSINT/openosint/mcp_server.py
claude mcp list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Claude Desktop&lt;/strong&gt; — add to &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openosint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/OpenOSINT/openosint/mcp_server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then from Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Investigate target@example.com. If you find an associated username,
  trace it across other platforms and compile a full report.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model issues tool calls natively. No prompting tricks. No wrappers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The internal layering is strict and intentional:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core tools&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/tools/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Async wrappers around external binaries and APIs. Stateless.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/agent.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic tool use loop. Maintains conversation history per session.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REPL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/repl.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive terminal session. prompt_toolkit + Rich.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/mcp_server.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MCP tool schema exposure for external AI clients.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/cli.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry point. Launches REPL or dispatches direct commands.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;No layer imports from a layer above it.&lt;/strong&gt; The core tools have zero knowledge of MCP, argparse, or the agent loop. This makes each surface independently testable and the whole thing easy to extend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/OpenOSINT/OpenOSINT.git
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenOSINT
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;External dependencies (must be in &lt;code&gt;PATH&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;holehe sherlock-project sublist3r
&lt;span class="c"&gt;# phoneinfoga: download binary from https://github.com/sundowndev/phoneinfoga/releases&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional environment variables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HIBP_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IPINFO_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ipinfo.io token (higher rate limits)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IP2LOCATION_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;search_ip2location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP2Location API key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  A Note on Design
&lt;/h2&gt;

&lt;p&gt;The most interesting architectural decision was keeping the AI agent completely out of the tool layer. The tools are dumb — they wrap a binary or API call, enforce a timeout, and return a string. The agent is the only thing that knows about conversation history, tool chaining, and report generation.&lt;/p&gt;

&lt;p&gt;This means you can use the CLI for quick scripting without pulling in any AI overhead, and the same code powers both the REPL and the MCP server.&lt;/p&gt;

&lt;p&gt;The other thing I'm proud of is the timeout enforcement. Every external subprocess gets a hard timeout. If &lt;code&gt;holehe&lt;/code&gt; or &lt;code&gt;sherlock&lt;/code&gt; hangs on a slow platform, the tool aborts cleanly and returns a partial result rather than blocking the whole session.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosted web app&lt;/strong&gt; at &lt;code&gt;openosint.tech/app&lt;/code&gt; — currently running locally only&lt;/li&gt;
&lt;li&gt;More tools (suggestions welcome via &lt;a href="https://github.com/OpenOSINT/OpenOSINT/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ollama tool use support in the REPL (partially implemented)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;github.com/OpenOSINT/OpenOSINT&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website / Docs&lt;/strong&gt;: &lt;a href="https://openosint.tech" rel="noopener noreferrer"&gt;openosint.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/openosint/" rel="noopener noreferrer"&gt;pypi.org/project/openosint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sponsor&lt;/strong&gt;: &lt;a href="https://www.ip2location.com" rel="noopener noreferrer"&gt;IP2Location&lt;/a&gt; — proudly sponsoring the &lt;code&gt;search_ip2location&lt;/code&gt; integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find it useful, a ⭐ on GitHub goes a long way. Pull requests are welcome — read &lt;a href="https://github.com/OpenOSINT/OpenOSINT/blob/main/DISCLAIMER.md" rel="noopener noreferrer"&gt;DISCLAIMER.md&lt;/a&gt; before contributing.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>security</category>
      <category>python</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Why Every AI+Security Tool I Tried Was Lying to Me (And What I Built Instead)</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Mon, 18 May 2026 16:13:50 +0000</pubDate>
      <link>https://dev.to/sonotommy/why-every-aisecurity-tool-i-tried-was-lying-to-me-and-what-i-built-instead-kne</link>
      <guid>https://dev.to/sonotommy/why-every-aisecurity-tool-i-tried-was-lying-to-me-and-what-i-built-instead-kne</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; I built an open source AI agent that runs OSINT investigations from your terminal. The interesting part wasn't the OSINT — it was figuring out why every approach I tried kept hallucinating security data, and how I fixed it using the Anthropic tool use API.&lt;/p&gt;

&lt;p&gt;I'm Tommaso Bertocchi, a developer and open source creator. I also maintain &lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;Pompelmi&lt;/a&gt;, a file upload security scanner for Node.js with 600+ GitHub stars.&lt;/p&gt;

&lt;p&gt;Here is a real output I got from an AI OSINT tool six months ago:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] Twitter: @targethandle
[+] GitHub: https://github.com/megadose/holehe
[+] IP Address: 80.249.165.118
[+] SSH Banner: SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
[+] Organization: Unnamed Organization (United States)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every single line was invented.&lt;/p&gt;

&lt;p&gt;The Twitter handle didn't belong to the target. The GitHub link was the whole repo itself. The IP, the SSH banner, the organization — pure hallucination, formatted to look exactly right.&lt;/p&gt;

&lt;p&gt;This is the problem with combining LLMs and security tooling naively. Models are trained to produce plausible-looking output. Security data is highly structured and pattern-consistent. So when a model doesn't know something, it invents something that looks exactly right — and that's far more dangerous than an obvious error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/OIKT61NWgV9w58RyAi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="480" src="https://i.giphy.com/media/OIKT61NWgV9w58RyAi/giphy.gif" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I spent three months building, breaking, and rebuilding an approach that actually works. This is what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Wrong Way: Manual ReAct Loop
&lt;/h2&gt;

&lt;p&gt;The obvious first approach is a ReAct (Reasoning + Acting) loop. You prompt the model to output JSON when it wants to call a tool, parse it, execute the tool, feed results back, repeat.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The naive approach
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem: the model generates both the tool call and mentally "simulates" what the tool would return — all in one forward pass. By the time you feed real results back, the model has already committed to a narrative. It reconciles the real output with its hallucinated expectations rather than updating cleanly.&lt;/p&gt;

&lt;p&gt;I tried every prompt engineering fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"NEVER invent results" — ignored&lt;/li&gt;
&lt;li&gt;"Copy tool output VERBATIM" — model still reworded and added context&lt;/li&gt;
&lt;li&gt;"If you have no data, say 'No results found'" — model said "No results found" then listed fake results anyway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model was roleplaying an OSINT analyst, not executing one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0HlBO7eyXzSZkJri/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="400" src="https://i.giphy.com/media/l0HlBO7eyXzSZkJri/giphy.gif" height="275"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Right Way: Native Tool Use API
&lt;/h2&gt;

&lt;p&gt;The Anthropic tool use API changes the architecture fundamentally.&lt;/p&gt;

&lt;p&gt;Instead of asking the model to generate tool calls as text, you define tools as structured schemas. The model returns &lt;code&gt;stop_reason: "tool_use"&lt;/code&gt; — a hard stop. Your code executes the actual tool. The real output goes back as a &lt;code&gt;tool_result&lt;/code&gt; block. The model continues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tool_definitions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Model is done — return final response
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end_turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

    &lt;span class="c1"&gt;# Model wants a tool — execute it for real
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;tool_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# This is the critical part: real execution, real output
&lt;/span&gt;                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TOOL_MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model never gets a chance to simulate results because it hits a hard stop before generating them. It receives real output before continuing. Hallucination becomes structurally impossible in the tool output path.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture: OpenOSINT
&lt;/h2&gt;

&lt;p&gt;I built this into &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;OpenOSINT&lt;/a&gt; — an open source AI OSINT agent for the terminal.&lt;/p&gt;

&lt;p&gt;Three layers, cleanly separated:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Provider layer&lt;/strong&gt; — abstracts the LLM. Same interface for Anthropic, OpenAI, and Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ProviderResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Tool registry&lt;/strong&gt; — OSINT tools registered via decorator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@register_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find social accounts linked to an email using holehe.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;holehe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[+]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Found:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No accounts found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Agent loop&lt;/strong&gt; — the ReAct loop using native tool use, described above.&lt;/p&gt;

&lt;p&gt;Adding a new tool is one file + one decorator. Nothing else to touch.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Wraps&lt;/th&gt;
&lt;th&gt;What it investigates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;holehe&lt;/td&gt;
&lt;td&gt;Social accounts linked to an email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sherlock&lt;/td&gt;
&lt;td&gt;300+ platforms by username&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sublist3r&lt;/td&gt;
&lt;td&gt;Subdomain enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned API&lt;/td&gt;
&lt;td&gt;Data breach exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;python-whois&lt;/td&gt;
&lt;td&gt;Domain registrant info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ipinfo.io&lt;/td&gt;
&lt;td&gt;Geolocation, ASN, hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_dorks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;built-in&lt;/td&gt;
&lt;td&gt;Google dork URL generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_paste&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;psbdmp&lt;/td&gt;
&lt;td&gt;Pastebin dump mentions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phoneinfoga&lt;/td&gt;
&lt;td&gt;Carrier, country, line type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why the Agent Approach Beats a Fixed Pipeline
&lt;/h2&gt;

&lt;p&gt;The alternative to an agent is a hardcoded workflow: always run holehe, then sherlock, then HIBP. Simple, predictable, debuggable.&lt;/p&gt;

&lt;p&gt;The problem: different targets need different workflows.&lt;/p&gt;

&lt;p&gt;An email address → holehe + breach check makes sense. A domain → WHOIS + sublist3r makes sense. A person's name with no other identifiers → generate dorks first to discover real usernames, then run Sherlock on those. Running Sherlock on "John Doe" directly is useless.&lt;/p&gt;

&lt;p&gt;The agent figures this out. It reads what &lt;code&gt;generate_dorks&lt;/code&gt; returns, finds a mention of @johndoe_dev on GitHub in the dork output, and runs &lt;code&gt;search_username("johndoe_dev")&lt;/code&gt; — not &lt;code&gt;search_username("John Doe")&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is the actual value of the agent: not automation, but contextual decision-making. Each step informs the next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-Provider Support
&lt;/h2&gt;

&lt;p&gt;The provider abstraction means you can swap the LLM without touching anything else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml&lt;/span&gt;
&lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;anthropic&lt;/span&gt;  &lt;span class="c1"&gt;# or: openai, ollama&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-20250514&lt;/span&gt;
&lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk-ant-...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenAI's function calling works on the same principle as Anthropic's tool use, so it slots in cleanly. Ollama (local models) is marked experimental — local models handle structured tool-calling less consistently, but it works for basic investigations without sending data to any API.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Real Investigation Looks Like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;openosint ❯ investigate john.doe@example.com

⠸ Investigating...

→ generate_dorks    john.doe@example.com
✓ Generated 10 dork URLs

→ search_email      john.doe@example.com
✓ Found: spotify, wordpress, gravatar, office365

→ search_breach     john.doe@example.com
✓ Found in 2 breaches: LinkedIn (2016), Adobe (2013)

→ search_paste      john.doe@example.com
✗ No results

╭──────────────────── Report ─────────────────────╮
&lt;/span&gt;&lt;span class="gp"&gt;│ #&lt;/span&gt;&lt;span class="c"&gt;# Ambiguity Check                               │&lt;/span&gt;
&lt;span class="go"&gt;│ Single target identified — high confidence.      │
│                                                  │
&lt;/span&gt;&lt;span class="gp"&gt;│ #&lt;/span&gt;&lt;span class="c"&gt;# Online Presence                               │&lt;/span&gt;
&lt;span class="go"&gt;│ Spotify · WordPress · Gravatar · Office365       │
│                                                  │
&lt;/span&gt;&lt;span class="gp"&gt;│ #&lt;/span&gt;&lt;span class="c"&gt;# Data Breaches                                 │&lt;/span&gt;
&lt;span class="go"&gt;│ LinkedIn (2016) · Adobe (2013)                   │
│                                                  │
&lt;/span&gt;&lt;span class="gp"&gt;│ #&lt;/span&gt;&lt;span class="c"&gt;# Conclusion                                    │&lt;/span&gt;
&lt;span class="go"&gt;│ Moderate footprint. Credential rotation          │
│ advisable given breach exposure.                 │
╰──────────────────────────────────────────────────╯

✓ Report saved → reports/2025-05-08_john-doe.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything in that report came from actual tool output. Nothing invented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" alt="OpenOSINT demo" width="720" height="582"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openosint
openosint config    &lt;span class="c"&gt;# interactive setup — picks provider, validates API key&lt;/span&gt;
openosint investigate &lt;span class="s2"&gt;"john.doe@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full source: &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;github.com/OpenOSINT/OpenOSINT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT License. For authorized security research use only — read DISCLAIMER.md.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I rebuilt this today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parallel tool execution.&lt;/strong&gt; Right now, tools run sequentially. There's no reason &lt;code&gt;search_email&lt;/code&gt; and &lt;code&gt;search_breach&lt;/code&gt; can't run concurrently when the agent wants both. Adds complexity to the message threading but worth it for speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidence scoring.&lt;/strong&gt; The agent should annotate findings with a confidence level — "found via direct tool output" vs "inferred from dork results." Different epistemic weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming output.&lt;/strong&gt; The Rich terminal renders the full report at the end. It should stream token-by-token so large reports feel instant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3oKIPnAiaMCws8nOsE/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="360" src="https://i.giphy.com/media/3oKIPnAiaMCws8nOsE/giphy.gif" height="378"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://hackernoon.com/why-every-aisecurity-tool-i-tried-was-lying-to-me-and-what-i-built-instead" rel="noopener noreferrer"&gt;HackerNoon&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>osint</category>
      <category>ai</category>
    </item>
    <item>
      <title>I built an AI agent that does OSINT investigations automatically</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Sun, 17 May 2026 17:10:07 +0000</pubDate>
      <link>https://dev.to/sonotommy/i-built-an-ai-agent-that-does-osint-investigations-automatically-4gl7</link>
      <guid>https://dev.to/sonotommy/i-built-an-ai-agent-that-does-osint-investigations-automatically-4gl7</guid>
      <description>&lt;p&gt;Most OSINT workflows look the same.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;holehe&lt;/code&gt; → copy username → &lt;code&gt;sherlock&lt;/code&gt; → browser for HIBP → WHOIS tab → take notes → repeat.&lt;/p&gt;

&lt;p&gt;Every tool is a silo. Every pivot is manual.&lt;/p&gt;

&lt;p&gt;I built OpenOSINT to fix that.&lt;/p&gt;

&lt;p&gt;You type a target. The agent chains the tools, pivots on what it finds, and saves a structured report. No manual switching.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvidrj8i6pzo1fowzls2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvidrj8i6pzo1fowzls2.gif" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9 tools out of the box: holehe, sherlock (300+ platforms), HaveIBeenPwned, WHOIS, ipinfo, sublist3r, phoneinfoga, Pastebin dumps, Google dorks.&lt;/p&gt;

&lt;p&gt;The key design decision: uses Anthropic's native tool use API so the model never generates tool results — it only reads real output from real binaries. Hallucination is structurally impossible.&lt;/p&gt;

&lt;p&gt;Also ships as an MCP server for Claude Code / Claude Desktop. Supports Ollama for local models — no API key required.&lt;/p&gt;

&lt;p&gt;MIT license. Python 3.10+. Authorized use only.&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;github.com/OpenOSINT/OpenOSINT&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>osint</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an AI agent that runs autonomous OSINT investigations from your terminal</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Mon, 11 May 2026 13:58:36 +0000</pubDate>
      <link>https://dev.to/sonotommy/i-built-an-ai-agent-that-runs-autonomous-osint-investigations-from-your-terminal-3ibh</link>
      <guid>https://dev.to/sonotommy/i-built-an-ai-agent-that-runs-autonomous-osint-investigations-from-your-terminal-3ibh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwun012honvryjo67nrkf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwun012honvryjo67nrkf.gif" alt="Hacker typing at terminal" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know the OSINT workflow. Open a terminal. Run &lt;code&gt;holehe&lt;/code&gt; against an email. Copy a username you found. Switch tools. Run &lt;code&gt;sherlock&lt;/code&gt;. Open a browser. Check HaveIBeenPwned manually. Pull up a WHOIS tab. Take notes. Repeat.&lt;/p&gt;

&lt;p&gt;Every tool is a silo. Every pivot is manual. The investigation logic lives entirely in your head.&lt;/p&gt;

&lt;p&gt;I wanted to fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;OpenOSINT&lt;/a&gt;&lt;/strong&gt; is an open-source Python framework with an AI agent at its core. You describe a target in natural language — an email address, a username, a domain, an IP, a phone number — and the agent decides which tools to run, chains them based on what it finds, executes everything against the real binaries, and compiles a structured Markdown report.&lt;/p&gt;

&lt;p&gt;Three interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive AI REPL&lt;/strong&gt; (default) — type natural language, agent chains the tools autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct CLI&lt;/strong&gt; — run individual tools directly, no AI, perfect for scripting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt; — expose all 9 tools to Claude Code or Claude Desktop&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The demo
&lt;/h2&gt;

&lt;p&gt;Here's a real session. No mocking. The agent receives an email, runs discovery, extracts a username, pivots to search it across 300+ platforms, checks breaches, and saves a report — all unchained:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o3fcrvg94wg208arl9w.gif" alt="OpenOSINT demo" width="720" height="582"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ openosint
openosint ❯ investigate target@example.com

  → generate_dorks('target@example.com')
  → search_email('target@example.com')
  ✓ Found: Spotify, WordPress, Gravatar, Office365

  → search_breach('target@example.com')
  ✓ Found in 2 breaches: LinkedIn (2016), Adobe (2013)

  → search_username('target_handle')
  ✓ Found on: GitHub, Reddit, HackerNews, Twitter

  ╭──────────────── Report ────────────────╮
  │ ## Summary                             │
  │ Single target — high confidence.       │
  │                                        │
  │ ## Online Presence                     │
  │ Spotify · WordPress · Gravatar         │
  │                                        │
  │ ## Data Breaches                       │
  │ LinkedIn (2016) · Adobe (2013)         │
  ╰────────────────────────────────────────╯

  ✓ Report saved → reports/2026-05-11_report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent went email → accounts → username pivot → cross-platform search → breach check. No human orchestration.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10135cz8zz8zfd2k9top.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10135cz8zz8zfd2k9top.gif" alt="Working on code" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The codebase has three layers with a hard no-upward-import rule:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core tools&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/tools/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Async wrappers around binaries and APIs. Stateless. No AI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openosint/agent.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic tool use loop. Per-session conversation history.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interfaces&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;repl.py&lt;/code&gt;, &lt;code&gt;mcp_server.py&lt;/code&gt;, &lt;code&gt;cli.py&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;REPL, MCP server, direct CLI.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AI layer is &lt;strong&gt;optional&lt;/strong&gt;. The core tools run fine without it — the CLI and MCP server both bypass the agent entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why hallucination in tool results is structurally ruled out
&lt;/h3&gt;

&lt;p&gt;The AI layer uses the &lt;strong&gt;Anthropic native tool use API&lt;/strong&gt;. Here's the exact flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent receives your prompt&lt;/li&gt;
&lt;li&gt;Model decides which tool to call → issues a &lt;strong&gt;hard stop&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Real binary executes (&lt;code&gt;holehe&lt;/code&gt;, &lt;code&gt;sherlock&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Real output goes back into the context as a &lt;code&gt;tool_result&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Model reads actual output, decides next step&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model never infers or synthesizes what a tool &lt;em&gt;would&lt;/em&gt; return. It only ever sees real output. If &lt;code&gt;sherlock&lt;/code&gt; finds 47 profiles, that exact number and those exact URLs go back. The agent can't make up results because it never generates them.&lt;/p&gt;




&lt;h2&gt;
  
  
  9 tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;What it finds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;holehe&lt;/td&gt;
&lt;td&gt;Social accounts linked to an email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sherlock&lt;/td&gt;
&lt;td&gt;Accounts across 300+ platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned v3&lt;/td&gt;
&lt;td&gt;Breach exposure and leaked data types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;python-whois&lt;/td&gt;
&lt;td&gt;Registrant, registrar, creation/expiry dates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ipinfo.io&lt;/td&gt;
&lt;td&gt;Geolocation, ASN, hostname, org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sublist3r&lt;/td&gt;
&lt;td&gt;Subdomain enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_dorks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;built-in&lt;/td&gt;
&lt;td&gt;12 targeted Google dork URLs (no network calls)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_paste&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;psbdmp.ws&lt;/td&gt;
&lt;td&gt;Pastebin dump mentions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phoneinfoga&lt;/td&gt;
&lt;td&gt;Carrier, country, line type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a dependency is missing, that tool returns a descriptive error and the rest keeps running.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/OpenOSINT/OpenOSINT.git
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenOSINT
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;External deps (via pip):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;holehe sherlock-project sublist3r
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;phoneinfoga&lt;/code&gt; is a standalone binary — &lt;a href="https://github.com/sundowndev/phoneinfoga/releases" rel="noopener noreferrer"&gt;download from GitHub releases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Optional env vars:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HIBP_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key     &lt;span class="c"&gt;# HaveIBeenPwned v3&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;IPINFO_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_token   &lt;span class="c"&gt;# higher rate limits on ipinfo.io&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Python 3.10+.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interactive REPL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openosint
openosint ❯ investigate target@example.com
openosint ❯ find all accounts &lt;span class="k"&gt;for &lt;/span&gt;johndoe99
openosint ❯ what subdomains does example.com have?
openosint ❯ check &lt;span class="k"&gt;if&lt;/span&gt; +14155552671 is a mobile number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reports are auto-saved to &lt;code&gt;reports/&lt;/code&gt; as Markdown after every investigation containing structured findings.&lt;/p&gt;

&lt;p&gt;REPL commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clear     Reset conversation memory
save      Save last report manually
tools     Show available tools and status
config    Show current configuration
help      All commands
exit      Quit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Direct CLI (no AI)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openosint email target@example.com &lt;span class="nt"&gt;-t&lt;/span&gt; 60
openosint username johndoe99
openosint &lt;span class="nt"&gt;-v&lt;/span&gt; email target@example.com   &lt;span class="c"&gt;# verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  MCP Server
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgq23qes229bltr8h6he.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgq23qes229bltr8h6he.gif" alt="Access Granted" width="352" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All 9 tools are exposed as an MCP server. Register in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add openosint python /absolute/path/to/OpenOSINT/openosint/mcp_server.py
claude mcp list   &lt;span class="c"&gt;# verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Desktop (&lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openosint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/OpenOSINT/openosint/mcp_server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then from Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Investigate target@example.com. If you find a linked username,
  trace it across other platforms and compile a full report.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent chains exactly as it would in the REPL, but driven by Claude Code's context.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the agent loop works (for the curious)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified version of openosint/agent.py
&lt;/span&gt;
&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TOOL_SCHEMAS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# all 9 tools as JSON schemas
&lt;/span&gt;        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end_turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# agent is done
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tool_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Execute the REAL binary
&lt;/span&gt;                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;execute_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;   &lt;span class="c1"&gt;# real output, no inference
&lt;/span&gt;                &lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="c1"&gt;# Feed real results back into context
&lt;/span&gt;        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_results&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop runs until &lt;code&gt;stop_reason == "end_turn"&lt;/code&gt;. The agent decides when it has enough information to write the report.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs4fo9cmt2r825wt4zlf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs4fo9cmt2r825wt4zlf.gif" alt="Detective on the case" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shodan and Censys integration&lt;/li&gt;
&lt;li&gt;Support for additional LLM providers (Ollama, GPT-4)&lt;/li&gt;
&lt;li&gt;JSON and PDF export formats&lt;/li&gt;
&lt;li&gt;Docker image for zero-setup deployment&lt;/li&gt;
&lt;li&gt;Async parallel tool execution for multi-target investigations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Legal
&lt;/h2&gt;

&lt;p&gt;OpenOSINT is for &lt;strong&gt;authorized security research, penetration testing, and investigative journalism only&lt;/strong&gt;. Users are solely responsible for compliance with applicable law including GDPR, CCPA, and the CFAA. See &lt;a href="https://github.com/OpenOSINT/OpenOSINT/blob/main/DISCLAIMER.md" rel="noopener noreferrer"&gt;&lt;code&gt;DISCLAIMER.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;github.com/OpenOSINT/OpenOSINT&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://openosint.tech" rel="noopener noreferrer"&gt;openosint.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stars and issues welcome. If you build something with it, drop a comment — curious what use cases people find.&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>osint</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I built an AI agent that does OSINT investigations from your terminal</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Fri, 08 May 2026 13:07:52 +0000</pubDate>
      <link>https://dev.to/sonotommy/i-built-an-ai-agent-that-does-osint-investigations-from-your-terminal-22jh</link>
      <guid>https://dev.to/sonotommy/i-built-an-ai-agent-that-does-osint-investigations-from-your-terminal-22jh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tuvy2k6fiw0n0owsosq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tuvy2k6fiw0n0owsosq.gif" alt="Hacking terminal" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most OSINT tools are great at one thing. You run holehe for emails, sherlock for usernames, sublist3r for domains. But you're the one deciding the workflow, switching between tools, copy-pasting results.&lt;/p&gt;

&lt;p&gt;I wanted to remove that middle layer. So I built &lt;strong&gt;OpenOSINT&lt;/strong&gt; — you describe a target in plain English, the AI figures out what to investigate and how, runs the tools, and hands you a report.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The core idea is simple: instead of hardcoding a fixed pipeline, I use Claude's native tool use API to let the model decide at each step what to do next based on what it found so far.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;you ❯ investigate john.doe@gmail.com

→ search_email(john.doe@gmail.com)
  Found: spotify, wordpress, office365, gravatar

→ search_breach(john.doe@gmail.com)
  Found: 2 breaches (LinkedIn 2016, Adobe 2013)

→ search_paste(john.doe@gmail.com)
  No results.

✓ Report saved to reports/2025-05-08_john-doe.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No hardcoded sequence. The model sees the holehe results and decides whether to check breaches next, look up the domain, or go straight to the report. It's a genuine reasoning loop, not a fixed script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why native tool use matters
&lt;/h2&gt;

&lt;p&gt;The first version I built used a manual ReAct loop — I was parsing JSON from the model, extracting tool calls, running them, feeding results back. It worked but it was fragile. Models hallucinate tool results when they're bored.&lt;/p&gt;

&lt;p&gt;With the &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview" rel="noopener noreferrer"&gt;Anthropic tool use API&lt;/a&gt;, the model returns &lt;code&gt;stop_reason: "tool_use"&lt;/code&gt; when it wants to call something. You execute it, return the result, and the model continues. The loop is clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_definitions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end_turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_content&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

            &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;

            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model never gets a chance to invent results because it always receives the actual tool output before continuing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools included
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it wraps&lt;/th&gt;
&lt;th&gt;What it finds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;holehe&lt;/td&gt;
&lt;td&gt;social accounts linked to an email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sherlock&lt;/td&gt;
&lt;td&gt;accounts across 300+ platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sublist3r&lt;/td&gt;
&lt;td&gt;subdomains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_breach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HaveIBeenPwned API&lt;/td&gt;
&lt;td&gt;data breach exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;python-whois&lt;/td&gt;
&lt;td&gt;domain registrant info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ipinfo.io&lt;/td&gt;
&lt;td&gt;geolocation, ASN, hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generate_dorks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;built-in&lt;/td&gt;
&lt;td&gt;Google dork URLs for any target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_paste&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;psbdmp API&lt;/td&gt;
&lt;td&gt;Pastebin dump mentions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_phone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phoneinfoga&lt;/td&gt;
&lt;td&gt;carrier, country, line type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each tool handles missing dependencies gracefully — if sherlock isn't installed it tells you the install command instead of crashing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-provider
&lt;/h2&gt;

&lt;p&gt;The AI layer is completely swappable. On first run you pick your provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Select provider:
  [1] Anthropic (Claude) — Recommended
  [2] OpenAI (GPT-4o)
  [3] Ollama (Local) — Experimental
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same agentic loop runs regardless. Anthropic is noticeably better at following structured tool-use instructions, but all three work. Local models via Ollama are marked experimental because they're inconsistent with JSON-structured responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The terminal UI
&lt;/h2&gt;

&lt;p&gt;Built with &lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt;. Tool calls log inline as they happen so you can see the investigation unfold in real time rather than waiting for a final dump.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openosint ❯ investigate john.doe@example.com

  ⠸ Investigating...

  → search_email          john.doe@example.com
  ✓ Found: spotify, wordpress, gravatar, office365

  → search_breach         john.doe@example.com
  ✓ Found in 2 breaches

  ╭──────────────────── Report ─────────────────────╮
  │ ## Ambiguity Check                              │
  │ Single target identified — high confidence.     │
  │                                                 │
  │ ## Online Presence                              │
  │ Confirmed: Spotify, WordPress, Gravatar,        │
  │ Office365                                       │
  │                                                 │
  │ ## Data Breaches                                │
  │ LinkedIn (2016), Adobe (2013)                   │
  ╰─────────────────────────────────────────────────╯

  Report saved → reports/2025-05-08_john-doe.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openosint
openosint config    &lt;span class="c"&gt;# runs the setup wizard&lt;/span&gt;
openosint investigate &lt;span class="s2"&gt;"john.doe@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/OpenOSINT/OpenOSINT
&lt;span class="nb"&gt;cd &lt;/span&gt;OpenOSINT
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
openosint config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Web UI (optional, for non-terminal users)&lt;/li&gt;
&lt;li&gt;Export to PDF&lt;/li&gt;
&lt;li&gt;Graph visualization of connections between identifiers&lt;/li&gt;
&lt;li&gt;More tools: LinkedIn scraping, GitHub profile analysis, image metadata&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Reminder&lt;/strong&gt;: OpenOSINT is for authorized use only. Read &lt;a href="https://github.com/OpenOSINT/OpenOSINT/blob/main/DISCLAIMER.md" rel="noopener noreferrer"&gt;DISCLAIMER.md&lt;/a&gt; before using.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/OpenOSINT/OpenOSINT" rel="noopener noreferrer"&gt;github.com/OpenOSINT/OpenOSINT&lt;/a&gt;&lt;/p&gt;

</description>
      <category>osint</category>
      <category>security</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>8 Tools Powering the Fastest-Growing Startups in 2026</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Wed, 06 May 2026 12:05:58 +0000</pubDate>
      <link>https://dev.to/sonotommy/8-tools-powering-the-fastest-growing-startups-in-2026-5hib</link>
      <guid>https://dev.to/sonotommy/8-tools-powering-the-fastest-growing-startups-in-2026-5hib</guid>
      <description>&lt;p&gt;Most "startup stack" articles are written by people who haven't shipped anything in two years.&lt;/p&gt;

&lt;p&gt;They'll tell you: Next.js, Prisma, Vercel, Supabase, done. That's the 2022 answer.&lt;/p&gt;

&lt;p&gt;The startups gaining traction right now are making different choices — &lt;strong&gt;edge-native, serverless-first, zero-lock-in choices&lt;/strong&gt; that weren't available or production-ready three years ago.&lt;/p&gt;

&lt;p&gt;This isn't a list of "cool tools." It's the actual infrastructure decisions that let a 3-person team scale to 100k users without hiring a DevOps engineer.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I selected these
&lt;/h2&gt;

&lt;p&gt;I'm not ranking by GitHub stars or Twitter buzz. My criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ships fast&lt;/strong&gt; — can a solo dev go from zero to deployed in under a day?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge or serverless-native&lt;/strong&gt; — no single-region Node servers pretending to be modern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doesn't own your data&lt;/strong&gt; — open-source core or real self-host options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript-first DX&lt;/strong&gt; — type errors at build time, not at 2am in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solves something boring that used to require a dedicated hire&lt;/strong&gt; — security, background jobs, auth&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The fastest startups in 2026 aren't using the default stack — they're building on edge-native, serverless-first tools that make a 3-person team feel like 10.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/l0MYt5jPR6QX5pnqM" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hono — The API framework that actually runs at the edge&lt;/li&gt;
&lt;li&gt;Neon — Serverless Postgres that branches like Git&lt;/li&gt;
&lt;li&gt;Drizzle ORM — The TypeScript ORM that doesn't fight your database&lt;/li&gt;
&lt;li&gt;Trigger.dev — Background jobs that don't require a PhD in distributed systems&lt;/li&gt;
&lt;li&gt;shadcn/ui — UI components you copy, own, and never regret&lt;/li&gt;
&lt;li&gt;pompelmi — The one security layer most early-stage startups skip&lt;/li&gt;
&lt;li&gt;OpenNext — Escape Next.js infrastructure lock-in&lt;/li&gt;
&lt;li&gt;Supabase — The open-source BaaS that didn't make you regret it later&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1) Hono — The API framework that actually runs at the edge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A tiny (~14kB), ultra-fast web framework that runs identically on Cloudflare Workers, Bun, Deno, AWS Lambda, and Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Most API frameworks were designed for a single-region server. Hono was designed for a world where your function runs in 300 locations simultaneously. &lt;strong&gt;When cold starts are zero and latency is single-digit milliseconds globally, the old pattern of running Express in us-east-1 starts looking embarrassing.&lt;/strong&gt; The ergonomics are close enough to Express that migration isn't a rewrite — it's an afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; API-first products, edge-deployed backends, developers escaping Express or Fastify who don't want to give up familiar routing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/honojs/hono" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://hono.dev" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/honojs/hono" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fhonojs%2Fhono" alt="hono preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Neon — Serverless Postgres that branches like Git
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Fully managed, serverless Postgres with instant database branching — one command and you have an isolated copy of your database for any PR or experiment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The "prod data leaking into staging" problem doesn't need to exist anymore. &lt;strong&gt;Neon's branching model means every preview deployment gets its own database copy, spun up in seconds, torn down automatically — no more shared staging databases everyone's afraid to touch.&lt;/strong&gt; Scale-to-zero billing means pre-revenue startups aren't paying for idle Postgres at 3am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Early-stage startups, teams using Vercel/Railway preview environments, developers who want managed Postgres without the AWS RDS tax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/neondatabase/neon" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://neon.tech" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/neondatabase/neon" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fneondatabase%2Fneon" alt="neon preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Drizzle ORM — The TypeScript ORM that doesn't fight your database
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A TypeScript ORM with a SQL-like query API, zero dependencies, and first-class support for Postgres, MySQL, SQLite, and edge runtimes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Prisma is excellent until it isn't — complex joins, raw migrations, or edge deployments all eventually expose its limits. &lt;strong&gt;Drizzle's philosophy is "SQL is the interface, TypeScript is the wrapper" — you write queries that look like SQL and the types fall out automatically.&lt;/strong&gt; In an era where AI-generated code constantly hits ORM edge cases, having a predictable mental model matters more than magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; TypeScript-first teams, developers deploying to Cloudflare Workers or Bun, anyone who's hit Prisma's migration drift at least once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/drizzle-team/drizzle-orm" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://orm.drizzle.team" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drizzle-team/drizzle-orm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fdrizzle-team%2Fdrizzle-orm" alt="drizzle preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://giphy.com/gifs/26tOZ42Mg6pbTUPHW" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExeHp5OXg4bHE5N2lkYWY0NjBjMmc0Y3Q4d2xrMHM3bjlzazhmbGIybiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F26tOZ42Mg6pbTUPHW%2Fgiphy.webp" height="320" class="m-0" width="480"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://giphy.com/gifs/26tOZ42Mg6pbTUPHW" rel="noopener noreferrer" class="c-link"&gt;
            Happy New Year Celebration GIF by Faith Holland - Find &amp;amp; Share on GIPHY
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Discover &amp;amp; share this Happy New Year Celebration GIF by Faith Holland with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
          giphy.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  4) Trigger.dev — Background jobs that don't require a PhD in distributed systems
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source platform for creating long-running background jobs in TypeScript — with built-in retries, scheduling, fan-out, and a real-time observability dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Every startup eventually needs background jobs: send emails, process uploads, sync external APIs, generate AI content. The default move is still "throw it in a queue and hope." &lt;strong&gt;Trigger.dev gives you durable, observable, type-safe background execution with the same DX as writing a regular function — no SQS configuration, no dead-letter queue archaeology.&lt;/strong&gt; With LLM workloads now routinely taking 30–120 seconds, having a real background job platform isn't optional anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Startups running AI pipelines, teams replacing Inngest or raw SQS queues, developers who want background jobs that don't silently fail at 4am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/triggerdotdev/trigger.dev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://trigger.dev" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/triggerdotdev/trigger.dev" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Ftriggerdotdev%2Ftrigger.dev" alt="trigger.dev preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5) shadcn/ui — UI components you copy, own, and never regret
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A collection of accessible, composable UI components built on Radix UI and Tailwind — installed by copying source code directly into your project, not by adding a package dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Most component libraries eventually become a cage. &lt;strong&gt;shadcn/ui's model is radical: the code lives in your repo, you own it completely, and upgrading is opt-in and surgical.&lt;/strong&gt; With AI-assisted UI development accelerating, having full source access means LLMs can actually modify your components correctly — not guess at a black-box library's undocumented internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Startups building internal tools or customer-facing dashboards, developers on Next.js or Remix who want full design control without writing Radix from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/shadcn-ui/ui" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://ui.shadcn.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/shadcn-ui/ui" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fshadcn-ui%2Fui" alt="shadcn/ui preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/3o7TKSjRrfIPjeiVyM" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  6) pompelmi — The one security layer most early-stage startups skip
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A minimal Node.js wrapper around ClamAV that scans any file and returns a typed Verdict (Clean, Malicious, ScanError). No daemons, no cloud, no native bindings, zero runtime dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; User-generated content is everywhere, and every startup with a file upload is one malicious PDF away from a security incident. &lt;strong&gt;In a world where AI-generated malware is getting harder to detect, dropping a local ClamAV scan into your upload pipeline costs 10 lines of code and potentially saves your entire reputation.&lt;/strong&gt; Most early-stage security checklists skip file scanning because it sounds hard — pompelmi makes it a 5-minute integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Startups accepting file uploads from users, SaaS products handling sensitive documents, developers who want server-side file validation without adding a cloud scanning service to their vendor list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fpompelmi%2Fpompelmi" alt="pompelmi preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7) OpenNext — Escape Next.js infrastructure lock-in
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source adapter that deploys Next.js anywhere — Cloudflare Workers, AWS Lambda, Deno Deploy — not just Vercel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Vercel is excellent, but "excellent" shouldn't mean "only option." &lt;strong&gt;Next.js became so tightly coupled to Vercel's infrastructure that deploying elsewhere felt like reverse engineering — OpenNext changes that by properly implementing the missing adapter layer.&lt;/strong&gt; For startups with data residency requirements or cost concerns at scale, having a real self-hostable path for Next.js changes the architecture conversation entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Startups evaluating multi-cloud or hybrid deployments, teams hitting Vercel's pricing at scale, developers who need Next.js but can't accept single-cloud lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/opennextjs/opennext" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://opennext.js.org" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/opennextjs/opennext" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fopennextjs%2Fopennext" alt="opennext preview" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8) Supabase — The open-source BaaS that didn't make you regret it later
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source Firebase alternative — Postgres, real-time subscriptions, auth, storage, and edge functions, all in one platform with a self-hostable option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Firebase's lock-in cost finally caught up with enough startups that "Firebase alternative" became a real product category. &lt;strong&gt;Supabase won that category by building on Postgres instead of a proprietary database — meaning your data model is portable from day one and the entire SQL ecosystem just works.&lt;/strong&gt; With vector extensions, branching support, and a maturing edge functions story, Supabase in 2026 is not the scrappy Firebase clone it was in 2020.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Full-stack teams that want to move fast without infrastructure babysitting, startups that need auth + database + storage without stitching three separate services together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/supabase/supabase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/supabase/supabase" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fsupabase%2Fsupabase" alt="supabase preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/l0HlBO7eyXzSZkJri" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The best startup stacks in 2026 were built for a world where compute is cheap, cold starts are unacceptable, and a 2-person team needs to move like a 20-person team.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's why the tools actually winning right now are built around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge-native execution as the default, not an afterthought&lt;/li&gt;
&lt;li&gt;Type safety all the way from schema to frontend component&lt;/li&gt;
&lt;li&gt;Open-source cores with managed hosting options — not one or the other&lt;/li&gt;
&lt;li&gt;Security baked in early, before an incident forces the conversation&lt;/li&gt;
&lt;li&gt;Boring infrastructure decisions made once, not revisited every quarter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "default stack" gets you started. These tools get you to scale without burning out your team or your runway.&lt;/p&gt;

&lt;p&gt;If I missed something obvious, drop it in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the one tool in your stack you'd refuse to build a startup without?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
      <category>tooling</category>
    </item>
    <item>
      <title>9 Open-Source Tools to Own Your Stack (and Kill Your Cloud Bills) in 2026</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Tue, 05 May 2026 09:59:50 +0000</pubDate>
      <link>https://dev.to/sonotommy/9-open-source-tools-to-own-your-stack-and-kill-your-cloud-bills-in-2026-2lih</link>
      <guid>https://dev.to/sonotommy/9-open-source-tools-to-own-your-stack-and-kill-your-cloud-bills-in-2026-2lih</guid>
      <description>&lt;p&gt;Most "self-hosting" articles are basically a list of Docker Compose files.&lt;/p&gt;

&lt;p&gt;They tell you &lt;em&gt;what&lt;/em&gt; to run. They don't tell you &lt;em&gt;why&lt;/em&gt; the smart money is moving away from managed cloud services — or what a real production stack looks like when you do it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shift isn't about being cheap. It's about control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your data. Your pipeline. Your infra. No vendor lock-in, no surprise pricing changes, no terms-of-service update that kills your product overnight.&lt;/p&gt;

&lt;p&gt;Here's the stack I'd build today if I were starting from scratch — tools that are production-grade, actively maintained, and built by teams who eat their own cooking.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I picked these
&lt;/h2&gt;

&lt;p&gt;I'm not ranking by GitHub stars or Hacker News upvotes. I'm ranking by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Production-readiness&lt;/strong&gt; — does it hold up under real load, or is it a weekend project with a pretty README?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration story&lt;/strong&gt; — can you replace an existing paid service without a 3-month rewrite?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance burden&lt;/strong&gt; — how much ops work does it create vs. eliminate?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy posture&lt;/strong&gt; — does it send &lt;em&gt;anything&lt;/em&gt; home? Telemetry, usage data, silent pings?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community momentum&lt;/strong&gt; — growing or stagnating?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In 2026 you can run a full production stack on cheap VPS hardware and own everything from auth to analytics to AI inference — the cloud is a choice, not a requirement.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/26ufdipQqU2lhNA4g" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Ollama — Run any LLM locally, one command&lt;/li&gt;
&lt;li&gt;Coolify — Deploy apps without touching AWS or Vercel&lt;/li&gt;
&lt;li&gt;Plausible — Analytics that don't spy on your users&lt;/li&gt;
&lt;li&gt;Authentik — Auth without the $300/month Auth0 invoice&lt;/li&gt;
&lt;li&gt;Forgejo — Git hosting that's actually yours&lt;/li&gt;
&lt;li&gt;pompelmi — File scanning without sending files to the cloud&lt;/li&gt;
&lt;li&gt;Meilisearch — Search that doesn't bill per query&lt;/li&gt;
&lt;li&gt;Windmill — Automate workflows without Zapier's pricing ceiling&lt;/li&gt;
&lt;li&gt;Netdata — Real-time monitoring without Datadog sticker shock&lt;/li&gt;
&lt;/ol&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/l0MYt5jPR6QX5pnqM" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  1) Ollama — Run any LLM locally, one command
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A runtime that lets you download and run open-weight LLMs (Llama 3, Mistral, Gemma, Phi-4, DeepSeek) on your own hardware with a single CLI command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Every app is getting an AI feature bolted on, and most teams are routing everything through OpenAI — which means user prompts, internal documents, and sensitive data are leaving your infrastructure constantly. &lt;strong&gt;Ollama changes the threat model entirely.&lt;/strong&gt; Your inference stays local. No API key, no usage ceiling, no per-token bill that scales into a surprise. With Apple Silicon and consumer NVIDIA cards getting faster every cycle, "local LLM" has crossed the threshold from demo to production-viable for most workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; privacy-sensitive apps, teams building on open-weight models, developers who want zero inference cost during iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/ollama/ollama" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ollama/ollama" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Follama%2Follama" alt="ollama preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Coolify — Deploy apps without touching AWS or Vercel
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A self-hostable PaaS that handles deployments, SSL, reverse proxying, database provisioning, and environment management — a full Heroku/Vercel replacement you run on your own VPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Vercel's pricing restructure and Render's new limits made a lot of teams do the math. &lt;strong&gt;A $6/month Hetzner VPS running Coolify handles most indie projects better than $50/month on a managed platform.&lt;/strong&gt; The interface is clean, deployment from Git is one-click, and it handles Docker Compose natively. The difference from older self-hosted PaaS tools (Dokku, CapRover) is that Coolify actually feels finished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; indie hackers, small agencies, teams that want Heroku UX on their own hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/coollabsio/coolify" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://coolify.io" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/coollabsio/coolify" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fcoollabsio%2Fcoolify" alt="coolify preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/QMHoU66sBXqqLqYvGo" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  3) Plausible — Analytics that don't spy on your users
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A lightweight, privacy-first web analytics tool that gives you pageviews, referrers, and traffic sources — without cookies, without GDPR banners, without sending data to Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; GA4 is still a compliance headache and a UX nightmare. More critically, a growing segment of users actively block Google Analytics. &lt;strong&gt;Plausible's tracker is under 1KB and so privacy-respecting that it loads on pages where GA4 gets blocked.&lt;/strong&gt; Self-hosted, your data never leaves your server. You get cleaner numbers, not inflated by bot traffic that GA4 struggles to filter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; GDPR-conscious teams, devs building privacy-first products, anyone who tried GA4 onboarding and immediately wanted to quit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/plausible/analytics" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://plausible.io" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/plausible/analytics" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fplausible%2Fanalytics" alt="plausible preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Authentik — Auth without the $300/month Auth0 invoice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A self-hosted identity provider and SSO platform that supports OAuth2, SAML, LDAP, and SCIM — a full Auth0/Okta alternative you run in a Docker container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Auth0's free tier got gutted, and Okta's breach history hasn't helped confidence. &lt;strong&gt;The irony is that Authentik is genuinely more configurable than the SaaS alternatives&lt;/strong&gt; — custom flows, policy engines, MFA, and social logins — all with no per-MAU pricing. If your app handles sensitive data, running your own auth means you control the session store, token lifetimes, and audit logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; B2B SaaS teams, compliance-sensitive apps, developers who've hit Auth0's pricing wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/goauthentik/authentik" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://goauthentik.io" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/goauthentik/authentik" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fgoauthentik%2Fauthentik" alt="authentik preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5) Forgejo — Git hosting that's actually yours
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A community-maintained fork of Gitea that gives you a full GitHub-like experience — repos, issues, PRs, CI/CD hooks, and package registries — on your own infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; GitHub is owned by Microsoft. GitLab's self-hosted path got increasingly hobbled toward enterprise licensing. Forgejo is the community fork that said no thanks to both trajectories. &lt;strong&gt;It runs on a $5 VPS, mirrors to GitHub if you want redundancy, and doesn't phone home.&lt;/strong&gt; For teams handling proprietary code or working in regulated industries, your Git host shouldn't be someone else's SaaS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; teams with IP concerns, regulated industries, developers who want GitHub UX without GitHub dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/forgejo/forgejo" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://forgejo.org" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/forgejo/forgejo" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fforgejo%2Fforgejo" alt="forgejo preview" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/3o7TKSjRrfIPjeiVyM" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  6) pompelmi — File scanning without sending files to the cloud
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A minimal Node.js wrapper around ClamAV that scans any file and returns a typed Verdict (Clean, Malicious, ScanError). No daemons, no cloud, no native bindings, zero runtime dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; If you're self-hosting everything else, why are you sending uploaded files to a cloud AV API? &lt;strong&gt;That's a data exfiltration vector you're literally paying for.&lt;/strong&gt; pompelmi gives you local file scanning in one function call — it wraps ClamAV without the usual C-binding pain or process management overhead. With LLM-generated code being used to create novel malware at scale, user upload scanning isn't optional anymore — and it shouldn't require trusting a third party with your files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; self-hosted file storage, Node.js backends with upload endpoints, teams running ClamAV who don't want to manage it directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fpompelmi%2Fpompelmi" alt="pompelmi preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7) Meilisearch — Search that doesn't bill per query
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A fast, typo-tolerant, open-source search engine you self-host — think Algolia's UX without Algolia's pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Algolia is still excellent. It's also $1/1000 operations, which adds up fast once you have any real traffic. &lt;strong&gt;Meilisearch delivers sub-50ms search out of the box&lt;/strong&gt;, handles typos and faceted filtering natively, and ships as a single binary. The API is close enough to Algolia's that migration is low-friction. For any product where search is a core feature and you're already hosting your own data, this is a no-brainer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; product teams replacing Algolia, developers building search-heavy apps, e-commerce on self-hosted infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/meilisearch/meilisearch" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://meilisearch.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/meilisearch/meilisearch" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fmeilisearch%2Fmeilisearch" alt="meilisearch preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/3oriO0OEd9QIDdllqo" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  8) Windmill — Automate workflows without Zapier's pricing ceiling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A self-hosted workflow automation and internal tool builder — write scripts in Python, TypeScript, or Go, connect them into flows, trigger via webhook, cron, or API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Zapier's task-based pricing model breaks at scale. n8n is solid but has a steep learning curve. &lt;strong&gt;Windmill is what you'd get if you rebuilt Zapier for engineers&lt;/strong&gt; — scripts are first-class, version-controlled, and testable. Audit logs, RBAC, and secrets management are built in. Teams running internal ops, data pipelines, or API integrations are migrating here because the code is actually theirs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; engineering teams running internal tooling, data teams replacing Make/Zapier for complex flows, developers who want code-first automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/windmill-labs/windmill" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://windmill.dev" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/windmill-labs/windmill" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fwindmill-labs%2Fwindmill" alt="windmill preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9) Netdata — Real-time monitoring without Datadog sticker shock
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A high-resolution, real-time infrastructure monitoring agent that collects thousands of metrics with zero configuration and visualizes them in a live dashboard — fully self-hosted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Datadog's pricing has become a running joke — teams routinely get hit with invoices they didn't budget for. &lt;strong&gt;Netdata installs in 60 seconds, collects at 1-second resolution by default, and the dashboard is genuinely better-looking than most paid alternatives.&lt;/strong&gt; The Netdata Cloud tier is optional — you can run it entirely air-gapped. For teams that moved to self-hosted infra, this closes the observability gap without re-introducing a SaaS dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; self-hosted infrastructure, on-call teams who need high-resolution metrics, developers who tried Prometheus + Grafana and decided life was too short.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/netdata/netdata" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://netdata.cloud" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/netdata/netdata" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fnetdata%2Fnetdata" alt="netdata preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/l0HlBO7eyXzSZkJri" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The cloud is still useful — but "we have to use the cloud" is almost never true anymore.&lt;/p&gt;

&lt;p&gt;The tools above cover the full surface area of a production stack: inference, deployment, analytics, auth, version control, file security, search, automation, and observability. All open source. All self-hostable. All production-grade.&lt;/p&gt;

&lt;p&gt;That's why the best infrastructure decisions being made right now are about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ownership over convenience&lt;/li&gt;
&lt;li&gt;Privacy by architecture, not by policy&lt;/li&gt;
&lt;li&gt;Cost predictability as a first-class engineering requirement&lt;/li&gt;
&lt;li&gt;Vendor lock-in treated as a risk to be mitigated, not a feature&lt;/li&gt;
&lt;li&gt;Local-first as the default, cloud as the deliberate exception&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The irony is that the self-hosted stack is often faster, cheaper, and more reliable than the managed equivalent — once you get past the initial setup.&lt;/p&gt;

&lt;p&gt;If I missed something obvious, drop it in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which managed service are you most tempted to replace right now?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>7 Mistakes Every Developer Makes in 2026 — And the Open-Source Fix for Each</title>
      <dc:creator>Tommaso Bertocchi</dc:creator>
      <pubDate>Mon, 04 May 2026 10:59:30 +0000</pubDate>
      <link>https://dev.to/sonotommy/7-mistakes-every-developer-makes-in-2026-and-the-open-source-fix-for-each-18b3</link>
      <guid>https://dev.to/sonotommy/7-mistakes-every-developer-makes-in-2026-and-the-open-source-fix-for-each-18b3</guid>
      <description>&lt;p&gt;Most "best practices" articles are useless.&lt;/p&gt;

&lt;p&gt;They tell you to "write tests" and "use environment variables" without ever showing you the specific moment those warnings actually matter. You nod along and forget them by tomorrow.&lt;/p&gt;

&lt;p&gt;This is the version with names, repos, and real consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every mistake below has a free, self-hostable open-source fix — no SaaS required.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These aren't theoretical. They're the kind of thing that causes a 3am incident, a silent data breach, or a "how did this even work" Slack thread that ends careers.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I picked these
&lt;/h2&gt;

&lt;p&gt;Not by StackOverflow survey popularity or Twitter discourse. I ranked by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost of getting it wrong&lt;/strong&gt; — does this mistake cause a data breach, an outage, or just mild annoyance?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How often developers skip it&lt;/strong&gt; — not because they don't know better, but because the fix felt annoying to set up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether a drop-in open-source fix exists&lt;/strong&gt; — something you can actually add today, not a six-month architecture project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevance to 2026 specifically&lt;/strong&gt; — AI-generated code, LLM integrations, and supply chain attacks changed what "default safe" even means&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The most dangerous developer mistakes in 2026 aren't about writing bad code — they're about skipping the invisible layers that make code trustworthy.&lt;/p&gt;
&lt;/blockquote&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/QMHoU66sBXqqLqYvGo" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Infisical — Stop hardcoding secrets, you know who you are&lt;/li&gt;
&lt;li&gt;pompelmi — Your file upload endpoint is a malware delivery service&lt;/li&gt;
&lt;li&gt;SigNoz — You're flying blind the moment you ship&lt;/li&gt;
&lt;li&gt;Atlas — Your database migrations are ticking time bombs&lt;/li&gt;
&lt;li&gt;Scalar — Your API docs are a lie and your team knows it&lt;/li&gt;
&lt;li&gt;Testcontainers — "Works on my machine" never fixed a production outage&lt;/li&gt;
&lt;li&gt;Unkey — Your API is open for abuse right now&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1) Infisical — Stop hardcoding secrets, you know who you are
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A self-hosted secrets manager that replaces &lt;code&gt;.env&lt;/code&gt; files, GitHub secrets, and the shame of finding your API key in a public repo two years later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; AI code assistants train on public repositories. If your key leaks into a commit, it's not just crawled by bots — it's potentially ingested into model training data. &lt;strong&gt;Secrets management is no longer a DevOps concern; it's an AI-era data hygiene issue.&lt;/strong&gt; Infisical gives you a centralized vault with access control, audit logs, and SDK support for Node, Python, Go, and more — replacing the &lt;code&gt;.env&lt;/code&gt; file that currently lives on 7 different machines with no rotation policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Solo devs tired of rotating leaked keys, teams onboarding new engineers, any project using more than 2 third-party APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/Infisical/infisical" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://infisical.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Infisical/infisical" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2FInfisical%2Finfisical" alt="Infisical preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/3o7TKSjRrfIPjeiVyM" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  2) pompelmi — Your file upload endpoint is a malware delivery service
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A minimal Node.js wrapper around ClamAV that scans any file and returns a typed Verdict (Clean, Malicious, ScanError). No daemons, no cloud, no native bindings, zero runtime dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Every app that accepts file uploads is one crafted &lt;code&gt;.pdf&lt;/code&gt; away from distributing malware to other users. &lt;strong&gt;With AI-generated documents now trivially easy to weaponize, most upload handlers still do zero scanning — and they're one shared file away from becoming the distribution vector.&lt;/strong&gt; pompelmi wraps ClamAV in a single function call, runs fully local (no files ever leave your server), and drops into any Node.js middleware stack in under 10 lines. It's the security layer most tutorials forget to mention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Node.js APIs that accept file uploads, SaaS platforms with user-generated content, developers who need antivirus scanning without touching a cloud vendor's data pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pompelmi/pompelmi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fpompelmi%2Fpompelmi" alt="pompelmi preview" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3) SigNoz — You're flying blind the moment you ship
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A full-stack observability platform (metrics, traces, logs) built on OpenTelemetry — a self-hosted alternative to Datadog and New Relic that doesn't send your data to a third party.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; The average developer adds a &lt;code&gt;console.log&lt;/code&gt; and calls it monitoring. Then their LLM-powered feature starts misbehaving at scale and they have no idea which requests are failing, why, or for whom. &lt;strong&gt;Observability is the difference between a 5-minute fix and a 3-hour war room.&lt;/strong&gt; SigNoz uses OpenTelemetry natively — no vendor lock-in, no 6-figure Datadog bill, and your traces stay on your own infra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams running microservices, developers building on top of LLM APIs who need to trace latency per model call, anyone who opened a surprise Datadog invoice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/SigNoz/signoz" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://signoz.io" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SigNoz/signoz" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2FSigNoz%2Fsignoz" alt="SigNoz preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/3oEjI6SIIHBdRxXI40" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  4) Atlas — Your database migrations are ticking time bombs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A schema management tool that treats your database schema like code — versioned, reviewed, and applied safely. Think &lt;code&gt;terraform plan&lt;/code&gt; but for your Postgres or MySQL schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Half the startups I've seen have migrations that were run manually once and never committed. Someone adds a column in production, forgets to update the migration file, and three months later a new engineer runs &lt;code&gt;migrate up&lt;/code&gt; and breaks staging. &lt;strong&gt;With AI assistants generating schema changes faster than ever, migration debt is compounding at a rate humans can't manually track.&lt;/strong&gt; Atlas gives you a &lt;code&gt;schema diff&lt;/code&gt;, a migration linter, and CI integration so schema changes go through the same review process as your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Postgres/MySQL/SQLite users, teams using ORMs that generate inconsistent migrations, any project where "just run this ALTER TABLE manually" has been said out loud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/ariga/atlas" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://atlasgo.io" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ariga/atlas" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fariga%2Fatlas" alt="Atlas preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5) Scalar — Your API docs are a lie and your team knows it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A beautiful, interactive API reference generator that renders OpenAPI specs as live documentation with a built-in HTTP client, dark mode, and code generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Every team I've worked with has Swagger docs that are three sprints out of date. Developers end up Slack-messaging the engineer who wrote the endpoint instead of reading docs. &lt;strong&gt;When AI coding assistants generate code against your API, stale docs don't just waste time — they produce broken integrations at scale.&lt;/strong&gt; Scalar auto-renders from your OpenAPI spec, runs as a single script tag or self-hosted service, and actually looks good enough that people open it voluntarily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; API-first teams, developer tools companies, anyone building something other developers will integrate against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/scalar/scalar" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://scalar.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/scalar/scalar" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Fscalar%2Fscalar" alt="Scalar preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://giphy.com/gifs/26tOZ42Mg6pbTUPHW" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYmtwbmdjempjZ29iNmdrNW42anZ3cTFvZnp1eGx2Nmc1bTlxbHdkbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F26tOZ42Mg6pbTUPHW%2Fgiphy.webp" height="320" class="m-0" width="480"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://giphy.com/gifs/26tOZ42Mg6pbTUPHW" rel="noopener noreferrer" class="c-link"&gt;
            Happy New Year Celebration GIF by Faith Holland - Find &amp;amp; Share on GIPHY
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Discover &amp;amp; share this Happy New Year Celebration GIF by Faith Holland with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgiphy.com%2Fstatic%2Fimg%2Ffavicon.png" width="16" height="16"&gt;
          giphy.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  6) Testcontainers — "Works on my machine" never fixed a production outage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A library (Node, Go, Java, Python, .NET, and more) that spins up real Docker containers for your tests — actual Postgres, Redis, Kafka, not mocks — and tears them down when the test finishes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Mocking your database in tests is a lie you tell yourself. The mock passes, the query fails in production because your ORM generated slightly different SQL than you expected. &lt;strong&gt;AI assistants now write most test code, and they default to mocking everything — which means your test suite looks green while the actual behavior is untested.&lt;/strong&gt; Testcontainers runs the real dependency for the duration of the test with zero local setup. No "but it worked in CI."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Backend engineers tired of flaky integration tests, teams where AI generates most test scaffolding, any project where unit tests keep missing bugs that only show up in staging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/testcontainers/testcontainers-node" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://testcontainers.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/testcontainers/testcontainers-node" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Ftestcontainers%2Ftestcontainers-node" alt="Testcontainers preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7) Unkey — Your API is open for abuse right now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An open-source API key management and rate limiting platform — create, revoke, and audit API keys with per-key rate limits and usage analytics, all via a single API call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters in 2026:&lt;/strong&gt; Most APIs either have no rate limiting or rely on a regex check on an Authorization header someone wrote at 2am. &lt;strong&gt;When AI agents start calling your API autonomously in tight loops, "no rate limit" becomes a self-inflicted DDoS from your own paying users.&lt;/strong&gt; Unkey treats API keys as first-class objects — each key gets its own rate limit, expiry date, metadata, and audit trail. You can issue temporary keys for trials, revoke them in real time, and see exactly who is hammering your endpoint before it becomes a bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; API developers who need per-customer rate limits, SaaS builders offering API access as a product feature, anyone whose API will be consumed by AI agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href="https://github.com/unkeyed/unkey" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://unkey.dev" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/unkeyed/unkey" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F1%2Funkeyed%2Funkey" alt="Unkey preview" width="1200" height="600"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://giphy.com/gifs/l0HlBO7eyXzSZkJri" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;giphy.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The mistakes that sink projects in 2026 aren't syntax errors or wrong algorithms — they're the invisible gaps in the trust layer: unscanned uploads, untracked secrets, unmonitored requests, untested integrations.&lt;/p&gt;

&lt;p&gt;That's why the best open-source tooling right now is focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making the secure path the easy path, not the expert path&lt;/li&gt;
&lt;li&gt;Replacing "just mock it" with real dependencies that actually behave like production&lt;/li&gt;
&lt;li&gt;Treating secrets, schemas, and API keys as first-class versioned objects&lt;/li&gt;
&lt;li&gt;Building observability in before you need it, not during the incident&lt;/li&gt;
&lt;li&gt;Closing the gap between AI-generated code and production-worthy code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools aren't new ideas. They're the missing defaults that should have shipped with every framework from day one.&lt;/p&gt;

&lt;p&gt;If I missed something obvious, drop it in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What mistake cost you the most hours to debug?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
