Portfolio

I build the systems that run the business,
not just the demo of one.

Over the past months I designed, built, and now personally operate a full stack of production software for a real cold-calling sales business — from the CRM the reps use every day down to the AI agents and self-healing infrastructure that keep it all running. Below is the full list, not just the highlight reel.

Ask me directly

Don't want to read through all 25 projects? Ask — it answers from my real CV, goals and project write-ups, and says "I don't know" instead of guessing.

The quick buttons above answer instantly, for free, from fixed text. Typed questions go to a small AI (Groq, free tier) that only answers from my real CV/portfolio — limited to a few questions per visitor per day to keep it available for everyone.

Everything, at a glance

25 systems across five areas — six of them public on GitHub, linked below. The detailed write-ups follow; this is the map.

25systems shipped, solo
100k+records processed in production
24/7self-healing, unattended infra
100%precision & recall, measured, on the security tool

The full list

Every system, filterable. Smaller in scope than the four case studies above, but each one is a real, independently working subsystem — not a stub.

Lead Scoring & ICP Engine

Two deliberately independent scoring layers — a geometric-mean need/budget/reachability score, and a separate ICP-fit score with its own confidence metric — so one can never silently overwrite the other's meaning.

TypeScriptScoring models

Multi-Source Data Fusion Layer

Merges signals from several independent observation sources into one profile per contact — and reports "how much do we know" (confidence) separately from "how fresh and complete is it" (quality) instead of blending them into one misleading number.

Data engineeringNode.js

Hiring-Signal Detection

Parses a business's own website for hiring activity, ad-spend evidence, tech stack, and multi-location signals — extracting more from data already being fetched instead of paying for a new third-party source.

Web scrapingSignal extraction

Two-Channel Call Audio Pipeline

Splits recorded calls into separate customer/agent audio channels before transcription. Single-channel transcription let the model guess who was speaking from context alone — measurably less accurate once compared side by side.

Audio processingWhisper

AI Call Review & Coaching Loop

LLM-generated feedback for sales reps, gated behind a human approve/edit/reject workflow before a rep ever sees it — plus a deliberately "blind" grading mode so a review isn't biased by seeing the AI's verdict too early.

LLM evaluationWorkflow design

Multi-Channel Outreach Orchestration

Coordinates email (mailbox warm-up ramp across a rotating pool), a queued/human-sent LinkedIn channel, and a channel-comparison layer that explicitly labels which numbers are measured vs. self-reported.

Email deliverabilityGrowth engineering

Controlled Experiment Framework

A test-cohort system with independent locks that keep test leads out of every production automation, plus a self-releasing batch mechanism that scales exposure with real call volume — no one has to click a button to advance it.

ExperimentationFeature flags

Custom MCP Tooling

Built Model Context Protocol servers exposing read-only business data and a security-testing toolkit to an LLM agent, with scope-gated safety defaults that stay off by default until explicitly widened.

MCPTool design

Human-in-the-Loop Agent Control

A Telegram-based approval bridge that lets a long-running autonomous agent pause and ask a real human before any money-, access-, or direction-level decision, then resumes automatically once answered.

Telegram Bot APIAgent safety

Model / Effort Routing Policy

A scored, versioned policy deciding which LLM and how much reasoning effort a task should get, across eight escalation signals — instead of re-guessing per task or defaulting to the most expensive model every time.

LLM opsPolicy design

Self-Healing Task Watchdog

A separate monitor that checks whether the checker is still alive — built after a background daemon died silently for three days while every scheduled job still displayed as "configured."

Reliability engineeringWindows Task Scheduler

Authorized Security-Testing Toolkit

Wraps industry-standard recon tools (nmap, nikto, sqlmap, whatweb) behind a scope-gated safety layer that defaults to local/private targets only — used for personal bug-bounty and pentesting practice.

Security toolingPython

Compliance-Aware Call Windowing

A legal calling-hours check, kept strictly separate from reachability scoring — the two answer different questions, and conflating "unlikely to answer" with "not allowed to call" would quietly throw away good leads.

Compliance engineering

Inbound Call Routing with a Hard Fallback

A rep pool rings first on every inbound call, with a server-enforced lock that forces a voicemail fallback regardless of what any dashboard toggle or database row says — the safety property lives in code, not in configuration.

TelephonyFail-safe design

Weekly Niche-Focus Controller

Rotates which market segment the whole calling operation focuses on each week, driven by measured rep success rates instead of a self-assigned fit score that turned out to reward its own assumptions.

