---
title: "Fly.io"
description: "Global application platform enabling developers to deploy and scale applications with edge computing capabilities."
---

# Fly.io
> Global application platform enabling developers to deploy and scale applications with edge computing capabilities.

## Articles

### [Transcribing on Fly GPU Machines](https://yomu.fyi/post/transcribing-on-fly-gpu-machines.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Nov 13, 2023
- Type: Tutorial

Fly GPU Machines are used to run Whisper Webservice for audio transcription, with the post noting that Fly GPUs are deprecated and unavailable after August 1. The setup uses a GPU-friendly Docker image, an a100-pcie-40gb Machine, and a Fly Volume mounted at /root/.cache/whisper so model files download and persist outside the image; ASR\_MODEL=large and ASR\_ENGINE=faster\_whisper configure the service. It shows flyctl commands for creating the app, GPU-hosted volume, Machine, public IPs, and HTTPS routes, then verifies GPU availability with nvidia-smi and exposes the web UI and OpenAPI specification. A second path automates volume and Machine creation through the Machines API, requiring cpu\_kind plus valid cpus and memory\_mb values. It also demonstrates a custom Ubuntu 22.04 image with NVIDIA CUDA libraries, FFmpeg, Python, and Whisper, concluding that GPU Machines can support composable AI workloads.


### [Skip the API, Ship Your Database](https://yomu.fyi/post/skip-the-api-ship-your-database.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Sep 13, 2023
- Type: Explainer

The post describes an unexpected use for LiteFS, a distributed SQLite database: replacing service-to-service APIs with read-only database replicas. Typical APIs require anticipating access patterns; shipping the full database lets clients use SQL joins, aggregation, and windowing locally, while one-way LiteFS replication avoids chatty gossip and is simple to configure with an upstream primary hostname. Moving queries to client hardware removes shared service compute contention and the need for tenant rate limiting and timeouts, but replicas cannot handle mutations and raw schema changes create looser contracts, mitigated by backward-compatible changes and views. Data access is harder to restrict in multi-tenant databases, so per-tenant SQLite files are a suggested workaround. The approach is positioned for specific read-heavy use cases, potentially including local copies of Stripe or GitHub data, with event buses such as Kafka generating per-tenant databases.


### [Automated Sentry Error Tracking](https://yomu.fyi/post/automated-sentry-error-tracking.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Sep 12, 2023
- Type: Announcement

Fly.io announces Sentry as the default error-monitoring tool for its applications, with new deployments receiving an automatically provisioned Sentry project and existing apps using flyctl ext sentry create. Each organization receives one year of monthly Team Plan credits covering 50,000 error events, 100,000 performance units, 500 session replays, and 1GB of attachment storage. For Rails apps, flyctl launch installs the required gems, creates initializers, and sets the SENTRY\_DSN secret, allowing boot failures, memory exhaustion, exceptions, latency issues, and crashes to reach Sentry. The post demonstrates a deliberately raised Ruby exception, then uses flyctl apps errors to open the Sentry issue dashboard and identify the bug; planned extensions include release tracking and out-of-memory events.


### [Tracking Application-Level Consistency with LiteFS](https://yomu.fyi/post/tracking-application-level-consistency-with-litefs.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Aug 30, 2023
- Type: Problem & solution

LiteFS must keep an application’s view consistent when a write reaches a primary and a subsequent read is served by a lagging replica. The project first considered making applications track each database’s replication position—a TXID paired with a post-apply checksum—and wait for replicas to catch up, but rejected that complexity and abandoned language-specific libraries. It instead introduces a thin HTTP proxy in front of the application: method-based request inspection routes writes to the primary, attaches the committed TXID in a cookie, and delays reads until the local replica reaches that position or times out. The proxy also exposes lag through health checks, allowing Fly.io to remove unhealthy replicas from rotation and restore them after reconnection. This design provides read-your-writes guarantees with little application change, but depends on cookies and conventional HTTP request/response traffic, limiting use with some applications and websocket-heavy frameworks.


### [Multiple Logs for Resiliency](https://yomu.fyi/post/multiple-logs-for-resiliency.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jul 21, 2023
- Type: Problem & solution

An unexpected network outage can make an application misbehave while also removing crucial log data from the normal Fly.io pipeline. The post traces that pipeline from application STDOUT through Fly.io, NATS, the Log Shipper, Vector, and a third-party provider, then presents two ways to add redundancy. One strategy broadcasts framework logs to a separate file on each machine, preferably on a persistent volume with rotation; a Rails example uses ActiveSupport::Logger.broadcast. The other runs a separate app that subscribes directly to NATS, parses messages, and writes selected fields to disk, with a Fly authentication token and provisions for reconnection and error handling. File copies are more failsafe but raw and harder to fetch, while a custom shipper can produce more usable data but is less bulletproof.


