[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-knock-knock-migrate-to-knock":3,"mdc-g2k1wd-key":35,"related-org-knock-knock-migrate-to-knock":645,"related-repo-knock-knock-migrate-to-knock":740},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":26,"topics":30,"repo":31,"sourceUrl":33,"mdContent":34},"knock-migrate-to-knock","migrate messaging infrastructure to Knock","Investigate existing messaging infrastructure in a codebase and recommend how it maps to Knock. Use when migrating from Braze, Courier, Customer.io, Iterable, SendGrid, or custom notification code, or when planning a move to Knock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"knock","Knock","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fknock.png","knocklabs",[13,17,20,23],{"name":14,"slug":15,"type":16},"Migration","migration","tag",{"name":18,"slug":19,"type":16},"Messaging","messaging",{"name":21,"slug":22,"type":16},"Infrastructure","infrastructure",{"name":24,"slug":25,"type":16},"Notifications","notifications",0,"https:\u002F\u002Fgithub.com\u002Fknocklabs\u002Fskills","2026-07-27T06:28:49.594684",null,[],{"repoUrl":27,"stars":26,"forks":26,"topics":32,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fknocklabs\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fknock-migrate-to-knock","---\nname: knock-migrate-to-knock\ndescription: Investigate existing messaging infrastructure in a codebase and recommend how it maps to Knock. Use when migrating from Braze, Courier, Customer.io, Iterable, SendGrid, or custom notification code, or when planning a move to Knock.\n---\n\n# Migrate to Knock skill\n\nDiscover the current messaging stack in this codebase, map it to Knock concepts, and produce an ordered migration plan. This is a **discovery and recommendation** skill.\n\n## Hard constraint\n\n**Do not create, update, push, commit, or delete Knock resources** (workflows, guides, users, tenants, preferences, partials, layouts) via MCP or CLI unless the user explicitly asks after reviewing the plan. Do not run production imports. Output plans, inventories, and optional local app-code suggestions only.\n\n## Output contract (hard)\n\nWrite the inventory and migration plan to **`knock-plan.md`** at the repo root (the shared plan file used by `knock-product-messaging-strategy` and `knock-lifecycle-opportunities`; create or update — do not create a second plan). Keep chat **minimal** — status + confirmation only.\n\nDo **not** paste the inventory table or the full phased plan into chat.\n\nAllowed chat content:\n\n1. One short status line (path + counts, e.g. platforms detected and message types found)\n2. Optional one-line blocker\n3. Bold confirmation question as the **last line**\n\nExample:\n\nWrote `knock-plan.md`: Courier + SendGrid detected, 14 message types inventoried, 8-phase plan drafted.\n\n**Which migration phase should we plan in more detail next?**\n\n## Docs to use (link in your output)\n\nAlways ground recommendations in Knock docs. Prefer these:\n\n| Situation | Doc |\n| --- | --- |\n| Braze → Knock | https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-from-braze |\n| Courier → Knock | https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-from-courier |\n| Email templates via MCP (only if user asks to execute) | https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-email-with-mcp-server |\n| Workflows | https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fworkflows |\n| Channels | https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fchannels |\n| Users | https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fusers |\n| Preferences | https:\u002F\u002Fdocs.knock.app\u002Fpreferences\u002Foverview |\n| Tenants \u002F multi-tenancy | https:\u002F\u002Fdocs.knock.app\u002Fmulti-tenancy\u002Foverview |\n| Subscriptions | https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fsubscriptions |\n| Translations | https:\u002F\u002Fdocs.knock.app\u002Ftemplate-editor\u002Ftranslations |\n| Triggering workflows | https:\u002F\u002Fdocs.knock.app\u002Fsend-notifications\u002Ftriggering-workflows |\n| Sources (CDP) | https:\u002F\u002Fdocs.knock.app\u002Fintegrations\u002Fsources\u002Foverview |\n\n## Overview\n\n1. **Inventory the current stack** (`rules\u002Finventory-existing-messaging.md`)\n2. **Map concepts to Knock** (`rules\u002Fmap-concepts-to-knock.md`)\n3. **Produce a phased migration plan** (`rules\u002Fmigration-plan.md`)\n\n## How to use this skill\n\n1. Search the repo for providers, SDKs, templates, and send call sites (see inventory rule) — record findings in `knock-plan.md`, not chat.\n2. Identify the source platform(s): Braze, Courier, Customer.io, Iterable, Novu, ESP-direct (SendGrid\u002FPostmark\u002FResend\u002FSES), Slack bots, custom queues, etc.\n3. Open the matching migration tutorial when Braze or Courier; otherwise use the generic mapping table in `rules\u002Fmap-concepts-to-knock.md`.\n4. Write the phased migration plan (phases, risks, Knock concept links) into `knock-plan.md`. In chat, ask which phase to plan or execute next — do not execute Knock writes unless asked.\n\n## Rule files reference\n\n- `rules\u002Finventory-existing-messaging.md` — what to find in the codebase\n- `rules\u002Fmap-concepts-to-knock.md` — platform concepts → Knock\n- `rules\u002Fmigration-plan.md` — phased plan output format\n\n## Quick reference\n\nRecommended resource migration order (from Knock Braze \u002F Courier tutorials):\n\n1. Channels \u002F provider connections\n2. Workflows and templates (logic + content)\n3. Translations\n4. Tenants (and branding context, if multi-tenant)\n5. Users \u002F identify\n6. Subscriptions (lists → object subscriptions)\n7. Preferences (after users exist; map topics\u002Fgroups → workflow categories)\n8. Cut over triggers in application code\n9. Retire old sends\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,49,63,70,80,86,126,138,143,168,173,185,193,199,204,438,444,497,503,547,553,587,593,598],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"migrate-to-knock-skill",[46],{"type":47,"value":48},"text","Migrate to Knock skill",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53,55,61],{"type":47,"value":54},"Discover the current messaging stack in this codebase, map it to Knock concepts, and produce an ordered migration plan. This is a ",{"type":41,"tag":56,"props":57,"children":58},"strong",{},[59],{"type":47,"value":60},"discovery and recommendation",{"type":47,"value":62}," skill.",{"type":41,"tag":64,"props":65,"children":67},"h2",{"id":66},"hard-constraint",[68],{"type":47,"value":69},"Hard constraint",{"type":41,"tag":50,"props":71,"children":72},{},[73,78],{"type":41,"tag":56,"props":74,"children":75},{},[76],{"type":47,"value":77},"Do not create, update, push, commit, or delete Knock resources",{"type":47,"value":79}," (workflows, guides, users, tenants, preferences, partials, layouts) via MCP or CLI unless the user explicitly asks after reviewing the plan. Do not run production imports. Output plans, inventories, and optional local app-code suggestions only.",{"type":41,"tag":64,"props":81,"children":83},{"id":82},"output-contract-hard",[84],{"type":47,"value":85},"Output contract (hard)",{"type":41,"tag":50,"props":87,"children":88},{},[89,91,101,103,109,111,117,119,124],{"type":47,"value":90},"Write the inventory and migration plan to ",{"type":41,"tag":56,"props":92,"children":93},{},[94],{"type":41,"tag":95,"props":96,"children":98},"code",{"className":97},[],[99],{"type":47,"value":100},"knock-plan.md",{"type":47,"value":102}," at the repo root (the shared plan file used by ",{"type":41,"tag":95,"props":104,"children":106},{"className":105},[],[107],{"type":47,"value":108},"knock-product-messaging-strategy",{"type":47,"value":110}," and ",{"type":41,"tag":95,"props":112,"children":114},{"className":113},[],[115],{"type":47,"value":116},"knock-lifecycle-opportunities",{"type":47,"value":118},"; create or update — do not create a second plan). Keep chat ",{"type":41,"tag":56,"props":120,"children":121},{},[122],{"type":47,"value":123},"minimal",{"type":47,"value":125}," — status + confirmation only.",{"type":41,"tag":50,"props":127,"children":128},{},[129,131,136],{"type":47,"value":130},"Do ",{"type":41,"tag":56,"props":132,"children":133},{},[134],{"type":47,"value":135},"not",{"type":47,"value":137}," paste the inventory table or the full phased plan into chat.",{"type":41,"tag":50,"props":139,"children":140},{},[141],{"type":47,"value":142},"Allowed chat content:",{"type":41,"tag":144,"props":145,"children":146},"ol",{},[147,153,158],{"type":41,"tag":148,"props":149,"children":150},"li",{},[151],{"type":47,"value":152},"One short status line (path + counts, e.g. platforms detected and message types found)",{"type":41,"tag":148,"props":154,"children":155},{},[156],{"type":47,"value":157},"Optional one-line blocker",{"type":41,"tag":148,"props":159,"children":160},{},[161,163],{"type":47,"value":162},"Bold confirmation question as the ",{"type":41,"tag":56,"props":164,"children":165},{},[166],{"type":47,"value":167},"last line",{"type":41,"tag":50,"props":169,"children":170},{},[171],{"type":47,"value":172},"Example:",{"type":41,"tag":50,"props":174,"children":175},{},[176,178,183],{"type":47,"value":177},"Wrote ",{"type":41,"tag":95,"props":179,"children":181},{"className":180},[],[182],{"type":47,"value":100},{"type":47,"value":184},": Courier + SendGrid detected, 14 message types inventoried, 8-phase plan drafted.",{"type":41,"tag":50,"props":186,"children":187},{},[188],{"type":41,"tag":56,"props":189,"children":190},{},[191],{"type":47,"value":192},"Which migration phase should we plan in more detail next?",{"type":41,"tag":64,"props":194,"children":196},{"id":195},"docs-to-use-link-in-your-output",[197],{"type":47,"value":198},"Docs to use (link in your output)",{"type":41,"tag":50,"props":200,"children":201},{},[202],{"type":47,"value":203},"Always ground recommendations in Knock docs. Prefer these:",{"type":41,"tag":205,"props":206,"children":207},"table",{},[208,227],{"type":41,"tag":209,"props":210,"children":211},"thead",{},[212],{"type":41,"tag":213,"props":214,"children":215},"tr",{},[216,222],{"type":41,"tag":217,"props":218,"children":219},"th",{},[220],{"type":47,"value":221},"Situation",{"type":41,"tag":217,"props":223,"children":224},{},[225],{"type":47,"value":226},"Doc",{"type":41,"tag":228,"props":229,"children":230},"tbody",{},[231,251,268,285,302,319,336,353,370,387,404,421],{"type":41,"tag":213,"props":232,"children":233},{},[234,240],{"type":41,"tag":235,"props":236,"children":237},"td",{},[238],{"type":47,"value":239},"Braze → Knock",{"type":41,"tag":235,"props":241,"children":242},{},[243],{"type":41,"tag":244,"props":245,"children":249},"a",{"href":246,"rel":247},"https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-from-braze",[248],"nofollow",[250],{"type":47,"value":246},{"type":41,"tag":213,"props":252,"children":253},{},[254,259],{"type":41,"tag":235,"props":255,"children":256},{},[257],{"type":47,"value":258},"Courier → Knock",{"type":41,"tag":235,"props":260,"children":261},{},[262],{"type":41,"tag":244,"props":263,"children":266},{"href":264,"rel":265},"https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-from-courier",[248],[267],{"type":47,"value":264},{"type":41,"tag":213,"props":269,"children":270},{},[271,276],{"type":41,"tag":235,"props":272,"children":273},{},[274],{"type":47,"value":275},"Email templates via MCP (only if user asks to execute)",{"type":41,"tag":235,"props":277,"children":278},{},[279],{"type":41,"tag":244,"props":280,"children":283},{"href":281,"rel":282},"https:\u002F\u002Fdocs.knock.app\u002Ftutorials\u002Fmigrate-email-with-mcp-server",[248],[284],{"type":47,"value":281},{"type":41,"tag":213,"props":286,"children":287},{},[288,293],{"type":41,"tag":235,"props":289,"children":290},{},[291],{"type":47,"value":292},"Workflows",{"type":41,"tag":235,"props":294,"children":295},{},[296],{"type":41,"tag":244,"props":297,"children":300},{"href":298,"rel":299},"https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fworkflows",[248],[301],{"type":47,"value":298},{"type":41,"tag":213,"props":303,"children":304},{},[305,310],{"type":41,"tag":235,"props":306,"children":307},{},[308],{"type":47,"value":309},"Channels",{"type":41,"tag":235,"props":311,"children":312},{},[313],{"type":41,"tag":244,"props":314,"children":317},{"href":315,"rel":316},"https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fchannels",[248],[318],{"type":47,"value":315},{"type":41,"tag":213,"props":320,"children":321},{},[322,327],{"type":41,"tag":235,"props":323,"children":324},{},[325],{"type":47,"value":326},"Users",{"type":41,"tag":235,"props":328,"children":329},{},[330],{"type":41,"tag":244,"props":331,"children":334},{"href":332,"rel":333},"https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fusers",[248],[335],{"type":47,"value":332},{"type":41,"tag":213,"props":337,"children":338},{},[339,344],{"type":41,"tag":235,"props":340,"children":341},{},[342],{"type":47,"value":343},"Preferences",{"type":41,"tag":235,"props":345,"children":346},{},[347],{"type":41,"tag":244,"props":348,"children":351},{"href":349,"rel":350},"https:\u002F\u002Fdocs.knock.app\u002Fpreferences\u002Foverview",[248],[352],{"type":47,"value":349},{"type":41,"tag":213,"props":354,"children":355},{},[356,361],{"type":41,"tag":235,"props":357,"children":358},{},[359],{"type":47,"value":360},"Tenants \u002F multi-tenancy",{"type":41,"tag":235,"props":362,"children":363},{},[364],{"type":41,"tag":244,"props":365,"children":368},{"href":366,"rel":367},"https:\u002F\u002Fdocs.knock.app\u002Fmulti-tenancy\u002Foverview",[248],[369],{"type":47,"value":366},{"type":41,"tag":213,"props":371,"children":372},{},[373,378],{"type":41,"tag":235,"props":374,"children":375},{},[376],{"type":47,"value":377},"Subscriptions",{"type":41,"tag":235,"props":379,"children":380},{},[381],{"type":41,"tag":244,"props":382,"children":385},{"href":383,"rel":384},"https:\u002F\u002Fdocs.knock.app\u002Fconcepts\u002Fsubscriptions",[248],[386],{"type":47,"value":383},{"type":41,"tag":213,"props":388,"children":389},{},[390,395],{"type":41,"tag":235,"props":391,"children":392},{},[393],{"type":47,"value":394},"Translations",{"type":41,"tag":235,"props":396,"children":397},{},[398],{"type":41,"tag":244,"props":399,"children":402},{"href":400,"rel":401},"https:\u002F\u002Fdocs.knock.app\u002Ftemplate-editor\u002Ftranslations",[248],[403],{"type":47,"value":400},{"type":41,"tag":213,"props":405,"children":406},{},[407,412],{"type":41,"tag":235,"props":408,"children":409},{},[410],{"type":47,"value":411},"Triggering workflows",{"type":41,"tag":235,"props":413,"children":414},{},[415],{"type":41,"tag":244,"props":416,"children":419},{"href":417,"rel":418},"https:\u002F\u002Fdocs.knock.app\u002Fsend-notifications\u002Ftriggering-workflows",[248],[420],{"type":47,"value":417},{"type":41,"tag":213,"props":422,"children":423},{},[424,429],{"type":41,"tag":235,"props":425,"children":426},{},[427],{"type":47,"value":428},"Sources (CDP)",{"type":41,"tag":235,"props":430,"children":431},{},[432],{"type":41,"tag":244,"props":433,"children":436},{"href":434,"rel":435},"https:\u002F\u002Fdocs.knock.app\u002Fintegrations\u002Fsources\u002Foverview",[248],[437],{"type":47,"value":434},{"type":41,"tag":64,"props":439,"children":441},{"id":440},"overview",[442],{"type":47,"value":443},"Overview",{"type":41,"tag":144,"props":445,"children":446},{},[447,465,481],{"type":41,"tag":148,"props":448,"children":449},{},[450,455,457,463],{"type":41,"tag":56,"props":451,"children":452},{},[453],{"type":47,"value":454},"Inventory the current stack",{"type":47,"value":456}," (",{"type":41,"tag":95,"props":458,"children":460},{"className":459},[],[461],{"type":47,"value":462},"rules\u002Finventory-existing-messaging.md",{"type":47,"value":464},")",{"type":41,"tag":148,"props":466,"children":467},{},[468,473,474,480],{"type":41,"tag":56,"props":469,"children":470},{},[471],{"type":47,"value":472},"Map concepts to Knock",{"type":47,"value":456},{"type":41,"tag":95,"props":475,"children":477},{"className":476},[],[478],{"type":47,"value":479},"rules\u002Fmap-concepts-to-knock.md",{"type":47,"value":464},{"type":41,"tag":148,"props":482,"children":483},{},[484,489,490,496],{"type":41,"tag":56,"props":485,"children":486},{},[487],{"type":47,"value":488},"Produce a phased migration plan",{"type":47,"value":456},{"type":41,"tag":95,"props":491,"children":493},{"className":492},[],[494],{"type":47,"value":495},"rules\u002Fmigration-plan.md",{"type":47,"value":464},{"type":41,"tag":64,"props":498,"children":500},{"id":499},"how-to-use-this-skill",[501],{"type":47,"value":502},"How to use this skill",{"type":41,"tag":144,"props":504,"children":505},{},[506,518,523,535],{"type":41,"tag":148,"props":507,"children":508},{},[509,511,516],{"type":47,"value":510},"Search the repo for providers, SDKs, templates, and send call sites (see inventory rule) — record findings in ",{"type":41,"tag":95,"props":512,"children":514},{"className":513},[],[515],{"type":47,"value":100},{"type":47,"value":517},", not chat.",{"type":41,"tag":148,"props":519,"children":520},{},[521],{"type":47,"value":522},"Identify the source platform(s): Braze, Courier, Customer.io, Iterable, Novu, ESP-direct (SendGrid\u002FPostmark\u002FResend\u002FSES), Slack bots, custom queues, etc.",{"type":41,"tag":148,"props":524,"children":525},{},[526,528,533],{"type":47,"value":527},"Open the matching migration tutorial when Braze or Courier; otherwise use the generic mapping table in ",{"type":41,"tag":95,"props":529,"children":531},{"className":530},[],[532],{"type":47,"value":479},{"type":47,"value":534},".",{"type":41,"tag":148,"props":536,"children":537},{},[538,540,545],{"type":47,"value":539},"Write the phased migration plan (phases, risks, Knock concept links) into ",{"type":41,"tag":95,"props":541,"children":543},{"className":542},[],[544],{"type":47,"value":100},{"type":47,"value":546},". In chat, ask which phase to plan or execute next — do not execute Knock writes unless asked.",{"type":41,"tag":64,"props":548,"children":550},{"id":549},"rule-files-reference",[551],{"type":47,"value":552},"Rule files reference",{"type":41,"tag":554,"props":555,"children":556},"ul",{},[557,567,577],{"type":41,"tag":148,"props":558,"children":559},{},[560,565],{"type":41,"tag":95,"props":561,"children":563},{"className":562},[],[564],{"type":47,"value":462},{"type":47,"value":566}," — what to find in the codebase",{"type":41,"tag":148,"props":568,"children":569},{},[570,575],{"type":41,"tag":95,"props":571,"children":573},{"className":572},[],[574],{"type":47,"value":479},{"type":47,"value":576}," — platform concepts → Knock",{"type":41,"tag":148,"props":578,"children":579},{},[580,585],{"type":41,"tag":95,"props":581,"children":583},{"className":582},[],[584],{"type":47,"value":495},{"type":47,"value":586}," — phased plan output format",{"type":41,"tag":64,"props":588,"children":590},{"id":589},"quick-reference",[591],{"type":47,"value":592},"Quick reference",{"type":41,"tag":50,"props":594,"children":595},{},[596],{"type":47,"value":597},"Recommended resource migration order (from Knock Braze \u002F Courier tutorials):",{"type":41,"tag":144,"props":599,"children":600},{},[601,606,611,615,620,625,630,635,640],{"type":41,"tag":148,"props":602,"children":603},{},[604],{"type":47,"value":605},"Channels \u002F provider connections",{"type":41,"tag":148,"props":607,"children":608},{},[609],{"type":47,"value":610},"Workflows and templates (logic + content)",{"type":41,"tag":148,"props":612,"children":613},{},[614],{"type":47,"value":394},{"type":41,"tag":148,"props":616,"children":617},{},[618],{"type":47,"value":619},"Tenants (and branding context, if multi-tenant)",{"type":41,"tag":148,"props":621,"children":622},{},[623],{"type":47,"value":624},"Users \u002F identify",{"type":41,"tag":148,"props":626,"children":627},{},[628],{"type":47,"value":629},"Subscriptions (lists → object subscriptions)",{"type":41,"tag":148,"props":631,"children":632},{},[633],{"type":47,"value":634},"Preferences (after users exist; map topics\u002Fgroups → workflow categories)",{"type":41,"tag":148,"props":636,"children":637},{},[638],{"type":47,"value":639},"Cut over triggers in application code",{"type":41,"tag":148,"props":641,"children":642},{},[643],{"type":47,"value":644},"Retire old sends",{"items":646,"total":739},[647,659,676,692,699,713,725],{"slug":648,"name":648,"fn":649,"description":650,"org":651,"tags":652,"stars":26,"repoUrl":27,"updatedAt":658},"knock-cli","manage Knock notification resources via CLI","Guidelines for working with the Knock CLI to manage workflows, templates, and other notification resources in a Knock project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[653,656,657],{"name":654,"slug":655,"type":16},"CLI","cli",{"name":18,"slug":19,"type":16},{"name":24,"slug":25,"type":16},"2026-07-14T05:23:51.065051",{"slug":660,"name":660,"fn":661,"description":662,"org":663,"tags":664,"stars":26,"repoUrl":27,"updatedAt":675},"knock-in-app-ui","implement Knock in-app UI in React","Guidance for implementing Knock in-app UI in a web app, with a focus on setting up, rendering, and debugging Knock guides in React.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[665,668,669,672],{"name":666,"slug":667,"type":16},"Frontend","frontend",{"name":18,"slug":19,"type":16},{"name":670,"slug":671,"type":16},"React","react",{"name":673,"slug":674,"type":16},"UI Components","ui-components","2026-07-14T05:23:53.566839",{"slug":116,"name":116,"fn":677,"description":678,"org":679,"tags":680,"stars":26,"repoUrl":27,"updatedAt":691},"identify lifecycle messaging opportunities","Scan a product codebase for activation, engagement, and retention moments and recommend lifecycle messaging opportunities. Use when finding onboarding, churn, trial, or habit-forming notification candidates without creating Knock resources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[681,684,687,688],{"name":682,"slug":683,"type":16},"Engagement","engagement",{"name":685,"slug":686,"type":16},"Marketing","marketing",{"name":18,"slug":19,"type":16},{"name":689,"slug":690,"type":16},"Product Management","product-management","2026-07-27T06:28:50.28638",{"slug":4,"name":4,"fn":5,"description":6,"org":693,"tags":694,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[695,696,697,698],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"slug":700,"name":700,"fn":701,"description":702,"org":703,"tags":704,"stars":26,"repoUrl":27,"updatedAt":712},"knock-notification-best-practices","design effective notification systems","Comprehensive guidelines for designing, writing, and implementing effective notification systems across email, push, SMS, in-app, and chat channels.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[705,708,711],{"name":706,"slug":707,"type":16},"Best Practices","best-practices",{"name":709,"slug":710,"type":16},"Communications","communications",{"name":18,"slug":19,"type":16},"2026-07-14T05:23:54.812153",{"slug":108,"name":108,"fn":714,"description":715,"org":716,"tags":717,"stars":26,"repoUrl":27,"updatedAt":724},"design cross-channel product messaging systems","Design a cross-channel product messaging system that drives activation, engagement, and retention while controlling fatigue. Use when planning lifecycle messaging, auditing notification strategy, prioritizing workflows, or turning product moments into Knock workflows, guides, preferences, and measurement.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[718,719,720,721],{"name":682,"slug":683,"type":16},{"name":18,"slug":19,"type":16},{"name":689,"slug":690,"type":16},{"name":722,"slug":723,"type":16},"Strategy","strategy","2026-07-27T06:28:49.935507",{"slug":726,"name":726,"fn":727,"description":728,"org":729,"tags":730,"stars":26,"repoUrl":27,"updatedAt":738},"knock-setup","integrate Knock notification workflows","Connect Knock to your coding agent, discover and build notification workflows, and recommend how to trigger them from your application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[731,734,737],{"name":732,"slug":733,"type":16},"API Development","api-development",{"name":735,"slug":736,"type":16},"Automation","automation",{"name":18,"slug":19,"type":16},"2026-07-27T06:06:35.280117",7,{"items":741,"total":739},[742,748,755,762,769,775,782],{"slug":648,"name":648,"fn":649,"description":650,"org":743,"tags":744,"stars":26,"repoUrl":27,"updatedAt":658},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[745,746,747],{"name":654,"slug":655,"type":16},{"name":18,"slug":19,"type":16},{"name":24,"slug":25,"type":16},{"slug":660,"name":660,"fn":661,"description":662,"org":749,"tags":750,"stars":26,"repoUrl":27,"updatedAt":675},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[751,752,753,754],{"name":666,"slug":667,"type":16},{"name":18,"slug":19,"type":16},{"name":670,"slug":671,"type":16},{"name":673,"slug":674,"type":16},{"slug":116,"name":116,"fn":677,"description":678,"org":756,"tags":757,"stars":26,"repoUrl":27,"updatedAt":691},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[758,759,760,761],{"name":682,"slug":683,"type":16},{"name":685,"slug":686,"type":16},{"name":18,"slug":19,"type":16},{"name":689,"slug":690,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":763,"tags":764,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[765,766,767,768],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"slug":700,"name":700,"fn":701,"description":702,"org":770,"tags":771,"stars":26,"repoUrl":27,"updatedAt":712},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[772,773,774],{"name":706,"slug":707,"type":16},{"name":709,"slug":710,"type":16},{"name":18,"slug":19,"type":16},{"slug":108,"name":108,"fn":714,"description":715,"org":776,"tags":777,"stars":26,"repoUrl":27,"updatedAt":724},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[778,779,780,781],{"name":682,"slug":683,"type":16},{"name":18,"slug":19,"type":16},{"name":689,"slug":690,"type":16},{"name":722,"slug":723,"type":16},{"slug":726,"name":726,"fn":727,"description":728,"org":783,"tags":784,"stars":26,"repoUrl":27,"updatedAt":738},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[785,786,787],{"name":732,"slug":733,"type":16},{"name":735,"slug":736,"type":16},{"name":18,"slug":19,"type":16}]