←Pierre Sauvignontigersoup.com ↗
Case study · TigerSoup

TigerSoup Case Study

TigerSoup is a free Mac app that gives a new software project a production-grade foundation in under a minute: its own AWS account, a private GitHub repo, keyless deploys over OIDC, and a local scaffold briefed for Claude Code or Codex. I designed and built it solo from June 2026, turning a personal kickoff.sh script into a native app that a non-developer can run without a terminal.

The tigersoup.com homepage: set up a project in under a minute
The TigerSoup homepage, October 2026

At a glance

RoleSole engineer and product owner
PeriodJune 2026 to today, about 215 commits across 4 repositories
ProductNative macOS app (macOS 14+), free, no account with TigerSoup needed
StackSwift and SwiftUI, AWS SDK for Swift, AWS CDK (TypeScript), Lambda, API Gateway, DynamoDB, S3, CloudFront, Astro
IntegrationsAWS Organizations and IAM Identity Center, GitHub OAuth device flow and REST API, Claude Code, Codex, Gemini CLI
Scale7,750 lines of Swift, 215 tests, 4 CDK stacks, 12 blog articles

Delivery

TigerSoup ships continuously. The Mac app is on build 59, signed, notarized and delivered to users through Sparkle auto-update from releases.tigersoup.com. tigersoup.com is live with a one-click download and 12 articles.

Measurement was built in from the start. The app reports setup steps and outcomes to a telemetry endpoint, and a local BackOffice dashboard shows users, projects, setup success rate and where setups fail, so every release can be judged on the funnel from install to first project.

The product

Every new project needs the same foundation before real code: an isolated cloud account, dev split from prod, access policies, keyless deploys, and a scaffolded repo. A seasoned team spends days on it, and most solo setups quietly skip a step. With AI agents writing a new project every week, that tax is paid more often, and the cost of an agent touching production rises.

I had automated this for myself in kickoff.sh, a 797-line Bash script. TigerSoup turns it into a five-step wizard: sign in, name the project, press Create, and open it in your coding agent.

  1. Connect AWS and GitHub. It detects existing ~/.aws profiles, or signs in through IAM Identity Center or a dedicated tigersoup-admin user, and checks whether the account can manage an Organization. GitHub uses the OAuth device flow. Both are saved in the Keychain.
  2. Set up tools. It detects and installs what is missing (Homebrew, git, AWS CLI, Claude Code, Codex) and offers LobsterOne for usage tracking.
  3. Describe the project. Each field is validated as you type, a live preview lists what will be created, and the app checks that the repo name and AWS account are free.
  4. Create. It creates the AWS account through Organizations (one by default, dev and prod behind an Advanced toggle), the private repo, OIDC providers and deploy roles, then writes the scaffold and pushes the first commit.
  5. Build. A confetti screen offers Claude Code, Codex, Gemini CLI or a terminal, and opens Terminal in the project with that agent running.

The scaffold is where the guardrails live. It writes CLAUDE.md and AGENTS.md describing the layout and rules, a deploy.yml that deploys from GitHub Actions on short-lived OIDC tokens, and an aws-safe wrapper with use-dev / use-prod switches so an agent cannot deploy to production by accident. Users who lack an Organization can place the project in their existing account instead; roles are then prefixed and tagged per project.

Projects can also publish a site at <name>.tigersoup.app without TigerSoup touching their traffic, through the subdomain service described below.

Architecture

Everything a project needs lives in the user's own accountsYOUR MACYOUR AWS AND GITHUB ACCOUNTSTIGERSOUP'S AWScreatespusheswriteseditsdeploys via OIDCupdatesusage eventsregistersCoding agentClaude Code, Codex or Gemini CLIreads CLAUDE.md or AGENTS.md firstProject folderdeploy.yml, aws-safe, use-dev / use-prodAWS profiles chained from your sign-inTigerSoup appSwiftUI wizard, AWS SDK for Swiftsign-ins kept in the KeychainProject siteits own CloudFront and certificateserved at name.tigersoup.appGitHubprivate repo, created by the appActions get short-lived OIDC tokensAWS Organizationan account per project, or dev + prodOIDC provider and deploy rolesReleasesS3 + CloudFrontsigned DMG, Sparkle appcastTelemetry APILambda + DynamoDBread by a local BackOfficeSubdomains APILambda + DynamoDB + Route 53only writes 2 DNS records

