Abhishek Uniyal

Updated Sep 2026

Currently: ChargerDojo · Draftly

Forward-deployed product engineer

I embed with founders and ship the system the product actually needs.

Built to keep working past the demo.

Senior backend and platform engineer. Seven-plus years.

Three subjects, the role and the period on each, and where the evidence sits.
Subject Role Period Evidence on file
ChargerDojo Sole engineer Nov 2025 to now Live OCPI conformance runner, paying B2B customers
Zuddl (YC S20) Engineer II to senior 2021 to 2023 Webinars platform, through the $13.35M Series A
SynergyBoat Founding Engineer & CTO 2023 to now Agent platform, Dexter, DeepQuery, Draftly

TypeScript · Go · React · MongoDB · Redis · Cloudflare Workers · MCP · AWS · isolated-vm · Deno · PostgreSQL

What brings you here?

Pick whichever one sounds like you. That's your way in.

I'm hiring

I am hands-on every day. Right now I am the sole engineer on ChargerDojo, a hosted OCPI conformance runner with paying B2B customers: TypeScript and Go, MongoDB, Redis, Cloudflare Workers, AWS. The case study has the mechanisms, and I will walk you through the repository on request.

I need contract help

I work with teams two ways: forward-deployed, or on a full product build. I start from the customer problem and the data, not a specific model, and I measure the work by what ships and survives. Recent builds include DeepQuery, Dexter, and the SynergyBoat agent platform.

I want to read your thinking

I write about the engineering that gets AI into production: managing context budgets, building deterministic gates, and designing multi-agent platforms, plus the gap between a demo and a system that survives real load. Most of my writing is on Medium.

Selected work

All work →

SynergyBoat · Lead engineer, sole · Nov 2025 – present

ChargerDojo, conformance testing for EV roaming

A hosted conformance runner for the OCPI roaming protocol that I build and run alone, with paying B2B customers and a mutation harness where every check is either proven able to fail or listed as one no mutation may name.

TypeScript · Go · React · MongoDB · Redis · Cloudflare Workers · MCP · AWS

→ Read the case study

The ChargerDojo mutation harness A runner on the left calls the sim-peer on the right, which is the reference implementation. The OCPI wire between them is drawn as one lane each way with a tick per message, because the runner calls message by message rather than once. Four copies of the sim-peer hang off a bus, one per spec version. 2.1.1, where mod_cdrs says a CDR cannot change once sent, and this peer reads one back at a new total. 2.2, where status_codes says 2.2 has no hub code 4000, and this peer answers 4000 to a hub error. 2.2.1, where transport_and_format says limit=10 returns ten records, and this peer serves one object more. 2.3.0, where mod_tariffs says tax_included is required, and this peer serves a tariff without it. Each peer runs one mutation at a time. Under them a build gate stamps a tick for every mutant the checks catch, and one hold mark for a check no mutation may name, which is listed rather than proven. At the foot, dojo-connect, the Go connector, dials out through a dashed customer firewall on a WebSocket so an endpoint on a laptop can be reached. ocpi, message by message runner the runner walks a whole conversation, not one request sim-peer reference implementation copies, one per version 2.1.1 mod_cdrs: a CDR cannot change once sent this peer reads one back at a new total 2.2 status_codes: 2.2 has no hub code 4000 this peer answers 4000 to a hub error 2.2.1 transport_and_format: limit=10 returns ten records this peer serves one object more 2.3.0 mod_tariffs: tax_included is required this peer serves a tariff without it each peer runs one mutation at a time four copies of the simulator, each breaking one required rule build gate 2.1.1 2.2 2.2.1 2.3.0 listed every check is proven able to fail, or listed with a reason a tick per mutant caught, one hold mark for the unprovable check outbound websocket customer firewall dojo-connect go endpoint dojo-connect dials out through the customer firewall
version rule broken gate
wire The runner calls the peer over OCPI message by message, one lane each way, not a single request. n/a
2.1.1 mod_cdrs: a CDR cannot change once sent. This peer reads one back at a new total. caught
2.2 status_codes: 2.2 has no hub code 4000. This peer answers 4000 to a hub error. caught
2.2.1 transport_and_format: limit=10 returns ten records. This peer serves one object more. caught
2.3.0 mod_tariffs: tax_included is required. This peer serves a tariff without it. caught
listed A check no mutation may name, listed with its reason. not proven
connector dojo-connect, in Go, dials out through the customer firewall on a WebSocket so an endpoint on a laptop can be reached. n/a
Fig. 1. The mutation harness. The runner sweeps four mutant peers, each a copy of the simulator with exactly one required rule broken. A check no mutant reddens is listed rather than trusted, and the build fails if a check is neither proven nor listed. Drawn for ChargerDojo only. Nothing on this page reuses it.

