← BACK TO MY STORY

TECHNICAL SKILLS & ENGINEERING APPROACH

The thinking
behind the build.

I work across architecture, application code, data, and infrastructure. My focus is connecting the product people need with systems that can be understood, operated, and changed.

Here’s a closer look at the decisions, patterns, and tools behind my work.

Explore my approach
ONE SYSTEM. CLEAR RESPONSIBILITIES.
  1. 01

    Product intent

    The outcome the person is trying to achieve.

  2. 02

    Explicit contracts

    Inputs, authority, ownership, and expected results.

  3. 03

    Dependable execution

    Persistence, background work, retries, and recovery.

  4. 04

    Observable outcomes

    State, evidence, and a clear path back to the user.

Design the boundaries.
Stay close to the details.

PRODUCT THINKINGHANDS-ON ENGINEERINGOPERATIONAL OWNERSHIP

Clear boundaries.
Connected systems.

I start by deciding who owns the data, who can authorize a change, and how work moves between applications. Those decisions shape the code, the interfaces, and the recovery path.

01

Give each domain an owner.

I separate the customer experience, API edge, business orchestration, financial state, and execution workers. Read models carry the information a product needs while the owning service remains responsible for changes.

Domain boundaries · command/query separation · projections · multi-database Rails

02

Design for the second delivery.

Retries and duplicate messages are part of asynchronous work. I use scoped idempotency keys, request fingerprints, database constraints, transactional outboxes, and explicit acknowledgements to make replay and recovery deliberate.

Durable messaging · idempotency · outbox/inbox patterns · bounded retry policies

03

Make authority part of the interface.

An endpoint or AI tool needs a clear execution boundary. My integration work includes tenant and workspace context, scoped credentials, OIDC verification, schema validation, and authorization checks before side effects.

REST · MCP · JSON Schema · OpenAPI · OAuth client credentials · OIDC

04

Put correctness close to the data.

I work with relational transactions, uniqueness, row locks, and explicit state transitions. Financial workflows separate reservation, consumption, and release. Geographic workflows need their own geometry and coordinate-system rules.

PostgreSQL · transactional consistency · account ledgers · PostGIS

DEEPER / CONSISTENCY & RECOVERYDesign for the commit-to-delivery gap.

A database commit and a remote message are separate events. I stage delivery intent alongside the business change, then let an outbox dispatcher deliver it. Consumers persist receipts and distinguish a valid replay from the same identity arriving with different content.

That supports recovery after interruption without treating a transport acknowledgement as the final business result. Correlation, versioned projections, and explicit failure states keep the original request connected to its eventual outcome.

DEEPER / FINANCIAL WORKFLOWSMake retry safety a business invariant.

I model reservation, consumption, release, and settlement as explicit transitions with stable identity. Account-level locking and transaction boundaries protect competing changes; a repeated request must match the original operation before its result can be reused.

The tests that matter include duplicate consumption, revoked permission on replay, and real contention between database connections. A useful failure is bounded and understandable, with enough state retained to recover.

DEEPER / DATA MODELINGChoose the model that answers the question.

Relational records, geographic relationships, graph projections, and search indexes serve different queries. In spatial work I distinguish administrative hierarchy from actual geometric overlap, normalize invalid polygons, prefilter candidate geometry, and use explicit area and containment semantics.

For relationship exploration I work with parameterized Cypher upserts and bounded graph traversals. For retrieval I combine filtered full-text queries with provenance-bearing context. I keep the source record and the derived representation conceptually separate.

A RECURRING DESIGN CONCERN

A request has a lifecycle.

I represent acceptance, execution, and completion as distinct states, and carry stable references through the workflow so the result can be traced back to the original intent.

  1. 01Validate & authorize
  2. 02Persist & dispatch
  3. 03Execute & recover
  4. 04Project the outcome

Shared state.
Live presence.

My collaboration work connects Rails authorization, AnyCable-powered application events, and LiveKit’s WebRTC media layer. The challenge is keeping people, permissions, and product state aligned while connections and devices change.

