Morph is the real-time character transformation engine that replaces, deletes, and normalizes text at the byte level. Built from first principles for teams that refuse to ship messy data.
Morph handles every character transformation primitive your pipeline needs — from simple case-folding to surgical deletion to intelligent deduplication.
Map any character set to another with one-to-one precision. Translate entire alphabets, remap
symbol ranges, or convert between character classes. morph 'a-z' 'A-Z' — instant
transformation.
Remove exactly the characters you don't want with -d. Delete digits, control
characters, punctuation, or any custom set. Zero false positives. Zero residue.
Collapse runs of repeated characters into single occurrences with -s. Normalize
messy whitespace, clean doubled punctuation, flatten noisy telemetry — one flag.
Target everything except your specified characters with -c. Define what to
keep, and Morph removes the rest. Whitelisting, not blacklisting.
Use standard POSIX classes like [:alpha:], [:digit:],
[:upper:], [:lower:], [:space:], [:punct:],
and [:alnum:] for semantic, locale-aware targeting.
Define character ranges with intuitive syntax: a-z, A-Z,
0-9. Combine with escape sequences like \n, \t, and
\0 for full coverage of your byte space.
Morph reads exclusively from stdin — no file arguments, no side effects, no state. Compose it with any pipeline. It's the purest function in your toolchain.
Specify the source characters (SET1) and optionally the target characters (SET2). Use ranges, POSIX classes, or individual characters — Morph supports all of them.
morph 'aeiou' '*'Translate characters one-to-one, delete them entirely with -d, squeeze repeated
occurrences with -s, or complement your set with -c. Compose freely.
morph -d '[:digit:]'Feed any stream through stdin. Morph processes byte-by-byte, character-by-character, transforming your data in a single pass with zero buffering overhead.
cat data.txt | morph '[:upper:]' '[:lower:]'Morph writes to stdout, ready for the next stage of your pipeline. Chain multiple transformations, redirect to files, or feed downstream processes. Zero friction.
morph -cs '[:alnum:]' '\n' < input | sort -uEvery day, billions of characters flow through pipelines carrying silent corruption — wrong cases, invisible control characters, doubled whitespace, stale delimiters. Most teams pretend this isn't a problem. They ship regex. They write parsers. They build entire microservices for what should be a single transformation.
We founded Morph because we believe character transformation is a core primitive, not an afterthought. Not something you hack together at 2 AM. Not something that requires 47 lines of Python. One operation. One direction. One stream. That's the Morph way.
Your data deserves to be exactly what you intended, character by character.
For personal projects and experimentation.
For teams that need production-grade transformation.
For organizations processing at planet-scale.
"We replaced an entire Python microservice with a single Morph pipeline. Our ETL went from 47 seconds to 0.3. I literally do not understand how we shipped before this."
"Our NLP team was manually lowercasing 12M documents. Morph did it in a single pass. We freed up three engineers who now work on actual problems."
"The squeeze flag alone saved us from a compliance incident. Turns out doubled delimiters in CSV exports break downstream parsers. Morph caught what regex missed."
"I used to write sed one-liners for case conversion. Now I just pipe through Morph and move on with my life. It's the tool you didn't know you needed until you can't live without it."
Real transformations. Real output. Try each example below.
Morph operates at the character level, not the pattern level. It maps individual characters from one set to another in a single, deterministic pass. No backtracking, no catastrophic performance, no ambiguity. Regex solves a fundamentally different (and more complex) problem. When you just need character-level transformation, Morph is the correct primitive.
No. By design, Morph reads exclusively from stdin and writes to stdout. This is not a limitation — it's a feature. Morph is a pure function: data in, transformed data out. Pipe to it from cat, echo, or any process. This makes Morph infinitely composable in any pipeline.
Absolutely. You can combine -d and -s to first delete a character set
and then squeeze repeats in the remaining output. Squeezing always occurs after translation or
deletion. This is how advanced teams normalize data in a single pass.
POSIX character classes like [:alpha:], [:digit:], and
[:upper:] provide semantic, locale-aware character targeting. Instead of hardcoding
a-z, [:lower:] adapts to the active locale. For production systems
that handle internationalized data, this is the right abstraction.
The -c flag inverts your character set. Instead of targeting the characters in SET1,
Morph targets everything except those characters. This is incredibly powerful for
whitelisting: define what you want to keep, and Morph handles the rest.
Join 14,000+ engineers who have already signed up for early access to Morph. We're shipping invites every week.
No spam. Just characters, transformed.
Follow us on Twitter
Our Twitter presence is currently in private beta. Drop your handle below and we'll reach out when we go live.