v0.2.2-beta
· Case study · 01

Spartacus, scanned.

ngcompass analysed SAP Spartacus 7,583 files, 31,590 checks, in 16.1 seconds on a single workstation. Here's what it found.

About the project

Production-scale.
Multi-team.
Real.

SAP's open-source Angular storefront for SAP Commerce Cloud — a large, multi-team monorepo of core, feature, and storefront libraries. Spartacus is a useful real-world benchmark because it spans every Angular pattern ngcompass cares about: large component trees, RxJS-heavy state, in-progress signal migration, SSR, complex template bindings, and security-sensitive content rendering. The numbers below are exactly what the CLI reported — no curation, no filtering.

7,583

Files discovered

1,215 scanned · 7,089 clean

16.1s

Wall-clock duration

471/s files · 1,962/s checks

31,590

Checks executed

10 of 27 rules fired

1,426

Findings reported

1,012 errors · 414 warnings

One command

Run it. Get a report.

No configuration, no preset selection, no allowlists. The default recommended preset, against the unmodifiedmainbranch of SAP Spartacus.

sap-spartacus · ngcompass

Writing report...

7,583 files · 31,590 checks · 16.1s

7,089 files no issues · 494 files with violations

× 1,426 violations (1,012 errors, 414 warnings) FAILED

Throughput

Fast enough to run on every PR.

Single-process, single-machine. No clustering, no remote workers, no warm cache.

16.1s

Total time

471

Files / second

1,962

Checks / second

Wall-clock timeline16.1s
discover · 231msplan · 1.4sanalyse · 14.5s
Measured on

Intel Core i7-10750H (6 cores · 12 threads @ 2.6 GHz), 16 GB DDR4 · 2933 MT/s. No CI fleet, no cluster, no GPU, no warm cache.

Findings · by rule

Where the violations live.

10 rules triggered out of 27 active. Two patterns — method calls in templates and legacy @Input() decorators — account for 86% of all findings.

  1. 01template-no-call-expression846

    Method calls in template bindings re-run on every change detection pass.

  2. 02signal-prefer-input-signal384

    @Input() that could migrate to the new input() signal API.

  3. 03prefer-on-push-component-change-detection164

    Components using default change detection instead of OnPush.

  4. 04rxjs-no-nested-subscribe11

    Nested subscribe() chains that fragment stream lifetimes.

  5. 05toSignal-require-initialValue6

    toSignal() calls without an explicit first-value strategy.

  6. 06template-prefer-control-flow5

    Legacy *ngIf / *ngFor that could use @if / @for.

  7. 07no-bypass-sanitization4

    DomSanitizer bypass calls that can expose unsafe content.

  8. 08template-no-object-literal-binding2

    Object literals in bindings create new references each cycle.

  9. 09signal-effect-must-be-destroy-scoped2

    effect() inside a method lacking an explicit lifecycle owner.

  10. 10signal-prefer-model2

    Input/Output pairs that could migrate to model().

Error · 1,012Warning · 414
The shape of the report

How the findings break down.

Severity split

1,426

total findings

Errors

1,012

71% of findings · fail the build

Warnings

414

29% of findings · advisory

Files · clean vs flagged

93.5%

clean

Clean

7,089

93.5% of files

Flagged

494

6.5% of files

What it means

4 signals from one run.

  • Performance dominates

    1,012 of 1,426 violations are performance-related — call expressions in templates and missing OnPush account for 99% of error-severity findings. Targeted refactors here have outsized rendering impact.

  • Signals migration is the next step

    384 occurrences of @Input() and 6 toSignal() patterns suggest Spartacus is mid-migration to the modern signal API. ngcompass can codify that direction as a CI gate.

  • Security posture is strong

    Only 4 sanitizer-bypass findings across 1,215 TypeScript files — a strong baseline that's worth keeping enforced.

  • Ready for CI

    A 16-second wall-clock run on 7,583 files comfortably fits a pre-merge GitHub Action. SARIF output surfaces every finding as an inline review comment on the diff.

Try it yourself

Reproduce this run in 30 seconds.

Clone SAP Spartacus, install ngcompass, and run the same command. No config, no telemetry, no upload — the same report ends up next to the source.