Veilkit — Docs

Quiet tools for loud results.

Quickstart

Machine-readable spec: OpenAPI JSON

  • /clean and /normalize accept application/json and return JSON.
  • /strip (EXIF Stripper) returns the **image bytes**. Use multipart/form-data (recommended) or JSON with base64.
  • Browser demos call Workers cross-origin; CORS is enabled.

cURL (JSON → JSON)

curl -s -X POST "https://subtitle-cleaner.edgepipe.workers.dev/clean" \
  -H "content-type: application/json" \
  -d '{
  "type":"srt",
  "options": {"remove_hi": true, "max_chars_per_line": 42},
  "content": "1\n00:00:01,000 --> 00:00:02,500\n[Music] Hello!"
}'

JavaScript (fetch → JSON)

const r = await fetch("https://filename-normalizer.edgepipe.workers.dev/normalize", {
  method: "POST",
  headers: {"content-type":"application/json"},
  body: JSON.stringify({
    filenames: ["Résumé Final .PDF", "con.txt"],
    options: { mode: "slug", keep_accents: true }
  })
});
const data = await r.json();

EXIF Stripper (multipart → image)

# cURL (multipart)
curl -s -X POST "https://exif-stripper.edgepipe.workers.dev/strip" \
  -F "file=@/path/to/photo.jpg" \
  -o stripped.jpg -D -
<!-- JS (FormData) -->
const fd = new FormData();
fd.append("file", fileInput.files[0]);
const res = await fetch("https://exif-stripper.edgepipe.workers.dev/strip", { method: "POST", body: fd });
const blob = await res.blob(); // image/jpeg|png|webp

APIs

Subtitle Cleaner live

POST https://subtitle-cleaner.edgepipe.workers.dev/clean

  • Input: SRT or VTT content (JSON)
  • Options: remove_hi, max_chars_per_line, merge_short_lines, dedupe
  • Output: cleaned srt + plain txt (JSON)
Example
curl -s -X POST "https://subtitle-cleaner.edgepipe.workers.dev/clean" \
  -H "content-type: application/json" \
  -d '{"type":"srt","options":{"remove_hi":true},"content":"1\n00:00:01,000 --> 00:00:02,500\n[Music] Hello!"}'

Filename Normalizer live

POST https://filename-normalizer.edgepipe.workers.dev/normalize

  • Modes: slug (ASCII or Unicode) and preserve
  • Options: keep_accents; Windows reserved names handled
  • Output: { results: [{ input, output }] }
Example
curl -s -X POST "https://filename-normalizer.edgepipe.workers.dev/normalize" \
  -H "content-type: application/json" \
  -d '{"filenames":["Résumé Final .PDF","con.txt"],"options":{"mode":"slug","keep_accents":true}}'

EXIF Stripper live

POST https://exif-stripper.edgepipe.workers.dev/strip

  • Input: JPEG/PNG/WebP — multipart (file) or JSON (base64)
  • Output: image bytes without metadata (same format)
  • Headers: Content-Disposition includes a suggested filename
Examples
# cURL (multipart)
curl -s -X POST "https://exif-stripper.edgepipe.workers.dev/strip" \
  -F "file=@/path/to/photo.jpg" -o stripped.jpg -D -
// JS (fetch + preview)
const fd = new FormData();
fd.append("file", file);
const r = await fetch("https://exif-stripper.edgepipe.workers.dev/strip", { method: "POST", body: fd });
const blob = await r.blob(); // image/*
const url = URL.createObjectURL(blob);
img.src = url; // preview
// download:
const a = document.createElement('a'); a.href = url; a.download = 'stripped.jpg'; a.click(); URL.revokeObjectURL(url);

Pricing

Start free; upgrade when you need more capacity.

See Pricing for tiers, limits, and terms.

FAQ

Do I need an API key? Free demos don’t. Paid tiers will use keys (or RapidAPI).

Where’s the code? github.com/veilkit/veilkit

Rate limits? Reasonable use is fine; excessive traffic may be throttled. Paid tiers come with explicit quotas.