Tool

Shipwright CLI

A zero-config deployment CLI that turns any Dockerfile into a preview environment per pull request.

Placeholder preview of the Shipwright CLI interface

Project data

Role
Maintainer
Type
Tool
Stack
  • Node.js
  • TypeScript
  • Docker
  • GitHub Actions
Duration
Ongoing
Year
2025
Status
Live

The challenge

Preview environments for everyone

Small teams wanted per-branch previews but could not justify a platform team to maintain them.

The tool had to run anywhere Docker runs, without a hosted control plane.

How it was built

Development process

Six phases from the first conversation to the release. The bar shows how the time was split.

4 weeks in total

  1. Research

    Timing real pull requests showed that waiting for previews, not building them, cost the most time.

    2 days · Pipeline timings

  2. Architecture

    Data model, rendering strategy and API contracts were agreed before the first screen was drawn.

    3 days · ADR, data model

  3. Interface

    A component inventory and responsive layouts, built entirely from design tokens.

    2 days · Token set, component inventory

  4. Build

    Features went live in small slices behind flags, with typed boundaries between client and server.

    8 days · Feature slices

  5. Testing

    Unit, end-to-end and accessibility checks ran on every pull request.

    3 days · Test suite in CI

  6. Deployment

    Every branch got a preview environment; the production rollout was a single click.

    2 days · Preview and release pipeline

  7. Result

    Adopted by 300+ repositories; the average preview is live 12 seconds after a push.

Screens

Outcome

The results

Placeholder preview of the Shipwright CLI interface

What changed after launch

Adopted by 300+ repositories; the average preview is live 12 seconds after a push.

  • Node.js
  • TypeScript
  • Docker
  • GitHub Actions

Key figures

Weekly installs
3k
Avg. deploy
12s
Contributors
40+

Under the hood

Small core, plugin edges

The core only knows how to build, tag and route containers. Providers for registries, DNS and secrets are plugins with a three-method interface.

Every command is idempotent, so a failed CI step can simply be retried.

  • Node.js
  • TypeScript
  • Docker
  • GitHub Actions

Next project

Want something similar? Let’s talk.

Let’s talk

Tell me about your project. I usually reply within two working days.