APPLICATION AUTHORITY

Rails owns the rules.

Membership, resource access, capabilities, durable messages, call records, and recording state.

LIVE APPLICATION EVENTS

Action Cable + AnyCable

Authenticated subscriptions, presence, cursors, call updates, and presenter/follow coordination.

AUDIO, VIDEO & SCREEN

LiveKit + WebRTC

Room connections, media tracks, participant events, screen capture, and recording egress.

01

A socket needs a permission model.

I work with short-lived JWTs, workspace-scoped connection identity, channel authorization, access versions, and leases. A connected browser still needs permission to subscribe to a particular conversation, call, or shared resource.

Action Cable channels · AnyCable RPC · JWT · Redis broadcasting · scoped subscriptions

02

Presence is temporary. State has an owner.

Presence heartbeats and cursor movement have different lifecycles from durable chat and business records. I use expiry, rate limits, sequence checks, and explicit presenter ownership to keep shared interaction coherent through delayed or stale updates.

Presence leases · cursor throttling · sequence validation · presenter/follow coordination

03

Media access is a capability.

Room-scoped LiveKit tokens distinguish listening, publishing microphone or camera, and sharing a screen. Admission limits and device-specific participant identity sit alongside application access checks, with recording notices checked before entry when needed.

LiveKit room grants · publish-source restrictions · participant admission · device sessions

04

The browser is part of the system.

I handle track subscription and removal, participant changes, reconnect states, media-device errors, and audio playback restrictions. Capture and call teardown release tracks and subscriptions; the UI reflects the actual media lifecycle.

WebRTC integration · camera/microphone lifecycle · screen capture · reconnect UX · resource cleanup

DEEPER / RECORDING & PRIVATE PLAYBACKStopping capture is the start of another workflow.

My recording work connects explicit notice and acknowledgement with LiveKit Egress, asynchronous processing, and verification before playback becomes available. The product distinguishes recording, processing, ready, and failed states.

Provider callbacks are verified against the signed body digest and projected through durable event records. Private media delivery includes encrypted storage, time-limited playback access, retention, and deletion workflows. This brings consent, authorization, lifecycle state, and recovery into the same design.

LiveKit Egress · signed webhooks · MP4/HLS · S3 · KMS · CloudFront · lifecycle reconciliation

DEEPER / REAL-TIME INFRASTRUCTUREOperate the connection layer and the media layer separately.

I work across the Rails application, AnyCable’s WebSocket/RPC boundary, and self-hosted LiveKit media infrastructure. The surrounding stack includes Redis/Valkey, TURN connectivity, recording workers, object storage, and private delivery.

That separation makes operational questions concrete: is the user authorized, is the event connection available, is the room connected, are tracks arriving, and has the recording been verified? Each answer belongs to a different boundary.

Code that explains
what it owns.

I favor readable Ruby, named services, explicit inputs, and focused adapters. The shape of the code should help the next person understand the business decision and where its effects belong.

01

Make dependencies visible.

Keyword arguments and injected collaborators make service boundaries easier to understand, replace, and test.

02

Keep contracts small and explicit.

Validate at the boundary. Return structured results and useful domain errors. Keep transport concerns close to the adapter.

03

Model failure and recovery.

Distinguish invalid input, missing authority, temporary deferral, retryable failure, and terminal outcomes.

04

Test the invariants.

I look for what must stay true through duplicate delivery, concurrent requests, revoked permissions, partial results, and interrupted work.

RUBY / AN ILLUSTRATIVE PATTERN
def call(command)
  validated = contract.validate!(command)
  policy.authorize!(validated)

  repository.transaction do
    request = repository.claim_once!(validated)
    outbox.stage_once!(request)

    Result.accepted(
      reference: request.public_reference
    )
  end
end

Simplified to show the shape: validate, authorize, record intent, and stage delivery. The persistence layer owns uniqueness and conflict checks; external dispatch follows the commit.

Tools with a job
to do.

