image/svg+xml
Prepared for
UC Berkeley
Technical Portfolio · 2026

Connor O'Dea

Technical Portfolio
Selected AI systems, software architecture, and engineering projects. A curated look at how I identify real problems, decompose them, design the systems, and build them into software that runs.
connorodea.com
github.com/connorodea

Prepared for the University of California, Berkeley. Master of Information and Data Science.

Connor O'Dea · Technical PortfolioProfile
02 · Professional and technical profile

Applied AI engineer and systems architect

Denver, Colorado · builder of intelligent decision systems

I design and build AI-native systems end to end, from architecture through deployment. My work sits where messy real-world information meets software: I take unstructured inputs, warehouse floors, litigation documents, county property records, camera feeds, and turn them into structured representations that support decisions.

I am most drawn to systems rather than isolated models. The interesting engineering is usually in the connective tissue: the event backbone that keeps thirty services consistent, the governed state machine that decides what a system is allowed to believe, the retrieval layer that degrades instead of failing, the audit trail that makes an automated decision defensible. Retrieval, agents, and probabilistic reasoning show up in my products because they make the product work better, not because they are on a roadmap.

I work across domains on purpose. A problem in litigation looks a lot like one in property data, and a grading decision on a warehouse conveyor is the same shape as a routing decision in a document pipeline. Recognizing those shared structures is what lets me move quickly without cutting corners on data models, testing, or deployment.

Technology map verified from repository evidence

Languages

PythonTypeScriptJavaScriptSQLRustSwiftBash

Backend and services

Node.jsExpressFastAPIHonoCeleryWebSocket / wsREST APIsAPI gatewayPM2 workers

Frontend

ReactNext.jsTailwind CSSVitereact-three-fibershadcn / RadixTauri

Data and databases

PostgreSQLPostGISRedis StreamsNeo4jQdrantOpenSearchCloudflare R2 / D1event sourcingETL / adapters

AI and machine learning

LLM orchestrationLangGraph agentsRAGembeddingsknowledge graphsYOLOv11SAM 2.1GroundingDINOOCR / barcodeMonte Carlo / ISMCTSBayesian modelinggame theoryZ3 SMTmulti-provider routing

Infrastructure and tooling

GitHub Actions CI/CDTurborepo + pnpmModal serverless GPUCloudflare WorkersNginxsystemdHetzner VPSMCP serversVitest / Jest / pytest

How to read this portfolio

Every technical claim is grounded in source code, configuration, or documentation from the actual repositories. Components are labeled by status: implemented, partial, prototype, or planned. Where a project advertises a capability its code does not yet support, this document says so. Planned work is never described as if it ships today.
connorodea.com2
Connor O'Dea · Technical PortfolioQuickWMS · 1 of 3
03 · Distributed systems · event-driven architecture

QuickWMS

Core implemented · frontends partial

A warehouse and reverse-logistics platform built as an event-driven service mesh.

Problem

Reverse logistics is a coordination problem. A returned or liquidated item has to be received, identified, graded, placed, and then routed to the right outcome (resale, refurbishment, salvage, auction, or disposal), and every one of those steps is owned by a different team and a different system. When those systems drift out of sync, inventory lies, listings go stale, and items get lost. QuickWMS is my answer to keeping many specialized workflows consistent without collapsing them into one monolith.

System responsibilities

  • Ingest inbound shipments, purchase orders, and manifests
  • Identify and condition-grade items, including a computer-vision path
  • Maintain an authoritative stock ledger with reservations
  • Route graded items to disposition flows
  • Drive marketplace listing lifecycles and multi-channel sync
  • Manage outbound orders, picking, packing, and shipping

Intended users

Warehouse operators at receiving and grading stations, inventory and listings managers, and administrators, each with a dedicated interface rather than one overloaded dashboard.

Verified stack

MonorepoTurborepo + pnpm workspaces, ~1,200 TypeScript source files
Frontend11 Next.js 16 / React 19 apps, shared component library
Services35+ Express / TypeScript microservices
MessagingRedis Streams event bus, saga orchestrator
DataPostgreSQL 16, 55 tables, raw-SQL migrations
VisionGroq / Claude / OpenAI multi-provider router
GatewayExpress reverse proxy, JWT, Swagger / OpenAPI
DeployPM2 on a single VPS behind Nginx

Data model

