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.
| Sentroy | AWS S3 | |
|---|---|---|
| Pricing model | Flat platform tier; storage + bandwidth bundled | Per-GB storage + per-request + per-GB egress (CloudFront extra) |
| Self-hostable | Yes — Sentroy storage-api-server runs on your S3 / MinIO backend | No — AWS-managed only (MinIO is closest API-compatible analog) |
| Open formats | S3-compatible under the hood; standard multipart, signed URLs | S3 API is the standard the rest of the industry copies |
| Lock-in | Low — S3 backend is yours; SDK is portable | Moderate — egress fees + IAM integration encourage staying |
| Bundled with other products | CDN + image transforms + mail + auth + vault, one tenant | Storage 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.comwith no separate CloudFront distribution to wire. - On-the-fly image transforms — request
/f/<id>/thumband Sentroy serves the resized variant viasharp; 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:
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 cachingimport { 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 transformSentroy 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.