2 pointsby larsenutvikling9 hours ago1 comment
  • larsenutvikling8 hours ago
    Solo builder here. Tinify.dev started as free web tools (compress / resize / crop - no ads, no watermarks, files deleted after two hours) and grew an API because I wanted one with a contract I could rely on.

    The parts I care about:

    - Compression never returns a file larger than the input. If recompression would grow the file, you get your original bytes back and `optimized: false` in the metadata. No fake savings. (Scoped to compression on purpose: resize and crop report size changes plainly, and format conversion can legitimately grow a file.) - Stable error envelope: every error is `{error: {code, message, details}, request_id}` with a fixed set of codes, plus `Retry-After` on 429/503. - Idempotency keys are required, not optional. Retrying a request can't double-spend your quota. - Batch endpoint takes up to 200 files.

    Stack is Kotlin/Spring with sharp doing the pixel work, on a Hetzner box. Limits: 40 MB / 50 megapixels per image; results expire after two hours.

    Free tier is 500 API operations a month, no card. Paid starts at $9/month for 2,000 operations.

    Not affiliated with Tinify B.V. (the company behind TinyPNG).

    Mostly after feedback on the API contract - error codes, the batch flow, what's missing. Happy to answer anything about running this on one machine.