forgedock 1.0.17 → 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.
- package/README.md +34 -1
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +229 -17
- package/commands/autopilot.md +77 -0
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/issue.md +7 -3
- package/commands/orchestrate.md +121 -0
- package/commands/qa-sweep.md +37 -2
- package/commands/quality-gate.md +30 -0
- package/commands/review-pr-staging.md +158 -2
- package/commands/test-gate.md +929 -0
- package/commands/work-on/build/implement.md +5 -3
- package/commands/work-on.md +53 -3
- package/docs/CI.md +177 -0
- package/docs/FORGE-PROTOCOL.md +324 -0
- package/docs/articles/b-vs-c-baseline.md +210 -0
- package/docs/articles/full-abc-benchmark.md +205 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/design/abc-benchmark.md +195 -0
- package/docs/design/design-architect-rationale.md +123 -0
- package/docs/design/design-memory.md +61 -0
- package/docs/design/design-spec-schema.md +248 -0
- package/docs/design/design-system-lint.md +150 -0
- package/docs/design/divergent-generation.md +106 -0
- package/docs/design/effects-appropriateness.md +133 -0
- package/docs/design/fixtures/briefs/README.md +47 -0
- package/docs/design/fixtures/briefs/cadence.md +39 -0
- package/docs/design/fixtures/briefs/plume.md +39 -0
- package/docs/design/fixtures/briefs/slipstream.md +39 -0
- package/docs/design/fixtures/briefs/tender.md +39 -0
- package/docs/design/fixtures/briefs/voltage.md +39 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
- package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
- package/docs/design/foundations/brutalist.css +294 -0
- package/docs/design/foundations/editorial.css +300 -0
- package/docs/design/foundations/minimal-luxury.css +295 -0
- package/docs/design/foundations/technical.css +293 -0
- package/docs/design/foundations/warm-photo.css +299 -0
- package/docs/design/reference-corpus.md +1726 -0
- package/docs/design/render-critique-loop.md +57 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +1 -1
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/classify-lane.sh +0 -7
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +10 -2
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,305 @@
|
|
|
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
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
body { font-family: 'Inter', -apple-system, sans-serif; color: #1a1a2e; background: #fff; line-height: 1.6; }
|
|
11
|
+
.container { max-width: 1200px; margin: 0 auto; padding: 0 40px; }
|
|
12
|
+
|
|
13
|
+
/* Nav */
|
|
14
|
+
nav { padding: 20px 0; border-bottom: 1px solid #eee; }
|
|
15
|
+
nav .container { display: flex; align-items: center; justify-content: space-between; }
|
|
16
|
+
.logo { font-size: 22px; font-weight: 700; color: #1a1a2e; letter-spacing: -0.5px; }
|
|
17
|
+
.logo span { color: #6366f1; }
|
|
18
|
+
.nav-links { display: flex; gap: 32px; align-items: center; }
|
|
19
|
+
.nav-links a { text-decoration: none; color: #555; font-size: 14px; font-weight: 500; }
|
|
20
|
+
.nav-links a:hover { color: #1a1a2e; }
|
|
21
|
+
.btn-nav { background: #6366f1; color: #fff !important; padding: 8px 20px; border-radius: 6px; font-size: 14px; }
|
|
22
|
+
.btn-nav:hover { background: #4f46e5; }
|
|
23
|
+
|
|
24
|
+
/* Hero */
|
|
25
|
+
.hero { padding: 100px 0 80px; }
|
|
26
|
+
.hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
|
|
27
|
+
.hero h1 { font-size: 48px; font-weight: 700; line-height: 1.15; letter-spacing: -1.5px; margin-bottom: 20px; }
|
|
28
|
+
.hero h1 span { color: #6366f1; }
|
|
29
|
+
.hero p { font-size: 18px; color: #555; line-height: 1.7; margin-bottom: 32px; max-width: 480px; }
|
|
30
|
+
.btn-primary { display: inline-block; background: #6366f1; color: #fff; padding: 14px 32px; border-radius: 8px; font-size: 16px; font-weight: 600; text-decoration: none; border: none; cursor: pointer; }
|
|
31
|
+
.btn-primary:hover { background: #4f46e5; }
|
|
32
|
+
.btn-secondary { display: inline-block; color: #6366f1; padding: 14px 32px; font-size: 16px; font-weight: 600; text-decoration: none; margin-left: 8px; }
|
|
33
|
+
.btn-secondary:hover { color: #4f46e5; }
|
|
34
|
+
|
|
35
|
+
/* Code block */
|
|
36
|
+
.code-panel { background: #0f0f1a; border-radius: 12px; padding: 0; overflow: hidden; box-shadow: 0 25px 60px rgba(0,0,0,0.15); }
|
|
37
|
+
.code-tabs { display: flex; background: #1a1a2e; padding: 0; }
|
|
38
|
+
.code-tab { padding: 10px 20px; font-size: 13px; font-family: 'Inter', sans-serif; color: #888; cursor: pointer; border-bottom: 2px solid transparent; }
|
|
39
|
+
.code-tab.active { color: #c4b5fd; border-bottom-color: #6366f1; }
|
|
40
|
+
.code-content { padding: 24px; font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.8; color: #e2e8f0; overflow-x: auto; }
|
|
41
|
+
.code-content .kw { color: #c084fc; }
|
|
42
|
+
.code-content .str { color: #86efac; }
|
|
43
|
+
.code-content .fn { color: #93c5fd; }
|
|
44
|
+
.code-content .cm { color: #64748b; }
|
|
45
|
+
.code-content .num { color: #fbbf24; }
|
|
46
|
+
|
|
47
|
+
/* Trust bar */
|
|
48
|
+
.trust-bar { padding: 40px 0; border-top: 1px solid #f0f0f0; border-bottom: 1px solid #f0f0f0; background: #fafafa; }
|
|
49
|
+
.trust-bar .container { display: flex; align-items: center; justify-content: center; gap: 48px; flex-wrap: wrap; }
|
|
50
|
+
.trust-stat { text-align: center; }
|
|
51
|
+
.trust-stat .num { font-size: 28px; font-weight: 700; color: #1a1a2e; }
|
|
52
|
+
.trust-stat .label { font-size: 13px; color: #888; margin-top: 2px; }
|
|
53
|
+
|
|
54
|
+
/* Features */
|
|
55
|
+
.features { padding: 100px 0; }
|
|
56
|
+
.section-label { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.5px; color: #6366f1; margin-bottom: 12px; }
|
|
57
|
+
.section-title { font-size: 36px; font-weight: 700; letter-spacing: -1px; margin-bottom: 16px; }
|
|
58
|
+
.section-sub { font-size: 17px; color: #666; max-width: 560px; margin-bottom: 60px; }
|
|
59
|
+
.feature-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }
|
|
60
|
+
.feature-card { padding: 32px; border: 1px solid #eee; border-radius: 12px; transition: box-shadow 0.2s; }
|
|
61
|
+
.feature-card:hover { box-shadow: 0 8px 30px rgba(0,0,0,0.06); }
|
|
62
|
+
.feature-icon { width: 44px; height: 44px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 20px; margin-bottom: 20px; }
|
|
63
|
+
.feature-card h3 { font-size: 18px; font-weight: 600; margin-bottom: 10px; }
|
|
64
|
+
.feature-card p { font-size: 14px; color: #666; line-height: 1.7; }
|
|
65
|
+
.icon-api { background: #ede9fe; color: #6366f1; }
|
|
66
|
+
.icon-deliver { background: #dcfce7; color: #16a34a; }
|
|
67
|
+
.icon-template { background: #fef3c7; color: #d97706; }
|
|
68
|
+
.icon-analytics { background: #dbeafe; color: #2563eb; }
|
|
69
|
+
.icon-test { background: #fce7f3; color: #db2777; }
|
|
70
|
+
.icon-team { background: #f0fdfa; color: #0d9488; }
|
|
71
|
+
|
|
72
|
+
/* Deliverability section */
|
|
73
|
+
.deliverability { padding: 100px 0; background: #f8f7ff; }
|
|
74
|
+
.deliv-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
|
|
75
|
+
.deliv-list { list-style: none; }
|
|
76
|
+
.deliv-list li { padding: 16px 0; border-bottom: 1px solid #e5e3f0; display: flex; gap: 16px; align-items: flex-start; }
|
|
77
|
+
.deliv-list li:last-child { border-bottom: none; }
|
|
78
|
+
.check { width: 24px; height: 24px; border-radius: 50%; background: #6366f1; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; margin-top: 2px; }
|
|
79
|
+
.deliv-list strong { display: block; font-size: 15px; margin-bottom: 2px; }
|
|
80
|
+
.deliv-list span { font-size: 14px; color: #666; }
|
|
81
|
+
|
|
82
|
+
/* Workflow section */
|
|
83
|
+
.workflow { padding: 100px 0; }
|
|
84
|
+
.workflow-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; margin-top: 60px; }
|
|
85
|
+
.workflow-side h3 { font-size: 22px; font-weight: 600; margin-bottom: 12px; }
|
|
86
|
+
.workflow-side p { font-size: 15px; color: #666; line-height: 1.7; margin-bottom: 24px; }
|
|
87
|
+
.workflow-tag { display: inline-block; background: #ede9fe; color: #6366f1; font-size: 12px; font-weight: 600; padding: 4px 12px; border-radius: 20px; margin-bottom: 16px; }
|
|
88
|
+
.mini-code { background: #0f0f1a; border-radius: 8px; padding: 20px; font-family: 'JetBrains Mono', monospace; font-size: 12px; line-height: 1.8; color: #e2e8f0; overflow-x: auto; }
|
|
89
|
+
|
|
90
|
+
/* CTA */
|
|
91
|
+
.cta-section { padding: 100px 0; text-align: center; background: linear-gradient(135deg, #1a1a2e 0%, #2d2b55 100%); color: #fff; }
|
|
92
|
+
.cta-section h2 { font-size: 40px; font-weight: 700; letter-spacing: -1px; margin-bottom: 16px; }
|
|
93
|
+
.cta-section p { font-size: 17px; color: #a5a3c9; margin-bottom: 36px; max-width: 500px; margin-left: auto; margin-right: auto; }
|
|
94
|
+
.btn-white { display: inline-block; background: #fff; color: #1a1a2e; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: 600; text-decoration: none; }
|
|
95
|
+
.btn-white:hover { background: #f0f0f0; }
|
|
96
|
+
.cta-note { font-size: 13px; color: #8886af; margin-top: 16px; }
|
|
97
|
+
|
|
98
|
+
/* Footer */
|
|
99
|
+
footer { padding: 40px 0; border-top: 1px solid #eee; }
|
|
100
|
+
footer .container { display: flex; justify-content: space-between; align-items: center; }
|
|
101
|
+
footer p { font-size: 13px; color: #999; }
|
|
102
|
+
footer .footer-links { display: flex; gap: 24px; }
|
|
103
|
+
footer .footer-links a { font-size: 13px; color: #999; text-decoration: none; }
|
|
104
|
+
</style>
|
|
105
|
+
</head>
|
|
106
|
+
<body>
|
|
107
|
+
|
|
108
|
+
<nav>
|
|
109
|
+
<div class="container">
|
|
110
|
+
<div class="logo">cadence<span>.</span></div>
|
|
111
|
+
<div class="nav-links">
|
|
112
|
+
<a href="#">Docs</a>
|
|
113
|
+
<a href="#">Pricing</a>
|
|
114
|
+
<a href="#">Templates</a>
|
|
115
|
+
<a href="#">Status</a>
|
|
116
|
+
<a href="#" class="btn-nav">Get API Key</a>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</nav>
|
|
120
|
+
|
|
121
|
+
<section class="hero">
|
|
122
|
+
<div class="container">
|
|
123
|
+
<div class="hero-grid">
|
|
124
|
+
<div>
|
|
125
|
+
<h1>Send email from your app.<br><span>In five lines of code.</span></h1>
|
|
126
|
+
<p>Cadence is a developer-first email API. Send transactional and marketing email with a simple REST call, and let your content team manage templates without deploying code.</p>
|
|
127
|
+
<a href="#" class="btn-primary">Get your API key</a>
|
|
128
|
+
<a href="#" class="btn-secondary">Read the docs →</a>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="code-panel">
|
|
131
|
+
<div class="code-tabs">
|
|
132
|
+
<div class="code-tab active">Node.js</div>
|
|
133
|
+
<div class="code-tab">Python</div>
|
|
134
|
+
<div class="code-tab">cURL</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="code-content">
|
|
137
|
+
<span class="kw">import</span> { Cadence } <span class="kw">from</span> <span class="str">'@cadence/sdk'</span>;<br><br>
|
|
138
|
+
<span class="kw">const</span> cadence = <span class="kw">new</span> <span class="fn">Cadence</span>(<span class="str">'cd_live_9k3m...'</span>);<br><br>
|
|
139
|
+
<span class="kw">await</span> cadence.<span class="fn">send</span>({<br>
|
|
140
|
+
from: <span class="str">'hello@yourapp.com'</span>,<br>
|
|
141
|
+
to: <span class="str">'user@example.com'</span>,<br>
|
|
142
|
+
template: <span class="str">'welcome-email'</span>,<br>
|
|
143
|
+
data: { name: <span class="str">'Jamie'</span>, plan: <span class="str">'Pro'</span> }<br>
|
|
144
|
+
});<br><br>
|
|
145
|
+
<span class="cm">// Returns: { id: "msg_8f2x...", status: "sent" }</span>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
|
|
152
|
+
<section class="trust-bar">
|
|
153
|
+
<div class="container">
|
|
154
|
+
<div class="trust-stat">
|
|
155
|
+
<div class="num">2.1B+</div>
|
|
156
|
+
<div class="label">Emails delivered monthly</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="trust-stat">
|
|
159
|
+
<div class="num">99.98%</div>
|
|
160
|
+
<div class="label">API uptime (90-day)</div>
|
|
161
|
+
</div>
|
|
162
|
+
<div class="trust-stat">
|
|
163
|
+
<div class="num"><300ms</div>
|
|
164
|
+
<div class="label">Median API latency</div>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="trust-stat">
|
|
167
|
+
<div class="num">12,000+</div>
|
|
168
|
+
<div class="label">Teams shipping email</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</section>
|
|
172
|
+
|
|
173
|
+
<section class="features">
|
|
174
|
+
<div class="container">
|
|
175
|
+
<div class="section-label">Platform</div>
|
|
176
|
+
<h2 class="section-title">Everything you need to send email well</h2>
|
|
177
|
+
<p class="section-sub">A single API that handles sending, deliverability, templates, and analytics. No third-party SMTP relays to configure.</p>
|
|
178
|
+
<div class="feature-grid">
|
|
179
|
+
<div class="feature-card">
|
|
180
|
+
<div class="feature-icon icon-api">{}</div>
|
|
181
|
+
<h3>REST API & SDKs</h3>
|
|
182
|
+
<p>First-class SDKs for Node.js, Python, Ruby, Go, and PHP. Send email with a single function call. Webhook support for delivery events.</p>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="feature-card">
|
|
185
|
+
<div class="feature-icon icon-deliver">✓</div>
|
|
186
|
+
<h3>Deliverability built in</h3>
|
|
187
|
+
<p>Automated SPF, DKIM, and DMARC setup. Dedicated IPs with warm-up. Suppression lists managed for you. Your email lands in the inbox.</p>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="feature-card">
|
|
190
|
+
<div class="feature-icon icon-template">✎</div>
|
|
191
|
+
<h3>Template engine</h3>
|
|
192
|
+
<p>Author emails as React components or use the visual editor. Non-engineers can edit copy and preview without touching code or deploying.</p>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="feature-card">
|
|
195
|
+
<div class="feature-icon icon-analytics">●</div>
|
|
196
|
+
<h3>Real-time analytics</h3>
|
|
197
|
+
<p>Track opens, clicks, deliveries, bounces, and complaints per message or in aggregate. Export to your data warehouse via S3 or webhook.</p>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="feature-card">
|
|
200
|
+
<div class="feature-icon icon-test">⚙</div>
|
|
201
|
+
<h3>Test & preview mode</h3>
|
|
202
|
+
<p>Send to a sandbox that captures every email without delivering. Preview rendered HTML with real template data before going live.</p>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="feature-card">
|
|
205
|
+
<div class="feature-icon icon-team">☆</div>
|
|
206
|
+
<h3>Team roles</h3>
|
|
207
|
+
<p>Engineers get API keys and logs. Content owners get the template editor and scheduling UI. Everyone works from the same dashboard.</p>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
</section>
|
|
212
|
+
|
|
213
|
+
<section class="deliverability">
|
|
214
|
+
<div class="container">
|
|
215
|
+
<div class="deliv-grid">
|
|
216
|
+
<div>
|
|
217
|
+
<div class="section-label">Deliverability</div>
|
|
218
|
+
<h2 class="section-title">The hard part of email,<br>handled for you</h2>
|
|
219
|
+
<p class="section-sub">Getting email to the inbox is an infrastructure problem. Cadence solves it so you can focus on what the email says.</p>
|
|
220
|
+
</div>
|
|
221
|
+
<ul class="deliv-list">
|
|
222
|
+
<li>
|
|
223
|
+
<div class="check">✓</div>
|
|
224
|
+
<div><strong>Domain authentication</strong><span>One-click SPF, DKIM, and DMARC records. We verify configuration on every send.</span></div>
|
|
225
|
+
</li>
|
|
226
|
+
<li>
|
|
227
|
+
<div class="check">✓</div>
|
|
228
|
+
<div><strong>Bounce & complaint tracking</strong><span>Hard bounces and spam complaints are automatically suppressed. View them in the dashboard or via API.</span></div>
|
|
229
|
+
</li>
|
|
230
|
+
<li>
|
|
231
|
+
<div class="check">✓</div>
|
|
232
|
+
<div><strong>Dedicated IP pools</strong><span>Isolate transactional and marketing traffic. Automated warm-up schedules for new IPs.</span></div>
|
|
233
|
+
</li>
|
|
234
|
+
<li>
|
|
235
|
+
<div class="check">✓</div>
|
|
236
|
+
<div><strong>Suppression management</strong><span>Global and per-account suppression lists. Unsubscribe handling that complies with CAN-SPAM, GDPR, and CASL.</span></div>
|
|
237
|
+
</li>
|
|
238
|
+
</ul>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</section>
|
|
242
|
+
|
|
243
|
+
<section class="workflow">
|
|
244
|
+
<div class="container">
|
|
245
|
+
<div class="section-label">Workflow</div>
|
|
246
|
+
<h2 class="section-title">Built for the whole team, not just the backend</h2>
|
|
247
|
+
<p class="section-sub">Engineers integrate the API. Content owners write the emails. Both work from the same system.</p>
|
|
248
|
+
<div class="workflow-grid">
|
|
249
|
+
<div class="workflow-side">
|
|
250
|
+
<div class="workflow-tag">For engineers</div>
|
|
251
|
+
<h3>Integrate in minutes</h3>
|
|
252
|
+
<p>Install the SDK, set your API key, and call <code>cadence.send()</code>. Templates are referenced by slug, so you never hardcode HTML in application code.</p>
|
|
253
|
+
<div class="mini-code">
|
|
254
|
+
<span style="color:#c084fc;">npm install</span> @cadence/sdk<br><br>
|
|
255
|
+
<span style="color:#64748b;"># Send a test email</span><br>
|
|
256
|
+
<span style="color:#c084fc;">npx</span> cadence send \<br>
|
|
257
|
+
--to test@example.com \<br>
|
|
258
|
+
--template welcome-email \<br>
|
|
259
|
+
--data '{"name": "Test"}'
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="workflow-side">
|
|
263
|
+
<div class="workflow-tag">For content teams</div>
|
|
264
|
+
<h3>Edit without deploying</h3>
|
|
265
|
+
<p>Open the template editor, change the subject line or body copy, and preview with real data. Schedule sends or trigger them from the dashboard. No pull request required.</p>
|
|
266
|
+
<div style="background: #f8f7ff; border: 1px solid #e5e3f0; border-radius: 8px; padding: 24px;">
|
|
267
|
+
<div style="display:flex; gap:12px; margin-bottom:16px;">
|
|
268
|
+
<div style="background:#6366f1; color:#fff; padding:6px 14px; border-radius:6px; font-size:13px; font-weight:500;">Visual editor</div>
|
|
269
|
+
<div style="background:#fff; border:1px solid #ddd; padding:6px 14px; border-radius:6px; font-size:13px; color:#666;">HTML</div>
|
|
270
|
+
</div>
|
|
271
|
+
<div style="background:#fff; border:1px solid #eee; border-radius:6px; padding:16px; font-size:14px; color:#333;">
|
|
272
|
+
<div style="font-weight:600; margin-bottom:8px;">Subject: Welcome to {{plan}}, {{name}}!</div>
|
|
273
|
+
<div style="color:#888; font-size:13px;">Body: Your account is ready. Here's what to do next...</div>
|
|
274
|
+
</div>
|
|
275
|
+
<div style="margin-top:12px; font-size:12px; color:#888;">Last edited by Sarah K. · 2 hours ago</div>
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</section>
|
|
281
|
+
|
|
282
|
+
<section class="cta-section">
|
|
283
|
+
<div class="container">
|
|
284
|
+
<h2>Start sending in under five minutes</h2>
|
|
285
|
+
<p>Create a free account, get your API key, and send your first email. No credit card. 10,000 emails/month free.</p>
|
|
286
|
+
<a href="#" class="btn-white">Get your API key</a>
|
|
287
|
+
<div class="cta-note">Free tier includes full API access, template editor, and analytics.</div>
|
|
288
|
+
</div>
|
|
289
|
+
</section>
|
|
290
|
+
|
|
291
|
+
<footer>
|
|
292
|
+
<div class="container">
|
|
293
|
+
<p>© 2026 Cadence, Inc.</p>
|
|
294
|
+
<div class="footer-links">
|
|
295
|
+
<a href="#">Documentation</a>
|
|
296
|
+
<a href="#">API Reference</a>
|
|
297
|
+
<a href="#">Status</a>
|
|
298
|
+
<a href="#">Privacy</a>
|
|
299
|
+
<a href="#">Terms</a>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
</footer>
|
|
303
|
+
|
|
304
|
+
</body>
|
|
305
|
+
</html>
|
|
@@ -0,0 +1,327 @@
|
|
|
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 — The email API that just works</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
10
|
+
body { font-family: 'DM Sans', sans-serif; color: #111; background: #fff; }
|
|
11
|
+
|
|
12
|
+
/* Utility */
|
|
13
|
+
.container { max-width: 1200px; margin: 0 auto; padding: 0 48px; }
|
|
14
|
+
|
|
15
|
+
/* Navigation — minimal top bar */
|
|
16
|
+
header { position: fixed; top: 0; left: 0; right: 0; background: rgba(255,255,255,0.92); backdrop-filter: blur(12px); z-index: 100; border-bottom: 1px solid rgba(0,0,0,0.06); }
|
|
17
|
+
header .container { display: flex; align-items: center; justify-content: space-between; height: 64px; }
|
|
18
|
+
.wordmark { font-size: 20px; font-weight: 700; color: #111; }
|
|
19
|
+
.header-right { display: flex; align-items: center; gap: 28px; }
|
|
20
|
+
.header-right a { font-size: 14px; color: #555; text-decoration: none; font-weight: 500; }
|
|
21
|
+
.header-right a:hover { color: #111; }
|
|
22
|
+
.btn-cta { background: #0a0a0a; color: #fff; padding: 9px 22px; border-radius: 8px; font-weight: 600; font-size: 14px; text-decoration: none; display: inline-block; }
|
|
23
|
+
.btn-cta:hover { background: #333; }
|
|
24
|
+
|
|
25
|
+
/* Hero — full-width dark section with centered code */
|
|
26
|
+
.hero { padding: 160px 0 100px; background: linear-gradient(180deg, #fafafa 0%, #fff 100%); text-align: center; }
|
|
27
|
+
.hero .badge { display: inline-block; background: #e7f5e8; color: #1a7f2b; font-size: 13px; font-weight: 600; padding: 5px 14px; border-radius: 20px; margin-bottom: 24px; }
|
|
28
|
+
.hero h1 { font-size: 56px; font-weight: 700; line-height: 1.1; letter-spacing: -2px; max-width: 720px; margin: 0 auto 20px; }
|
|
29
|
+
.hero .subtitle { font-size: 19px; color: #666; max-width: 540px; margin: 0 auto 40px; line-height: 1.6; }
|
|
30
|
+
.hero-actions { display: flex; gap: 16px; justify-content: center; margin-bottom: 60px; }
|
|
31
|
+
.btn-hero { background: #0a0a0a; color: #fff; padding: 14px 36px; border-radius: 10px; font-weight: 600; font-size: 16px; text-decoration: none; }
|
|
32
|
+
.btn-hero:hover { background: #222; }
|
|
33
|
+
.btn-ghost { background: transparent; border: 1.5px solid #ddd; color: #333; padding: 14px 36px; border-radius: 10px; font-weight: 600; font-size: 16px; text-decoration: none; }
|
|
34
|
+
.btn-ghost:hover { border-color: #999; }
|
|
35
|
+
|
|
36
|
+
/* Three code examples side by side */
|
|
37
|
+
.code-trio { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; max-width: 1100px; margin: 0 auto; }
|
|
38
|
+
.code-block { background: #111; border-radius: 12px; overflow: hidden; text-align: left; }
|
|
39
|
+
.code-block-header { padding: 10px 16px; background: #1a1a1a; display: flex; align-items: center; gap: 8px; }
|
|
40
|
+
.code-dot { width: 8px; height: 8px; border-radius: 50%; }
|
|
41
|
+
.code-dot.r { background: #ff5f57; }
|
|
42
|
+
.code-dot.y { background: #ffbd2e; }
|
|
43
|
+
.code-dot.g { background: #28c840; }
|
|
44
|
+
.code-lang { margin-left: auto; font-size: 11px; color: #666; font-family: 'Fira Code', monospace; }
|
|
45
|
+
.code-block pre { padding: 20px; font-family: 'Fira Code', monospace; font-size: 12.5px; line-height: 1.7; color: #ccc; overflow-x: auto; margin: 0; }
|
|
46
|
+
.code-block pre .k { color: #ff79c6; }
|
|
47
|
+
.code-block pre .s { color: #50fa7b; }
|
|
48
|
+
.code-block pre .f { color: #8be9fd; }
|
|
49
|
+
.code-block pre .c { color: #6272a4; }
|
|
50
|
+
.code-block pre .v { color: #f8f8f2; }
|
|
51
|
+
|
|
52
|
+
/* How it works — vertical timeline */
|
|
53
|
+
.how-section { padding: 120px 0; }
|
|
54
|
+
.how-section .section-head { text-align: center; margin-bottom: 72px; }
|
|
55
|
+
.how-section .section-head h2 { font-size: 40px; font-weight: 700; letter-spacing: -1.5px; margin-bottom: 12px; }
|
|
56
|
+
.how-section .section-head p { font-size: 17px; color: #777; }
|
|
57
|
+
.timeline { position: relative; max-width: 680px; margin: 0 auto; }
|
|
58
|
+
.timeline::before { content: ''; position: absolute; left: 24px; top: 0; bottom: 0; width: 2px; background: #eee; }
|
|
59
|
+
.timeline-step { position: relative; padding-left: 72px; margin-bottom: 56px; }
|
|
60
|
+
.timeline-step:last-child { margin-bottom: 0; }
|
|
61
|
+
.timeline-num { position: absolute; left: 0; top: 0; width: 50px; height: 50px; border-radius: 50%; background: #0a0a0a; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 18px; font-weight: 700; z-index: 1; }
|
|
62
|
+
.timeline-step h3 { font-size: 20px; font-weight: 600; margin-bottom: 8px; }
|
|
63
|
+
.timeline-step p { font-size: 15px; color: #666; line-height: 1.7; }
|
|
64
|
+
.timeline-step code { background: #f4f4f5; padding: 2px 8px; border-radius: 4px; font-family: 'Fira Code', monospace; font-size: 13px; }
|
|
65
|
+
|
|
66
|
+
/* Two-column features */
|
|
67
|
+
.features-section { padding: 100px 0; background: #fafafa; }
|
|
68
|
+
.features-section .section-head { text-align: center; margin-bottom: 64px; }
|
|
69
|
+
.features-section .section-head h2 { font-size: 40px; font-weight: 700; letter-spacing: -1.5px; margin-bottom: 12px; }
|
|
70
|
+
.features-section .section-head p { font-size: 17px; color: #777; }
|
|
71
|
+
.feat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
|
|
72
|
+
.feat-card { background: #fff; border: 1px solid #eee; border-radius: 14px; padding: 36px; }
|
|
73
|
+
.feat-card .feat-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 12px; }
|
|
74
|
+
.feat-card h3 { font-size: 22px; font-weight: 600; margin-bottom: 10px; }
|
|
75
|
+
.feat-card p { font-size: 15px; color: #666; line-height: 1.7; }
|
|
76
|
+
.label-api { color: #6366f1; }
|
|
77
|
+
.label-deliver { color: #16a34a; }
|
|
78
|
+
.label-template { color: #ea580c; }
|
|
79
|
+
.label-analytics { color: #0284c7; }
|
|
80
|
+
.label-test { color: #9333ea; }
|
|
81
|
+
.label-collab { color: #dc2626; }
|
|
82
|
+
|
|
83
|
+
/* Deliverability spotlight */
|
|
84
|
+
.deliver-section { padding: 100px 0; }
|
|
85
|
+
.deliver-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: center; }
|
|
86
|
+
.deliver-visual { background: #111; border-radius: 16px; padding: 40px; color: #fff; }
|
|
87
|
+
.deliver-visual h4 { font-size: 14px; font-weight: 600; color: #888; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 24px; }
|
|
88
|
+
.metric-row { display: flex; justify-content: space-between; align-items: center; padding: 14px 0; border-bottom: 1px solid #222; }
|
|
89
|
+
.metric-row:last-child { border-bottom: none; }
|
|
90
|
+
.metric-name { font-size: 15px; color: #ccc; }
|
|
91
|
+
.metric-value { font-size: 15px; font-weight: 700; font-family: 'Fira Code', monospace; }
|
|
92
|
+
.metric-value.green { color: #50fa7b; }
|
|
93
|
+
.metric-value.yellow { color: #f1fa8c; }
|
|
94
|
+
.deliver-text h2 { font-size: 36px; font-weight: 700; letter-spacing: -1px; margin-bottom: 16px; }
|
|
95
|
+
.deliver-text p { font-size: 16px; color: #666; line-height: 1.7; margin-bottom: 20px; }
|
|
96
|
+
.deliver-text ul { list-style: none; }
|
|
97
|
+
.deliver-text ul li { font-size: 15px; color: #444; padding: 8px 0; padding-left: 24px; position: relative; }
|
|
98
|
+
.deliver-text ul li::before { content: '\2713'; position: absolute; left: 0; color: #16a34a; font-weight: 700; }
|
|
99
|
+
|
|
100
|
+
/* CTA */
|
|
101
|
+
.final-cta { padding: 120px 0; background: #0a0a0a; color: #fff; text-align: center; }
|
|
102
|
+
.final-cta h2 { font-size: 44px; font-weight: 700; letter-spacing: -1.5px; margin-bottom: 16px; }
|
|
103
|
+
.final-cta p { font-size: 17px; color: #888; max-width: 480px; margin: 0 auto 40px; line-height: 1.6; }
|
|
104
|
+
.btn-cta-big { background: #fff; color: #0a0a0a; padding: 16px 40px; border-radius: 10px; font-weight: 700; font-size: 17px; text-decoration: none; display: inline-block; }
|
|
105
|
+
.btn-cta-big:hover { background: #f0f0f0; }
|
|
106
|
+
.cta-sub { margin-top: 16px; font-size: 13px; color: #666; }
|
|
107
|
+
|
|
108
|
+
/* Footer */
|
|
109
|
+
footer { padding: 32px 0; background: #0a0a0a; border-top: 1px solid #1a1a1a; }
|
|
110
|
+
footer .container { display: flex; justify-content: space-between; }
|
|
111
|
+
footer span, footer a { font-size: 13px; color: #555; text-decoration: none; }
|
|
112
|
+
footer .links { display: flex; gap: 20px; }
|
|
113
|
+
</style>
|
|
114
|
+
</head>
|
|
115
|
+
<body>
|
|
116
|
+
|
|
117
|
+
<header>
|
|
118
|
+
<div class="container">
|
|
119
|
+
<div class="wordmark">Cadence</div>
|
|
120
|
+
<div class="header-right">
|
|
121
|
+
<a href="#">Documentation</a>
|
|
122
|
+
<a href="#">Pricing</a>
|
|
123
|
+
<a href="#">Changelog</a>
|
|
124
|
+
<a href="#">Login</a>
|
|
125
|
+
<a href="#" class="btn-cta">Get API Key</a>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</header>
|
|
129
|
+
|
|
130
|
+
<section class="hero">
|
|
131
|
+
<div class="container">
|
|
132
|
+
<div class="badge">Now generally available</div>
|
|
133
|
+
<h1>Email infrastructure for teams that ship</h1>
|
|
134
|
+
<p class="subtitle">One API to send transactional and marketing email. One dashboard for your content team to manage templates. Zero time configuring SMTP.</p>
|
|
135
|
+
<div class="hero-actions">
|
|
136
|
+
<a href="#" class="btn-hero">Get started free</a>
|
|
137
|
+
<a href="#" class="btn-ghost">View documentation</a>
|
|
138
|
+
</div>
|
|
139
|
+
<div class="code-trio">
|
|
140
|
+
<div class="code-block">
|
|
141
|
+
<div class="code-block-header">
|
|
142
|
+
<div class="code-dot r"></div><div class="code-dot y"></div><div class="code-dot g"></div>
|
|
143
|
+
<span class="code-lang">node.js</span>
|
|
144
|
+
</div>
|
|
145
|
+
<pre><span class="k">import</span> { <span class="f">Cadence</span> } <span class="k">from</span> <span class="s">'cadence'</span>
|
|
146
|
+
|
|
147
|
+
<span class="k">const</span> <span class="v">mail</span> = <span class="k">new</span> <span class="f">Cadence</span>(<span class="s">'cd_live_...'</span>)
|
|
148
|
+
|
|
149
|
+
<span class="k">await</span> mail.<span class="f">send</span>({
|
|
150
|
+
<span class="v">to</span>: <span class="s">'user@co.com'</span>,
|
|
151
|
+
<span class="v">template</span>: <span class="s">'invoice'</span>,
|
|
152
|
+
<span class="v">data</span>: { <span class="v">amount</span>: <span class="s">'$49.00'</span> }
|
|
153
|
+
})</pre>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="code-block">
|
|
156
|
+
<div class="code-block-header">
|
|
157
|
+
<div class="code-dot r"></div><div class="code-dot y"></div><div class="code-dot g"></div>
|
|
158
|
+
<span class="code-lang">python</span>
|
|
159
|
+
</div>
|
|
160
|
+
<pre><span class="k">from</span> cadence <span class="k">import</span> <span class="f">Cadence</span>
|
|
161
|
+
|
|
162
|
+
<span class="v">mail</span> = <span class="f">Cadence</span>(<span class="s">"cd_live_..."</span>)
|
|
163
|
+
|
|
164
|
+
mail.<span class="f">send</span>(
|
|
165
|
+
<span class="v">to</span>=<span class="s">"user@co.com"</span>,
|
|
166
|
+
<span class="v">template</span>=<span class="s">"invoice"</span>,
|
|
167
|
+
<span class="v">data</span>={<span class="s">"amount"</span>: <span class="s">"$49.00"</span>}
|
|
168
|
+
)</pre>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="code-block">
|
|
171
|
+
<div class="code-block-header">
|
|
172
|
+
<div class="code-dot r"></div><div class="code-dot y"></div><div class="code-dot g"></div>
|
|
173
|
+
<span class="code-lang">curl</span>
|
|
174
|
+
</div>
|
|
175
|
+
<pre><span class="f">curl</span> <span class="s">https://api.cadence.dev/v1/send</span> \
|
|
176
|
+
-H <span class="s">"Authorization: Bearer cd_..."</span> \
|
|
177
|
+
-d <span class="s">'{
|
|
178
|
+
"to": "user@co.com",
|
|
179
|
+
"template": "invoice",
|
|
180
|
+
"data": {"amount":"$49"}
|
|
181
|
+
}'</span></pre>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</section>
|
|
186
|
+
|
|
187
|
+
<section class="how-section">
|
|
188
|
+
<div class="container">
|
|
189
|
+
<div class="section-head">
|
|
190
|
+
<h2>From zero to inbox in four steps</h2>
|
|
191
|
+
<p>No SMTP config. No IP warm-up guesswork. No deploy-to-change-copy cycles.</p>
|
|
192
|
+
</div>
|
|
193
|
+
<div class="timeline">
|
|
194
|
+
<div class="timeline-step">
|
|
195
|
+
<div class="timeline-num">1</div>
|
|
196
|
+
<h3>Create your account & get an API key</h3>
|
|
197
|
+
<p>Sign up, verify your sending domain, and copy your <code>cd_live_</code> key. Domain verification takes about 2 minutes if you have DNS access.</p>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="timeline-step">
|
|
200
|
+
<div class="timeline-num">2</div>
|
|
201
|
+
<h3>Install the SDK</h3>
|
|
202
|
+
<p><code>npm install cadence</code> or <code>pip install cadence</code>. SDKs also available for Ruby, Go, PHP, and Java. Or call the REST API directly.</p>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="timeline-step">
|
|
205
|
+
<div class="timeline-num">3</div>
|
|
206
|
+
<h3>Create a template or send raw HTML</h3>
|
|
207
|
+
<p>Use the template editor to design your email, or pass raw HTML in the API call. Templates accept variables like <code>{{name}}</code> and support conditional blocks.</p>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="timeline-step">
|
|
210
|
+
<div class="timeline-num">4</div>
|
|
211
|
+
<h3>Call <code>cadence.send()</code></h3>
|
|
212
|
+
<p>Pass the recipient, template slug, and data. Cadence handles rendering, delivery, bounce processing, and analytics. You get a message ID back instantly.</p>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
</section>
|
|
217
|
+
|
|
218
|
+
<section class="features-section">
|
|
219
|
+
<div class="container">
|
|
220
|
+
<div class="section-head">
|
|
221
|
+
<h2>What you get</h2>
|
|
222
|
+
<p>A complete email platform behind a clean API surface.</p>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="feat-grid">
|
|
225
|
+
<div class="feat-card">
|
|
226
|
+
<div class="feat-label label-api">API</div>
|
|
227
|
+
<h3>RESTful sending API</h3>
|
|
228
|
+
<p>Single endpoint to send email. Supports batch sends (up to 1,000 recipients per call), scheduled delivery, and idempotency keys for safe retries.</p>
|
|
229
|
+
</div>
|
|
230
|
+
<div class="feat-card">
|
|
231
|
+
<div class="feat-label label-deliver">Deliverability</div>
|
|
232
|
+
<h3>Inbox, not spam folder</h3>
|
|
233
|
+
<p>Automated domain authentication (SPF, DKIM, DMARC). Dedicated IP pools. ISP feedback loops. Bounce and complaint auto-suppression. We monitor sender reputation so you don't have to.</p>
|
|
234
|
+
</div>
|
|
235
|
+
<div class="feat-card">
|
|
236
|
+
<div class="feat-label label-template">Templates</div>
|
|
237
|
+
<h3>React-style email components</h3>
|
|
238
|
+
<p>Build emails from composable components: headers, footers, product cards, CTAs. Or use the drag-and-drop editor. Either way, non-engineers can edit content without a deploy.</p>
|
|
239
|
+
</div>
|
|
240
|
+
<div class="feat-card">
|
|
241
|
+
<div class="feat-label label-analytics">Analytics</div>
|
|
242
|
+
<h3>Know what happens after send</h3>
|
|
243
|
+
<p>Per-message and aggregate stats for deliveries, opens, clicks, bounces, and unsubscribes. Real-time webhooks for every event. Export to S3, BigQuery, or Snowflake.</p>
|
|
244
|
+
</div>
|
|
245
|
+
<div class="feat-card">
|
|
246
|
+
<div class="feat-label label-test">Testing</div>
|
|
247
|
+
<h3>Preview before you ship</h3>
|
|
248
|
+
<p>Test mode captures every email in a virtual inbox. Preview rendered templates with live data. Integration tests can assert on email content without sending real mail.</p>
|
|
249
|
+
</div>
|
|
250
|
+
<div class="feat-card">
|
|
251
|
+
<div class="feat-label label-collab">Collaboration</div>
|
|
252
|
+
<h3>Engineers + content owners</h3>
|
|
253
|
+
<p>Role-based access: developers manage API keys, domains, and webhooks. Content owners manage templates, schedules, and campaigns. Shared analytics dashboard for both.</p>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
</section>
|
|
258
|
+
|
|
259
|
+
<section class="deliver-section">
|
|
260
|
+
<div class="container">
|
|
261
|
+
<div class="deliver-grid">
|
|
262
|
+
<div class="deliver-visual">
|
|
263
|
+
<h4>Domain health — yourapp.com</h4>
|
|
264
|
+
<div class="metric-row">
|
|
265
|
+
<span class="metric-name">SPF</span>
|
|
266
|
+
<span class="metric-value green">PASS</span>
|
|
267
|
+
</div>
|
|
268
|
+
<div class="metric-row">
|
|
269
|
+
<span class="metric-name">DKIM</span>
|
|
270
|
+
<span class="metric-value green">PASS</span>
|
|
271
|
+
</div>
|
|
272
|
+
<div class="metric-row">
|
|
273
|
+
<span class="metric-name">DMARC</span>
|
|
274
|
+
<span class="metric-value green">PASS</span>
|
|
275
|
+
</div>
|
|
276
|
+
<div class="metric-row">
|
|
277
|
+
<span class="metric-name">Bounce rate (30d)</span>
|
|
278
|
+
<span class="metric-value green">0.3%</span>
|
|
279
|
+
</div>
|
|
280
|
+
<div class="metric-row">
|
|
281
|
+
<span class="metric-name">Complaint rate (30d)</span>
|
|
282
|
+
<span class="metric-value green">0.01%</span>
|
|
283
|
+
</div>
|
|
284
|
+
<div class="metric-row">
|
|
285
|
+
<span class="metric-name">Reputation</span>
|
|
286
|
+
<span class="metric-value green">Excellent</span>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
<div class="deliver-text">
|
|
290
|
+
<h2>Deliverability is not a feature. It's the whole point.</h2>
|
|
291
|
+
<p>An email that lands in spam is worse than no email at all. Cadence runs the infrastructure to keep you out of the spam folder, and gives you the dashboard to prove it.</p>
|
|
292
|
+
<ul>
|
|
293
|
+
<li>Automated DNS record generation for SPF, DKIM, DMARC</li>
|
|
294
|
+
<li>Dedicated sending IPs with managed warm-up</li>
|
|
295
|
+
<li>Real-time bounce and complaint processing</li>
|
|
296
|
+
<li>ISP postmaster integration (Google, Microsoft, Yahoo)</li>
|
|
297
|
+
<li>Blocklist monitoring with automatic alerts</li>
|
|
298
|
+
</ul>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
</section>
|
|
303
|
+
|
|
304
|
+
<section class="final-cta">
|
|
305
|
+
<div class="container">
|
|
306
|
+
<h2>Your first email in 5 minutes</h2>
|
|
307
|
+
<p>Sign up, verify your domain, and send. Free plan includes 10,000 emails per month, full API access, and the template editor.</p>
|
|
308
|
+
<a href="#" class="btn-cta-big">Create free account</a>
|
|
309
|
+
<div class="cta-sub">No credit card required. Upgrade when you're ready.</div>
|
|
310
|
+
</div>
|
|
311
|
+
</section>
|
|
312
|
+
|
|
313
|
+
<footer>
|
|
314
|
+
<div class="container">
|
|
315
|
+
<span>© 2026 Cadence</span>
|
|
316
|
+
<div class="links">
|
|
317
|
+
<a href="#">Docs</a>
|
|
318
|
+
<a href="#">API Reference</a>
|
|
319
|
+
<a href="#">Status</a>
|
|
320
|
+
<a href="#">Security</a>
|
|
321
|
+
<a href="#">Privacy</a>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
</footer>
|
|
325
|
+
|
|
326
|
+
</body>
|
|
327
|
+
</html>
|