Bingo
Jonathan Adams AI Engineer · Indianapolis

I ship production LLM systems
in regulated domains.

Sole architect of Bingo Claims — and forward-deployed consulting engineer to a national benefits administrator, where I delivered AI service intake and IT-operations observability across their enterprise platform estate. Available now for AI engineering roles where independent execution and end-to-end ownership matter.

Interviewing now Open to remote Available in 2–4 weeks
Jonathan Adams
Ships AI agents to production
Enterprise-grade AI agents with custom tool use, bounded cost & latency, confidence-routed handoff to humans
Full-stack builder
AI agent, backend, infrastructure, and frontend — every layer mine
Built for scale
Architectures designed for millions of records — partitioning, caching, async pipelines
Compliance-aware
SOC 2 posture, HIPAA-ready architectures, signed audit trails by design
Selected work

Three things I’ve shipped that show how I think.

Each one is a different lesson — about product, about engineering taste, about what it takes to run infrastructure end-to-end.

01
Bingo Claims
What it is
An AI tool that helps health-insurance claim processors do their job faster and with fewer mistakes. It reads the official health-plan documents, turns them into something searchable, and answers the processor’s questions about coverage — with the exact source highlighted on every answer.
How it works
Built on enterprise-grade AI agents with custom tool use. Every answer comes with a clickable citation pointing at the exact paragraph it came from. Before the processor can move forward, they have to open each citation and confirm it’s right — so the human stays accountable for the decision and the AI just does the legwork.
What it proves
Tested across four real health plans, every AI citation pointed at the exact spot in the source where the answer lived. The system reads a 265-page plan document in under half a minute, and it’s built to handle millions of plans without slowing down.
02
Bingo Brain
What it is
An AI tool that turns the messy work inside a company — the spreadsheets, the SharePoint files, the steps people only know in their heads — into one clear, living guide the team follows and the AI runs alongside them.
How it works
It connects to wherever the company already keeps its information. Picks the workflow that’s slowing the team down the most. Turns it into a step-by-step guide that updates itself as the underlying data changes. Three built-in views — a daily briefing for executives, a project tracker for managers, and a search-and-answer surface for everyone else.
Who it’s for
Built for executives who want a clear return on a specific painful workflow, not a vague “AI initiative.” Sold as a 30-day pilot — one workflow built and proven up front, then expanded one piece at a time.
03
Self-hosted production cluster
3 servers · self-hosted · production
What it is
Three servers I own, networked together in my office, running every product I’ve shipped. One handles the websites and dashboards. One has a graphics card and runs the AI workloads. One handles the supporting tools that keep everything else moving.
How it stays up
Designed to keep itself running without my supervision. Nothing on the internet can talk to it directly — every request comes through a secured tunnel. Passwords are kept separate from the application code. When a service crashes, it restarts automatically. Pushing a new version takes one command; rolling back takes one command.
Why it matters
Proves I can own the whole stack — not just write code, but ship it, run it, and keep it running 24/7. The same three servers power the customer-facing AI products and the internal tools I use to build them.
Ubuntu 24.04 LTS systemd Cloudflare Tunnel PyMuPDF · pdfplumber Celery + Redis PostgreSQL 16 MinIO GPU inference Zero-trust ingress One-command rollback
Stack

The full stack — end to end.

Production-grade across the AI layer, the application layer, and the infrastructure underneath. Tools I’ve shipped with, not just touched.

