Raclette Raclette
Raclette

Catch broken links in Java

Virtual-threaded, lightweight link checking for websites and HTML content.

Get started View on GitHub

Virtual Threads

Built on Java 21 virtual threads for lightweight, high-throughput concurrent link checking without callback complexity.

📄

HTML Extraction

Extracts links from HTML using JSoup: anchors, images, scripts, srcsets, and more. Perfect for documentation and static sites.

📦

Java Library

Drop it into any JVM project as a Maven dependency. No external binaries, no native installs required.

🔧

Configurable

Fine-grained filtering, rate limiting, custom headers, and quirks handling to adapt to any site's behavior.

🍒

Inspired by lychee

Raclette is heavily inspired by lychee, the excellent async link checker written in Rust. We follow lychee's design philosophy (filtering, quirks system, and overall architecture) and bring it to the JVM.

Roq

Designed for Roq

Built for Roq, works with any static site generator. Point it at a served app or a generated directory and let Raclette crawl every link.

What is Raclette?

Raclette is a fast, lightweight link checker for the JVM, the Java equivalent of lychee. It finds broken hyperlinks and mail addresses in your HTML files and websites.

Built with Java 21 virtual threads and java.net.http.HttpClient, Raclette handles thousands of concurrent requests efficiently. JSoup powers the HTML parsing, delivering reliable link extraction from any document structure.

Why Raclette?

JVM-native with no shelling out to external tools
Virtual threads for lightweight, massive concurrency
Rate limiting to respect target servers
Quirks system to handle site-specific behaviors
HTML parsing with thorough link extraction via JSoup
SSG support with one-liner for Hugo, Jekyll, Roq sites
Open source, Apache 2.0 licensed

Getting Started

Add the dependency

<dependency>
    <groupId>io.mvnpm</groupId>
    <artifactId>raclette</artifactId>
    <version>0.1.0.CR2</version>
</dependency>

Check a website

try (Raclette raclette = Raclette.builder().build()) {
    Status status = raclette.check("https://example.com");
    if (status.isSuccess()) {
        System.out.println("Link is valid!");
    } else {
        System.out.println("Broken: " + status);
    }
}

Eating Our Own Cheese

This site is checked by Raclette itself. The link below is deliberately broken, and our dogfood test verifies that Raclette catches it.

A deliberately broken link

Trivia

Project Name

Raclette is named after the 450-year-old cheese dish, claimed by both Switzerland and France, a nod to the original lychee link checker. Where lychee is a fruit, raclette is melted cheese: warm, comforting, and makes everything better. Also, it grates through your links.