A free and open-source desktop S3 bucket manager built with Bun, Electrobun, React, Tailwind CSS, daisyUI, and Zustand.
- Multi-Provider Support — AWS S3, Cloudflare R2, DigitalOcean Spaces, MinIO, GCS, Backblaze B2, or any S3-compatible endpoint
- Profile Management — Add, edit, delete, and test connection for each storage profile
- Default Bucket — Optional default bucket per profile for bucket-scoped API tokens (e.g. R2 Object tokens that can't list buckets)
- Provider-Aware Defaults — Auto-sets region and endpoint templates when switching providers (e.g.
autofor R2,nyc3for Spaces) - Encrypted Vault — AES-256-GCM encrypted local vault with PBKDF2 key derivation; API keys never leave the main process
- OS Keychain Integration — Optional passphrase caching via keytar for auto-unlock
- Table & Grid Views — Switch between detailed table and visual grid layouts
- Breadcrumb Navigation — Drill into folders with a clickable breadcrumb trail
- Multi-Select — Select multiple objects for bulk operations
- Object Pagination — Handles large buckets with paginated listing
- File Type Icons — ~40+ extension-mapped icons for quick visual identification
- Object Stats — View metadata for individual objects
- Tabs — Open multiple buckets in tabs; tabs persist across sessions and auto-switch profiles when activated
- Favorite Buckets — Pin buckets across any profile; favorites appear in a dedicated sidebar section and auto-switch profiles on click
- Upload — Upload files or entire folders with native file picker; supports streaming multipart uploads (5 MB+ files)
- Download — Download objects or entire folders to local disk with folder picker
- Download as Archive — Download multiple objects or folders as a single gzipped tarball
- Copy & Move — Copy or move objects across buckets and profiles with streaming multipart support
- Cross-Bucket Transfer — Copy or move individual files and folders to any bucket on any profile via a destination picker dialog; supports batch selection from the toolbar or single-item transfers from the context menu
- Rename — Rename objects in place
- Delete — Bulk delete with confirmation dialog
- Sync Engine — Additive, overwrite, or mirror sync modes with diff preview before execution
- Share Links — Generate presigned URLs with customizable expiration (presets or custom duration up to 7 days), auto-copy to clipboard, QR code generation, and share history
- Concurrent Execution — Configurable concurrency (default 3 parallel jobs)
- Live Progress — Real-time progress bars, transfer speed, and ETA for each job
- Job Details — Expand any job to see ID, timestamps, duration, total size, average speed, and errors
- Persistent History — Last 100 completed jobs saved to disk and restored across sessions
- Clear History — One-click clear of completed/failed/cancelled jobs
- Cancellation — Cancel running or queued jobs at any time
- Status Bar — Shows active profile, bucket, selection summary, object count, and aggregate job progress with speed
- Theming — Dark and light themes with one-click toggle
- Toast Notifications — Non-blocking alerts for success, error, info, and warning events
- Cross-Platform — macOS, Linux, and Windows (via Electrobun + CEF)
┌─────────────────────────────────────────┐
│ Electrobun Shell │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Bun Process │◄──►│ Webview │ │
│ │ (Backend) │ IPC│ (React UI) │ │
│ │ • Vault │ │ • Zustand stores│ │
│ │ • S3 ops │ │ • Components │ │
│ │ • Job queue │ │ • Tailwind/Daisy│ │
│ │ • Sync engine│ │ │ │
│ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────┘
- Bun process handles all S3 operations, the encrypted vault, job queue, and sync engine. API keys never reach the webview.
- Webview is a React SPA using Zustand stores, communicating with the backend via a typed RPC layer over IPC.
- Job history is persisted to
~/.config/object0/job-history.json(Linux) or~/Library/Application Support/object0/(macOS).
- Bun v1.0+
# Clone the repository
git clone https://github.com/sayedhfatimi/object0.git
cd object0
# Install dependencies
bun installbun run devbun run buildsrc/
├── bun/ # Main process (backend)
│ ├── index.ts # Entry point, window management
│ ├── jobs/ # Job queue, execution, persistence
│ ├── rpc/ # IPC handlers (jobs, S3, sync, vault)
│ ├── s3/ # S3 client factory, operations, sync
│ └── vault/ # Encrypted vault + keytar integration
├── mainview/ # Webview (frontend)
│ ├── index.tsx # React entry point
│ ├── app/ # App shell + theme provider
│ ├── components/ # UI components
│ │ ├── buckets/ # Bucket list
│ │ ├── common/ # Shared UI (modals, toasts, dialogs, icons)
│ │ ├── jobs/ # Job panel + collapsible job items
│ │ ├── layout/ # Main layout, sidebar, tabs, top bar, status bar
│ │ ├── objects/ # Object browser, table, grid, toolbar, breadcrumb
│ │ ├── profiles/ # Profile form + list
│ │ ├── settings/ # Settings panel
│ │ ├── share/ # Share dialog + share history
│ │ ├── sync/ # Sync dialog
│ │ ├── transfer/ # Cross-bucket transfer dialog
│ │ └── vault/ # Setup + unlock screens
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Constants, formatters, RPC client
│ └── stores/ # Zustand state stores
└── shared/ # Types shared between processes
├── job.types.ts
├── profile.types.ts
├── rpc-schema.ts
└── s3.types.ts
| Command | Description |
|---|---|
bun run dev |
Build CSS and start in development mode |
bun run build |
Build CSS and package for production |
bun run start |
Build then start |
bun run css:build |
One-shot Tailwind CSS build |
bun run css:watch |
Tailwind CSS watch mode |
bun run lint |
Lint with Biome |
bun run lint:fix |
Lint and auto-fix |
bun run format |
Format with Biome |
| Shortcut | Action |
|---|---|
Ctrl+B |
Toggle sidebar |
Ctrl+J |
Toggle job panel |
Ctrl+\ |
Toggle theme |
