Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
6a733ae
Update Agent Toolkit tools reference to match current implementation …
cjbell Feb 24, 2026
a683912
chore: rework docs for remote mcp server (#1323)
cjbell Feb 24, 2026
a752b31
chore: update control openapi spec (#1288)
knock-eng-bot Feb 25, 2026
eab0c75
chore(kno-11675): Clarify workflow execution behavior (#1314)
cellomatt Feb 25, 2026
a1d17b4
chore(kno-11841): inline attachments docs for Resend (#1326)
cellomatt Feb 27, 2026
7ad95b4
docs(hightouch): update audience sync docs to reflect automatic creat…
samseely Feb 28, 2026
e03fbbd
docs: add skills documentation (#1330)
samseely Mar 3, 2026
69fbad0
chore(kno-11406): clarify partials usage (#1290)
cellomatt Mar 3, 2026
2a56603
chore: update docs to latest (#1332)
cjbell Mar 4, 2026
ad48558
chore: update control openapi spec to v0.1.1250 (#1331)
knock-eng-bot Mar 4, 2026
1639d8f
chore: update switchboard openapi spec (#1328)
knock-eng-bot Mar 4, 2026
206c3ed
chore(kno-11767): update outbound webhook event_data documentation (…
rachael-t Mar 4, 2026
b3c5e35
chore(kno-11910): update tenant preference FAQ for replace strategy (…
cellomatt Mar 4, 2026
dc9765a
Update headless auth examples to use popup window behavior (#1333)
cellomatt Mar 5, 2026
4cfadfd
fix(KNO-11924): Fix hardcoded account ID in New Relic dashboard start…
rachael-t Mar 5, 2026
c3e41dd
feat: combined PR for update data and recipient docs (#1325)
andy-knock Mar 5, 2026
33feec5
fix: last two comments on update data / recipient docs (#1341)
andy-knock Mar 5, 2026
36f2bfb
chore(kno-11937): clarify merge strategy and other prefs items (#1342)
cellomatt Mar 6, 2026
162554d
chore: update email migration guide for remote MCP (#1343)
cellomatt Mar 6, 2026
754410b
feat(KNO-11891): Update audience step docs (#1335)
andy-knock Mar 10, 2026
a99ce1f
chore: update control openapi spec (#1340)
knock-eng-bot Mar 11, 2026
48f2085
chore: update control openapi spec to v0.1.1271 (#1347)
knock-eng-bot Mar 11, 2026
e343a10
chore(kno-11989): add channel-level payload overrides for push and sm…
cellomatt Mar 11, 2026
90389a0
chore(KNO-12023): documenting support for throttling with useGuides (…
scotidodson Mar 11, 2026
afe2836
chore: update switchboard openapi spec (#1346)
knock-eng-bot Mar 12, 2026
a823e65
Add guide_id and guide_key to message table SQL definition (#1351)
cellomatt Mar 16, 2026
fdbbd09
clarifying empty/not empty (#1352)
scotidodson Mar 16, 2026
2c061ec
adding date filter limitation (#1353)
scotidodson Mar 16, 2026
ca4b887
Add info for Telnyx number pool messaging (#1358)
rachael-t Mar 18, 2026
cfb800e
chore: update control openapi spec (#1349)
knock-eng-bot Mar 18, 2026
ab566bc
feat: subscriptions liquid filter (#1324)
cjbell Mar 18, 2026
0e377a6
feat: MJML docs (#1355)
cjbell Mar 18, 2026
3587ad1
docs(KNO-8318): fix style guide compliance for iOS and Android push n…
webbjordy Mar 18, 2026
3414dc1
feat: add force push to CLI (#1359)
cjbell Mar 23, 2026
b7e52d0
add clarity about sandbox mode vs channel conditions (#1360)
scotidodson Mar 23, 2026
642a4f2
chore(kno-11112): reference payload size limitation in attachment doc…
scotidodson Mar 23, 2026
8dac9d5
chore(kno-12198): fix callout to use type prop (#1362)
scotidodson Mar 23, 2026
0886de7
Add concrete list of all bulk endpoints to API reference overview (#1…
andy-knock Mar 24, 2026
d79cc7a
chore(KNO-12195): Update setup instructions for Claude Desktop (#1363)
rachael-t Mar 25, 2026
5269f38
feat: agent docs (#1367)
cjbell Mar 26, 2026
e71a521
chore(kno-12233): document feed compact and rich mode (#1368)
scotidodson Mar 26, 2026
e64e299
fix(KNO-12270): Update external links on Slack docs to open in new ta…
rachael-t Mar 27, 2026
b1565ce
fix(kno-12275): improve clarity of Knock email channel purpose (#1371)
scotidodson Mar 27, 2026
5ce4635
Update agent docs and fix Image component styling (#1370)
samseely Mar 30, 2026
a0eaf31
chore (kno-12344): clarify where partial styles are injected into lay…
cellomatt Mar 31, 2026
adcd5f1
chore(KNO-12269): Remove beta callout from Trigger workflow function …
andy-knock Apr 1, 2026
ca72074
chore: update switchboard openapi spec (#1350)
knock-eng-bot Apr 1, 2026
fdec482
docs(KNO-12272): fix deprecated code examples in JavaScript SDK docs …
webbjordy Apr 1, 2026
a017666
chore: update switchboard openapi spec (#1377)
knock-eng-bot Apr 2, 2026
0248d69
fix(KNO-12388): upgrade yaml 2.8.1 → 2.8.3 (#1379)
kylemcd Apr 2, 2026
dca3c32
fix(KNO-12386): upgrade Next.js 16.1.4 → 16.2.2 (#1378)
kylemcd Apr 2, 2026
d27d539
chore: update switchboard openapi spec to v0.1.1430 (#1380)
knock-eng-bot Apr 3, 2026
d11816d
update altcha-lib frmo 1.3.0 to 1.4.1 in yarn lock (#1383)
thomaswhyyou Apr 7, 2026
a63a8da
chore: update switchboard openapi spec to v0.1.1434 (#1382)
knock-eng-bot Apr 7, 2026
5f48c88
feat: add incoming webhook docs (#1365)
JEverhart383 Apr 9, 2026
06825a1
fix(KNO-12271): Add target="_blank" to external links in docs (#1381)
rachael-t Apr 9, 2026
c6203e1
Upgrade Next.js from 16.2.2 to 16.2.3 (CVE-2026-23869) (#1390)
cjbell Apr 10, 2026
e538bf6
chore: update control openapi spec (#1389)
knock-eng-bot Apr 13, 2026
6e2ccda
feat(kno-12602): add multi-tenancy sidebar section and per-tenant tra…
scotidodson Apr 13, 2026
1eb0705
feat(kno-12444): document guides toolbar (#1384)
scotidodson Apr 14, 2026
29dcf9d
chore(kno-12665): update MJML documentation to reflect ending tag beh…
cellomatt Apr 14, 2026
8d1b358
feat(kno-12274): add guides in vue.js tutorial (#1374)
scotidodson Apr 15, 2026
1c798ab
chore: document execution order for action mappings (#1393)
JEverhart383 Apr 16, 2026
f1e38bc
Update link styling in Table rows (#1386)
rachael-t Apr 16, 2026
5edd637
chore: update control openapi spec to v0.1.1360 (#1394)
knock-eng-bot Apr 17, 2026
b6996f5
Document dark mode support for email layouts (#1397)
samseely Apr 21, 2026
5d5311f
feat: introduce explicit token grants (#1395)
cjbell Apr 21, 2026
3a3ea77
chore(kno-12808): Update pre-content variables instructions to use ge…
cellomatt Apr 21, 2026
6b56607
Remove inline code sizing (#1402)
rachael-t Apr 21, 2026
61d8aab
fix: use user/feed_ not user_feed/ for grants (#1404)
cjbell Apr 21, 2026
85cae09
chore(kno-12709): relocate per-tenant preferences to multi-tenancy se…
scotidodson Apr 21, 2026
6f9452c
chore: update control openapi spec to v0.1.1367 (#1405)
knock-eng-bot Apr 21, 2026
60b8828
feat: add docs about Cloudflare Email Support (#1396)
andy-knock Apr 22, 2026
6a10b96
feat(KNO-12791): Add workflow recipient runs to docs (#1398)
andy-knock Apr 22, 2026
88315c2
chore: add guidance on assigned liquid variables in partial styles (#…
cellomatt Apr 22, 2026
a4beed2
fix: image component and image style issues (#1406)
cellomatt Apr 23, 2026
c80ddbb
Add information about registering a new bot with MS (#1409)
rachael-t Apr 24, 2026
fb1b356
feat: add full list of endpoints to in-app docs (#1411)
cjbell Apr 24, 2026
7f488cf
Surface agent function under Knock AI sidebar section (#1410)
samseely Apr 24, 2026
7f6736e
Update instructions for setting up an incoming webook in Microsoft (#…
rachael-t Apr 27, 2026
4152618
docs(KNO-12105): update push engagement status copy in message-status…
webbjordy Apr 27, 2026
d5a7092
chore(KNO-12588): Add information about test run trigger frequency be…
rachael-t Apr 28, 2026
8ede99f
Remove trigger frequency link in FAQ (#1414)
rachael-t Apr 28, 2026
68ef715
chore: update deprecated feed event format (#1415)
cellomatt Apr 28, 2026
1e133c8
feat: add self-service account deletion docs (#1354)
cjbell Apr 29, 2026
7a22847
chore: update switchboard openapi spec (#1385)
knock-eng-bot Apr 29, 2026
f172d13
chore: flutter updates (#1418)
cjbell Apr 29, 2026
ed5c8d4
chore(KNO-12965): Move deduplication by default up on subscriptions p…
rachael-t Apr 29, 2026
ddb2700
chore: surface AI higher in IA (#1413)
JEverhart383 Apr 30, 2026
b0b50e7
feat: Add enhanced docs search indexing with headings and content
cursoragent Jan 22, 2026
8b42bd7
style: Format indexDocsForSearch.ts with Prettier
cursoragent Jan 22, 2026
b225e12
chore: frontend improvements
cjbell Jan 23, 2026
f61cbbe
fix: Correct regex ordering for markdown image removal
cursoragent Feb 24, 2026
9d756b3
fix: Remove old Algolia indexing method to prevent duplicates
cursoragent Feb 24, 2026
1192ea3
Index API overview content for search
cursoragent Apr 30, 2026
83292be
Index API overview headings for search
cursoragent Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,11 @@ Since "Guides" is a Knock feature name, we should avoid using the word "guides"

## Images

Images should always use Image component, rounded-md, mx-auto, border, border-gray-200.
Images should always use the `Image` component from `lib/mdxComponents.tsx`. The component automatically applies `rounded-md`, `border`, and `border-gray-200` styling — do not add these classes manually in `className`.

- Use `className="mx-auto"` to center images.
- Use `border={false}` to disable the default border (e.g. for logos or badges).
- When wrapping an image in a `<figure>` tag, add `className="text-center"` to the `<figure>` for `mx-auto` centering to work (the Image wrapper uses `inline-block`).

## List formatting with bold introductory text

Expand Down
35 changes: 34 additions & 1 deletion components/ui/Attributes.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { useState } from "react";
import { motion } from "framer-motion";
import { PropertyRow } from "./ApiReference/SchemaProperties/PropertyRow";

const Attributes = ({ children }) => {
Expand All @@ -11,6 +13,9 @@ type Props = {
typeSlug?: string;
nameSlug?: string;
isRequired?: boolean;
/** When provided, shows a "Show X" / "Hide X" toggle and renders children in a collapsible section. */
expandLabel?: string;
children?: React.ReactNode;
};

const Attribute = ({
Expand All @@ -19,18 +24,46 @@ const Attribute = ({
description,
typeSlug,
isRequired,
expandLabel,
children,
}: Props) => {
const [isOpen, setIsOpen] = useState(false);
const hasNested = !!expandLabel && !!children;

return (
<PropertyRow.Container>
<PropertyRow.Header>
<PropertyRow.Name>{name}</PropertyRow.Name>
{/* Pass an optional `typeSlug` to link the `type` to its definition in the docs*/}
{/* Pass an optional `typeSlug` to link the `type` to its definition in the docs */}
{type && <PropertyRow.Type href={typeSlug}>{type}</PropertyRow.Type>}
{isRequired && <PropertyRow.Required />}
</PropertyRow.Header>
{description && (
<PropertyRow.Description>{description}</PropertyRow.Description>
)}
{hasNested && (
<>
<PropertyRow.ExpandableButton
isOpen={isOpen}
onClick={() => setIsOpen(!isOpen)}
>
{isOpen ? `Hide ${expandLabel}` : `Show ${expandLabel}`}
</PropertyRow.ExpandableButton>
<motion.div
initial={false}
animate={{
height: isOpen ? "auto" : 0,
opacity: isOpen ? 1 : 0,
visibility: isOpen ? "visible" : "hidden",
}}
transition={{ duration: 0.2 }}
>
<PropertyRow.ChildProperties>
{children}
</PropertyRow.ChildProperties>
</motion.div>
</>
)}
</PropertyRow.Container>
);
};
Expand Down
12 changes: 7 additions & 5 deletions components/ui/Autocomplete.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import { MenuItem } from "@telegraph/menu";
import { Tag } from "@telegraph/tag";
import { Code, Text } from "@telegraph/typography";

import { DocsSearchItem, EndpointSearchItem } from "@/types";
import { EnhancedDocsSearchItem, EndpointSearchItem } from "@/types";

import { useInkeepModal } from "../AiChatButton";
import { useAskAi } from "../AskAiContext";
Expand Down Expand Up @@ -62,7 +62,9 @@ function createAskAiPrompt(query: string): string {
return `Can you tell me about ${query}`;
}

type ResultItem = (DocsSearchItem & BaseItem) | (EndpointSearchItem & BaseItem);
type ResultItem =
| (EnhancedDocsSearchItem & BaseItem)
| (EndpointSearchItem & BaseItem);

const algoliaAppId = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID || "";
const algoliaSearchApiKey =
Expand Down Expand Up @@ -193,7 +195,7 @@ const DocsSearchResult = ({
)}
</Text>
<Text as="span" size="1" color="gray" weight="regular">
{item.section}
{item.pageTitle ? `${item.pageTitle as string} •` : ""} {item.section}
</Text>
</Box>
);
Expand Down Expand Up @@ -400,7 +402,7 @@ const Autocomplete = () => {
],
transformResponse({ hits: hitsArray }) {
const hits = hitsArray as (
| DocsSearchItem[]
| EnhancedDocsSearchItem[]
| EndpointSearchItem[]
)[];
// Add the "Ask AI" item at the top of the results
Expand Down Expand Up @@ -823,7 +825,7 @@ const Autocomplete = () => {
/>
) : (
<DocsSearchResult
item={item as DocsSearchItem}
item={item as EnhancedDocsSearchItem}
onClick={() => autocomplete.setQuery("")}
/>
)}
Expand Down
40 changes: 36 additions & 4 deletions components/ui/Callout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ type CalloutType =
| "alert"
| "enterprise"
| "beta"
| "roadmap";
| "roadmap"
| "community_sourced";

const TYPE_CONFIG: Record<
CalloutType,
Expand All @@ -24,6 +25,26 @@ const TYPE_CONFIG: Record<
enterprise: { emoji: "🏢", bgColor: "blue" },
beta: { emoji: "🚧", bgColor: "yellow" },
roadmap: { emoji: "🛣", bgColor: "default" },
community_sourced: { emoji: "🤝", bgColor: "default" },
};

const COMMUNITY_SOURCED = {
title: "Community-sourced.",
text: (
<>
This tutorial is based on a real Knock implementation and may reflect
preferences of the original developer. If you spot something that could be
improved, we welcome{" "}
<a href="https://github.com/knocklabs/docs/" target="_blank">
contributions
</a>
. Join our{" "}
<a href="https://knock.app/join-slack" target="_blank">
community Slack
</a>{" "}
to discuss this implementation or share your own.
</>
),
};

export const Callout = ({
Expand Down Expand Up @@ -60,6 +81,17 @@ export const Callout = ({
? TYPE_CONFIG[effectiveType]?.bgColor ?? customBgColor ?? "default"
: customBgColor || "default";

const effectiveTitle =
title ??
(effectiveType === "community_sourced"
? COMMUNITY_SOURCED.title
: undefined);
const effectiveText =
text ??
(effectiveType === "community_sourced"
? COMMUNITY_SOURCED.text
: undefined);

// Ensure emoji is always a string
const emojiString = typeof emoji === "string" ? emoji : String(emoji || "💡");
const centeredProps: TgphComponentProps<typeof Stack> = isCentered
Expand Down Expand Up @@ -119,17 +151,17 @@ export const Callout = ({
py="1"
style={{ marginBottom: "0px", color: "var(--tgph-gray-12)" }}
>
{title && (
{effectiveTitle && (
<Text
as="span"
size="2"
weight="semi-bold"
style={{ color: "var(--tgph-gray-12)" }}
>
{title}{" "}
{effectiveTitle}{" "}
</Text>
)}
{text && text}
{effectiveText && effectiveText}
</Text>
</Stack>
);
Expand Down
6 changes: 5 additions & 1 deletion components/ui/CodeBlock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import yaml from "react-syntax-highlighter/dist/cjs/languages/hljs/yaml";
import kotlin from "react-syntax-highlighter/dist/cjs/languages/hljs/kotlin";
import swift from "react-syntax-highlighter/dist/cjs/languages/hljs/swift";
import bash from "react-syntax-highlighter/dist/cjs/languages/hljs/bash";
import xml from "react-syntax-highlighter/dist/cjs/languages/hljs/xml";
import { useClipboard } from "@/hooks/useClipboard";
import { useTheme } from "@/components/theme/ThemeProvider";

Expand Down Expand Up @@ -44,6 +45,9 @@ SyntaxHighlighter.registerLanguage("yaml", yaml);
SyntaxHighlighter.registerLanguage("curl", bash);
SyntaxHighlighter.registerLanguage("swift", swift);
SyntaxHighlighter.registerLanguage("kotlin", kotlin);
SyntaxHighlighter.registerLanguage("xml", xml);
SyntaxHighlighter.registerLanguage("mjml", xml);
SyntaxHighlighter.registerLanguage("vue", xml);

export type SupportedLanguage =
| "javascript"
Expand Down Expand Up @@ -186,7 +190,7 @@ export const CodeBlock: React.FC<Props> = ({
<Stack
bg="gray-2"
borderBottom="px"
borderColor="gray-2"
borderColor="gray-4"
p="2"
alignItems="center"
>
Expand Down
7 changes: 7 additions & 0 deletions components/ui/CollapsibleNavItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export type CollapsibleNavItemProps = TgphComponentProps<typeof MenuItem> & {
className?: string;
color?: "default" | "gray";
isBeta?: boolean;
isLegacy?: boolean;
};

export const CollapsibleNavItem = ({
Expand All @@ -25,6 +26,7 @@ export const CollapsibleNavItem = ({
color = "default",
className = "",
isBeta = false,
isLegacy = false,
...props
}: CollapsibleNavItemProps) => {
return (
Expand Down Expand Up @@ -52,6 +54,11 @@ export const CollapsibleNavItem = ({
Beta
</Tag>
)}
{isLegacy && (
<Tag size="0" color="yellow" ml="2">
Legacy
</Tag>
)}
<Icon
icon={ChevronRight}
size="1"
Expand Down
12 changes: 12 additions & 0 deletions components/ui/Icons.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
BookUp,
Cable,
CodeXml,
CircleHelp,
Rows3,
Expand All @@ -14,10 +15,15 @@ import {
Terminal,
Landmark,
Infinity,
RadioTower,
Rss,
Unplug,
Code,
ChevronsLeftRightEllipsis,
Package,
Sparkles,
Workflow,
Plug,
} from "lucide-react";
import {
FaNodeJs,
Expand Down Expand Up @@ -159,10 +165,16 @@ const PascalCaseIcons = {
Terminal,
Landmark,
Infinity,
RadioTower,
Rss,
Unplug,
Cable,
Code,
ChevronsLeftRightEllipsis,
Package,
Sparkles,
Workflow,
Plug,
};

export const Icons = Object.entries(PascalCaseIcons).reduce(
Expand Down
6 changes: 3 additions & 3 deletions components/ui/Page.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { createContext, useContext, useRef, useState } from "react";
import Link from "next/link";
import { ChevronLeft, ChevronRight } from "lucide-react";
import Link from "next/link";
import { createContext, useContext, useRef, useState } from "react";

import { Button } from "@telegraph/button";
import { Icon } from "@telegraph/icon";
import { Box, Stack } from "@telegraph/layout";
import { Text, Heading } from "@telegraph/typography";
import { Heading, Text } from "@telegraph/typography";

import { AskAiContext } from "../AskAiContext";
import { Breadcrumbs } from "./Breadcrumbs";
Expand Down
28 changes: 19 additions & 9 deletions components/ui/Page/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import { SidebarContent, SidebarSection } from "@/data/types";
import { Box } from "@telegraph/layout";
import { Stack } from "@telegraph/layout";
import { NavItem } from "../NavItem";
import { debounce } from "@/lib/debounce";
import { TgphComponentProps } from "@telegraph/helpers";
import { Box, Stack } from "@telegraph/layout";
import { Tag } from "@telegraph/tag";
import { useRouter } from "next/router";
import { createContext, useContext, useEffect, useState } from "react";
import {
CollapsibleNavItem,
type CollapsibleNavItemProps,
} from "../CollapsibleNavItem";
import { useState, useEffect, createContext, useContext } from "react";
import { NavItem } from "../NavItem";
import { usePageContext } from "../Page";
import {
isPathTheSame,
highlightResource,
isPathTheSame,
stripPrefix,
updateNavStyles,
useIsPageReady,
useHighlightedPath,
useIsPageReady,
} from "./helpers";
import { Tag } from "@telegraph/tag";
import { ScrollerBottomGradient } from "./ScrollerBottomGradient";
import { usePageContext } from "../Page";
import { TgphComponentProps } from "@telegraph/helpers";

interface SidebarContextType {
samePageRouting: boolean;
Expand Down Expand Up @@ -178,6 +177,7 @@ const ItemWithSubpages = ({
{...depthAdjustedCollapsibleNavItemProps}
label={section.title ?? section.slug}
isBeta={section?.isBeta}
isLegacy={section?.isLegacy}
isOpen={isOpen}
setIsOpen={setIsOpen}
>
Expand Down Expand Up @@ -205,6 +205,11 @@ const ItemWithSubpages = ({
Beta
</Tag>
)}
{page.isLegacy && (
<Tag color="yellow" ml="2" size="0">
Legacy
</Tag>
)}
</NavItem>
</Box>
);
Expand Down Expand Up @@ -248,6 +253,11 @@ const Item = ({ section, preSlug = "", depth = 0, defaultOpen }: ItemProps) => {
Beta
</Tag>
)}
{section.isLegacy && (
<Tag color="yellow" ml="2" size="0">
Legacy
</Tag>
)}
</NavItem>
);
};
Expand Down
Loading
Loading