TextForge exposes 28 deterministic text transformations behind a single HTTPS API: slugify, camelCase, base64, email extraction, and batch processing with predictable JSON.
No reviews yetBe the first to leave a review for TextForge
Maker
📌
Hey Product Hunt! 👋
I built TextForge because our logging pipeline was importing 47KB of string utilities (lodash, validator, custom snippets) across 5 services just to slugify URLs, camelCase keys, and base64-encode the result.
What it does:
28 text transformations behind one REST endpoint (/v1/run)
Composable pipelines: each step's output becomes the next step's input
Sub-5ms p95 latency, HTTPS-only, CORS-enabled
Free tier: 1,000 requests/day, no API key required
Pro: $2.99/mo for 50K/day, webhooks, batch (100 items), analytics
Example:
curl -X POST https://textforge.co/v1/run \
-H "Content-Type: application/json" \
-d '{"input":"user@example.com","pipeline":["extractemails","slugify","base64encode"]}'
Transforms included: 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), utils (reverse, truncate).
Stack: Express + PostgreSQL + Redis on Railway. OpenAPI spec at /api-docs. Dashboard at /dashboard.
Free tier is genuinely usable — not a trial, no credit card. Upgrade when your volume is real.
Happy to answer questions about the architecture, rate limiting design, or why we chose REST over GraphQL for this.
Report
How does the batch endpoint handle rate limits when I push a few thousand payloads through it, and is there a synchronous mode if I need results back in the same call?
Report
Maker
Rate limits: /batch uses the same limiter as /v1/run. Each batch request = 1 request toward your daily/minute quota (Free: 1K/day, 60/min; Pro: 50K/day, 1K/min). The 100 items inside don't multiply the count.
For a few thousand payloads: Chunk into multiple batch requests (max 100 items each). 1,000 items = 10 batch calls = 10 rate-limit hits. Free tier handles this fine.
Synchronous? Yes — processes all items via Promise.all and returns all results in the same HTTP response. No polling needed.
Limits: 100 items/request, 100KB/item. Order preserved via index.
Hit the slugify endpoint a few times and the results were identical every run, which is exactly what I want from a text API. The batch endpoint handled a mixed list of strings cleanly in one call.
Report
Slugs came back identical across two runs, which is exactly what I needed for a flaky build script. The batch endpoint saved me from looping through 200 lines of copy myself.
How does the batch endpoint handle rate limits when I push a few thousand payloads through it, and is there a synchronous mode if I need results back in the same call?
Rate limits: /batch uses the same limiter as /v1/run. Each batch request = 1 request toward your daily/minute quota (Free: 1K/day, 60/min; Pro: 50K/day, 1K/min). The 100 items inside don't multiply the count.
For a few thousand payloads: Chunk into multiple batch requests (max 100 items each). 1,000 items = 10 batch calls = 10 rate-limit hits. Free tier handles this fine.
Synchronous? Yes — processes all items via Promise.all and returns all results in the same HTTP response. No polling needed.
Limits: 100 items/request, 100KB/item. Order preserved via index.
Webhook: Optional, fire-and-forget. If provided, receives results asynchronously; response returns immediately regardless.
Endpoint: POST /v1/batch — { "action": "slugify", "items": ["hello world", "foo bar"], "webhook": "https://..." }
Hit the slugify endpoint a few times and the results were identical every run, which is exactly what I want from a text API. The batch endpoint handled a mixed list of strings cleanly in one call.
Slugs came back identical across two runs, which is exactly what I needed for a flaky build script. The batch endpoint saved me from looping through 200 lines of copy myself.