forgedock 1.0.17 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +34 -1
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +229 -17
  4. package/commands/autopilot.md +77 -0
  5. package/commands/design-bench.md +176 -0
  6. package/commands/design-render-critique-loop.md +103 -0
  7. package/commands/design.md +259 -0
  8. package/commands/issue.md +7 -3
  9. package/commands/orchestrate.md +121 -0
  10. package/commands/{resume.md → pipeline-resume.md} +4 -4
  11. package/commands/{status.md → pipeline-status.md} +1 -1
  12. package/commands/qa-sweep.md +37 -2
  13. package/commands/quality-gate.md +57 -0
  14. package/commands/review-pr-staging.md +158 -2
  15. package/commands/test-gate.md +929 -0
  16. package/commands/work-on/build/implement.md +5 -3
  17. package/commands/work-on.md +53 -3
  18. package/docs/CI.md +177 -0
  19. package/docs/FORGE-PROTOCOL.md +324 -0
  20. package/docs/articles/b-vs-c-baseline.md +210 -0
  21. package/docs/articles/full-abc-benchmark.md +205 -0
  22. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  23. package/docs/design/abc-benchmark.md +195 -0
  24. package/docs/design/design-architect-rationale.md +123 -0
  25. package/docs/design/design-memory.md +61 -0
  26. package/docs/design/design-spec-schema.md +248 -0
  27. package/docs/design/design-system-lint.md +150 -0
  28. package/docs/design/divergent-generation.md +106 -0
  29. package/docs/design/effects-appropriateness.md +133 -0
  30. package/docs/design/fixtures/briefs/README.md +47 -0
  31. package/docs/design/fixtures/briefs/cadence.md +39 -0
  32. package/docs/design/fixtures/briefs/plume.md +39 -0
  33. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  34. package/docs/design/fixtures/briefs/tender.md +39 -0
  35. package/docs/design/fixtures/briefs/voltage.md +39 -0
  36. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  37. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  38. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  39. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  40. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  41. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  42. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  43. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  44. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  45. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  46. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  47. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  48. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  49. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  50. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  51. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  52. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  53. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  54. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  55. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  56. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  57. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  58. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  59. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  60. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  61. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  62. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  63. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  64. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  65. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  66. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  67. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  68. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  69. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  70. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  71. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  72. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  73. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  74. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  75. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  76. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  77. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  78. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  79. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  80. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  81. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  82. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  83. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  84. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  85. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  86. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  87. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  88. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  89. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  90. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  91. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  92. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  93. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  94. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  95. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  96. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  97. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  98. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  99. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  100. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  101. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  102. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  103. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  104. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  105. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  106. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  107. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  108. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  109. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  110. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  111. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  112. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  113. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  114. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  115. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  116. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  117. package/docs/design/foundations/brutalist.css +294 -0
  118. package/docs/design/foundations/editorial.css +300 -0
  119. package/docs/design/foundations/minimal-luxury.css +295 -0
  120. package/docs/design/foundations/technical.css +293 -0
  121. package/docs/design/foundations/warm-photo.css +299 -0
  122. package/docs/design/reference-corpus.md +1726 -0
  123. package/docs/design/render-critique-loop.md +57 -0
  124. package/docs/spec-graph-schema.md +397 -0
  125. package/package.json +1 -1
  126. package/scripts/bench-scorecard.mjs +239 -0
  127. package/scripts/build-spec-graph.mjs +509 -0
  128. package/scripts/check-native-conflicts.sh +200 -0
  129. package/scripts/classify-lane.sh +0 -7
  130. package/scripts/design-system-lint.mjs +993 -0
  131. package/scripts/graph-query.sh +486 -0
  132. package/scripts/transition-label.sh +10 -2
  133. package/scripts/validate-spec-graph.sh +423 -0
  134. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,364 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Cadence — Email API for developers</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script>
