A modern desktop application for managing S3-compatible storage buckets, built as an alternative to S3 Browser.
Obj is a cross-platform desktop application that provides a user-friendly interface for managing S3-compatible object storage. Built with Tauri 2.x and React 19, it offers fast performance, low memory footprint, and native OS integration.
- Manage multiple S3-compatible storage providers
- Create, list, and manage buckets
- Support for major S3 providers (AWS S3, MinIO, Wasabi, DigitalOcean Spaces, Backblaze B2)
- Custom S3-compatible endpoint support
- Secure credential management
- Modern, responsive UI with dark mode support
- Native desktop application performance
Frontend:
- React 19
- TypeScript 5.8
- TanStack Router (file-based routing)
- Vite 7.x
- Tailwind CSS 4
- shadcn/ui components
Backend:
- Tauri 2.x (Rust-based desktop framework)
- AWS SDK for Rust (aws-sdk-s3)
- Tokio async runtime
Package Manager: pnpm (required)
- Node.js 18+ (recommended: latest LTS)
- pnpm 8+
- Rust 1.70+ (for Tauri development)
- Platform-specific dependencies:
- macOS: Xcode Command Line Tools
- Linux: Development packages (see Tauri prerequisites)
- Windows: Visual Studio C++ Build Tools
# Clone the repository
git clone <repository-url>
cd obj
# Install dependencies
pnpm install# Start Vite dev server only (frontend at http://localhost:1420)
pnpm dev
# Start Tauri development mode with hot reload (RECOMMENDED)
pnpm tauri dev
# Preview production build
pnpm preview# Build frontend (TypeScript compilation + Vite build)
pnpm build
# Build Tauri application for production
pnpm tauri buildThe built application will be available in src-tauri/target/release/bundle/.
# Run unit and feature tests
pnpm test
# Run tests in UI mode
pnpm test:ui
# Run specific test file
pnpm test tests/feature/example.spec.ts# Format code with Prettier
pnpm format
# Run ESLint
pnpm lint
# Check Rust code
cd src-tauri && cargo check
# Format Rust code
cd src-tauri && cargo fmtObj uses Tauri's IPC (Inter-Process Communication) for type-safe communication between the React frontend and Rust backend:
// Frontend (TypeScript)
import { invoke } from '@tauri-apps/api/core';
const result = await invoke('create_bucket', { input: { bucketName, region } });// Backend (Rust)
#[tauri::command]
async fn create_bucket(input: CreateBucketInput) -> Result<Response, ErrorResponse> {
// Implementation
}obj/
├── src/ # React frontend source
│ ├── components/ # React components
│ ├── routes/ # TanStack Router file-based routes
│ ├── types/ # TypeScript type definitions
│ └── lib/ # Utilities and helpers
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── models/ # Data models
│ │ ├── s3/ # S3 operations
│ │ └── errors/ # Error handling
│ └── Cargo.toml # Rust dependencies
├── tests/ # Vitest tests
│ ├── unit/ # Unit tests
│ └── feature/ # Feature tests
└── components.json # shadcn/ui configuration
- AWS S3
- MinIO
- Wasabi
- DigitalOcean Spaces
- Backblaze B2
- Custom S3-compatible endpoints
- VS Code
- Extensions:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and linting (
pnpm test && pnpm lint && pnpm format) - Commit your changes with conventional commits
- Push to your branch
- Open a Pull Request
[Add your license here]