### [Tokenized Tokens](https://yomu.fyi/post/tokenized-tokens.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jul 12, 2023
- Type: Problem & solution

Fly.io describes a security problem in its Rails-based platform: as the application accumulated secrets, Rails became the part of the attack surface least trusted, yet still handled many operations involving bearer tokens. It compares model encryption, Vault or KMS, and narrowly scoped secret-handling services, noting that each leaves gaps or creates operational overhead when secrets must be read for arbitrary third-party APIs. The proposed Tokenizer is a stateless HTTP proxy holding a Curve25519 private key; encrypted secrets travel in Proxy-Tokenizer headers, and the proxy injects plaintext or computes HMACs while host allowlists constrain misuse. A companion SSOkenizer performs OAuth2 flows outside Rails, tokenizes resulting bearer tokens, and returns credentials usable only through Tokenizer. The tools are open source, and the design provides a path for third-party integrations and SSO without adding raw secrets to Rails.


### [Fly.io ❤️  Bun](https://yomu.fyi/post/fly-io-bun.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jul 11, 2023
- Type: Announcement

Fly.io is preparing support for Bun as Bun 1.0 approaches, expanding beyond its ongoing Node.js work because Bun aims for complete Node.js API compatibility. With flyctl 0.1.54 and @flydotio/dockerfile 0.3.3, users can launch and deploy Bun applications through fly launch and fly deploy if Bun 0.5.3 or later is installed and package.json includes an eligible start, module/type, or main configuration. The post says applications following Bun’s Quickstart and Fly’s hands-on walkthrough can be deployed, and provides a sample. Support is beta, with noted compatibility issues including bun install lacking --prune, unsupported throwIfNoEntry in fs.statSync, and readline-based programs failing to exit; shared Dockerfile generation means fixes for either runtime generally benefit both.


### [LiteFS Cloud: Distributed SQLite with Managed Backups](https://yomu.fyi/post/litefs-cloud-distributed-sqlite-with-managed-backups.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jul 5, 2023
- Type: Announcement

LiteFS Cloud, launched in preview, adds managed backups and restores to LiteFS, an open-source distributed SQLite database that replicates data across application-cluster nodes. Existing LiteFS users had to create snapshots, choose retention, and accept restoration points limited by snapshot frequency; the service instead provides an equivalent snapshot every five minutes and restores within the last 30 days at five-minute granularity. Setup requires LiteFS 0.5.1 or later, a dashboard-created cluster, and an auth token, after which backups are automatic and dashboard restores use the latest snapshot before a selected timestamp. Its LTX format stores changed database pages, while multi-level compactions combine daily snapshots, hourly changes, and five-minute intervals so a restore can stream-merge a minimal set of files. To improve async replication’s durability trade-offs, the primary batches changes, LiteFS Cloud persists them in S3, and a high water mark prevents local transaction files from being removed before storage confirmation.


### [We Raised A Bunch Of Money](https://yomu.fyi/post/we-raised-a-bunch-of-money.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jun 27, 2023
- Type: Announcement

Fly.io announces $25MM from A16Z and existing investors followed by $70MM led by EQT Ventures, and uses the occasion to explain its platform vision. Its central problem is the “two hour” barrier: ordinary tooling makes global deployment, VMs, real-time features, encryption, and clustered databases too difficult to pursue quickly, leaving many applications concentrated in us-east-1. The company’s approach is to build a hardware-backed platform and toolchain spanning many regions, with Fly Machines making on-demand VM creation as straightforward as a function call. Funding will support 33 regions, support and reliability, advanced storage, security capabilities, and new hardware while preserving a self-service experience for containerized applications. The stated user-facing promise is that an existing Docker container can run on Fly.io in single-digit minutes and reach every continent in another minute or two.


### [Python Async Workers on Fly Machines](https://yomu.fyi/post/python-async-workers-on-fly-machines.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: May 31, 2023
- Type: Tutorial

A Python web app needed to build and install libraries without blocking HTTP requests or risking backend failures when resource-heavy builds overlapped. The initial backend implementation sometimes ran for more than 30 minutes and could kill the backend, while always-on Celery workers left capacity idle. The proposed proof of concept stores job parameters in Redis, starts a Fly Machine through the Machines API with Redis key environment variables, executes a Python function, and writes the result back. A status endpoint polls the Machine state and returns PENDING until completion, after which cleanup deletes the Machine and Redis entries. The design pays for worker resources only during jobs, but the example requires JSON-serializable arguments and results and is presented as a simple implementation rather than a full job system.


