Docs: restructure Extend section with API, Webhooks, and Apps pages#18517
Docs: restructure Extend section with API, Webhooks, and Apps pages#18517FelixMalfait merged 3 commits intomainfrom
Conversation
Restructures the developer documentation Extend section: - Moves API and Webhooks to top-level pages under Extend - Creates dedicated Apps section with Getting Started, Building, and Publishing pages - Updates navigation structure (docs.json, base-structure.json) - Updates translated docs for all locales - Updates LLMS.md references across app packages Made-with: Cursor
There was a problem hiding this comment.
Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.
There was a problem hiding this comment.
9 issues found across 96 files
Note: This PR contains a large number of files. cubic only reviews up to 75 files per PR, so some files may not have been reviewed.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/twenty-apps/internal/call-recording/LLMS.md">
<violation number="1" location="packages/twenty-apps/internal/call-recording/LLMS.md:4">
P2: The updated Rich app example link points to a repository path that does not exist, so readers will hit a 404.</violation>
</file>
<file name="packages/twenty-docs/developers/extend/webhooks.mdx">
<violation number="1" location="packages/twenty-docs/developers/extend/webhooks.mdx:102">
P1: The webhook signature check uses direct `===` comparison instead of a constant-time comparison, which weakens signature verification security.</violation>
</file>
<file name="packages/twenty-apps/community/apollo-enrich/LLMS.md">
<violation number="1" location="packages/twenty-apps/community/apollo-enrich/LLMS.md:4">
P2: The updated “Rich app example” URL points to a non-existent repository path, so readers will hit a broken link.</violation>
</file>
<file name="packages/twenty-docs/developers/extend/apps/building.mdx">
<violation number="1" location="packages/twenty-docs/developers/extend/apps/building.mdx:86">
P3: This example uses a quoted template placeholder (`'${PostCardStatus.DRAFT}'`), which won’t evaluate and will set the literal string. Use the enum value directly so the sample code is correct.</violation>
</file>
<file name="packages/twenty-docs/l/cs/developers/extend/extend.mdx">
<violation number="1" location="packages/twenty-docs/l/cs/developers/extend/extend.mdx:24">
P2: This link now targets /l/cs/developers/api, but the Czech API page still lives under extend/capabilities/apis.mdx, so this href will 404.</violation>
<violation number="2" location="packages/twenty-docs/l/cs/developers/extend/extend.mdx:27">
P2: This link now targets /l/cs/developers/webhooks, but the Czech webhooks page still lives under extend/capabilities/webhooks.mdx, so this href will 404.</violation>
<violation number="3" location="packages/twenty-docs/l/cs/developers/extend/extend.mdx:30">
P2: This link now targets /l/cs/developers/apps/apps, but the Czech apps page still lives under extend/capabilities/apps.mdx, so this href will 404.</violation>
</file>
<file name="packages/twenty-docs/l/ar/user-guide/getting-started/capabilities/what-is-twenty.mdx">
<violation number="1" location="packages/twenty-docs/l/ar/user-guide/getting-started/capabilities/what-is-twenty.mdx:38">
P2: The updated internal docs link points to a path that does not exist, which will create a broken navigation link.</violation>
</file>
<file name="packages/twenty-docs/docs.json">
<violation number="1" location="packages/twenty-docs/docs.json:361">
P2: The legacy "/developers/api-and-webhooks" redirect still targets "/developers/extend/extend", but that page was removed from navigation in this change. Update the redirect to a valid new Extend landing page (e.g., the new API overview) so old links don’t land on a missing page.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
|
|
||
| - Documentation: https://docs.twenty.com/developers/extend/capabilities/apps | ||
| - Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/cli/__tests__/apps/rich-app | ||
| - Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/app-seeds/rich-app |
There was a problem hiding this comment.
P2: The updated Rich app example link points to a repository path that does not exist, so readers will hit a 404.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-apps/internal/call-recording/LLMS.md, line 4:
<comment>The updated Rich app example link points to a repository path that does not exist, so readers will hit a 404.</comment>
<file context>
@@ -1,7 +1,7 @@
- Documentation: https://docs.twenty.com/developers/extend/capabilities/apps
-- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/cli/__tests__/apps/rich-app
+- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/app-seeds/rich-app
## Common Pitfalls
</file context>
|
|
||
| - Documentation: https://docs.twenty.com/developers/extend/capabilities/apps | ||
| - Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/cli/__tests__/apps/rich-app | ||
| - Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/app-seeds/rich-app |
There was a problem hiding this comment.
P2: The updated “Rich app example” URL points to a non-existent repository path, so readers will hit a broken link.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-apps/community/apollo-enrich/LLMS.md, line 4:
<comment>The updated “Rich app example” URL points to a non-existent repository path, so readers will hit a broken link.</comment>
<file context>
@@ -1,7 +1,7 @@
- Documentation: https://docs.twenty.com/developers/extend/capabilities/apps
-- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/cli/__tests__/apps/rich-app
+- Rich app example: https://github.com/twentyhq/twenty/tree/main/packages/twenty-sdk/src/app-seeds/rich-app
## UUID requirement
</file context>
| Dostávejte oznámení o událostech v reálném čase | ||
| </Card> | ||
| <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/extend/capabilities/apps"> | ||
| <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/apps/apps"> |
There was a problem hiding this comment.
P2: This link now targets /l/cs/developers/apps/apps, but the Czech apps page still lives under extend/capabilities/apps.mdx, so this href will 404.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/l/cs/developers/extend/extend.mdx, line 30:
<comment>This link now targets /l/cs/developers/apps/apps, but the Czech apps page still lives under extend/capabilities/apps.mdx, so this href will 404.</comment>
<file context>
@@ -20,13 +21,13 @@ Twenty je navrženo tak, aby bylo rozšiřitelné. Použijte naše rozhraní API
Dostávejte oznámení o událostech v reálném čase
</Card>
- <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/extend/capabilities/apps">
+ <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/apps/apps">
Vytvářejte přizpůsobení jako kód (Alpha)
</Card>
</file context>
| <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/apps/apps"> | |
| <Card title="Aplikace" icon="puzzle-piece" href="/l/cs/developers/extend/capabilities/apps"> |
| Programově se připojte k Twenty | ||
| </Card> | ||
| <Card title="Webhooky" icon="bell" href="/l/cs/developers/extend/capabilities/webhooks"> | ||
| <Card title="Webhooky" icon="bell" href="/l/cs/developers/webhooks"> |
There was a problem hiding this comment.
P2: This link now targets /l/cs/developers/webhooks, but the Czech webhooks page still lives under extend/capabilities/webhooks.mdx, so this href will 404.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/l/cs/developers/extend/extend.mdx, line 27:
<comment>This link now targets /l/cs/developers/webhooks, but the Czech webhooks page still lives under extend/capabilities/webhooks.mdx, so this href will 404.</comment>
<file context>
@@ -20,13 +21,13 @@ Twenty je navrženo tak, aby bylo rozšiřitelné. Použijte naše rozhraní API
Programově se připojte k Twenty
</Card>
- <Card title="Webhooky" icon="bell" href="/l/cs/developers/extend/capabilities/webhooks">
+ <Card title="Webhooky" icon="bell" href="/l/cs/developers/webhooks">
Dostávejte oznámení o událostech v reálném čase
</Card>
</file context>
| <Card title="Webhooky" icon="bell" href="/l/cs/developers/webhooks"> | |
| <Card title="Webhooky" icon="bell" href="/l/cs/developers/extend/capabilities/webhooks"> |
|
|
||
| <CardGroup cols={2}> | ||
| <Card title="API" icon="kód" href="/l/cs/developers/extend/capabilities/apis"> | ||
| <Card title="API" icon="kód" href="/l/cs/developers/api"> |
There was a problem hiding this comment.
P2: This link now targets /l/cs/developers/api, but the Czech API page still lives under extend/capabilities/apis.mdx, so this href will 404.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/l/cs/developers/extend/extend.mdx, line 24:
<comment>This link now targets /l/cs/developers/api, but the Czech API page still lives under extend/capabilities/apis.mdx, so this href will 404.</comment>
<file context>
@@ -20,13 +21,13 @@ Twenty je navrženo tak, aby bylo rozšiřitelné. Použijte naše rozhraní API
<CardGroup cols={2}>
- <Card title="API" icon="kód" href="/l/cs/developers/extend/capabilities/apis">
+ <Card title="API" icon="kód" href="/l/cs/developers/api">
Programově se připojte k Twenty
</Card>
</file context>
| <Card title="API" icon="kód" href="/l/cs/developers/api"> | |
| <Card title="API" icon="kód" href="/l/cs/developers/extend/capabilities/apis"> |
| * **الأذونات والوصول:** تحكّم في مَن يمكنه عرض بياناتك وتحريرها وإدارتها باستخدام أذونات مستندة إلى الأدوار. [تكوين الوصول](/l/ar/user-guide/permissions-access/overview). | ||
| * **الملاحظات والمهام:** أنشئ ملاحظات ومهام مرتبطة بسجلاتك لتحسين التعاون. | ||
| * **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/extend/capabilities/apis). | ||
| * **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/api). |
There was a problem hiding this comment.
P2: The updated internal docs link points to a path that does not exist, which will create a broken navigation link.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/l/ar/user-guide/getting-started/capabilities/what-is-twenty.mdx, line 38:
<comment>The updated internal docs link points to a path that does not exist, which will create a broken navigation link.</comment>
<file context>
@@ -35,7 +35,7 @@ description: Twenty هو نظام إدارة علاقات العملاء (CRM)
* **الأذونات والوصول:** تحكّم في مَن يمكنه عرض بياناتك وتحريرها وإدارتها باستخدام أذونات مستندة إلى الأدوار. [تكوين الوصول](/l/ar/user-guide/permissions-access/overview).
* **الملاحظات والمهام:** أنشئ ملاحظات ومهام مرتبطة بسجلاتك لتحسين التعاون.
-* **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/extend/capabilities/apis).
+* **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/api).
## انضم الآن
</file context>
| * **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/api). | |
| * **واجهة برمجة التطبيقات والويب هوكس:** الاتصال بالتطبيقات الأخرى وإنشاء عمليات تكامل مخصصة. [ابدأ التكامل](/l/ar/developers/extend/capabilities/apis). |
| type: FieldType.SELECT, | ||
| label: 'Status', | ||
| icon: 'IconSend', | ||
| defaultValue: `'${PostCardStatus.DRAFT}'`, |
There was a problem hiding this comment.
P3: This example uses a quoted template placeholder ('${PostCardStatus.DRAFT}'), which won’t evaluate and will set the literal string. Use the enum value directly so the sample code is correct.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/developers/extend/apps/building.mdx, line 86:
<comment>This example uses a quoted template placeholder (`'${PostCardStatus.DRAFT}'`), which won’t evaluate and will set the literal string. Use the enum value directly so the sample code is correct.</comment>
<file context>
@@ -0,0 +1,677 @@
+ type: FieldType.SELECT,
+ label: 'Status',
+ icon: 'IconSend',
+ defaultValue: `'${PostCardStatus.DRAFT}'`,
+ options: [
+ { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
</file context>
- Use crypto.timingSafeEqual() instead of === for constant-time signature comparison in the webhook validation example - Update /developers/api-and-webhooks redirect to point to /developers/extend/api instead of removed extend landing page Made-with: Cursor
There was a problem hiding this comment.
1 issue found across 2 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/twenty-docs/developers/extend/webhooks.mdx">
<violation number="1" location="packages/twenty-docs/developers/extend/webhooks.mdx:103">
P2: Guard the received signature before calling `timingSafeEqual`; otherwise invalid/missing headers can throw and break webhook handling instead of cleanly failing validation.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| .digest("hex"); | ||
|
|
||
| const receivedSignature = req.headers["x-twenty-webhook-signature"]; | ||
| const isValid = crypto.timingSafeEqual( |
There was a problem hiding this comment.
P2: Guard the received signature before calling timingSafeEqual; otherwise invalid/missing headers can throw and break webhook handling instead of cleanly failing validation.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/twenty-docs/developers/extend/webhooks.mdx, line 103:
<comment>Guard the received signature before calling `timingSafeEqual`; otherwise invalid/missing headers can throw and break webhook handling instead of cleanly failing validation.</comment>
<file context>
@@ -99,7 +99,11 @@ const expectedSignature = crypto
-const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
+const receivedSignature = req.headers["x-twenty-webhook-signature"];
+const isValid = crypto.timingSafeEqual(
+ Buffer.from(expectedSignature, "hex"),
+ Buffer.from(receivedSignature, "hex")
</file context>
|
Hey @FelixMalfait! After you've done the QA of your Pull Request, you can mark it as done here. Thank you! |
Summary
docs.json,base-structure.json,navigation.template.json)Test plan
mintlify devlocally and verify navigation structureMade with Cursor