Limitations

Oyster implements the most commonly used S3 operations. The sections below document what's different from a full AWS S3 deployment.

Supported vs. Not Supported

FeatureStatusNotes
CreateBucketSupported
HeadBucketSupported
ListBucketsSupportedMax 1000, no pagination
DeleteBucketSupportedRequires empty bucket (same as AWS S3)
PutObjectSupportedSingle-part only
GetObjectSupported
HeadObjectSupported
DeleteObjectSupported
ListObjectsV2SupportedPrefix, delimiter, pagination
Conditional RequestsSupportedIf-Match, If-None-Match on object operations
Multipart UploadNot supportedUse single PutObject (max 1 GB)
CopyObjectNot supportedDownload and re-upload instead
DeleteObjects (batch)Not supportedDelete one at a time
Object VersioningNot supportedOverwrite replaces the object
Bucket PoliciesNot supported
ACLsNot supported
CORSNot supported
Server-Side EncryptionNot supportedData is stored unencrypted
Object TaggingSupportedget/put/delete; shares tags with JSON API
Custom Metadata HeadersNot supportedOnly Content-Type is stored
Website HostingNot supported
S3 SelectNot supported
Storage ClassesNot supportedAll objects are STANDARD
Transfer AccelerationNot supported
Inventory / AnalyticsNot supported
Object Lock / Legal HoldNot supported
Lifecycle RulesNot supportedSee automatic expiration below

Behavioral Differences

Object Expiration

All objects in a bucket share the owning account's StoragePool lifetime, with no per-object expiration to set. Oyster runs a background extension service that renews the pool before it expires, so objects persist indefinitely as long as the service is running and the account's wallet stays funded. See Blob Lifecycle for the model.

Bucket Naming

Oyster's bucket naming rules are slightly stricter than AWS S3:

RuleAWS S3Oyster
Dots (.) in namesAllowedNot allowed
Underscores (_) in namesAllowedNot allowed
Consecutive hyphens (--)AllowedNot allowed
Reserved namesNonehealth, ready, metrics, api

ListBuckets Limit

ListBuckets returns a maximum of 1000 buckets with no pagination support.

Path-Style URLs Only

Oyster only supports path-style S3 URLs:

http://endpoint/bucket-name/key

Virtual-hosted-style URLs (bucket-name.endpoint/key) are not supported. Always set force_path_style: true in your SDK configuration.

No Region Semantics

Oyster ignores the region in S3 requests. All data is stored in the same location. You still need to specify a region for SigV4 signing to work, so use any valid region string, for example us-east-1.

ETag Format

ETags are always the MD5 digest of the object content, even for large objects. There is no multipart ETag format, because multipart upload is not supported.

Conditional Request Headers

If-Match and If-None-Match headers are supported on PutObject, GetObject, HeadObject, and DeleteObject (If-Match only). These enable cache validation (If-None-Match returns 304 on GET/HEAD) and safe concurrent writes (If-Match for optimistic locking, If-None-Match: * for create-only semantics). Time-based conditionals (If-Modified-Since, If-Unmodified-Since) are not supported.