Silo is an open-source file storage and upload system built for the modern web. It's built on top of Cloudflare's R2 and Workers, and includes typed SDKs for server and client apps, so you can add resumable uploads without relying on the browser to report completion correctly..
Instead of the usual "presigned URL, then hope the client tells your app it finished" flow, Silo treats upload completion as a server-owned event. Files are uploaded with the TUS protocol for resumability, and Silo sends a signed callback back to your application when the upload actually completes.
- Resumable uploads via TUS
- Server-verified completion callbacks
- Cloudflare R2 and Workers as the storage/runtime layer
- Fully-typed SDK packages for framework and client integrations
- Easy to use (optional) TRPC-esque router API for server side file routing
- Support for signed/private file ACLs
- Support for image transformations and delivery
const f = createSiloUploadRequest, UploadContext>gt;();
export const fileRouter = {
imageUploader: f()
.middleware(async ({ context }) =>gt; {
return { userId: context.userId };
})
.expects({
image: {
maxFileSize: "8MB",
maxFileCount: 4,
mimeTypes: ["image/png", "image/jpeg"],
},
})
.expires("30 minutes") // delete after 30 minutes
.public(false) // do we need a signed url to access?
.serveImage(true) // serve images from the image CDN (transformations etc)
.onUploadComplete(async ({ file, core, metadata }) =>gt; {
return {
uploadedBy: metadata.userId,
fileKeyId: file.fileKeyId,
expiresAt: file.expiresAt,
url: await core.generateImageUrl(file.accessKey),
test: "hello",
};
}),
} satisfies FileRouterRequest, UploadContext>gt;; This repository is a pnpm/turborepo monorepo containing the full Silo stack:
apps/cf-worker: the Cloudflare Worker that handles uploads and storage operationsapps/nextjs: the web app frontend (on Vercel)apps/docs: the documentation sitesdk/*: SDK packages for core, server, React, Next.js, and TanStack Start integrationspackages/*: shared workspace packages used across the apps and SDKs
If you want to use Silo in an application, start with the SDK docs:
If you want to run the full platform yourself, follow the deployment guide.
Silo targets:
- Node.js
^24.15.0 - pnpm
^10.19.0
Install dependencies from the repo root:
pnpm installCommon commands:
pnpm dev
pnpm dev:next
pnpm dev:worker --local
pnpm --filter @silo-storage/docs devdevThe docs source lives in apps/docs/content/docs.
If you prefer browsing the docs app locally, run::
pnpm --filter @silo-storage/docs dev