Ruby and Rails are central to my application work. Around them, I use focused tools for data, interfaces, messaging, integration, and delivery.

01

Application engineering

Ruby · Ruby on Rails · SQL · JavaScript · TypeScript

Domain-rich applications, service objects, background workflows, and typed integration surfaces.

02

Data & persistence

PostgreSQL · PostGIS · Active Record · SQLite

Relational modeling, multi-database boundaries, tenant context, transactions, spatial data, and query-driven product features.

03

Asynchronous systems

NATS JetStream · Active Job · Solid Queue · Redis

Durable consumers, explicit acknowledgements, correlation, backoff, outboxes, and recoverable execution.

04

Product interfaces

Hotwire · Turbo · Stimulus · Tailwind CSS · Hotwire Native · Swift · Kotlin

Server-rendered products, focused client-side behavior, live workflow state, and map-centered interfaces.

05

Real-time & media

Action Cable · AnyCable · LiveKit · WebRTC · Redis / Valkey · TURN

Live subscriptions, presence, media permissions, room and track lifecycles, screen sharing, recording, and private playback.

06

APIs & AI-facing tools

REST · MCP · JSON Schema · OpenAPI · Faraday · OIDC

Discoverable capabilities, consistent request contracts, scoped access, provider adapters, and asynchronous results.

07

Graph, search & retrieval

Neo4j · Cypher · OpenSearch

Relational-to-graph projections, bounded graph exploration, full-text retrieval, and knowledge-backed AI context.

08

Delivery & operations

Docker · Kamal · GitLab CI · Linux · AWS · Bash · Python

Container delivery, operational scripts, environment isolation, release artifacts, and repeatable local workflows.

09

Verification & visibility

Minitest · RSpec · Node.js test runner · RuboCop · Brakeman · OpenTelemetry

Contract and invariant tests, security checks, structured diagnostics, and tracing hooks across application boundaries.

PRACTICAL AI ENGINEERING

Make the tool boundary real.

My AI work includes building the interfaces models act through: tool catalogs, input schemas, authorization context, cost boundaries, execution policies, and retained results. I use deterministic validation and explicit workflow state around model-driven operations.

Make complex work
clear to people.

Architecture has to arrive as a useful product. I work on both the backend workflow and the interface that makes its state understandable.

01

Web applications with live state.

Rails, Turbo, and Stimulus let me keep product behavior close to the domain while adding targeted interaction. I design status views around the real lifecycle of the work, including partial and delayed outcomes.

02

Geography as application data.

Maps are connected to geographic models, polygon validation, overlap and containment queries, area measurements, and data provenance. I work across the database and the browser so a map represents the underlying data coherently.

03

Client surfaces with clear authority.

My Hotwire Native client foundations use Swift and Kotlin for secure device-side integration, including Keychain and Android Keystore. Business state stays with the platform; authenticated commands cross explicit boundaries.

A change earns trust
in stages.

I carry the work through verification and release, and record what the evidence actually establishes at each stage.

  1. 01

    Define the contract.

    Inputs, ownership, authority, failure states, and acceptance criteria.

  2. 02

    Verify the behavior.

    Focused tests, boundary checks, replay, and concurrency where it matters.

  3. 03

    Check the release.

    Source identity, build artifacts, configuration, migrations, and runtime evidence.

  4. 04

    Prove the experience.

    Browser behavior, persisted outcomes, and the workflow the user set out to complete.

Operational judgment

Use environment checks, controlled execution, redacted diagnostics, and targeted recovery. Know which component owns the next action and what that action can change.

Documentation that carries the work

I write technical notes, contracts, runbooks, and handoffs that capture decisions, current evidence, remaining limits, and a clear continuation path.

Business context stays in view

My background spans founding, agency delivery, commerce, and CTO work. I connect technical decisions to operating cost, customer experience, maintainability, and the next business milestone.

See the system.
Still write the code.

For conversations about architecture, platform engineering, commerce, and technical leadership.

Talk about your project Back to my story