9
+ tailwind.config = {
10
+ theme: {
11
+ extend: {
12
+ fontFamily: {
13
+ mono: ['JetBrains Mono', 'Fira Code', 'Cascadia Code', 'monospace'],
14
+ sans: ['Inter', 'system-ui', 'sans-serif'],
15
+ },
16
+ colors: {
17
+ brand: {
18
+ 50: '#f0fdf4',
19
+ 100: '#dcfce7',
20
+ 400: '#4ade80',
21
+ 500: '#22c55e',
22
+ 600: '#16a34a',
23
+ 700: '#15803d',
24
+ 900: '#14532d',
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+ </script>
31
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
32
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
33
+ <style>
34
+ .code-block { background: #0d1117; }
35
+ .token-keyword { color: #ff7b72; }
36
+ .token-string { color: #a5d6ff; }
37
+ .token-func { color: #d2a8ff; }
38
+ .token-prop { color: #79c0ff; }
39
+ .token-comment { color: #8b949e; }
40
+ .token-number { color: #f2cc60; }
41
+ .token-plain { color: #e6edf3; }
42
+ .gradient-hero {
43
+ background: radial-gradient(ellipse 80% 60% at 50% -10%, rgba(34,197,94,0.15) 0%, transparent 60%),
44
+ #09090b;
45
+ }
46
+ .glow-green {
47
+ box-shadow: 0 0 0 1px rgba(34,197,94,0.3), 0 0 40px rgba(34,197,94,0.08);
48
+ }
49
+ .stat-card {
50
+ background: linear-gradient(135deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0.01) 100%);
51
+ }
52
+ </style>
53
+ </head>
54
+ <body class="bg-zinc-950 text-zinc-100 font-sans antialiased">
55
+
56
+ <!-- Nav -->
57
+ <nav class="border-b border-zinc-800 bg-zinc-950/80 backdrop-blur-sm sticky top-0 z-50">
58
+ <div class="max-w-6xl mx-auto px-6 h-14 flex items-center justify-between">
59
+ <div class="flex items-center gap-8">
60
+ <span class="font-mono font-semibold text-lg tracking-tight text-white">cadence<span class="text-brand-500">.</span></span>
61
+ <div class="hidden md:flex items-center gap-6 text-sm text-zinc-400">
62
+ <a href="#" class="hover:text-zinc-100 transition-colors">Docs</a>
63
+ <a href="#" class="hover:text-zinc-100 transition-colors">API Reference</a>
64
+ <a href="#" class="hover:text-zinc-100 transition-colors">Pricing</a>
65
+ <a href="#" class="hover:text-zinc-100 transition-colors">Blog</a>
66
+ </div>
67
+ </div>
68
+ <div class="flex items-center gap-3">
69
+ <a href="#" class="text-sm text-zinc-400 hover:text-zinc-100 transition-colors">Log in</a>
70
+ <a href="#" class="text-sm bg-brand-500 hover:bg-brand-400 text-black font-semibold px-4 py-1.5 rounded-md transition-colors">Get API key</a>
71
+ </div>
72
+ </div>
73
+ </nav>
74
+
75
+ <!-- Hero -->
76
+ <section class="gradient-hero pt-24 pb-20 px-6">
77
+ <div class="max-w-6xl mx-auto">
78
+ <div class="inline-flex items-center gap-2 bg-zinc-900 border border-zinc-800 rounded-full px-3 py-1 text-xs text-zinc-400 mb-8">
79
+ <span class="w-1.5 h-1.5 rounded-full bg-brand-500 inline-block"></span>
80
+ 99.97% deliverability rate across production senders
81
+ </div>
82
+
83
+ <div class="grid lg:grid-cols-2 gap-16 items-center">
84
+ <div>
85
+ <h1 class="text-5xl font-extrabold tracking-tight leading-tight mb-6">
86
+ Email infrastructure<br />
87
+ that <span class="text-brand-400">actually delivers.</span>
88
+ </h1>
89
+ <p class="text-lg text-zinc-400 leading-relaxed mb-8">
90
+ A REST API and SDKs for sending transactional and marketing email. Cadence handles domain authentication, bounce tracking, and deliverability — so you ship the feature, not the plumbing.
91
+ </p>
92
+ <div class="flex flex-wrap gap-3 mb-10">
93
+ <a href="#" class="bg-brand-500 hover:bg-brand-400 text-black font-semibold px-6 py-3 rounded-lg text-sm transition-colors">Get started free</a>
94
+ <a href="#" class="bg-zinc-800 hover:bg-zinc-700 text-zinc-100 font-medium px-6 py-3 rounded-lg text-sm transition-colors">Read the docs →</a>
95
+ </div>
96
+ <p class="text-xs text-zinc-600">Free tier: 5,000 emails/month. No credit card required.</p>
97
+ </div>
98
+
99
+ <!-- Code panel -->
100
+ <div class="glow-green rounded-xl overflow-hidden border border-zinc-800">
101
+ <div class="code-block px-4 py-3 flex items-center gap-2 border-b border-zinc-800">
102
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
103
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
104
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
105
+ <span class="ml-3 text-xs text-zinc-500 font-mono">send-welcome-email.ts</span>
106
+ </div>
107
+ <pre class="code-block px-5 py-5 text-sm font-mono leading-relaxed overflow-x-auto"><code><span class="token-keyword">import</span> <span class="token-plain">{ Cadence } </span><span class="token-keyword">from</span> <span class="token-string">'@cadence/sdk'</span><span class="token-plain">;</span>
108
+
109
+ <span class="token-keyword">const</span> <span class="token-plain">client = </span><span class="token-keyword">new</span> <span class="token-func">Cadence</span><span class="token-plain">({</span>
110
+ <span class="token-prop">apiKey</span><span class="token-plain">: process.env.</span><span class="token-prop">CADENCE_API_KEY</span><span class="token-plain">,</span>
111
+ <span class="token-plain">});</span>
112
+
113
+ <span class="token-keyword">await</span> <span class="token-plain">client.email.</span><span class="token-func">send</span><span class="token-plain">({</span>
114
+ <span class="token-prop">to</span><span class="token-plain">: </span><span class="token-string">'maya@example.com'</span><span class="token-plain">,</span>
115
+ <span class="token-prop">from</span><span class="token-plain">: </span><span class="token-string">'hello@yourapp.com'</span><span class="token-plain">,</span>
116
+ <span class="token-prop">template</span><span class="token-plain">: </span><span class="token-string">'welcome-v2'</span><span class="token-plain">,</span>
117
+ <span class="token-prop">data</span><span class="token-plain">: {</span>
118
+ <span class="token-prop">name</span><span class="token-plain">: </span><span class="token-string">'Maya'</span><span class="token-plain">,</span>
119
+ <span class="token-prop">plan</span><span class="token-plain">: </span><span class="token-string">'pro'</span><span class="token-plain">,</span>
120
+ <span class="token-prop">loginUrl</span><span class="token-plain">: </span><span class="token-string">'https://app.yourapp.com/login'</span><span class="token-plain">,</span>
121
+ <span class="token-plain">},</span>
122
+ <span class="token-plain">});</span>
123
+
124
+ <span class="token-comment">// { id: 'msg_01HXYZ...', status: 'queued' }</span></code></pre>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </section>
129
+
130
+ <!-- Stats bar -->
131
+ <section class="border-y border-zinc-800 py-10 bg-zinc-900/30">
132
+ <div class="max-w-6xl mx-auto px-6 grid grid-cols-2 md:grid-cols-4 gap-8 text-center">
133
+ <div>
134
+ <div class="text-3xl font-bold text-white mb-1">4.2B+</div>
135
+ <div class="text-sm text-zinc-500">Emails delivered / year</div>
136
+ </div>
137
+ <div>
138
+ <div class="text-3xl font-bold text-white mb-1">99.97%</div>
139
+ <div class="text-sm text-zinc-500">Deliverability rate</div>
140
+ </div>
141
+ <div>
142
+ <div class="text-3xl font-bold text-white mb-1">&lt;120ms</div>
143
+ <div class="text-sm text-zinc-500">Median send latency</div>
144
+ </div>
145
+ <div>
146
+ <div class="text-3xl font-bold text-white mb-1">11 SDKs</div>
147
+ <div class="text-sm text-zinc-500">Node, Python, Go, Ruby…</div>
148
+ </div>
149
+ </div>
150
+ </section>
151
+
152
+ <!-- The hard part is handled -->
153
+ <section class="py-24 px-6">
154
+ <div class="max-w-6xl mx-auto">
155
+ <div class="text-center mb-16">
156
+ <h2 class="text-3xl font-bold mb-4">The invisible work is done for you</h2>
157
+ <p class="text-zinc-400 max-w-xl mx-auto">Deliverability is a full-time job. We've already done it. Every account gets production-grade email infrastructure from day one.</p>
158
+ </div>
159
+ <div class="grid md:grid-cols-3 gap-6">
160
+
161
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
162
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
163
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" /></svg>
164
+ </div>
165
+ <h3 class="font-semibold text-white mb-2">Domain authentication</h3>
166
+ <p class="text-sm text-zinc-400 leading-relaxed">SPF, DKIM, and DMARC configured in minutes with guided DNS setup. We verify and monitor your records continuously.</p>
167
+ </div>
168
+
169
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
170
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
171
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" /></svg>
172
+ </div>
173
+ <h3 class="font-semibold text-white mb-2">Suppression management</h3>
174
+ <p class="text-sm text-zinc-400 leading-relaxed">Bounces, unsubscribes, and spam complaints are captured and suppressed automatically. No manual list hygiene.</p>
175
+ </div>
176
+
177
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
178
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
179
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" /></svg>
180
+ </div>
181
+ <h3 class="font-semibold text-white mb-2">Reputation monitoring</h3>
182
+ <p class="text-sm text-zinc-400 leading-relaxed">Real-time visibility into your sender reputation, bounce rates, and spam complaint rates — with alerts before they become problems.</p>
183
+ </div>
184
+
185
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
186
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
187
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /><path stroke-linecap="round" stroke-linejoin="round" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" /></svg>
188
+ </div>
189
+ <h3 class="font-semibold text-white mb-2">Preview &amp; test mode</h3>
190
+ <p class="text-sm text-zinc-400 leading-relaxed">Send to your test environment without touching production inboxes. See exactly how an email renders before it ships to users.</p>
191
+ </div>
192
+
193
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
194
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
195
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.486M7 17h.01" /></svg>
196
+ </div>
197
+ <h3 class="font-semibold text-white mb-2">React component templates</h3>
198
+ <p class="text-sm text-zinc-400 leading-relaxed">Write emails as React components. Compile to battle-tested HTML. Version control your templates like the rest of your code.</p>
199
+ </div>
200
+
201
+ <div class="stat-card border border-zinc-800 rounded-xl p-6">
202
+ <div class="w-10 h-10 bg-brand-500/10 border border-brand-500/20 rounded-lg flex items-center justify-center mb-4">
203
+ <svg class="w-5 h-5 text-brand-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" /></svg>
204
+ </div>
205
+ <h3 class="font-semibold text-white mb-2">Analytics dashboard</h3>
206
+ <p class="text-sm text-zinc-400 leading-relaxed">Opens, clicks, deliveries, and bounces per campaign and per message. Exportable via webhook or the Events API.</p>
207
+ </div>
208
+
209
+ </div>
210
+ </div>
211
+ </section>
212
+
213
+ <!-- For both engineers and content owners -->
214
+ <section class="py-24 px-6 bg-zinc-900/30 border-y border-zinc-800">
215
+ <div class="max-w-6xl mx-auto">
216
+ <div class="text-center mb-16">
217
+ <h2 class="text-3xl font-bold mb-4">One tool for your whole team</h2>
218
+ <p class="text-zinc-400 max-w-xl mx-auto">Engineers control the plumbing. Everyone else controls the content. No PRs required to update copy.</p>
219
+ </div>
220
+ <div class="grid md:grid-cols-2 gap-8">
221
+
222
+ <div class="bg-zinc-900 border border-zinc-800 rounded-xl p-8">
223
+ <div class="text-xs font-mono text-brand-400 uppercase tracking-widest mb-4">For engineers</div>
224
+ <h3 class="text-xl font-semibold mb-4">An API that fits your stack</h3>
225
+ <ul class="space-y-3 text-sm text-zinc-400">
226
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> REST API + SDKs for Node, Python, Go, Ruby, PHP, Elixir, and more</li>
227
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Idempotency keys — safe to retry without duplicate sends</li>
228
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Webhook delivery for open/click/bounce events</li>
229
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Scheduled sends via API — no cron job needed</li>
230
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> React Email support — templates are code, not config</li>
231
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Staging environment with real send simulation</li>
232
+ </ul>
233
+ </div>
234
+
235
+ <div class="bg-zinc-900 border border-zinc-800 rounded-xl p-8">
236
+ <div class="text-xs font-mono text-brand-400 uppercase tracking-widest mb-4">For content &amp; product</div>
237
+ <h3 class="text-xl font-semibold mb-4">Edit emails without a deploy</h3>
238
+ <ul class="space-y-3 text-sm text-zinc-400">
239
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Visual template editor — update subject, copy, and layout directly</li>
240
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Preview any template with real data before publishing</li>
241
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Schedule campaigns and one-time sends from the dashboard</li>
242
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Per-template analytics: open rate, click rate, unsubscribes</li>
243
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Role-based access — content editors can't touch API credentials</li>
244
+ <li class="flex gap-3"><span class="text-brand-500 mt-0.5">✓</span> Version history — revert any template to a previous state</li>
245
+ </ul>
246
+ </div>
247
+
248
+ </div>
249
+ </div>
250
+ </section>
251
+
252
+ <!-- API snippet section -->
253
+ <section class="py-24 px-6">
254
+ <div class="max-w-6xl mx-auto">
255
+ <div class="grid lg:grid-cols-2 gap-16 items-start">
256
+ <div>
257
+ <h2 class="text-3xl font-bold mb-4">From zero to sending in under five minutes</h2>
258
+ <p class="text-zinc-400 mb-8 leading-relaxed">Install the SDK, set your API key, call <code class="text-brand-400 bg-zinc-800 px-1.5 py-0.5 rounded text-sm font-mono">email.send()</code>. That's the whole integration for most use cases. No SMTP config, no relay setup, no warm-up spreadsheet.</p>
259
+ <div class="space-y-4">
260
+ <div class="flex gap-4 items-start">
261
+ <div class="w-8 h-8 rounded-full bg-brand-500/20 border border-brand-500/30 text-brand-400 text-sm font-mono font-semibold flex items-center justify-center shrink-0 mt-0.5">1</div>
262
+ <div>
263
+ <div class="font-medium text-white mb-1">Install the SDK</div>
264
+ <div class="text-sm text-zinc-400">npm, pip, go get, gem — whichever fits your stack</div>
265
+ </div>
266
+ </div>
267
+ <div class="flex gap-4 items-start">
268
+ <div class="w-8 h-8 rounded-full bg-brand-500/20 border border-brand-500/30 text-brand-400 text-sm font-mono font-semibold flex items-center justify-center shrink-0 mt-0.5">2</div>
269
+ <div>
270
+ <div class="font-medium text-white mb-1">Add your API key</div>
271
+ <div class="text-sm text-zinc-400">One environment variable. No SMTP credentials to juggle.</div>
272
+ </div>
273
+ </div>
274
+ <div class="flex gap-4 items-start">
275
+ <div class="w-8 h-8 rounded-full bg-brand-500/20 border border-brand-500/30 text-brand-400 text-sm font-mono font-semibold flex items-center justify-center shrink-0 mt-0.5">3</div>
276
+ <div>
277
+ <div class="font-medium text-white mb-1">Send your first email</div>
278
+ <div class="text-sm text-zinc-400">Hit the API. Check the dashboard. It's there.</div>
279
+ </div>
280
+ </div>
281
+ <div class="flex gap-4 items-start">
282
+ <div class="w-8 h-8 rounded-full bg-brand-500/20 border border-brand-500/30 text-brand-400 text-sm font-mono font-semibold flex items-center justify-center shrink-0 mt-0.5">4</div>
283
+ <div>
284
+ <div class="font-medium text-white mb-1">Authenticate your domain</div>
285
+ <div class="text-sm text-zinc-400">Follow the DNS guide to unlock full deliverability and custom from addresses.</div>
286
+ </div>
287
+ </div>
288
+ </div>
289
+ </div>
290
+
291
+ <div>
292
+ <div class="glow-green rounded-xl overflow-hidden border border-zinc-800">
293
+ <div class="code-block px-4 py-3 flex items-center gap-2 border-b border-zinc-800">
294
+ <span class="text-xs text-zinc-500 font-mono">Shell</span>
295
+ </div>
296
+ <pre class="code-block px-5 py-4 text-sm font-mono leading-relaxed overflow-x-auto"><code><span class="token-comment"># Install</span>
297
+ <span class="token-plain">npm install @cadence/sdk</span>
298
+
299
+ <span class="token-comment"># Set your key</span>
300
+ <span class="token-plain">export CADENCE_API_KEY=</span><span class="token-string">sk_live_...</span></code></pre>
301
+ </div>
302
+
303
+ <div class="glow-green rounded-xl overflow-hidden border border-zinc-800 mt-4">
304
+ <div class="code-block px-4 py-3 flex items-center gap-2 border-b border-zinc-800">
305
+ <span class="text-xs text-zinc-500 font-mono">Python</span>
306
+ </div>
307
+ <pre class="code-block px-5 py-4 text-sm font-mono leading-relaxed overflow-x-auto"><code><span class="token-keyword">from</span> <span class="token-plain">cadence </span><span class="token-keyword">import</span> <span class="token-plain">Cadence</span>
308
+
309
+ <span class="token-plain">client = </span><span class="token-func">Cadence</span><span class="token-plain">(api_key=</span><span class="token-string">"sk_live_..."</span><span class="token-plain">)</span>
310
+
311
+ <span class="token-plain">client.email.</span><span class="token-func">send</span><span class="token-plain">(</span>
312
+ <span class="token-prop">to</span><span class="token-plain">=</span><span class="token-string">"user@example.com"</span><span class="token-plain">,</span>
313
+ <span class="token-prop">from_</span><span class="token-plain">=</span><span class="token-string">"you@yourapp.com"</span><span class="token-plain">,</span>
314
+ <span class="token-prop">template</span><span class="token-plain">=</span><span class="token-string">"password-reset"</span><span class="token-plain">,</span>
315
+ <span class="token-prop">data</span><span class="token-plain">={</span><span class="token-string">"reset_url"</span><span class="token-plain">: reset_link}</span>
316
+ <span class="token-plain">)</span></code></pre>
317
+ </div>
318
+
319
+ <div class="glow-green rounded-xl overflow-hidden border border-zinc-800 mt-4">
320
+ <div class="code-block px-4 py-3 flex items-center gap-2 border-b border-zinc-800">
321
+ <span class="text-xs text-zinc-500 font-mono">Go</span>
322
+ </div>
323
+ <pre class="code-block px-5 py-4 text-sm font-mono leading-relaxed overflow-x-auto"><code><span class="token-plain">client := cadence.</span><span class="token-func">New</span><span class="token-plain">(</span><span class="token-string">"sk_live_..."</span><span class="token-plain">)</span>
324
+
325
+ <span class="token-plain">_, err := client.Email.</span><span class="token-func">Send</span><span class="token-plain">(ctx, &cadence.SendParams{</span>
326
+ <span class="token-prop">To</span><span class="token-plain">: </span><span class="token-string">"user@example.com"</span><span class="token-plain">,</span>
327
+ <span class="token-prop">From</span><span class="token-plain">: </span><span class="token-string">"you@yourapp.com"</span><span class="token-plain">,</span>
328
+ <span class="token-prop">Template</span><span class="token-plain">: </span><span class="token-string">"order-confirmed"</span><span class="token-plain">,</span>
329
+ <span class="token-plain">})</span></code></pre>
330
+ </div>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ </section>
335
+
336
+ <!-- CTA -->
337
+ <section class="py-24 px-6">
338
+ <div class="max-w-2xl mx-auto text-center">
339
+ <h2 class="text-4xl font-bold mb-4">Start sending in minutes</h2>
340
+ <p class="text-zinc-400 mb-8 text-lg">Free tier includes 5,000 emails per month. No credit card required. Full API access from day one.</p>
341
+ <div class="flex flex-col sm:flex-row gap-4 justify-center">
342
+ <a href="#" class="bg-brand-500 hover:bg-brand-400 text-black font-bold px-8 py-4 rounded-lg text-base transition-colors">Get your API key →</a>
343
+ <a href="#" class="bg-zinc-800 hover:bg-zinc-700 text-zinc-100 font-medium px-8 py-4 rounded-lg text-base transition-colors">Read the quickstart</a>
344
+ </div>
345
+ <p class="text-xs text-zinc-600 mt-6">Used in production by 3,000+ engineering teams</p>
346
+ </div>
347
+ </section>
348
+
349
+ <!-- Footer -->
350
+ <footer class="border-t border-zinc-800 py-10 px-6">
351
+ <div class="max-w-6xl mx-auto flex flex-col md:flex-row items-center justify-between gap-4">
352
+ <span class="font-mono font-semibold text-zinc-400">cadence<span class="text-brand-500">.</span></span>
353
+ <div class="flex gap-6 text-sm text-zinc-600">
354
+ <a href="#" class="hover:text-zinc-400">Privacy</a>
355
+ <a href="#" class="hover:text-zinc-400">Terms</a>
356
+ <a href="#" class="hover:text-zinc-400">Status</a>
357
+ <a href="#" class="hover:text-zinc-400">Security</a>
358
+ <a href="#" class="hover:text-zinc-400">Contact</a>
359
+ </div>
360
+ </div>
361
+ </footer>
362
+
363
+ </body>
364
+ </html>