All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.11.0 - 2026-04-02
X-GDC-TRACE-IDresponse header is now preserved in proxy and record modes (previously stripped along with allX-GDC*headers)- In record mode,
X-GDC-TRACE-IDis only forwarded to the client — it is still excluded from saved mappings to keep recordings clean
0.10.0 - 2026-03-18
- Moved replay mode into its own
internal/replaypackage, matching the pattern ofrecordandpureproxy - Each mode now has its own admin handler (
handleReplayAdmin,handleRecordAdmin) — admin endpoints are scoped to the mode where they make sense instead of sharing a single catch-all handler - Mapping-related admin endpoints (
/__admin/mappings,/__admin/mappings/import,/__admin/mappings/reset,/__admin/reset) are now replay-mode only — record and proxy modes no longer silently accept mapping operations that have no effect /__admin/recordings/snapshotis now record-mode only — replay and proxy modes return 404 instead of an empty response/__admin/scenarios/resetnow returns 501 (was a silent no-op returning 200)/__admin/settingsnow returns 501 (was a silent no-op returning 200)DELETE /__admin/requestsnow returns 501 in replay/proxy modes (record mode still clears exchanges)- Record mode
/__admin/resetno longer callsClearMappings(mappings are never loaded in record mode)
0.9.0 - 2026-03-15
install.shscript for downloading and installing prebuilt binaries with checksum verification
0.8.0 - 2026-03-15
- Cross-platform binary releases attached to GitHub Releases (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64, windows/arm64) with SHA-256 checksums
- Binaries are now built with
-ldflags="-s -w"to strip debug symbols and reduce binary size
0.7.0 - 2026-03-15
--version/-vflag to print the embedded version and exit- Version is now embedded in the binary at compile time via
//go:embed VERSION
0.6.0 - 2026-03-10
BINARY_CONTENT_TYPESenvironment variable (record + replay) — comma-separated list of Content-Types whose response bodies should be stored as base64-encoded strings in thebodyfield. In replay mode, responses with matching Content-Types are automatically base64-decoded before serving.
0.5.1 - 2026-02-20
- Increased default maximum request body size to 16MB
0.5.0 - 2026-02-11
application/jsonresponse bodies are now always stored as structured JSON (jsonBody) instead of escaped strings, improving diffability of mapping filesJSON_CONTENT_TYPESenvironment variable (record mode) — comma-separated list of additional Content-Types to also store asjsonBody(e.g.application/vnd.gooddata.api+json)- Replay mode supports serving both
body(string) andjsonBody(structured) response formats PRESERVE_JSON_KEY_ORDERenvironment variable (record mode) — when set, preserves original key ordering in both JSON request bodies (equalToJson) and response bodies (jsonBody) instead of sorting alphabeticallySORT_ARRAY_MEMBERSenvironment variable (record mode) — when set, recursively sorts JSON array elements by their stringified value (bottom-up) in both request and response bodies, eliminating diffs caused by non-deterministic array ordering from upstream- Recorded mappings are now sorted deterministically by name (with method + URL + query params + body as tiebreaker for duplicate names), eliminating spurious diffs caused by request-arrival ordering
- Removed
idanduuidfields from recorded mappings — they were random UUIDs that caused spurious diffs on every re-record and were never used for matching or lookup
- Breaking (output only): Mapping files produced by record mode are no longer WireMock-compatible as of v0.5.0 —
application/jsonresponses usejsonBody(structured JSON) instead ofbody(escaped strings), and mappings omitid/uuidfields. Replay mode remains fully backwards-compatible: old WireMock-format mapping files (withbodystrings andid/uuidfields) still load and work without changes. The admin API also remains WireMock-compatible. - Breaking (key order): JSON keys in both request bodies (
equalToJson) and response bodies (jsonBody) are now sorted alphabetically by default for deterministic diffs. If your consumers rely on original key ordering from the upstream server, setPRESERVE_JSON_KEY_ORDER=trueto restore the previous behaviour. VERBOSEenvironment variable now accepts any non-empty value (previously requiredtrue,1, oryes)
0.4.0 - 2026-02-11
- Proxy mode (
goodmock proxy) — forwards all traffic to upstream without recording, applying the same header transformations and response filtering as record mode
0.3.2 - 2026-02-11
- Split monolithic
mainpackage intointernal/sub-packages:types,server,record,matching,logging,proxy,common - Exported Server struct fields (
Mappings,ProxyHost,RefererPath,Verbose,Mu) for cross-package access - Exported public API functions (
HandleRequest,HandleAdmin,LoadMappings,ClearMappings,TransformRequestHeaders,LogVerboseRequest,MatchRequest,LogMismatch,ProxyRequest,RunRecord) - Moved shared helpers (
GetPort,IsVerbose) intointernal/common
0.3.1 - 2026-02-11
- Refactored codebase from OOP style to functional style — all Server and RecordServer methods converted to free functions
- Pure functions (applyResponseHeaders, evaluateMapping, logMismatch, logVerboseRequest, transformRequestHeaders) no longer take a server receiver
- Replaced RecordServer struct embedding with explicit
server *Serverfield - Request handlers use closures instead of method values
0.3.0 - 2026-02-10
- Record mode (
goodmock record) — proxies to upstream and captures request/response pairs /__admin/recordings/snapshotendpoint with URL pattern filtering and scenario support- Automatic gzip decompression for recorded response bodies
- Scenario-based mappings for repeated URLs (
repeatsAsScenarios) VERBOSEenvironment variable for full request/response traffic logging
0.2.1 - 2026-02-10
- Added mode as primary CLI arg (
goodmock replay), defaults toreplay - Replaced
-portflag withPORTenvironment variable (default: 8080)
0.2.0 - 2026-02-10
- URL path matching now preserves percent-encoding (e.g.
%3A) by using raw request URI instead of fasthttp's decoded path
- Request header rewriting (Origin, Referer, Accept-Encoding) to match recorded stubs
REFERER_PATHenvironment variable for app-specific Referer header path
0.1.1 - 2026-02-10
- Refactor and minor improvements
0.1.0 - 2026-02-09
- Initial release