SynergyBoat · Founding Engineer & CTO · 2024 – present

SynergyBoat agent platform SDK

Built the agent platform SDK behind a US EV startup's move to 150+ B2B clients, with ~40% lower per-client engineering cost and extended runway on a $2M seed.

TypeScript · MCP · isolated-vm · Deno · Redis · PostgreSQL · BullMQ

→ Read the case study

The agent platform dispatch A planner on the left decides and dispatches; it never runs untrusted code. Model-tier routing sits inside the planner: the small tier is the default, and a frontier model is chosen only when a plan exceeds a cost-or-quality budget. The planner dispatches into a sandbox boundary, drawn as a dashed enclosure. Inside it are three workers, pure function, isolated-vm, deno subprocess, which are pure functions or sandboxed routines, so a misbehaving plugin cannot take the process down. Each worker returns over a channel, and every channel carries a circuit breaker, drawn on the return path so the reader sees where a failure is stopped. The dispatch drawn here runs on isolated-vm, and its breaker closes as the result comes back. Under the planner two stores hold state: Redis for hot state and PostgreSQL for the durable audit trail, and either can be swapped without rewriting the planner graph. One edge arrives from outside the platform, labelled MCP: external AI agents reach the same workers without a new adapter. outside the platform external ai agent an outside agent reaches the same workers over mcp mcp sandbox boundary dispatch workers pure function isolated-vm deno subprocess a misbehaving plugin cannot take the process down each worker runs its plugin inside the sandbox, not in the process circuit breaker channels, one breaker on each planner llm-backed decision node never runs untrusted code model tier small the default frontier over budget the planner decides and never runs untrusted code itself pluggable state redis hot state postgresql audit trail state is pluggable: hot state in redis, the audit trail in postgres
part what it does
planner An LLM-backed decision node. It dispatches to workers and never executes untrusted code itself.
model tier Routing sits in the planner. Cheap calls default to smaller models; escalation to a frontier model happens only when a plan exceeds a cost-or-quality budget.
pure function A worker that is a plain function.
isolated-vm A sandboxed routine, run in an isolated VM.
deno subprocess A sandboxed routine, run in a Deno subprocess.
sandbox Workers run inside it, so a misbehaving plugin cannot take the process down.
channel Carries the result back to the planner. Every channel has a circuit breaker on it, drawn on the return path.
redis Hot state.
postgresql The durable audit trail.
state Pluggable. Either store swaps without rewriting the planner graph.
mcp External AI agents reach the same workers over MCP, without a new adapter.
Fig. 1. The agent platform. A planner decides and dispatches; it never runs untrusted code. Workers run inside a sandbox boundary, and every channel back carries a circuit breaker. State is pluggable, Redis for hot and PostgreSQL for the audit trail. Drawn for the agent platform only. Nothing on this page reuses it.

SynergyBoat · Founding Engineer & CTO · 2024 – present

DeepQuery, plain-English access to your databases

Teams sit on databases their non-technical people cannot query. We built DeepQuery for one client's operations team: it discovers a schema and answers plain-English questions across Postgres, MySQL, and Mongo. It runs their reporting in production, and SynergyBoat is now making it a product other clients can point at their own databases.

TypeScript · PostgreSQL · MySQL · MongoDB · OpenAI

→ Read the case study

