Skip to content
Craftsman Labs
Sections
Craftsman Labs · Independent software consultancy

Get important product work moving.

I’m Ryan Hair, a senior full-stack product engineer working through Craftsman Labs. I join software teams where they need me—from defined tickets to ambiguous initiatives—get oriented quickly, and create momentum without adding management overhead.

Prefer email? A sentence or two about what you need is enough. ryan@craftsmanlabs.dev

EngagementCurrently booking fractional and full-time contract engagements.
Experience
15+ years in professional software engineering.
Working model
US-based · Remote-first · US time-zone overlap.
Primary expertise
TypeScript and React.
Production range
Elixir, Docker, Kubernetes, and CI/CD.
TypeScriptReactElixirCI & delivery
Background
15+ yearsShipping software
Product and platformBoth sides of the stack
Google · InstructureProduct and developer platform work
Podium · AumniFrontend architecture and delivery systems

Previous employers. Not a current affiliation or an endorsement.

01Recommendation
You give him a problem, he solves it. He’s someone you can trust to get things done. He’s optimistic, a great communicator, and has an eye for finding the RIGHT solutions. […] If you’re able to hire him, do it. He’s worth it.
Ryan OlsonFormer teammate at AumniSr. Software Engineer at Dandy
02Flagship work · Podium

Turning a shared frontend into code teams could own.

  1. 01Scattered ownership
    Shared frontend
    FEA-01
    FEA-02
    FEA-03
    FEA-04
    FEA-05
    FEA-06
    FEA-07
    FEA-08
    FEA-09
    Feature code sits wherever it landed, so every change crosses teams.FIG. 01 / 1 OF 3
  2. 02Repeatable transformation
    FEA-01
    FEA-02
    FEA-03
    FEA-04
    FEA-05
    FEA-06
    FEA-07
    FEA-08
    FEA-09
    One regenerable codemod moves each feature to its owner.FIG. 01 / 2 OF 3
  3. 03Localized ownership
    Team A
    Team B
    Team C
    FEA-01
    FEA-02
    FEA-03
    FEA-04
    FEA-05
    FEA-06
    FEA-07
    FEA-08
    FEA-09
    Each team owns and reviews its own area.FIG. 01 / 3 OF 3
Conceptual diagram: feature code scattered across a shared frontend, moved by one regenerable transformation, ending as ownership localized per team. Not a depiction of any real repository.
Problem

Podium’s primary frontend had grown organically. Team-owned features were distributed across the application, which created cross-team review requirements and made a long-running manual reorganization vulnerable to repeated merge conflicts.

Response

I designed a repeatable codemod that moved feature work according to ownership, updated imports and other references, and left the application compiling and running as before. Because the transformation could be regenerated, teams could review the intended result and reapply it after conflicts instead of repeatedly repairing a manual migration.

Result

Work became more localized. Teams could establish more granular CODEOWNERS, reduce unnecessary multi-team approvals, and move faster inside their own areas of responsibility.

More localized ownership, reviewed as a regenerable change
RefactoringDeveloper experienceCode ownershipAutomationReact ecosystem
03Selected contributions

Selected contributions

I can enter at different points in the work: accelerating an existing system, shaping shared architecture, contributing from the start of a product, or delivering a focused feature across the stack.

AumniCI and developer experience
>30%
Faster feedback through several proportionate improvements, not one fragile optimization

Cutting pull-request feedback time by over 30% in two weeks.

I identified that pipeline time came from both slow execution and jobs waiting for poorly matched resources. The first improvements aligned runner sizing with workloads, made rspec tests use the compute already allocated to it, and reduced contention so jobs could begin sooner. Continued work included change-aware linting, a flatter job graph, consolidated short-lived jobs, and better base-image reuse.

CI/CDRubyrspec testsDockerDeveloper experience
AumniFrontend architecture

A lightweight table for common needs—and a clear boundary for a data grid.

I designed a declarative table component organized around column renderers rather than repeated row-by-row markup. It became the default for straightforward tables. As richer, data-heavy use cases emerged, the team used AG Grid for that complexity while retaining my component where a full data grid would be unnecessary.

Result / A proportionate architecture with two tools for genuinely different needs
TypeScriptReactComponent design
InstructureBridge Career

Moving a greenfield product from Flow to TypeScript without pausing delivery.

I contributed to Bridge Career from its beginning, made the case for moving from Flow to TypeScript, proved the direction against complex product logic, and led the completed incremental migration. I also shipped an SVG career timeline that placed hiring events, accomplishments, and anniversaries along their real temporal sequence, so a person's progression was understandable at a glance.

Result / A completed migration with delivery never paused
TypeScriptFlowReactSVG
PodiumFull-stack product

Production feature work across the interface and Elixir backend.

As part of the team building Podium's core messaging experience, I implemented conversation-status filtering, including Elixir-side behavior for open and closed conversations.

Result / Concrete production full-stack contribution as part of the messaging team
ReactElixirProduct delivery
04Ways to work together

Bring me in where the work needs ownership.

01

Embedded Engineering

Fractional or full-time contribution over weeks or months. I join your team’s working rhythm, learn the product and codebase, and own the most useful slice—from an existing queue of work to a complete initiative.

  • Greenfield foundations
  • Sustained feature delivery
  • Modernization and refactoring
  • Frontend or full-stack product work
  • Developer tooling and delivery systems
02

Focused Intervention

A bounded engagement for one valuable problem that needs senior attention and a clear result.

  • Architecture or code review
  • A difficult refactor
  • CI or developer-experience bottlenecks
  • A concentrated feature push
  • Technical discovery before a larger engagement
05Working principles

Useful quickly. Thoughtful for the long term.

01

Rapid contribution

I get oriented quickly, find the highest-leverage next move, and start creating useful momentum.

02

Adaptive ownership

I can deliver clearly defined work or help carry an ambiguous problem from clarification through implementation. End-to-end ownership is available, not required.

03

Engineering leverage

I ship product work and improve the systems teams use to ship what comes next.

04

Proportionate architecture

I choose the smallest approach that fits the actual complexity, with clear boundaries for when a more capable tool is warranted.

06Recommendation
Ryan launched tools that sped up the feedback loop for 150+ developers. His contributions made CI more stable, and massively reduced the time to onboard new engineers.
Drew BowmanFormer manager at Podium
07About
Photograph of Ryan Hair — natural window light
Ryan HairSenior full-stack product engineer

I’m Ryan Hair, a senior full-stack product engineer with more than 15 years of professional experience. I’ve worked across product engineering and developer platforms at companies including Google, Instructure, Podium, and Aumni.

My deepest experience is in frontend systems and frontend architecture, especially TypeScript and React. I’ve also contributed to production Elixir services, containerized infrastructure, Kubernetes platforms, and CI systems. I care about clear communication, understandable software, and leaving a team better able to deliver after the immediate work is done.

Outside work, I’m a husband and father of two. Most of my time goes to my family—or, inevitably, building more software.

Based
US-based and remote-first
Overlap
Working overlap across US time zones
Onsite
Occasional onsite work negotiable
Allocation
Fractional or full-time
Detail
Employment history on LinkedIn
Contact

What needs to start moving?

If you need senior engineering capacity for an important product, tell me where things stand. You can reserve a 20-minute introduction now or send a short email first.

Currently booking fractional and full-time contract engagements.