Comparison

Sentroy vs AWS S3

S3 is the de-facto object store. Sentroy Storage is an open alternative — buckets, multipart upload, signed URLs — bundled with a CDN and on-the-fly image transforms. This page is an honest side-by-side and a migration snippet so you can decide where each one fits.

Quick comparison#

The five questions most teams care about when picking object storage.

 SentroyAWS S3
Pricing modelFlat platform tier; storage + bandwidth bundledPer-GB storage + per-request + per-GB egress (CloudFront extra)
Self-hostableYes — Sentroy storage-api-server runs on your S3 / MinIO backendNo — AWS-managed only (MinIO is closest API-compatible analog)
Open formatsS3-compatible under the hood; standard multipart, signed URLsS3 API is the standard the rest of the industry copies
Lock-inLow — S3 backend is yours; SDK is portableModerate — egress fees + IAM integration encourage staying
Bundled with other productsCDN + image transforms + mail + auth + vault, one tenantStorage only; CloudFront + Lambda@Edge + SES separately

What is the same#

The places these two products meaningfully overlap.

  • Both are bucket-based object stores with hierarchical key naming.
  • Both support multipart upload for large files.
  • Both ship signed-URL flows for time-limited browser uploads and reads.
  • Both can be backed by the same underlying infrastructure — Sentroy uses S3 (or any compatible) under the hood.
  • Both support public, private, and signed object visibility.

What is different#

Honest differences in both directions.

Where Sentroy is different

  • CDN is built in — uploads are served from cdn.sentroy.com with no separate CloudFront distribution to wire.
  • On-the-fly image transforms — request /f/<id>/thumb and Sentroy serves the resized variant via sharp; no Lambda@Edge or separate image service to deploy.
  • Cascade delete — deleting a bucket or media row purges the CDN cache and S3 objects atomically.
  • Same access token reaches mail / auth / vault; one credential per company.
  • Flat pricing — no per-GET, per-PUT, per-egress accounting to model.

Where AWS S3 is different

  • The reference implementation — every other object store copies its API. Maximum tooling ecosystem.
  • Storage classes (Glacier, Deep Archive) for cold data at fraction-of-a-cent / GB / month.
  • Cross-region replication, versioning, object lock, and a deep IAM matrix — useful for regulated workloads.
  • S3 Object Lambda for inline content transforms — when you need something Sentroy's image pipeline doesn't cover.
  • 11 nines of durability with multi-AZ replication baked into the SLA.

When to pick Sentroy#

Concrete situations where Sentroy is the better call.

  • You ship user-uploaded images and need responsive thumbnails without writing a transform service.
  • You don't want to model per-request + per-egress + CloudFront pricing — flat fee is easier to predict.
  • You already use Sentroy for mail or auth and want avatars / attachments to live in the same tenant.
  • You want a single SDK call for upload-and-serve, with the CDN URL returned in the response.

When to stick with AWS S3#

Cases where staying on S3 is the right call.

  • You store cold / archival data at scale — Glacier / Deep Archive economics aren't replicated yet.
  • You depend on object lock, cross-region replication, or fine-grained IAM for regulatory reasons.
  • You're already deep in the AWS ecosystem — VPC endpoints, Lambda triggers, Athena queries — and S3 is the seam.

Migration#

One operation, both SDKs side by side.

Upload a file from a server-side route:

before.ts — AWS S3ts
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"

const s3 = new S3Client({ region: "us-east-1" })

await s3.send(
  new PutObjectCommand({
    Bucket: "acme-uploads",
    Key: "avatars/jane.png",
    Body: fileBuffer,
    ContentType: "image/png",
    ACL: "public-read",
  }),
)

const url = `https://acme-uploads.s3.us-east-1.amazonaws.com/avatars/jane.png`
// Plus a CloudFront distribution if you want CDN edge caching
after.ts — Sentroyts
import { Sentroy } from "@sentroy-co/client-sdk"

const sentroy = new Sentroy({
  baseUrl: "https://sentroy.com",
  companySlug: "acme",
  accessToken: process.env.SENTROY_ACCESS_TOKEN!,
})

const media = await sentroy.media.upload({
  bucketId: "<uploads-bucket-id>",
  file: fileBuffer,
  filename: "jane.png",
  contentType: "image/png",
  visibility: "public",
})

console.log(media.url)       // cdn.sentroy.com/f/<id> — already cached at edge
console.log(media.thumbUrl)  // /f/<id>/thumb — auto image transform

Sentroy returns the public CDN URL and an automatically-derived thumbnail URL in the upload response — no separate distribution, no Lambda@Edge, no sharp microservice in your VPC.