← Back to posts
comparison guide self-hosted · · 9 min read

MegaLinter vs Super-Linter vs Reviewdog: Best Self-Hosted Linting Tools 2026

Compare MegaLinter, Super-Linter, and Reviewdog for self-hosted code linting and review automation. Docker deployment guides, feature matrix, and CI/CD integration examples.

OS
Editorial Team

Why Self-Host Your Linting Pipeline?

Running code quality checks on your own infrastructure gives you full control over which linters execute, how they are configured, and where the results are stored. Self-hosted linting avoids the rate limits, data privacy concerns, and vendor lock-in of cloud-based code review services.

Key benefits include:

  • Privacy: Source code never leaves your network — critical for proprietary or regulated codebases
  • Cost: No per-developer or per-repository licensing fees; run unlimited scans on your own hardware
  • Customization: Install any linter, configure custom rulesets, and integrate with internal tooling
  • Speed: Run scans on local CI runners without waiting for cloud queue times
  • Offline support: Enforce code quality standards even when external services are unavailable

For teams already running self-hosted CI/CD platforms like Woodpecker or Gitea Actions, adding a self-hosted linter is a natural extension of the pipeline.

Three Approaches to Self-Hosted Linting

The self-hosted linting ecosystem offers three distinct approaches, each targeting different stages of the development workflow:

ApproachBest ForExamples
All-in-one scannerComprehensive repo-wide analysis covering every languageMegaLinter, Super-Linter
Review aggregatorConsolidating results from any linter into PR commentsReviewdog
Single-purpose linterDeep analysis of one language or frameworkSemgrep, ESLint, ShellCheck

This guide focuses on the first two categories — tools that aggregate multiple linters into a single, self-hostable service. If you need deeper analysis for specific languages, our code quality comparison covers SonarQube, Semgrep, and CodeQL in detail.

MegaLinter

MegaLinter (⭐ 2,464, AGPL-3.0) is the most comprehensive open-source linting aggregator available. It bundles over 100 linters, formatters, and analysis tools into a single Docker image, scanning your entire repository for code quality, security, and formatting issues across 50+ programming languages and 22 file formats.

Key Features

  • 100+ bundled tools: ShellCheck, ESLint, Pylint, Hadolint, Actionlint, Gitleaks, KICS, TruffleHog, Vale, Lychee, TFLint, Terrascan, and many more
  • Multi-platform support: GitHub Actions, GitLab CI, Jenkins, Azure DevOps, Bitbucket Pipelines, or standalone Docker
  • Flavors: Full image (~1GB) for maximum coverage, or language-specific flavors (JavaScript, Python, Go, Java, etc.) for faster scans
  • Auto-fix mode: Automatically fixes formatting issues where tools support it
  • Sarif output: Standardized security results format compatible with GitHub Code Scanning and other dashboards
  • Configuration via YAML: Single .mega-linter.yml file controls all behavior

Docker Deployment

MegaLinter runs as a Docker container that mounts your source code as a volume. Here is a complete Docker Compose configuration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  megalinter:
    image: oxsecurity/megalinter:v8
    volumes:
      - ./:/tmp/lint
    environment:
      - DEFAULT_WORKSPACE=/tmp/lint
      - ENABLE_LINTERS=BASH_SHELLCHECK,DOCKERFILE_HADOLINT,YAML_YAMLLINT,JSON_JSONLINT
      - DISABLE_ERRORS=true
      - REPORT_OUTPUT_FOLDER=/tmp/lint/megalinter-reports
      - PRINT_ALPACA=false

Run the scan:

1
docker compose up

Or use the quick Docker one-liner for ad-hoc scans:

1
2
3
docker run --rm -v "$(pwd)":/tmp/lint \
  -e DEFAULT_WORKSPACE=/tmp/lint \
  oxsecurity/megalinter:v8

Configuration Example

A minimal .mega-linter.yml at the repository root:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Enable only the linters you need
ENABLE_LINTERS:
  - BASH_SHELLCHECK
  - DOCKERFILE_HADOLINT
  - JAVASCRIPT_ES
  - PYTHON_PYLINT
  - TYPESCRIPT_ES
  - YAML_YAMLLINT

# Disable copy-paste detection for performance
DISABLE:
  - COPYPASTE
  - SPELL

# SARIF output for integration with GitHub Code Scanning
SARIF_REPORTER: active

# Auto-fix where possible
APPLY_FIXES: all

Super-Linter

Super-Linter (⭐ 145, MIT) is GitHub’s official multi-linter action. It combines many of the same tools as MegaLinter but with a more focused feature set and tighter GitHub integration. Originally a community project, it was later adopted and maintained by GitHub itself.

