尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A fast, free, SEO-first text case converter — Title Case, Sentence case, camelCase, snake_case and more. Supports AP, APA, MLA, Chicago and Standard style guides. Built with Next.js 16 + React 19.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A fast, free, SEO-first text case converter built with Next.js 16 and React 19.
Convert text to Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case and more — with proper support for AP, APA, MLA, Chicago and Standard style guides.
| Layer | Choice |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19 + shadcn/ui (New York) |
| Styling | Tailwind CSS v4 + OKLch tokens |
| Language | TypeScript 5 (strict) |
| Testing | Vitest 4 |
| Linting | ESLint 9 + eslint-config-next |
| Deployment | Docker + Nginx on Hetzner VPS |
| CI/CD | GitHub Actions (lint → test → SEO QA → SSH deploy) |
Requirements: Node.js 22+ and npm.
git clone https://github.com/o-sorik/title-converter.git
cd title-converter
npm install
cp .env.example .env.local # set OPENAI_API_KEY if you need it
npm run dev
Open http://localhost:3000.
| Command | Purpose |
|---|---|
npm run dev | Start the dev server |
npm run build | Production build |
npm run start | Serve the production build |
npm run test | Run the full Vitest suite |
npm run lint | ESLint |
npm run seo:qa | Validate canonical URLs, metadata, JSON-LD |
npm run release:gate | Full pre-release gate (lint + test + SEO QA) |
npm run postchange:validate | Post-deploy route & performance checks |
npm run template:qa | Content template quality checks |
npm run intent:qa | Cannibalization / intent ownership checks |
npm run secrets:scan | Scan for leaked secrets |
Run
npm run release:gatebefore every release — CI enforces the same checks.
app/ Next.js App Router pages (homepage, [slug] converters, blog, rules guide)
components/ Feature components — text-converter, batch-checker, site-shell, json-ld
ui/ shadcn/ui primitives (auto-generated, do not edit)
lib/ Business logic: converters.ts, seo-config.ts, blog-view-model.ts, ...
scripts/ Operational scripts (.mjs) — SEO QA, release gate, deploy helpers
docs/ops/ Runbooks, architecture notes, SEO checklists
nginx/ Reverse proxy config
Dockerfile Multi-stage build (deps → builder → runner)
docker-compose.yml Production container
.github/workflows/ci.yml Lint + test + SEO QA + SSH deploy on push to main
Core logic lives in lib/converters.ts:
import { convert, convertWithExplanations } from "@/lib/converters";
convert("the quick brown fox", "title", { titleStyle: "ap" });
// → "The Quick Brown Fox"
convertWithExplanations("a tale of two cities", "title", { titleStyle: "chicago" });
// → tokens with per-word capitalization rules
title | upper | lower | sentence | camel | pascal | snake | kebab | alternating | inversestandard | ap | chicago | mla | apaTo add a new mode: extend the ConversionType union → implement the case in convert() → register the slug in lib/seo-config.ts → add tests.
This project treats SEO as a first-class concern, not a footer concern.
https://titlecaseconverter.online (apex, no www)npm run intent:qaWebApplication + FAQPage on converter pages, BlogPosting + BreadcrumbList on articlesdynamicParams = false on every [slug] route/is/[term] answers "Is X capitalized?" queries from a content registryapp/sitemap.ts and app/robots.tsFull ruleset: see docs/ops/SEO_QA_CHECKLIST.md and docs/ops/TAXONOMY_AND_CANNIBALIZATION_RULES.md.
npm run test # full Vitest run
npx vitest # watch mode
Tests are co-located with their source (lib/converters.ts → lib/converters.test.ts) and cover all conversion logic, blog view models, SEO config, and page metadata.
Production runs on a Hetzner VPS via Docker Compose + Nginx with Let's Encrypt SSL.
ssh deploy@<server>
cd /var/www/titlecaseconverter
git pull origin main
docker compose build --no-cache
docker compose up -d
Pushes to main trigger the GitHub Actions workflow, which gates on lint + test + SEO QA before SSHing into the server and rolling the container. Full runbook in docs/ops/DEPLOY_RUNBOOK_HETZNER.md.
Current priorities and recent decisions live in:
ROADMAP.md — long-term plandocs/ops/BACKLOG.md — current sprintdocs/ops/DECISIONS.md — architecture decision logIssues and PRs are welcome. Before opening a PR:
npm run release:gate — it must pass cleanly.feat:, fix:, chore:, test:, docs:).lib/ functions need co-located tests.Built and maintained by @o-sorik.