It judges only the code you changed
Old issues stay visible, but they never block a merge. The gate looks at new code: new issues, coverage of new lines, duplication in new lines. Small changes don't fail on coverage percentages.
Qualor is an open-source, self-hosted SonarQube alternative for GitLab and GitHub. It runs the analyzers you already trust, follows every issue across commits, and fails the merge request that makes the code worse.

feature/invoice-export into mainMergedqualor/acme-billingFailed: new_issues 2 > 0, new_coverage 71.4 < 80Qualor: quality gate failed
| Condition | Value | Threshold | Status |
|---|---|---|---|
new_issues | 2 | > 0 | failed |
new_coverage | 71.4 | < 80 | failed |
src/invoices/export.ts:88SQL built from request input- db.query(`SELECT * FROM invoices WHERE status = '${status}'`)+ db.query("SELECT * FROM invoices WHERE status = $1", [status])src/invoices/csv.ts:41Cognitive complexity 21 is over 15- function toCsv(rows) { /* 4 nested loops, 60 lines */ }+ const toCsv = (rows) => rows.map(toCsvLine).join("\n");+ const toCsvLine = (row) => COLUMNS.map((c) => quote(row[c])).join(",");src/invoices/csv.ts have no test.Try it: fix an issue, mark one as a false positive, or add tests.
The scanner runs in CI, collects results from every analyzer as SARIF, works out which lines the merge request changed, and sends one compact report to your server. It waits for the verdict and fails the job when the gate fails.
On GitLab, findings also show in the merge request widget and the security tab through the Code Quality and SAST reports. The CI/CD component is in the GitLab CI/CD catalog.
include:
- component: gitlab.com/qualor/qualor/qualor@1
inputs: { image-tag: "1" }qualor:
# forks get no secrets, so their pull requests are skipped
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
container: { image: qualor/scanner:1, options: --user 1001 }
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- run: qualor scan
env:
QUALOR_URL: ${{ vars.QUALOR_URL }}
QUALOR_TOKEN: ${{ secrets.QUALOR_TOKEN }}Old issues stay visible, but they never block a merge. The gate looks at new code: new issues, coverage of new lines, duplication in new lines. Small changes don't fail on coverage percentages.
No rule engine of our own. Qualor runs proven open-source tools and merges what they find. The same finding from two tools shows once.
Each issue gets a fingerprint from its rule, file and surrounding code, not its line number. Move the code and the issue keeps its history and its status.
A summary comment and a status per project on GitLab merge requests and GitHub pull requests, with new issues marked on the lines that caused them: inline discussions on GitLab, check-run annotations on GitHub. Fix an issue, or mark it a false positive, and its mark goes away.
Imports LCOV, Cobertura and JaCoCo. Measures cognitive complexity with tree-sitter and finds copy-pasted code. Keeps the history of every branch and merge request.
Mark a finding as a false positive or won't fix, and the gate is judged again at once. No new pipeline needed.
src/invoices/csv.ts:41Cognitive complexity 21 is over 15Ask Qualor to explain an issue, to judge whether a finding is a false positive, or to suggest a fix and post it to the merge request. You bring the model: any OpenAI-compatible endpoint, Anthropic, or a local model through Ollama or vLLM.
src/invoices/export.ts:88The query is built from req.query.status. Pass it as a parameter instead.
- db.query(`SELECT * FROM invoices WHERE status = '$${status}'`)
+ db.query("SELECT * FROM invoices WHERE status = $1", [status])
Point Qualor at your SonarQube server. It brings over your quality profiles, your quality gates and the status of every issue, so the false positives and won't-fix decisions your team already made stay made.
qualor import sonarqube \
--url https://sonar.example.com \
--token $SONAR_TOKENThe community edition is MIT licensed with no limit on lines of code, users or projects. When the organisation needs single sign-on, provisioning, roles and an audit trail, the enterprise edition adds them to the same server.

Free, MIT licence
Everything on this page. Unlimited lines of code, users and projects, up to three organisations.
Get startedCommercial licence, never priced by lines of code
SSO, SCIM, roles, audit log, portfolio reports, compliance exports and priority support.
The server is one container plus PostgreSQL 16. Use Docker Compose on a single machine, or the Helm chart on Kubernetes.
git clone https://github.com/qualor-dev/qualor.git && cd qualor
cp deploy/.env.example deploy/.env # set the three secrets
docker compose -f deploy/docker-compose.yml up -dSign in as admin, create a project, then an access token with the Upload analyses scope.
Set QUALOR_URL and QUALOR_TOKEN as CI variables and add the snippet above. For review comments, connect GitLab, or create a GitHub App, add it in Settings and install it on the repository.

Yes. The community edition is MIT licensed, with no limit on lines of code, users or projects. The only cap is three organisations per server. SSO, SCIM, roles, the audit log and portfolio reports are in the enterprise edition.
For what most teams use SonarQube for, yes: issues, coverage, duplication, complexity, quality gates on new code, and merge request decoration. Qualor has no rule engine of its own; it runs proven open-source analyzers and unifies their results. It does not aim for rule-by-rule parity.
Whatever its analyzers cover: TypeScript and JavaScript with ESLint, Java with PMD and SpotBugs, more than 30 languages through OpenGrep security rules, secrets in any file with Gitleaks, and dependencies with Trivy. Any other tool that writes SARIF plugs in with --sarif.
No. Qualor has no telemetry and makes no calls except to your Qualor server and your GitLab or GitHub. The LLM assistant is off until you configure it, and it can run on a local model through Ollama or vLLM.
Run qualor import sonarqube with your SonarQube URL and a token. It brings over quality profiles, quality gates and issue statuses, so false positives and won't-fix decisions stay made.
Yes. GitLab is supported through merge request comments, inline discussions, commit statuses and GitLab's Code Quality and SAST reports. GitHub.com and GitHub Enterprise Server are supported through a GitHub App you create and install: a check run per project with annotations on the changed lines, and one summary comment on the pull request, edited in place. The check run's Re-run button asks Qualor to post again.
The server is one container plus PostgreSQL 16. Use the Docker Compose file for a single machine or the Helm chart for Kubernetes. The scanner is one container image, or a single static binary, in your CI.