Website profiles · Technology insights · Alternatives

lychee.cli.rs

A fast, async link checker written in Rust. Finds broken hyperlinks and mail addresses, supports Markdown, HTML and more, simple and lightweight.

No paid content found
Visit website
Profile views 6 Outbound visits 1 Normal
lychee Full homepage screenshot

At a glance

Category
Development
Language
English
Paid-content signal
No paid content foundObserved
Registered
Unknown
Hosting
FastlyInferred
HTTPS certificate trusted
PassedObserved
Last updated

Website review

This review may include AI-generated content and is not individually verified. Domain, certificate and other facts come from the observed data on this page.

What is lychee?

lychee is a command-line link checker: it scans your files or a live site, follows the links it finds, and reports the ones that are broken. It's written in Rust, runs asynchronously, and ships as a single static binary, so there's no runtime to install or dependency chain to manage. It reads Markdown and HTML natively, and can emit structured JSON output.

Who it's for

  • Docs and static-site maintainers — a README or docs folder full of relative links and external URLs is exactly the case it was built for.
  • CI/CD pipelines — JSON output means a build step can fail the job and post a machine-readable list of failures.
  • Large repositories — the async design matters when you have thousands of links rather than dozens.

How it compares to your alternatives

Approach Best when Trade-off
lychee You want one fast pass over many files or a whole site, with CI-friendly output You install and run a separate tool
Editor or IDE link plugins You want feedback while typing Usually checks one file at a time, rarely covers a whole site
Manual spot-checking The link set is tiny and rarely changes Doesn't scale, and misses links buried in generated output

A concrete next step

If you maintain a docs repo, try running lychee against your Markdown directory first and read the failure list before wiring it into CI. That one pass tells you whether the noise level (rate-limited sites, auth-walled pages that return errors to anonymous checkers) is low enough for a blocking build step, or whether you'd rather run it on a schedule and review results. For a hosted alternative aimed at scheduled site checks, see Dead Link Checker.

How do I install lychee on my system?

Install lychee by downloading its single static binary — the official docs recommend this as the simplest route, since there are no runtime dependencies to manage. The project also publishes packages through common system package managers, and you can build it from source with Rust's cargo if you prefer. Check the installation section of lychee for the exact commands for your platform.

Choosing your install method

Method Best for Trade-off
Static binary download Most users, quick setup You update it yourself
System package manager Keeping it current with other tools Version may lag behind releases
cargo install Rust developers, bleeding edge Requires a Rust toolchain and compiles locally

After installing, confirm it works by running lychee --version, then try a real check against a small folder of Markdown or HTML files before wiring it into CI. If you plan to use the JSON output for pipelines, run one test pass with that flag early so you can see the shape of the results before writing parsing logic.

Can lychee check links inside Markdown and HTML files?

Yes. lychee natively supports both Markdown and HTML files, so it can extract and check the links inside them without extra conversion steps.

What that means in practice

  • Markdown: Useful for README files, docs folders, changelogs and static-site content. It can catch broken relative links, dead external URLs and malformed email addresses in your prose.
  • HTML: Useful for built sites, templates and single-page output. It checks anchors and other link-bearing elements in the markup.
  • Mixed repositories: You can point it at a directory and let it handle both formats together, which fits documentation repos that contain .md sources and generated .html.

How to decide if it fits your workflow

Your situation Why lychee suits it
Large docs or codebase with many links Rust-based async checking is built for speed
CI/CD pipeline Structured JSON output makes results machine-readable
Simple setup preferred Distributed as a single static binary
Both Markdown and HTML in one repo Native support for both formats

Next step

Run it against a small folder first, for example your docs/ directory, and inspect the output before wiring it into CI. If you also maintain a website, compare the experience with a dedicated site checker such as Screaming Frog or a hosted service like W3C Validator for markup validation, since those focus on crawling live pages rather than local files.

A concrete scenario

