diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 63bd675c..d5b9f346 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -39,6 +39,9 @@ jobs:
- name: TypeScript (web)
run: pnpm --filter @nepp-chan/web exec tsc --noEmit
+ - name: TypeScript (lp)
+ run: pnpm --filter @nepp-chan/lp exec tsc --noEmit
+
test:
name: Test
runs-on: ubuntu-latest
diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml
index 78bbfd47..68a977d2 100644
--- a/.github/workflows/deploy-dev.yml
+++ b/.github/workflows/deploy-dev.yml
@@ -61,7 +61,33 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
PUBLIC_API_URL: https://dev-api.nepp-chan.ai
+ PUBLIC_LP_URL: https://dev-lp.nepp-chan.ai
PUBLIC_SENTRY_DSN: ${{ secrets.SENTRY_DSN_WEB }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT_WEB: ${{ secrets.SENTRY_PROJECT_WEB }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
+
+ deploy-lp:
+ name: Deploy LP
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24
+ cache: "pnpm"
+
+ - run: pnpm install --frozen-lockfile
+
+ - name: Deploy LP
+ run: pnpm lp:deploy:dev
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
+ PUBLIC_API_URL: https://dev-api.nepp-chan.ai
+ PUBLIC_WEB_URL: https://dev-web.nepp-chan.ai
diff --git a/.github/workflows/deploy-prd.yml b/.github/workflows/deploy-prd.yml
index 94fcd671..b440b12f 100644
--- a/.github/workflows/deploy-prd.yml
+++ b/.github/workflows/deploy-prd.yml
@@ -63,7 +63,34 @@ jobs:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
PUBLIC_API_URL: https://api.nepp-chan.ai
+ PUBLIC_LP_URL: https://nepp-chan.ai
PUBLIC_SENTRY_DSN: ${{ secrets.SENTRY_DSN_WEB }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT_WEB: ${{ secrets.SENTRY_PROJECT_WEB }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
+
+ deploy-lp:
+ name: Deploy LP
+ runs-on: ubuntu-latest
+ environment: production
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24
+ cache: "pnpm"
+
+ - run: pnpm install --frozen-lockfile
+
+ - name: Deploy LP
+ run: pnpm lp:deploy:prd
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
+ PUBLIC_API_URL: https://api.nepp-chan.ai
+ PUBLIC_WEB_URL: https://web.nepp-chan.ai
diff --git a/.tagpr b/.tagpr
index 740885ad..c5e321a3 100644
--- a/.tagpr
+++ b/.tagpr
@@ -3,6 +3,6 @@
[tagpr]
vPrefix = true
releaseBranch = develop
-versionFile = package.json,server/package.json,web/package.json
+versionFile = package.json,server/package.json,web/package.json,lp/package.json
release = true
changelog = true
diff --git a/CLAUDE.md b/CLAUDE.md
index 0f20b9d2..24b656d1 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -9,6 +9,7 @@ Cloudflare Workers(API)+ Pages(Web)のモノレポ構成。
# 開発
pnpm server:dev # API 開発サーバー(8787)
pnpm web:dev # Web 開発サーバー(5173)
+pnpm lp:dev # LP 開発サーバー(5174)
# 品質チェック
pnpm lint # Biome + astro check + tsc
@@ -30,7 +31,8 @@ pnpm knowledge:upload:prd # prd 環境
```text
server/ → API(詳細: server/CLAUDE.md)
-web/ → フロントエンド(詳細: web/CLAUDE.md)
+web/ → アプリ(チャット・ダッシュボード等)(詳細: web/CLAUDE.md)
+lp/ → LP(apex 配信の静的サイト)
knowledge/ → RAG 用 Markdown ファイル
```
@@ -128,11 +130,11 @@ wrangler secret put GOOGLE_GENERATIVE_AI_API_KEY
## デプロイ環境
-| 環境 | Web | API |
-| ---- | --- | --- |
-| ローカル | http://localhost:5173 | http://localhost:8787 |
-| dev | https://dev-web.nepp-chan.ai | https://dev-api.nepp-chan.ai |
-| prd | https://web.nepp-chan.ai | https://api.nepp-chan.ai |
+| 環境 | LP | Web | API |
+| ---- | --- | --- | --- |
+| ローカル | http://localhost:5174 | http://localhost:5173 | http://localhost:8787 |
+| dev | https://dev-lp.nepp-chan.ai | https://dev-web.nepp-chan.ai | https://dev-api.nepp-chan.ai |
+| prd | https://nepp-chan.ai | https://web.nepp-chan.ai | https://api.nepp-chan.ai |
## ブランチ
diff --git a/biome.json b/biome.json
index 4bdbaed2..05cc3ef0 100644
--- a/biome.json
+++ b/biome.json
@@ -11,6 +11,7 @@
"**",
"!**/node_modules",
"!**/dist",
+ "!**/.astro",
"!**/.mastra",
"!**/.wrangler",
"!**/*.d.ts",
diff --git a/lp/.env.example b/lp/.env.example
new file mode 100644
index 00000000..c1640dd0
--- /dev/null
+++ b/lp/.env.example
@@ -0,0 +1,2 @@
+PUBLIC_API_URL=http://localhost:8787
+PUBLIC_WEB_URL=http://localhost:5173
diff --git a/lp/.gitignore b/lp/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/lp/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/lp/astro.config.ts b/lp/astro.config.ts
new file mode 100644
index 00000000..43f082fa
--- /dev/null
+++ b/lp/astro.config.ts
@@ -0,0 +1,17 @@
+import react from "@astrojs/react";
+import tailwindcss from "@tailwindcss/vite";
+import { defineConfig } from "astro/config";
+
+export default defineConfig({
+ output: "static",
+ server: { port: 5174 },
+ integrations: [react()],
+ vite: {
+ plugins: [tailwindcss()],
+ resolve: {
+ alias: {
+ "~": "/src",
+ },
+ },
+ },
+});
diff --git a/lp/functions/_middleware.ts b/lp/functions/_middleware.ts
new file mode 100644
index 00000000..951ad8fa
--- /dev/null
+++ b/lp/functions/_middleware.ts
@@ -0,0 +1,23 @@
+interface Env {
+ BASIC_AUTH_USER: string;
+ BASIC_AUTH_PASSWORD: string;
+}
+
+export const onRequest: PagesFunction