Storage-backed feature
Add a React media library with app-owned storage.
BTST adds uploads, folders, asset metadata, storage adapters, a searchable media library, picker UI, and image fields inside your application.
Best for
Teams that need a shared media layer for product features while keeping files, metadata, and storage credentials under their control.
- Requires
- An isolating Prisma, Drizzle, or Kysely database adapter for persistent writes; A configured media storage adapter
- External service boundary
- Optional S3-compatible storage or Vercel Blob when the adopter selects those adapters
- Ownership boundary
- Asset metadata stays in your database and files stay in the storage you configure. You own limits, access policy, and embedding; the library view can be ejected.

BTST supplies
- Asset and folder data models with typed upload, registration, and library APIs
- An SSR-aware media-library route with search, folders, and asset actions
- Embeddable MediaPicker and ImageInputField components
- Local, S3-compatible, and Vercel Blob storage adapter implementations
You supply
- A database adapter with isolated transaction support for persistent writes
- A configured storage adapter and its credentials or local upload directory
- Allowed MIME types, size limits, URL prefixes, and authorization policy
- The application routes and fields that embed the picker or image input
You own and customize
Asset metadata stays in your database and files stay in the storage you configure. You own limits, access policy, and embedding; the library view can be ejected.
Compatibility and dependencies
- Maintained integrations
- Next.js 15+ App Router · React Router v7 · TanStack Start
- Requires
- An isolating Prisma, Drizzle, or Kysely database adapter for persistent writes; A configured media storage adapter
- External services
- Optional S3-compatible storage or Vercel Blob when the adopter selects those adapters
From registration to result
The shipped workflow
This is the feature path BTST supplies—not a claim that your app needs no integration work.
Choose storage
Configure local, S3-compatible, or Vercel Blob storage in your backend.
Upload or register
Send a file through the matching protocol or register an allowed asset URL.
Organize
Search assets, maintain folders, and edit metadata in the library.
Reuse
Embed MediaPicker or ImageInputField wherever your application needs an asset.
Continue your task