A maintainer with a docs/ folder of Markdown files and a generated site/ folder of HTML can run one command over both, get a JSON report in CI, and fail the build only when a link is genuinely broken. That avoids maintaining two separate checking tools for the same repository.

How do I integrate lychee into a CI/CD pipeline?

Use lychee as a step that fails the build when it finds broken links, and have it emit JSON so your pipeline can archive or post-process the results. The site describes it as an async, Rust-based checker with native Markdown/HTML support, a single static binary, and structured JSON output — all of which suit CI runners.

Typical CI/CD pattern

  1. Install the static binary (or use a container image) in the job.
  2. Run lychee against your docs, site output, or repository files.
  3. Let a non-zero exit code fail the pipeline; capture JSON as a build artifact.
  4. Optionally publish a summary to the pull request or chat.

Concrete example (GitHub Actions-style, illustrative)

- name: Check links
  run: lychee --format json --output lychee-report.json ./docs
- name: Upload report
  if: always()
  uses: actions/upload-artifact@v4
  with:
    name: lychee-report
    path: lychee-report.json

Adapt the path (./docs, ./public, or specific files) to what you actually publish. The --format json flag aligns with the JSON output the site advertises.

What to decide before wiring it in

Decision Why it matters
Check built HTML or source Markdown? Built output catches rendered links; source is faster and catches issues earlier.
Fail the build or warn only? Failing enforces link hygiene but can block merges on flaky external sites.
Check external links every run? External sites are slow and rate-limit; many teams schedule those separately.
Where to store JSON? Artifacts or a PR comment make failures actionable.

Practical cautions

External link checks are the main source of false failures: sites go down, block bots, or rate-limit. Consider running internal-link checks on every commit and external checks on a schedule or nightly job. If lychee supports config files or ignore lists in your version, keep excluded hosts and known-flaky URLs there rather than in the pipeline script.

Next step

Run lychee locally once with JSON output to see the report shape, then copy that exact command into your CI job. Start with internal links only, confirm the pipeline fails correctly on a deliberately broken link, then add external checks on a schedule.

For the authoritative flag names and installation options, see lychee.

How do I configure lychee to ignore or exclude certain links?

Lychee supports excluding links through configuration rather than by editing each file. The two main mechanisms are an exclude pattern list (for matching URLs or paths you never want checked) and an exclude file (a text file of URLs to skip). Patterns are typically regular expressions, so example\.com matches that domain anywhere in a URL. You can also exclude by file path or by link text depending on the flag you use.

The practical distinction matters:

  • Exclude by URL pattern — best when a whole domain, subdomain, or URL fragment is unreliable (rate-limited hosts, staging domains, tracking redirects).
  • Exclude by file — best when you have a long, changing list of known-bad or intentionally dead links you want to maintain separately from your config.
  • Exclude mail addresses — useful if your docs contain placeholder addresses that will never resolve.

Where the settings go

Lychee reads a config file (commonly lychee.toml or lychee.toml referenced via a flag) and also accepts the same options as command-line flags. Typical keys look like exclude, exclude_file, and exclude_mail, and you can point to the config with a --config flag. If you only need a one-off run, passing the exclude flag directly on the command line is simpler than creating a file.

A concrete scenario

Suppose you maintain a documentation site with links to an internal staging server and a few partner sites that block automated requests. You would:

  1. Add a regex for the staging host and the partner domains to exclude.
  2. Put any one-off dead links in an exclude_file so contributors can add to it without touching the main config.
  3. Run lychee in CI with JSON output so failures are reported as structured results rather than raw text.

Trade-offs to weigh

Excluding too broadly hides real breakage — a pattern like .* defeats the purpose. Prefer the narrowest pattern that matches the problem host or path. Also remember that excluded links are silently skipped, so keep the exclude list small and reviewed, and consider a comment or naming convention in the file to record why each entry exists.

Next step

