About Fidelic
Fidelic is a local emulator of the Salesforce REST API. It runs as a single Docker container: it loads your org's retrieved schema, executes your real Apex triggers, and answers REST calls the way a Salesforce org would — including the failures a real org will never let you reproduce on demand.
It exists for one job: testing integrations against Salesforce without a
sandbox. Sandboxes are slow to provision, shared, and — critically — cannot be
told to fail. You cannot ask a real org to return UNABLE_TO_LOCK_ROW,
hit an API limit, or throttle a tenant, because doing so would affect everyone on
it. Fidelic makes those a config flag.
Built conformance-first
Fidelic is not written from guesses about how Salesforce behaves. It is written against a conformance suite, in this order:
- The test is written first, from Salesforce's publicly available documentation — request in, exact response envelope expected out.
- The test is verified against a real org before it counts, so the expectation is what Salesforce actually returns, not what the docs imply.
- The verified test is frozen. The emulator is then built until it passes — never the reverse. The ruler comes before the thing it measures.
The current suite passes 68 of 68. Every behavior in the emulator traces back to a specific conformance test; nothing is there because it seemed plausible.
The honesty model: Executed, Simulated, Refused
An emulator's most dangerous failure is the quiet one — silently doing the wrong thing and looking right. Fidelic is built to refuse that. At load time it classifies every trigger and labels it, per trigger, in the coverage report:
- Executed — the trigger runs for real, as an interpreter, against the store: real conditions, real computed values, real DML with re-entrancy and whole-transaction rollback.
- Simulated — a platform effect that can't be executed faithfully is modeled honestly and labeled as such: an async job runs inline, a platform event is recorded rather than delivered, a callout answers from a mock. Never presented as the real thing.
- Refused — anything outside the supported subset is not
approximated. It is refused loudly, with the exact
file:lineand a reason. A refusal is a known gap, not a silent lie.
Overclaiming any simulated behavior as faithful is treated as the one unforgivable bug. What Fidelic executes, what it simulates, and what it refuses is documented and versioned — so you always know which of the three you're looking at.