Skip to content

Badbird5907/silo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Apr 29, 2026
2a05b22 · · Apr 29, 2026

History

186 Commits
Apr 23, 2026
Mar 10, 2026
Jan 27, 2026
Apr 29, 2026
Jan 27, 2026
Apr 26, 2026
Apr 29, 2026
Apr 23, 2026
Apr 29, 2026
Apr 25, 2026
Mar 11, 2026
Apr 21, 2026
Apr 18, 2026
Apr 23, 2026
Apr 26, 2026
Jan 27, 2026
Jan 27, 2026
Apr 23, 2026
Apr 26, 2026
Apr 23, 2026
Apr 7, 2026

Repository files navigation

Silo

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.

Read the Docs!

Why Silo

  • 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

Easy to use SDK

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;;

What's In This Repo

This repository is a pnpm/turborepo monorepo containing the full Silo stack:

  • apps/cf-worker: the Cloudflare Worker that handles uploads and storage operations
  • apps/nextjs: the web app frontend (on Vercel)
  • apps/docs: the documentation site
  • sdk/*: SDK packages for core, server, React, Next.js, and TanStack Start integrations
  • packages/*: shared workspace packages used across the apps and SDKs

Get Started

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.

Local Development

Silo targets:

  • Node.js ^24.15.0
  • pnpm ^10.19.0

Install dependencies from the repo root:

pnpm install

Common commands:

pnpm dev
pnpm dev:next
pnpm dev:worker --local
pnpm --filter @silo-storage/docs devdev

Documentation

The docs source lives in apps/docs/content/docs. If you prefer browsing the docs app locally, run::

pnpm --filter @silo-storage/docs dev