Repository navigation
Expand file tree
/
Copy pathengineering-notes.html
More file actions
609 lines (562 loc) · 45.5 KB
/
Copy pathengineering-notes.html
File metadata and controls
609 lines (562 loc) · 45.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MockForge — Engineering Notes</title>
<meta name="description" content="Engineering notes and release deep dives from MockForge." />
<link rel="icon" href="/public/favicon.ico" sizes="any">
<link rel="icon" type="image/png" sizes="32x32" href="/public/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/public/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/public/apple-touch-icon.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Icons: Phosphor web font -->
<link rel="stylesheet" href="/public/vendor/phosphor/phosphor.css" />
<link rel="stylesheet" href="/public/styles.css" />
<link rel="alternate" type="application/rss+xml" title="MockForge Engineering Notes" href="/rss.xml" />
<script>
(function () {
try {
var storedTheme = localStorage.getItem('theme');
var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (storedTheme === 'dark' || (!storedTheme && prefersDark)) {
document.documentElement.classList.add('dark');
}
} catch (error) {
console.warn('Theme initialization failed:', error);
}
})();
</script>
<style>
html, body { height: 100%; }
* { transition: background-color 0.2s ease, border-color 0.2s ease; }
html.dark { color-scheme: dark; }
html.dark body { background-color: #0f172a; color: #e2e8f0; }
html.dark .bg-white { background-color: #1e293b !important; }
html.dark .bg-surface-subtle,
html.dark .bg-stone-50,
html.dark section:not(.bg-white):not([style*="background"]) { background-color: #0f172a; }
html.dark .text-text-primary,
html.dark .text-slate-900,
html.dark .text-brand-ink,
html.dark .text-brand-dark { color: #f1f5f9 !important; }
html.dark .text-text-secondary,
html.dark .text-slate-700,
html.dark .text-slate-600,
html.dark .text-slate-500,
html.dark .text-slate-300 { color: #cbd5e1 !important; }
html.dark .text-orange-700,
html.dark .text-orange-200 { color: #fdba74 !important; }
html.dark header { background-color: #0f172a !important; border-bottom-color: rgba(255, 255, 255, 0.1) !important; }
html.dark header nav a { color: #e2e8f0 !important; }
html.dark header nav a:hover { color: #ffffff !important; }
html.dark .border-black\/5,
html.dark .border-black\/10,
html.dark .border-slate-200,
html.dark .border-slate-300 { border-color: rgba(255, 255, 255, 0.1) !important; }
html.dark .ring-black\/5 { --tw-ring-color: rgba(255, 255, 255, 0.1) !important; }
html.dark .shadow-soft { box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); }
html.dark .shadow-note { box-shadow: 0 14px 40px rgba(0, 0, 0, 0.35); }
html.dark code { background-color: #1e293b; color: #e2e8f0; }
/* code inside a <pre> is its own block; don't paint the inline-code box behind it */
html.dark pre code { background-color: transparent; color: inherit; }
.reveal { opacity: 0; transform: translateY(20px); transition: opacity .6s cubic-bezier(.16,1,.3,1), transform .6s cubic-bezier(.16,1,.3,1); }
.reveal.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) { .reveal { opacity: 1; transform: none; transition: none; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
"https://github.com/SaaSy-Solutions/mockforge",
"https://www.linkedin.com/company/mockforge"
],
"contactPoint": [
{
"@type": "ContactPoint",
"contactType": "sales",
"email": "sales@mockforge.dev",
"url": "https://mockforge.dev/contact.html"
},
{
"@type": "ContactPoint",
"contactType": "security",
"email": "security@mockforge.dev",
"url": "https://mockforge.dev/trust.html"
},
{
"@type": "ContactPoint",
"contactType": "technical support",
"email": "support@mockforge.dev",
"url": "https://github.com/SaaSy-Solutions/mockforge/issues"
}
],
"address": {
"@type": "PostalAddress",
"streetAddress": "28 E 200 N",
"addressLocality": "Franklin",
"addressRegion": "IN",
"postalCode": "46131",
"addressCountry": "US"
}
}
</script>
</head>
<body class="bg-surface-subtle text-text-primary antialiased font-sans selection:bg-brand-orange/20">
<header class="sticky top-0 z-40 backdrop-blur bg-white/90 dark:bg-slate-900 border-b border-black/5 dark:border-white/10">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<a href="/" class="flex items-center gap-3">
<img src="/public/logo-transparent.png" alt="MockForge logo" class="h-8 w-8" />
<span class="font-semibold tracking-tight text-brand-dark dark:text-white">MockForge</span>
</a>
<nav class="hidden md:flex items-center gap-3 lg:gap-4">
<a href="https://docs.mockforge.dev" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">Docs</a>
<a href="/engineering-notes.html" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">Notes</a>
<a href="/#features" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">Features</a>
<a href="/pricing.html" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">Pricing</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">GitHub</a>
<a href="https://app.mockforge.dev/login" class="text-text-secondary dark:text-gray-300 hover:text-text-primary dark:hover:text-white text-sm lg:text-base">Log In</a>
<a href="https://app.mockforge.dev/register" class="inline-flex items-center gap-1.5 px-2.5 py-1.5 lg:px-3 lg:py-2 rounded-lg text-white hover:opacity-90 shadow-soft whitespace-nowrap text-sm" style="background-color: #D35400;">
<span>Get started free</span>
</a>
<button id="themeToggle" class="p-2 rounded-lg border border-black/10 dark:border-white/20 hover:bg-black/5 dark:hover:bg-white/10" aria-label="Toggle dark mode">
<svg id="sun" class="h-5 w-5 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3v2m0 14v2m9-9h-2M5 12H3m15.364 6.364-1.414-1.414M7.05 7.05 5.636 5.636m12.728 0-1.414 1.414M7.05 16.95l-1.414 1.414"/><circle cx="12" cy="12" r="4"/></svg>
<svg id="moon" class="h-5 w-5 hidden dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z"/></svg>
</button>
</nav>
<button id="menuBtn" type="button" class="md:hidden p-2 rounded-lg border border-black/10 dark:border-white/20" aria-label="Open menu" aria-controls="mobileMenu" aria-expanded="false">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="h-6 w-6"><path d="M3 12h18M3 6h18M3 18h18"/></svg>
</button>
</div>
</div>
<div id="mobileMenu" class="md:hidden hidden border-t border-black/5 dark:border-white/10 bg-white dark:bg-brand-dark">
<div class="px-4 py-3 space-y-2">
<a href="https://docs.mockforge.dev" class="block text-text-primary dark:text-white">Docs</a>
<a href="/engineering-notes.html" class="block text-text-primary dark:text-white">Notes</a>
<a href="/#features" class="block text-text-primary dark:text-white">Features</a>
<a href="/pricing.html" class="block text-text-primary dark:text-white">Pricing</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="block text-text-primary dark:text-white">GitHub</a>
<a href="https://app.mockforge.dev/login" class="block text-text-primary dark:text-white">Log In</a>
<a href="https://app.mockforge.dev/register" class="inline-flex items-center gap-2 px-3 py-2 rounded-lg text-white hover:opacity-90 shadow-soft" style="background-color: #D35400;">Get started free</a>
</div>
</div>
</header>
<main class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12 lg:py-16">
<section class="reveal rounded-2xl bg-gradient-to-br from-slate-950 via-slate-900 to-slate-800 px-8 py-12 text-white shadow-note">
<p class="text-xs font-medium uppercase tracking-[0.18em] text-orange-300">Engineering notes</p>
<h1 class="mt-4 text-3xl md:text-4xl font-semibold tracking-tight leading-[1.1]">Release context, implementation decisions, and technical tradeoffs.</h1>
<p class="mt-4 max-w-3xl text-slate-300 leading-relaxed">A running log of the product decisions behind MockForge, from scenario modeling and test hardening to release safety and client-generation tradeoffs.</p>
<div class="mt-7 flex flex-wrap gap-3">
<a href="https://docs.mockforge.dev" class="inline-flex items-center gap-2 rounded-xl bg-brand-orange px-4 py-2.5 text-sm font-medium text-white hover:opacity-90 active:scale-[.98] transition"><i class="ph-bold ph-book-open-text"></i> Read the docs</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="inline-flex items-center gap-2 rounded-xl border border-white/15 px-4 py-2.5 text-sm font-medium text-white hover:bg-white/10 active:scale-[.98] transition"><i class="ph-fill ph-github-logo"></i> View GitHub</a>
</div>
</section>
<section class="mt-10 space-y-6">
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 2, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Release Notes: New App Shell, Bench Campaign Mode, and a GDPR Fix</h2>
<p class="mt-3 text-slate-700">What shipped in MockForge v0.3.227: a full redesign of the logged-in Cloud portal (task-based sidebar, command palette, derived-health dashboard), campaign mode for bench-chunked, a GDPR account-erasure fix, and a wasmtime security bump.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-3-227-release.html" class="text-brand-orange hover:opacity-80">Read full note</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 25, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">MockForge vs Postman Mock Server</h2>
<p class="mt-3 text-slate-700">An honest comparison of Postman Mock Server and MockForge — when each tool is the right choice, the gaps you'll hit as your architecture grows, and the pricing tradeoffs at scale.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-vs-postman-mock.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="/compare-postman-mock.html" class="text-brand-orange hover:opacity-80">Full Comparison</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 23, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Conformance Testing Maturity: Multi-Protocol Spec Validation and SARIF Reports</h2>
<p class="mt-3 text-slate-700">How MockForge's conformance testing framework grew from basic spec validation into a structured 47-check framework with SARIF output, per-category targeting, and multi-protocol contract checking.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-conformance-maturity.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://github.com/SaaSy-Solutions/mockforge/blob/main/docs/CONFORMANCE_TESTING.md" class="text-brand-orange hover:opacity-80">Conformance Guide</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 22, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Release Notes: gRPC Dynamic Routing, $ref Resolution, and Protocol Handler Refactor</h2>
<p class="mt-3 text-slate-700">How the v0.3.70–v0.3.75 cycle consolidated gRPC dynamic routing, $ref resolution for OpenAPI specs, and interior-mutable protocol handlers that enable live config updates.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-grpc-dynamic-routing-release.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev/user-guide/grpc-mocking.html" class="text-brand-orange hover:opacity-80">gRPC Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 21, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Extending MockForge with WASM Plugins</h2>
<p class="mt-3 text-slate-700">Custom mocks without forking the codebase — write response generators, data transformers, and protocol handlers in any WASM-compilable language, sandboxed and simple to wire up.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-wasm-plugins.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev/user-guide/plugins.html" class="text-brand-orange hover:opacity-80">Plugin SDK Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 20, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Fault Injection and Chaos Patterns Across Protocols</h2>
<p class="mt-3 text-slate-700">Static mocks give false confidence — inject controlled failures across HTTP, gRPC, Kafka, and WebSocket to surface the error-handling gaps your integration tests miss.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-fault-injection-patterns.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="/pricing.html" class="text-brand-orange hover:opacity-80">Pricing</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 18, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Our $10/mo SaaS Infrastructure</h2>
<p class="mt-3 text-slate-700">A walkthrough of MockForge Cloud's hosting stack — Cloudflare Pages for the admin UI, Fly.io for compute, Neon for Postgres — and why it costs under $10/month at launch traffic.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-our-saas-infrastructure.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-brand-orange hover:opacity-80">GitHub</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 17, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">How We Built the Hosted-Mock Cost Cap</h2>
<p class="mt-3 text-slate-700">A pre-launch readiness review surfaced a 10x cost-leak risk on the $29 Pro plan. The retrospective on how we shipped body-size caps and per-deployment RPS limits in the week before going live.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-cost-cap-design.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://github.com/SaaSy-Solutions/mockforge/pull/481" class="text-brand-orange hover:opacity-80">The PR</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 16, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">When WireMock Isn't Enough</h2>
<p class="mt-3 text-slate-700">WireMock has been the default HTTP mock server for fifteen years. The specific cases where it stops being the right tool — and the ones where switching would be a step backward.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-when-wiremock-isnt-enough.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="/compare-wiremock.html" class="text-brand-orange hover:opacity-80">Full Comparison</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 15, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Mocking Kafka Producers Without a Real Broker</h2>
<p class="mt-3 text-slate-700">Three levels of fake, when each is the right choice, and how a wire-compatible Kafka mock fits between client-library stubs and full testcontainers — including deterministic failure-injection patterns you can't reproduce on a real broker.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-mocking-kafka-without-broker.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev/user-guide/kafka-mocking.html" class="text-brand-orange hover:opacity-80">Kafka Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 14, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Why MockForge Stayed Multi-Protocol</h2>
<p class="mt-3 text-slate-700">The market is full of HTTP-only mock services. Why we took the harder path: protocols beyond HTTP, spec-driven mocking that generalizes, and what the trade actually costs.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-why-multi-protocol.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="/pricing.html" class="text-brand-orange hover:opacity-80">Pricing</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 13, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">How to Mock a gRPC Service in CI</h2>
<p class="mt-3 text-slate-700">A practical guide: from the proto file to a gRPC mock in CI, with reflection probing and a GitHub Actions snippet. No JVM, no testcontainers, no hand-rolled fake to maintain.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-grpc-mocking-in-ci.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev/user-guide/grpc-mocking.html" class="text-brand-orange hover:opacity-80">gRPC Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">May 12, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">MockForge Cloud is Here</h2>
<p class="mt-3 text-slate-700">After two years building the OSS multi-protocol mock server, the managed version is live. Deploy a hosted mock from a spec in 30 seconds — and keep the OSS path you already had.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-cloud-launch.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://app.mockforge.dev/register" class="text-brand-orange hover:opacity-80">Sign Up</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 28, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Multi-Target Testing, Real-World Spec Support, and Conformance Maturity</h2>
<p class="mt-3 text-slate-700">Two weeks of field testing against 66+ proxy targets and real-world specs from GitHub, Amazon S3, and Xero drove multi-target conformance, HAR-to-YAML generation, field-level schema errors, and Swagger 2.0 formData support.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-multi-target-conformance-and-real-world-specs.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 8, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">API Drift Detection and Contract Alerting</h2>
<p class="mt-3 text-slate-700">Why we treat contract drift as an alerting event and how endpoint-level mismatch metadata shortens triage loops.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-api-drift-detection-and-contract-alerting.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 8, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.3 Migration Playbook: Reduce Upgrade Risk in Three Passes</h2>
<p class="mt-3 text-slate-700">A practical migration sequence for moving into v0.3 safely: baseline drift, stage strictness, then move critical routes with rollback toggles.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-3-migration-playbook.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Migration docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Spec-Driven OpenAPI Conformance Testing in MockForge</h2>
<p class="mt-3 text-slate-700">How the 0.3.55 to 0.3.57 releases moved MockForge from generic API checks into spec-driven conformance with response schema validation and SARIF output.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-spec-driven-openapi-conformance.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Conformance docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Spec-Driven Conformance: Why Contract Verification Beats Generic Checks</h2>
<p class="mt-3 text-slate-700">Spec-driven OpenAPI conformance turns API testing from generic request checks into real contract verification against the features your spec actually uses.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-conformance-testing.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">How We Took WAFBench SQLi Detection from 37/46 to 46/46</h2>
<p class="mt-3 text-slate-700">A technical deep dive into the 0.3.46 to 0.3.54 security-testing hardening arc across payload delivery, cookie handling, grouped CRS requests, and measured SQLi detection gains.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-wafbench-sqli-detection.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-brand-orange hover:opacity-80">View code</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">WAFBench Security Hardening: Transport Semantics and Benchmark Credibility</h2>
<p class="mt-3 text-slate-700">Security benchmarks are only trustworthy when payload delivery is right. What it takes to move from partial coverage to meaningful WAFBench results.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-wafbench-security-hardening.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-brand-orange hover:opacity-80">View code</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Recent MockForge Reliability Updates: Admin Startup, Better Failure Reporting, and Correct Response-Code Checks</h2>
<p class="mt-3 text-slate-700">A short product update on the 0.3.72 and 0.3.73 releases covering admin startup reliability, clearer failed-check reporting, and more accurate conformance behavior.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-reliability-updates-conformance-and-admin.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 7, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Reliability Update: Admin Startup, Failure Reporting, and Conformance Accuracy</h2>
<p class="mt-3 text-slate-700">Small reliability releases matter when they remove first-run friction and make failed checks easier to trust. What the 0.3.72 and 0.3.73 releases improved.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-reliability-update-march-2026.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 5, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Release Engineering Note: Security Guardrails from v0.2.x</h2>
<p class="mt-3 text-slate-700">A focused review of v0.2.x hardening work: validation defaults, auth-related flow safety, and migration priorities for teams upgrading from earlier versions.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-security-guardrails-v0-2x.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Changelog & migration docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">March 3, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">How We Use Scenario Switching to Keep Mocks Honest</h2>
<p class="mt-3 text-slate-700">Scenario switching helps teams test stateful behavior instead of static happy-path fixtures. This note outlines a practical scenario model and why it improves integration confidence.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-scenario-switching.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Read docs</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-brand-orange hover:opacity-80">View GitHub</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">January 21, 2026</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Release Cadence and Risk: How We Keep Fast Iteration Safe</h2>
<p class="mt-3 text-slate-700">How we sequence fixes, hardening, and communication so release speed does not become release risk.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-release-cadence-and-risk.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">December 10, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Client Generation Tradeoffs: Safety, Speed, and Developer Experience</h2>
<p class="mt-3 text-slate-700">A practical note on balancing strict schema fidelity with developer velocity in generated clients.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-client-generation-tradeoffs.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">November 5, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.7: API Sync, TCP Support & Advanced Mocking</h2>
<p class="mt-3 text-slate-700">Intelligent API synchronization with change detection, TCP protocol mocking, flexible response selection modes, and real webhook execution.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-7-api-sync-tcp.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">November 5, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Why Failure-Path Testing Should Be a First-Class Mocking Requirement</h2>
<p class="mt-3 text-slate-700">Controlled failure profiles expose retry and fallback weaknesses before integration surprises hit teams.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-testing-failure-paths.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">November 4, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.6: Production Security & Infrastructure</h2>
<p class="mt-3 text-slate-700">Enterprise-grade TLS/HTTPS and mTLS support, built-in tunneling for local development, and completed SDK implementation phases 1 and 2.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-6-security-infrastructure.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">November 2, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.5: Enterprise Security & OAuth2</h2>
<p class="mt-3 text-slate-700">Complete OAuth2 with PKCE, structured error handling, request/response validation, interceptors, and multiple authentication methods for production-ready API clients.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-5-enterprise-security.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">November 1, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.4: Client Generator Fixes & Test Coverage</h2>
<p class="mt-3 text-slate-700">Request body generation fixed across React, Vue, and Svelte. TypeScript required vs optional fields corrected. Comprehensive multi-framework test coverage added.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-4-client-fixes.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 31, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.3: Bug Fixes & Stability Improvements</h2>
<p class="mt-3 text-slate-700">Critical fixes for OpenAPI example extraction, request body parameter generation, and React client generator Handlebars template logic.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-3-bug-fixes.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 29, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.2.0: Multi-Framework Client Generation</h2>
<p class="mt-3 text-slate-700">Generate type-safe API clients for React, Vue, Angular, and Svelte from OpenAPI specs. Unified spec parser, enhanced mock data generation, and browser mobile proxy mode.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-2-0-client-generation.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 23, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Introducing MockForge: First Public Release (v0.1.2)</h2>
<p class="mt-3 text-slate-700">The first public release of MockForge: AI-powered API mocking for REST, gRPC, GraphQL, WebSockets, and SMTP in a unified Rust framework.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-announcing-v1.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 22, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">v0.1.3: Protocol Expansion & Testing Tools</h2>
<p class="mt-3 text-slate-700">Native GraphQL handlers, programmable WebSockets, HTTP scenario switching, capture scrubbing, unified config profiles, and the mockforge-test integration crate.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-v0-1-3-protocol-expansion.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
<article class="bg-white rounded-2xl p-6 shadow-soft ring-1 ring-black/5 transition hover:shadow-note hover:-translate-y-0.5">
<p class="text-xs uppercase tracking-wide text-slate-500">October 8, 2025</p>
<h2 class="mt-2 text-xl font-semibold text-brand-dark">Migration Guide: Moving from Static Fixtures to Stateful Mocks</h2>
<p class="mt-3 text-slate-700">A staged migration path from static fixtures to state-aware scenario switching for better integration confidence.</p>
<div class="mt-4 flex gap-4 text-sm">
<a href="/note-migration-from-static-fixtures.html" class="text-brand-orange hover:opacity-80">Read full note</a>
<a href="https://docs.mockforge.dev" class="text-brand-orange hover:opacity-80">Docs</a>
</div>
</article>
</section>
<section class="mt-10 rounded-2xl border border-dashed border-slate-300 px-6 py-5 text-sm text-slate-600">
Want release notes in product context instead of changelog fragments? Start with the notes here, then jump into the full docs for commands, schemas, and migration detail.
</section>
</main>
<footer class="py-10 border-t border-black/5 dark:border-white/10">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col sm:flex-row items-center justify-between gap-4">
<div class="flex items-center gap-3">
<img src="/public/logo-transparent.png" alt="MockForge logo" class="h-6 w-6" />
<span class="text-sm text-text-secondary">© <span id="year"></span> MockForge. MIT or Apache-2.0.</span>
</div>
<div class="flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-sm">
<a href="https://docs.mockforge.dev" class="text-text-secondary hover:text-text-primary">Docs</a>
<a href="/engineering-notes.html" class="text-text-secondary hover:text-text-primary">Notes</a>
<a href="/pricing.html" class="text-text-secondary hover:text-text-primary">Pricing</a>
<a href="/compare-wiremock.html" class="text-text-secondary hover:text-text-primary">Compare: WireMock</a>
<a href="/compare-mockserver.html" class="text-text-secondary hover:text-text-primary">Compare: MockServer</a>
<a href="https://github.com/SaaSy-Solutions/mockforge" class="text-text-secondary hover:text-text-primary">GitHub</a>
<a href="https://www.linkedin.com/company/mockforge" class="text-text-secondary hover:text-text-primary" target="_blank" rel="noopener noreferrer">LinkedIn</a>
<a href="https://app.mockforge.dev/legal/privacy" class="text-text-secondary hover:text-text-primary">Privacy</a>
<a href="https://app.mockforge.dev/legal/terms" class="text-text-secondary hover:text-text-primary">Terms</a>
<a href="https://app.mockforge.dev/legal/dpa" class="text-text-secondary hover:text-text-primary">DPA</a>
<a href="/trust.html" class="text-text-secondary hover:text-text-primary">Trust</a>
<a href="/contact.html" class="text-text-secondary hover:text-text-primary">Contact</a>
</div>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function () {
var toggle = document.getElementById('themeToggle');
var html = document.documentElement;
var menuBtn = document.getElementById('menuBtn');
var mobileMenu = document.getElementById('mobileMenu');
var year = document.getElementById('year');
if (year) year.textContent = new Date().getFullYear();
if (toggle) {
toggle.addEventListener('click', function () {
html.classList.toggle('dark');
var isDark = html.classList.contains('dark');
localStorage.setItem('theme', isDark ? 'dark' : 'light');
});
}
if (menuBtn && mobileMenu) {
var setMenu = function (open) {
mobileMenu.classList.toggle('hidden', !open);
menuBtn.setAttribute('aria-expanded', open ? 'true' : 'false');
menuBtn.setAttribute('aria-label', open ? 'Close menu' : 'Open menu');
};
menuBtn.addEventListener('click', function () {
setMenu(mobileMenu.classList.contains('hidden'));
});
mobileMenu.querySelectorAll('a').forEach(function (link) {
link.addEventListener('click', function () {
setMenu(false);
});
});
}
// Scroll-reveal for any element with .reveal (IntersectionObserver, no scroll listeners).
var reveals = document.querySelectorAll('.reveal');
if (reveals.length && 'IntersectionObserver' in window) {
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
entry.target.classList.add('in');
io.unobserve(entry.target);
}
});
}, { threshold: 0.12 });
reveals.forEach(function (el) { io.observe(el); });
} else {
reveals.forEach(function (el) { el.classList.add('in'); });
}
});
</script>
</body>
</html>