A hand-written PostgreSQL layer (no ORM) of 55 tables across seven migrations. An items hub links to manifests, receiving sessions, suppliers, and pallets. A self-referential grading-history chain records condition over time. Separate sub-schemas cover consignment, multi-tenant third-party logistics, salvage and parts, analytics, and the event store itself.

What this demonstrates

Domain-driven decomposition, relational data modeling at real scale, distributed-transaction thinking (sagas and compensation), and the discipline to keep dozens of independently deployed services eventually consistent through a typed event contract rather than shared database access.

Integration points and constraints

A central API gateway fronts the platform with Helmet, CORS, rate limiting, JWT auth, and generated OpenAPI docs, reverse-proxying path prefixes to ten backend services. Listing services synchronize to external marketplaces (Shopify, eBay, Amazon). The computer-vision service enriches item identity against a third-party UPC and EAN lookup API. The main architectural constraint is deliberate: services never reach into each other's tables. They communicate only through the event bus and the gateway, which is what makes the topology safe to grow.

Implemented core · partial frontends · single-VPS deployment3
Connor O'Dea · Technical PortfolioQuickWMS · 2 of 3
04 · QuickWMS system architecture

Five layers, one event backbone

1 · CLIENT / EDGE portal inbound processing inventory listings flows outbound refurbz sales admin marketing 11 Next.js 16 / React 19 apps · shared @quickwms/ui · Nginx by subdomain Raspberry Pi conveyor cam frame capture → WebSocket stream edge · services/visionz/websocket 2 · GATEWAY Express API Gateway · :3080 Helmet · CORS · rate-limit · JWT auth · Swagger/OpenAPI · http-proxy-middleware → 10 upstreams 3 · SERVICES · ~35+ Express microservices Inbound PO · supplier · carrier BOL · manifest · track 9 modules Processing scanz · gradez visionz (AI/CV) refurbz Inventory inventoryz ledger reservations · cyclez stock ledger Listings listingz state machine market-sync Shopify/eBay/Amazon Outbound order · pick · ship return · fulfillment 7 modules Disposition flows pallet · auction · truckload salvage / parts · discard Sales / CRM crmz · leadz · teamz financez (finance) Platform services authz · taskz · monitorz · assetz · emailz alertz / insightz (analytics + KPI snapshots) 4 · MESSAGING BACKBONE @quickwms/events Redis Streams ~154 typed domain events 12 DDD domains consumer groups · ACK retries · dead-letter queue saga orchestrator + compensation idempotency keys Postgres event_store append-only audit trail 73 services publish / subscribe 5 · DATA PostgreSQL 16 · 55 tables (raw SQL migrations, no ORM) items hub → manifests · sessions · suppliers · pallets · gradings history chain listings → orders → order_items · consignment · 3PL (multi-tenant) · salvage · analytics event_store · saga_state · event_dlq · idempotency_keys · hand-written pg pool + models Redis event streams (backbone) cache · pub/sub AI / CV SIDE-PIPELINE visionz SmartRouter Groq → Claude → OpenAI confidence cascade · budget cap → JSON: grade · value · OCR UPC/ASIN/FNSKU/LPN · barcode-lookup DEPLOY · 59 processes under PM2 on a single VPS · Nginx reverse proxy · Turborepo + pnpm build · no Docker / no CI (local turbo tasks only) implemented component AI / computer-vision event (pub/sub) request / data flow
Fig 4.1 · Service topology. 11 client apps and a Raspberry Pi camera feed a gateway that fronts 35+ domain services, all coordinated by the Redis Streams event framework and backed by PostgreSQL and Redis.

Key design decisions

  • Events over shared state. ~154 typed domain events across 12 business domains, published and consumed by 73 service files, with consumer groups, dead-letter queues, and idempotency keys.
  • Sagas for multi-service work. A saga orchestrator coordinates transactions that span services and compensates on failure, instead of distributed locks.
  • Audit by construction. Every event is appended to a PostgreSQL event store, so the system's history is queryable, not reconstructed from logs.
  • Cost-aware vision. The grading service cascades Groq, then Claude, then OpenAI by confidence under a daily budget cap.

Architectural tradeoffs

  • A hand-written SQL layer trades ORM convenience for explicit control of indexes, upserts, and migration ordering.
  • A single-VPS PM2 deployment (59 processes) is operationally simple but is not yet containerized or wired to CI. Both are noted as planned, not claimed as done.
  • Frontends are real but partial (four to nine routes each); the backend is the mature half of the system.
