Title Case Converter
Title Case writes Hello World Example. It is for headlines, article titles and headings. Short articles, conjunctions and prepositions stay lowercase unless they are the first or last word — this converter applies that rule instead of capitalising everything.
Conversions
| Input | Title Case |
|---|---|
hello world example | Hello World Example |
XMLHttpRequest | Xml Http Request |
user_first_name | User First Name |
Total Order Count | Total Order Count |
XMLHttpRequest becomes Xml Http Request. Real editorial title case additionally keeps short conjunctions, articles and prepositions lowercase unless they open the title.The Same Text in Other Cases
| Case | Result |
|---|---|
| camelCase | helloWorldExample |
| PascalCase | HelloWorldExample |
| snake_case | hello_world_example |
| SCREAMING_SNAKE_CASE | HELLO_WORLD_EXAMPLE |
| kebab-case | hello-world-example |
| Train-Case | Hello-World-Example |
Where Title Case Fits
Title Case belongs to headings, article titles, book and film names, and button labels in interfaces that use it. It is an editorial convention rather than a technical one, which is why implementations disagree and why the disagreements are legitimate.
Converting in Code
``javascript
const MINOR = new Set(['a', 'an', 'the', 'and', 'or', 'but', 'of', 'in', 'on', 'to', 'for']);
const title = (s) =>
words(s)
.map((w, i) =>
i > 0 && MINOR.has(w.toLowerCase()) ? w.toLowerCase() : w[0].toUpperCase() + w.slice(1).toLowerCase(),
)
.join(' ');
`
There is no single correct title case. AP capitalises prepositions of four letters or more; Chicago capitalises them only when used adverbially; APA uses four letters as the cutoff too but treats hyphenated compounds differently. Pick a style guide and say which one you followed.
Converting at the API Boundary
The recurring friction is that JavaScript uses camelCase and Python, Ruby, Go and SQL use
snake_case. The fix is to convert in exactly one place — the client that talks to the API —
rather than letting both conventions into the same codebase.
`javascript
const toCamel = (s) => s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
const toSnake = (s) => s.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase());
// Recursively, for a whole payload
const convertKeys = (value, fn) =>
Array.isArray(value)
? value.map((v) => convertKeys(v, fn))
: value && typeof value === 'object'
? Object.fromEntries(Object.entries(value).map(([k, v]) => [fn(k), convertKeys(v, fn)]))
: value;
`
Two things to watch: keys that are user data rather than field names must not be
converted, and the round trip is not always lossless — userID → user_id → userId
changes the original.
Where Each Convention Is Mandatory
Not stylistic — these will break if you deviate:
| Context | Requirement |
|---|---|
| Environment variables | Uppercase with underscores; POSIX reserves lowercase |
| Custom HTML elements | Must contain a hyphen |
| Python modules | Cannot contain hyphens; the import statement will not parse |
| SQL identifiers | Folded to one case unless quoted, so camelCase does not survive |
| React components | Must start uppercase, or JSX treats it as an HTML tag |
Renaming Safely
A find-and-replace across a codebase will hit strings, comments and unrelated identifiers.
Use your language server's rename symbol instead — it understands scope. For a bulk rename
across files, restrict the pattern with word boundaries and review the diff before
committing:
`bash
grep -rn '\buserId\b' src/ # look first
``