Skip to content

Terminal

david@ddiscua.dev — zsh

Real input. Try `help`. Nothing is logged, including your typos.

Systems that shipped

Client work. I describe what changed, not how their systems are wired inside, since that part is theirs. Open any row for details. The systems I can draw in full are in the next section.

Houston, we have a problem.

A made-up Friday with a real failure: the autoscaler eats every database connection. It replays on a loop. Nobody got fired.

Rather have this talk before the pager goes off?

Book an architecture review
oncall@prod — SEV1 · payments
  1. oncall@prod: kubectl get pods -n payments
  2. NAME READY STATUS RESTARTS
  3. api-7c9f4d8b6-x2kq9 0/1 CrashLoopBackOff 14
  4. api-7c9f4d8b6-p8mz1 0/1 CrashLoopBackOff 13
  5. … 38 more, all of them unhappy
  6. oncall@prod: kubectl logs deploy/api -n payments --tail=2
  7. FATAL: too many connections for role "api"
  8. FATAL: remaining connection slots are reserved
  9. oncall@prod: kubectl rollout restart deploy/api -n payments
  10. deployment.apps/api restarted
  11. oncall@prod: # 40 pods restarted. 40 pods. Still on fire.
  12. oncall@prod: echo "Houston, we have a problem."
  13. Houston, we have a problem.
  14. oncall@prod: escalate --to architect --sev 1 --reason "it's Friday"
  15. → paging ddiscua … acknowledged in 00:42
  16. → handoff: payments · postgres · autoscaler · 17:58
  17. ddiscua@advisory: kubectl get hpa,pdb -n payments
  18. hpa/api cpu 91% / 70% replicas 40 / 40 (max 40)
  19. pdb No resources found in payments namespace.
  20. ddiscua@advisory: psql -c "show max_connections" -c "select count(*) from pg_stat_activity"
  21. max_connections 500
  22. count 500
  23. ddiscua@advisory: # 40 pods × 25 pool = 1000 wanted, 500 exist. The autoscaler was the DDoS.
  24. ddiscua@advisory: helm upgrade api ./chart --set pgbouncer.enabled=true,pool.size=8,hpa.max=24,pdb.minAvailable=2
  25. Release "api" has been upgraded. Happy Helming!
  26. ddiscua@advisory: watch -n1 'psql -tc "select count(*) from pg_stat_activity"'
  27. 500 → 312 → 188 → 96 → 94
  28. ddiscua@advisory: curl -s https://api.example.com/health | jq -c '{status, p99_ms, errors}'
  29. {"status":"ok","p99_ms":88,"errors":0}
  30. ddiscua@advisory: git commit -am "fix(payments): pgbouncer, bounded HPA, PDB. No mention of Friday."
  31. [main 4f1c2a9] fix(payments): pgbouncer, bounded HPA, PDB. No mention of Friday.
  32. ddiscua@advisory: echo "Houston, the problem was between the autoscaler and the connection pool."
  33. Houston, the problem was between the autoscaler and the connection pool.
  34. ddiscua@advisory: # next time: /advisory, before the pager.

Lab

Stuff I build for myself. No client, no deadline. One of these runs. The other is still a design, mostly because designing agents is more fun than babysitting them.

lab / 01 · status: running

Prediction-market research worker

A Bun and Node worker that records Polymarket BTC markets and Binance prices in the order they arrive, paper-trades complete-set arbitrage, and can replay any past day through the same engine.

Live and replay run the same code. Fills account for fees. If the order book goes stale, a write fails, or there's a file called KILL_SWITCH on disk, it stops. Real trading is blocked in the config on purpose.

TypeScript · Bun · Node 24 · WebSockets · Zod · decimal.js · MongoDB · GCS · Cloud Run