01 Intake PO · manifest · receive 02 AI grade visionz · barcode · OCR 03 Inventory stock ledger · location 04 Disposition list / salvage / auction 05 Listing state machine · channels 06 Outbound pick · pack · ship item.received item.graded ready_for_listing listing.published order.created Redis Streams event backbone every stage transition emits a typed domain event · consumer groups fan out to subscribers · saga orchestrator compensates failures · Postgres event_store keeps an append-only audit trail Reverse-logistics happy path · intake to shipment Solid box = implemented service · teal = AI / computer-vision · dashed = event pub/sub · disposition step branches to salvage / parts / auction / truckload flows
Fig 4.2 · End-to-end reverse-logistics path; each stage transition emits an event.
Diagrams generated from repository source and architecture docs4
Connor O'Dea · Technical PortfolioQuickWMS · 3 of 3
05 · QuickWMS end-to-end pipeline

From supplier intake to customer, on one event backbone

CLIENT APPS · GATEWAY Operator apps → API gateway JWT auth · rate limiting · OpenAPI · reverse proxy by subdomain · services never call each other's database SUPPLIERS → → CUSTOMER freight · truckload · liquidation pick · pack · ship · fulfilment Sourcing supplier & market intel stage 1 Inbound receive · manifest · PO stage 2 Processing scan · grade · condition stage 3 Inventory stock ledger · refurb / repair stage 4 Disposition route to best outcome stage 5 Listing marketplace sync stage 6 Outbound pick · pack · ship stage 7 Event backbone Redis Streams event bus · saga orchestrator · append-only event store · idempotency keys · consumer groups + dead-letter queues Every stage publishes and consumes typed domain events; a saga coordinates multi-stage transactions and compensates on failure. RUNTIME ~35 TypeScript microservices · PostgreSQL (55 tables, raw-SQL migrations) · single VPS · PM2 process manager · Nginx reverse proxy service stage event backbone material flow event publish / consume
Fig 5.1 · The reverse-logistics pipeline. Seven staged services carry an item from supplier intake to customer fulfilment; coordination happens entirely through a typed event backbone rather than shared database access, so any stage can be deployed and reasoned about on its own.

What the pipeline guarantees

  • A single authoritative stock ledger. Inventory is the source of truth; every other stage reads and writes it only through events, never by reaching into its tables.
  • Traceability by construction. Because state changes are appended to an event store, an item's full history is queryable rather than reconstructed from logs.
  • Failure isolation. A saga orchestrator spans multi-stage transactions and compensates on failure, so one stage stalling does not corrupt the others.

Why it is built this way

  • Each stage is owned by a different team and interface in the real operation, so the system has to keep many specialized workflows consistent without collapsing them into one monolith.
  • An event contract between services is safer to grow than shared database access: new stages subscribe to the stream instead of taking new table dependencies.
  • The deployment is deliberately modest — one VPS, no container platform — and the document does not claim scale it has not run.
Sanitized architecture · generic service names · single-VPS deployment5
Connor O'Dea · Technical PortfolioJuricratic · 1 of 2
06 · Agentic AI · knowledge graphs · probabilistic reasoning

Juricratic

Core implemented

Litigation modeled as a dynamic information and decision system, not a single prediction.

Problem framing

Case strategy is usually reasoned from intuition and anecdote. Juricratic treats a matter as what it actually is: a multi-party game played over incomplete, evolving information, where each side has payoffs and moves. That framing turns strategy into something you can represent, reason over, and stress-test, provided the system is honest about what it knows and rigorous about what it is allowed to assert.

Matter-state architecture

State is event-sourced: the next matter state is a pure transform of the current state and an incoming event, which makes every change a traceable delta. On top of that sits a governed canonical matter state that is fail-closed. A fact cannot be promoted into canonical belief unless it is sourced and attorney-reviewed. A hard firewall separates the live matter from simulation branches, so a hypothetical can never write itself back into what the system treats as true.

Knowledge graph and evidence

A typed, in-memory knowledge graph models parties, evidence, motions, authorities, and judges with bi-temporal edges that supersede rather than delete, preserving history. An optional Neo4j mirror is code-complete but runs in a degrade-not-fail mode when the store is not provisioned.

Verified stack

CorePython, event-sourced engine and solver
AgentsLangGraph StateGraph subgraphs
ReasoningClaude tool-use, constrained to legal action tokens
Graphtyped in-memory graph, optional Neo4j mirror
Retrievalfeature-hash embeddings, optional legal 768-d + Qdrant / OpenSearch
VerifyZ3 SMT contradiction checking
SurfaceFastAPI (~60 endpoints), Next.js 15 + react-three-fiber

