diff --git a/.changeset/fluffy-schools-speak.md b/.changeset/fluffy-schools-speak.md
new file mode 100644
index 0000000..f615c54
--- /dev/null
+++ b/.changeset/fluffy-schools-speak.md
@@ -0,0 +1,5 @@
+---
+"create-better-t-stack": patch
+---
+
+Remove GitHub Actions and SEO addons
diff --git a/apps/cli/README.md b/apps/cli/README.md
index 7155343..4c3f6e2 100644
--- a/apps/cli/README.md
+++ b/apps/cli/README.md
@@ -42,8 +42,6 @@ Options:
--auth Include authentication
--no-auth Disable authentication
--docker Include Docker setup
- --github-actions Add GitHub Actions workflows
- --seo Configure SEO optimizations
--git Initialize a new git repo (default)
--no-git Skip git initialization
--npm Use npm as package manager
diff --git a/apps/cli/src/constants.ts b/apps/cli/src/constants.ts
index bdb30bd..43c292c 100644
--- a/apps/cli/src/constants.ts
+++ b/apps/cli/src/constants.ts
@@ -19,11 +19,11 @@ export const DEFAULT_CONFIG: ProjectConfig = {
export const dependencyVersionMap = {
// Authentication
- "better-auth": "^1.1.16",
+ "better-auth": "^1.2.4",
// Database - Drizzle
"drizzle-orm": "^0.38.4",
- "drizzle-kit": "^0.30.4",
+ "drizzle-kit": "^0.30.5",
// Database - SQLite/PostgreSQL
"@libsql/client": "^0.14.0",
diff --git a/apps/cli/src/helpers/addons-setup.ts b/apps/cli/src/helpers/addons-setup.ts
index ab4e26f..5d1414a 100644
--- a/apps/cli/src/helpers/addons-setup.ts
+++ b/apps/cli/src/helpers/addons-setup.ts
@@ -6,19 +6,6 @@ export async function setupAddons(projectDir: string, addons: ProjectAddons[]) {
if (addons.includes("docker")) {
await setupDocker(projectDir);
}
-
- if (addons.includes("github-actions")) {
- await setupGithubActions(projectDir);
- }
-
- if (addons.includes("SEO")) {
- // log.info(
- // pc.yellow(
- // "SEO feature is still a work-in-progress and will be available in a future update.",
- // ),
- // );
- await setupSEO(projectDir);
- }
}
async function setupDocker(projectDir: string) {
@@ -103,181 +90,3 @@ node_modules
dockerignoreContent,
);
}
-
-async function setupGithubActions(projectDir: string) {
- const workflowsDir = path.join(projectDir, ".github/workflows");
- await fs.ensureDir(workflowsDir);
-
- const ciWorkflowContent = `name: CI
-
-on:
- push:
- branches: [ main ]
- pull_request:
- branches: [ main ]
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
-
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: 'npm'
-
- - name: Install dependencies
- run: npm ci
-
- - name: Type check
- run: npm run check-types
-
- - name: Build
- run: npm run build
-`;
-
- const deployWorkflowContent = `name: Deploy
-
-on:
- push:
- branches: [ main ]
-
- # Enable manual trigger
- workflow_dispatch:
-
-jobs:
- deploy:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
-
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: 'npm'
-
- - name: Install dependencies
- run: npm ci
-
- - name: Build
- run: npm run build
-
- # Add your deployment steps here
- # This is just a placeholder for your actual deployment logic
- - name: Deploy
- run: echo "Add your deployment commands here"
-`;
-
- await fs.writeFile(path.join(workflowsDir, "ci.yml"), ciWorkflowContent);
- await fs.writeFile(
- path.join(workflowsDir, "deploy.yml"),
- deployWorkflowContent,
- );
-}
-
-async function setupSEO(projectDir: string) {
- const robotsContent = `# Instructions: Customize this file to control how search engines crawl your site
-# Learn more: https://developers.google.com/search/docs/advanced/robots/create-robots-txt
-
-# Allow all crawlers (default)
-User-agent: *
-Allow: /
-
-# Disallow crawling of specific directories (uncomment and customize as needed)
-# Disallow: /admin/
-# Disallow: /private/
-
-# Specify the location of your sitemap
-Sitemap: https://yourdomain.com/sitemap.xml
-`;
-
- await fs.writeFile(
- path.join(projectDir, "packages", "client", "robots.txt"),
- robotsContent,
- );
-
- const sitemapContent = `
-
-
-
- https://yourdomain.com/
- 2025-03-01
- weekly
- 1.0
-
-
-
- https://yourdomain.com/about
- 2025-03-01
- monthly
- 0.8
-
-
-
-`;
- await fs.writeFile(
- path.join(projectDir, "packages", "client", "sitemap.xml"),
- sitemapContent,
- );
-
- const metaContent = `
-
-
-
-
-
- TanStack Router
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
- await fs.writeFile(
- path.join(projectDir, "packages", "client", "index.html"),
- metaContent,
- );
-}
diff --git a/apps/cli/src/helpers/create-readme.ts b/apps/cli/src/helpers/create-readme.ts
index dc45fe9..8bd7258 100644
--- a/apps/cli/src/helpers/create-readme.ts
+++ b/apps/cli/src/helpers/create-readme.ts
@@ -99,10 +99,6 @@ function generateFeaturesList(
for (const feature of features) {
if (feature === "docker") {
featuresList.push("- **Docker** - Containerized deployment");
- } else if (feature === "github-actions") {
- featuresList.push("- **GitHub Actions** - CI/CD workflows");
- } else if (feature === "SEO") {
- featuresList.push("- **SEO** - Search engine optimization tools");
}
}
diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts
index f8f7758..b956df8 100644
--- a/apps/cli/src/index.ts
+++ b/apps/cli/src/index.ts
@@ -31,8 +31,6 @@ async function main() {
.option("--auth", "Include authentication")
.option("--no-auth", "Exclude authentication")
.option("--docker", "Include Docker setup")
- .option("--github-actions", "Include GitHub Actions")
- .option("--seo", "Include SEO setup")
.option("--no-addons", "Skip all additional addons")
.option("--git", "Include git setup")
.option("--no-git", "Skip git initialization")
@@ -72,18 +70,11 @@ async function main() {
...("git" in options && { git: options.git }),
...("install" in options && { noInstall: !options.install }),
...("turso" in options && { turso: options.turso }),
- ...((options.docker ||
- options.githubActions ||
- options.seo ||
- options.addons === false) && {
+ ...((options.docker || options.addons === false) && {
addons:
options.addons === false
? []
- : ([
- ...(options.docker ? ["docker"] : []),
- ...(options.githubActions ? ["github-actions"] : []),
- ...(options.seo ? ["SEO"] : []),
- ] as ProjectAddons[]),
+ : ([...(options.docker ? ["docker"] : [])] as ProjectAddons[]),
}),
};
diff --git a/apps/cli/src/prompts/addons.ts b/apps/cli/src/prompts/addons.ts
index ad46f6c..5b229f2 100644
--- a/apps/cli/src/prompts/addons.ts
+++ b/apps/cli/src/prompts/addons.ts
@@ -15,16 +15,6 @@ export async function getAddonsChoice(
label: "Docker setup",
hint: "Containerize your application",
},
- {
- value: "github-actions",
- label: "GitHub Actions",
- hint: "CI/CD workflows",
- },
- {
- value: "SEO",
- label: "Basic SEO setup",
- hint: "Search engine optimization configuration",
- },
],
required: false,
});
diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts
index f7b8bd0..680f3ba 100644
--- a/apps/cli/src/types.ts
+++ b/apps/cli/src/types.ts
@@ -1,7 +1,7 @@
export type ProjectDatabase = "sqlite" | "postgres" | "none";
export type ProjectOrm = "drizzle" | "prisma" | "none";
export type PackageManager = "npm" | "pnpm" | "yarn" | "bun";
-export type ProjectAddons = "docker" | "github-actions" | "SEO";
+export type ProjectAddons = "docker";
export interface ProjectConfig {
projectName: string;
diff --git a/apps/cli/template/base/packages/client/index.html b/apps/cli/template/base/packages/client/index.html
index aed7499..d7d639d 100644
--- a/apps/cli/template/base/packages/client/index.html
+++ b/apps/cli/template/base/packages/client/index.html
@@ -3,7 +3,6 @@
- TanStack Router
diff --git a/apps/cli/template/base/packages/client/package.json b/apps/cli/template/base/packages/client/package.json
index f26826c..ee38a20 100644
--- a/apps/cli/template/base/packages/client/package.json
+++ b/apps/cli/template/base/packages/client/package.json
@@ -11,40 +11,40 @@
"check-types": "tsc --noEmit"
},
"devDependencies": {
- "@tanstack/router-plugin": "^1.101.0",
- "@types/node": "^22.13.1",
- "@types/react": "^19.0.8",
- "@types/react-dom": "^19.0.3",
+ "@tanstack/router-plugin": "^1.114.25",
+ "@types/node": "^22.13.10",
+ "@types/react": "^19.0.12",
+ "@types/react-dom": "^19.0.4",
"@vitejs/plugin-react": "^4.3.4",
- "postcss": "^8.5.1",
- "prettier": "^3.4.2",
+ "postcss": "^8.5.3",
+ "prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.11",
- "tailwindcss": "^4.0.5",
- "vite": "^6.1.0"
+ "tailwindcss": "^4.0.14",
+ "vite": "^6.2.2"
},
"dependencies": {
"@hookform/resolvers": "^3.10.0",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-slot": "^1.1.2",
- "@tailwindcss/vite": "^4.0.5",
"@tanstack/react-form": "^1.0.5",
- "@tanstack/react-query": "^5.66.0",
- "@tanstack/react-query-devtools": "^5.66.0",
- "@tanstack/react-router": "^1.101.0",
- "@tanstack/react-router-devtools": "^1.114.25",
- "@trpc/client": "^11.0.0-rc.748",
- "@trpc/react-query": "^11.0.0-rc.748",
- "@trpc/server": "^11.0.0-rc.748",
+ "@tailwindcss/vite": "^4.0.14",
+ "@tanstack/react-query": "^5.69.0",
+ "@tanstack/react-query-devtools": "^5.69.0",
+ "@tanstack/react-router": "^1.114.25",
+ "@tanstack/router-devtools": "^1.114.25",
+ "@trpc/client": "^11.0.0-rc.840",
+ "@trpc/react-query": "^11.0.0-rc.840",
+ "@trpc/server": "^11.0.0-rc.840",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.473.0",
- "next-themes": "^0.4.4",
+ "next-themes": "^0.4.6",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"sonner": "^1.7.4",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
- "zod": "^3.24.1"
+ "zod": "^3.24.2"
}
}
diff --git a/apps/cli/template/base/packages/client/src/routes/__root.tsx b/apps/cli/template/base/packages/client/src/routes/__root.tsx
index 503e9e9..2fe56b3 100644
--- a/apps/cli/template/base/packages/client/src/routes/__root.tsx
+++ b/apps/cli/template/base/packages/client/src/routes/__root.tsx
@@ -8,6 +8,7 @@ import {
Outlet,
createRootRouteWithContext,
useRouterState,
+ HeadContent,
} from "@tanstack/react-router";
import { TanStackRouterDevtools } from "@tanstack/react-router-devtools";
import "../index.css";
@@ -18,6 +19,23 @@ export interface RouterAppContext {
export const Route = createRootRouteWithContext()({
component: RootComponent,
+ head: () => ({
+ meta: [
+ {
+ title: "My App",
+ },
+ {
+ name: "description",
+ content: "My App is a web application",
+ },
+ ],
+ links: [
+ {
+ rel: "icon",
+ href: "/favicon.ico",
+ },
+ ],
+ }),
});
function RootComponent() {
@@ -26,6 +44,7 @@ function RootComponent() {
});
return (
<>
+
{isFetching && }
diff --git a/apps/cli/template/base/packages/server/package.json b/apps/cli/template/base/packages/server/package.json
index 48f7298..5637173 100644
--- a/apps/cli/template/base/packages/server/package.json
+++ b/apps/cli/template/base/packages/server/package.json
@@ -14,12 +14,12 @@
"@hono/trpc-server": "^0.3.4",
"@trpc/server": "^11.0.0-rc.748",
"dotenv": "^16.4.7",
- "hono": "^4.7.0",
+ "hono": "^4.7.5",
"zod": "^3.24.1"
},
"devDependencies": {
"tsx": "^4.19.2",
"@types/node": "^22.13.4",
- "typescript": "^5.7.3"
+ "typescript": "^5.8.2"
}
}