ExtensionReach
Lead discovery and growth platform: four runtimes on one database, three AI agents with 31 tools.
- Role
- Sole developer, internal tool
- Period
- January to May 2026
- React 18
- TypeScript
- Supabase
- Deno
- Chrome MV3
- OpenAI
- Claude auf AWS Bedrock
- Vercel
- GitHub Actions
What it does
Beyond the first paragraph this page is still in German. A full translation is on its way.
Built to solve my own distribution problem: who are the right people to talk to, what about them can be backed by a source, and how does that become a message that is not a mail merge. Four runtimes share one database: a PWA, two Chrome extensions and fifteen Edge Functions, plus eight GitHub Actions workflows. Three agents with 31 function-calling tools research, check claims against sources and draft messages. The core is not the AI but the boundary around it: the agents may prepare everything and send nothing, every message to a real person needs a release in the interface, and every generated claim gets a second, independent check before it is stored.
Gebaut, um das eigene Distributionsproblem zu lösen: Wer sind die passenden Ansprechpartner, was ist über sie belegbar, und wie kommt daraus eine Nachricht, die keine Serienmail ist.
Vier Laufzeitumgebungen teilen sich eine Datenbank: eine PWA, zwei Chrome-Extensions und fünfzehn Edge Functions, dazu acht Workflows in GitHub Actions. Drei Agenten mit insgesamt 31 Function-Calling-Tools recherchieren, prüfen Aussagen gegen Quellen und schreiben Entwürfe; einer davon streamt über SSE durch einen zweifach authentifizierten Bedrock-Proxy. Die Ansprache auf LinkedIn läuft manuell und in menschlichem Tempo; die Agenten bereiten vor, ein Mensch gibt jede Nachricht frei.
Der Kern ist nicht die KI, sondern die Grenze um sie herum: Die Agenten dürfen alles vorbereiten und nichts absenden. Jede Nachricht an einen echten Menschen braucht eine Freigabe in der Oberfläche, jede erzeugte Behauptung einen zweiten, unabhängigen Prüfschritt, bevor sie gespeichert wird. Ein Sprachmodell erzeugt Plausibles, nicht Wahres, und die Prüfung gehört deshalb nicht in denselben Aufruf.
Numbers
- runtimes on one database
- 4 runtimes on one database
- function-calling tools
- 31 function-calling tools
- platforms leads come from
- 9 platforms leads come from
Screenshots





Eine fremde Oberfläche ist keine Schnittstelle
LinkedIn ist eine React-Single-Page-App mit gehashten Klassennamen, und ein .click() löst dort nichts aus: Die Handler hängen an Pointer- und Mausereignissen mit echten Koordinaten. Die Extension sendet deshalb die vollständige Folge aus pointerdown, mousedown, pointerup, mouseup und click mit den Koordinaten des Zielelements, und erkennt Schaltflächen über aria-label statt über Klassennamen, weil semantische Attribute länger halten. Der Schritt, der am meisten gelehrt hat, kam danach: Ein Dropdown liess sich nicht auslesen, weil zwei Skript-Einspritzungen, eine zum Öffnen und eine zum Lesen, den Zustand dazwischen verlieren. Die Lösung war ein einziger injizierter Aufruf, der innerhalb der Seite auf das Rendering wartet und erst dann zurückmeldet. Aus einer Schleife mit Timeouts wurde ein Aufruf mit einer Antwort. Die Grenze zwischen zwei Ausführungen ist eine echte Grenze; wer sie übersieht, sucht den Fehler in der eigenen Logik.
Stack
- Runtimes
- React 18
- TypeScript
- PWA
- zwei Chrome-Extensions nach Chrome MV3
- Service Worker mit Job-Queue
- Seitenpanel
- Vercel
- Database
- Supabase
- Postgres mit 34 Tabellen
- 38 Migrationen
- Row Level Security je Rolle
- Realtime
- Storage
- Edge Functions
- 15 Funktionen in Deno
- Bedrock-Proxy mit SSE
- Signaturprüfung für Webhooks
- pg_cron
- AI and research
- Claude auf AWS Bedrock
- OpenAI
- Perplexity
- 31 Function-Calling-Tools
- Fact-Check als zweiter Aufruf
- External services
- Apify
- RapidAPI
- Apollo.io
- Telegram
- HubSpot
- Smartlead
- Operations
- GitHub Actions als Zeitsteuerung
- Playwright als Renderer auf dem Runner
Status and reading
Development stopped in May 2026 and not continued. Repository private, access on request.