Probabilistic reasoning and simulation

The solver runs bounded simulation over settlement dynamics: seeded Monte Carlo rollouts, determinized information-set Monte Carlo tree search, pure-Nash equilibria, and a best-response exploitability gap. A transparent Bayesian case model with Kalman belief updates and Dirichlet shrinkage priors carries uncertainty explicitly. The design rule is stated in the code itself: this is simulation, not prediction, and it does not emit a calibrated win probability.

What this demonstrates

Turning an ambiguous real-world domain into a governed formal system: event sourcing, a typed knowledge graph, game-theoretic and Bayesian modeling, agent orchestration held apart from a deterministic core, and human-in-the-loop review with an append-only audit trail. It is the clearest example of the kind of consequential decision system I want to keep building.
Repository is private; project is listed publicly at connorodea.com/work6
Connor O'Dea · Technical PortfolioJuricratic · 2 of 2
07 · Juricratic system architecture

A governed core, an agent layer, a bounded solver

AST-ENFORCED ONE-WAY DEPENDENCY LADDER engine solver agents · ingest api web import guard tests keep LangGraph & LLMs out of the deterministic core INGESTION (deterministic, 4-stage) Documents → unstructured-io sidecar Normalize · dedup · entity extract Retrieval index (feature-hash embed) optional: Free Law 768-d legal embeddings + Qdrant / OpenSearch (degrade-not-fail) memory stores partial · infra unprovisioned GOVERNED CORE (event-sourced) Bi-temporal Knowledge Graph typed entities: party · evidence · motion · authority · judge supersede-never-delete edges · optional Neo4j mirror Matter-State Engine S(t+1) = transform(S(t), event) · traceable deltas Canonical Matter State · fail-closed promote() raises unless sourced + attorney-reviewed SOLVER · bounded simulation Game-theoretic determinized ISMCTS + UCT pure-Nash equilibrium best-response · exploitability gap Probabilistic seeded Monte Carlo rollout Bayesian case model · Kalman Dirichlet shrinkage priors Hybrid agent: Claude proposes (rules-constrained tool-use) → ISMCTS plans → value net evaluates discipline: "simulation, not prediction · no calibrated win-probability" live vs. simulation firewall · sim branches can never write canonical state AGENT SUBGRAPHS (LangGraph StateGraph) Researchretrieve + synthesize Precedentsdiscover → deepen Legal theorySTORM lens fan-out Counseldossier synth SURFACE FastAPI · ~60 endpoints Z3 contradiction verifier Next.js 15 web react-three-fiber 3D war room HUMAN-IN-THE-LOOP · GOVERNED EGRESS attorney_review_required ReBAC privilege gate PII scrub append-only audit fail-closed MCP egress RESEARCH DIRECTION · design only, no code rides I-POMDP level-1 opponent modeling · ReBeL PBS value-net training · safe subgame solving · CFR / regret-matching solver · PyTorch value net (only a linear net exists today) · LLM fine-tuning explicitly separated from the shipping system · planned architecture, not implemented implemented simulation engine governed / audited planned (no code)
Fig 6.1 · Ingestion feeds a governed, event-sourced core (knowledge graph plus canonical matter state). Agent subgraphs and a game-theoretic solver read from it; nothing reaches a user without passing the human-review and audited-egress path. Planned research is shown separately and carries no running code.

Design decisions worth calling out

  • The core cannot import the agents. An AST-enforced, one-way dependency ladder (engine, then solver, then agents and ingest, then api, then web) with import-guard tests keeps LangGraph and LLM calls out of the deterministic core.
  • Retrieval degrades, it does not fail. Deterministic feature-hash embeddings work with no external services; real legal embeddings and vector stores layer on when available.
  • Egress is fail-closed. Relationship-based access control, a privilege gate, PII scrubbing, and an append-only audit run on every outbound path.

Status, stated honestly

Implemented: the engine, solver, agent subgraphs, FastAPI surface, 3D interface, Z3 verifier, and a large test suite under a strict branch-coverage gate.

Partial: the external memory stores (Neo4j, Qdrant, OpenSearch) are code-complete but not yet provisioned; the app deploy is pending while the public landing site is live.

