Naming things is famously hard in programming. Naming conventions are the part that should be easy — but every language, framework, and team seems to have a different opinion. This is a definitive, practical breakdown of the common case formats, when each is correct, and why it matters.
The Formats
kebab-case
Words separated by hyphens, all lowercase.
my-blog-post
how-to-deploy-nextjs-to-vercel
getting-started-with-typescript
Use for: URLs, file names, CSS class names, HTML attributes, npm package names.
Why: Hyphens are the standard URL word separator per RFC 3986. Search engines treat hyphens as word separators, which means how-to-deploy ranks for both "how to deploy" and each individual word. Underscores are not treated as word separators by Google.
snake_case
Words separated by underscores, all lowercase.
my_blog_post
user_first_name
created_at
Use for: Python variables and functions, database column names, Ruby, PHP, environment variables (often SCREAMING_SNAKE_CASE).
Why: Python's official style guide (PEP 8) mandates snake_case for variables and functions. SQL databases conventionally use snake_case for column names.
camelCase
First word lowercase, each subsequent word capitalized. No separators.
myBlogPost
userFirstName
createdAt
Use for: JavaScript/TypeScript variables and functions, JSON keys, React props, method names in Java and C#.
Why: JavaScript's built-in APIs use camelCase (addEventListener, querySelector, innerHTML). Following the language's conventions makes code feel native.
PascalCase
Same as camelCase but the first word is also capitalized.
MyBlogPost
UserFirstName
BlogPostCard
Use for: React components, TypeScript interfaces and types, class names in all OOP languages, enum values.
Why: React uses PascalCase components to distinguish them from HTML elements. <Button> is a React component; <button> is an HTML element.
dot.case
Words separated by dots, all lowercase.
my.blog.post
app.config.debug
Use for: Package names in Java and Kotlin, configuration keys, i18n translation keys.
path/case
Words separated by forward slashes.
my/blog/post
components/layout/header
Use for: File system paths, import paths, API route segments.
Quick Reference
| Context | Format |
|---------|--------|
| URL slug | kebab-case |
| CSS class | kebab-case |
| npm package | kebab-case |
| Python variable | snake_case |
| Database column | snake_case |
| Environment variable | SCREAMING_SNAKE_CASE |
| JS/TS variable | camelCase |
| JSON key | camelCase |
| React component | PascalCase |
| TypeScript interface | PascalCase |
| Java class | PascalCase |
| Translation key | dot.case |
| Import path | path/case |
Why Consistency Matters More Than Which One You Pick
The format matters less than the consistency. Mixed conventions in a codebase create friction — you have to remember which names use which convention, auto-completion becomes unreliable, and grep searches miss results.
Pick conventions per context (URLs always kebab, database columns always snake) and enforce them with a linter. In JavaScript, ESLint's camelcase rule catches violations. In Python, flake8 and pylint do the same.
The SEO Case for kebab-case URLs
For public URLs specifically, kebab-case has a clear SEO advantage. Google's official guidance (John Mueller, 2018) explicitly states that hyphens are word separators in URLs, while underscores are not. /how-to-deploy matches searches for "how to deploy." /how_to_deploy does not.
Additionally, kebab-case URLs are more readable in email links, social shares, and printed materials. A URL you can read aloud is a URL people trust.
Generate Any Slug Format Instantly
Our Slug Generator converts any title or phrase into all six formats simultaneously — just type and every format updates live. Toggle which formats to show, copy individual formats, or copy all at once. Quick example buttons for common blog title patterns are included.