Key Features

  • GitHub-native: First-class support for GitHub Actions with automatic PR annotations
  • MIT licensed: More permissive than MegaLinter’s AGPL-3.0, allowing use in commercial projects without copyleft concerns
  • Modular design: Each linter runs in its own stage, making debugging easier
  • VALIDATE_ALL_CODEBASE toggle: Choose between scanning the entire repo or only changed files
  • Lightweight base: Alpine Linux-based image with Python 3.12
  • Extensible: Easy to add custom linters via environment variables

Docker Deployment

Super-Linter is primarily designed as a GitHub Action but runs perfectly as a standalone Docker container:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
services:
  super-linter:
    image: ghcr.io/github/super-linter:slim-v7
    environment:
      - VALIDATE_ALL_CODEBASE=true
      - DEFAULT_BRANCH=main
      - GITHUB_TOKEN=${GITHUB_TOKEN}
      - FILTER_REGEX_EXCLUDE=.*vendor/.*
      - VALIDATE_BASH=true
      - VALIDATE_DOCKERFILE_HADOLINT=true
      - VALIDATE_YAML=true
      - VALIDATE_JSON=true
      - VALIDATE_MARKDOWN=true
      - LOG_LEVEL=WARN
    volumes:
      - ./:/tmp/lint

For CI/CD platforms other than GitHub, you can run it with minimal configuration:

1
2
3
4
5
docker run --rm \
  -e RUN_LOCAL=true \
  -e VALIDATE_ALL_CODEBASE=true \
  -v "$(pwd)":/tmp/lint \
  ghcr.io/github/super-linter:slim-v7

The RUN_LOCAL=true flag is critical — it disables GitHub-specific features and runs the linter in standalone mode, making it suitable for GitLab CI, Jenkins, or any other pipeline.

Configuration Highlights

Super-Linter uses environment variables rather than a YAML config file. Key variables:

VariablePurposeExample
RUN_LOCALEnable standalone mode (non-GitHub)true
VALIDATE_ALL_CODEBASEScan entire repo vs. only changed filestrue / false
FILTER_REGEX_EXCLUDEExclude paths from scanning.*vendor/.*
FILTER_REGEX_INCLUDEOnly scan matching pathssrc/.*
LOG_LEVELControl verbosityDEBUG, INFO, WARN, ERROR
VALIDATE_<TOOL>Enable/disable specific lintersVALIDATE_PYTHON=true

Reviewdog

Reviewdog (⭐ 9,236, MIT) takes a fundamentally different approach. Rather than bundling linters, it acts as a thin layer that collects output from any code analysis tool and posts results as code review comments. It is the most popular of the three tools by star count and has been actively developed since 2016.

Key Features

  • Tool-agnostic: Works with any linter that produces standard output — ESLint, Pylint, Go vet, custom scripts, you name it
  • Review format support: Posts results as GitHub PR comments, GitLab MR notes, Bitbucket PR comments, or console output
  • Filtering and deduplication: Suppresses known issues, shows only new findings on changed lines
  • GitHub Apps integration: No need for personal access tokens — install as a GitHub App
  • Diff-aware: Only reports issues on lines that changed in the current PR/commit
  • Lightweight binary: Single Go binary, no dependencies, ~10MB download

Docker Deployment

Reviewdog provides an official Docker image for self-hosted deployment:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
services:
  reviewdog:
    image: reviewdog/reviewdog:latest
    environment:
      - REVIEWDOG_GITHUB_API_TOKEN=${GITHUB_TOKEN}
      - REVIEWDOG_RUNNER=github-pr-review
    volumes:
      - ./:/src
    working_dir: /src
    command: >
      -reporter=github-pr-review
      -filter-mode=nofilter
      -level=warning
      sh -c "shellcheck **/*.sh | reviewdog -f=checkstyle -name=shellcheck"

For local development without CI integration:

1
2
3
4
5
6
7
8
# Run reviewdog in local mode, outputting to console
docker run --rm -v "$(pwd)":/src -w /src \
  reviewdog/reviewdog:latest \
  -reporter=local \
  -filter-mode=nofilter \
  -f=checkstyle \
  -name=eslint \
  sh -c "eslint --format checkstyle src/"

Workflow Integration

Reviewdog’s power comes from its integration with existing linters. Here is how it works in practice:

1
2
3
4
5
6
# Step 1: Run your favorite linter and pipe output to reviewdog
eslint src/ --format checkstyle | reviewdog -f=checkstyle -name=eslint

# Step 2: Reviewdog parses the output, maps issues to file:line positions
# Step 3: Posts results as inline comments on the PR/MR
# Step 4: Only new issues on changed lines are shown (deduplication)

This makes Reviewdog the ideal tool for teams that already have a mature linting setup but want centralized review commenting without switching to a monolithic scanner.

Feature Comparison