Run lychee --help to confirm the exact flag names for your installed version, then start with a single --exclude pattern and expand only when a link genuinely cannot be checked. The project documentation is at lychee.

What are the performance limits of lychee for very large websites?

Lychee is built to stay fast on large sites because it checks links asynchronously and runs as a single static binary, but the page itself doesn't publish hard performance limits. In practice, throughput depends on how many concurrent requests you allow, how slow the target servers are, and how many links you're checking.

What the site actually claims

  • Async, Rust-powered design aimed at speed for large projects.
  • Native support for Markdown and HTML files.
  • Structured JSON output for CI/CD integration.

Where limits usually show up

  • Network latency and rate limits: Even with async checking, a remote server can throttle or time out, so total runtime is often bounded by the slowest external hosts, not by lychee itself.
  • Concurrency settings: Higher parallelism finishes faster but risks overwhelming targets or triggering blocks; lower settings are safer but slower.
  • Local resource use: A single static binary keeps installation simple, but memory and CPU still scale with the number of links and concurrent connections.
  • CI time budgets: JSON output helps you automate checks, but a very large site may need to be split into scoped runs to fit within pipeline time limits.

Practical next step If you're checking a large documentation site, start with a moderate concurrency level and exclude or retry known slow domains, then measure wall-clock time on a representative subset before running the full site. For a broader comparison of link-checking approaches, see GitHub for lychee's repository and issues, where maintainers and users often discuss large-scale behavior.

Related questions

More questions →
Which file formats and link types can lychee check?

lychee natively supports Markdown and HTML files, and it checks two kinds of targets: hyperlinks and email addresses. That combination makes it a fit for documentation sites, static sites, and codebases where links live inside .md or .html content. If your links are stored in some other format, or if you need to validate something beyond links and mail addresses, lychee's native coverage may not match your project without extra handling.

What lychee checks

The two target types are the core of its scope:

  • Hyperlinks — URLs embedded in your content, which is the primary use case ("finds broken hyperlinks").
  • Mail addresses — email addresses are checked as well, so mailto: links and plain addresses in your files are in scope.

The purpose is broken-link detection: you point lychee at your files, and it reports what no longer resolves.

Which file formats are covered

Format Support
Markdown Native
HTML Native

"Native" matters here: lychee is described as supporting Markdown and HTML files directly, which is why the docs position it as "ideal for documentation and websites." You don't need a conversion step for those two formats.

Where this fits — and where it doesn't

The stated sweet spots are docs, sites, and codebases. Concretely, that means:

  • A Markdown-based documentation repo where internal and external links drift over time.
  • An HTML site where pages link to each other and to outside resources.
  • A codebase whose docs or generated HTML contain links worth validating.

The scope is defined by file format plus target type. So before adopting lychee, check two things against your own project:

  1. Are your links in Markdown or HTML? If yes, you're in the native path.
  2. Are you checking links and email addresses? If you need validation of other content types, that's outside what's described here.

Practical notes for judging fit

  • Large projects: lychee is built with Rust and designed for speed, so scale isn't the limiting factor — format coverage is.
  • CI/CD: structured JSON output is available, which is the intended way to wire results into a pipeline. If you plan to gate merges on link failures, this is the relevant capability.
  • Installation: it ships as a single static binary, so getting it running in a build environment is straightforward.

If your content is Markdown or HTML and your concern is broken hyperlinks and mail addresses, lychee's coverage matches the task. If your links live in a format outside those two, verify support before committing to it.

How lychee Is Installed and Distributed

lychee is distributed as a single static binary, which is the core reason its install and update process stays simple: you obtain one executable and run it, rather than resolving a dependency tree first. That makes it a reasonable fit if you want a lightweight link checker for docs, sites, or codebases without adding a runtime to your environment. The trade-off is that "simple" depends on how you prefer to get binaries — package manager, direct download, or a build from source — and the documentation's own framing is that installation and updates are "a breeze" precisely because everything ships in that one file.

