{"id":39615773,"url":"https://github.com/leonardomso/gone","last_synced_at":"2026-01-18T08:17:28.212Z","repository":{"id":331359968,"uuid":"1125845251","full_name":"leonardomso/gone","owner":"leonardomso","description":"Fast, concurrent dead link detector for files.","archived":false,"fork":false,"pushed_at":"2026-01-03T12:23:11.000Z","size":1662,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-06T23:21:42.431Z","etag":null,"topics":["broken-links","ci","cli","dead-links","developer-tools","documentation","go","golang","golang-library","lint-checker","markdown","terminal","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leonardomso.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-12-31T13:34:13.000Z","updated_at":"2026-01-03T12:23:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/leonardomso/gone","commit_stats":null,"previous_names":["leonardomso/gone"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/leonardomso/gone","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonardomso%2Fgone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonardomso%2Fgone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonardomso%2Fgone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonardomso%2Fgone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leonardomso","download_url":"https://codeload.github.com/leonardomso/gone/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonardomso%2Fgone/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534141,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["broken-links","ci","cli","dead-links","developer-tools","documentation","go","golang","golang-library","lint-checker","markdown","terminal","tui"],"created_at":"2026-01-18T08:17:28.066Z","updated_at":"2026-01-18T08:17:28.194Z","avatar_url":"https://github.com/leonardomso.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gone\n\n**Fast, concurrent dead link detector for documentation files.**\n\n[![Test](https://github.com/leonardomso/gone/actions/workflows/test.yml/badge.svg)](https://github.com/leonardomso/gone/actions/workflows/test.yml)\n[![Lint](https://github.com/leonardomso/gone/actions/workflows/lint.yml/badge.svg)](https://github.com/leonardomso/gone/actions/workflows/lint.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/leonardomso/gone)](https://goreportcard.com/report/github.com/leonardomso/gone)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nScan your documentation files for broken links. `gone` finds all HTTP/HTTPS URLs in Markdown, JSON, YAML, TOML, and XML files, checks if they're still alive, and helps you fix the ones that aren't.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./github-image.png\" alt=\"gone\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n## Here's a list of powerful features:\n\n- **Fast concurrent checking.** Check hundreds of URLs at the same time. Configure the number of workers based on your network. Large documentation sites take seconds, not minutes.\n\n- **Interactive terminal UI.** Watch progress in real-time. Navigate results with vim-style keys, filter by status, and explore issues without leaving your terminal. It's like `htop` for your links.\n\n- **Automatic redirect fixing.** Found a redirect? `gone fix` updates your markdown to use the final URL. Preview changes first with `--dry-run`, confirm each file interactively, or let it fix everything with `--yes`.\n\n- **Smart deduplication.** Same URL in 50 files? It gets checked once. Results map back to every occurrence. Less waiting, fewer rate limits.\n\n- **Flexible ignore rules.** Skip localhost, staging environments, or that one URL that's always flaky. Use domains, glob patterns, or regex. Set them in `.gonerc.yaml` or pass them as flags.\n\n- **Multiple output formats.** JSON, YAML, XML, JUnit, Markdown—pick your favorite. The format is auto-detected from the file extension, or set it explicitly with `--format`.\n\n- **Multi-format support.** Scan Markdown, JSON, YAML, TOML, and XML files. Markdown parsing is format-aware: finds links in `[text](url)`, reference-style `[text][ref]`, autolinks `\u003curl\u003e`, and HTML `\u003ca\u003e` tags while skipping code blocks.\n\n- **CI/CD friendly.** Exit code 0 means all good. Exit code 1 means dead links. JUnit output works with GitHub Actions, GitLab CI, Jenkins, and everything else.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Commands](#commands)\n  - [gone check](#gone-check)\n  - [gone interactive](#gone-interactive)\n  - [gone fix](#gone-fix)\n  - [gone completion](#gone-completion)\n- [Configuration](#configuration)\n- [Output Formats](#output-formats)\n- [CI/CD Integration](#cicd-integration)\n- [Exit Codes](#exit-codes)\n- [Reference](#reference)\n  - [Commands Overview](#commands-overview)\n  - [Flags Reference](#flags-reference)\n- [License](#license)\n\n## Installation\n\n### Go Install\n\n```bash\ngo install github.com/leonardomso/gone@latest\n```\n\n### Homebrew\n\n```bash\nbrew install leonardomso/tap/gone\n```\n\n### Build from Source\n\n```bash\ngit clone https://github.com/leonardomso/gone.git\ncd gone\ngo build\n```\n\n### Download Binary\n\nDownload the latest release from the [GitHub Releases](https://github.com/leonardomso/gone/releases) page.\n\n## Quick Start\n\n```bash\n# Scan current directory (markdown files by default)\ngone check\n\n# Scan specific directory\ngone check ./docs\n\n# Scan multiple file types\ngone check --types=md,json,yaml\n\n# Output as JSON\ngone check --format=json\n\n# Launch interactive TUI\ngone interactive\n\n# Auto-fix redirect URLs\ngone fix\n```\n\n## Commands\n\n### `gone check`\n\nScan files for dead links.\n\n```bash\ngone check [path] [flags]\n```\n\n**Flags:**\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--types` | `-T` | `md` | File types to scan (comma-separated): md, json, yaml, toml, xml |\n| `--strict` | — | `false` | Fail on malformed files instead of skipping them |\n| `--format` | `-f` | — | Output format: `json`, `yaml`, `xml`, `junit`, `markdown` |\n| `--output` | `-o` | — | Write report to file (format inferred from extension) |\n| `--all` | `-a` | `false` | Show all results including alive links |\n| `--dead` | `-d` | `false` | Show only dead links and errors |\n| `--warnings` | `-w` | `false` | Show only warnings (redirects, blocked) |\n| `--alive` | — | `false` | Show only alive links |\n| `--concurrency` | `-c` | `50` | Number of concurrent workers |\n| `--timeout` | `-t` | `5` | Timeout per request in seconds |\n| `--retries` | `-r` | `1` | Number of retries for failed requests |\n| `--ignore-domain` | — | — | Domains to ignore (comma-separated or repeated) |\n| `--ignore-pattern` | — | — | Glob patterns to ignore |\n| `--ignore-regex` | — | — | Regex patterns to ignore |\n| `--show-ignored` | — | `false` | Show which URLs were ignored |\n| `--no-config` | — | `false` | Skip loading .gonerc.yaml |\n| `--stats` | — | `false` | Show performance statistics |\n\n**Link Status Types:**\n\n| Status | Description |\n|--------|-------------|\n| `Alive` | Link returned a 2xx response. All good. |\n| `Redirect` | Link redirected (301, 302, 307, 308) but final destination is alive. Consider updating to the final URL. |\n| `Blocked` | Server returned 403. Might be bot detection. Link may still work in a browser. |\n| `Dead` | Link is broken (4xx, 5xx, or redirect chain ends in error). |\n| `Error` | Network error: timeout, DNS failure, or connection refused. |\n| `Duplicate` | Same URL appears multiple times. Checked once, result shared. |\n\n**Examples:**\n\n```bash\n# Scan markdown, JSON, and YAML files\ngone check --types=md,json,yaml\n\n# Scan with strict mode (fail on malformed files)\ngone check --types=json --strict\n\n# Scan with JSON output to stdout\ngone check --format=json\n\n# Write JUnit report for CI\ngone check --output=report.junit.xml\n\n# Show only dead links\ngone check --dead\n\n# Increase concurrency for faster scanning\ngone check --concurrency=20\n\n# Ignore specific domains\ngone check --ignore-domain=localhost,example.com\n```\n\n### `gone interactive`\n\nLaunch an interactive terminal UI with real-time progress.\n\n```bash\ngone interactive [path] [flags]\n```\n\n**Flags:**\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--types` | `-T` | `md` | File types to scan (comma-separated): md, json, yaml, toml, xml |\n| `--strict` | — | `false` | Fail on malformed files instead of skipping them |\n| `--ignore-domain` | — | — | Domains to ignore |\n| `--ignore-pattern` | — | — | Glob patterns to ignore |\n| `--ignore-regex` | — | — | Regex patterns to ignore |\n| `--no-config` | — | `false` | Skip loading .gonerc.yaml |\n\n**Controls:**\n\n| Key | Action |\n|-----|--------|\n| `↑` / `k` | Move up |\n| `↓` / `j` | Move down |\n| `PgUp` / `Ctrl+U` | Page up |\n| `PgDn` / `Ctrl+D` | Page down |\n| `g` / `Home` | Go to start |\n| `G` / `End` | Go to end |\n| `f` | Cycle filter (All → Warnings → Dead → Duplicates) |\n| `?` | Toggle help |\n| `q` / `Ctrl+C` | Quit |\n\n### `gone fix`\n\nAutomatically fix redirect URLs in files.\n\n```bash\ngone fix [path] [flags]\n```\n\n**Flags:**\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--types` | `-T` | `md` | File types to scan (comma-separated): md, json, yaml, toml, xml |\n| `--strict` | — | `false` | Fail on malformed files instead of skipping them |\n| `--yes` | `-y` | `false` | Apply all fixes without prompting |\n| `--dry-run` | `-n` | `false` | Preview changes without modifying files |\n| `--concurrency` | `-c` | `50` | Number of concurrent workers |\n| `--timeout` | `-t` | `5` | Timeout per request in seconds |\n| `--retries` | `-r` | `1` | Number of retries for failed requests |\n| `--ignore-domain` | — | — | Domains to ignore |\n| `--ignore-pattern` | — | — | Glob patterns to ignore |\n| `--ignore-regex` | — | — | Regex patterns to ignore |\n| `--no-config` | — | `false` | Skip loading .gonerc.yaml |\n| `--stats` | — | `false` | Show performance statistics |\n\n**Examples:**\n\n```bash\n# Interactive mode - prompt for each file\ngone fix\n\n# Preview what would be fixed\ngone fix --dry-run\n\n# Apply all fixes automatically\ngone fix --yes\n```\n\n### `gone completion`\n\nGenerate shell autocompletion scripts.\n\n```bash\ngone completion [shell]\n```\n\n**Supported Shells:**\n\n| Shell | Command |\n|-------|---------|\n| Bash | `gone completion bash` |\n| Zsh | `gone completion zsh` |\n| Fish | `gone completion fish` |\n| PowerShell | `gone completion powershell` |\n\n**Setup Examples:**\n\n```bash\n# Bash (add to ~/.bashrc)\nsource \u003c(gone completion bash)\n\n# Zsh (add to ~/.zshrc)\nsource \u003c(gone completion zsh)\n\n# Fish\ngone completion fish | source\n```\n\n## Configuration\n\n### Config File\n\nCreate a `.gonerc.yaml` file in your project root:\n\n```yaml\n# File types to scan (default: md)\ntypes:\n  - md\n  - json\n  - yaml\n  - toml\n  - xml\n\n# Scanner settings\nscan:\n  # Include only files matching these glob patterns\n  include:\n    - \"docs/**\"\n    - \"README.md\"\n  # Exclude files matching these glob patterns\n  exclude:\n    - \"node_modules/**\"\n    - \"vendor/**\"\n    - \".git/**\"\n\n# Checker settings\ncheck:\n  concurrency: 50  # Number of concurrent workers\n  timeout: 10      # Request timeout in seconds\n  retries: 2       # Retry attempts for failed requests\n  strict: false    # Fail on malformed files\n\n# Output preferences\noutput:\n  format: \"\"         # Default format (json, yaml, xml, junit, markdown)\n  showAlive: false   # Show alive links in output\n  showWarnings: true # Show warnings (redirects, blocked)\n  showDead: true     # Show dead links\n  showStats: false   # Show performance statistics\n\n# Ignore rules\nignore:\n  # Ignore entire domains (includes subdomains)\n  domains:\n    - localhost\n    - example.com\n    - staging.myapp.com\n\n  # Glob patterns\n  patterns:\n    - \"*.local/*\"\n    - \"*/internal/*\"\n\n  # Regular expressions\n  regex:\n    - \".*\\\\.(test|dev)$\"\n    - \"192\\\\.168\\\\..*\"\n```\n\n### Supported File Types\n\n| Type | Extensions | Description |\n|------|------------|-------------|\n| `md` | `.md`, `.mdx`, `.markdown` | Markdown files |\n| `json` | `.json` | JSON files |\n| `yaml` | `.yaml`, `.yml` | YAML files |\n| `toml` | `.toml` | TOML files |\n| `xml` | `.xml` | XML files |\n\n### CLI Flags\n\nCLI flags override config file settings:\n\n```bash\n# Override types from config\ngone check --types=md,json\n\n# Override concurrency\ngone check --concurrency=100\n\n# These ignore rules are combined with .gonerc.yaml settings\ngone check --ignore-domain=api.example.com --ignore-pattern=\"*.internal/*\"\n```\n\n## Output Formats\n\n### JSON\n\n```bash\ngone check --format=json\n# or\ngone check --output=report.json\n```\n\n### YAML\n\n```bash\ngone check --format=yaml\n# or\ngone check --output=report.yaml\n```\n\n### JUnit XML (for CI/CD)\n\n```bash\ngone check --output=report.junit.xml\n```\n\n### Markdown\n\n```bash\ngone check --format=markdown\n# or\ngone check --output=report.md\n```\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\nname: Check Links\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n  schedule:\n    - cron: '0 0 * * 0'  # Weekly\n\njobs:\n  check-links:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up Go\n        uses: actions/setup-go@v5\n        with:\n          go-version: '1.24'\n\n      - name: Install gone\n        run: go install github.com/leonardomso/gone@latest\n\n      - name: Check links\n        run: gone check --output=report.junit.xml\n\n      - name: Upload report\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: link-report\n          path: report.junit.xml\n```\n\n## Exit Codes\n\n| Code | Meaning |\n|------|---------|\n| `0` | All links are alive (or only warnings) |\n| `1` | Dead links or errors found |\n| `2` | User quit interactive fix mode |\n\n## Reference\n\n### Commands Overview\n\n| Command | Description |\n|---------|-------------|\n| `gone check [path]` | Scan files and report dead links |\n| `gone fix [path]` | Find redirects and update URLs to final destinations |\n| `gone interactive [path]` | Launch terminal UI for interactive exploration |\n| `gone completion [shell]` | Generate shell autocompletion (bash, zsh, fish, powershell) |\n| `gone help [command]` | Show help for any command |\n\n### Flags Reference\n\n| Flag | Commands | Default | Description |\n|------|----------|---------|-------------|\n| `--types` | check, fix, interactive | `md` | File types to scan (comma-separated) |\n| `--strict` | check, fix, interactive | `false` | Fail on malformed files |\n| `-f, --format` | check | — | Output format (json, yaml, xml, junit, markdown) |\n| `-o, --output` | check | — | Write report to file |\n| `-a, --all` | check | `false` | Show all results including alive |\n| `-d, --dead` | check | `false` | Show only dead links |\n| `-w, --warnings` | check | `false` | Show only warnings |\n| `--alive` | check | `false` | Show only alive links |\n| `--show-ignored` | check | `false` | Show ignored URLs |\n| `--stats` | check | `false` | Show performance statistics |\n| `-y, --yes` | fix | `false` | Apply fixes without prompting |\n| `-n, --dry-run` | fix | `false` | Preview changes only |\n| `-c, --concurrency` | check, fix | `50` | Concurrent workers |\n| `-t, --timeout` | check, fix | `5` | Request timeout (seconds) |\n| `-r, --retries` | check, fix | `1` | Retry attempts |\n| `--ignore-domain` | all | — | Domains to ignore |\n| `--ignore-pattern` | all | — | Glob patterns to ignore |\n| `--ignore-regex` | all | — | Regex patterns to ignore |\n| `--no-config` | all | `false` | Skip .gonerc.yaml |\n| `-h, --help` | all | — | Show help |\n| `-v, --version` | root | — | Show version |\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonardomso%2Fgone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleonardomso%2Fgone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonardomso%2Fgone/lists"}