# fast-cli: Fast.com speed tests from the terminal

> fast-cli is a Node.js command-line tool for measuring download speed through fast.com, with optional upload tests and structured output. It fits users who want a quick terminal check, but its Puppeteer dependency, Chrome download, and Node.js requirement make setup heavier than a lightweight network probe.

**sindresorhus/fast-cli** — Test your download and upload speed using fast.com

- Repository: https://github.com/sindresorhus/fast-cli
- Stars: 2,892 · Forks: 123
- Language: TypeScript
- License: MIT
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/sindresorhus-fast-cli

## Why fast-cli targets fast.com users

fast-cli solves a narrow problem: checking internet speed from a terminal without manually opening fast.com in a browser. It is aimed at developers, system administrators, and other users who already work from the command line and want a fast.com result as part of a local check or script. The default command measures download speed, while the `--upload` option adds upload measurement. This distinction matters because the README describes the project as a fast.com client rather than a general-purpose network diagnostic suite.

The tool also offers output choices for different uses. The normal interface prints the measured speed in Mbps. `--single-line` reduces spacing and produces compact output. `--json` returns a machine-readable object, which is more suitable for scripts that need to consume the result. `--verbose` adds latency, client location, server locations, and other diagnostic information. These options make the CLI useful both for an interactive check and for lightweight automation, although the documentation does not describe a continuous monitoring mode, scheduled execution, or a daemon.

The scope is narrower than a general connection-management tool. fast-cli does not provide configuration for selecting a particular fast.com server, changing the test duration, selecting a network interface, or comparing multiple providers. Those features are not documented, so they should not be assumed. Its identity is tied to fast.com and its browser-driven measurement path.

## The browser-driven measurement path

The repository identifies Puppeteer as the underlying browser automation dependency. The README says that Puppeteer downloads Chrome, approximately 200 MB, on first run if Chrome is not already installed. That detail explains both the tool's behavior and its main operational cost. fast-cli is not a small standalone socket program in the published package. It is a Node.js CLI built around browser automation, with Ink, React, `meow`, and related packages visible in package.json.

The package exposes the executable as `fast`, pointing to `./distribution/cli.js`. The repository also contains TypeScript source under `source/`, while `distribution` is the published file set. The package is declared as an ES module, and the build script uses `tsc`. The README does not document the internal fast.com requests or the precise browser events used to collect results, so the exact measurement sequence cannot be confirmed from the available files. The safe description is that the CLI uses Puppeteer to interact with the fast.com measurement flow and presents the resulting download and upload values.

That architecture creates a clear dependency boundary. The command requires a compatible Node.js runtime, a Chrome installation managed or located by Puppeteer, network access to fast.com, and enough local storage for Chrome. It also means that a fast-cli result depends on more than the terminal program itself. Browser startup, page loading, and fast.com availability can all affect whether a measurement completes.

## Installing fast-cli and running the first measurement

The README requires Node.js 22.12 or later. The package declares the same minimum as `>=22.12.0`, so the runtime requirement is explicit rather than inferred from the project type. Install the command globally with npm:

```bash
npm install --global fast-cli
```

After installation, run the executable with no arguments to measure download speed:

```bash
fast
```

The README presents the basic usage as `fast`, and the package maps that command to `distribution/cli.js`. On the first run, allow time for Puppeteer to download Chrome if it is not already present. The README identifies Chrome as roughly 200 MB and links installation troubleshooting to Puppeteer's documentation. The first successful invocation should produce a download speed in Mbps.

To include upload speed and inspect the output as JSON, use:

```bash
fast --upload --json
```

The README gives this command as an example and states that the JSON speeds are in Mbps. A JSON result can contain fields such as `downloadSpeed`, `uploadSpeed`, latency, locations, and transfer values. The exact values are determined by the test, so no fixed output should be expected.

For diagnostic details, run:

```bash
fast --verbose
```

This mode includes unloaded and loaded latency, client location, and server locations in addition to speed values. The location fields can include client and server geography, while verbose output may also expose an IP address in the displayed diagnostic information. That output should be treated carefully when results are copied into logs or shared with others.

## Choosing normal, verbose, and JSON output

The output modes address different operational needs. Normal output is the shortest path for checking download throughput. Adding `--upload` measures upload speed as well, which is useful when a connection may be asymmetric. The README shows both download and upload values in Mbps, but it does not explain how long each test takes or how many samples are collected.

The `--single-line` option reduces spacing and output to one line. This is useful when the result must fit into a terminal, log line, or simple shell pipeline. The README does not document whether it changes the underlying measurement, so it should be treated as a presentation option.

`--json` is the appropriate choice for local scripts. It provides named fields instead of requiring a parser for human-formatted text. The documented object includes `downloadSpeed`, `uploadSpeed`, `downloaded`, `uploaded`, `latency`, `bufferBloat`, `userLocation`, `serverLocations`, and `userIp`. The presence of `bufferBloat` and unloaded and loaded latency in verbose output adds diagnostic context, but fast-cli is still centered on speed measurement rather than a complete explanation of connection quality.

