dkimkit 0.6.1 → 0.7.0

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.
@@ -1,5 +1,7 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { renderMarkdown } from './markdown.js';
3
+ export const FEEDBACK_KINDS = { feature: 'Feature request', feedback: 'Feedback', problem: 'Something isn’t working' };
4
+ export const MAX_FEEDBACK_LENGTH = 5000;
3
5
  const DEFAULT_APP_NAME = 'DKIMkit';
4
6
  const DEFAULT_EFFECTIVE_DATE = '2026-10-25';
5
7
  const DOCS_DIR = new URL('../../../docs/', import.meta.url);
@@ -8,23 +10,27 @@ const DOCS = [
8
10
  { slug: 'getting-started', file: 'getting-started.md', label: 'Getting started' },
9
11
  { slug: 'hosted-api', file: 'hosted-api.md', label: 'API reference' },
10
12
  { slug: 'widget', file: 'widget.md', label: 'Embeddable widget' },
13
+ { slug: 'library', file: 'library.md', label: 'Node.js library and CLI' },
11
14
  { slug: 'billing', file: 'billing.md', label: 'Plans and billing', needsBilling: true },
12
15
  ];
13
16
  const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
14
17
  export class Site {
15
18
  ctx;
16
19
  appName;
20
+ /** Payments are live (not just a free plan). */
21
+ billing;
17
22
  docs = new Map();
18
23
  constructor(ctx) {
19
24
  this.ctx = ctx;
20
25
  this.appName = ctx.appName || DEFAULT_APP_NAME;
26
+ this.billing = Boolean(ctx.plan && !ctx.plan.comingSoon);
21
27
  const price = ctx.plan ? this.money(ctx.plan.unitAmount) : '';
22
28
  for (const doc of DOCS) {
23
- if ('needsBilling' in doc && doc.needsBilling && !ctx.plan)
29
+ if ('needsBilling' in doc && doc.needsBilling && !this.billing)
24
30
  continue;
25
31
  const source = readFileSync(new URL(doc.file, DOCS_DIR), 'utf8')
26
32
  // {{#billing}}…{{/billing}}: text that only applies when billing (and so the free plan) is on.
27
- .replace(/\{\{#billing\}\}([\s\S]*?)\{\{\/billing\}\}/g, (_, inner) => (ctx.plan ? inner : ''))
33
+ .replace(/\{\{#billing\}\}([\s\S]*?)\{\{\/billing\}\}/g, (_, inner) => (this.billing ? inner : ''))
28
34
  .replaceAll('{{APP_NAME}}', this.appName)
29
35
  .replaceAll('{{PUBLIC_URL}}', ctx.publicUrl)
30
36
  .replaceAll('{{FREE_DOMAINS}}', String(ctx.plan?.freeDomains ?? ''))
@@ -54,12 +60,20 @@ export class Site {
54
60
  return this.page('About', this.about(), 'about');
55
61
  case '/contact':
56
62
  return this.page('Contact', this.contact(), 'contact');
63
+ case '/feedback':
64
+ return this.feedbackPage();
57
65
  case '/terms':
58
66
  return this.page('Terms of Service', this.terms(), 'legal');
59
67
  case '/privacy':
60
68
  return this.page('Privacy Policy', this.privacy(), 'legal');
61
69
  case '/refunds':
62
70
  return this.page('Refund Policy', this.refunds(), 'legal');
71
+ case '/site.js':
72
+ return {
73
+ status: 200,
74
+ headers: { 'content-type': 'text/javascript; charset=utf-8', 'cache-control': 'public, max-age=300', 'x-content-type-options': 'nosniff' },
75
+ body: SITE_JS,
76
+ };
63
77
  case '/docs':
64
78
  case '/docs/':
65
79
  return { status: 302, headers: { location: '/docs/getting-started' }, body: '' };
@@ -69,6 +83,15 @@ export class Site {
69
83
  return this.page(this.docs.get(doc[1]).title, this.docPage(doc[1]), 'docs');
70
84
  return null;
71
85
  }
86
+ /** The feedback page, blank or with what was submitted. Its form posts back to /feedback. */
87
+ feedbackPage(form) {
88
+ const page = this.page('Feedback', this.feedback(form), 'feedback', { formAction: true });
89
+ if (form)
90
+ page.headers['cache-control'] = 'no-store';
91
+ if (form?.error)
92
+ page.status = 400;
93
+ return page;
94
+ }
72
95
  // ---- helpers ----
73
96
  money(cents) {
74
97
  const currency = (this.ctx.plan?.currency ?? 'usd').toUpperCase();
@@ -78,7 +101,7 @@ export class Site {
78
101
  // Only links to published docs survive; others (e.g. self-hosting.md) render as plain text.
79
102
  const [target, hash] = href.split('#');
80
103
  const doc = DOCS.find((d) => d.file === target || `/docs/${d.slug}` === target);
81
- if (!doc || ('needsBilling' in doc && doc.needsBilling && !this.ctx.plan))
104
+ if (!doc || ('needsBilling' in doc && doc.needsBilling && !this.billing))
82
105
  return null;
83
106
  return `/docs/${doc.slug}${hash ? `#${hash}` : ''}`;
84
107
  }
@@ -102,7 +125,7 @@ export class Site {
102
125
  return this.ctx.signupEnabled ? `<a class="btn primary" href="/dashboard">${primary}</a>` : '';
103
126
  }
104
127
  // ---- layout ----
105
- page(title, main, section) {
128
+ page(title, main, section, opts = {}) {
106
129
  const app = esc(this.appName);
107
130
  const nav = (href, label, key) => `<a href="${href}"${section === key ? ' aria-current="page"' : ''}>${label}</a>`;
108
131
  const year = new Date().getUTCFullYear();
@@ -115,10 +138,12 @@ export class Site {
115
138
  <meta name="description" content="${app} authenticates your customers' sending domains with SendGrid, Postmark, Mailgun or Amazon SES: DNS records written or shown, verification tracked, webhooks when ready.">
116
139
  <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%233b5bdb'/%3E%3Cpath d='M8 11h16v11H8z M8 12l8 6 8-6' fill='none' stroke='white' stroke-width='2.2' stroke-linejoin='round'/%3E%3C/svg%3E">
117
140
  <style>${CSS}</style>
141
+ <script src="/site.js" defer></script>
118
142
  </head>
119
143
  <body>
120
144
  <header class="site">
121
145
  <div class="wrap bar">
146
+ <div class="hist" hidden>${HISTORY_BUTTONS}</div>
122
147
  <a class="brand" href="/"><span class="mark" aria-hidden="true">${LOGO}</span>${app}</a>
123
148
  <nav aria-label="Main">
124
149
  ${nav('/docs/getting-started', 'Docs', 'docs')}
@@ -137,6 +162,7 @@ export class Site {
137
162
  ${this.ctx.plan ? '<a href="/pricing">Pricing</a>' : ''}
138
163
  <a href="/about">About</a>
139
164
  <a href="/contact">Contact</a>
165
+ <a href="/feedback">Feedback</a>
140
166
  <a href="/terms">Terms</a>
141
167
  <a href="/privacy">Privacy</a>
142
168
  ${this.ctx.plan ? '<a href="/refunds">Refunds</a>' : ''}
@@ -152,7 +178,7 @@ export class Site {
152
178
  'cache-control': 'public, max-age=300',
153
179
  'x-content-type-options': 'nosniff',
154
180
  'referrer-policy': 'strict-origin-when-cross-origin',
155
- 'content-security-policy': "default-src 'none'; script-src 'none'; style-src 'unsafe-inline'; img-src 'self' data:; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",
181
+ 'content-security-policy': `default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src 'self' data:; base-uri 'none'; form-action ${opts.formAction ? "'self'" : "'none'"}; frame-ancestors 'none'`,
156
182
  },
157
183
  body,
158
184
  };
@@ -166,7 +192,7 @@ export class Site {
166
192
  ['Embeddable widget', 'Drop a setup flow into your app with two lines of code. Customers’ DNS credentials never touch your servers or your frontend.'],
167
193
  ['Signed webhooks', 'Get domain.verified, domain.conflict and more as they happen, signed and retried, so your app updates itself.'],
168
194
  ['Inbound email too', 'Optionally route replies to your app: the MX record and inbound forwarding are configured in the same flow (SendGrid, Postmark and Mailgun).'],
169
- ['Built for multi-tenant SaaS', 'Tag domains with your own tenant ids and see usage per customer for your own billing.'],
195
+ ['Bulk setup, no code', 'Paste up to 100 domains from any registrar into the dashboard. Each gets sender authentication, and inbound email if you want it, with records grouped by DNS host and a zone file to import.'],
170
196
  ];
171
197
  return `
172
198
  <section class="hero wrap">
@@ -192,7 +218,7 @@ export class Site {
192
218
  <section class="wrap split">
193
219
  <div>
194
220
  <h2>One call to start</h2>
195
- <p>Register a customer’s domain and get the DNS records back immediately. Everything after that happens in the background.</p>
221
+ <p>Register a customer’s domain and get the DNS records back immediately. Everything after that happens in the background. Tag domains with your own tenant ids and see usage per customer for your own billing.</p>
196
222
  <a href="/docs/hosted-api">API reference →</a>
197
223
  </div>
198
224
  <pre><code>curl -X POST ${esc(this.ctx.publicUrl)}/v1/domains \\
@@ -203,19 +229,42 @@ export class Site {
203
229
  "cloudflare_api_token": "…"}}'</code></pre>
204
230
  </section>
205
231
 
232
+ ${this.roadmap()}
233
+
206
234
  <section class="wrap band">
207
235
  <h2>Credentials handled with care</h2>
208
236
  <p class="muted">Email provider keys and DNS tokens are encrypted at rest (AES-256-GCM), API keys are stored only as hashes, and the widget runs on our domain so your customers’ DNS credentials never pass through your app. <a href="/privacy">How we handle data</a></p>
209
237
  </section>
210
238
 
211
239
  ${plan ? `<section class="wrap center">
212
- <h2>Start free, pay as you grow</h2>
213
- <p class="muted">${plan.freeDomains} domains free. Then ${this.money(plan.unitAmount)} per active domain per month.</p>
240
+ <h2>${plan.comingSoon ? 'Start free' : 'Start free, pay as you grow'}</h2>
241
+ <p class="muted">${plan.freeDomains} domains free. ${plan.comingSoon ? 'Paid plans with unlimited domains are coming soon.' : `Then ${this.money(plan.unitAmount)} per active domain per month.`}</p>
214
242
  <div class="row center">${this.cta('Create your free account')}<a class="btn" href="/pricing">See pricing</a></div>
215
243
  </section>` : ''}`;
244
+ }
245
+ /** What's being built now, then what's planned after it. */
246
+ roadmap() {
247
+ const soon = [
248
+ ...(this.ctx.plan?.comingSoon ? [['Paid plans', 'Add a payment method to go past the free plan’s domains. Pay per active domain, monthly, cancel any time.']] : []),
249
+ ['Managed DNS', 'Point your domain’s nameservers to us once, and we handle every record from then on, at any registrar.'],
250
+ ['Buy domains in bulk', 'Search for and register many sending domains at once, right from the dashboard. Each one is authenticated automatically, with no registrar account or DNS setup.'],
251
+ ];
252
+ const planned = [
253
+ ['More DNS providers', 'Records written automatically at GoDaddy, Namecheap and DigitalOcean, plus Domain Connect where your registrar supports it.'],
254
+ ['One-click DNS connect', 'Sign in to your DNS provider instead of creating and pasting an API token.'],
255
+ ['Inbound email for Amazon SES', 'Receive email on SES domains too, delivered to your webhook like the other providers.'],
256
+ ];
257
+ const items = (list, tag) => list.map(([t, d]) => `<li><b>${t} <span class="soon">${tag}</span></b><span>${d}</span></li>`).join('');
258
+ return `<section class="wrap">
259
+ <h2>What’s next</h2>
260
+ <p class="muted">What we’re building now and what’s planned after it. Want something else? <a href="/feedback">Request a feature</a>.</p>
261
+ <ul class="roadmap">${items(soon, 'Coming soon')}${items(planned, 'Planned')}</ul>
262
+ </section>`;
216
263
  }
217
264
  pricing() {
218
265
  const p = this.ctx.plan;
266
+ if (p.comingSoon)
267
+ return this.pricingComingSoon(p.freeDomains);
219
268
  const price = this.money(p.unitAmount);
220
269
  const faq = [
221
270
  ['What is an active domain?', `A domain that was verified on at least one day of the billing period. Each domain counts once per period, however many days it was active. Domains that never verify aren’t counted.`],
@@ -258,6 +307,51 @@ ${plan ? `<section class="wrap center">
258
307
  </div>
259
308
  <p class="small muted center">Example: 10 active domains in a month = (10 − ${p.freeDomains}) × ${price} = ${this.money((10 - p.freeDomains) * p.unitAmount)}.</p>
260
309
  </section>
310
+ <section class="wrap narrow">
311
+ <h2>Questions</h2>
312
+ ${faq.map(([q, a]) => `<details><summary>${q}</summary><p>${a}</p></details>`).join('')}
313
+ </section>`;
314
+ }
315
+ /** Before payments launch: the free plan, and a paid plan marked as coming soon. */
316
+ pricingComingSoon(freeDomains) {
317
+ const faq = [
318
+ ['What happens when I reach the free limit?', `Adding more than ${freeDomains} domains is blocked for now. Your existing domains keep working. Need more today? Email ${this.email}.`],
319
+ ['When will paid plans be available?', 'Soon. You’ll be able to add a payment method from your dashboard to unlock unlimited domains. We’ll announce prices before anything is charged.'],
320
+ ['Will my free domains stay free?', `Yes. The first ${freeDomains} domains stay free when paid plans launch.`],
321
+ ];
322
+ return `
323
+ <section class="wrap hero small-hero">
324
+ <h1>Simple pricing</h1>
325
+ <p class="lead">Start free today. Paid plans for more domains are coming soon.</p>
326
+ </section>
327
+ <section class="wrap">
328
+ <div class="plans">
329
+ <div class="plan featured">
330
+ <h2>Free</h2>
331
+ <div class="price">${this.money(0)}<small> forever</small></div>
332
+ <ul>
333
+ <li>Up to ${freeDomains} domains</li>
334
+ <li>Bulk setup from the dashboard</li>
335
+ <li>Sender authentication and inbound email</li>
336
+ <li>API, embeddable widget and signed webhooks</li>
337
+ <li>No credit card required</li>
338
+ </ul>
339
+ ${this.cta('Start free')}
340
+ </div>
341
+ <div class="plan">
342
+ <h2>Pay as you go <span class="soon">Coming soon</span></h2>
343
+ <div class="price"><small>Usage-based, per active domain per month</small></div>
344
+ <ul>
345
+ <li>Unlimited domains</li>
346
+ <li>First ${freeDomains} domains still free</li>
347
+ <li>Everything in Free</li>
348
+ <li>Billed monthly for what you use</li>
349
+ <li>Cancel any time</li>
350
+ </ul>
351
+ <span class="btn" aria-disabled="true">Coming soon</span>
352
+ </div>
353
+ </div>
354
+ </section>
261
355
  <section class="wrap narrow">
262
356
  <h2>Questions</h2>
263
357
  ${faq.map(([q, a]) => `<details><summary>${q}</summary><p>${a}</p></details>`).join('')}
@@ -273,7 +367,7 @@ ${plan ? `<section class="wrap center">
273
367
  <h2>Who we are</h2>
274
368
  <p>${esc(this.appName)} is built and operated by ${this.operator}${country}.</p>
275
369
  <h2>Get in touch</h2>
276
- <p>Questions, feedback or a feature you need? Email ${this.email} or see our <a href="/contact">contact page</a>.</p>
370
+ <p>Questions? Email ${this.email} or see our <a href="/contact">contact page</a>. Feedback or a feature you need? <a href="/feedback">Tell us</a>.</p>
277
371
  </article>`;
278
372
  }
279
373
  contact() {
@@ -284,11 +378,44 @@ ${plan ? `<section class="wrap center">
284
378
  <h2>Before you write</h2>
285
379
  <ul>
286
380
  <li><b>Setting up a domain?</b> The <a href="/docs/getting-started">getting started guide</a> and <a href="/docs/hosted-api">API reference</a> cover most questions.</li>
287
- ${this.ctx.plan ? '<li><b>Billing, invoices or cancelling?</b> Use <b>Manage billing</b> in your <a href="/dashboard">dashboard</a>. For anything else about a charge, email us with your account email.</li>' : ''}
381
+ ${this.billing ? '<li><b>Billing, invoices or cancelling?</b> Use <b>Manage billing</b> in your <a href="/dashboard">dashboard</a>. For anything else about a charge, email us with your account email.</li>' : ''}
382
+ <li><b>Feedback or a feature request?</b> Use the <a href="/feedback">feedback form</a>.</li>
288
383
  <li><b>Found a security issue?</b> Email us with “Security” in the subject. Please don’t disclose it publicly until we’ve had a chance to fix it.</li>
289
384
  </ul>
290
385
  <h2>Operator</h2>
291
386
  <p>${this.operator}${this.ctx.legalCountry ? `, ${esc(this.ctx.legalCountry)}` : ''}</p>
387
+ </article>`;
388
+ }
389
+ feedback(form) {
390
+ if (form?.sent) {
391
+ return `
392
+ <article class="wrap narrow prose">
393
+ <h1>Thanks for the feedback</h1>
394
+ <p>It’s on its way to the team. We read every message${form.email ? ' and will reply by email if we have questions' : ''}.</p>
395
+ <p><a class="btn" href="/feedback">Send more</a> <a class="btn" href="/">Back to home</a></p>
396
+ </article>`;
397
+ }
398
+ const kind = form?.kind ?? 'feature';
399
+ const kinds = Object.entries(FEEDBACK_KINDS)
400
+ .map(([value, label]) => `<label class="choice"><input type="radio" name="kind" value="${value}"${value === kind ? ' checked' : ''}> ${label}</label>`)
401
+ .join('');
402
+ return `
403
+ <article class="wrap narrow prose">
404
+ <h1>Feedback and feature requests</h1>
405
+ <p>Tell us what’s working, what isn’t, or what you’d like ${esc(this.appName)} to do next. Requests from users decide what we build, and every message is read.</p>
406
+ ${form?.error ? `<p class="error" role="alert">${esc(form.error)}</p>` : ''}
407
+ <form class="form" method="post" action="/feedback">
408
+ <fieldset><legend>What’s it about?</legend>${kinds}</fieldset>
409
+ <label>Your message
410
+ <textarea name="message" rows="7" maxlength="${MAX_FEEDBACK_LENGTH}" required placeholder="What would help you, and what are you trying to do?">${esc(form?.message ?? '')}</textarea>
411
+ </label>
412
+ <label>Your email <span class="muted">(optional, so we can reply)</span>
413
+ <input type="email" name="email" maxlength="254" autocomplete="email" value="${esc(form?.email ?? '')}">
414
+ </label>
415
+ <div class="hp" aria-hidden="true"><label>Leave this empty <input name="website" tabindex="-1" autocomplete="off"></label></div>
416
+ <button class="btn primary" type="submit">Send</button>
417
+ </form>
418
+ <p class="muted small">Reporting a problem with a domain? Include the domain name and, if you have one, the request ID from the error. For anything private, email ${this.email}.</p>
292
419
  </article>`;
293
420
  }
294
421
  docPage(slug) {
@@ -317,7 +444,8 @@ ${plan ? `<section class="wrap center">
317
444
  }
318
445
  terms() {
319
446
  const app = esc(this.appName);
320
- const p = this.ctx.plan;
447
+ const p = this.billing ? this.ctx.plan : undefined;
448
+ const free = this.ctx.plan?.comingSoon ? this.ctx.plan.freeDomains : null;
321
449
  return this.legal('Terms of Service', [
322
450
  ['1. Agreement', `<p>These terms govern your use of ${app} (the “Service”), operated by ${this.operator} (“we”, “us”). By creating an account or using the Service you agree to them. If you use the Service for an organization, you accept them on its behalf.</p>`],
323
451
  ['2. The Service', `<p>The Service creates and verifies email sending domains with your chosen email provider (SendGrid, Postmark, Mailgun or Amazon SES) on your behalf. It can write DNS records through DNS providers you or your customers connect, check DNS and verification status, configure inbound email, and notify your systems by webhook. It relies on third-party services (your email provider, DNS providers and our payment provider), whose own terms also apply to your use of them.</p>`],
@@ -326,7 +454,7 @@ ${plan ? `<section class="wrap center">
326
454
  ['5. Acceptable use', `<p>You must not use the Service to:</p><ul><li>send spam or unsolicited email, or break anti-spam laws or your email provider’s acceptable use policy;</li><li>configure domains you don’t control or impersonate others;</li><li>disrupt, overload or probe the Service or anyone else’s systems;</li><li>break any law that applies to you.</li></ul><p>We may suspend accounts that do.</p>`],
327
455
  ['6. Plans, fees and payment', p
328
456
  ? `<p>The free plan includes up to ${p.freeDomains} domains. The pay-as-you-go plan is billed monthly per active domain beyond the free allowance, at the prices shown on our <a href="/pricing">pricing page</a>. An active domain is one verified on at least one day of the billing period. Payments are processed by Dodo Payments as merchant of record, which may add applicable taxes and whose terms apply to the purchase. We’ll give at least 30 days’ notice of price increases.</p>`
329
- : `<p>The Service is currently provided without charge. If we introduce fees, we’ll tell you in advance and you can stop using the Service before they apply.</p>`],
457
+ : `<p>The Service is currently provided without charge${free !== null ? `, on a free plan that includes up to ${free} domains` : ''}. If we introduce fees, we’ll tell you in advance and you can stop using the Service before they apply.</p>`],
330
458
  ['7. Cancellation and termination', `<p>You can stop using the Service ${p ? 'and cancel your subscription ' : ''}at any time${p ? ' from your dashboard' : ''}. We may suspend or end your access if you breach these terms${p ? ' or don’t pay amounts due' : ''}, and we’ll tell you why where we reasonably can. After your account ends, we delete your data as described in our <a href="/privacy">Privacy Policy</a>.</p>`],
331
459
  ['8. Your data', `<p>You keep all rights to the data you provide. You allow us to use it only to provide, secure and improve the Service. Our <a href="/privacy">Privacy Policy</a> explains how we handle personal data.</p>`],
332
460
  ['9. Availability and changes', `<p>We work to keep the Service reliable but don’t guarantee it will be uninterrupted or error-free, and it depends on third-party services we don’t control. We may change or discontinue features; if we discontinue the Service, we’ll give reasonable notice.</p>`],
@@ -340,11 +468,12 @@ ${plan ? `<section class="wrap center">
340
468
  }
341
469
  privacy() {
342
470
  const app = esc(this.appName);
343
- const p = this.ctx.plan;
471
+ const p = this.billing;
344
472
  return this.legal('Privacy Policy', [
345
473
  ['Who we are', `<p>${app} is operated by ${this.operator}${this.ctx.legalCountry ? `, ${esc(this.ctx.legalCountry)}` : ''}, which is responsible for your personal data. Contact: ${this.email}.</p>`],
346
474
  ['What we collect', `<ul>
347
475
  <li><b>Account details:</b> your email address and the name you give us.</li>
476
+ <li><b>Feedback you send:</b> your message and, if you give it, your email address, so we can reply.</li>
348
477
  <li><b>Credentials you provide:</b> email provider API keys and DNS provider tokens or keys. They’re encrypted at rest and used only to perform the operations you request. Our own API keys are stored only as one-way hashes.</li>
349
478
  <li><b>Domain data:</b> domain names, DNS records, verification status, and any tenant ids or metadata you send with them.</li>
350
479
  <li><b>Usage records:</b> which domains were active on which days, used to calculate usage and bills.</li>
@@ -355,7 +484,7 @@ ${plan ? `<section class="wrap center">
355
484
  ['How we use it', `<p>To provide and secure the Service, send sign-in emails and service notices, calculate usage${p ? ' and bill you' : ''}, respond to you, and meet legal obligations. We don’t sell personal data, and we don’t use it for advertising.</p>`],
356
485
  ['Who we share it with', `<p>Only service providers that help us run the Service, under appropriate safeguards:</p><ul>
357
486
  <li><b>The email provider you connect</b> (SendGrid, Postmark, Mailgun or Amazon SES): to authenticate your domains.</li>
358
- <li><b>Twilio SendGrid:</b> sending our sign-in emails.</li>
487
+ ${this.ctx.mailProvider ? `<li><b>${esc(this.ctx.mailProvider)}:</b> sending our sign-in emails.</li>` : ''}
359
488
  <li><b>DNS providers you connect</b> (such as Cloudflare or Amazon Route 53): to manage the records you ask us to.</li>
360
489
  ${p ? '<li><b>Dodo Payments:</b> payment processing as merchant of record.</li>' : ''}
361
490
  <li><b>Our hosting and database providers:</b> to store and run the Service.</li>
@@ -371,6 +500,13 @@ ${plan ? `<section class="wrap center">
371
500
  }
372
501
  refunds() {
373
502
  const p = this.ctx.plan;
503
+ if (p?.comingSoon) {
504
+ return this.legal('Refund Policy', [
505
+ ['Free plan', `<p>The free plan costs nothing, so there’s nothing to refund.</p>`],
506
+ ['Paid plans', `<p>Paid plans aren’t available yet, so nothing is charged. We’ll publish their refund terms here before they launch.</p>`],
507
+ ['Questions', `<p>Contact ${this.email}.</p>`],
508
+ ]);
509
+ }
374
510
  return this.legal('Refund Policy', [
375
511
  ['Free plan', `<p>The free plan costs nothing, so there’s nothing to refund.</p>`],
376
512
  ['Pay as you go', `<p>You’re billed monthly in arrears for the active domains you actually used in each billing period${p ? `, after the first ${p.freeDomains}, which are free` : ''}. Because you only pay for usage that has already happened, charges are generally not refundable.</p><p>You can cancel at any time from <b>Manage billing</b> in your dashboard to stop future charges. You won’t be charged for periods after you cancel.</p>`],
@@ -381,6 +517,28 @@ ${plan ? `<section class="wrap center">
381
517
  }
382
518
  }
383
519
  const LOGO = `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 7 9 6 9-6"/></svg>`;
520
+ const HISTORY_BUTTONS = '<button type="button" data-history="back" aria-label="Back" title="Back"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg></button>' +
521
+ '<button type="button" data-history="forward" aria-label="Forward" title="Forward"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg></button>';
522
+ /** Back and Forward buttons. Where the browser says whether there's somewhere to go, they're disabled when there isn't. */
523
+ const SITE_JS = `(() => {
524
+ const box = document.querySelector('.hist');
525
+ if (!box) return;
526
+ const back = box.querySelector('[data-history="back"]');
527
+ const forward = box.querySelector('[data-history="forward"]');
528
+ back.addEventListener('click', () => history.back());
529
+ forward.addEventListener('click', () => history.forward());
530
+ const nav = window.navigation;
531
+ const update = () => {
532
+ if (!nav || !('canGoBack' in nav)) return;
533
+ back.disabled = !nav.canGoBack;
534
+ forward.disabled = !nav.canGoForward;
535
+ };
536
+ update();
537
+ if (nav) nav.addEventListener('currententrychange', update);
538
+ addEventListener('pageshow', update);
539
+ box.hidden = false;
540
+ })();
541
+ `;
384
542
  const CSS = `
385
543
  :root { --bg:#ffffff; --bg-2:#f6f7f9; --surface:#ffffff; --border:#e2e5ea; --text:#15181d; --muted:#5d6573; --accent:#3b5bdb; --accent-hover:#3249b8; --accent-soft:#e8edff; --on-accent:#fff; --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; color-scheme: light; }
386
544
  @media (prefers-color-scheme: dark) { :root { --bg:#0f1115; --bg-2:#141821; --surface:#171a20; --border:#2a2f39; --text:#e8eaee; --muted:#9aa3b2; --accent:#7b93ff; --accent-hover:#93a7ff; --accent-soft:#1f2645; --on-accent:#0b0f1f; color-scheme: dark; } }
@@ -392,6 +550,12 @@ a { color:var(--accent); }
392
550
  .narrow { max-width:760px; }
393
551
  header.site { border-bottom:1px solid var(--border); background:var(--surface); position:sticky; top:0; z-index:1; }
394
552
  .bar { display:flex; align-items:center; gap:16px; min-height:60px; flex-wrap:wrap; }
553
+ .hist { display:flex; gap:4px; }
554
+ .hist[hidden] { display:none; }
555
+ .hist button { width:32px; height:32px; display:grid; place-items:center; padding:0; border:1px solid var(--border); border-radius:8px; background:var(--surface); color:var(--text); cursor:pointer; }
556
+ .hist button:hover:not(:disabled) { background:var(--bg-2); }
557
+ .hist button:disabled { opacity:.4; cursor:default; }
558
+ .hist button:focus-visible { outline:2px solid var(--accent); outline-offset:1px; }
395
559
  .brand { display:flex; align-items:center; gap:10px; font-weight:650; color:var(--text); text-decoration:none; }
396
560
  .mark { width:28px; height:28px; border-radius:8px; background:var(--accent); color:var(--on-accent); display:grid; place-items:center; }
397
561
  header nav { margin-left:auto; display:flex; gap:18px; align-items:center; flex-wrap:wrap; }
@@ -402,6 +566,9 @@ header nav a:hover, header nav a[aria-current] { color:var(--text); }
402
566
  .btn.primary { background:var(--accent); border-color:var(--accent); color:var(--on-accent) !important; }
403
567
  .btn.primary:hover { background:var(--accent-hover); }
404
568
  .btn.small { padding:6px 14px; font-size:14px; }
569
+ .btn[aria-disabled="true"] { opacity:.6; cursor:default; justify-self:start; }
570
+ .btn[aria-disabled="true"]:hover { background:var(--surface); }
571
+ .soon { display:inline-block; vertical-align:middle; margin-left:6px; font-size:12px; font-weight:600; padding:2px 10px; border-radius:99px; background:var(--accent-soft); color:var(--accent); }
405
572
  .row { display:flex; gap:12px; flex-wrap:wrap; align-items:center; }
406
573
  .center { text-align:center; justify-content:center; }
407
574
  .muted { color:var(--muted); }
@@ -419,6 +586,20 @@ h2 { font-size:26px; letter-spacing:-.01em; margin:0 0 14px; }
419
586
  .steps li::before { content:counter(s); width:28px; height:28px; border-radius:50%; background:var(--accent-soft); color:var(--accent); display:grid; place-items:center; font-weight:700; font-size:14px; }
420
587
  .steps span { color:var(--muted); font-size:15px; }
421
588
  .grid3 { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
589
+ .roadmap { list-style:none; padding:0; margin:0; display:grid; grid-template-columns:repeat(2,1fr); gap:12px; }
590
+ .roadmap li { border:1px solid var(--border); border-radius:12px; padding:16px 18px; display:grid; gap:4px; background:var(--surface); }
591
+ .roadmap b .soon { margin-left:8px; }
592
+ .roadmap span:not(.soon) { color:var(--muted); font-size:15px; }
593
+ .form { display:grid; gap:16px; margin:20px 0; }
594
+ .form label { display:grid; gap:6px; font-weight:550; }
595
+ .form fieldset { border:0; padding:0; margin:0; display:flex; gap:8px 18px; flex-wrap:wrap; }
596
+ .form legend { font-weight:550; padding:0; margin-bottom:6px; }
597
+ .form .choice { display:flex; gap:6px; align-items:center; font-weight:400; }
598
+ .form textarea, .form input[type=email] { font:inherit; font-weight:400; padding:10px 12px; border:1px solid var(--border); border-radius:8px; background:var(--surface); color:var(--text); width:100%; box-sizing:border-box; }
599
+ .form textarea:focus, .form input:focus { outline:2px solid var(--accent); outline-offset:1px; }
600
+ .form button { justify-self:start; cursor:pointer; font:inherit; font-weight:550; }
601
+ .form .hp { position:absolute; left:-10000px; width:1px; height:1px; overflow:hidden; }
602
+ .error { border:1px solid #e03131; color:#e03131; border-radius:8px; padding:10px 14px; }
422
603
  .card { border:1px solid var(--border); border-radius:12px; padding:20px; background:var(--surface); }
423
604
  .card h3 { margin:0 0 6px; font-size:17px; }
424
605
  .card p { margin:0; color:var(--muted); font-size:15px; }
@@ -462,7 +643,7 @@ footer.site { margin-top:72px; border-top:1px solid var(--border); background:va
462
643
  .foot a { color:var(--muted); text-decoration:none; }
463
644
  .foot a:hover { color:var(--text); }
464
645
  @media (max-width: 820px) {
465
- .steps, .grid3, .split, .plans { grid-template-columns:1fr; }
646
+ .steps, .grid3, .split, .plans, .roadmap { grid-template-columns:1fr; }
466
647
  .docs { grid-template-columns:1fr; gap:0; }
467
648
  .docs aside { position:static; padding-top:24px; }
468
649
  .toc { display:none; }
@@ -1 +1 @@
1
- {"version":3,"file":"site.js","sourceRoot":"","sources":["../../../src/hosted/site.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../../../src/hosted/site.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,14 @@ Credentials are encrypted at rest and never shown again. Each account uses one p
21
21
 
22
22
  Each provider asks for slightly different DNS records, and we handle the differences. For example, if a domain already has an SPF record, we add the provider to it rather than creating a second SPF record, which would break SPF.
23
23
 
24
+ ### No code: add your domains in the dashboard
25
+
26
+ Bought domains at GoDaddy, Namecheap, Hostinger or anywhere else? Paste them into **Domains** in the dashboard, one per line, up to 100 at a time. Each one gets sender authentication at your email provider, plus inbound email if you tick **Also receive email** and enter the URL received mail should be posted to.
27
+
28
+ We detect where each domain's DNS is hosted. Domains on Cloudflare or Route 53 can have their records written for you, if you enter a Cloudflare API token or AWS keys under **Write DNS records automatically**. For every other domain, the dashboard lists the records to add, grouped by DNS host, with a CSV and a zone file you can import. We keep checking and verify each domain as soon as its records are live.
29
+
30
+ The steps below are for adding domains from your own app with the API.
31
+
24
32
  ## 3. Create an API key
25
33
 
26
34
  Choose **Create new API key** in the dashboard and copy it. It's shown once. Use it from your backend as a bearer token:
@@ -54,4 +62,5 @@ Check `GET /v1/domains/{id}`, or better, set a **Webhook URL** in the dashboard
54
62
 
55
63
  - [API reference](/docs/hosted-api): every endpoint, the domain lifecycle, errors and webhooks
56
64
  - [Embeddable widget](/docs/widget): let your customers connect their own DNS inside your app
65
+ - [Node.js library and CLI](/docs/library): run the same setup from your own code or terminal, with your own keys
57
66
  {{#billing}}- [Plans and billing](/docs/billing): pricing and what counts as an active domain{{/billing}}