尚未检测到更新。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.