Suture 5.4.0 Deployment Runbook
Step-by-step instructions for deploying the Suture platform, publishing packages, and launching v5.4.0. Every command, every click, no ambiguity.
Section 1: Prerequisites
WyattAu/suturerust-toolchain.tomlsuture-merge-driversuture-merge-driverflyctl CLIvsce CLISection 2: Platform Deployment
# 1. Install flyctl
curl -L https://fly.io/install.sh | sh
# 2. Authenticate (opens browser)
fly auth login
# 3. Create the app (run from repo root, where fly.toml lives)
fly apps create suture-platform
# 4. Set required secrets
fly secrets set JWT_SECRET=$(openssl rand -hex 32)
fly secrets set DATABASE_URL=/data/platform.db
Optional: Stripe integration
# Set these after completing Section 4 (Stripe Configuration)
fly secrets set STRIPE_SECRET_KEY=sk_test_...
fly secrets set STRIPE_WEBHOOK_SECRET=whsec_...
fly secrets set STRIPE_PRICE_PRO=price_...
fly secrets set STRIPE_PRICE_ENTERPRISE=price_...
Optional: GitHub OAuth
# Set these after creating an OAuth App in GitHub Developer Settings
# https://github.com/settings/developers → New OAuth App
fly secrets set GITHUB_CLIENT_ID=...
fly secrets set GITHUB_CLIENT_SECRET=...
fly secrets set GITHUB_REDIRECT_URL=https://suture-platform.fly.dev/auth/github/callback
Deploy
# Deploy from repo root (uses fly.toml + Dockerfile)
fly deploy
# Verify
fly status
curl https://suture-platform.fly.dev/healthz
# Expected: {"status":"ok"}
Section 3: Custom Domain
# Add your domain
fly certs add suture.dev
# Check certificate status (may take a few minutes)
fly certs list
# DNS configuration: add these records at your registrar
# CNAME *.suture.dev → suture-platform.fly.dev
# CNAME suture.dev → suture-platform.fly.dev
# Verify DNS propagation
dig suture.dev +short
Section 4: Stripe Configuration
Step 1: Create Products
- Go to stripe.com → Products → Add Product
- Create Suture Pro:
- Name:
Suture Pro - Type: Recurring
- Price:
$9 / month - Copy the price ID (looks like
price_1Qx...)
- Create Suture Enterprise:
- Name:
Suture Enterprise - Type: Recurring
- Price:
$29 / month - Copy the price ID
Step 2: Create Webhook Endpoint
- Go to stripe.com → Developers → Webhooks → Add endpoint
- Endpoint URL:
https://suture-platform.fly.dev/billing/webhook - Events to listen for (select these four):
checkout.session.completedcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_failed
- Click Add endpoint
- Copy the Signing secret (looks like
whsec_...)
Step 3: Set Stripe secrets on Fly.io
fly secrets set STRIPE_SECRET_KEY=sk_test_...
fly secrets set STRIPE_WEBHOOK_SECRET=whsec_...
fly secrets set STRIPE_PRICE_PRO=price_...
fly secrets set STRIPE_PRICE_ENTERPRISE=price_...
fly deploy
Step 4: Verify
# Use the Stripe CLI to send a test webhook event
stripe listen --forward-to https://suture-platform.fly.dev/billing/webhook
# In another terminal, trigger a test event
stripe trigger checkout.session.completed
# Verify the platform logs received the event
fly logs
Section 5: GitHub Action Marketplace
- Go to github.com/marketplace/actions/new
- Fill in:
- Name:
Suture Semantic Merge - Description:
Automatically merge JSON, YAML, TOML, XML, CSV, and 12+ structured file formats in CI/CD pipelines - Owner:
WyattAu - Repository:
WyattAu/suture - Action file:
action.yml(root of repo)
- Click Publish action
Verify the action works
Create a test workflow in a separate repo:
# .github/workflows/test-suture.yml
name: Test Suture Merge
on: [push]
jobs:
merge:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: WyattAu/suture@v5.4.0
with:
formats: "json,yaml,toml"
Section 6: VS Code Marketplace
# 1. Install vsce
npm install -g @vscode/vsce
# 2. Package the extension (run from vscode-extension/ directory)
cd vscode-extension
vsce package
# Creates: suture-merge-5.1.0.vsix
# 3. Create a publisher (one-time only)
# Go to https://marketplace.visualstudio.com/manage/publishers
# Click "Create Publisher"
# Fill in publisher ID (e.g., "wyattau") and display name
# 4. Login to publisher
vsce login wyattau
# 5. Publish
vsce publish
Section 7: crates.io Publishing
Setup (one-time)
# Login to crates.io
cargo login
# Paste API token from https://crates.io/settings/tokens
Publish in dependency order
# First: leaf crates with no internal dependencies
cargo publish -p suture-common
cargo publish -p suture-bench
cargo publish -p suture-driver
cargo publish -p suture-wasm-plugin
# Then: format drivers (depend on suture-driver)
cargo publish -p suture-driver-json
cargo publish -p suture-driver-yaml
cargo publish -p suture-driver-toml
cargo publish -p suture-driver-xml
cargo publish -p suture-driver-csv
cargo publish -p suture-driver-sql
cargo publish -p suture-driver-html
cargo publish -p suture-driver-markdown
cargo publish -p suture-driver-svg
cargo publish -p suture-driver-docx
cargo publish -p suture-driver-xlsx
cargo publish -p suture-driver-pptx
cargo publish -p suture-driver-pdf
cargo publish -p suture-driver-image
cargo publish -p suture-driver-feed
cargo publish -p suture-driver-ical
cargo publish -p suture-driver-otio
cargo publish -p suture-driver-example
# Then: core crates
cargo publish -p suture-core
cargo publish -p suture-protocol
cargo publish -p suture-merge
cargo publish -p suture-raft
cargo publish -p suture-s3
cargo publish -p suture-vfs
# Then: application crates
cargo publish -p suture-cli
cargo publish -p suture-tui
cargo publish -p suture-lsp
cargo publish -p suture-daemon
cargo publish -p suture-hub
# Finally: platform
cargo publish -p suture-platform
Batch republish (if some crates already exist at v5.1.0)
for crate in suture-common suture-core suture-driver suture-driver-json suture-driver-yaml suture-driver-toml suture-driver-xml suture-driver-csv suture-driver-sql suture-driver-html suture-driver-markdown suture-driver-svg suture-driver-docx suture-driver-xlsx suture-driver-pptx suture-driver-pdf suture-driver-image suture-driver-feed suture-driver-ical suture-driver-otio suture-driver-example suture-hub suture-daemon suture-cli suture-tui suture-lsp suture-merge suture-raft suture-vfs suture-s3 suture-wasm-plugin suture-bench suture-platform; do
cargo publish -p $crate 2>/dev/null || echo "SKIP: $crate"
done
Section 8: npm Publishing
# Login (one-time)
npm login
# Publish from packages/ directory
cd packages/npm
npm publish
Section 9: PyPI Publishing
# Install build tools
pip install build twine
# Build from bindings/ directory
cd bindings/python
python -m build
# Upload
twine upload dist/*
Section 10: Git Tag and GitHub Release
# Create and push the tag
git tag -a v5.1.0 -m "Suture 5.1.0: Semantic Merge for Every Format"
git push origin v5.1.0
# The release workflow (.github/workflows/release.yml) will:
# - Build binaries for Linux (x86_64), macOS (x86_64 + aarch64), Windows (x86_64)
# - Generate SHA256 checksums
# - Create a GitHub Release draft
# Go to https://github.com/WyattAu/suture/releases
# Edit the draft release:
# - Title: "Suture 5.1.0"
# - Copy release notes from CHANGELOG.md [5.1.0] section
# - Click "Publish release"
Section 11: Launch Checklist
Infrastructure
- [ ] Platform deployed and accessible at
https://suture-platform.fly.dev/healthz - [ ] Custom domain
suture.devpointing to platform - [ ] SSL certificate active (
fly certs listshows "Ready") - [ ] Stripe products configured (Pro + Enterprise)
- [ ] Webhook endpoint receiving events (verify with Stripe CLI)
- [ ] Test registration → login → upgrade → portal flow end-to-end
Package Registries
- [ ] GitHub Action published to Marketplace
- [ ] VS Code extension published to Marketplace
- [ ] All 37 crates published to crates.io
- [ ] npm v5.1.0 published
- [ ] PyPI v5.1.0 published
Git
- [ ]
v5.1.0git tag pushed to origin - [ ] GitHub Release created and published
- [ ] Release notes include CHANGELOG entries
Marketing
- [ ] Blog post published (
docs/blog/launch-v5.1.0.md) - [ ] Landing page updated with v5.1.0 features
- [ ] Hacker News post submitted
- [ ] Reddit post submitted (r/rust, r/programming)
- [ ] Twitter/X announcement posted