The command can be redirected, as shown by the README:

```bash
fast --upload > file && cat file
```

That form records the command output in `file` and displays it with `cat`. For automation, JSON is less ambiguous because field names identify the values. The documentation does not provide an exit-code policy, a retry command, or a documented way to select a specific server, so scripts should verify the output shape rather than assume every possible failure has a dedicated status.

## Puppeteer's first-run cost and operational limits

The largest limitation is setup weight. fast-cli requires Node.js 22.12 or later, installs a package with Puppeteer, and may download Chrome of approximately 200 MB on first use. This is a poor fit for a locked-down workstation, a minimal container, or an environment where large browser downloads are restricted. It is also a poor fit for a user who only needs a quick ping or latency check.

Browser automation also makes the tool dependent on fast.com being reachable and on the browser-based measurement flow completing. The README does not document offline behavior, timeout handling, retry behavior, proxy configuration, or a command for choosing a server. Those omissions matter for automation. A failed browser launch, unavailable fast.com page, blocked download, or incomplete measurement should not be interpreted as a particular network speed without checking the command's actual output.

Another practical boundary is privacy. Verbose and JSON output can include `userIp`, client location, and server locations. The documentation presents these fields as part of the result, but it does not describe logging, retention, or anonymization behavior beyond that output. Users who publish terminal captures should inspect the fields before sharing them.

The related project listed in the README is `speed-test`, which uses speedtest.net. That is a different provider and a different measurement approach. `fast-cli` is the appropriate choice when the fast.com result matters specifically. It is less appropriate when speedtest.net is the required reference, or when a browser-based dependency is unacceptable.

## Licensing, releases, and upgrade work

The repository is licensed under MIT. The package metadata names Sindre Sorhus as author and points to the GitHub repository for source and sponsorship information. The license identifier is available in package.json and the repository contains a license file, so the stated licensing model is clear. This description does not replace the license text or provide legal advice about how a particular deployment must comply with it.

The package uses the semantic version shown as `6.0.0`. Recent release entries include v6.0.0 on 2026-10-14, v5.2.0 on 2026-02-02, and v5.1.0 on 2026-01-01. The repository is not archived, and the last push was on 2026-10-14. That release history indicates recent project activity, but upgrading can still involve more than changing one line in a deployment because the minimum Node.js version is 22.12 or later and the runtime dependency set includes Puppeteer.

The published package contains `distribution`, while TypeScript sources and development tests remain in the repository. Consumers therefore receive a built CLI rather than the source directory listed in the repository layout. Before upgrading an installed global command, verify the Node.js version and review the release changes relevant to Puppeteer, browser installation, or output formatting. The README does not provide an automated rollback procedure, so the available release history and package metadata are the documented basis for upgrade planning.

## Conclusion

Adopt fast-cli when you specifically want fast.com measurements and can provide Node.js 22.12 or later plus the resources required by Puppeteer and Chrome. Do not choose it as a dependency-free connectivity checker or when fast.com is unavailable. Verify first that your Node.js version matches package.json, that Chrome can be downloaded on first use, and that your terminal can handle the output mode you need.

## FAQ

### How do I install fast-cli?

Install it globally with `npm install --global fast-cli` after installing Node.js 22.12 or later. Puppeteer may download Chrome on the first run, so allow space and network access for that download.

### How do I measure upload speed with fast-cli?

Run `fast --upload`. The README says this measures upload speed in addition to download speed, with both values reported in Mbps.

### Can fast-cli return JSON output?

Yes. Run `fast --upload --json` to request JSON output. The documented fields include download and upload speeds, transfer values, latency, buffer bloat, and location information.

### Does fast-cli require Chrome?

The README says the project uses Puppeteer under the hood and downloads Chrome, approximately 200 MB, on first run if it is not already installed. This makes browser availability an installation consideration.

### Which Node.js version does fast-cli require?

The README requires Node.js 22.12 or later, and package.json declares the engine requirement as `>=22.12.0`.

### What is the difference between fast-cli and speed-test?

The README identifies `speed-test` as a related tool for testing internet connection speed and ping using speedtest.net. fast-cli uses fast.com instead, so the provider and measurement site differ.

## Sources

- [Issues](https://github.com/sindresorhus/fast-cli/issues)
- [License: MIT](https://github.com/sindresorhus/fast-cli/blob/main/LICENSE)
- [README](https://github.com/sindresorhus/fast-cli/blob/main/README.md)
- [Releases](https://github.com/sindresorhus/fast-cli/releases)
- [sindresorhus/fast-cli on GitHub](https://github.com/sindresorhus/fast-cli)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/sindresorhus-fast-cli
