BE AWESOME
Settings
Web Tools
📅 August 3, 2026 · ⏱️ 4 min read

Text Tools: Four Utilities, Isolated Under One Roof

Case conversion, a counter, lorem ipsum, and a diff tool sharing one page but none of their actual state with each other.

This post is about Text Tools: Four Utilities, Isolated Under One Roof
Try Text Tools →

Four genuinely different text utilities live behind one set of tabs here: case conversion, a word and character counter, a lorem ipsum generator, and a line-by-line diff tool. None of them share much underlying logic with each other. What they share is a pattern of showing up in the same sitting — cleaning up pasted text, checking a caption against a character limit, generating filler copy, reviewing an edit — which is the actual justification for bundling four unrelated utilities into one page instead of shipping four separate ones.

Case conversion has more real styles than people expect

Beyond the obvious uppercase and lowercase, this supports Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case, and CONSTANT_CASE — the naming conventions developers actually reach for constantly when renaming a variable or converting a heading into a slug. Each one has its own genuinely different rule for where word boundaries go and how they get marked, which means this isn't really one conversion function with different capitalization rules, it's eight small, distinct parsers for splitting text into words before reassembling it in a different convention. Getting word-boundary detection right across all eight, especially for text that's already in one of these conventions and needs to convert to another, took more edge-case testing than the "just change the case" framing suggests.

Read time is an estimate wearing the costume of a fact

The counter tab shows an estimated read time alongside the raw word count, and I want to be upfront that it's exactly that — an estimate based on an average reading speed, not a measurement of how long reading this specific text will actually take any specific person. Reading speed varies enormously by content density, familiarity with the subject, and the reader themselves, so I picked a commonly cited average words-per-minute figure and applied it uniformly rather than trying to model anything more sophisticated. It's a useful rough signal for "is this short or long," and I made sure it's presented as an estimate rather than dressed up to look more precise than the underlying assumption actually supports.

The counter needed to define what a "word" even is

Word count sounds unambiguous until you hit hyphenated compounds, em-dashes, and text with irregular spacing from a bad copy-paste. Different reasonable definitions of "word boundary" can produce noticeably different counts on the same input, and there's no single universally correct answer — just a convention that has to be picked and applied consistently. I went with splitting on whitespace and standard punctuation boundaries, which matches what most people intuitively expect a word count to mean, over a stricter dictionary-based approach that would reject or miscount anything unconventional, like code snippets or informal shorthand pasted in alongside regular prose.

The diff view had to distinguish three states clearly, not just two

Comparing an original and an edited block of text needs three visually distinct states — added lines, removed lines, and unchanged lines — not just a binary "different or same" signal. Getting the line-matching algorithm right so that a genuinely moved or lightly edited line reads as a small change rather than a full delete-and-add pair took real care, since a naive line-by-line comparison can make a single edited word in a long paragraph look like the entire paragraph was removed and a completely new one added in its place, which technically shows a difference but completely obscures what actually changed.

Four tabs meant four independent pieces of state to keep separate

Bundling four tools into one page means each tab's input and output has to stay genuinely independent — switching from Case to Counter and back shouldn't lose what you were working on in either one, and an action in one tab should never accidentally bleed into another's state. That sounds obvious, but it's an easy thing to get subtly wrong when four features share one page and, in an early version, briefly shared more UI plumbing than they should have. I ended up giving each tab its own fully isolated state rather than any shared "current text" variable reused across all four, specifically so jumping between tabs mid-task never produces a surprise.

Why lorem ipsum earned a place next to three "serious" tools

Placeholder text generation looks like the odd one out next to case conversion, counting, and diffing, and I kept it because it's a genuine, frequent need for anyone mocking up a layout or a design and it fits the same underlying pattern as the other three: paste or generate some text, do something useful with it, copy the result out. It didn't need its own page any more than the other three did — it just needed to be reachable from the same place someone's already working with text for a completely different reason five minutes earlier or later in the same task.

This is the tool I'd point to if someone asked what "bundling" should actually mean on this site. Not four unrelated features crammed together because a dropdown was easy to build, but four features that genuinely tend to show up in the same task, each kept cleanly separate under the hood even while sharing one page. That's a subtle distinction, but it's the difference between a coherent tool and a junk drawer with a shared URL.

Of the four, the case-conversion tab is probably the one I'll end up revisiting first, since developer-facing naming conventions have a way of expanding — someone will eventually want a casing style I didn't anticipate. Adding a ninth style later should be cheap precisely because each style is already its own isolated parser rather than one giant function trying to branch on every convention at once. That's the same isolation principle behind the four-tab state design, applied one level deeper, and it's the kind of structural decision that pays for itself quietly every time the tool needs to grow instead of get rebuilt from scratch to fit one more case nobody planned for on day one, which is worth the small amount of extra structure it costs up front.

Hello!