diff --git a/README.md b/README.md
index 7ee80a80f..bf673ded8 100644
--- a/README.md
+++ b/README.md
@@ -44,7 +44,7 @@ npx create-better-t-stack@latest
- Databases: SQLite, PostgreSQL, MySQL, MongoDB (or none)
- ORMs: Drizzle, Prisma, Mongoose (or none)
- Auth: Better Auth or Clerk (optional)
-- Addons: Turborepo, Nx, PWA, Tauri, Electrobun, Biome, Lefthook, Husky, Starlight, Fumadocs, Ultracite, Oxlint, MCP, OpenTUI, WXT, Skills
+- Addons: Turborepo, Nx, PWA, Tauri, Electrobun, Biome, Lefthook, Husky, Starlight, Fumadocs, Ultracite, Oxc, MCP, OpenTUI, WXT, Skills
- Examples: Todo, AI
- DB Setup: Turso, Neon, Supabase, Prisma PostgreSQL, MongoDB Atlas, Cloudflare D1, Docker
- Web Deploy: Cloudflare Workers
diff --git a/apps/cli/README.md b/apps/cli/README.md
index f1d880ee8..8c5af97ea 100644
--- a/apps/cli/README.md
+++ b/apps/cli/README.md
@@ -41,7 +41,7 @@ Follow the prompts to configure your project or use the `--yes` flag for default
| **Database Setup** | • Turso (SQLite)
• Cloudflare D1 (SQLite)
• Neon (PostgreSQL)
• Supabase (PostgreSQL)
• Prisma Postgres
• MongoDB Atlas
• None (manual setup) |
| **Authentication** | • Better Auth
• Clerk |
| **Styling** | Tailwind CSS with a shared shadcn/ui package for React web apps |
-| **Addons** | • PWA support
• Tauri (desktop applications)
• Electrobun (lightweight desktop shell)
• Starlight and Fumadocs (documentation sites)
• Biome, Oxlint, Ultracite (linting and formatting)
• Lefthook, Husky (Git hooks)
• MCP, Skills (agent tooling)
• OpenTUI, WXT (platform extensions)
• Turborepo or Nx (monorepo orchestration) |
+| **Addons** | • PWA support
• Tauri (desktop applications)
• Electrobun (lightweight desktop shell)
• Starlight and Fumadocs (documentation sites)
• Biome, Oxc, Ultracite (linting and formatting)
• Lefthook, Husky (Git hooks)
• MCP, Skills (agent tooling)
• OpenTUI, WXT (platform extensions)
• Turborepo or Nx (monorepo orchestration) |
| **Examples** | • Todo app
• AI Chat interface (using Vercel AI SDK) |
| **Developer Experience** | • Automatic Git initialization
• Package manager choice (npm, pnpm, bun)
• Automatic dependency installation |
@@ -60,7 +60,7 @@ Options:
--auth Authentication (better-auth, clerk, none)
--payments Payments provider (polar, none)
--frontend Frontend types (tanstack-router, react-router, tanstack-start, next, nuxt, svelte, solid, astro, native-bare, native-uniwind, native-unistyles, none)
- --addons Additional addons (pwa, tauri, electrobun, starlight, biome, lefthook, husky, mcp, turborepo, nx, fumadocs, ultracite, oxlint, opentui, wxt, skills, none)
+ --addons Additional addons (pwa, tauri, electrobun, starlight, biome, lefthook, husky, mcp, turborepo, nx, fumadocs, ultracite, oxc, opentui, wxt, skills, none)
--examples Examples to include (todo, ai, none)
--git Initialize git repository
--no-git Skip git initialization
diff --git a/apps/cli/src/constants.ts b/apps/cli/src/constants.ts
index 98885d86c..92b1ccf88 100644
--- a/apps/cli/src/constants.ts
+++ b/apps/cli/src/constants.ts
@@ -62,7 +62,7 @@ export const ADDON_COMPATIBILITY = {
starlight: [],
ultracite: [],
mcp: [],
- oxlint: [],
+ oxc: [],
fumadocs: [],
opentui: [],
wxt: [],
diff --git a/apps/cli/src/helpers/addons/addons-setup.ts b/apps/cli/src/helpers/addons/addons-setup.ts
index 58398a991..f261a49fd 100644
--- a/apps/cli/src/helpers/addons/addons-setup.ts
+++ b/apps/cli/src/helpers/addons/addons-setup.ts
@@ -10,7 +10,7 @@ import { AddonSetupError, UserCancelledError } from "../../utils/errors";
import { cliConsola } from "../../utils/terminal-output";
import { setupFumadocs } from "./fumadocs-setup";
import { setupMcp } from "./mcp-setup";
-import { setupOxlint } from "./oxlint-setup";
+import { setupOxc } from "./oxc-setup";
import { setupSkills } from "./skills-setup";
import { setupStarlight } from "./starlight-setup";
import { setupTauri } from "./tauri-setup";
@@ -63,7 +63,7 @@ export async function setupAddons(config: ProjectConfig) {
const hasBiome = addons.includes("biome");
const hasHusky = addons.includes("husky");
const hasLefthook = addons.includes("lefthook");
- const hasOxlint = addons.includes("oxlint");
+ const hasOxc = addons.includes("oxc");
if (hasUltracite) {
const gitHooks: string[] = [];
@@ -75,14 +75,14 @@ export async function setupAddons(config: ProjectConfig) {
await runAddonStep("biome", () => setupBiome(projectDir));
}
- if (hasOxlint) {
- await runSetup(() => setupOxlint(projectDir, config.packageManager));
+ if (hasOxc) {
+ await runSetup(() => setupOxc(projectDir, config.packageManager));
}
if (hasHusky || hasLefthook) {
- let linter: "biome" | "oxlint" | undefined;
- if (hasOxlint) {
- linter = "oxlint";
+ let linter: "biome" | "oxc" | undefined;
+ if (hasOxc) {
+ linter = "oxc";
} else if (hasBiome) {
linter = "biome";
}
@@ -139,7 +139,7 @@ export async function setupBiome(projectDir: string) {
}
}
-export async function setupHusky(projectDir: string, linter?: "biome" | "oxlint") {
+export async function setupHusky(projectDir: string, linter?: "biome" | "oxc") {
await addPackageDependency({
devDependencies: ["husky", "lint-staged"],
projectDir,
@@ -154,7 +154,7 @@ export async function setupHusky(projectDir: string, linter?: "biome" | "oxlint"
prepare: "husky",
};
- if (linter === "oxlint") {
+ if (linter === "oxc") {
packageJson["lint-staged"] = {
"*": ["oxlint", "oxfmt --write"],
};
diff --git a/apps/cli/src/helpers/addons/oxlint-setup.ts b/apps/cli/src/helpers/addons/oxc-setup.ts
similarity index 83%
rename from apps/cli/src/helpers/addons/oxlint-setup.ts
rename to apps/cli/src/helpers/addons/oxc-setup.ts
index f636e7015..1c0327ebb 100644
--- a/apps/cli/src/helpers/addons/oxlint-setup.ts
+++ b/apps/cli/src/helpers/addons/oxc-setup.ts
@@ -11,7 +11,7 @@ import { shouldSkipExternalCommands } from "../../utils/external-commands";
import { getPackageExecutionArgs } from "../../utils/package-runner";
import { createSpinner } from "../../utils/terminal-output";
-export async function setupOxlint(
+export async function setupOxc(
projectDir: string,
packageManager: PackageManager,
): Promise> {
@@ -41,7 +41,7 @@ export async function setupOxlint(
const s = createSpinner();
try {
- s.start("Initializing oxlint and oxfmt...");
+ s.start("Initializing oxc...");
const oxlintArgs = getPackageExecutionArgs(packageManager, "oxlint@latest --init");
await $({ cwd: projectDir, env: { CI: "true" } })`${oxlintArgs}`;
@@ -49,16 +49,16 @@ export async function setupOxlint(
const oxfmtArgs = getPackageExecutionArgs(packageManager, "oxfmt@latest --init");
await $({ cwd: projectDir, env: { CI: "true" } })`${oxfmtArgs}`;
- s.stop("oxlint and oxfmt initialized successfully!");
+ s.stop("oxc initialized successfully!");
} catch (error) {
- s.stop("Failed to initialize oxlint and oxfmt");
+ s.stop("Failed to initialize oxc");
throw error;
}
},
catch: (error) =>
new AddonSetupError({
- addon: "oxlint",
- message: `Failed to set up oxlint: ${error instanceof Error ? error.message : String(error)}`,
+ addon: "oxc",
+ message: `Failed to set up oxc: ${error instanceof Error ? error.message : String(error)}`,
cause: error,
}),
});
diff --git a/apps/cli/src/helpers/addons/ultracite-setup.ts b/apps/cli/src/helpers/addons/ultracite-setup.ts
index ccfc29550..c155f94e9 100644
--- a/apps/cli/src/helpers/addons/ultracite-setup.ts
+++ b/apps/cli/src/helpers/addons/ultracite-setup.ts
@@ -10,7 +10,7 @@ import { shouldSkipExternalCommands } from "../../utils/external-commands";
import { getPackageRunnerPrefix } from "../../utils/package-runner";
import { cliLog, createSpinner } from "../../utils/terminal-output";
-type UltraciteLinter = "biome" | "eslint" | "oxlint";
+type UltraciteLinter = "biome" | "eslint" | "oxc";
type UltraciteEditor =
| "vscode"
@@ -65,7 +65,7 @@ type UltraciteInitArgsInput = {
const LINTERS = {
biome: { label: "Biome", hint: "Fast formatter and linter" },
eslint: { label: "ESLint", hint: "Traditional JavaScript linter" },
- oxlint: { label: "Oxlint", hint: "Oxidation compiler linter" },
+ oxc: { label: "Oxc", hint: "Oxidation compiler linter" },
} as const;
const EDITORS = {
diff --git a/apps/cli/src/helpers/core/post-installation.ts b/apps/cli/src/helpers/core/post-installation.ts
index da32793d4..4ccc63f13 100644
--- a/apps/cli/src/helpers/core/post-installation.ts
+++ b/apps/cli/src/helpers/core/post-installation.ts
@@ -70,7 +70,7 @@ export async function displayPostInstallInstructions(
addons?.includes("husky") ||
addons?.includes("biome") ||
addons?.includes("lefthook") ||
- addons?.includes("oxlint");
+ addons?.includes("oxc");
const databaseInstructions =
!isConvex && database !== "none"
diff --git a/apps/cli/src/prompts/addons.ts b/apps/cli/src/prompts/addons.ts
index c860d5f34..56b71097b 100644
--- a/apps/cli/src/prompts/addons.ts
+++ b/apps/cli/src/prompts/addons.ts
@@ -39,8 +39,8 @@ function getAddonDisplay(addon: Addons): { label: string; hint: string } {
label = "Biome";
hint = "Format, lint, and more";
break;
- case "oxlint":
- label = "Oxlint";
+ case "oxc":
+ label = "Oxc";
hint = "Oxlint + Oxfmt (linting & formatting)";
break;
case "ultracite":
@@ -89,7 +89,7 @@ function getAddonDisplay(addon: Addons): { label: string; hint: string } {
const ADDON_GROUPS = {
"Monorepo & Tasks": ["turborepo", "nx"],
- "Code Quality": ["biome", "oxlint", "ultracite", "husky", "lefthook"],
+ "Code Quality": ["biome", "oxc", "ultracite", "husky", "lefthook"],
Documentation: ["starlight", "fumadocs"],
"Platform Extensions": ["pwa", "tauri", "electrobun", "opentui", "wxt"],
"AI & Agent Tools": ["skills", "mcp"],
diff --git a/apps/cli/test/addons.test.ts b/apps/cli/test/addons.test.ts
index 0396fe852..d2d1a1d4e 100644
--- a/apps/cli/test/addons.test.ts
+++ b/apps/cli/test/addons.test.ts
@@ -399,7 +399,7 @@ describe("Addon Configurations", () => {
"husky",
"turborepo",
"nx",
- "oxlint",
+ "oxc",
// Note: starlight, ultracite, fumadocs are prompt-controlled only
];
diff --git a/apps/cli/test/external-commands.test.ts b/apps/cli/test/external-commands.test.ts
index 28bf7fd1b..71fa78ce2 100644
--- a/apps/cli/test/external-commands.test.ts
+++ b/apps/cli/test/external-commands.test.ts
@@ -2,7 +2,7 @@ import { describe, expect, it } from "bun:test";
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
-import { setupOxlint } from "../src/helpers/addons/oxlint-setup";
+import { setupOxc } from "../src/helpers/addons/oxc-setup";
import { installDependencies } from "../src/helpers/core/install-dependencies";
import { getPackageExecutionArgs } from "../src/utils/package-runner";
import { SMOKE_DIR } from "./setup";
@@ -34,8 +34,8 @@ describe("External Command Guards", () => {
expect(result.isOk()).toBe(true);
});
- it("should update package.json without running oxlint init in test mode", async () => {
- const projectDir = join(SMOKE_DIR, "oxlint-skip");
+ it("should update package.json without running oxc init in test mode", async () => {
+ const projectDir = join(SMOKE_DIR, "oxc-skip");
await mkdir(projectDir, { recursive: true });
const pkgJsonPath = join(projectDir, "package.json");
@@ -43,7 +43,7 @@ describe("External Command Guards", () => {
pkgJsonPath,
JSON.stringify(
{
- name: "oxlint-skip",
+ name: "oxc-skip",
version: "0.0.0",
scripts: {},
devDependencies: {},
@@ -53,7 +53,7 @@ describe("External Command Guards", () => {
),
);
- const result = await setupOxlint(projectDir, "bun");
+ const result = await setupOxc(projectDir, "bun");
expect(result.isOk()).toBe(true);
const updated = await Bun.file(pkgJsonPath).json();
diff --git a/apps/cli/test/integration.test.ts b/apps/cli/test/integration.test.ts
index 7aef9c421..9a50e8217 100644
--- a/apps/cli/test/integration.test.ts
+++ b/apps/cli/test/integration.test.ts
@@ -78,7 +78,7 @@ describe("Integration Tests - Real World Scenarios", () => {
auth: "better-auth",
api: "orpc",
frontend: ["svelte"],
- addons: ["turborepo", "oxlint"],
+ addons: ["turborepo", "oxc"],
examples: ["todo"], // Todo works with Svelte
dbSetup: "none",
webDeploy: "none",
diff --git a/apps/cli/test/silent-create-output.test.ts b/apps/cli/test/silent-create-output.test.ts
index 81560eb2e..a42b03570 100644
--- a/apps/cli/test/silent-create-output.test.ts
+++ b/apps/cli/test/silent-create-output.test.ts
@@ -49,8 +49,8 @@ async function runSilentCreate(testCase: SilentCreateCase) {
describe("silent create output", () => {
const cases: SilentCreateCase[] = [
{
- name: "stays quiet for oxlint addon setup",
- projectName: "silent-addon-oxlint",
+ name: "stays quiet for oxc addon setup",
+ projectName: "silent-addon-oxc",
options: {
frontend: ["next"],
backend: "hono",
@@ -60,7 +60,7 @@ describe("silent create output", () => {
api: "none",
auth: "none",
payments: "none",
- addons: ["nx", "oxlint"],
+ addons: ["nx", "oxc"],
examples: [],
git: true,
packageManager: "pnpm",
diff --git a/apps/web/content/docs/cli/options.mdx b/apps/web/content/docs/cli/options.mdx
index d845d1a3e..6c0f27458 100644
--- a/apps/web/content/docs/cli/options.mdx
+++ b/apps/web/content/docs/cli/options.mdx
@@ -313,7 +313,7 @@ Additional features to include:
- `turborepo`: Turborepo monorepo setup
- `nx`: Nx monorepo setup
- `ultracite`: Ultracite configuration
-- `oxlint`: Oxlint + Oxfmt (linting & formatting)
+- `oxc`: Oxlint + Oxfmt (linting & formatting)
- `mcp`: Install MCP servers, including Better T Stack itself, with add-mcp
- `opentui`: OpenTUI components
- `wxt`: WXT browser extension framework
diff --git a/apps/web/content/docs/index.mdx b/apps/web/content/docs/index.mdx
index efba4f57f..41314a646 100644
--- a/apps/web/content/docs/index.mdx
+++ b/apps/web/content/docs/index.mdx
@@ -95,7 +95,7 @@ See the full list in the [CLI Reference](/docs/cli). Key flags:
- `--api`: trpc, orpc, none
- `--auth`: better-auth, clerk, none
- `--payments`: polar, none
-- `--addons`: turborepo, nx, pwa, tauri, electrobun, biome, lefthook, husky, starlight, fumadocs, ultracite, oxlint, mcp, opentui, wxt, skills, none
+- `--addons`: turborepo, nx, pwa, tauri, electrobun, biome, lefthook, husky, starlight, fumadocs, ultracite, oxc, mcp, opentui, wxt, skills, none
- `--examples`: todo, ai, none
## Next Steps
diff --git a/apps/web/content/docs/project-structure.mdx b/apps/web/content/docs/project-structure.mdx
index 07bdaf057..3817149c2 100644
--- a/apps/web/content/docs/project-structure.mdx
+++ b/apps/web/content/docs/project-structure.mdx
@@ -436,7 +436,7 @@ Electrobun adds an `apps/desktop` workspace with its own `package.json`, `electr
"backend": "",
"runtime": "",
"frontend": [""] ,
- "addons": [""] ,
+ "addons": [""] ,
"examples": [""] ,
"auth": <"better-auth"|"clerk"|"none">,
"packageManager": "",
diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts
index d969a3702..4beb7a02f 100644
--- a/apps/web/src/lib/constant.ts
+++ b/apps/web/src/lib/constant.ts
@@ -555,8 +555,8 @@ export const TECH_OPTIONS: Record<
default: false,
},
{
- id: "oxlint",
- name: "Oxlint",
+ id: "oxc",
+ name: "Oxc",
description: "Oxlint + Oxfmt (linting & formatting)",
icon: `${ICON_BASE_URL}/oxc.svg`,
color: "from-orange-500 to-orange-700",
diff --git a/apps/web/src/lib/stack-utils.ts b/apps/web/src/lib/stack-utils.ts
index d05ea8284..5770ed1f3 100644
--- a/apps/web/src/lib/stack-utils.ts
+++ b/apps/web/src/lib/stack-utils.ts
@@ -156,7 +156,7 @@ export function generateStackCommand(stack: StackState) {
"nx",
"ultracite",
"fumadocs",
- "oxlint",
+ "oxc",
"opentui",
"wxt",
"skills",
diff --git a/packages/template-generator/src/processors/readme-generator.ts b/packages/template-generator/src/processors/readme-generator.ts
index 9da316e76..db437b87c 100644
--- a/packages/template-generator/src/processors/readme-generator.ts
+++ b/packages/template-generator/src/processors/readme-generator.ts
@@ -546,7 +546,7 @@ function generateFeaturesList(
tauri: "- **Tauri** - Build native desktop applications",
electrobun: "- **Electrobun** - Lightweight desktop shell for web frontends",
biome: "- **Biome** - Linting and formatting",
- oxlint: "- **Oxlint** - Oxlint + Oxfmt (linting & formatting)",
+ oxc: "- **Oxc** - Oxlint + Oxfmt (linting & formatting)",
husky: "- **Husky** - Git hooks for code quality",
starlight: "- **Starlight** - Documentation site with Astro",
turborepo: "- **Turborepo** - Optimized monorepo build system",
@@ -686,7 +686,7 @@ function generateScriptsList(
scripts += `\n- \`${packageManagerRunCmd} check\`: Run Biome formatting and linting`;
}
- if (addons.includes("oxlint")) {
+ if (addons.includes("oxc")) {
scripts += `\n- \`${packageManagerRunCmd} check\`: Run Oxlint and Oxfmt`;
}
@@ -769,7 +769,7 @@ function generateGitHooksSection(
addons: ProjectConfig["addons"],
): string {
const hasHusky = addons.includes("husky");
- const hasLinting = addons.includes("biome") || addons.includes("oxlint");
+ const hasLinting = addons.includes("biome") || addons.includes("oxc");
if (!hasHusky && !hasLinting) {
return "";
diff --git a/packages/template-generator/src/templates.generated.ts b/packages/template-generator/src/templates.generated.ts
index 9f6bc7170..b6ff846ae 100644
--- a/packages/template-generator/src/templates.generated.ts
+++ b/packages/template-generator/src/templates.generated.ts
@@ -221,7 +221,7 @@ pre-commit:
glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}"
run: {{packageManager}} biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files}
stage_fixed: true
-{{else if (includes addons "oxlint")}}
+{{else if (includes addons "oxc")}}
- name: oxlint
run: {{packageManager}} oxlint --fix {staged_files}
stage_fixed: true
diff --git a/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs b/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs
index 26b6bb22d..3b1c46dfd 100644
--- a/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs
+++ b/packages/template-generator/templates/addons/lefthook/lefthook.yml.hbs
@@ -9,7 +9,7 @@ pre-commit:
glob: "*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}"
run: {{packageManager}} biome check --write --no-errors-on-unmatched --files-ignore-unknown=true {staged_files}
stage_fixed: true
-{{else if (includes addons "oxlint")}}
+{{else if (includes addons "oxc")}}
- name: oxlint
run: {{packageManager}} oxlint --fix {staged_files}
stage_fixed: true
diff --git a/packages/types/src/schemas.ts b/packages/types/src/schemas.ts
index 558abcbb2..322d99245 100644
--- a/packages/types/src/schemas.ts
+++ b/packages/types/src/schemas.ts
@@ -45,7 +45,7 @@ export const AddonsSchema = z
"nx",
"fumadocs",
"ultracite",
- "oxlint",
+ "oxc",
"opentui",
"wxt",
"skills",
@@ -224,7 +224,7 @@ export const SkillSelectionSchema = z.strictObject({
});
export const UltraciteLinterSchema = z
- .enum(["biome", "eslint", "oxlint"])
+ .enum(["biome", "eslint", "oxc"])
.describe("Ultracite linter");
export const UltraciteEditorSchema = z