################################################################################ # Config for the link checker lychee. # # Download & learn more at: # https://github.com/lycheeverse/lychee # # Example config: # https://github.com/lycheeverse/lychee/blob/master/lychee.example.toml # # Run `lychee . --dump` to list all found links that are being checked. # # Note that by default lychee will only check markdown and html files, # to check any other files you have to point to them explicitly, e.g.: # `lychee **/*.rs` # To make things worse, `exclude_path` is ignored for these globs, # so local runs with lots of gitignored files will be slow. # (https://github.com/lycheeverse/lychee/issues/1405) # # This unfortunately doesn't list anything for non-glob checks. ################################################################################ # Maximum number of concurrent link checks. # Workaround for "too many open files" error on MacOS, see https://github.com/lycheeverse/lychee/issues/1248 max_concurrency = 96 # Check links inside `` and `
` blocks as well as Markdown code blocks.
include_verbatim = true

# Proceed for server connections considered insecure (invalid TLS).
insecure = true

# Maximum number of allowed retries before a link is declared dead.
max_retries = 4

# Wait time between attempts in seconds.
retry_wait_time = 2

# Comma-separated list of accepted status codes for valid links.
accept = [
  "100..=103", # Informational codes.
  "200..=299", # Success codes.
  "429", # Too many requests. This is practically never a sign of a broken link.
  "403", # A lot of endpoints always return 403 for the link checker
]

# Exclude these filesystem paths from getting checked.
exclude_path = [
  # Unfortunately lychee doesn't yet read .gitignore https://github.com/lycheeverse/lychee/issues/1331
  # The following entries are there because of that:
  "__pycache__",
  "_deps/",
  ".git",
  ".pixi",
  "build",
  "docs/python/",
  "rerun_cpp/_deps",
  "rerun_cpp/docs/html",
  "rerun_cpp/docs/xml",
  "rerun_cpp/src/rerun/third_party/",
  "rerun_cpp/tmp/",
  "rerun_js/node_modules/",
  "rerun_notebook/node_modules/",
  "rerun_py/site/",
  "target_ra",
  "target_wasm",
  "target",
  "venv",

  # Generated ghat action definitions (contain upstream URLs we don't control)
  ".github/ghat/actions",

  # Actually ignored files beyond .gitignore
  "lychee.toml", # Contains regex patterns with URL-like strings that aren't actual links.
  "crates/store/re_uri/src/lib.rs", # Contains some malformed URLs, but they are not actual links.
  "crates/store/re_uri/src/redap_uri.rs", # Same as above.
  "crates/store/re_grpc_server/src/lib.rs", # Contains CORS tests with fake origin URLs
  "crates/utils/re_analytics/src/event.rs", # Contains test with malformed urls
  "crates/utils/re_perf_telemetry/src/telemetry.rs", # Contains `parse_rerun_endpoint` docs/tests with fake `rerun://host…` URLs
  "crates/viewer/re_viewer/src/reflection/mod.rs", # Checker struggles how links from examples are escaped here. They are all checked elsewhere, so not an issue.
  "docs/snippets/INDEX.md", # The snippet index is guaranteed should be correct by design.
  "scripts/lint.py", # Contains url-matching regexes that aren't actual urls
  "scripts/screenshot_compare/assets/templates/",
  ".typos.toml",
]
# Exclude URLs and mail addresses from checking (supports regex).
exclude = [
  # Skip speculative links
  '.*?speculative-link',

  # Strings with replacements.
  '/__VIEWER_VERSION__/', # Replacement variable __VIEWER_VERSION__.
  '/\$', # Replacement variable $.
  '\$$', # URL ending in `$`: stripped template variable (e.g. `${{ inputs.X }}`).
  '/GIT_HASH/', # Replacement variable GIT_HASH.
  '\{\}', # Ignore links with string interpolation.
  '\$relpath\^', # Relative paths as used by rerun_cpp's doc header.
  '%7B.+%7D', # Ignore strings that look like ready to use links but contain a replacement strings. The URL escaping is for '{.+}' (this seems to be needed for html embedded urls since lychee assumes they use this encoding).
  '%7B%7D', # Ignore links with string interpolation, escaped variant.

  # Ignore storage-node example links
  'rerun:/.*',

  # Local links that require further setup.
  '/examples', # Relative link to our examples gallery.
  'http://0.0.0.0',
  'http://127.0.0.1',
  'http://localhost',
  're_viewer.js', # Build artifact that html is linking to.
  'recording:/', # rrd recording link.
  'ws:/',

  # API endpoints.
  'https://fonts.googleapis.com/', # Font API entrypoint, not a link.
  'https://fonts.gstatic.com/', # Font API entrypoint, not a link.
  'https://tel.rerun.io/', # Analytics endpoint.
  'https://docs-assets.developer.apple.com/ml-research/datasets/arkitscenes/v1', # Used by arkit_scenes.
  'https://overpass-api.de/api/interpreter', # Used by openstreetmap_data example

  # Avoid rate limiting.
  'https://crates.io/crates/w\+', # Avoid crates.io rate-limiting
  'https://github.com/rerun-io/rerun/commit/\.*', # Ignore links to our own commits (typically in changelog).
  'https://github.com/rerun-io/rerun/pull/\.*', # Ignore links to our own pull requests (typically in changelog).
  'https://github.com/rerun-io/rerun/issues/\.*', # Ignore links to our own issues.

  # Intentionally faked links.
  'file:///does/not/exist.rrd',
  'file:///path/to/file',
  'file:///tmp/droidnano/Fri_Aug_18_09:46:43_2023.rrd',
  'file://foo',
  'file://path/to/file.rrd',
  'file://somehost/file/path.rrd',
  'http://foo.*',
  'http://x/',
  'https://foo.*',
  'https://link.to',
  'https://rerun.rs',
  'https://static.rerun.io/my_screenshot/',
  'https://your-hosted-asset-url.com/re_viewer_bg.wasm',
  'https://your-hosted-asset-url.com/widget.js',
  'rerun://localhost:51234/recording/some-recording-id',

  'https://customer.cloud.rerun.io/.*',
  'https://redap.rerun.io',
  'http://wrong-scheme',
  'rerun\+http://localhost:\{grpc_port\}/proxy',
  '.*scheme:/.*',
  'http(s)?://example.com/.*',
  'file:///uri1.rrd',
  'file:///uri2.rrd',

  # Link fragments and data links in examples.
  'https://raw.githubusercontent.com/googlefonts/noto-emoji/', # URL fragment.
  'https://static.rerun.io/rgbd_dataset', # Base data link for rgbd dataset.
  'https://storage.googleapis.com/', # Storage API entrypoint, not a link.
  'https://ref\.rerun\.io/prose/?$', # GCS bucket prefix, no directory index.
  'https://build\.rerun\.io/mirror/mozilla/sccache/?$', # GCS bucket prefix, no directory index.

  # Not accessible from CI.
  '.github/workflows/.*.yml', # GitHub action workflows cause issues on CI.
  'https://9p.io/sys/doc/lexnames.html', # Works locally but on CI we get: `Failed: Network error: error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:ssl/statem/extensions.c:946:`
  'https://claude.site/artifacts/*', # Giving a 500, but only from CI
  'https://fifteen-thirtyeight.rerun.io/script.js', # Gives 403 forbidden on CI.
  'https://github.com/user-attachments/assets/.*', # Gives Not Found on CI, but works locally.
  'https://git.sr.ht/*', # Bot protection returns 418 I'm a teapot on CI.
  'https://lib.rs/*', # Gives 403 forbidden on CI.
  'https://math.stackexchange.com/*', # Gives 403 forbidden on CI.
  'https://pixabay.com/photos/brother-sister-girl-family-boy-977170/', # Gives 403 forbidden on CI.
  'https://stackoverflow.com/*', # Stackoverflow links are no longer accessible from CI.
  'https://vimeo.com/*', # Gives 403 forbidden on CI.
  'https://vimeo/', # Malformed URL extracted from code doing startsWith checks.
  'https://player.vimeo.com/*', # Gives 403 forbidden on CI.
  'https://www.youtube-nocookie.com/*', # Gives 403 forbidden on CI.
  'https://www.npmjs.com/*', # Gives 403 forbidden on CI.
  'https://www.reddit.com/*', # Gives 403 forbidden on CI.
  'https://www.shadertoy.com/*', # 403 on CI
  'https://www.tensorflow.org/*', # tensorflow.org apparently blocks CI.
  'https://www.unicode.org/license.txt', # Gives network error on CI.

  # Need GitHub login.
  'https://github.com/rerun-io/landing',
  'https://github.com/rerun-io/documentation',
  'https://github.com/rerun-io/dataplatform',

  # Needs authentication
  'https://.*\.eks\.amazonaws\.com/', # EKS API server endpoints in CI workflows.
  'https://.*\.blob\.core\.windows\.net/', # Azure blob storage, requires auth.
  'https://rerun\.grafana\.net/api/datasources/.*', # Grafana API endpoints, requires auth.
  'https://ms-b22605aed932-7275.fra.meilisearch.io',
  'https://eu.posthog.com/project/', # Requires to be logged in on PostHog.
  'https://github.com/rerun-io/internal-test-assets/\.*',
  'https://github.com/google/mediapipe/issues/5188', # For some reason that link has always failed.
  'https://www.figma.com/.*',

  'https://stilearning.com/*', # License header URL, site unreachable from CI.

  # Temporarily down or not accessible.
  'https://dl.acm.org/doi/10.1145/3638550.3643617', # We might be getting rate-limited here.
  'https://forum.doom9.org/.*',
  'https://github.com/rerun-io/rerun/releases/download/prerelease', # Pre-release downloads may go down while a pre-release updates or pre-release CI partially breaks.
  'https://wiki.ros.org/.*', # Constant timeouts.
  'https://www.doxygen.nl/.*', # Getting 403, but the links work.

  # Works but is really slow at times:
  'https://anaconda.org/conda-forge/libarrow',
  'https://cvg.cit.tum.de/data/datasets/visual-inertial-dataset',
  'https://openaccess.thecvf.com/content/CVPR2023/html/Du_Learning_To_Render_Novel_Views_From_Wide-Baseline_Stereo_Pairs_CVPR_2023_paper.html',
  'https://picsum.photos/*',

  # These are APIs:
  'https://api.linear.app/graphql',
  'https://api.rootly.com/.*',
  'https://api.workos.com/.*',
  'https://rerun.io/api',
  'https://rerun.io/login',

  # '^file:///',                                  # Ignore local file links. They need to be tested, but it's useful for external links we have to ping.
]