Research direction: opponent modeling with I-POMDPs, value-net training in the ReBeL style, and a regret-matching solver are documented as design only, with no code riding on them.

Status labels trace to code, tests, and design docs in the repository7
Connor O'Dea · Technical PortfolioQuickVisionz
08 · Computer vision · edge inference · serverless GPU

QuickVisionz

Edge pipeline implemented

An edge computer-vision system that identifies and grades items on a conveyor, then prints a label.

Problem and context

Identifying returned products by hand is slow and inconsistent. QuickVisionz runs a real-time vision pipeline on a Raspberry Pi at the point of capture, so an item is detected, read, graded, labeled, and registered before it leaves the station. Heavy segmentation work is offloaded to a serverless GPU that scales to zero when idle, which keeps an edge-first system affordable.

Verified stack

EdgeRaspberry Pi 5, OpenCV, Python, systemd
DetectionYOLOv11-nano + ByteTrack tracking
PreprocessKornia GPU: CLAHE, denoise, normalize
Readpyzbar barcode (7 variants), UPC lookup
FallbackGPT-4.1-mini vision when no barcode resolves
SegmentSAM 2.1 + GroundingDINO on Modal H100
OutputZebra ZPL over TCP, FastAPI + WebSocket dashboard
EDGE NODE · Raspberry Pi 5 · single async Python process · systemd USB / CSI cameraOpenCV VideoCapture Kornia enhanceCLAHE · denoise · norm (GPU) YOLOv11n + ByteTrackdrop people/animals8-frame stability gate Burst → sharpest5 frames · Laplacian var pyzbar barcode7 image variants UPC lookupUPCitemdb → OpenFoodFacts GPT-4.1-mini visionfallback only · no barcode/UPCreads brand/model/ASIN/LPN Merge + dedupUPC-DB > AI-vision > YOLOby brand + model Rule decision enginegrade+category →REFURBISH/SALVAGE/REJECT ID genQV-YYMMDD-NNNNN Zebra ZPL print CSV + JPEG store Intake REST POST→ warehouse item id FastAPI + WSlive annotated feed/ws/feed · /api/stats condition grading via YOLO-cls is a prototype placeholder (defaults to grade C) until a labeled grade model is trained edge pipeline backed by ~3.8k lines of tests · label print / intake code-complete, need live hardware to verify end-to-end ZPL over raw TCP :9100 with subnet auto-discovery · daily 22-column ScanRecord CSV CLOUD GPU SERVICE · Modal serverless NVIDIA H100 · scale-to-zero (min=0) 5-min idle window · weights on Modal Volume Segmentation SAM 2.1 hiera_large + GroundingDINO grid-point & text-prompted masks → RLE Damage grading heuristic cosmetic+functional scores → grade A–F + route (not trained/validated) /agent · MLLM loop Claude Sonnet: reason → segment → reason endpoints /segment /grade /agent /health WebRTC (aiortc) real-time path ← Pi picamera2 SAM 3 backend · scaffolded, hot-swap when released (planned) HTTP / WebRTC → Operator dashboards served UI = two zero-dependency vanilla HTML/JS pages (live WebRTC view + results) Next.js frontend exists but is a v0 mockup with hardcoded data · not wired to the backend Downstream graded + identified item + label feed the warehouse receiving pipeline (intake API) implemented CV / ML inference planned prototype / heuristic
Fig 7.1 · The edge node runs the full detect-read-grade-label loop in one process; a serverless H100 handles segmentation and an MLLM reasoning agent. The live UIs are lightweight HTML dashboards.

What this demonstrates

End-to-end computer vision under real constraints: detection with tracking and stability gating, multi-strategy barcode reading with an LLM vision fallback, a rule-based routing engine, raw-socket thermal printing, and a split between edge and elastic GPU inference. The edge pipeline carries roughly 3,800 lines of tests.

Stated honestly

  • Condition grading via the classifier is a prototype placeholder until a labeled grade model is trained; there are no model-accuracy metrics.
  • The segmentation service loads SAM 2.1 today; a SAM 3 backend is scaffolded for a future swap, not running.
  • Label printing, intake registration, and the WebRTC path are code-complete but unverified without live hardware.
Repository is private · edge inference plus serverless GPU offload8
Connor O'Dea · Technical PortfolioAIWholesail
09 · Applied data science · data pipelines · multi-agent AI

AIWholesail

Production-grade · in service

A real-estate data platform: multi-source ingestion, a scoring engine, and a research agent over a property graph.

