From system-design-skills
Guides design of blob/object storage for large unstructured data (images, video, backups). Covers S3-compatible stores, multipart upload, signed URLs, durability (replication vs erasure coding), versioning, tiering, and key trade-offs.
How this skill is triggered — by the user, by Claude, or both
Slash command
/system-design-skills:blob-storeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Store large, immutable, unstructured objects — images, video, backups, model
Store large, immutable, unstructured objects — images, video, backups, model weights, document blobs — in a flat namespace keyed by a string, replicated for durability and served by direct download. Getting it wrong means stuffing multi-megabyte blobs into a row-oriented database (where they bloat the working set, wreck cache locality, and cap throughput) or hand-rolling a file server that loses data on the first disk failure.
Objects are large (KB to GB), written once and read many times, and you only ever
fetch them whole by key — never query inside them. Photo/video stores, user
uploads, backups, data-lake/ML datasets, static-site assets, log archives. The
access pattern is PUT key → GET key, durability matters, and the total volume is
too large or too cold to sit in a primary database.
Small structured records you query, filter, sort, or join — that is data-storage.
Data that needs transactions, secondary indexes, or partial updates (blobs are
replace-whole, not edit-in-place). Low-latency reads of tiny values (a KV cache or
caching wins). A few files on one box that never grow — the local filesystem is
fine; a blob store is operational overhead you do not need yet (YAGNI). Naming
"object storage" for a workload that is really a database is failure mode #2.
back-of-the-envelope.Durability scheme (how many copies, what shape)
references/deep-dive.md.)Storage tier (price/latency/retrieval trade)
Upload path
Mutation model
| Option | What it solves | What it worsens | Change it when |
|---|---|---|---|
| N-way replication | Simple, fast reads, fast rebuild | 3x+ storage cost | Data is large/cold and cost dominates → erasure coding |
| Erasure coding | Same durability at ~1.4x storage | CPU + multi-node read on every fetch; slow small-object reads; costly rebuild | Objects are small/hot and latency matters → replication |
| Hot tier | Low-latency serving | Highest $/GB | Data goes cold and is rarely read → cool/archive |
| Archive tier | Cheapest at-rest storage | Minutes–hours to first byte; retrieval fees | Anything ends up on a latency-sensitive path → hot/cool |
| Multipart/resumable upload | Large files survive flaky links; parallel throughput | More client logic; orphaned parts cost money | Objects are small → single PUT |
| Versioning | Undo, history, overwrite protection | Storage grows silently; needs lifecycle expiry | Only latest matters → overwrite, last-writer-wins |
| Signed URLs | Offload transfer off your app; scoped access | Leaked/over-broad URLs; clock-skew expiry bugs | Content is fully public → CDN + public read |
A blob store rarely "falls over" the way a database does, but it amplifies trouble in specific ways.
content-delivery), randomize/hash key prefixes, replicate the hot object.messaging-streaming), set expectations on latency.Monitor: request rate and error rate per operation (PUT/GET/DELETE), p99 first-byte latency, durability/repair queue depth, per-prefix hotness, incomplete-multipart count, and egress volume + cost.
data-storage.Do
Don't
The figures that drive the design: total stored bytes × durability overhead (replication
≈ 3x, erasure coding ≈ 1.3–1.5x), object count (the metadata index scales with count, not
size), peak upload/download QPS, and monthly egress (often the dominant cost). Object-store
durability targets are commonly quoted around eleven nines; treat that as a design goal set
by the durability scheme, not a given. For the actual storage/bandwidth/QPS arithmetic and
unit conversions, use back-of-the-envelope — do not restate its tables here.
The contract is small and key-addressed:
PUT /{bucket}/{key} body=bytes, headers: Content-Type, optional checksum
GET /{bucket}/{key} → bytes (supports Range for partial/streamed reads)
DELETE /{bucket}/{key} → tombstone (new version if versioning on)
HEAD /{bucket}/{key} → metadata only (size, etag, version-id)
# multipart: Initiate → UploadPart×N (parallel, retryable) → Complete | Abort
# signed URL: presign(GET|PUT, key, expiry) → time-limited URL the client uses directly
The key is the whole index (e.g. userId/2026/photo-uuid.jpg); choose it for both
access pattern and prefix spread. The etag/checksum lets clients verify integrity and
do conditional requests. The database stores this key plus app metadata, not the bytes.
Default to the generic recipe above. If the user names a cloud, read
references/providers/<provider>.md for the managed-service mapping, quotas/limits, and
provider-specific trade-offs. If no file exists for that provider, the generic recipe is
the answer.
To visualize the upload/download path (client → signed URL → store; CDN fronting GET; index
mapping key → shards) or the EC write fan-out, use the in-plugin architecture-diagram
skill — show the metadata index as a distinct node and the CDN as the edge layer. Do not
embed Mermaid here.
content-delivery — pairs with this: a CDN fronts the blob origin so repeat reads are
served from the edge and the store handles only cache fills (edge caching is owned there).data-storage — alternative to this for large unstructured objects: store the blob here,
keep a pointer (key + metadata) in the DB; sharding/indexing the metadata is owned there.back-of-the-envelope — depends on this for storage, object-count, QPS, and egress sizing
(the numbers that pick replication vs EC and a tier live there).messaging-streaming — pairs with this to queue async work like cold-tier retrieval and
post-upload processing (transcode, thumbnail); delivery guarantees are owned there.caching — pairs with this for hot small-object reads and metadata-lookup offload.system-design — owned-concept lives in the orchestrator: the reasoning loop, the
trade-off method, and the ten failure modes.references/deep-dive.md — chunking, the metadata index, erasure-coding math and read
path, durability/repair, versioning + lifecycle, multipart internals, signed-URL mechanics.
Read when designing the store in detail.references/providers/{generic,aws,azure,gcp}.md — service mappings, decision-changing
limits, and pitfalls per environment.npx claudepluginhub proyecto26/system-design-skillsGuides file storage and CDN setup with object storage (S3, GCS, Azure Blob), presigned URLs, image/video processing pipelines, lifecycle policies, cost optimization, and backups.
Expert knowledge for Azure Blob Storage: troubleshooting, best practices, limits, security, configuration, and deployment. Covers Blob tiers, Data Lake, NFS/SFTP/BlobFuse, SAS/RBAC auth, and static website hosting.
Handles file uploads and cloud storage (S3, Cloudflare R2) with presigned URLs, multipart uploads, and image optimization. For large files without blocking.