Agentero
Connect your own Agent, keep research context in a local Vault. Seamlessly migrate from Zotero, read, understand, link, and reuse your research context.
AI translation
Convert text to Title Case, Sentence Case, camelCase, and more. Free, instant, and ad-free.
Translation pending
ProductivityTypeScript · JavaScriptGitHub @o-sorikOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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.
Taken from the repository README
Loading the full README.
Read the full 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.