Competitive Landscape
Reproducible benchmark comparing @interlace/serverless plugins to community alternatives.
Every product claim in this docs site is backed by a reproducible benchmark. This page is the truth source for all plugins.
For the methodology behind these numbers — what we measure, why these dimensions, how we score — see How We Measure. For the broader evidence contract behind every claim that ships in our docs, see Evidence Framework.
This page is a hub. The full per-plugin breakdown — per-dimension scores, honest losses, source citations — lives on each plugin's own benchmark.mdx page. Click "Full benchmark →" beneath each section.
| Plugin | Composite (Interlace) | Composite (Community) | Full benchmark |
|---|---|---|---|
@interlace/serverless-api-gateway-caching | 88.0% | 30.2% | → |
@interlace/serverless-iam-roles-per-function | TBD (pre-publish) | TBD | → |
API Gateway Caching
Last verified 2026-05-04. Re-run from serverless/benchmarks/:
npm run bench:cachingResult file: benchmarks/benchmark-results/api-gateway-caching/latest.json. Dated runs are committed under benchmark-results/api-gateway-caching/<YYYY-MM-DD>_v<version>/result.json for trend tracking.
| Rank | Plugin | Version | Direct deps | Size (KB) | Hooks | CLI cmds | Days since publish | Ships types | Composite |
|---|---|---|---|---|---|---|---|---|---|
| 1 | @interlace/serverless-api-gateway-caching | 0.0.0 (pre-publish, local source) | 0 | 78 | 8 | 4 | 0 | ✓ | 88.0% |
| 2 | serverless-api-gateway-caching (community) | 1.11.0 | 2 | 47 | 3 | 0 | 379 | ✗ | 30.2% |
Per-dimension scores
All seven dimensions (100% of the rubric weight) are now continuously measured. Each score is in [0, 1]; the composite is a weighted average.
| Dimension | Weight | Interlace | Community | Source |
|---|---|---|---|---|
| Lifecycle Correctness | 25% | 1.00 | 0.50 | Live E2E verdict (50%) + structural *:remove:* hook & safe-offboarding command (50%) |
| TypeScript Coverage | 15% | 1.00 | 0.00 | npm registry — .d.ts shipped? |
| Maintenance Signal | 15% | 1.00 | 0.00 | npm registry — days since latest publish |
| CLI Surface | 15% | 1.00 | 0.00 | local source — lifecycleEvents: count |
| Hook Coverage | 10% | 1.00 | 0.38 | local source — registered lifecycle + command hooks |
| Documentation Quality | 10% | 0.80 | 0.40 | README scan — sections + length |
| Bundle Weight | 10% | 0.00 | 1.00 | npm registry — .d.ts and extra commands cost ~31 KB |
Why the gap
- Lifecycle Correctness: Both plugins pass the live
sls removeE2E (CloudFormation handles cluster teardown for the full-stack-removal scenario for both — see the community E2E run). The structural half of the score then diverges: Interlace registers abefore:remove:removehook and shipssls caching disablefor the harder "uninstall while keeping service" scenario; the community plugin has neither, so it scores 0.5 — passing the easy case, missing the hard one. - TypeScript Coverage: community plugin ships no
.d.ts. Misconfigurations are caught only at deploy time, not edit time. - Maintenance Signal: community plugin's last publish is 379 days ago, 0 releases in the last 12 months.
- CLI Surface: community plugin ships zero custom subcommands. Interlace ships
flush,status,disable, andpreview(dry-run). - Hook Coverage: Interlace registers 8 hooks (4 lifecycle + 4 command-lifecycle); community plugin registers 3.
- Documentation Quality: both READMEs have install + usage; Interlace also documents TypeScript usage and lifecycle/cleanup behavior, lifting it above the community plugin's score.
Honest losses
- Bundle Weight: Interlace is heavier (78 KB vs 47 KB). The gap is
.d.tsdeclarations + additional CLI commands. We lose this dimension outright. Composite still wins by ~58 percentage points because the wins compound.
How Lifecycle Correctness is scored
50% of the dimension comes from the live AWS E2E (the latest dated run in scripts/e2e/runs/ for Interlace, scripts/e2e-community/runs/ for the community plugin). The other 50% comes from a static check against the plugin source: 25% if it registers a *:remove:* hook (defense-in-depth), 25% if it ships a safe-offboarding command (disable, cleanup, teardown, etc.).
The structural half is a proxy for the harder ghost-billing scenario — uninstalling the plugin while keeping the service running. CloudFormation can't help there; only an explicit cleanup hook or operator-run command can. Promoting that proxy to a live measurement is tracked as the cleanup-uninstall-path suite (v1.1).
Live release verification (E2E)
Beyond the static benchmark above, the plugin ships an 11-step end-to-end test that's run against real AWS before every release. This is what backs the cleanup-correctness and CLI-behavior claims today, ahead of the competitive benchmark covering them statically.
cd packages/serverless-api-gateway-caching
npm run e2eWhat it verifies:
- Pre-flight (AWS creds, dist/ built, region set)
- Stage fixture into a temp dir, link plugin via
npm pack sls deploy— provisions real cache cluster + Lambda + API Gateway- Cache MISS test — first request returns a fresh
generatedAttimestamp - Cache HIT test — second request within TTL returns IDENTICAL body (Lambda was not re-invoked → served from cache)
sls caching status— asserts cluster is enabledsls caching flush— invalidates the entire stage cache- Post-flush MISS — next request has a NEW
generatedAt(flush worked) sls caching disable— disables cluster (safe-offboarding command)sls remove— full teardown- Verify clean — CloudFormation reports stack absent or
DELETE_COMPLETE(the "no ghost billing" assertion)
Cost: ~$0.05–$0.10 per run (cache cluster × 5–10 min). Always cleans up via try/finally — even on failure, an emergency sls remove runs so AWS isn't left billing for orphans.
Source: scripts/e2e/run.ts. Full prereqs and troubleshooting in the E2E README.
Honest losses
When Interlace loses on a dimension, the table shows it. We don't tune dimensions to win; we tune them to be informative.
- Bundle weight: community plugin wins (47 vs 77 KB). The gap is ~30 KB of
.d.tsfiles + extra commands. Acceptable trade — typed configs save users hours of debug time per misconfig. - Weekly downloads: community plugin has 38,462 dl/wk; Interlace is pre-publish (0 dl/wk). This is a popularity signal, not a quality one — it does NOT enter the composite score. As Interlace publishes and adoption grows, this number will move; the rubric won't change to inflate it.
Re-run policy
Per the Interlace Evidence Framework, this benchmark is re-run:
- Quarterly to refresh competitor versions (catches new releases that might shift scores)
- On every PR that touches
@interlace/serverless-api-gateway-cachingsource (catches regressions) - Manually before any major release
Each re-run produces a dated, methodology-versioned directory in benchmarks/benchmark-results/api-gateway-caching/<YYYY-MM-DD>_v<version>/. Trends are visible via git log on that directory.
IAM Roles Per Function
@interlace/serverless-iam-roles-per-function is a drop-in replacement for serverless-iam-roles-per-function — community v3.2.0, last published 2021-05-21 (~5 years stale at time of writing).
The composite scorecard is pending — the benchmark suite will run on the first publish. Until then, the source-backed comparison is documented on the plugin's migration page with full feature-by-feature citations.
Differentiators verified by source review (against the community plugin's npm tarball):
- Four CLI subcommands the community plugin lacks:
iam preview,iam audit,iam validate,iam status. - Two new auto-permissions: EventBridge (
events:PutEvents) and S3 events (s3:GetObject). - Statement templates (
iamRoleStatementsTemplate) — share base policies across functions. - Least-privilege enforcement (
suppressGlobalRole+requirePerFunctionRoles). - Strict statement validation (Effect enum, Action format, Sid format) at synth time.
- Exported TypeScript config types for
serverless.tsconsumers. - Zero runtime dependencies vs community's
lodash@^4.17.20. - Active maintenance (community last release: 2021-05-21).
Full benchmark page: → IAM benchmark.