What "single static binary" means in practice

A static binary bundles what the program needs into the executable itself. For lychee, the documented consequence is:

  • No complex dependency setup. You are not installing a language runtime or a set of shared libraries as a prerequisite to running the tool.
  • One artifact to manage. Installing means placing the binary somewhere on your PATH; updating means replacing that file with a newer one.
  • Portable across environments. The same artifact approach is what lets lychee run the same way on a developer machine and inside a CI runner.

This is the mechanism behind the "lightweight deployment" appeal: fewer moving parts means fewer places for an install to fail.

Ways to get lychee

The documentation presents the static binary as the distribution model and points to GitHub as the place to obtain it. In practice, that leaves you with a small set of routes, and the right one depends on your constraints:

Route Best when What you manage
Package manager Your OS or ecosystem already has lychee packaged Updates come through the same upgrade command as your other tools
Direct binary download You want the exact version, or you're pinning in CI You fetch and replace the file yourself
Build from source You need a custom build or a platform without a prebuilt binary You need a Rust toolchain and a build step

If your goal is simply "install it and move on," the package manager route gives you the least ongoing effort because updates ride along with your normal system upgrades. If your goal is reproducibility — the same lychee version on every machine and every CI run — downloading a specific binary and pinning it is the more controllable choice.

Updating

Because the distribution unit is a single file, updating is conceptually the same operation as installing: get the newer binary and put it where the old one was. Two practical notes follow from that:

  • Version pinning is easy, and so is drifting. If you install via a package manager, you may get a newer version than your CI uses. If you pin a binary in CI, you'll stay on that version until you deliberately bump it.
  • Check the version after updating. Running the tool's version flag confirms which binary is actually on your PATH, which matters when an old copy is shadowed by a newer one in a different directory.

Why this matters for CI/CD and large projects

The install model connects directly to how lychee is meant to be used. The documentation highlights async execution for speed on large projects and structured JSON output for CI/CD integration. A static binary supports both: a CI job can fetch one artifact, run it against a large Markdown or HTML corpus, and parse JSON results — without a setup phase that installs a runtime or resolves dependencies on every run. For a large project, that setup phase is often the slowest and most fragile part of a link-checking job, so removing it is the real benefit.

Common friction points

  • PATH and shadowing. After installing, if the command isn't found or runs an unexpected version, the binary likely isn't on PATH or an older copy is taking precedence.
  • Platform availability. Prebuilt binaries cover common platforms; an unusual architecture may push you toward building from source, which reintroduces a toolchain requirement.
  • Assuming "no dependencies" means "no configuration." The binary needs no runtime, but you still decide what to check and how results are reported — that's configuration, not installation.

If you want the lightest possible setup and don't need a specific version, use your package manager. If you need identical behavior across machines and pipelines, download and pin the binary. If neither prebuilt route fits your platform, build from source and accept the toolchain as the cost.

How does lychee fit into CI/CD pipelines and large projects?

lychee is a fast, async link checker written in Rust, and it fits CI/CD pipelines and large projects in two concrete ways: it is built for speed on large codebases, and it emits structured JSON output that automation can consume. If your project has many Markdown or HTML files and you want broken hyperlinks and mail addresses caught automatically, lychee is designed for that job. The sections below cover what it checks, how the async design helps at scale, and how to wire the JSON output into a pipeline.

What lychee checks

lychee natively supports Markdown and HTML files, which makes it a direct fit for documentation sites and web projects. It finds broken hyperlinks and mail addresses. If your repository is mostly docs, README files, or generated HTML, you can point lychee at those files without a conversion step.

Why the async, Rust-based design matters for large projects

The site describes lychee as "built with Rust and designed for speed, making it perfect for large projects." Two properties follow from that:

  • Async checking means link requests are not processed one at a time, so a large set of URLs does not serialize into a long wait.
  • A single static binary means installation and updates do not pull in a runtime or dependency tree, which keeps CI images and local setups simple.

