POC and demo scripts
Five demos a customer can run on a short call or in a day. Every command is copied from Fly.io’s docs, so the syntax is real, and the expected output is whatever the docs show. Do a dry run the day before, because flags and output change.
This page is drawn from https://fly.io/docs/getting-started/launch-demo/, https://fly.io/docs/launch/autostop-autostart/, https://fly.io/docs/reference/fly-proxy-autostop-autostart/, https://fly.io/docs/launch/volume-storage/, https://fly.io/docs/volumes/overview/, https://fly.io/docs/blueprints/private-applications-flycast/, https://fly.io/docs/networking/flycast/, https://fly.io/docs/networking/private-networking/, https://fly.io/docs/sprites/quickstart/, https://fly.io/docs/sprites/concepts/checkpoints/, https://fly.io/docs/about/free-trial/, https://fly.io/sprites and https://docs.sprites.dev (which served the Sprites docs when fetched 2026-11-04).
Before you start
- Install flyctl and sign in with
fly auth login(https://fly.io/docs/getting-started/launch-demo/). - Trial accounts are capped: up to 10 Machines, up to
shared-cpu-2x, 20GB of volumes in total, 3 Sprites, and “Trial Machines stop automatically after running for 5 minutes.” (https://fly.io/docs/about/free-trial/). Add a card before a customer demo, or Demo 2 and Demo 3 will confuse people. - Dedicated IPv4 and extensions such as Tigris are not available on a trial (https://fly.io/docs/about/free-trial/).
- The Sprites landing page says “$30 in trial credits” (https://fly.io/sprites) while the platform trial page says a $1 credit (https://fly.io/docs/about/free-trial/). [verify] which one applies to the account you demo with.
POC success criteria (agree on these first)
| # | Criterion | How to show it |
|---|---|---|
| 1 | A real app is live on a fly.dev HTTPS URL in minutes | Demo 1 |
| 2 | An idle app costs close to nothing and wakes on a request | Demo 2 |
| 3 | Data survives a restart | Demo 3 |
| 4 | An internal service is reachable only from the org network | Demo 4 |
| 5 | An agent sandbox can be saved and rolled back | Demo 5 |
Demo 1: zero to a live app with fly launch (5 minutes)
fly launch --image flyio/hellofly:latest
fly status
fly apps open /fred
fly deploy
fly apps destroy
- Expected:
fly launchprints a summary (organization, name, region, “App Machines: shared-cpu-1x, 1GB RAM”) and asks “Do you want to tweak these settings before proceeding?”. Answernto deploy, and the last line is “Visit your newly deployed app at https://my-app-name.fly.dev/” (https://fly.io/docs/getting-started/launch-demo/). - Expected:
fly statusshows the app with two Machines in one region, and the docs’ example has onestartedand onestopped(https://fly.io/docs/getting-started/launch-demo/). - Say: “We recommend running at least two Machines to improve availability” (https://fly.io/docs/getting-started/launch-demo/).
- Say: the app gets a dedicated IPv6 and a shared IPv4 at no charge (https://fly.io/docs/about/pricing/).
- Close:
fly apps destroyso nothing keeps billing (https://fly.io/docs/getting-started/launch-demo/).
Demo 2: scale to zero with autostop and autostart (5 minutes plus a wait)
fly launch writes these settings by default (https://fly.io/docs/launch/autostop-autostart/):
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = "stop"
auto_start_machines = true
min_machines_running = 0
fly status
fly machine suspend <machine-id>
fly machine status <machine-id>
fly machine start <machine-id>
- Show: wait for Fly Proxy to stop idle Machines (it checks “every few minutes” and stops one Machine per region per pass), then request the URL. “A cold start takes about 2 seconds or more for common apps.” (https://fly.io/docs/launch/autostop-autostart/, https://fly.io/docs/reference/fly-proxy-autostop-autostart/)
- Faster wake: set
auto_stop_machines = "suspend". “Resuming a suspended Machine takes a few hundred milliseconds.” Read the caveats first (https://fly.io/docs/launch/autostop-autostart/, https://fly.io/docs/reference/suspend-resume/). - Cost line: a 512MB
shared-cpu-1xrunning 2 hours a day is $0.31 a month, plus $0.14 for its 1GB rootfs while stopped, $0.45 in total (https://fly.io/docs/launch/autostop-autostart/). - Warn: a volume is billed in full whether or not its Machine runs, so a 10GB volume ($1.50) can cost more than the rest (https://fly.io/docs/launch/autostop-autostart/).
Demo 3: attach a volume and survive a restart (8 minutes)
fly launch --no-deploy
# add to fly.toml: [mounts] source = "myapp_data" destination = "/data"
fly volumes create myapp_data -r <region code>
fly deploy
fly volumes list
fly ssh console -s -C df
fly machine restart <machine id>
- Expected:
dflists the volume mounted at/data, for example a/dev/vdbline with/datain the Mounted on column (https://fly.io/docs/launch/volume-storage/). - Prove it: write a file under
/datawithfly ssh console -C "<command>"(the exact one-liner is yours to choose, [verify] in a dry run), restart the Machine, read it back. “Access and write to a volume on a Machine just like a regular directory.” (https://fly.io/docs/volumes/volume-manage/) - Say honestly: “Always provision at least two volumes per app.” Volumes are not replicated for you (https://fly.io/docs/volumes/overview/). Daily snapshots are kept 5 days by default (https://fly.io/docs/volumes/overview/).
- Price: $0.15/GB per month of provisioned capacity (https://fly.io/docs/about/pricing/).
Demo 4: private service over Flycast (10 minutes)
fly launch --image nginxdemos/hello --flycast --internal-port 80 --no-deploy
# set force_https = false in [http_service], then:
fly deploy
fly ips list
fly machine run --shell --vm-memory 1024 ubuntu
# inside the shell: apt update && apt install -y curl iputils-ping dnsutils
nslookup <app>.flycast
curl http://<app>.flycast
- Expected:
fly ips listshows only aprivateIPv6, andnslookupreturns the same address. The blueprint’s firstcurlafter idle took 1.539s and the next 0.018s (https://fly.io/docs/blueprints/private-applications-flycast/). - Say: Flycast routes through Fly Proxy, so a private app can still autostop and autostart (https://fly.io/docs/networking/flycast/).
- Variant:
dig +short aaaa my-app-name.internal @fdaa::3shows the direct 6PN path, which bypasses Fly Proxy (https://fly.io/docs/networking/private-networking/). - Caveat to say out loud: “Flycast is not a replacement for authentication in your private applications.” (https://fly.io/docs/blueprints/private-applications-flycast/)
Demo 5: a Sprite with checkpoint and restore (8 minutes)
# install and create commands: https://fly.io/docs/sprites/quickstart/
# checkpoint and restore commands: https://fly.io/docs/sprites/concepts/checkpoints/
curl -fsSL https://sprites.dev/install.sh | sh
sprite login
sprite create my-first-sprite
sprite use my-first-sprite
sprite exec -- bash -c 'echo Hello from my persistent Sprite! > /home/sprite/greeting.txt'
sprite checkpoint create --comment "demo baseline"
sprite exec -- rm /home/sprite/greeting.txt
sprite restore <checkpoint-id> # the ID printed by the create step, or from: sprite checkpoint list
sprite exec -- cat /home/sprite/greeting.txt
sprite destroy -s my-first-sprite
- Expected:
sprite checkpoint createprints a line like “Checkpoint created: v1” in the docs example; IDs are sequential starting at v0, so read the ID from your own output (https://fly.io/docs/sprites/concepts/checkpoints/). Thermline is mine, so the restore has something to bring back. - Restore is asynchronous: the command returns at once, sessions end, and “A following
sprite execautomatically retries while the Sprite is still coming back up.” (https://fly.io/docs/sprites/concepts/checkpoints/) - Say: a checkpoint saves files, packages and on-disk databases, not running processes or memory (https://fly.io/docs/sprites/concepts/checkpoints/). “Restore is destructive. Checkpoint first.” (https://fly.io/docs/sprites/concepts/checkpoints/)
- Say: the landing page claims checkpoints snapshot “the whole filesystem in about a second” (https://fly.io/sprites).
- Cost line: CPU $0.0385/CPU-hour, memory $0.021875/GB-hour, hot storage $0.000683/GB-hour (https://fly.io/sprites).
POC close-out checklist
- All five criteria shown, with screenshots
-
fly statusandfly volumes listoutput captured for the cost discussion (https://fly.io/docs/about/pricing/) - Limits discussed: one volume per Machine, no automatic replication (https://fly.io/docs/volumes/overview/)
- Trial vs card status confirmed (https://fly.io/docs/about/free-trial/)
- Support tier agreed: Standard $29/month, Premium $199/month, Enterprise from $2,500/month (https://fly.io/docs/about/pricing/)
- Demo apps, volumes and Sprites deleted (
fly apps destroy,sprite destroy), because volumes bill while unattached (https://fly.io/docs/about/pricing/)