AI / LLM Engineering
Enterprise-grade AI agents Tool-using agents Knowledge graphs BM25 retrieval Structured extraction Confidence routing PyMuPDF · pdfplumber Embeddings (OpenAI) LiteLLM / OpenRouter gateways Prompt engineering
Backend & Data
Python 3.12 FastAPI async SQLAlchemy 2.0 Pydantic v2 PostgreSQL 16 Redis Celery MinIO · S3 Partitioning at 3M+ scale Migrations · referential integrity
Infrastructure & Networking
AWS (EC2 · S3 · RDS · IAM · VPC) Ubuntu 24.04 LTS systemd Cloudflare Tunnel Zero-trust ingress Active Directory SAML / SSO GPU compute VMware vSphere · Nutanix Observability (DataDog · journald)
Security & Compliance
SOC 2 Type II HIPAA-ready architectures No-PHI dev environments Immutable audit trails Secrets management · least privilege Defense-in-depth
Frontend & Visual Design
TypeScript · React HTML · CSS PDF.js with scale-factor alignment Compliance-critical UI workflows Adobe Photoshop · Illustrator Premiere Pro 10+ yrs design / photo / video
How I overcome hard problems

Four times I broke through a stuck system.

Real challenges from production work, the move I made to clear them, and what shipped on the other side. Tap any title to read the full piece.

01 Couple the highlight to the excerpt The card said one thing. The PDF highlighted another. The fix wasn’t a smarter algorithm — it was removing a degree of freedom. Apr 2026 +

What I was up against

The verification step in Bingo Claims has to be airtight: a processor asks the AI a question, gets back three citations, and clicks through to confirm each one. The system was showing the right answer on the citation card — and then landing on a completely different paragraph in the source document. I needed the card and the source view to point at the same place, every time, with no exceptions.

How I worked through it

I traced both halves of the trust chain — the card view and the source view — and realized the right move wasn’t to make either one smarter. It was to remove the gap between them. I rebuilt the source-highlighting layer so it can only ever look inside the same passage the card is already showing. The two views can’t disagree, because the code physically won’t allow it.

Python
# Step 1 — extract the exact window the card is about to show.
def _find_excerpt_window(content, query_terms, max_chars=240):
    """Densest cluster of query hits — the same window the card displays."""
    stripped = content.strip()
    if len(stripped) <= max_chars:
        return 0, len(stripped)

    lower = stripped.lower()
    best_start, best_hits = 0, -1
    for start in range(0, len(stripped) - max_chars, 40):
        snippet = lower[start : start + max_chars]
        hits = sum(snippet.count(q) for q in query_terms)
        if hits > best_hits:
            best_hits, best_start = hits, start
    return best_start, best_start + max_chars


# Step 2 — highlight picker now takes the WINDOW, not the whole section.
# It physically cannot search outside what the card is showing.
def _pick_highlight(excerpt_window, answer, query_terms):
    # tier cascade runs inside excerpt_window only — WYSIWYG by construction
    ...

What shipped

  • 17 out of 17 citations across four real plans landed inside the excerpt window — verified programmatically
  • Net code down — four helpers deleted, one added
  • The next eight rounds of correctness work followed the same approach: change the contract, delete code

What I took away

When a class of failure won’t close, the fix usually isn’t a smarter component. It’s removing the degree of freedom that made the failure possible at all.
02 Let the model name its own evidence Eleven rounds of patching the system’s guesses. Then we stopped guessing and asked the model directly. Apr 2026 +

What I was up against

I’d been chasing the same class of bug across eleven rounds of patches. The pattern would shift — a different question, a different section, a different wrong sentence — but the bug kept reappearing in a new disguise. I needed to break the pattern, not patch it again.

How I worked through it

I stepped back and asked what the system was actually doing. The backend was working hard to guess which sentence the AI meant — using nearby words, scoring rules, defensive guards. None of those guesses had access to the one source of truth that mattered: the AI itself. So I changed the contract. Now the AI declares its evidence directly, inline with the citation. The backend stopped guessing and started checking.

Python
# Before: backend guesses which sentence the model meant.
# Five tiers, four guards, nine heuristics. Failed quietly on edge cases.
highlight = _pick_highlight_from_answer(content, answer, section_id, query_terms)


# After: model emits the verbatim quote inline with the citation marker.
# Backend just verifies the substring belongs in the cited section.
def verify_quote(quote: str, section_text: str) -> bool:
    """Whitespace-tolerant substring check. One line. Zero heuristics."""
    return _normalize(quote) in _normalize(section_text)