SOURCES County recordsMaricopa · Clark · Cook Zillow (RapidAPI)listing / property data PropDatamarket data feed INGEST / ETL · pluggable adapter framework Per-county scraper adaptersCSS selectors stored in DB ·retune without redeploy Null-safe normalizercanonical property schema Idempotent bulk upsertCOALESCE 4-key · xmax ins/upd detect raw HTML snapshot → Cloudflare R2 (replayable) STORAGE PostgreSQL25+ tables · 37 raw-SQLmigrationsproperty cache · users PostGIS graphgeospatial property graph(off-market service) Rediscache · Celery broker SCORING · FastAPI + Celery Propensity engine 0–100recency-weighted signalstacking · combo bonuses ·stack multiplier deterministic heuristic todayML-swap-ready (sklearn/XGBoost) AGENTS Router agentforced tool-use dispatch Deal hunter Comp analyst Market watcher Seller motivator Claude specialists · cited answers API + PRODUCT SURFACE Node APIJWT auth · tiered rate limitingpayments · property search + cache Next.js / TS web appsearch · favorites · saved-lead alertsactivation = lead saved / alert set Supabase Deno edge layerGPT-4.1 + Claude Vision analysis(parallel path) Ops / deployHetzner VPS · GitHub Actions CI/CDmigration runner · health checks Note · main-app property search proxies external APIs with a Postgres cache; proprietary geospatial scoring (PostGIS) lives in the off-market service. "Lead scoring" is a versioned heuristic, not a trained model (by design, pending labeled outcomes). implemented heuristic / ML-ready infrastructure
Fig 8.1 · County records, listing APIs, and market feeds flow through a pluggable adapter framework into PostgreSQL and a PostGIS graph, then feed a propensity-scoring service and a multi-agent research assistant.

Three things that stand out

  • Multi-source ETL with a pluggable adapter framework. Per-county foreclosure scrapers use CSS selectors stored in the database, so a county can be retuned without a redeploy. A null-safe normalizer and idempotent, conflict-preserving bulk upserts (four-part key, insert-versus-update detection) keep records clean; raw HTML is snapshotted to object storage so any run is replayable.
  • A signal-based propensity engine. A 0 to 100 score built from recency-weighted signal stacking, combo bonuses, and a stack multiplier over a PostGIS property graph, explicitly versioned to be swapped for a trained model once enough labeled outcomes accrue.
  • A multi-agent research assistant. A router agent uses forced tool-use to dispatch specialist subagents (deal hunter, comp analyst, market watcher, seller motivator) that return cited answers.

Verified stack

DataPostgreSQL, 25+ tables, 37 raw-SQL migrations; PostGIS
ServicesNode API + FastAPI / Celery scoring service
AIClaude agents; GPT-4.1 and Claude Vision analysis layer
WebNext.js / TypeScript: search, favorites, alerts
OpsHetzner VPS, GitHub Actions CI/CD, JWT, rate limiting

Stated honestly

The lead score is a deterministic weighted heuristic by design, not a trained model. Main-app property search proxies external APIs (Zillow, PropData) with a Postgres cache; the proprietary geospatial scoring lives in the off-market service.

What this demonstrates

Applied data engineering across the full path: resilient ingestion of messy public data, careful schema and upsert design, transparent scoring that leaves a clean seam for a future ML model, and agentic AI wired into a product with citations and cost controls.
github.com/connorodea/aiwholesail9
Connor O'Dea · Technical PortfolioAdditional systems
10 · Additional selected systems

Three more systems worth a look

Cutroom

An AI-native video editor that cuts from the transcript.

Building · disciplined TDD

Problem and contribution. Editors spend most of a session scrubbing for a moment they already remember. Cutroom transcribes first and makes the transcript the timeline: strike a sentence and the cut happens. It is built as a real non-linear editor, not a wrapper, with a media pool, multi-track timeline, color, and delivery. The engine is a worker of roughly forty FFmpeg operations (reframe, chromakey, transcription, text-to-speech, captions, color), each with its own test, driven by a Claude agent server that plans multi-step edits with forced tool-use and prompt caching, exposed over web, MCP, and CLI.

Transcript-driven timeline
Editor surface
StackTypeScript, React, Vite, Hono, FFmpeg, Claude · web / MCP / CLI
Linkgithub.com/connorodea/cutroom

Sightline

Measures when AI assistants recommend a merchant's store.

Building

