twenty/packages/twenty-apps/hello-world
Charles Bochet 9d57bc39e5
Migrate from ESLint to OxLint (#18443)
## Summary

Fully replaces ESLint with OxLint across the entire monorepo:

- **Replaced all ESLint configs** (`eslint.config.mjs`) with OxLint
configs (`.oxlintrc.json`) for every package: `twenty-front`,
`twenty-server`, `twenty-emails`, `twenty-ui`, `twenty-shared`,
`twenty-sdk`, `twenty-zapier`, `twenty-docs`, `twenty-website`,
`twenty-apps/*`, `create-twenty-app`
- **Migrated custom lint rules** from ESLint plugin format to OxLint JS
plugin system (`@oxlint/plugins`), including
`styled-components-prefixed-with-styled`, `no-hardcoded-colors`,
`sort-css-properties-alphabetically`,
`graphql-resolvers-should-be-guarded`,
`rest-api-methods-should-be-guarded`, `max-consts-per-file`, and
Jotai-related rules
- **Migrated custom rule tests** from ESLint `RuleTester` + Jest to
`oxlint/plugins-dev` `RuleTester` + Vitest
- **Removed all ESLint dependencies** from `package.json` files and
regenerated lockfiles
- **Updated Nx targets** (`lint`, `lint:diff-with-main`, `fmt`) in
`nx.json` and per-project `project.json` to use `oxlint` commands with
proper `dependsOn` for plugin builds
- **Updated CI workflows** (`.github/workflows/ci-*.yaml`) — no more
ESLint executor
- **Updated IDE setup**: replaced `dbaeumer.vscode-eslint` with
`oxc.oxc-vscode` extension, configured `source.fixAll.oxc` and
format-on-save with Prettier
- **Replaced all `eslint-disable` comments** with `oxlint-disable`
equivalents across the codebase
- **Updated docs** (`twenty-docs`) to reference OxLint instead of ESLint
- **Renamed** `twenty-eslint-rules` package to `twenty-oxlint-rules`

### Temporarily disabled rules (tracked in `OXLINT_MIGRATION_TODO.md`)

| Rule | Package | Violations | Auto-fixable |
|------|---------|-----------|-------------|
| `twenty/sort-css-properties-alphabetically` | twenty-front | 578 | Yes
|
| `typescript/consistent-type-imports` | twenty-server | 3814 | Yes |
| `twenty/max-consts-per-file` | twenty-server | 94 | No |

### Dropped plugins (no OxLint equivalent)

`eslint-plugin-project-structure`, `lingui/*`, `@stylistic/*`,
`import/order`, `prefer-arrow/prefer-arrow-functions`,
`eslint-plugin-mdx`, `@next/eslint-plugin-next`,
`eslint-plugin-storybook`, `eslint-plugin-react-refresh`. Partial
coverage for `jsx-a11y` and `unused-imports`.

### Additional fixes (pre-existing issues exposed by merge)

- Fixed `EmailThreadPreview.tsx` broken import from main rename
(`useOpenEmailThreadInSidePanel`)
- Restored truthiness guard in `getActivityTargetObjectRecords.ts`
- Fixed `AgentTurnResolver` return types to match entity (virtual
`fileMediaType`/`fileUrl` are resolved via `@ResolveField()`)

## Test plan

- [x] `npx nx lint twenty-front` passes
- [x] `npx nx lint twenty-server` passes
- [x] `npx nx lint twenty-docs` passes
- [x] Custom oxlint rules validated with Vitest: `npx nx test
twenty-oxlint-rules`
- [x] `npx nx typecheck twenty-front` passes
- [x] `npx nx typecheck twenty-server` passes
- [x] CI workflows trigger correctly with `dependsOn:
["twenty-oxlint-rules:build"]`
- [x] IDE linting works with `oxc.oxc-vscode` extension
2026-03-06 01:03:50 +01:00
..
src [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
.gitignore [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
.nvmrc [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
.oxlintrc.json Migrate from ESLint to OxLint (#18443) 2026-03-06 01:03:50 +01:00
.yarnrc.yml [Apps] Get rid of .yarn binaries in apps (#17306) 2026-01-21 17:23:16 +00:00
LLMS.md [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
package.json Migrate from ESLint to OxLint (#18443) 2026-03-06 01:03:50 +01:00
README.md [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
tsconfig.json [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
tsconfig.spec.json [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
vitest.config.ts [CREATE_APP] Integration testing scaffold (#18345) 2026-03-04 13:12:13 +01:00
yarn.lock Migrate from ESLint to OxLint (#18443) 2026-03-06 01:03:50 +01:00

This is a Twenty application project bootstrapped with create-twenty-app.

Getting Started

First, authenticate to your workspace:

yarn twenty auth:login

Then, start development mode to sync your app and watch for changes:

yarn twenty app:dev

Open your Twenty instance and go to /settings/applications section to see the result.

Available Commands

Run yarn twenty help to list all available commands. Common commands:

# Authentication
yarn twenty auth:login     # Authenticate with Twenty
yarn twenty auth:logout    # Remove credentials
yarn twenty auth:status    # Check auth status
yarn twenty auth:switch    # Switch default workspace
yarn twenty auth:list      # List all configured workspaces

# Application
yarn twenty app:dev        # Start dev mode (watch, build, sync, and auto-generate typed client)
yarn twenty entity:add     # Add a new entity (object, field, function, front-component, role, view, navigation-menu-item)
yarn twenty function:logs  # Stream function logs
yarn twenty function:execute  # Execute a function with JSON payload
yarn twenty app:uninstall  # Uninstall app from workspace

Integration Tests

If your project includes the example integration test (src/__tests__/app-install.integration-test.ts), you can run it with:

# Make sure a Twenty server is running at http://localhost:3000
yarn test

The test builds and installs the app, then verifies it appears in the applications list. Test configuration (API URL and API key) is defined in vitest.config.ts.

LLMs instructions

Main docs and pitfalls are available in LLMS.md file.

Learn More

To learn more about Twenty applications, take a look at the following resources:

You can check out the Twenty GitHub repository - your feedback and contributions are welcome!