FeatureMegaLinterSuper-LinterReviewdog
LicenseAGPL-3.0MITMIT
LanguagePython/DockerShellGo
GitHub Stars2,4641459,236
Last UpdatedApr 2026Mar 2026Apr 2026
Bundled Linters100+50+0 (brings your own)
Image Size~1 GB (full)~600 MB (slim)~20 MB
Standalone DockerYesYesYes
GitHub ActionsYesYes (native)Yes
GitLab CIYesYesYes
Auto-FixYesNoNo
SARIF OutputYesPartialNo
PR CommentsVia reporterVia reporterNative
Diff-AwarePartialPartialYes
Security ScannersGitleaks, KICS, TruffleHogGitleaks, KICSVia external tools
Config FormatYAML (.mega-linter.yml)Environment variablesCLI flags
Min RAM1 GB512 MB64 MB

How to Choose

Pick MegaLinter if:

  • You want the most comprehensive coverage out of the box with zero configuration
  • Your team works across many languages and you need a single scan to catch everything
  • Auto-fix capability is important for maintaining consistent formatting
  • You need built-in security scanners (Gitleaks, KICS, TruffleHog) alongside code linters

Pick Super-Linter if:

  • You operate primarily within GitHub’s ecosystem and want native integration
  • MIT licensing is required for your organization (avoiding AGPL copyleft)
  • You prefer a smaller Docker image and faster scan times
  • You want per-linter toggle control via environment variables

Pick Reviewdog if:

  • You already have linting tools you love and want to aggregate their output
  • You need diff-aware review comments that only show issues on changed lines
  • You want the smallest possible footprint (~10 MB binary)
  • Your team uses multiple CI platforms and needs a unified review commenting layer

Many teams combine approaches: running MegaLinter or Super-Linter for full-repo analysis in nightly builds, and Reviewdog for real-time PR review comments on every push. For teams deploying self-hosted CI agents, both patterns work seamlessly on private runners.

Performance Considerations

MegaLinter’s full image scans can take 5-15 minutes on large repositories. Use language-specific flavors to reduce scan time:

1
2
3
4
5
6
# Use a flavor instead of the full image
services:
  megalinter-js:
    image: oxsecurity/megalinter-javascript:v8
    volumes:
      - ./:/tmp/lint

Super-Linter’s slim variant excludes heavier linters (TFLint, Terrascan, Checkov) and runs in under 2 minutes for typical repositories:

1
ghcr.io/github/super-linter:slim-v7  # ~600 MB vs ~1.5 GB full

Reviewdog adds minimal overhead since it only parses linter output — the actual scan time depends entirely on the underlying tools you run.

FAQ

Can I run these linters without GitHub?

Yes. All three tools support standalone Docker execution. MegaLinter and Super-Linter both have a RUN_LOCAL or equivalent mode that disables GitHub-specific features. Reviewdog offers a -reporter=local flag for console output. This makes them suitable for GitLab CI, Jenkins, Bitbucket, or any pipeline that supports Docker.

Do these tools support custom linter rules?

MegaLinter allows custom configuration files for each bundled linter (e.g., .eslintrc, .pylintrc) placed in the repository root. Super-Linter picks up standard config files automatically. Reviewdog works with any linter, so you configure the linter itself, not Reviewdog.

Which tool is best for security scanning?

MegaLinter has the most comprehensive built-in security tooling, including Gitleaks (secret detection), KICS (infrastructure-as-code scanning), and TruffleHog (credential discovery). Super-Linter includes Gitleaks and KICS but fewer security-focused tools. Reviewdog can integrate with any security scanner but does not bundle them — you must bring your own.

How do I exclude files or directories from scanning?

MegaLinter uses FILTER_REGEX_EXCLUDE and FILTER_REGEX_INCLUDE in .mega-linter.yml. Super-Linter uses the same environment variables. Reviewdog delegates filtering to the underlying linter (e.g., ESLint’s .eslintignore, Pylint’s --ignore flag).

Can these tools run on self-hosted CI runners?

Absolutely. All three run as Docker containers and are designed to work on any CI platform. For self-hosted runner setup, see our guide to self-hosted CI agents. The Docker-based architecture means they work identically on GitHub-hosted runners, self-hosted runners, or bare-metal CI servers.

What happens if a linter fails the build?

MegaLinter has a DISABLE_ERRORS flag that prevents build failures. Super-Linter uses DISABLE_ERRORS=true for the same effect. Reviewdog always exits with the status of the underlying linter. In all cases, you can configure which severity levels (warning, error, info) cause a non-zero exit code.

Is there a resource difference between the tools?

MegaLinter’s full image requires at least 1 GB RAM and can use significant disk I/O when scanning large repos. Super-Linter’s slim variant runs comfortably on 512 MB. Reviewdog itself uses under 64 MB, but the underlying linters you feed it will have their own resource requirements.

Advertise here
Advertise here