Data-driven ops

YouTube Research Pipeline

RSS-based channel monitoring with no paid API, feeding an LLM pipeline that automatically extracts business and engineering lessons from long-form video content.

RSSLLM summarization

Fahm — Arabic Vocabulary App

A single-file, build-free web app for learning Quranic Arabic vocabulary: 500+ words, word-by-word sentence breakdowns, and custom vocabulary import. Shipped and live at a public URL.

Vanilla JSShipped product

Early projects — where it started

A chess engine, a crypto-trading backtester, and a handful of classic learn-to-code exercises (calculator, Hangman, a text adventure). Kept private now, but this is the actual starting point for everything above.

PythonLearning journey
teamgoldllc.de homepage: dark layout with a gold headline reading Websites that rank.

teamgoldllc.de — Bilingual Marketing Site

The public site for the business the systems above serve — full EN/DE translations with correct hreflang, four JSON-LD schema types, and a font-loading strategy that doesn't block first paint. Live at teamgoldllc.de →

Reacti18nJSON-LD

Security & infrastructure

Everything above runs on two servers I administer myself — a Windows box and an Ubuntu ARM instance in Oracle Cloud. Not a managed platform where hardening is somebody else's job.

Least privilege, enforced by the OS

The agent service runs as its own unprivileged user with no sudo, inside a systemd sandbox: home directory read-only, and an explicit allowlist of the few paths it may write to. A compromised agent process cannot reach anything it was not handed.

Reduced attack surface

SSH password authentication disabled entirely — keys only, one per machine so access can be revoked per device rather than all at once. Host firewall and fail2ban in front of it. Debug and automation ports bind to loopback, never 0.0.0.0 — the difference between a local tool and an open service.

Secrets never live in the repo

Credentials sit in the OS keystore, not in files. That rule is enforced by a tool rather than by discipline: git-secret-scan blocks the commit, and the same check runs again in CI for anyone who skipped the hook.

Scanning tools with a scope gate

The security tooling (nmap, nikto, sqlmap and friends) is wired up behind a target check that refuses anything outside localhost and private ranges unless it is deliberately unlocked. An LLM-driven scanner without that gate is one bad prompt away from scanning a stranger.

What locking myself out actually taught me

The sandbox allowlist above was, at first, too tight. A legitimate tool started failing with a permission error, and the obvious reading was "the tool is broken" — it wasn't. My own hardening was denying a write path the tool genuinely needed.

The fix was to point the tool at a directory inside the sandbox rather than to widen the sandbox, so the restriction stayed intact. That is the part worth keeping: the failure mode of good hardening is that it breaks your own things first, and the temptation every time is to loosen the rule instead of moving the thing. I have done this to myself more than once — port changes, firewall rules, key-only SSH — and each time the useful question was "what exactly is being denied, and why", never "how do I turn this off".

None of this is a certification. It is two servers I keep running in production, where the blast radius of getting it wrong is my own business.

systemd hardeningSSH key-only auth ufw / fail2banLeast privilege Secrets managementnmap / nikto / sqlmap Linux (Ubuntu ARM)Windows Server

Skills & stack

What actually shipped the systems above — not an aspirational list.

Languages

TypeScriptJavaScript PythonSQL Bash / PowerShell

Application & Data

Next.jsReact Node.jsSupabase / Postgres REST API designPlaywright

AI & Agents

Claude Agent SDKMCP (Model Context Protocol) Multi-agent orchestrationLLM voice agents Prompt & policy designWhisper / audio pipelines

Voice & Messaging

Telnyx voice APIWebRTC Telegram Bot APIResend (email)

Infra & Ops

Windows Task SchedulerGit / GitHub VercelReliability & watchdog design Security tooling (nmap, sqlmap, nikto)

Try it yourself

Three pieces of the real logic above, ported to run in this page — open by default. Collapse one if you'd rather scroll past it than poke at it.

1 · The lead-scoring bug that made a ranking useless

The CRM decides who gets called next. The first version multiplied need × budget × reachability — mathematically reasonable, and it quietly destroyed the ranking. Drag the sliders.

70
60
45
Old — raw product 0 tier —
New — geometric mean 0 tier —

Every possible lead, both formulas

score 01000

All 9,261 combinations of the three inputs in steps of 5, bucketed into 20 bins. Grey is the old formula, gold the new one. This is a property of the two formulas, not a claim about anyone's data.