Problem and contribution. Search is moving inside assistants, where there is no rank to check and no analytics to read. Sightline fans a set of tracked buyer queries across multiple AI answer engines on a schedule, with bounded concurrency and cost caps, detects whether and how a store surfaces, and computes a visibility score and share-of-voice from a clean rubric. It reads naturally as data science: the interesting work is metric design and scoring over noisy generative output.

StackNext.js, TypeScript, PostgreSQL · answer-engine query fan-out + scoring
Statusprivate repository; listed at connorodea.com/work

GeoStamp

Batch-writes correct EXIF GPS to photos from a map pin.

Live

Problem and contribution. Local businesses are told to geotag their photos and given no usable tool to do it. GeoStamp writes correct EXIF GPS across a batch on both desktop and web. It is a compact, shipped systems piece: a Rust core wrapped in a Tauri desktop app, chosen for correct low-level metadata handling and a small install footprint.

StackRust, Tauri, React · desktop + web
Linkgithub.com/connorodea/geostamp · geostamp.app
Selected for original engineering, not repository count10
Connor O'Dea · Technical PortfolioCapability map
11 · Data, ML, and AI systems capability map

Capabilities, tied to the systems that prove them

Each capability points to the projects where it is actually implemented.

Data ingestion and ETL

Multi-source scrapers, adapter frameworks, manifest and record ingestion.

AIWholesail · QuickWMS

Data validation and modeling

Null-safe normalizers, idempotent upserts, large relational schemas.

AIWholesail · QuickWMS

Event-driven pipelines

Redis Streams bus, consumer groups, sagas, event sourcing.

QuickWMS · Juricratic

Knowledge graphs

Typed, bi-temporal entity and relation graphs with optional Neo4j.

Juricratic

Retrieval and embeddings

Feature-hash and legal embeddings, Qdrant / OpenSearch, degrade-not-fail.

Juricratic · AIWholesail

Agent orchestration

LangGraph subgraphs; router plus specialist agents with forced tool-use.

Juricratic · AIWholesail · Cutroom

Computer vision

YOLOv11 detection and tracking, SAM 2.1 segmentation, OCR and barcode.

QuickVisionz · QuickWMS

Model inference and routing

Multi-provider cost-aware cascades; serverless GPU with scale-to-zero.

QuickWMS · QuickVisionz

Probabilistic modeling

Monte Carlo, ISMCTS, Bayesian and Kalman updates, Dirichlet priors.

Juricratic

Simulation and game theory

Nash equilibria, best-response and exploitability over bounded branches.

Juricratic

Scoring and metric design

Signal-weighted propensity scores; answer-engine visibility scoring.

AIWholesail · Sightline

Human-in-the-loop and audit

Fail-closed review gates, append-only audit, governed egress.

Juricratic · QuickWMS

Reading the map

Breadth here is not a list of buzzwords: every capability is anchored to source in a specific repository. The concentration around ingestion, event-driven design, retrieval, agents, and probabilistic reasoning is the through-line of my work, and it is squarely the ground the MIDS program covers.
Capabilities cross-referenced to featured repositories11
Connor O'Dea · Technical PortfolioArchitecture and infrastructure
12 · Software architecture and infrastructure

How these systems are actually built and run

AreaWhat is implementedWhere
API designREST services behind a reverse-proxy gateway with JWT auth, rate limiting, and generated OpenAPI docs; ~60-endpoint FastAPI surface.QuickWMS · Juricratic · AIWholesail
Service boundariesDomain-driven services that communicate only through events and the gateway; an AST-enforced dependency ladder in the Python core.QuickWMS · Juricratic
Data architectureHand-written PostgreSQL layers, 55 and 25+ table schemas, PostGIS geospatial graph, event store, bi-temporal graph.QuickWMS · AIWholesail · Juricratic
Messaging and jobsRedis Streams event bus with consumer groups, DLQ, and sagas; Celery workers; PM2-managed background processes.QuickWMS · AIWholesail
CachingRedis for cache and pub/sub; Postgres-backed API response caching for external data feeds.QuickWMS · AIWholesail
Auth and accessJWT auth, tiered rate limiting; relationship-based access control with a privilege gate and PII scrubbing on egress.AIWholesail · Juricratic
DeploymentGitHub Actions CI/CD to a Hetzner VPS; Turborepo + pnpm builds; systemd services on edge devices; Modal for serverless GPU.AIWholesail · QuickWMS · QuickVisionz
TestingVitest, Jest, and pytest suites; per-operation tests in the video engine; a strict branch-coverage gate in the Python core.Juricratic · Cutroom · QuickVisionz · QuickWMS
Observability and auditAppend-only event and audit stores; health-check and rollback scripts; monitoring services.QuickWMS · Juricratic
Security postureFail-closed governed egress, secrets kept out of source, Helmet and CORS hardening at the gateway.Juricratic · QuickWMS

