Self-hosted file browser for storage you already own. Point it at local folders or S3-compatible buckets—no new blob store. You get a web UI to browse, search, tag, share with links, and manage team access. Less heavy than a full cloud suite; nicer than SSH or the raw S3 console.
Cap.2026-04-26.at.18.31.30.mp4
1. Env file
node -e "const fs=require('node:fs'); const crypto=require('node:crypto'); fs.writeFileSync('.env.local', ['PORT=3000','BETTER_AUTH_URL=http://localhost:3000','DATABASE_URL=/app/.data/drivecellar.db',`BETTER_AUTH_SECRET=${crypto.randomBytes(48).toString('hex')}`,`CONNECTION_ENCRYPTION_KEY=${crypto.randomBytes(32).toString('hex')}`,''].join('\n'))"2. Run
docker run -d \
--name drivecellar \
-p 3000:3000 \
--env-file .env.local \
-v drivecellar-data:/app/.data \
ghcr.io/bimsina/drivecellar:latestOpen http://localhost:3000.
Inline env (no file)
docker run -d \
--name drivecellar \
-p 3000:3000 \
-e PORT=3000 \
-e BETTER_AUTH_URL=http://localhost:3000 \
-e DATABASE_URL=/app/.data/drivecellar.db \
-e BETTER_AUTH_SECRET="$(openssl rand -hex 48)" \
-e CONNECTION_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
-v drivecellar-data:/app/.data \
ghcr.io/bimsina/drivecellar:latestIncludes a Dockerfile. Pick a host that runs containers and attaches a persistent disk for SQLite (Published image, .env.example).
|
|
|
|
|
|
After deploy, set DATABASE_URL, BETTER_AUTH_URL (public https:// origin), BETTER_AUTH_SECRET, CONNECTION_ENCRYPTION_KEY. Most hosts set PORT. The container runs pnpm db:migrate then starts the app.
Mount persistent storage where DATABASE_URL points (e.g. /app/.data). Cloud Run is ephemeral unless you add a volume—Railway, Render, or Koyeb are simpler for SQLite-on-disk.
| Area | What you get |
|---|---|
| Storage | Local paths; S3-compatible (AWS, MinIO, R2, etc.); multiple connections per org |
| Files | Browse, upload/download, folders, rename, delete |
| Search & org | Indexed search; tags; optional colors/icons |
| Sharing | Public links with optional expiry and password |
| Auth & teams | Email/password; workspaces; roles (owner, admin, member); connection defaults and per-user overrides (including folder scope) |
| Indexing | Auto index on new connection; manual re-index; optional schedule (e.g. 5m–weekly); run history (trigger, status, counts, errors) |
- Sign up → create a workspace → add a connection (indexed on create; optional re-index schedule in the form).
- Browse, or use Indexing on a connection for re-runs and history after the first index finishes.
cp .env.example .env.local # fill secrets
docker compose up -dUses ghcr.io/bimsina/drivecellar:latest and a persistent volume. Pin: DRIVECELLAR_IMAGE_TAG=v0.1.0 docker compose up -d.
App metadata lives in SQLite; file bytes stay on your connected backend. DriveCellar indexes names, paths, sizes, types for fast UI and search. Permissions are enforced in the app before any read/write against storage.
- Repo: github.com/bimsina/drivecellar
- Image:
ghcr.io/bimsina/drivecellar:<tag>· default port 3000
Required: DATABASE_URL, BETTER_AUTH_URL, BETTER_AUTH_SECRET, CONNECTION_ENCRYPTION_KEY
docker run \
--name drivecellar \
--publish 3000:3000 \
--env-file .env.local \
--volume drivecellar-data:/app/.data \
ghcr.io/bimsina/drivecellar:v0.1.0pnpm install
pnpm setup:env
docker compose -f docker-compose.yml -f docker-compose.build.yml up --buildpnpm install
pnpm setup:env
pnpm db:migrate
pnpm devProduction preview: pnpm build then pnpm preview.
TanStack Start, React 19, TanStack Router, tRPC, SQLite (better-sqlite3), Drizzle, Better Auth, Tailwind CSS v4, Zod.
- Local providers are restricted to their base path.
- S3 credentials are encrypted in SQLite.
- Shared-link passwords are salted hashes.
- MIT — see LICENSE.md.