### [Vanilla with Candy Sprinkles](https://yomu.fyi/post/vanilla-with-candy-sprinkles.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: May 18, 2023
- Type: Tutorial

Vanilla with Candy Sprinkles presents a baseline full-stack Node.js application: a stateful visitor counter that increments across refreshes, tabs, browsers, and machines. The post starts with a dependency-free package.json and a 72-line server.js, then uses node-demo to generate variants with ECMAScript modules, EJS or Mustache templates, and Express. It adds SQLite3 or PostgreSQL for persistence, Tailwind CSS and TypeScript with a build step, and Drizzle, Knex, or Prisma as ORM options, noting differing language and build requirements. WebSockets provide real-time updates, htmx can handle client-side connection and DOM work, and Redis coordinates notifications across multiple servers; Fly.io deployment can scale the setup across eight instances in four regions. The concluding section points to further alternatives, including React, Angular, Lit, SolidJS, Svelte, Vue, esbuild, rollup, and other deployment targets, while inviting alternate implementations.


### [Playing Traffic Cop with Fly-Replay](https://yomu.fyi/post/playing-traffic-cop-with-fly-replay.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: May 15, 2023
- Type: Tutorial

Fly.io’s fly-replay response header lets the Fly Proxy replay an HTTP request on another app, region, or VM within the same organization. The post explains how this can send writes near a leader database, preserve request locality after uploads, wake Machines stopped on exit, or route customer traffic across apps. It then builds a small Go reverse-proxy application that looks up the request hostname in SQLite and returns either app=our-default-app or the registered customer’s app in the header. Local request handling and lookup took about 4 ms, while the real-world proxy-and-replay path added about 100 ms; private customer apps remained reachable because Fly services can be defined without public IP addresses. The post also mentions LiteFS and internal DNS as possible discovery mechanisms.


### [The JavaScript Ecosystem is Delightfully Weird](https://yomu.fyi/post/the-javascript-ecosystem-is-delightfully-weird.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: May 11, 2023
- Type: Explainer

The post explains why the JavaScript ecosystem is “delightfully weird,” arguing that its defining feature is not JavaScript’s oddness but the layers of transformation surrounding it. Bundlers first changed source boundaries by minimizing, tree-shaking, code-splitting, and producing executable files different from those developers wrote; CoffeeScript, Babel, TypeScript, JSX, Svelte, and esbuild extended that pattern. Frameworks and tools also make the ecosystem a “Big Tent,” allowing imports of CSS or PNG files and adding semantics outside ECMAScript, such as Svelte’s reactive labels and TypeScript annotations. React Server Components push this further: “use server” and “use client” are valid no-op statements whose placement changes code meaning, while RSC compiles into a stream of tagged JSON and depends on bundlers. The post presents this cooperation among languages, frameworks, routers, and bundlers—including the server/client interaction demonstrated in Dan Abramov’s React talk—as profound and beneficial, especially for geographically distributed application styles.


### [Deploying LangChain to Fly.io](https://yomu.fyi/post/deploying-langchain-to-fly-io.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: May 8, 2023
- Type: Tutorial

Deploying a minimal LangChain application to Fly.io, using Flask, requires a small Python project that accepts a place and asks an OpenAI-backed model for three places to eat there. The example uses LangChain’s OpenAI wrapper, PromptTemplate, temperature 0.9, and a default Berlin value, while Flask routes requests at / or / and renders the model’s split response in HTML. Local setup includes a virtual environment, pinned Flask, gunicorn, langchain, openai, and python-dotenv dependencies, with OPENAI\_API\_KEY stored in a local .env file; production uses gunicorn rather than Flask’s development server. Fly launch configures the app name, organization, and deployment region, and fly deploy builds and publishes an image before provisioning machines. The article concludes that more complex, user-dependent requests require LangChain agents and tools, such as Google Places API, because language models lack real-time data and internet browsing.


### [Fly.io ❤️  JS](https://yomu.fyi/post/fly-io-js.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Apr 24, 2023
- Type: Announcement

Fly.io proposes a general-purpose way to deploy JavaScript and Node.js applications despite the ecosystem’s many frameworks, package managers, runtimes, and TypeScript conventions. Its dockerfile-node project uses package.json, lockfiles, and dependency metadata to generate a baseline Dockerfile, .dockerignore, and optionally a docker-entrypoint script; users can invoke it with npx @flydotio/dockerfile. Conditional EJS templates accommodate framework-specific requirements, with initial templates for Express, Fastify, Gatsby, Nest, Next, Nuxt, and Remix, though current support may extend only to a splash screen. Future plans include replacing Fly.io’s existing flyctl scanners, integrating deployment-time secrets, volumes, databases, and health checks, and adding customization such as build caching, swap, Docker Compose generation, browser setup, and non-root execution.