# Citation payload from the model now looks like:
#   {"section": "1848", "quote": "Members have 30 days to file a claim..."}
# The "which sentence?" question is answered at write time, not inferred at read time.

What shipped

Nine downstream heuristics collapsed into a single check. The class of bug stopped reappearing. The whole verification path got simpler and faster.

What I took away

When ten rounds of fixes haven’t closed a class of failure, the answer is upstream. Stop teaching the system to guess what the model meant. Make the model tell you.
03 Capability is not a workflow The product had every feature it needed — spread across four tabs nobody used in the order the work actually flowed. Apr 2026 +

What I was up against

The app had every feature a claims processor needed, but the features were scattered across four separate tabs. Watching real users showed me the obvious: nobody was working in the order the tabs implied. The product was technically complete and operationally exhausting at the same time.

How I worked through it

I rebuilt the workspace as a single master dashboard with three swap-in-place states — idle queue, claim case, member call — under one persistent header with global search and a KPI strip. The processor never has to leave the surface they’re working on; the surface adapts to whatever they pick up next.

JavaScript
// One container, three states swap inline.
function setActiveCase(kind, id) {
  switch (kind) {
    case 'idle': return renderQueue();        // landing + activity
    case 'case': return renderClaim(id);      // adjudicate + verify
    case 'call': return renderMember(id);     // member coverage call
  }
}

// "Done & Next" closes the case and drops back to IDLE for the next item.
async function completeAndContinue(action, id) {
  await fetch(`/api/review/${id}/action`, { method: 'POST', body: action });
  await refreshQueue();
  setActiveCase('idle');  // clean slate, processor moves on
}

What shipped

Built across four parallel feature branches in separate git worktrees, merged through an integration branch, then to main. The whole rebuild went out in one release without breaking the live product underneath.

What I took away

Five features that do the right thing aren’t a product — they’re an admin panel. The product is the path through them.
04 Verification as a primitive, not a feature Why every AI answer in a regulated domain has to be one click and one signature away from its source. Apr 2026 +

What I was up against

In a regulated workflow, the AI is not the decision-maker. The human is. I needed every AI output to be one click and one signature away from its source — and I needed the system to refuse to advance until that happened. No friction worth skipping. No way to skip even if you wanted to.

How I worked through it

I built verification into the core data model, not on top of it. Every AI answer carries a citation. Clicking the citation opens the source with the exact passage highlighted in place. The processor reads it, initials a confirmation, and only then does the next step unlock. The system literally does not let the work continue until the trust chain is complete.

JavaScript
// The next-step button stays disabled until every citation is signed off.
function canAdvance(step) {
  return step.citations.every(c => c.viewed && c.initialed);
}

// Citation click opens the source in-place and starts the sign-off flow.
function onCitationClick(citation) {
  openSourceWithHighlight(citation.section, citation.quote);
  citation.viewed = true;
  promptForInitials(citation);  // signed audit row written on submit
}

What shipped

Every decision in Bingo Claims now carries a signed audit trail tying a specific human to the specific source they verified. Compliance and engineering don’t have to argue about whether the AI is reliable — the audit trail tells them which human made which call against which evidence.

What I took away

In high-stakes work, trust isn’t something the AI earns over time. It’s something the workflow guarantees on every single step.
Open to

What I’m looking for.

AI Engineer Building production AI systems in high-trust domains — healthcare, legal, finance, compliance, or any regulated industry where AI outputs need a verifiable chain of custody.
Applied Engineer Working inside the platforms, frameworks, and developer experience that make production LLM systems easier to ship.
Founding Engineer Series A/B AI startups, founder-hired, where ownership runs from product strategy through production deploy.
Title AI Engineer · Applied Engineer · Founding Engineer
Location Indianapolis, IN
Remote Open to remote · open to relocate for the right team
Available Within 2–4 weeks
Status Interviewing now
Education B.S., Information Systems — University of Indianapolis

Let’s talk.

Fifteen minutes is enough to know if it’s a fit.