An honest note on scale

These systems run on modest, self-managed infrastructure (single VPS deployments, serverless GPU on demand). They are engineered for correctness, consistency, and auditability rather than for enterprise traffic, and this document does not claim production scale it cannot show. Containerization and CI for QuickWMS specifically are planned, not yet in place.
Architecture claims trace to configuration and deployment files12
Connor O'Dea · Technical PortfolioProject index
13 · Curated project index

Selected repositories

A curated subset chosen for technical depth and relevance, not a full repository dump. Public repositories are linked.

ProjectPurposeLanguagesStatusRepository
QuickWMSEvent-driven warehouse and reverse-logistics platformTypeScript, SQLCore builtprivate
JuricraticLitigation modeled as a governed decision and simulation systemPython, TypeScriptCore builtprivate
QuickVisionzEdge CV item identification and grading with GPU offloadPythonEdge builtprivate
AIWholesailReal-estate data platform, ETL, scoring, research agentsTypeScript, Python, SQLIn servicegithub.com/connorodea/aiwholesail
CutroomTranscript-driven AI video editor with an agent engineTypeScriptBuildinggithub.com/connorodea/cutroom
SightlineAI answer-engine visibility scoring for merchantsTypeScriptBuildingprivate
GeoStampBatch EXIF GPS geotagging, desktop and webRust, TypeScriptLivegithub.com/connorodea/geostamp
APIDistributedAgent-native, edge-deployed API marketplace (MCP surface)TypeScriptBuildingprivate

On attribution

This index lists only original work. Repositories that are unmodified forks or clones of third-party frameworks are deliberately excluded, so nothing here credits me with code I did not write.

Full public shipping log at connorodea.com. Private repositories are described in this document but not linked; they can be shared directly on request.

github.com/connorodea13
Connor O'Dea · Technical PortfolioEngineering philosophy
14 · Engineering philosophy

What I try to build, and why

I am drawn to systems where machine learning, probabilistic reasoning, distributed software, and human judgment meet. The work I care about ingests messy real-world information, turns it into a structured representation, and improves the quality of a decision through data, inference, and feedback.

I design systems, not isolated features. A model is rarely the hard part. The hard part is the pipeline that feeds it, the state it updates, the events that keep everything consistent, and the interface a person actually trusts. I spend my effort on that connective tissue.

I turn unstructured reality into structured representations. Warehouse items, legal documents, county records, and camera frames all start as noise. Giving them a schema, a graph, or an event stream is what makes downstream reasoning possible.

I connect machine learning to operational workflows. Inference is only useful when it moves through to a routed item, a published listing, a reviewed claim. I build the path from a prediction to an action.

I design for auditability and human review. Consequential systems should be able to explain what they believed and why. Append-only histories, fail-closed review gates, and governed state are defaults in my work, not afterthoughts.

I model uncertainty honestly. When a system cannot know something, it should say so. I would rather ship a calibrated simulation that refuses to fake a probability than a confident number with nothing behind it.

I balance experimentation with discipline. Tests, migrations, and deployment are how a prototype becomes software that runs. I move fast, but I leave a clean seam for the next model, the next service, and the next engineer.

Why Berkeley MIDS

I have learned this by building, across many domains, on real infrastructure. What I want next is the formal grounding to match the systems intuition: rigorous statistics and machine learning, causal and experimental methods, and the shared language of a field. That is the gap the program fills, and it is the direction the rest of my work is already pointed.
connorodea.com14
Connor O'Dea · Technical PortfolioContact
15 · Website and contact

Where to find the rest

connorodea.com · full public shipping log, case studies, and live project links

Private repositories described here (QuickWMS, Juricratic, QuickVisionz, Sightline) can be shared directly with the admissions committee on request.

connorodea.com
github.com/connorodea

Thank you for reading. Everything in this portfolio is something I designed, built, and can walk through in depth. I would welcome the chance to do exactly that.

Connor O'Dea · Technical Portfolio · 202615
Download PDF ↓