I built a text pipeline API: 28 transforms, one endpoint, 1K free/day

I was tired of importing 47KB of string utilities across three services just to slugify a URL, camelCase a property, and base64-encode the result. So I built TextForge: 28 text transformations behind one REST endpoint. The problem: Every service had its own copy of slugify, camelCase, base64, extractEmails, etc. Version drift, bundle bloat, inconsistent behavior. The solution: One API, composable pipelines, predictable JSON. curl -X POST https://textforge.co/v1/run \ -H "Content-Type: applicatio
I was tired of importing 47KB of string utilities across three services just to slugify a URL, camelCase a property, and base64-encode the result.
So I built TextForge: 28 text transformations behind one REST endpoint.
The problem: Every service had its own copy of slugify, camelCase, base64, extractEmails, etc. Version drift, bundle bloat, inconsistent behavior.
The solution: One API, composable pipelines, predictable JSON.
curl -X POST https://textforge.co/v1/run \
-H "Content-Type: application/json" \
-d '{"input":"[email protected]","pipeline":["extractemails","slugify","base64encode"]}'
Enter fullscreen mode Exit fullscreen mode
{
"success": true,
"result": "dXNlckBleGFtcGxlLmNvbQ==",
"steps": [
{"step":1,"action":"extractemails","result":["[email protected]"]},
{"step":2,"action":"slugify","result":"user-example-com"},
{"step":3,"action":"base64encode","result":"dXNlci1leGFtcGxlLWNvbQ=="}
],
"execution_time_ms": 3
}
Enter fullscreen mode Exit fullscreen mode
28 transforms: case conversions (camel, snake, kebab, pascal, constant, sentence, title), encoding (base64, HTML, URL, leet, morse), extraction (emails, URLs, numbers), cleaning (trim, remove special, multiple spaces), analysis (word count, palindrome, hash), generation (random strings).
Pricing: Free = 1,000 req/day, no key. Pro = $2.99/mo for 50k/day, webhooks, batch (100 items), API keys, analytics.
Stack: Express + PostgreSQL + Redis on Railway. OpenAPI 3.0 at /api-docs. Dashboard at /dashboard.
Built it because the alternative was maintaining string-utils v2.3.1 across five repos. Now it's one HTTP call.
Feedback welcome — especially on transforms you'd add.

