Skip to main content

Cloud vs Self-Hosted Parity Matrix

The design commitment: the self-hosted knoxcall/proxy Docker image is the same binary KnoxCall Cloud runs at *.knoxcall.com. The router logic, the secret-injection engine, the rate limits, the audit log, the alert monitor — identical code. Where behaviour diverges it’s because the underlying resource is only available in one mode, and we document each exception here.

Quick Summary

StatusMeaning
FullSame code path, same result — no customer work required.
🔑 Customer-providedSame code path; you supply the credential (SMTP, Twilio, S3, etc.).
⚠️ ReducedWorks with a downgraded resource (e.g. free MaxMind vs paid); upgradeable with your key.
☁️ Cloud-onlyFeature depends on KnoxCall-operated infrastructure that self-hosted doesn’t replicate.
You can pull this as a live JSON document from GET /admin/parity-audit — the admin UI renders it under Settings → Deployment → Feature parity.

Routing & Transformation

FeatureStatusNotes
Route matching by subdomain / path✅ FullSame resolver; tenant resolved from Host.
Secret injection (headers + body)✅ FullSame Liquid template engine, same placeholder syntax.
Response transformation + log obfuscation✅ FullIdentical rules.
OAuth2 access-token refresh✅ FullRefresh tokens re-encrypted in the session bundle, refreshed locally.
Rolling URL / request signing✅ FullSame HMAC verification.
mTLS to upstream APIs✅ FullClient certs re-encrypted in bundle, TLS terminated locally.
HTTP method restrictions✅ FullIdentical allowed-method enforcement per route/environment.
Per-route IP allowlist✅ FullClient IP resolution identical (trust-proxy-1 CF headers).
Webhook dispatch✅ FullCustomer-defined URLs work the same.

Security

FeatureStatusNotes
Per-route rate limiting✅ FullRequires Redis — customer provides locally in self-hosted.
Per-tenant rate limiting✅ FullSame.
Single-tenant enforcement (self-hosted)✅ FullSelf-hosted refuses foreign tenants; cloud serves all.
Binary tamper seal✅ FullSame build_sig verified on every session fetch.
Machine-fingerprint binding✅ FullAgent bound to its host on first fetch. Details
Nonce + timestamp replay protection✅ FullRejected if the same nonce is seen within the 10-min window.
Audit log hash chain✅ FullSame schema + verification.

Analytics & Alerts

FeatureStatusNotes
Per-request API logs✅ FullWritten locally on self-hosted; aggregated counts sync to control plane.
Alert monitoring + notification queue✅ FullSame evaluator, delivery uses your integrations.
AI anomaly detection🔑 Customer-providedBYO Anthropic API key under Settings → Integrations.
Real-time geo map⚠️ ReducedBundled MaxMind free DB; upgrade to your paid license for full accuracy.
Per-tenant usage metering✅ FullUsage reported to control plane every 60s for admin-UI display.

Integrations

FeatureStatusNotes
Email (alerts / invites / resets)🔑 Customer-providedResend / SendGrid / Postmark / Mailgun / SES / SMTP. Required on self-hosted.
SMS alerts (Twilio)🔑 Customer-providedCustomer Twilio credentials, identical delivery logic.
Response-body archival (S3/R2/MinIO)🔑 Customer-providedAny S3-compatible endpoint.
Slack alert webhooks✅ FullConfigured per-webhook.
Stripe billing☁️ Cloud-onlySelf-hosted plans are billed as a flat Enterprise license.
KnoxCall-managed DigitalOcean egress☁️ Cloud-onlyRun your own egress proxy behind the container if needed.

Lifecycle

FeatureStatusNotes
Migration wizard (cloud ↔ self-hosted)✅ FullReadiness check + shadow test + one-click cutover in both directions.
Email branding + template overrides✅ FullSame Settings → Integrations UI.
Team invitations + role changes✅ FullAdmin auth always flows through the control plane.

What “Same binary” Actually Means

  • We build one Docker image per release: knoxcall/proxy:{version}.
  • That image runs on our servers at knoxcall.com AND on your self-hosted infrastructure.
  • The only difference is environment configuration: KNOXCALL_DEPLOYMENT_MODE=cloud | self_hosted, which tenant it serves, and which external credentials it’s given.
  • No forked codebase, no “Enterprise Edition”, no minus-features stripped out. When we ship a new feature on cloud, it arrives in the next self-hosted image pull.

Self-Hosted is Not a Subset

A common worry: “self-hosted versions of SaaS products are always stripped down.” That’s not our model. Self-hosted has more required configuration (you bring your own SMTP, Redis, Postgres, MaxMind, etc.) but the runtime behaviour is identical. What the customer loses in self-hosted is:
  • The cloud operator doing ops for you — you back up your own Postgres, rotate your own secrets, watch your own alerts. We still push the control-plane config (routes, secrets, feature flags) but the data plane is yours to operate.
  • Cross-tenant features we haven’t yet made portable — Stripe billing, KnoxCall-branded egress IPs, the global AI anomaly model trained across tenants. These stay cloud-only.
Everything else ships identical between the two.

How We Enforce Parity

Three mechanisms:
  1. Source identity. Both modes compile from the same src/. CI rebuilds the image on every merge.
  2. Shadow testing during migration. The migration wizard dual-sends real requests through both sides and diffs responses before letting you cut over.
  3. This document. Every known divergence is listed. If you find a feature that behaves differently and isn’t in the Cloud-only row, that’s a bug — email us.
See also: Self-hosted proxy guide, Migration guide, Agent security model.