Case Converter
One input, twelve naming conventions at once, with the token split that produced each one.
Separators, capital letters and acronym runs all mark boundaries. Runs of separators collapse.
3 tokens. Every row is this list with a different joiner and capitalisation.
parseHTML5String → parse | HTML5 | String → parse_html5_string
Punctuation is a separator and is dropped, so pasted prose loses its commas and full stops. iOS splits as i + OS: a lowercase letter before a capital is always a boundary.
How it works
Type or paste an identifier or a phrase. Spaces, underscores, hyphens, dots and slashes are all read the same way — as separators — and runs of them collapse to one boundary.
The splitter breaks the input into tokens at every separator and at every case boundary. parseHTML5String becomes parse, HTML5, String. The tokens are listed under the field, so an output that looks wrong can be traced to the split that caused it.
All twelve conventions are built from that one token list. Only the joiner and the capitalisation differ, which is why they can never disagree with each other.
Turn off "Keep acronyms uppercase" to get XmlHttpRequest instead of XMLHttpRequest. The toggle only touches the rows that capitalise words — snake_case is lowercase by definition and SCREAMING_SNAKE_CASE is uppercase by definition.
Copy any row with the button beside it. Everything runs in the page: nothing is uploaded, and nothing is saved between visits.
How the splitter finds a word boundary
Two rules, applied over Unicode letters, marks and digits. First: a boundary goes wherever a character that is not an uppercase letter is followed by one — that catches fooBar and md5Hash. Second: an uppercase run ends one character early when its last capital starts a lowercase word, which is the acronym rule and is what turns XMLHttpRequest into XML, Http, Request instead of X, M, L, Http, Request. Digits attach to the token in front of them, so HTML5, utf8mb4 and v2 stay whole. Anything that is not a letter, mark or digit is a separator and is dropped.
parseHTML5String → parse | HTML5 | String → parse_html5_string
Use cases
camelCase to snake_case for a database column
Postgres folds an unquoted identifier to lowercase, so createdAt and createdat are the same column and userID arrives as userid. Converting to snake_case before the migration is written is what keeps the name readable in psql, in a query plan, and in every error message the column ever appears in.
SCREAMING_SNAKE_CASE for environment variables
POSIX limits an environment variable name to letters, digits and underscores, and forbids a leading digit. A name with a hyphen in it cannot be exported at all, which is why api-key-v2 has to become API_KEY_V2 before it reaches a shell, a Dockerfile or a CI secret.
kebab-case for URLs, CSS classes and file names
URL paths are case-sensitive, and macOS and Linux disagree about whether file names are — so a lowercase hyphenated form is the one spelling that behaves identically on every machine in the pipeline. It is also the convention for CSS custom properties and BEM class names.
PascalCase for React components and Swift types
JSX treats a lowercase tag as a DOM element and a capitalised one as a component, so a component named userCard renders as an unknown HTML tag and throws no error at all. Swift, C# and Kotlin use the same convention for type names.
Acronyms inside identifiers
XMLHttpRequest, parseHTTPResponse, toJSONString. With the acronym toggle on, PascalCase hands XMLHttpRequest back unchanged. With it off you get XmlHttpRequest, which is what the .NET naming guidelines and the Google Java style ask for on runs longer than two letters.
Renaming across a JSON boundary
A Rails or Django API sends snake_case and a TypeScript client wants camelCase. Paste the wire field name and read the client name off the camelCase row: created_at_utc and createdAtUtc are visibly the same three tokens, which is the check that catches a mapper missing a field.
Title Case for a heading or an App Store title
Short words stay lowercase unless they land first or last, so "A Guide to the Notch" keeps the leading A capitalised and leaves both to and the alone. The list is the Chicago one — articles, coordinating conjunctions and prepositions of four letters or fewer.
dot.case and path/case for config and route keys
Localisation keys (auth.login.title), Terraform and YAML addresses, and the segment names in a file-based router are all lowercase tokens with a joiner. Both rows are the same token list as snake_case with a different character between the parts.
Train-Case for HTTP header names
X-Request-Id, Content-Type, Accept-Language. Header field names are case-insensitive under RFC 9110 §5.1 and HTTP/2 requires them lowercase on the wire, but Train-Case is still what documentation, client libraries and code review expect to read.
Questions
- How does it split XMLHttpRequest?
- Into XML, Http and Request. An uppercase run ends one character early when its last capital begins a lowercase word. Without that rule the same input would come out as X, M, L, Http, Request.
- What happens to digits?
- They stay attached to the token in front of them, so HTML5, md5, utf8mb4 and v2 each stay whole. A digit followed by a capital is a boundary, which is why parseHTML5String splits into parse, HTML5, String rather than parse, HTML, 5, String.
- Why is iOS split into i and OS?
- Because a lowercase letter followed by a capital is always a boundary, and nothing in the characters says iOS is one word. IPv6Address splits as I, Pv6, Address for the same reason. Recognising either would need a dictionary of brand names, and a dictionary that is wrong about your identifier is worse than a rule you can predict.
- Where did my punctuation go?
- It was treated as a separator. Everything that is not a Unicode letter, mark or digit splits tokens and is then dropped, so pasted prose loses its commas and full stops. Apostrophes are the one exception: one sitting between two letters stays inside the token, so a word survives whole in the prose rows and is stripped in the identifier rows.
- What does "Keep acronyms uppercase" do?
- It leaves a token that is entirely uppercase — HTTP, XML, ID, HTML5 — spelled that way in the rows that capitalise words: PascalCase, Train-Case, Sentence case, Title Case, and camelCase after the first token. snake_case, kebab-case, dot.case and path/case are lowercase by definition and SCREAMING_SNAKE_CASE is uppercase by definition, so the toggle does not reach them.
- Which words stay lowercase in Title Case?
- Twenty-eight of them: the articles, the coordinating conjunctions, and prepositions of four letters or fewer — a, an, the, and, but, or, nor, for, of, on, in, to, with, from, into, over among them. All are capitalised anyway when they are the first or last token. That is the Chicago convention; AP capitalises anything four letters or longer, so the two disagree on with and from.
- Is anything uploaded?
- No. The splitter and all twelve conversions run in the page. Nothing is sent anywhere, nothing is logged, and nothing is stored between visits — reloading clears the field.
More tools
One of 18 free tools here. They come out of building utility apps for macOS, iOS and the browser — all of it by one person.
See the apps