Backed by mandō

Transform every character.
Instantly.

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.

JM KR AP TL
Trusted by 14,000+ engineers
morph-engine
$ echo "hello world" | morph a-z A-Z
HELLO WORLD
$ echo "data!!!!" | morph -s '!'
data!
$ echo "v2.0.1" | morph -d '[:digit:]'
v..
$ echo "Hello World" | morph '[:upper:]' '[:lower:]'
hello world
🔄 @shipfast_dev just uppercased 2.1M headers via Morph API
✂️ @DataCleanCo deleted all control characters from 800K records
🔤 @nlp_sarah squeezed 47M whitespace sequences in under 3 seconds
🧹 @etl_pipeline_9 stripped digits from 12M SKU fields
💎 @migrationbot translated newlines to spaces across 500K log entries
@security_team complemented character set to sanitize 3.2M inputs

Character-level precision.
Stream-level scale.

Morph handles every character transformation primitive your pipeline needs — from simple case-folding to surgical deletion to intelligent deduplication.

🔄

Character Translation

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.

✂️

Surgical Deletion

Remove exactly the characters you don't want with -d. Delete digits, control characters, punctuation, or any custom set. Zero false positives. Zero residue.

🫸

Squeeze Repeats

Collapse runs of repeated characters into single occurrences with -s. Normalize messy whitespace, clean doubled punctuation, flatten noisy telemetry — one flag.

🔀

Set Complement

Target everything except your specified characters with -c. Define what to keep, and Morph removes the rest. Whitelisting, not blacklisting.

📐

Character Classes

Use standard POSIX classes like [:alpha:], [:digit:], [:upper:], [:lower:], [:space:], [:punct:], and [:alnum:] for semantic, locale-aware targeting.

📊

Range Expressions

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.

🌊

Pure Stdin Streaming

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.

Three primitives.
Infinite transformations.

01

Define Your Character Sets

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' '*'
02

Choose Your Operation

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:]'
03

Pipe Your Data

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:]'
04

Ship Clean Output

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 -u
0
Engineering teams
0
Characters transformed
0
% Uptime SLA
0
ms avg latency

We believe data purity is a human right.

Every 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.

Simple, per-byte pricing.
No surprises.

Starter
$0/mo

For personal projects and experimentation.

  • 10M characters/month
  • Basic translation & deletion
  • Single character set at a time
  • Community support
  • stdout output only
Get Started
Enterprise
Custom

For organizations processing at planet-scale.

  • Unlimited everything
  • Dedicated transformation cluster
  • Custom escape sequences
  • Multi-locale byte support
  • SOC 2 compliance
  • 24/7 character concierge
Contact Sales

Don't take our word for it.

★★★★★

"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."

Ivan Ramirez
Ivan Ramirez Staff Engineer, DataPipelineCo
★★★★★

"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."

Marcus Liu
Sana Patel VP Eng, LinguaForge AI
★★★★★

"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."

Eren Okonkwo
Derek Hollis SRE Lead, FinStack
★★★★★

"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."

Darian Patel
Maya Lin Principal SWE, CloudNova

See Morph in action.

Real transformations. Real output. Try each example below.

Uppercase Conversion

echo "hello world" | morph 'a-z' 'A-Z'
HELLO WORLD

Delete Digits

echo "hello 123 world" | morph -d '0-9'
hello world

Squeeze Whitespace

echo "hello     world" | morph -s ' '
hello world

Case Folding

echo "Hello World" | morph '[:upper:]' '[:lower:]'
hello world

Newlines to Spaces

printf "line1\nline2\nline3" | morph '\n' ' '
line1 line2 line3

Character Mapping

echo "h3ll0 w0rld" | morph '30' 'eo'
hello world

Try It Yourself

$

Frequently asked questions.

How is Morph different from regex-based replacements?

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.

Does Morph support file arguments?

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.

Can I combine deletion and squeezing?

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.

What are character classes and why should I use them?

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.

What does the complement flag (-c) do?

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.

Your data is messy.
Let's fix that.

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.

a mandō product · mandō portfolio ·