On the real dataset the collapse was measured: 9,400 of 59,725 leads landed on the identical score 35. A ranking that puts thousands of leads on one point is not a ranking, and the dialer only ever loads the first page of it.

2 · The secret scanner — paste something and watch

The real patterns from git-secret-scan, ported to JavaScript for this page. Four lines are pre-filled, each producing a different verdict — a catch, a placeholder, the prose that caused a real false positive, and an explicit opt-out.

Runs entirely in your browser. This page makes no network requests of any kind — nothing you type leaves it.

3 · Offset vs. cursor pagination — the Lead Generation Pipeline's real bug

Paging through a list ordered "newest first" with a plain OFFSET while the table keeps changing underneath the scan. Press play — both lanes read the same 11 rows, the same two writes happen mid-scan (a row inserted, then a row deleted), and only one lane gets it right. The general-purpose fix is on GitHub as postgrest-keyset-page — cursor pagination for any PostgREST-style REST API, with the failure reproduced live in its own test suite.

OFFSET n LIMIT 30 duplicates · 0 skipped

WHERE id < last_seen LIMIT 30 duplicates · 0 skipped

Row 11 gets inserted, then row 6 gets deleted — both mid-scan, exactly the timing that broke this in production.

This is the real mechanism, run live — not a recorded outcome. On the actual dataset it was measured directly: a 20-minute scan with 43 concurrent inserts produced exactly 20 duplicate reads under offset pagination. The skip direction shown above is the same mechanism in reverse, reproduced separately — it wasn't caught in that specific measurement window, which is itself the point: a silently skipped row doesn't show up as an error, only as a gap you'd have to already know to look for. Every long-running scan in that codebase now pages by a stable cursor instead (scripts/lib/blaettern.mjs).

Code

Three real patterns from the systems above (renamed, generalized — no business data), and one small tool you can actually run.

scoring.ts
// Priority score: geometric mean, not a raw product.
// A raw product crushed almost the whole dataset toward zero;
// reachability acts as a multiplier band, not a third equal factor.
const core   = Math.sqrt((need / 100) * (budget / 100));
const factor = 0.5 + (reachability / 100) * 0.8;
const priority = Math.min(1000, 1000 * core * factor);

Fixed a bug where thousands of leads landed on the exact same score — the dialer's "best next call" was silently random.

paginate.ts
// Offset pagination breaks under concurrent writes: rows get
// skipped or duplicated mid-scan. A cursor doesn't care what
// happened before it — it only knows the last id it saw.
let lastId = 0;
while (true) {
  const rows = await db.query(
    `select * from contacts where id > $1 order by id asc limit $2`,
    [lastId, PAGE_SIZE]
  );
  if (rows.length === 0) break;
  process(rows);
  lastId = rows[rows.length - 1].id;
}

Two "complete" scans of the same table were quietly returning different totals until this replaced a plain offset loop.

safety-lock.ts
// "Off" always means off — not "off unless five different
// code paths all happen to agree." Every response is rewritten
// through one choke point before it's ever sent.
function sendInboundResponse(xml: string): string {
  if (INBOUND_AI_LOCKED && containsAiAssistant(xml)) {
    return VOICEMAIL_FALLBACK_XML; // hard override, not a suggestion
  }
  return xml;
}

The safety property lives in code, at a single choke point — not spread across a dashboard toggle, a database row, and a config flag that all have to agree.

Six repositories are public, each with a README that explains the trade-offs — git-secret-scan is a Featured system above, measured recall 80 %→100 %. gh-radar · yt-transcript · postgrest-keyset-page · gitingest · fahm

147tests, real CI runs across the repos that ship a suite
98%line coverage on git-secret-scan
3×3OS × Python-version CI matrix

How I work

I build fast by directing AI coding agents deliberately — writing the specification, setting the guardrails, and verifying the result — rather than typing every line by hand. That's a real, current skill: the systems above aren't demos, they run a real business every day, and treating "the agent said it's done" as a claim to verify rather than a fact was the single habit that mattered most in building them.

No customer data, phone numbers, or business metrics appear anywhere on this page or in the linked repositories — the projects above are described by their architecture and the problems they solved, not by their private source. Numbers are rounded, not exact.

Background

I didn't come to this through a computer science degree. The short version:

No university degree — what replaced it was building real systems, operating them, and fixing what broke.

Get in touch

Based in Germany, open to engineering roles. Booking a slot is the fastest route — pick a time and it is in both calendars.