Abdullah. and GitHub
a40612ef9e
fix: axios related dependabot alerts ( #17821 )
...
Resolves [Dependabot Alert
436](https://github.com/twentyhq/twenty/security/dependabot/436 ),
[Dependabot Alert
437](https://github.com/twentyhq/twenty/security/dependabot/437 ) and
[Dependabot Alert
438](https://github.com/twentyhq/twenty/security/dependabot/438 ).
2026-02-09 22:56:34 +01:00
Charles Bochet and GitHub
987ed845ac
Release Twenty SDK 0.5.0 ( #17818 )
...
As per title + create-twenty-app
2026-02-09 19:16:24 +01:00
martmull and GitHub
9162685b2e
Reorganize logic function files ( #17766 )
...
reorganize according to
<img width="1243" height="725" alt="Pasted Graphic"
src="https://github.com/user-attachments/assets/ba65dd10-8eec-4b13-ad49-9726edd3b79c "
/>
Not working yet
2026-02-09 12:36:39 +01:00
martmull and GitHub
23df33172a
Fix twenty sdk build 5 ( #17744 )
...
use prepublish instead of prepack
2026-02-05 15:54:06 +01:00
martmull and GitHub
de5764ede0
Fix twenty sdk build ( #17729 )
...
- remove worksapce:* dependencies from published packages
- Use common tsconfig.ts in create-twenty-app
- Increase version to 0.4.4
2026-02-05 14:25:49 +01:00
Raphaël Bosi and GitHub
309785f7ff
Refactor twenty-sdk folder stucture ( #17733 )
...
Only three barrels: `root`, `ui` and `front-component`
2026-02-05 13:14:27 +01:00
9604dbe78a
Front components communication between host and remote ( #17716 )
...
Co-authored-by: Charles Bochet <charles@twenty.com >
2026-02-05 11:44:02 +01:00
martmull and GitHub
bef643970b
Fix twenty sdk build 3 ( #17715 )
...
final final fix
2026-02-04 15:21:17 +00:00
nitin and GitHub
660a15b721
[FRONT COMPONENT] Stories in twenty-sdk for front component generation and upon render interactivity ( #17675 )
...
closes https://github.com/twentyhq/core-team-issues/issues/2179
2026-02-04 12:39:54 +00:00
martmull and GitHub
6407474461
Fix build without nx build ( #17700 )
...
as title
2026-02-04 11:14:28 +00:00
Raphaël Bosi and GitHub
9b8eacb7f7
[FRONT COMPONENTS] Expose twenty UI in twenty sdk ( #17645 )
...
- An app will declare its `twenty-sdk` version in the manifest.
- `twenty-sdk` will be served by a CDN to be imported in front component
host.
- When we render the host we will load twenty-ui through the correct
version of the sdk
We will proceed this way because twenty-ui is not mature enough yet to
be deployed as its own package. So instead, since the sdk is already
deployed as its own package, we will serve the ui with it. It allows us
to have versioning to handle breaking changes in twenty-ui.
2026-02-04 10:43:08 +00:00
martmull and GitHub
e10e0b337e
Fix twenty sdk build ( #17696 )
...
- add twenty-ui in dist/vendor folder
- fix ts issue due to react version mismatch
2026-02-04 08:46:13 +00:00
Raphaël Bosi and GitHub
66d7182d02
Remote dom twenty UI POC ( #17652 )
...
Create a proof of concept which allows us to use twenty-ui in the
remote-dom.
For now only the button is allowed.
https://github.com/user-attachments/assets/e5441d2c-eb63-4b99-931b-86ee14621393
Known limitation: The icons are not yet available
2026-02-03 15:54:18 +00:00
Raphaël Bosi and GitHub
f0bc9fcb43
[FRONT COMPONENTS] Move to twenty-sdk ( #17587 )
...
Move front components from twenty-shared to twenty-sdk
2026-02-02 12:21:53 +00:00
martmull and GitHub
b9586769b9
2081 extensibility publish cli tools and update doc with recent changes ( #17495 )
...
- increase to 0.4.0
- update READMEs and doc
2026-01-27 20:49:33 +00:00
martmull and GitHub
f4ca69a474
Implement dev mode nice UI ( #17471 )
...
Implement a nice terminal UI for dev mode using INK
<img width="1512" height="721" alt="image"
src="https://github.com/user-attachments/assets/79a71f37-1b31-4761-9e8d-718ef029ceb8 "
/>
2026-01-27 15:34:28 +00:00
Charles Bochet and GitHub
5a94ef7dbb
Move sdk watcher back to esbuild ( #17316 )
...
Demo of current state
https://github.com/user-attachments/assets/034aff50-9981-4c81-b5ce-410a07b8dbc9
2026-01-22 13:04:43 +01:00
Charles Bochet and GitHub
5ee6853d7e
Rework SDK watcher ( #17305 )
2026-01-21 16:18:54 +01:00
Charles Bochet and GitHub
d74d74da4c
Improvements on SDK watcher ( #17291 )
...
# Improve cross-entity duplicate detection in manifest validation
- Refactored findDuplicates to receive the full manifest, enabling
cross-entity duplicate checks
-ObjectExtensionEntityBuilder now validates that extension field IDs
don't conflict with object field IDs
- Renamed DuplicateId type to EntityIdWithLocation for clarity
- Updated all entity builders to use the new signature
2026-01-21 15:31:38 +01:00
Charles Bochet and GitHub
29c0c952e7
Add Front components to SDK ( #17259 )
...
## Add `frontComponent` entity type to SDK
This PR adds a new `frontComponent` entity type at parity with
`serverlessFunction`. Front components are React components that can be
defined and bundled as part of Twenty applications.
### Changes
#### New Entity Type
- Added `FRONT_COMPONENT` to `SyncableEntity` enum
- Front components use `*.front-component.tsx` file naming convention
- CLI command `twenty app:add` now includes `front-component` as an
option
#### SDK Application Layer (`twenty-sdk`)
- Added `defineFrontComponent()` function for defining front component
configurations with validation
- Added `FrontComponentConfig` type for component configuration
- Added `getFrontComponentBaseFile()` template generator for scaffolding
new front components
- Added `loadFrontComponentModule()` to load front component modules and
extract component metadata
#### Shared Types (`twenty-shared`)
- Added `FrontComponentManifest` type with `universalIdentifier`,
`name`, `description`, `componentPath`, and `componentName` fields
- Updated `ApplicationManifest` to include optional `frontComponents`
array
#### Manifest Build System
- Updated `manifest-build.ts` to discover and load
`*.front-component.tsx` files
- Updated `manifest-validate.ts` to validate front components and check
for duplicate IDs
- Updated `manifest-display.ts` to display front component count in
build summary
- Updated `manifest-plugin.ts` to display front component entry points
and watch `.tsx` files
#### Template (`create-twenty-app`)
- New applications now include a sample
`hello-world.front-component.tsx` file
#### Tests
- Added unit tests for `defineFrontComponent()`
- Added unit tests for `getFrontComponentBaseFile()`
2026-01-20 05:54:14 +00:00
5cef07af45
Twenty SDK iteration ( #17223 )
...
Opening a PR to merge the wip work by @martmull
We will re-organize twenty-sdk in an upcoming PR
---------
Co-authored-by: martmull <martmull@hotmail.fr >
2026-01-19 09:41:54 +01:00
martmull and GitHub
d55b83375d
Allow app to extend object ( #17116 )
...
- exports `extendObject` utils from `twenty-sdk`
- define `*.object-extension.ts` filename pattern to extend and object
- handle object-extension configs in manifest
2026-01-13 15:07:14 +00:00
martmull and GitHub
936ec06fe8
Improve application ast 3 ( #17061 )
...
- fix should generate
- fix errors not displayed properly
2026-01-10 14:52:28 +00:00
martmull and GitHub
3509838a3a
Improve application ast 2 ( #17045 )
...
fix some issues with cli tools
2026-01-09 14:54:13 +00:00
martmull and GitHub
40eef5c464
Improve application ast ( #17016 )
...
# Summary
- Introduces a new, flexible folder structure for Twenty SDK
applications using file suffix-based entity detection
- Adds defineApp, defineFunction, defineObject, and defineRole helper
functions with built-in validation
- Refactors manifest loading to use jiti runtime evaluation for
TypeScript config files
- Separates validation logic into dedicated module with comprehensive
error reporting
# New Application Folder Structure
Applications now use a convention-over-configuration approach where
entities are detected by their file suffix, allowing flexible
organization within the src/app/ folder.
# Required Structure
my-app/
├── package.json
├── yarn.lock
└── src/
├── app/
│ └── application.config.ts # Required - main application configuration
└── utils/ # Optional - handler implementations & utilities
# Entity Detection by File Suffix
- *.object.ts - Custom object definitions
- *.function.ts - Serverless function definitions
- *.role.ts - Role definitions
# Supported Folder Organizations
## Traditional (by type):
src/app/
├── application.config.ts
├── objects/
│ └── postCard.object.ts
├── functions/
│ └── createPostCard.function.ts
└── roles/
└── admin.role.ts
## Feature-based:
src/app/
├── application.config.ts
└── post-card/
├── postCard.object.ts
├── createPostCard.function.ts
└── postCardAdmin.role.ts
## Flat:
src/app/
├── application.config.ts
├── postCard.object.ts
├── createPostCard.function.ts
└── admin.role.ts
# New Helper Functions
## defineApp(config)
import { defineApp } from 'twenty-sdk';
export default defineApp({
universalIdentifier: '4ec0391d-...',
displayName: 'My App',
description: 'App description',
icon: 'IconWorld',
});
## defineObject(config)
import { defineObject, FieldType } from 'twenty-sdk';
export default defineObject({
universalIdentifier: '54b589ca-...',
nameSingular: 'postCard',
namePlural: 'postCards',
labelSingular: 'Post Card',
labelPlural: 'Post Cards',
icon: 'IconMail',
fields: [
{
universalIdentifier: '58a0a314-...',
type: FieldType.TEXT,
name: 'content',
label: 'Content',
},
],
});
## defineFunction(config)
import { defineFunction } from 'twenty-sdk';
import { myHandler } from '../utils/my-handler';
export default defineFunction({
universalIdentifier: 'e56d363b-...',
name: 'My Function',
handler: myHandler,
triggers: [
{
universalIdentifier: 'c9f84c8d-...',
type: 'route',
path: '/my-route',
httpMethod: 'POST',
},
],
});
## defineRole(config)
import { defineRole, PermissionFlag } from 'twenty-sdk';
export default defineRole({
universalIdentifier: 'b648f87b-...',
label: 'App User',
objectPermissions: [
{
objectNameSingular: 'postCard',
canReadObjectRecords: true,
},
],
permissionFlags: [PermissionFlag.UPLOAD_FILE],
});
# Test plan
- Verify npx twenty app sync works with new folder structure
- Verify npx twenty app dev works with new folder structure
- Verify validation errors display correctly for invalid configs
- Verify all three folder organization styles work (traditional,
feature-based, flat)
- Run existing E2E tests to ensure backward compatibility
2026-01-09 13:06:30 +00:00
martmull and GitHub
bb73cbc380
1774 extensibility v1 create an exhaustive documentation readme or dedicated section in twenty contributing doc ( #16751 )
...
As title
<img width="1108" height="894" alt="image"
src="https://github.com/user-attachments/assets/e2dc7e12-72e3-4ca3-ac7b-a94de547f82a "
/>
2025-12-22 15:19:11 +01:00
martmull and GitHub
57dc1ae6e8
Fix create twenty app template ( #16708 )
...
Adds a default function role to scaffolded application
2025-12-19 16:40:12 +01:00
martmull and GitHub
1cbbd04761
Function trigger updates 2 ( #16608 )
...
- Improves route trigger job performances
- expose function params types
## Before
<img width="938" height="271" alt="image"
src="https://github.com/user-attachments/assets/5752ba64-f31d-44ed-974d-536e63458f2c "
/>
## After
<img width="1000" height="559" alt="image"
src="https://github.com/user-attachments/assets/b1f4927a-5f43-49f0-a606-244c72356772 "
/>
2025-12-16 18:20:26 +01:00
martmull and GitHub
9b00084fb0
Vendor twenty-shared into twenty-sdk ( #16592 )
...
twenty-shared is not bundled properly when deploying twenty-sdk to npm.
This aims to fix that issue
2025-12-16 16:48:38 +01:00
martmull and GitHub
7f1e69740a
1895 extensibility v1 application tokens ( #16365 )
...
First PR to implement application tokens
- add new application role in twenty-server
- move duplicated constants and types to twenty-shared
- will add role configuration utils into twenty-sdk in another PR
2025-12-08 10:42:46 +01:00
martmull and GitHub
5e8fbc7c5c
1825 extensibility v1 see serverless logs using subscriptions in twnty cli or settings serverkess section ( #16321 )
...
- Adds a log section to settings serverless functions test tab
<img width="1303" height="827" alt="image"
src="https://github.com/user-attachments/assets/2ce70558-91bc-4cfc-aced-42ac9e0226bf "
/>
- Adds a new subscription endpoint to graphql api
`serverlessFunctionLogs` that that emit function logs
- Adds a new command `twenty app logs` to `twenty-sdk` to watch logs in
terminal
<img width="1109" height="182" alt="image"
src="https://github.com/user-attachments/assets/2e874060-e99d-4978-ab9c-c91e52cb7478 "
/>
<img width="1061" height="176" alt="image"
src="https://github.com/user-attachments/assets/1f533e32-7435-4d7b-89c6-d1154816a8ab "
/>
- add new version for create-twenty-app and twenty-sdk `0.1.3`
2025-12-04 16:40:58 +01:00
martmull and GitHub
267bfcadf8
Twenty sdk follow up ( #16290 )
...
as title
2025-12-03 15:50:16 +00:00
martmull and GitHub
ea79425fc0
Fix twenty sdk and create twenty app ( #16282 )
...
As title
2025-12-03 15:12:34 +01:00
martmull and GitHub
e498367e2f
Merge twenty-cli into twenty-sdk ( #16150 )
...
- Moves twenty-cli content into twenty-sdk
- add a new twenty-sdk:0.1.0 version
- this new twenty-sdk exports a cli command called 'twenty' (like
twenty-cli before)
- deprecates twenty-cli
- simplify app init command base-project
- use `twenty-sdk:0.1.0` in base project
- move the "twenty-sdk/application" barrel to "twenty-sdk"
- add `create-twenty-app` package
<img width="1512" height="919" alt="image"
src="https://github.com/user-attachments/assets/007bef45-4e71-419a-9213-cebed376adbf "
/>
<img width="1506" height="929" alt="image"
src="https://github.com/user-attachments/assets/3de2fec6-1624-4923-ae13-f4e1cf165eb5 "
/>
2025-12-01 11:44:35 +01:00
martmull and GitHub
1fa9c45879
Fix twenty sdk ( #15991 )
...
As title
2025-11-21 14:28:15 +00:00
Abdullah. and GitHub
222feb90b4
fix: update glob version to 11.1.0 ( #15884 )
...
Some Glob CLI related alerts were generated last night. I believe
they're safe to dismiss since I do not expect us to use the Glob CLI in
production environment, and those alerts do not impact the API, but
still updating the dependency version just in case.
Not sure if this would resolve all/any of the alerts since glob is a
dependency for many other dependencies, so a good number of dependency
variants are pulled in.
The alert that confirms it's just a CLI related vulnerability:
[Dependabot Alert
307](https://github.com/twentyhq/twenty/security/dependabot/307 )
2025-11-18 17:12:53 +01:00
2a44bde848
Dynamic grql api wrapper on application sync ( #15791 )
...
# Introduction
Important note: for the moment testing this locally will require some
hack due to latest twenty-sdk not being published.
You will need to build twenty-cli and `cd packages/twenty-cli && yarn
link`
To finally sync the app in your app folder as `cd app-folder && twenty
app sync`
close https://github.com/twentyhq/core-team-issues/issues/1863
In this PR is introduced the generate sdk programmatic call to
[genql](https://genql.dev/ ) exposed in a `client` barrel of `twenty-sdk`
located in this package as there's high chances that will add a codegen
layer above it at some point ?
The cli calls this method after a sync application and writes a client
in a generated folder. It will make a graql introspection query on the
whole workspace. We should later improve that and only filter by current
applicationId and its dependencies ( when twenty-standard application is
introduced )
Fully typesafe ( input, output, filters etc ) auto-completed client
## Hello-world app serverless refactor
<img width="2480" height="1326" alt="image"
src="https://github.com/user-attachments/assets/b18ea372-b21d-4560-8fbc-1dc348427a95 "
/>
---------
Co-authored-by: martmull <martmull@hotmail.fr >
2025-11-17 14:46:59 +01:00
martmull and GitHub
9880f192a5
Move composite types to twenty-shared ( #15741 )
2025-11-10 22:11:52 +01:00
martmull and GitHub
aa48a68a34
Increase packages versions ( #15694 )
...
As title
2025-11-07 10:46:43 +01:00
martmull and GitHub
a6cc80eedd
1751 extensibility twenty sdk v2 use twenty sdk to define a serverless function trigger ( #15347 )
...
This PR adds 2 columns handlerPath and handlerName in serverlessFunction
to locate the entrypoint of a serverless in a codebase
It adds the following decorators in twenty-sdk:
- ServerlessFunction
- DatabaseEventTrigger
- RouteTrigger
- CronTrigger
- ApplicationVariable
It still supports deprecated entity.manifest.jsonc
Overall code needs to be cleaned a little bit, but it should work
properly so you can try to test if the DEVX fits your needs
See updates in hello-world application
```typescript
import axios from 'axios';
import {
DatabaseEventTrigger,
ServerlessFunction,
RouteTrigger,
CronTrigger,
ApplicationVariable,
} from 'twenty-sdk';
@ApplicationVariable({
universalIdentifier: 'dedc53eb-9c12-4fe2-ba86-4a2add19d305',
key: 'TWENTY_API_KEY',
description: 'Twenty API Key',
isSecret: true,
})
@DatabaseEventTrigger({
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
})
@RouteTrigger({
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
})
@CronTrigger({
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
})
@ServerlessFunction({
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
})
class CreateNewPostCard {
main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
}
export const createNewPostCardHandler = new CreateNewPostCard().main;
```
### [edit] V2
After the v1 proposal, I see that using a class method to define the
serverless function handler is pretty confusing. Lets leave
serverlessFunction configuration decorators on the class, but move the
handler like before. Here is the v2 hello-world serverless function:
```typescript
import axios from 'axios';
import {
DatabaseEventTrigger,
ServerlessFunction,
RouteTrigger,
CronTrigger,
ApplicationVariable,
} from 'twenty-sdk';
@ApplicationVariable({
universalIdentifier: 'dedc53eb-9c12-4fe2-ba86-4a2add19d305',
key: 'TWENTY_API_KEY',
description: 'Twenty API Key',
isSecret: true,
})
@DatabaseEventTrigger({
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
})
@RouteTrigger({
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
})
@CronTrigger({
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
})
@ServerlessFunction({
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
})
export class ServerlessFunctionDefinition {}
export const main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
```
### [edit] V3
After the v2 proposal, we don't really like decorators on empty classes.
We decided to go with a Vercel approach with a config constant
```typescript
import axios from 'axios';
import { ServerlessFunctionConfig } from 'twenty-sdk';
export const main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
export const config: ServerlessFunctionConfig = {
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
routeTriggers: [
{
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
}
],
cronTriggers: [
{
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
}
],
databaseEventTriggers: [
{
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
}
]
}
```
2025-10-29 16:51:43 +00:00
martmull and GitHub
033c28a3d5
1750 extensibility twenty sdk v2 use twenty sdk to define an object ( #15230 )
...
We maintain jsonc object definition but will deprecate them pretty soon
## Before
<img width="1512" height="575" alt="image"
src="https://github.com/user-attachments/assets/d2fa6ca4-c456-4aa9-a1e3-845b61839718 "
/>
## After
<img width="1260" height="555" alt="image"
src="https://github.com/user-attachments/assets/ba72f4cf-d443-4967-913c-029bc71f3f48 "
/>
2025-10-22 13:18:23 +00:00
Weiko and GitHub
76c2dc020e
Add twenty-sdk ( #15208 )
2025-10-20 15:54:08 +02:00