For a large project, the practical effect is that a full link sweep can run as a routine step rather than a slow, occasional audit.

Integrating lychee into CI/CD

The documented integration path is structured JSON output: the site states you can "easily integrate lychee into your CI/CD pipelines with structured JSON output." That gives you a machine-readable result to act on instead of parsing human-readable logs.

A typical pipeline shape:

  1. Trigger — run on pull requests, on a schedule, or before deploy, depending on how often links change.
  2. Run lychee against your Markdown/HTML targets.
  3. Consume JSON output — fail the job on broken links, or post the results as a comment/artifact.
  4. Verify — confirm the job fails when you introduce a deliberately broken link, so you know the gate actually works.

Common sticking points

  • Network-dependent checks: link checking reaches external hosts, so CI runners need outbound access and results can vary with transient failures. Decide whether external failures should block a merge or only warn.
  • Scope: point lychee at the files you actually care about (docs, site output) rather than the whole repository, to keep runs focused.
  • Output handling: since JSON is the integration surface, make sure your pipeline step captures stdout correctly and parses it rather than grepping logs.

Where it fits best

Situation Fit
Large docs/site with many Markdown or HTML files Strong — speed-oriented, async design
CI job that must fail on broken links Strong — structured JSON output
Simple container/CI image without extra runtimes Strong — single static binary
Non-Markdown/HTML formats Check support before relying on it; the documented native formats are Markdown and HTML

Getting started

The site offers a "Get started" path and a GitHub repository for installation and usage details. Start by running lychee locally against your docs to see the baseline, then move the same command into CI and switch your pipeline logic to the JSON output.

What is lychee and what does it do?

lychee is a fast, asynchronous link checker written in Rust. It scans Markdown, HTML, and other files for broken hyperlinks and email addresses, and it is designed to be simple and lightweight enough for docs, websites, and codebases. If you maintain documentation or a site and want to catch dead links quickly, lychee is built for that job.

What lychee checks

lychee looks for links and email addresses in your content and verifies whether they still resolve. Its core purpose is finding broken hyperlinks and mail addresses, so you can fix them before readers hit a dead end.

The tool is positioned for:

  • Documentation projects
  • Websites
  • Codebases

Key capabilities

Async and fast

lychee is built with Rust and designed for speed, which the project says makes it a good fit for large projects. Because it works asynchronously, it can check many links without waiting on each one in sequence.

Markdown and HTML support

lychee natively supports Markdown and HTML files. That makes it directly useful for documentation and websites, where those formats are common.

Single static binary

lychee is distributed as a single static binary. That means installation and updates stay simple, with no complex runtime setup described.

JSON output for CI/CD

lychee can produce structured JSON output, which makes it easy to integrate into CI/CD pipelines. You can run it as part of an automated check and consume the results programmatically.

When to use it

Choose lychee if you want a link checker that:

  • Runs quickly across a large set of files
  • Handles Markdown and HTML natively
  • Installs as one static binary
  • Fits into automated pipelines via JSON output

If your main need is catching broken links and email addresses in docs, sites, or code, lychee is aimed squarely at that task.

Website Overview

An advisory match combined with missing browser safeguards may increase exposure if the affected component is active. Deployment-specific verification and remediation deserve priority. Identifiable technologies and additional version or configuration signals make the service easier to fingerprint, which may help targeted scanners narrow their checks.

Domain and Registration

Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The domain uses the common .rs extension, which is not an independent safety signal.

DNS and Email

Nameservers are provided by DigitalOcean, indicating managed DNS hosting. The CNAME points to lycheeverse.github.io, associated with GitHub Pages. No MX record was found. A conventional explicit inbound-mail route is not configured. The lowest observed DNS TTL is 1800 seconds. No CAA record was found; there is no additional DNS-based restriction on certificate issuers.

TLS and Certificates

