Raclette Raclette

Getting Started

Add the dependency

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

Check a single URL

The simplest way to use Raclette - check one link:

import io.mvnpm.raclette.Raclette;
import io.mvnpm.raclette.types.Status;

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

Build a custom client

The builder is highly customizable:

try (Raclette raclette = Raclette.builder()
        .maxRetries(3)
        .timeout(Duration.ofSeconds(10))
        .userAgent("my-app/1.0")
        .excludeAllPrivate(true)
        .excludes(".*example\\.com.*")
        .build()) {
    Status status = raclette.check("https://github.com");
    assert status.isSuccess();
}

All options set on the builder apply to every link check. See Configuration for the full list.

For checking all links in an HTML document, use the Collector to extract links, then check each one:

import io.mvnpm.raclette.Raclette;
import io.mvnpm.raclette.collector.Collector;
import io.mvnpm.raclette.collector.Input;
import io.mvnpm.raclette.types.Status;
import io.mvnpm.raclette.types.Uri;

String html = """
    <html>
        <a href="https://github.com">GitHub</a>
        <a href="https://example.com/broken">Broken</a>
    </html>""";

Set<Uri> links = Collector.builder()
    .build()
    .collectLinks(Set.of(new Input.StringContent(html)));

try (Raclette raclette = Raclette.builder().build()) {
    for (Uri uri : links) {
        Status status = raclette.check(uri);
        if (status.isError()) {
            System.out.println("Broken: " + uri);
        }
    }
}

Check a local directory

Check all HTML files in a directory - perfect for generated sites:

Set<Uri> links = Collector.builder()
    .build()
    .collectLinks(Set.of(new Input.FsPath(Path.of("target/site"))));

try (Raclette raclette = Raclette.builder().build()) {
    for (Uri uri : links) {
        Status status = raclette.check(uri);
        System.out.println(uri + " -> " + status);
    }
}

Check a static site (SSG)

For generated static sites (Hugo, Jekyll, Roq, etc.), use StaticSiteChecker - it handles localhost URL rewriting, base path stripping, and parallel execution:

import io.mvnpm.raclette.checker.StaticSiteChecker;
import io.mvnpm.raclette.types.Status;
import io.mvnpm.raclette.types.Uri;

// Zero-config: check all links in a generated site
Map<Uri, Status> broken = StaticSiteChecker.check(Path.of("target/site"));

// With options: base path, remote link checking, etc.
Map<Uri, Status> broken = StaticSiteChecker.builder()
    .path(Path.of("target/site"))
    .basePath("/my-project/")
    .checkRemoteLinks(true)
    .includeFragments(true)
    .build()
    .check();

broken.forEach((uri, status) ->
    System.out.println("Broken: " + uri + " -> " + status));

Next steps