forgedock 1.0.16 → 1.0.18

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 (190) hide show
  1. package/README.md +54 -3
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +2205 -541
  4. package/bin/github-app-manifest.json.license +2 -0
  5. package/bin/hooks/session-start.mjs +4 -5
  6. package/bin/registry.mjs +20 -0
  7. package/bin/tui.mjs +172 -96
  8. package/commands/adopt.md +433 -0
  9. package/commands/analytics.md +2 -0
  10. package/commands/audit-agents.md +2 -0
  11. package/commands/audit.md +2 -0
  12. package/commands/autopilot.md +77 -0
  13. package/commands/changelog.md +354 -0
  14. package/commands/cleanup.md +2 -0
  15. package/commands/compat-audit.md +330 -0
  16. package/commands/deploy-info.md +6 -5
  17. package/commands/design-bench.md +176 -0
  18. package/commands/design-render-critique-loop.md +103 -0
  19. package/commands/design.md +259 -0
  20. package/commands/diagnose.md +483 -0
  21. package/commands/explain.md +349 -0
  22. package/commands/forge-stats.md +2 -0
  23. package/commands/forgedock-init.md +2 -0
  24. package/commands/geo-audit.md +2 -0
  25. package/commands/incident-response.md +2 -0
  26. package/commands/issue.md +9 -3
  27. package/commands/milestone.md +2 -0
  28. package/commands/optimize.md +411 -0
  29. package/commands/orchestrate.md +239 -0
  30. package/commands/pipeline-health.md +60 -1
  31. package/commands/qa-sweep.md +39 -2
  32. package/commands/quality-gate.md +67 -0
  33. package/commands/replay.md +263 -0
  34. package/commands/resume.md +264 -0
  35. package/commands/review-pr-agents.md +5 -1
  36. package/commands/review-pr-staging.md +160 -2
  37. package/commands/review-pr.md +85 -3
  38. package/commands/rollback.md +2 -0
  39. package/commands/scope.md +280 -0
  40. package/commands/security-audit.md +2 -0
  41. package/commands/status.md +262 -0
  42. package/commands/sync-ecosystem.md +2 -0
  43. package/commands/test-gate.md +929 -0
  44. package/commands/validate.md +2 -0
  45. package/commands/work-on/build/architect.md +128 -18
  46. package/commands/work-on/build/context.md +130 -17
  47. package/commands/work-on/build/implement.md +7 -3
  48. package/commands/work-on/build/validate.md +2 -0
  49. package/commands/work-on/build.md +32 -7
  50. package/commands/work-on/close.md +85 -0
  51. package/commands/work-on/decompose.md +2 -0
  52. package/commands/work-on/investigate.md +30 -3
  53. package/commands/work-on/review.md +13 -1
  54. package/commands/work-on-monolithic.md +2 -0
  55. package/commands/work-on.md +676 -38
  56. package/docs/BRAND.md +51 -0
  57. package/docs/CI.md +177 -0
  58. package/docs/CONFIG.md +94 -0
  59. package/docs/FORGE-PROTOCOL.md +324 -0
  60. package/docs/articles/b-vs-c-baseline.md +210 -0
  61. package/docs/articles/full-abc-benchmark.md +205 -0
  62. package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
  63. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  64. package/docs/claude-breakpoints.json +47 -0
  65. package/docs/design/abc-benchmark.md +195 -0
  66. package/docs/design/design-architect-rationale.md +123 -0
  67. package/docs/design/design-memory.md +61 -0
  68. package/docs/design/design-spec-schema.md +248 -0
  69. package/docs/design/design-system-lint.md +150 -0
  70. package/docs/design/divergent-generation.md +106 -0
  71. package/docs/design/effects-appropriateness.md +133 -0
  72. package/docs/design/fixtures/briefs/README.md +47 -0
  73. package/docs/design/fixtures/briefs/cadence.md +39 -0
  74. package/docs/design/fixtures/briefs/plume.md +39 -0
  75. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  76. package/docs/design/fixtures/briefs/tender.md +39 -0
  77. package/docs/design/fixtures/briefs/voltage.md +39 -0
  78. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  79. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  80. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  81. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  82. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  83. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  84. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  85. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  86. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  87. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  88. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  89. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  90. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  91. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  92. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  93. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  94. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  95. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  96. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  97. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  98. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  99. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  100. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  101. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  102. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  103. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  104. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  105. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  106. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  107. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  108. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  109. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  110. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  111. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  112. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  113. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  114. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  115. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  116. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  117. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  118. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  119. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  120. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  121. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  122. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  123. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  124. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  125. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  126. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  127. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  128. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  129. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  130. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  131. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  132. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  133. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  134. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  135. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  136. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  137. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  138. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  139. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  140. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  141. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  142. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  143. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  144. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  145. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  146. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  147. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  148. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  149. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  150. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  151. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  152. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  153. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  154. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  155. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  156. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  157. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  158. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  159. package/docs/design/foundations/brutalist.css +294 -0
  160. package/docs/design/foundations/editorial.css +300 -0
  161. package/docs/design/foundations/minimal-luxury.css +295 -0
  162. package/docs/design/foundations/technical.css +293 -0
  163. package/docs/design/foundations/warm-photo.css +299 -0
  164. package/docs/design/reference-corpus.md +1726 -0
  165. package/docs/design/render-critique-loop.md +57 -0
  166. package/docs/site/getting-started.md +21 -0
  167. package/docs/spec-graph-schema.md +397 -0
  168. package/package.json +3 -3
  169. package/scripts/bench-scorecard.mjs +239 -0
  170. package/scripts/build-spec-graph.mjs +509 -0
  171. package/scripts/classify-lane.sh +138 -0
  172. package/scripts/design-system-lint.mjs +993 -0
  173. package/scripts/graph-query.sh +486 -0
  174. package/scripts/transition-label.sh +169 -0
  175. package/scripts/validate-pr-target.sh +30 -0
  176. package/scripts/validate-spec-graph.sh +423 -0
  177. package/templates/devdocs/README.md +72 -0
  178. package/templates/devdocs/agent/using-forgedock.md +3 -0
  179. package/templates/devdocs/agent/using-github.md +3 -0
  180. package/templates/devdocs/index.yaml +162 -0
  181. package/templates/devdocs/project/architecture.md +3 -0
  182. package/templates/devdocs/project/conventions.md +3 -0
  183. package/templates/devdocs/project/custom-instructions.md +3 -0
  184. package/templates/devdocs/project/glossary.md +3 -0
  185. package/templates/devdocs/project/stack.md +3 -0
  186. package/templates/devdocs/templates/commit-convention.md +3 -0
  187. package/templates/devdocs/templates/issue.md +3 -0
  188. package/templates/devdocs/templates/pull-request.md +3 -0
  189. package/templates/devdocs/templates/review-finding.md +3 -0
  190. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,506 @@
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</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;500;600;700;800&family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500&display=swap" rel="stylesheet" />
10
+ <style>
11
+ :root {
12
+ --ink: #0a0a0a;
13
+ --paper: #fafaf8;
14
+ --accent: #5b4fff;
15
+ --accent-light: #ede9ff;
16
+ --muted: #71717a;
17
+ --border: #e4e4e7;
18
+ }
19
+ body { font-family: 'IBM Plex Sans', sans-serif; background: var(--paper); color: var(--ink); }
20
+ h1, h2, h3, h4, .syne { font-family: 'Syne', sans-serif; }
21
+ code, pre, .mono { font-family: 'IBM Plex Mono', monospace; }
22
+ .accent { color: var(--accent); }
23
+ .bg-accent { background: var(--accent); }
24
+ .border-accent { border-color: var(--accent); }
25
+
26
+ .hero-grid {
27
+ background-image:
28
+ linear-gradient(rgba(91,79,255,0.04) 1px, transparent 1px),
29
+ linear-gradient(90deg, rgba(91,79,255,0.04) 1px, transparent 1px);
30
+ background-size: 48px 48px;
31
+ }
32
+ .code-dark {
33
+ background: #0d0d0f;
34
+ border: 1px solid #27272a;
35
+ }
36
+ .kw { color: #a78bfa; }
37
+ .str { color: #6ee7b7; }
38
+ .fn { color: #fbbf24; }
39
+ .pr { color: #93c5fd; }
40
+ .cm { color: #52525b; }
41
+ .pl { color: #d4d4d8; }
42
+ .num { color: #f9a8d4; }
43
+
44
+ .tag {
45
+ display: inline-block;
46
+ font-family: 'IBM Plex Mono', monospace;
47
+ font-size: 11px;
48
+ font-weight: 500;
49
+ letter-spacing: 0.04em;
50
+ border: 1.5px solid var(--border);
51
+ border-radius: 4px;
52
+ padding: 2px 8px;
53
+ color: var(--muted);
54
+ }
55
+ .feature-number {
56
+ font-family: 'Syne', sans-serif;
57
+ font-size: 48px;
58
+ font-weight: 800;
59
+ color: transparent;
60
+ -webkit-text-stroke: 2px #e4e4e7;
61
+ line-height: 1;
62
+ }
63
+ .divider-v {
64
+ width: 1px;
65
+ background: var(--border);
66
+ align-self: stretch;
67
+ }
68
+ .check {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 20px; height: 20px;
73
+ background: var(--accent-light);
74
+ border-radius: 50%;
75
+ flex-shrink: 0;
76
+ }
77
+ .check svg { width: 11px; height: 11px; color: var(--accent); }
78
+ .nav-link { color: #52525b; font-size: 14px; transition: color 0.15s; }
79
+ .nav-link:hover { color: var(--ink); }
80
+ .btn-primary {
81
+ background: var(--accent);
82
+ color: white;
83
+ font-weight: 600;
84
+ border-radius: 8px;
85
+ padding: 10px 22px;
86
+ font-size: 14px;
87
+ transition: background 0.15s, transform 0.1s;
88
+ display: inline-block;
89
+ font-family: 'IBM Plex Sans', sans-serif;
90
+ }
91
+ .btn-primary:hover { background: #4a3ee8; transform: translateY(-1px); }
92
+ .btn-outline {
93
+ border: 1.5px solid var(--border);
94
+ color: var(--ink);
95
+ font-weight: 500;
96
+ border-radius: 8px;
97
+ padding: 10px 22px;
98
+ font-size: 14px;
99
+ transition: border-color 0.15s;
100
+ display: inline-block;
101
+ font-family: 'IBM Plex Sans', sans-serif;
102
+ }
103
+ .btn-outline:hover { border-color: #a1a1aa; }
104
+ .marquee {
105
+ overflow: hidden;
106
+ white-space: nowrap;
107
+ }
108
+ .marquee-inner {
109
+ display: inline-block;
110
+ animation: marquee 24s linear infinite;
111
+ }
112
+ @keyframes marquee {
113
+ 0% { transform: translateX(0); }
114
+ 100% { transform: translateX(-50%); }
115
+ }
116
+ .inset-border {
117
+ box-shadow: inset 0 0 0 1px var(--border);
118
+ }
119
+ </style>
120
+ </head>
121
+ <body>
122
+
123
+ <!-- Nav -->
124
+ <header class="border-b border-zinc-200 bg-paper/90 backdrop-blur-sm sticky top-0 z-50" style="background: rgba(250,250,248,0.92)">
125
+ <div class="max-w-6xl mx-auto px-6 h-14 flex items-center justify-between">
126
+ <div class="flex items-center gap-8">
127
+ <div class="syne font-bold text-lg tracking-tight">
128
+ <span style="color: var(--accent)">▸</span> cadence
129
+ </div>
130
+ <nav class="hidden md:flex items-center gap-6">
131
+ <a href="#" class="nav-link">Docs</a>
132
+ <a href="#" class="nav-link">API Reference</a>
133
+ <a href="#" class="nav-link">Templates</a>
134
+ <a href="#" class="nav-link">Pricing</a>
135
+ </nav>
136
+ </div>
137
+ <div class="flex items-center gap-3">
138
+ <a href="#" class="nav-link">Sign in</a>
139
+ <a href="#" class="btn-primary">Get API key</a>
140
+ </div>
141
+ </div>
142
+ </header>
143
+
144
+ <!-- Hero -->
145
+ <section class="hero-grid pt-20 pb-24 px-6 relative overflow-hidden">
146
+ <div class="max-w-6xl mx-auto relative">
147
+ <div class="max-w-3xl">
148
+ <div class="flex flex-wrap gap-2 mb-8">
149
+ <span class="tag">REST API</span>
150
+ <span class="tag">11 SDKs</span>
151
+ <span class="tag">React Email</span>
152
+ <span class="tag">Transactional + Marketing</span>
153
+ </div>
154
+
155
+ <h1 class="syne text-[64px] font-extrabold leading-[1.02] tracking-tight mb-7" style="line-height: 1.04">
156
+ Email that lands,<br />
157
+ <span style="color: var(--accent)">infrastructure you don't babysit.</span>
158
+ </h1>
159
+
160
+ <p class="text-lg text-zinc-500 leading-relaxed mb-10 max-w-xl">
161
+ Cadence is a sending API for engineering teams. Three lines of code gets you into production. Domain auth, suppression lists, and bounce handling are included — not an upsell.
162
+ </p>
163
+
164
+ <div class="flex flex-wrap gap-3 items-center">
165
+ <a href="#" class="btn-primary text-base px-7 py-3.5">Get started free →</a>
166
+ <a href="#" class="btn-outline text-base px-7 py-3.5">Read the docs</a>
167
+ </div>
168
+ <p class="text-sm text-zinc-400 mt-4 mono">5,000 emails/month free — no credit card</p>
169
+ </div>
170
+
171
+ <!-- Floating code card -->
172
+ <div class="mt-14 lg:mt-0 lg:absolute lg:right-0 lg:top-0 lg:w-[480px]">
173
+ <div class="code-dark rounded-xl overflow-hidden">
174
+ <div class="flex items-center justify-between px-4 py-3 border-b border-zinc-800">
175
+ <div class="flex items-center gap-1.5">
176
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
177
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
178
+ <div class="w-3 h-3 rounded-full bg-zinc-700"></div>
179
+ </div>
180
+ <span class="mono text-xs text-zinc-600">notify.ts</span>
181
+ <div class="w-16"></div>
182
+ </div>
183
+ <pre class="px-5 py-5 text-[13px] mono leading-7 overflow-x-auto"><code><span class="kw">import</span> <span class="pl">{ Cadence } </span><span class="kw">from</span> <span class="str">'@cadence/sdk'</span>
184
+
185
+ <span class="kw">const</span> <span class="pl">mail = </span><span class="kw">new</span> <span class="fn">Cadence</span><span class="pl">({</span>
186
+ <span class="pr">apiKey</span><span class="pl">: process.env.</span><span class="pr">CADENCE_KEY</span>
187
+ <span class="pl">})</span>
188
+
189
+ <span class="cm">// Send a transactional email</span>
190
+ <span class="kw">await</span> <span class="pl">mail.email.</span><span class="fn">send</span><span class="pl">({</span>
191
+ <span class="pr">to</span><span class="pl">: </span><span class="str">'user@example.com'</span><span class="pl">,</span>
192
+ <span class="pr">from</span><span class="pl">: </span><span class="str">'app@yourco.com'</span><span class="pl">,</span>
193
+ <span class="pr">template</span><span class="pl">: </span><span class="str">'invite-accepted'</span><span class="pl">,</span>
194
+ <span class="pr">data</span><span class="pl">: { inviterName: </span><span class="str">'Priya'</span> <span class="pl">},</span>
195
+ <span class="pl">})</span>
196
+
197
+ <span class="cm">// Schedule a marketing send</span>
198
+ <span class="kw">await</span> <span class="pl">mail.email.</span><span class="fn">send</span><span class="pl">({</span>
199
+ <span class="pr">to</span><span class="pl">: </span><span class="str">'segment:active-trial'</span><span class="pl">,</span>
200
+ <span class="pr">from</span><span class="pl">: </span><span class="str">'growth@yourco.com'</span><span class="pl">,</span>
201
+ <span class="pr">template</span><span class="pl">: </span><span class="str">'trial-expiry-reminder'</span><span class="pl">,</span>
202
+ <span class="pr">scheduleAt</span><span class="pl">: </span><span class="str">'2026-07-01T09:00:00Z'</span><span class="pl">,</span>
203
+ <span class="pl">})</span></code></pre>
204
+ <div class="border-t border-zinc-800 px-5 py-3 flex items-center gap-2">
205
+ <div class="w-2 h-2 rounded-full bg-green-400"></div>
206
+ <span class="mono text-xs text-zinc-500">msg_01HXQP8… queued — est. delivery &lt;120ms</span>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </section>
212
+
213
+ <!-- Marquee -->
214
+ <div class="border-y border-zinc-200 py-3 marquee bg-white">
215
+ <div class="marquee-inner">
216
+ <span class="text-zinc-400 text-sm mono mx-8">SPF · DKIM · DMARC</span>
217
+ <span class="text-zinc-300 mx-2">◆</span>
218
+ <span class="text-zinc-400 text-sm mono mx-8">Bounce tracking</span>
219
+ <span class="text-zinc-300 mx-2">◆</span>
220
+ <span class="text-zinc-400 text-sm mono mx-8">Suppression lists</span>
221
+ <span class="text-zinc-300 mx-2">◆</span>
222
+ <span class="text-zinc-400 text-sm mono mx-8">React Email templates</span>
223
+ <span class="text-zinc-300 mx-2">◆</span>
224
+ <span class="text-zinc-400 text-sm mono mx-8">Open &amp; click tracking</span>
225
+ <span class="text-zinc-300 mx-2">◆</span>
226
+ <span class="text-zinc-400 text-sm mono mx-8">Webhook events</span>
227
+ <span class="text-zinc-300 mx-2">◆</span>
228
+ <span class="text-zinc-400 text-sm mono mx-8">Test &amp; preview mode</span>
229
+ <span class="text-zinc-300 mx-2">◆</span>
230
+ <span class="text-zinc-400 text-sm mono mx-8">Dedicated IPs</span>
231
+ <span class="text-zinc-300 mx-2">◆</span>
232
+ <span class="text-zinc-400 text-sm mono mx-8">Scheduled sends</span>
233
+ <span class="text-zinc-300 mx-2">◆</span>
234
+ <span class="text-zinc-400 text-sm mono mx-8">99.97% deliverability</span>
235
+ <span class="text-zinc-300 mx-2">◆</span>
236
+ <span class="text-zinc-400 text-sm mono mx-8">SPF · DKIM · DMARC</span>
237
+ <span class="text-zinc-300 mx-2">◆</span>
238
+ <span class="text-zinc-400 text-sm mono mx-8">Bounce tracking</span>
239
+ <span class="text-zinc-300 mx-2">◆</span>
240
+ <span class="text-zinc-400 text-sm mono mx-8">Suppression lists</span>
241
+ <span class="text-zinc-300 mx-2">◆</span>
242
+ <span class="text-zinc-400 text-sm mono mx-8">React Email templates</span>
243
+ <span class="text-zinc-300 mx-2">◆</span>
244
+ <span class="text-zinc-400 text-sm mono mx-8">Open &amp; click tracking</span>
245
+ <span class="text-zinc-300 mx-2">◆</span>
246
+ <span class="text-zinc-400 text-sm mono mx-8">Webhook events</span>
247
+ <span class="text-zinc-300 mx-2">◆</span>
248
+ <span class="text-zinc-400 text-sm mono mx-8">Test &amp; preview mode</span>
249
+ <span class="text-zinc-300 mx-2">◆</span>
250
+ <span class="text-zinc-400 text-sm mono mx-8">Dedicated IPs</span>
251
+ <span class="text-zinc-300 mx-2">◆</span>
252
+ </div>
253
+ </div>
254
+
255
+ <!-- Features grid — numbered editorial style -->
256
+ <section class="py-24 px-6 bg-white">
257
+ <div class="max-w-6xl mx-auto">
258
+ <div class="mb-16">
259
+ <div class="mono text-xs text-zinc-400 uppercase tracking-widest mb-3">// What Cadence does</div>
260
+ <h2 class="syne text-4xl font-extrabold">Everything email. Nothing extraneous.</h2>
261
+ </div>
262
+
263
+ <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-px bg-zinc-200">
264
+
265
+ <div class="bg-white p-8">
266
+ <div class="feature-number mb-3">01</div>
267
+ <h3 class="syne text-xl font-bold mb-3">Simple sending API</h3>
268
+ <p class="text-zinc-500 text-sm leading-relaxed">REST API and SDKs for 11 languages. Call <code class="text-violet-600 bg-violet-50 px-1 rounded text-xs">email.send()</code> with a template name and data object. That's it for the common case.</p>
269
+ </div>
270
+
271
+ <div class="bg-white p-8">
272
+ <div class="feature-number mb-3">02</div>
273
+ <h3 class="syne text-xl font-bold mb-3">Deliverability tooling</h3>
274
+ <p class="text-zinc-500 text-sm leading-relaxed">SPF, DKIM, DMARC with guided DNS setup. Suppression lists maintained automatically. Reputation monitoring with proactive alerts. No deliverability consultant needed.</p>
275
+ </div>
276
+
277
+ <div class="bg-white p-8">
278
+ <div class="feature-number mb-3">03</div>
279
+ <h3 class="syne text-xl font-bold mb-3">React component templates</h3>
280
+ <p class="text-zinc-500 text-sm leading-relaxed">Write email in JSX. Render to battle-tested HTML. Version-control your templates in git. Engineers own the structure; content teams own the words.</p>
281
+ </div>
282
+
283
+ <div class="bg-white p-8">
284
+ <div class="feature-number mb-3">04</div>
285
+ <h3 class="syne text-xl font-bold mb-3">Preview &amp; test mode</h3>
286
+ <p class="text-zinc-500 text-sm leading-relaxed">Render any template with real or mock data in the browser before a single production send. Test mode captures sends without delivering them — perfect for staging environments.</p>
287
+ </div>
288
+
289
+ <div class="bg-white p-8">
290
+ <div class="feature-number mb-3">05</div>
291
+ <h3 class="syne text-xl font-bold mb-3">Analytics per message</h3>
292
+ <p class="text-zinc-500 text-sm leading-relaxed">Opens, clicks, deliveries, bounces, and unsubscribes tracked at the message level and rolled up by template. Exportable via webhook or the Events API.</p>
293
+ </div>
294
+
295
+ <div class="bg-white p-8">
296
+ <div class="feature-number mb-3">06</div>
297
+ <h3 class="syne text-xl font-bold mb-3">Dashboard for non-engineers</h3>
298
+ <p class="text-zinc-500 text-sm leading-relaxed">Content editors update copy, preview results, and schedule campaigns without a deploy. Role-based access means they never touch API credentials.</p>
299
+ </div>
300
+
301
+ </div>
302
+ </div>
303
+ </section>
304
+
305
+ <!-- Deliverability deep-dive -->
306
+ <section class="py-24 px-6" style="background: var(--paper)">
307
+ <div class="max-w-6xl mx-auto">
308
+ <div class="grid lg:grid-cols-[1fr_2fr] gap-16 items-start">
309
+ <div>
310
+ <div class="mono text-xs text-zinc-400 uppercase tracking-widest mb-4">// Deliverability</div>
311
+ <h2 class="syne text-3xl font-extrabold mb-5 leading-snug">The hard, invisible part of email. Handled.</h2>
312
+ <p class="text-zinc-500 leading-relaxed text-sm mb-6">Getting email into the inbox — rather than spam — requires constant, un-glamorous infrastructure work. Most teams discover this the hard way when their welcome email starts hitting promotions folders. Cadence ships with everything required, configured correctly, from the first send.</p>
313
+ <a href="#" class="mono text-sm accent font-medium">Read the deliverability guide →</a>
314
+ </div>
315
+
316
+ <div class="space-y-0 border border-zinc-200 rounded-xl overflow-hidden divide-y divide-zinc-200">
317
+ <div class="p-6 flex gap-5 bg-white hover:bg-zinc-50 transition-colors">
318
+ <div class="check mt-0.5 shrink-0">
319
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg>
320
+ </div>
321
+ <div>
322
+ <div class="font-semibold mb-1">Guided SPF, DKIM, and DMARC setup</div>
323
+ <p class="text-sm text-zinc-500">Step-by-step DNS instructions per domain. We verify records after you add them and monitor continuously — if a record drifts or gets deleted, we alert you within minutes.</p>
324
+ </div>
325
+ </div>
326
+ <div class="p-6 flex gap-5 bg-white hover:bg-zinc-50 transition-colors">
327
+ <div class="check mt-0.5 shrink-0">
328
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg>
329
+ </div>
330
+ <div>
331
+ <div class="font-semibold mb-1">Automatic bounce and complaint handling</div>
332
+ <p class="text-sm text-zinc-500">Hard bounces and spam complaints come back via feedback loop. Cadence suppresses the address immediately and removes it from future sends — no manual intervention required.</p>
333
+ </div>
334
+ </div>
335
+ <div class="p-6 flex gap-5 bg-white hover:bg-zinc-50 transition-colors">
336
+ <div class="check mt-0.5 shrink-0">
337
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg>
338
+ </div>
339
+ <div>
340
+ <div class="font-semibold mb-1">Managed IP warm-up</div>
341
+ <p class="text-sm text-zinc-500">New accounts start on shared sending pools with established reputation. As volume grows, we move senders to dedicated IPs with a managed warm-up schedule.</p>
342
+ </div>
343
+ </div>
344
+ <div class="p-6 flex gap-5 bg-white hover:bg-zinc-50 transition-colors">
345
+ <div class="check mt-0.5 shrink-0">
346
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg>
347
+ </div>
348
+ <div>
349
+ <div class="font-semibold mb-1">Reputation dashboard</div>
350
+ <p class="text-sm text-zinc-500">Real-time view of your sender reputation, complaint rates, and bounce rates. Thresholds alert you before ISPs start filtering your mail.</p>
351
+ </div>
352
+ </div>
353
+ <div class="p-6 flex gap-5 bg-white hover:bg-zinc-50 transition-colors">
354
+ <div class="check mt-0.5 shrink-0">
355
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg>
356
+ </div>
357
+ <div>
358
+ <div class="font-semibold mb-1">Smart throttling and retry logic</div>
359
+ <p class="text-sm text-zinc-500">Cadence detects temporary delivery failures (soft bounces, rate limits from receiving servers) and retries with correct backoff — without requiring you to implement it.</p>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </div>
364
+ </div>
365
+ </section>
366
+
367
+ <!-- SDK snippet strip -->
368
+ <section class="py-20 px-6 bg-white border-t border-zinc-200">
369
+ <div class="max-w-6xl mx-auto">
370
+ <div class="text-center mb-12">
371
+ <div class="mono text-xs text-zinc-400 uppercase tracking-widest mb-3">// One API, eleven SDKs</div>
372
+ <h2 class="syne text-3xl font-extrabold">Works in the language you're already using.</h2>
373
+ </div>
374
+ <div class="grid md:grid-cols-2 gap-4">
375
+ <div class="code-dark rounded-xl overflow-hidden">
376
+ <div class="px-4 py-2.5 border-b border-zinc-800 mono text-xs text-zinc-500">Ruby</div>
377
+ <pre class="px-5 py-4 text-sm mono leading-7"><code><span class="pl">client = </span><span class="fn">Cadence</span><span class="pl">::</span><span class="fn">Client</span><span class="pl">.</span><span class="fn">new</span><span class="pl">(api_key: ENV[</span><span class="str">'CADENCE_KEY'</span><span class="pl">])</span>
378
+
379
+ <span class="pl">client.email.</span><span class="fn">send</span><span class="pl">(</span>
380
+ <span class="pr">to</span><span class="pl">: </span><span class="str">'user@example.com'</span><span class="pl">,</span>
381
+ <span class="pr">from</span><span class="pl">: </span><span class="str">'app@yourco.com'</span><span class="pl">,</span>
382
+ <span class="pr">template</span><span class="pl">: </span><span class="str">'subscription-renewed'</span><span class="pl">,</span>
383
+ <span class="pr">data</span><span class="pl">: { plan: </span><span class="str">'pro'</span><span class="pl">, amount: </span><span class="num">49</span> <span class="pl">}</span>
384
+ <span class="pl">)</span></code></pre>
385
+ </div>
386
+ <div class="code-dark rounded-xl overflow-hidden">
387
+ <div class="px-4 py-2.5 border-b border-zinc-800 mono text-xs text-zinc-500">Python</div>
388
+ <pre class="px-5 py-4 text-sm mono leading-7"><code><span class="kw">from</span> <span class="pl">cadence </span><span class="kw">import</span> <span class="pl">Cadence</span>
389
+
390
+ <span class="pl">client = </span><span class="fn">Cadence</span><span class="pl">(api_key=os.environ[</span><span class="str">"CADENCE_KEY"</span><span class="pl">])</span>
391
+
392
+ <span class="pl">client.email.</span><span class="fn">send</span><span class="pl">(</span>
393
+ <span class="pr">to</span><span class="pl">=</span><span class="str">"user@example.com"</span><span class="pl">,</span>
394
+ <span class="pr">from_</span><span class="pl">=</span><span class="str">"app@yourco.com"</span><span class="pl">,</span>
395
+ <span class="pr">template</span><span class="pl">=</span><span class="str">"invoice-ready"</span><span class="pl">,</span>
396
+ <span class="pr">data</span><span class="pl">={</span><span class="str">"invoice_url"</span><span class="pl">: invoice_link},</span>
397
+ <span class="pl">)</span></code></pre>
398
+ </div>
399
+ <div class="code-dark rounded-xl overflow-hidden">
400
+ <div class="px-4 py-2.5 border-b border-zinc-800 mono text-xs text-zinc-500">Go</div>
401
+ <pre class="px-5 py-4 text-sm mono leading-7"><code><span class="pl">c := cadence.</span><span class="fn">New</span><span class="pl">(os.</span><span class="fn">Getenv</span><span class="pl">(</span><span class="str">"CADENCE_KEY"</span><span class="pl">))</span>
402
+
403
+ <span class="pl">_, err := c.Email.</span><span class="fn">Send</span><span class="pl">(ctx, cadence.SendParams{</span>
404
+ <span class="pr">To</span><span class="pl">: </span><span class="str">"user@example.com"</span><span class="pl">,</span>
405
+ <span class="pr">From</span><span class="pl">: </span><span class="str">"app@yourco.com"</span><span class="pl">,</span>
406
+ <span class="pr">Template</span><span class="pl">: </span><span class="str">"plan-downgraded"</span><span class="pl">,</span>
407
+ <span class="pr">Data</span><span class="pl">: map[</span><span class="kw">string</span><span class="pl">]</span><span class="kw">any</span><span class="pl">{</span><span class="str">"plan"</span><span class="pl">: </span><span class="str">"free"</span><span class="pl">},</span>
408
+ <span class="pl">})</span></code></pre>
409
+ </div>
410
+ <div class="code-dark rounded-xl overflow-hidden">
411
+ <div class="px-4 py-2.5 border-b border-zinc-800 mono text-xs text-zinc-500">cURL</div>
412
+ <pre class="px-5 py-4 text-sm mono leading-7"><code><span class="pl">curl -X POST https://api.cadencemail.com/v1/email/send \</span>
413
+ <span class="pl">-H </span><span class="str">"Authorization: Bearer $CADENCE_KEY"</span><span class="pl"> \</span>
414
+ <span class="pl">-H </span><span class="str">"Content-Type: application/json"</span><span class="pl"> \</span>
415
+ <span class="pl">-d </span><span class="str">'{</span>
416
+ <span class="str"> "to": "user@example.com",</span>
417
+ <span class="str"> "from": "app@yourco.com",</span>
418
+ <span class="str"> "template": "password-reset",</span>
419
+ <span class="str"> "data": { "reset_url": "https://..." }</span>
420
+ <span class="str"> }'</span></code></pre>
421
+ </div>
422
+ </div>
423
+ <div class="text-center mt-6">
424
+ <a href="#" class="mono text-sm accent font-medium">See all 11 SDKs in the docs →</a>
425
+ </div>
426
+ </div>
427
+ </section>
428
+
429
+ <!-- Who it's for -->
430
+ <section class="py-24 px-6 border-t border-zinc-200" style="background: var(--paper)">
431
+ <div class="max-w-6xl mx-auto">
432
+ <div class="mono text-xs text-zinc-400 uppercase tracking-widest mb-4">// Who uses Cadence</div>
433
+ <h2 class="syne text-3xl font-extrabold mb-12">Two teams. One platform.</h2>
434
+ <div class="grid md:grid-cols-2 gap-8">
435
+
436
+ <div class="border border-zinc-200 rounded-xl p-8 bg-white">
437
+ <div class="inline-flex items-center gap-2 mb-5">
438
+ <div class="w-8 h-8 rounded bg-zinc-900 flex items-center justify-center">
439
+ <svg class="w-4 h-4 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" /></svg>
440
+ </div>
441
+ <span class="syne font-bold text-lg">Engineers</span>
442
+ </div>
443
+ <p class="text-zinc-500 text-sm mb-6 leading-relaxed">You integrate Cadence once and it stays out of your way. The API behaves like you'd expect: correct HTTP status codes, typed SDKs, idempotency keys, structured error objects.</p>
444
+ <div class="space-y-2 text-sm">
445
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">SDKs in Node, Python, Go, Ruby, PHP, Elixir, Java, .NET</span></div>
446
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Idempotency keys — safe to retry on network error</span></div>
447
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Webhook delivery for all events</span></div>
448
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">React Email support — templates are components</span></div>
449
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Test mode — sends intercepted, not delivered</span></div>
450
+ </div>
451
+ </div>
452
+
453
+ <div class="border border-zinc-200 rounded-xl p-8 bg-white">
454
+ <div class="inline-flex items-center gap-2 mb-5">
455
+ <div class="w-8 h-8 rounded flex items-center justify-center" style="background: var(--accent-light)">
456
+ <svg class="w-4 h-4" style="color: var(--accent)" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" /></svg>
457
+ </div>
458
+ <span class="syne font-bold text-lg">Content &amp; Product</span>
459
+ </div>
460
+ <p class="text-zinc-500 text-sm mb-6 leading-relaxed">You can write, update, and schedule emails directly in the Cadence dashboard. No pull request. No waiting for a deploy. Your changes go live when you publish them.</p>
461
+ <div class="space-y-2 text-sm">
462
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Visual template editor with live preview</span></div>
463
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Preview any template with real subscriber data</span></div>
464
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Schedule campaigns — no cron, no engineer needed</span></div>
465
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Per-template analytics: opens, clicks, unsubscribes</span></div>
466
+ <div class="flex items-center gap-2.5"><div class="check"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="2 6 5 9 10 3" /></svg></div><span class="text-zinc-700">Version history — revert to any previous version</span></div>
467
+ </div>
468
+ </div>
469
+
470
+ </div>
471
+ </div>
472
+ </section>
473
+
474
+ <!-- CTA -->
475
+ <section class="py-24 px-6 border-t border-zinc-200" style="background: var(--accent)">
476
+ <div class="max-w-4xl mx-auto text-center text-white">
477
+ <div class="mono text-sm opacity-60 mb-4">// Get started</div>
478
+ <h2 class="syne text-5xl font-extrabold mb-5 tracking-tight">Email that lands.<br />Infrastructure you won't touch.</h2>
479
+ <p class="text-violet-200 text-lg mb-10 max-w-xl mx-auto leading-relaxed">Free plan: 5,000 emails/month. Full API access. No credit card. You can be sending in production before lunch.</p>
480
+ <div class="flex flex-col sm:flex-row gap-4 justify-center">
481
+ <a href="#" class="inline-block bg-white text-violet-700 font-bold px-8 py-4 rounded-xl text-base hover:bg-violet-50 transition-colors">Get your API key →</a>
482
+ <a href="#" class="inline-block bg-violet-700/50 text-white font-medium px-8 py-4 rounded-xl text-base hover:bg-violet-700 transition-colors border border-violet-400/30">Read the docs</a>
483
+ </div>
484
+ <p class="mt-6 text-violet-300 text-sm mono">Trusted by 3,000+ engineering teams · 4.2B emails/year · 99.97% deliverability</p>
485
+ </div>
486
+ </section>
487
+
488
+ <!-- Footer -->
489
+ <footer class="bg-zinc-950 text-zinc-500 py-10 px-6">
490
+ <div class="max-w-6xl mx-auto flex flex-col md:flex-row items-center justify-between gap-4">
491
+ <div class="syne font-bold text-zinc-300 text-base">
492
+ <span class="text-violet-400">▸</span> cadence
493
+ </div>
494
+ <div class="flex gap-6 text-sm">
495
+ <a href="#" class="hover:text-zinc-300 transition-colors">Docs</a>
496
+ <a href="#" class="hover:text-zinc-300 transition-colors">API Reference</a>
497
+ <a href="#" class="hover:text-zinc-300 transition-colors">Status</a>
498
+ <a href="#" class="hover:text-zinc-300 transition-colors">Security</a>
499
+ <a href="#" class="hover:text-zinc-300 transition-colors">Privacy</a>
500
+ <a href="#" class="hover:text-zinc-300 transition-colors">Terms</a>
501
+ </div>
502
+ </div>
503
+ </footer>
504
+
505
+ </body>
506
+ </html>