The certificate uses an RSA 2048-bit public key, offering broad client compatibility. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued by Let's Encrypt, commonly associated with automated certificate services. The certificate's total validity is about 89 days, consistent with a short renewal cycle.

HTTP and Browser Security

The checked browser-security headers were not detected, leaving fewer explicit browser-side safeguards. CORS permits any origin to read this response. This is common for public resources; sensitive responses need narrower handling. No X-Powered-By header was found, reducing one common source of backend fingerprinting information. The x-cache, x-served-by, via response header indicates a CDN or caching proxy in the delivery path. No obvious internal addresses or debug information were found in the headers.

Technology Stack Analysis

The public page identifies Astro 5.16.2, Fastly, with exact versions exposed for 1 technologies. These details can narrow vulnerability checks, although exposure alone is not a vulnerability. The advisory source OSV places Astro 5.16.2 in the affected range of GHSA-26w7-cxv4-gfx2, GHSA-2pvr-wf23-7pc7, GHSA-376h-93r7-7g6f, GHSA-4g3v-8h47-v7g6, GHSA-7pw4-f3q4-r2p2 等 10 项. Verify the deployed version and relevant configuration before drawing conclusions about exploitability. Updating affected components should be a priority.

Search and Social Sharing

The Generator tag identifies Astro v5.16.2, making the publishing system easier to fingerprint. Open Graph is partially configured; og:image is missing. Twitter Card metadata is configured. The title has 13 characters, within a common display range. A meta description is present, with 145 characters.

Hosting and Email

DNSDigitalOcean
HostingFastly
EmailUnknown
Approximate IP geolocation (inferred; a CDN or proxy may differ from the origin server) United States flagUnited States Inferred 185.199.108.153

Registration details

RDAP / WHOIS

RegistrarStanco d.o.o.
RegisteredUnknown
ExpiresUnknown
Domain statusActive https://www.rnids.rs/en/domain-name-status-codes#Active、clientUpdateProhibited https://www.rnids.rs/en/domain-name-status-codes#ClientUpdateProhibited
NameserversUnknown
DNSSECunknown

DNS records

DNS

TypeNameValueTTLPriority
Alycheeverse.github.io185.199.108.1533600—
Alycheeverse.github.io185.199.109.1533600—
Alycheeverse.github.io185.199.110.1533600—
Alycheeverse.github.io185.199.111.1533600—
AAAAlycheeverse.github.io2606:50c0:8000::1533600—
AAAAlycheeverse.github.io2606:50c0:8001::1533600—
AAAAlycheeverse.github.io2606:50c0:8002::1533600—
AAAAlycheeverse.github.io2606:50c0:8003::1533600—
NScli.rsns1.digitalocean.com1800—
NScli.rsns2.digitalocean.com1800—
NScli.rsns3.digitalocean.com1800—
CNAMElychee.cli.rslycheeverse.github.io1800—

TLS and certificates

TLS / SSL

AssessmentNormal configuration
Supported protocolsTLSv1.2、TLSv1.3
Negotiated protocolTLSv1.3
Certificate subjectlychee.cli.rs
IssuerLet's Encrypt
Valid until2026-11-15T07:22 · Remaining when checked: 41 days
Verification detailsCertificate trust: Passed · Hostname match: Passed

HTTP response headers

HTTP

HeaderValue
content-typetext/html; charset=utf-8
cache-controlmax-age=600
serverGitHub.com
access-control-allow-origin*

Identified technologies

Astro 5.16.2Fastly

Pages, Search and Sharing

Meta descriptionA fast, async link checker written in Rust. Finds broken hyperlinks and mail addresses, supports Markdown, HTML and more, simple and lightweight.
Canonical URLhttps://lychee.cli.rs/
LanguageEnglish (default)
Twitter Cardsummary_large_image

No robots.txt found

No sitemaps found

User reviews (0)

  • No reviews yet.