A full-stack S3 storage management application with multi-credential support. BucketBird allows you to manage multiple S3-compatible storage providers (AWS S3, MinIO, DigitalOcean Spaces, etc.) from a single unified interface.
- Multi-Credential Support: Connect to multiple S3-compatible storage providers simultaneously
- User Authentication: Secure JWT-based authentication with refresh tokens
- Bucket Management: Create, view, update, and delete S3 buckets
- Object Operations: Upload, download, preview, rename, copy, and delete files
- Encrypted Credentials: S3 credentials are encrypted at rest using AES-256-GCM
- File Preview: Built-in preview for images, videos, audio, PDFs, and text files
- Modern UI: Responsive React interface with Tailwind CSS
- Docker Deployment: Complete containerized setup with Docker Compose
- Backend: Go HTTP API with Chi router, PostgreSQL for metadata, encrypted credential storage
- Frontend: React 19 SPA with Vite, TypeScript, Tailwind CSS, and TanStack Query
- Storage: Supports any S3-compatible service (MinIO, AWS S3, DigitalOcean, Wasabi, etc.)
- Database: PostgreSQL 15 for user accounts, sessions, bucket metadata, and credentials
- Go 1.23+ (for local backend development)
- Node.js 20+ (for local frontend development)
- Docker & Docker Compose (for full-stack runtime)
docker compose up --buildThis starts four containers:
- Frontend: http://localhost:3000
- Backend API: http://localhost:8080
- PostgreSQL:
localhost:5432(user:bucketbird, password:bucketbird) - MinIO: S3 API on
localhost:9000, Console on http://localhost:9001 (user:minioadmin, password:minioadmin)
- Open http://localhost:3000 in your browser
- Register a new account or use demo credentials (if enabled)
- Navigate to Settings → S3 Credentials
- Add your first credential:
- Name: Local MinIO
- Provider: MinIO
- Endpoint: http://minio:9000
- Region: us-east-1
- Access Key: minioadmin
- Secret Key: minioadmin
- Use SSL: No
- Create a bucket and start uploading files!
cd backend
go run ./cmd/bucketbird serveThe backend uses a CLI interface with subcommands. Available commands:
serve- Start the HTTP API servermigrate- Run database migrationsuser create- Create a new user accountuser delete- Delete a user accountuser list- List all usersuser reset-password- Reset a user's password
| Variable | Default | Description |
|---|---|---|
BB_APP_NAME |
bucketbird-api |
Service name used in logs |
BB_ENV |
development |
Environment (development/production) |
BB_HTTP_PORT |
8080 |
Port the API listens on |
BB_ALLOWED_ORIGINS |
* |
Comma-separated list of CORS origins |
BB_DB_HOST |
postgres |
Database host |
BB_DB_PORT |
5432 |
Database port |
BB_DB_NAME |
bucketbird |
Database name |
BB_DB_USER |
bucketbird |
Database user |
BB_DB_PASSWORD |
bucketbird |
Database password |
BB_JWT_SECRET |
required | JWT signing secret (keep secret!) |
BB_ENCRYPTION_KEY |
required | 32-byte key for credential encryption |
BB_ACCESS_TOKEN_TTL |
15m |
Access token lifetime |
BB_REFRESH_TOKEN_TTL |
7d |
Refresh token lifetime |
BB_ALLOW_REGISTRATION |
true |
Enable/disable self-service registration |
BB_ENABLE_DEMO_LOGIN |
false |
Enable demo account for testing |
Authentication
POST /api/v1/auth/register- Register a new userPOST /api/v1/auth/login- Login with email/passwordPOST /api/v1/auth/logout- Logout and invalidate sessionPOST /api/v1/auth/refresh- Refresh access token
Credentials
GET /api/v1/credentials- List user's S3 credentialsPOST /api/v1/credentials- Add new S3 credentialGET /api/v1/credentials/:id- Get credential detailsPUT /api/v1/credentials/:id- Update credentialDELETE /api/v1/credentials/:id- Delete credentialPOST /api/v1/credentials/:id/test- Test credential connection
Buckets
GET /api/v1/buckets- List user's bucketsPOST /api/v1/buckets- Create new bucketGET /api/v1/buckets/:id- Get bucket detailsPATCH /api/v1/buckets/:id- Update bucketDELETE /api/v1/buckets/:id- Delete bucketGET /api/v1/buckets/:id/objects- List objects in bucketPOST /api/v1/buckets/:id/objects- Upload file (presigned URL)DELETE /api/v1/buckets/:id/objects- Delete filesPATCH /api/v1/buckets/:id/objects/:key- Rename/move filePOST /api/v1/buckets/:id/objects/copy- Copy file
Profile
GET /api/v1/profile- Get current user profilePATCH /api/v1/profile- Update user profile
cd frontend
npm install
npm run devThe development server runs on http://localhost:5173. The frontend automatically connects to the backend API at http://localhost:8080.
Available Scripts:
npm run dev- Start development servernpm run build- Build for productionnpm run lint- Run ESLintnpm run preview- Preview production build
If self-service registration is disabled (BB_ALLOW_REGISTRATION=false), administrators can create accounts using the CLI:
# Using Docker
docker compose exec backend /app/bucketbird user create \
--email alex@example.com \
--password 'SecurePass123!' \
--first-name Alex \
--last-name Doe
# Local development
cd backend
go run ./cmd/bucketbird user create \
--email alex@example.com \
--password 'SecurePass123!' \
--first-name Alex \
--last-name DoeAdministrators can reset user passwords:
# Using Docker
docker compose exec backend /app/bucketbird user reset-password \
--email user@example.com \
--password "NewSecurePass123!"
# Local development
cd backend
go run ./cmd/bucketbird user reset-password \
--email user@example.com \
--password "NewSecurePass123!"View all registered users:
# Using Docker
docker compose exec backend /app/bucketbird user list
# Local development
cd backend
go run ./cmd/bucketbird user listRemove a user account:
# Using Docker
docker compose exec backend /app/bucketbird user delete \
--email user@example.com
# Local development
cd backend
go run ./cmd/bucketbird user delete \
--email user@example.comThe application uses database migrations to manage schema changes:
# Using Docker
docker compose exec backend /app/bucketbird migrate
# Local development
cd backend
go run ./cmd/bucketbird migrateMigrations are automatically run on application startup.
- Password Hashing: Argon2id for secure password storage
- Credential Encryption: AES-256-GCM encryption for S3 credentials at rest
- JWT Authentication: Secure token-based authentication with refresh tokens
- Token Rotation: Automatic refresh token rotation on use
- Session Management: Database-backed session tracking
- CORS Protection: Configurable allowed origins
- Input Validation: Comprehensive validation on all user inputs
backend/
├── cmd/bucketbird/ # Main application entry point
│ ├── main.go # CLI entry point
│ └── cmd/ # CLI commands (serve, migrate, user)
├── internal/
│ ├── api/ # HTTP handlers by domain
│ │ ├── auth/ # Authentication endpoints
│ │ ├── buckets/ # Bucket management endpoints
│ │ ├── credentials/ # S3 credential endpoints
│ │ └── profile/ # User profile endpoints
│ ├── config/ # Configuration management
│ ├── domain/ # Domain models
│ ├── middleware/ # HTTP middleware (auth, security, logging)
│ ├── repository/ # Data access layer
│ │ └── sqlc/ # Generated SQL queries
│ ├── service/ # Business logic layer
│ └── storage/ # S3 object storage client
├── pkg/
│ ├── crypto/ # Password hashing & encryption
│ └── jwt/ # JWT token management
└── migrations/ # Database migration files
frontend/
├── src/
│ ├── api/ # API client
│ ├── components/ # React components
│ │ ├── auth/ # Authentication components
│ │ ├── buckets/ # Bucket management UI
│ │ ├── files/ # File upload/preview components
│ │ └── layout/ # Layout components
│ ├── contexts/ # React contexts (Auth)
│ ├── hooks/ # Custom React hooks
│ ├── pages/ # Page components
│ └── types/ # TypeScript type definitions
└── public/ # Static assets
config/ # Kamal deployment configs
docker-compose.yml # Docker compose orchestration
Backend:
- Go 1.23
- Chi Router - HTTP routing
- PostgreSQL 15 - Database
- sqlc - Type-safe SQL
- AWS SDK for Go v2 - S3 operations
- Argon2 - Password hashing
- AES-256-GCM - Credential encryption
Frontend:
- React 19
- TypeScript
- Vite - Build tool
- Tailwind CSS - Styling
- TanStack Query - Server state management
- React Router - Client-side routing
Infrastructure:
- Docker & Docker Compose
- MinIO - S3-compatible storage (for local development)
BucketBird supports any S3-compatible storage provider:
- AWS S3 - Amazon's object storage
- MinIO - Self-hosted S3-compatible storage
- DigitalOcean Spaces - DigitalOcean's object storage
- Wasabi - Hot cloud storage
- Backblaze B2 - Low-cost cloud storage
- Cloudflare R2 - Zero egress fees storage
- Custom S3-compatible services
- Trash/restore functionality for deleted files
- File sharing with public/private links
- User activity tracking and audit logs
- Bucket sharing and collaboration
- Advanced search and filtering
- Batch operations for files
- Storage usage analytics and quotas
- Email notifications
- Two-factor authentication (2FA)
- API rate limiting per user
- Automated testing (unit, integration, E2E)
Contributions are welcome! Please feel free to submit issues and pull requests.
This project is licensed under the MIT License.