Files
twenty/packages/create-twenty-app
Charles Bochet 37b986aa4b security: vendor @genql/cli codegen to drop undici/native-fetch (#21339)
## What

Vendors a narrowed copy of
[`@genql/cli@3.0.5`](https://github.com/remorses/genql) (MIT) into
`packages/twenty-client-sdk/src/generate/genql/` and repoints the two
client generators at it, then removes `@genql/cli` from
`twenty-client-sdk`, `twenty-sdk` and `create-twenty-app`.

## Why

`@genql/cli` was used **only** to generate the typed GraphQL client from
an SDL string. It is unmaintained and pulls in vulnerable/abandoned
transitives — `undici@5` (**30 Dependabot alerts**), `native-fetch`,
`listr`, `yargs`, etc. None of these were ever executed by Twenty: the
sole consumer of `undici`/`native-fetch` is `@genql/cli`'s live-endpoint
schema-introspection path, and Twenty always passes a schema string,
never an endpoint.

Removing the package eliminates the dependency at the source — for
Twenty and for scaffolded end-user apps.

## What changed vs upstream

The vendored copy (`genql/README.md` + `genql/LICENSE`) keeps the
`render/` and `runtime/` trees verbatim and narrows the orchestration:

- **Dropped the endpoint/introspection path** (`schema/fetchSchema.ts`)
— the only `undici`/`native-fetch`/`qs` consumer.
- **Dropped `listr`** — generation tasks run as plain sequential `async`
functions (file contents unchanged).
- **Replaced `fs-extra`/`mkdirp`/`rimraf`** with `node:fs`.
- **Runtime templates are imported as `?raw`** and bundled, instead of
read from `node_modules` at generation time.
- **Kept `prettier@^2.8` and `@graphql-tools/*`** so the generated
output is byte-for-byte identical.

## Verification

- **Byte-identical output**: regenerating the metadata client from its
committed schema produces a recursive-diff-clean result vs the previous
`@genql/cli` output (including the copied `runtime/` folder). The core
client generates and esbuild-bundles cleanly.
- The public `twenty-client-sdk/generate` barrel API is unchanged
(twenty-server / twenty-sdk consumers unaffected).
- `undici@^5`, `native-fetch`, `@genql/cli`, `listr`, `yargs@^15` and
`subscriptions-transport-ws@0.9` are gone from `yarn.lock` (net −364
lines).
- `twenty-client-sdk` and `twenty-sdk` typecheck, lint and build;
`twenty-client-sdk` tests pass (9/9).

## Notes

- The vendored folder is excluded from `oxlint`/`oxfmt` (it is
third-party code, with `@ts-nocheck` on the verbatim renderers,
mirroring the generated output).
- Stacks conceptually on #21334 (drops `@genql/runtime`); the two are
independent and only overlap trivially in `yarn.lock`. `@genql/runtime`
is intentionally left for that PR.
2026-06-08 20:46:45 +02:00
..
2026-06-03 16:45:51 +00:00
2026-05-20 15:12:39 +00:00
2026-04-03 12:44:03 +00:00
2026-04-03 12:44:03 +00:00
2026-04-03 12:44:03 +00:00

Twenty logo

Create Twenty App

NPM version License Join the community on Discord

The official scaffolding CLI for building apps on top of Twenty CRM. Sets up a ready-to-run project with twenty-sdk.

Quick start

npx create-twenty-app@latest my-twenty-app
cd my-twenty-app
yarn twenty dev

The scaffolder will:

  1. Create a new project with TypeScript, linting, tests, and a preconfigured twenty CLI
  2. Start a local Twenty server via Docker (pulls the latest image automatically)
  3. Authenticate with the development API key

Options

Flag Description
--name <name> Set the app name
--display-name <displayName> Set the display name
--description <description> Set the description
--url <url> Twenty workspace URL (default: http://localhost:2020)
--authentication-method <method> oauth or apiKey (default: apiKey for local, oauth for remote)

Documentation

Full documentation is available at docs.twenty.com/developers/extend/apps:

  • Quick Start — scaffold, run a local server, sync your code
  • Concepts — how apps work: entity model, sandboxing, lifecycle
  • Operations — CLI, testing, CI, deploy and publish

Troubleshooting

  • Server not starting: check Docker is running (docker info), then try yarn twenty docker:logs.
  • Auth not working: run yarn twenty remote:add --local to re-authenticate.
  • Types not generated: ensure yarn twenty dev is running — it auto-generates the typed client.

Contributing