← Public packages
@kentcdodds/kit
Kit.com helpers for subscribers, tags, forms, sequences, and broadcasts.
AGENTS.md
118 lines · 3.8 KB · Markdown@kentcdodds/kit — agent notes
Human setup and intent live in README.md. This file is for
agents: imports, smoke checks, snippets, and edge cases. Secrets by name
only — never paste key values. Do not disable live webhooks or jobs.
Secret
- Name:
kitApiKey(user scope) - Host:
api.kit.com - Header:
X-Kit-Api-Key(Kit v4 does not accept Bearer)
Import paths
| Export | Import |
|---|---|
root (createBroadcastDraft) | kody:@kentcdodds/kit |
| create-broadcast-draft | kody:@kentcdodds/kit/create-broadcast-draft |
| subscribe-and-tag | kody:@kentcdodds/kit/subscribe-and-tag |
| list-broadcasts | kody:@kentcdodds/kit/list-broadcasts |
| named barrel | kody:@kentcdodds/kit/named |
| smoke-test | kody:@kentcdodds/kit/smoke-test |
Prefer focused paths when one exists. Prefer static kody:@kentcdodds/kit/...
imports from execute. Do not lead with packages.invoke.
Smoke test (read-only)
import smokeTest from 'kody:@kentcdodds/kit/smoke-test'
export default async function main() {
return await smokeTest()
// => { ok: true, account: { name }, broadcastCount, sampleBroadcast }
}Run this before any writes to confirm secret + host approval.
Common snippets
Waitlist subscribe + tag:
import subscribeAndTag from 'kody:@kentcdodds/kit/subscribe-and-tag'
export default async function main() {
return await subscribeAndTag({
email_address: 'person@example.com',
first_name: 'Ada',
tagName: 'waitlist::kody',
})
}Draft broadcast (never sends):
import createBroadcastDraft from 'kody:@kentcdodds/kit'
export default async function main() {
return await createBroadcastDraft({
subject: 'Product Engineering Workshop',
content: '<p>Workshop details go here.</p>',
})
// => { id, status: 'draft', editUrl, ... }
}List recent broadcasts — always pass maxItems:
import listBroadcasts from 'kody:@kentcdodds/kit/list-broadcasts'
export default async function main() {
return await listBroadcasts({ maxItems: 10 })
}BWK YouTube episode draft (required helper / defaults):
import { createBwkYoutubeBroadcastDraft } from 'kody:@kentcdodds/kit/named'
export default async function main() {
return await createBwkYoutubeBroadcastDraft({
subject: 'Episode title',
preview_text: 'Short preview',
description: 'BWK 12-slug YouTube early access',
thumbnail_url: 'https://i.ytimg.com/vi/VIDEO_ID/maxresdefault.jpg',
content:
'<p>{% if subscriber.first_name != blank %}Hey {{ subscriber.first_name }},{% else %}Hey friend,{% endif %}</p>',
})
}Edge cases
- Broadcast helpers are draft-only. Never claim a broadcast was sent.
Destructive:
deleteBroadcast,unsubscribeSubscriber,untagSubscriber. subscribeAndTagand active sequences write live audience data — use test addresses when experimenting. Active sequences withdelay_value: 0email immediately.- Always pass
maxItemson exploratory list/pagination helpers or execute can time out paging the full history. - Templates (
KIT_TEMPLATES):textOnly(684651, account default),epePodcast(5215129),betterWithKent(5341436). Verify ids in Kit UI before relying on new ones. - BWK YouTube drafts: do not call bare
createBroadcastDraft. UsecreateBwkYoutubeBroadcastDraftor copyBWK_YOUTUBE_BROADCAST_DEFAULTS. Required:email_addresshello@kentcdodds.com, templateKIT_TEMPLATES.betterWithKent,public: false, and mute filter excludingKIT_MUTE_TAGS.betterWithKentYoutube(20860981). After create/update, verify withgetBroadcast(id). - Cross-package import: if another package imports this one,
kitApiKeymust also be approved for the calling package (secrets UI → allowed packages). Ad hocexecuteis unaffected. - Failures throw
KitApiErrorwithstatus,body,method,path.