The app calls AWS and GitHub directly from the Mac, with no aws or gh CLI and no TigerSoup server in the path, so the user's credentials never leave their machine. TigerSoup's own AWS account, defined in 4 CDK stacks, runs only what cannot live with the user: the release feed, the tigersoup.com site, an opt-in usage endpoint, and the subdomain service.

The subdomain service has no shared secret. A project's agent signs an STS GetCallerIdentity request bound to the slug and target, and the Lambda replays it to learn the caller's real AWS account. The first account to claim a slug owns it, up to 10 per account, and the service only ever writes two DNS records: traffic goes straight to the user's CloudFront.

Making it honest

A setup tool that says it succeeded when it didn't is worse than none, because the user finds out at the first deploy. I engineered every step to be real, recoverable and truthful.

ProblemFix
The early prototype ran on a mock engine, which could mask a missing sign-inThe mock is gone; the run fails visibly, and Done only shows when a real result is recorded
A failure in IAM work lost everything done before itProject files and AWS profiles are written before per-account IAM work, so they survive a later failure and Retry resumes
A new account's access role takes minutes to become assumable, so configuration failed at randomConfiguration retries for about 3 minutes; account creation times out after 20 minutes instead of polling forever
Access-key sign-in nudged people to use root keysSign-in creates a dedicated tigersoup-admin IAM user and profile instead
Deploys were refused for repos on GitHub's immutable OIDC subject format (owner@id/name@id)The repo creator returns owner and repo ids, and trust policies accept both subject forms
The GitHub token could end up in .git/config or in error messagesPushes pass the token per call and redact it from every error
Accounts outside an AWS Organization were turned away"Use it as it is": projects share the signed-in account, with roles named and tagged per project

The app is verified the way users see it: UI fixes are checked by rendering through live AppKit at 1x and 2x, which caught outline artefacts that 4x snapshot renders never showed.

Distribution and growth

Pricing. TigerSoup is free, with no TigerSoup account. Users pay AWS and GitHub directly, and nothing it creates costs anything until they run something. That is the pitch to a cautious first-timer, so the site's FAQ spells out the AWS Free Tier trade-offs plainly, including that Organizations moves accounts off the credit plan.

Shipping. Every merge to main builds, signs, notarizes and publishes the DMG and Sparkle appcast from a self-hosted Mac runner, so releases cost no GitHub macOS minutes. Updates install on launch by default and keep the user's choice.

Acquisition. An Astro site at tigersoup.com with a cobalt "mission control" look, mascot illustrations, dark mode, and 12 articles on topics like one AWS account per project, keyless deploys with OIDC, and keeping agents away from production. Sitemap, RSS, JSON-LD and llms.txt are generated at build. The app cross-sells LobsterOne, which shares its release and design conventions.

Outcomes

In four months, working alone, I turned an 800-line script into a signed, self-updating Mac app that sets up a production-grade project without a terminal. It ships continuously, with telemetry measuring every step from install to first project.

My lessons for anyone building a setup tool for the AI-agent era:

  1. Never fake success. A mock fallback hides exactly the failures users most need to see.
  2. The audience is wider than developers now. Plain-language questions ("Do you have an AWS Organization account?") and escape hatches matter more than options.
  3. Write the rules down for the agent. CLAUDE.md and AGENTS.md are the cheapest guardrail there is, and they work from the first prompt.

Contact

Hiring a hands-on product or engineering lead in Toulouse? Let's talk.

pierre.sauvignon at gmail dot com

Message on XLinkedInGitHub