### [Gossip Glomers](https://yomu.fyi/post/gossip-glomers.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 22, 2023
- Type: Announcement

Gossip Glomers is a series of distributed-systems programming challenges created by Fly.io and Kyle Kingsbury, author of Jepsen, to connect practical coding with distributed-systems theory. Each challenge supplies a workload, a simulated network that can partition or delay messages, and a Jepsen-based verification system; participants write the node binary. The progression covers Echo, a coordination-free unique ID generator, fault-tolerant broadcast, a grow-only counter over Maelstrom’s sequentially consistent key/value store, a Kafka-like replicated log over a linearizable store, and totally available transactions across consistency levels. Initially developed as a resume-blind work-sample evaluation for staff-engineer hiring, the challenges were released publicly because the creators found them too useful and enjoyable to keep internal, with the hardest challenge remaining part of Fly.io’s staff-engineer evaluation.


### [Shipping Logs](https://yomu.fyi/post/shipping-logs.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 21, 2023
- Type: Tutorial

Shipping Logs describes how Fly.io application stdout moves through the platform and how to centralize and retain it beyond Fly.io’s log lifetime. Apps run in Firecracker VMs, where an injected Rust init process captures stdout and sends it through host-side Go code to Vector, which publishes the logs to an internal NATS cluster; Flaps limits access to an organization’s logs. The Fly Log Shipper runs Vector as a NATS client and forwards organization-wide streams to a configured sink such as Logtail, Loki, Datadog, or Cloudwatch, using secrets for provider credentials. Deployment involves launching the image, removing the generated services section, adding an internal port, and running fly deploy. A SUBJECT environment variable can narrow collection with NATS subjects such as logs.sandwich.>, covering an app across regions and instances.


### [Carving The Scheduler Out Of Our Orchestrator](https://yomu.fyi/post/carving-the-scheduler-out-of-our-orchestrator.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Feb 1, 2023
- Type: Explainer

Fly.io describes why it is carving scheduling out of its existing Nomad-based orchestrator and replacing it with a simpler system centered on flyd and AppsV2. It first reduces orchestration to a client-server supervisor, then explains centralized scheduling: workers register resources, while a server filters candidates by constraints and ranks them. The proposed design avoids jobs sitting pending or being placed in nearby but incorrect regions; requesting VMs in MAD yields MAD capacity or nothing. Policy-heavy behavior such as deployment spares, crash recovery across workers, and regional decisions moves into flyctl and other platform components rather than the scheduler. Fly Machines already exposes APIs to reserve, start, and stop individual VMs, with Nomad still used in January 2023 and flyd expected for deployments in December 2023.


### [WAL Mode in LiteFS](https://yomu.fyi/post/wal-mode-in-litefs.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Jan 4, 2023
- Type: Announcement

LiteFS v0.3.0 adds support for SQLite’s write-ahead log (WAL) alongside the previously supported rollback journal, allowing its distributed file system to replicate transactions from either journaling mode. The post explains how rollback journals and WAL differ, then shows how LiteFS observes filesystem calls, identifies changed pages, and emits a common LTX change-set format; in WAL mode, the final frame’s commit field marks transaction completion. Replica nodes validate LTX files, acquire SQLite-compatible locks, and apply the changes, while the new litefs import command transactionally replaces a database for bootstrapping or snapshot reversion. Version 0.3.0 also replaces previous-page checksum tracking with a per-page checksum map, costing about 3 MB of RAM per gigabyte and roughly 5 ms of CPU time per gigabyte per commit, and adds a trace log whose enabled use can double disk I/O.


### [Launching Redis by Upstash](https://yomu.fyi/post/launching-redis-by-upstash.md)
- Company: [Fly.io](https://yomu.fyi/company/fly-io.md)
- Published: Dec 15, 2022
- Type: Announcement

Fly.io and Upstash launched a managed Redis service positioned close to Fly.io applications, with global replicas, a free tier, and private encrypted IPv6 connectivity. The integration uses Flycast, Machines API, WireGuard networking, and PROXY protocol headers: flyctl provisions a Flycast IP, routes it through global proxies to the nearest healthy Redis instance, and lets multitenant Redis identify the customer database without exposing its password. Applications can add replicas and write forwarding through flyctl while retaining a single Redis URI; writes go to the primary and reads and writes use geographically nearest replicas. The post illustrates edge HTML caching for a Rails recipe app, reporting low-millisecond global time to first byte for cached GET requests. It also describes read-your-own-write handling, including a 500ms replication wait and fallback reads from the source of truth.


[Newer posts](https://yomu.fyi/company/fly-io/page/3.md) · [Older posts](https://yomu.fyi/company/fly-io/page/5.md)
