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.
The model: Executed, Simulated, Recorded-only, Refused
An emulator's most dangerous failures are the quiet ones: 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. It's not presented as the real thing.
- Recorded-only we could run its body, but its trigger, a platform event or a change event can't occur in an emulator, so its run never fires here. We say exactly that, instead of pretending it executed.
- Refused anything outside the supported subset is not approximated.
It is refused, with the exact
file:lineand a reason. A refusal is a known gap we have acknowledged that could be filled in future releases.
What Fidelic executes, what it simulates, and what it refuses is documented and versioned so you always know which of the four you're looking at.