The DeepQuery context budget A question typed in plain English, customers from last month, enters at the top, asked by the operations team rather than by an engineer. Intent classification maps it to a small set of query shapes: analytics-style aggregates, lookup by entity, time-series comparisons, or ask me more, which punts when confidence is low. Schema retrieval feeds the context with pre-computed digests, discovered across all three databases, so the prompt never carries a full schema dump. Value resolution turns last month into concrete dates and premium users into a resolved filter, before the model generates. Below them a context budget bar fills toward an 8K-token ceiling, drawn as a hard line, and stops short of it. The budget is enforced upstream, so the model never has to decide what to drop. Query generation runs last: the model is called only after the budget stops. The query then routes to the matching database: PostgreSQL for users and billing, MySQL for a legacy product system, and MongoDB for event logs. The route drawn here reaches PostgreSQL, which holds users and billing. question, in plain english customers from last month a sentence from the operations team, not a chat box from the operations team intent classification a small set of query shapes aggregate, lookup by entity, time-series, or ask me more, which punts when confidence is low schema retrieval pre-computed digests discovered across all three databases, never a full dump value resolution before the model generates last month becomes dates, premium users becomes a filter every stage puts something in the context before the model is called context budget 8k tokens ceiling stops here stays inside enforced upstream, so the model never decides what to drop the fill stops short of the ceiling, and the gap is measured query generation the model is called here last, after the budget has already stopped routes to the matching database postgresql users and billing mysql legacy product system mongodb event logs the query goes down the one database that holds what was asked
part what it does
question Plain English, from the operations team rather than an engineer. The one drawn is customers from last month.
intent classification Maps the request to a small set of query shapes: analytics-style aggregates, lookup by entity, time-series comparisons, or ask me more.
ask me more The branch that punts when confidence is low.
schema retrieval Pre-computed digests, discovered across all three databases, so the prompt never carries a full schema dump.
value resolution Resolves ambiguity before the model generates: last month becomes concrete dates, premium users becomes a resolved filter.
context budget The ceiling is 8K tokens. The context fills toward it and stops short, enforced upstream, so the model never has to decide what to drop.
query generation Runs last. The model is called only after the budget stops.
postgresql Users and billing. The query drawn here routes here.
mysql A legacy product system.
mongodb Event logs.
Fig. 1. The context budget. A question is classified, the schema is discovered, and the context fills toward an 8K-token ceiling and stops before the model is called. The query then routes to the matching database. Drawn for DeepQuery only. Nothing on this page reuses it.
  1. 2026 – present

    Draftly, a multi-agent AI content platform

    SynergyBoat · Next.js · Bun · Hono · Postgres + pgvector · BullMQ · Remotion · MCP Live

    Founding Engineer & CTO

  2. 2025 – present

    Dexter, an enforcement layer for AI coding agents

    SynergyBoat · TypeScript · ts-morph · AST analysis · VS Code extension Live

    Founding Engineer & CTO

  3. 2024 – 2026

    HirePulse, an agentic recruiting platform

    SynergyBoat · TypeScript · Hono · BullMQ · Supabase + pgvector · Plivo · Deepgram Live

    Founding Engineer & CTO

How I work

AI is a value-add, not a reason. The product still has to make sense to the customer without it.

I build the system a product actually needs, then stay until it works in production. Seven-plus years across YC-backed startups and founding-stage teams taught me that the gap between a demo and a system is everything the pitch deck leaves out: real users, production load, the constraints nobody scoped. I start from the customer problem and the data, not the model. The work is technical; the reason it exists is not.

Forward-deployed and product-engineering work with founders shipping AI into production. Selective fractional-CTO too.

Open to forward-deployed, product-engineering, and fractional-CTO conversations.

Planner and workers diagram A central planner node surrounded by six worker nodes connected by spokes, the shape of the orchestration this section describes. The workers are scraper, ast-edit, sandbox, text→sql, mcp, eval. scraper ast-edit sandbox text→sql mcp eval planner

Contact

If something here made you think "I want to work with this person," the fastest way is an email.

Or read more about me · Contact.