CLOUD RUN WORKER · 1 INSTANCEbookstickseventsrecordre-runauditlatchPolymarket SDKGamma · market WSBinance WSspot · perp ticksWorkersequencer · timersEnginestate · risk · paperTick archivegzip JSONL → GCSReplay CLIsame engine, offlineMongoDBorders · fills · auditKill switchlatch · stale feeds
runtime: Bun for dev · Node 24 in the container · Cloud Run worker pool, one instance · GCS for ticks · Mongo for audit · Pino → Cloud Logging

lab / 02 · status: design · not yet trusted with kubectl

Agent mesh for the homelab

A VoltAgent supervisor that takes tasks from Telegram and hands them to a research agent or an ops agent. Everything goes through MCP, and it asks me before it touches the cluster.

Local models on Ollama first, cloud only when a task needs it. Memory in Mem0 on the homelab Postgres, so it remembers last week's incident. Every run is traced in VoltOps so I can replay it. It's still a design. The ops agent doesn't have kubectl yet.

VoltAgent · MCP · Ollama · Mem0 · pgvector · Telegram Bot API · Home Assistant · VoltOps

HOMELABtasksdelegatetoolsinferencerecalltracesInboxTelegram · approvalsSupervisorVoltAgent · plannerResearch agentweb · RAG · summarizeOps agentkubectl · tf planMCP serversGitHub · HASS · filesModel routerOllama first · cloudMem0 · pgvectorepisodic · factsVoltOpstraces · evals
runtime: VoltAgent supervisor + sub-agents · Ollama on a homelab GPU, cloud fallback · Mem0 over Postgres/pgvector · MCP for every tool · VoltOps traces

What I work in

Six areas I work in, and the tools I actually use in each. Type cat stack.json in the terminal for the full list.

  • Software architecture

    Clear module boundaries and contracts, and monorepos that don't turn into a mess.

    Nx · Zod · GraphQL · TypeORM · Temporal · Storybook

  • Full stack engineering

    TypeScript front to back: React, Angular, NestJS, GraphQL.

    TypeScript · React · Next.js · Angular · NestJS · Node.js

  • Cloud & DevOps

    Azure, AWS and GCP, Terraform and Pulumi, Kubernetes, and CI/CD that people actually use.

    AWS · Azure · GCP · Terraform · Pulumi · Kubernetes · GitHub Actions

  • AI engineering

    LLM products, agents and RAG, with evals so you know when it gets worse.

    OpenAI · Azure OpenAI · RAG · pgvector · Agents · Mem0

  • FinTech & payments

    Wallets and payment APIs next to old banking cores.

    Node.js · Java · SAP · Jenkins · PostgreSQL · Pandas

  • Security & compliance

    RBAC, secrets, scanning and audit trails, mostly in healthcare and finance.

    Vault · RBAC · SSO/OTP · Tenable · HL7 · Datadog

Off the clock, still on a terminal

I run a homelab. On any given day it's either working fine or half torn apart because something seemed like a good idea at 1 a.m. Linux on the desk, terminals everywhere, and I don't feel like I understand a tool until I've self-hosted it.

I open up hardware. I build agents for fun, and a few of them helped write this page. I read more open source than I star. The epilepsy research years also left me with a soft spot for a good dataset.

now.md1 section
building
ddiscua.dev, with agents doing the typing and a human doing the blaming

Research

The genetic epilepsy platform helped doctors and researchers work together, and the work got published. I still have a soft spot for a good dataset.

  • IEEE CONCAPAN

    A paper from the genetic epilepsy research platform.

  • ILAE / AAN abstracts

    Conference abstracts from the clinical and genetic research.

If the system has to ship, talk.

Message me on LinkedIn and tell me what you're building.

How I work

  • Architecture first

    I agree on contracts and boundaries before anyone writes a feature.

  • Ship in slices

    Vague tickets get cut into small pieces, each with tests, a migration and a way back.

  • Automate the boring

    Pipelines, infrastructure as code, agents. People should spend their time on decisions.

  • Lead without theater

    Code reviews, standards, and unblocking people. The client's goals come first.