2025-03-23 23:27:56 +01:00
<p align="center">
2025-03-30 14:17:09 +00:00
<img src="static/oxicloud-logo.svg" alt="OxiCloud" width="375" />
2025-03-23 23:27:56 +01:00
</p>
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
<h3 align="center">Self-hosted cloud storage, calendar & contacts — blazingly fast.</h3>
2025-03-29 16:40:38 +00:00
<div align="center">
2026-02-25 11:29:30 +01:00
2025-03-29 16:40:38 +00:00
[](https://opensource.org/licenses/MIT)
[](https://github.com/diocrafts/OxiCloud/releases)
2026-02-25 11:29:30 +01:00
[](https://github.com/diocrafts/OxiCloud/actions/workflows/ci.yml)
[](https://www.rust-lang.org/)
[](https://hub.docker.com/r/diocrafts/oxicloud)
2025-03-29 16:40:38 +00:00
[](https://github.com/diocrafts/OxiCloud/stargazers)
[](https://github.com/diocrafts/OxiCloud/issues)
[](https://github.com/diocrafts/OxiCloud/commits/main)
2026-04-12 02:03:19 +02:00
[**Documentation** ](https://diocrafts.github.io/OxiCloud/ )
2025-03-28 09:05:58 +01:00
2025-03-24 12:52:54 +01:00
2026-02-25 11:29:30 +01:00
NextCloud was too slow on my home server. So I built OxiCloud — a complete cloud platform written in Rust that runs on minimal hardware and stays out of your way.
2025-03-19 00:44:27 +01:00
2025-03-23 23:13:02 +01:00

2026-02-25 11:29:30 +01:00
<!-- TODO: add animated GIF/demo here -->
2026-04-12 20:59:45 +02:00
2026-02-25 11:29:30 +01:00
## OxiCloud vs NextCloud
| Metric | OxiCloud | NextCloud |
|--------|----------|-----------|
| **Language** | Rust (compiled, zero-cost abstractions) | PHP (interpreted) |
| **Docker image** | ~40 MB (Alpine, static binary) | ~1 GB+ (Apache + PHP + modules) |
| **Idle RAM** | ~30– 50 MB | ~250– 512 MB |
| **Cold start** | < 1 s | 5– 15 s |
| **CPU at idle** | ~0 % | 1– 5 % (cron, background jobs) |
| **Min. hardware** | 1 vCPU / 512 MB RAM | 2 vCPU / 2 GB RAM (recommended) |
| **Concurrent uploads** | Parallel chunked (TUS-like), async I/O | Sequential PHP workers |
| **File dedup** | SHA-256 content-addressable, ref-counting | None (each user = full copy) |
| **DB connections** | Dual pool (user + maintenance) | Single pool, background jobs compete |
| **LTO + PGO** | Fat LTO, codegen-units=1, opt-level=3 | N/A (interpreted) |
| **Dependencies** | Single binary + PostgreSQL | PHP, Apache/Nginx, Redis, Cron, … |
| **WebDAV** | Built-in (RFC 4918, PROPFIND streaming) | Built-in |
| **CalDAV / CardDAV** | Built-in | Via apps |
| **WOPI (Office editing)** | Built-in (Collabora / OnlyOffice) | Via apps |
| **OIDC / SSO** | Built-in (Keycloak, Authentik, …) | Via apps |
> **Note:** NextCloud is a mature, feature-rich ecosystem. OxiCloud targets users who prioritise raw performance, simplicity, and low resource usage over plugin breadth.
---
## Features
### Storage & Files
- **Upload / download / organise** — drag-and-drop, multi-file, grid & list views
- **Chunked uploads** — TUS-like protocol, parallel chunks, resumable, MD5 integrity
- **File deduplication** — SHA-256 content-addressable blobs with automatic ref-counting
- **Adaptive compression** — zstd / gzip selected per MIME type
- **Trash bin** — soft-delete, restore, auto-purge by retention policy
- **Favourites & recent files**
- **Full-text search** — by name, type, date range, size, recursive subtree (ltree)
- **MIME magic-byte detection** — `infer` crate, not just extension guessing
- **Inline preview** — images, PDF, text, audio & video player modal
- **Thumbnails & transcoding** — WebP / AVIF on-the-fly via `image` crate
### Protocols
- **WebDAV** — RFC 4918, streaming PROPFIND, locking, compatible with all major clients
- **CalDAV** — calendar sync (Thunderbird, GNOME Calendar, iOS, DAVx⁵, …)
- **CardDAV** — contacts sync with vCard support
- **WOPI** — edit Office docs in Collabora Online or OnlyOffice
- **REST API** — complete JSON API for all operations
### Security & Auth
- **JWT authentication** with refresh tokens
- **Argon2id** password hashing
- **OIDC / SSO** — Keycloak, Authentik, Authelia, Google, Azure AD…
- **Role-based access** — admin / user, per-folder permissions
- **Storage quotas** per user
- **Shared links** with optional password protection
### Infrastructure
- **Single binary** — no runtime, no interpreter, no framework overhead
- **~40 MB Docker image** (Alpine)
- **Dual DB pool** — dedicated maintenance pool so background tasks never starve user queries
- **LTO-optimised release** — fat LTO, 1 codegen-unit, `opt-level = 3` , stripped
- **Write-behind caching** (moka) — sub-millisecond hot reads
2026-04-11 20:58:34 +02:00
- **222+ automated tests** — `cargo test` on every push (CI)
- **14 languages** — EN, ES, DE, FR, IT, PT, NL, ZH, JA, KO, AR, HI, FA, RU
2025-03-24 12:52:54 +01:00
2026-02-25 11:29:30 +01:00
---
2025-03-24 12:52:54 +01:00
2026-03-17 05:47:09 +08:00
## Feature Status
| Feature | Status | Notes |
|---------|--------|-------|
| **File storage & upload** | ✅ Working | Chunked uploads, deduplication, thumbnails |
| **WebDAV** | ✅ Working | Fully compatible with major clients |
| **CalDAV (Thunderbird, iOS)** | ✅ Working | Calendar sync functional |
| **CardDAV (Thunderbird, iOS)** | ✅ Working | Contacts sync functional |
| **DAVx⁵ (Android)** | ⚠️ Partial | File sync works; calendar/contacts in progress |
| **WOPI / Office editing** | ✅ Working | Collabora/OnlyOffice integration |
| **OIDC / SSO** | ✅ Working | Keycloak, Authentik, Google, Azure AD |
| **Trash / recycle bin** | ✅ Working | Soft-delete with restore |
| **Full-text search** | ✅ Working | Recursive subtree search |
| **Shared links** | ✅ Working | Optional password protection |
2026-04-11 20:58:34 +02:00
| **Music library & playlists** | ✅ Working | Streaming player, drag-and-drop reorder |
| **Photo gallery** | ✅ Working | Day/month/year views, multi-select |
2026-03-17 05:47:09 +08:00
| **Desktop sync client** | ❌ Planned | Not yet available |
| **Android / iOS app** | ❌ Planned | Not yet available |
| **End-to-end encryption** | ❌ Planned | Roadmap item |
> **Note:** The DAVx⁵ Android app currently works for file sync via WebDAV, but calendar and contacts sync via CalDAV/CardDAV is still being refined. Use Thunderbird or iOS native clients for full CalDAV/CardDAV support.
---
2026-02-03 17:59:04 +01:00
## Quick Start
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
### Docker (recommended)
2025-03-19 00:44:27 +01:00
```bash
2025-03-24 12:52:54 +01:00
git clone https://github.com/DioCrafts/oxicloud.git
2025-03-19 00:44:27 +01:00
cd oxicloud
2026-02-25 11:29:30 +01:00
# Copy and optionally edit environment
cp example.env .env
2025-03-24 12:52:54 +01:00
2026-02-25 11:29:30 +01:00
docker compose up -d
```
Open **http://localhost:8086** . That's it.
2026-03-11 08:48:14 +00:00
If you want to access the server remotely set the OXICLOUD_BASE_URL to your server's domain/port or the authentication will fail after setting up the admin user.
2026-02-25 11:29:30 +01:00
### From source
Requires **Rust 1.93+** and **PostgreSQL 13+** .
```bash
git clone https://github.com/DioCrafts/oxicloud.git
cd oxicloud
# Configure database
echo "DATABASE_URL=postgres://user:pass@localhost/oxicloud" > .env
# Build optimised binary
2025-03-19 00:44:27 +01:00
cargo build --release
2026-02-25 11:29:30 +01:00
2026-02-25 08:59:01 -08:00
# Start the server (migrations run automatically)
2025-03-19 00:44:27 +01:00
cargo run --release
```
2026-02-25 11:29:30 +01:00
---
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
## Client Setup
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
OxiCloud speaks standard protocols — any WebDAV / CalDAV / CardDAV client works:
2026-02-21 18:41:18 -08:00
2026-02-25 11:29:30 +01:00
| Client | Protocol | URL |
|--------|----------|-----|
| Windows Explorer | WebDAV | `http://host:8086/webdav/` |
| macOS Finder | WebDAV | `http://host:8086/webdav/` |
| Nautilus / Dolphin | WebDAV | `dav://host:8086/webdav/` |
| Thunderbird (calendar) | CalDAV | `http://host:8086/caldav/` |
| Thunderbird (contacts) | CardDAV | `http://host:8086/carddav/` |
| DAVx⁵ (Android) | CalDAV + CardDAV | `http://host:8086/` |
| GNOME Calendar | CalDAV | `http://host:8086/caldav/` |
| GNOME Contacts | CardDAV | `http://host:8086/carddav/` |
| Collabora / OnlyOffice | WOPI | See [WOPI docs ](doc/wopi-integration.md ) |
For detailed setup guides: [WebDAV ](doc/webdav-integration-guide.md ) · [CalDAV ](doc/caldav-technical-spec.md ) · [CardDAV ](doc/carddav-technical-spec.md ) · [OIDC/SSO ](doc/oidc-integration.md )
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
---
2025-03-19 00:44:27 +01:00
2026-02-03 17:59:04 +01:00
## Architecture
2025-03-24 12:52:54 +01:00
2026-02-25 11:29:30 +01:00
Clean / Hexagonal architecture — each layer depends only on the one below:
2026-02-03 17:59:04 +01:00
```
2026-02-25 11:29:30 +01:00
┌───────────────────────────────────────────────────────────────┐
2026-03-06 21:46:58 +01:00
│ Interfaces │ REST API, WebDAV, CalDAV, CardDAV, WOPI │
2026-02-25 11:29:30 +01:00
├───────────────────────────────────────────────────────────────┤
2026-03-06 21:46:58 +01:00
│ Application │ Use cases, DTOs, port definitions │
2026-02-25 11:29:30 +01:00
├───────────────────────────────────────────────────────────────┤
2026-03-06 21:46:58 +01:00
│ Domain │ Entities, business rules, repository traits │
2026-02-25 11:29:30 +01:00
├───────────────────────────────────────────────────────────────┤
2026-03-06 21:46:58 +01:00
│ Infrastructure│ PostgreSQL, filesystem, caching, auth │
2026-02-25 11:29:30 +01:00
└───────────────────────────────────────────────────────────────┘
2026-02-03 17:59:04 +01:00
```
2026-02-25 11:29:30 +01:00
Swap the database, add a new protocol, or change auth — without touching business logic.
For a deep dive: [Internal Architecture ](doc/internal-architecture.md ) · [Caching ](doc/caching-architecture.md ) · [DB Transactions ](doc/database-transactions.md )
---
## Configuration
All config via environment variables (see [`example.env` ](example.env )):
| Variable | Default | Description |
|----------|---------|-------------|
| `OXICLOUD_STORAGE_PATH` | `./storage` | Root directory for file storage |
| `OXICLOUD_SERVER_PORT` | `8086` | HTTP listen port |
| `OXICLOUD_DB_CONNECTION_STRING` | — | PostgreSQL connection string |
| `OXICLOUD_JWT_SECRET` | random | Token signing key (set in production!) |
| `OXICLOUD_OIDC_ENABLED` | `false` | Enable OpenID Connect SSO |
| `OXICLOUD_WOPI_ENABLED` | `false` | Enable Collabora / OnlyOffice editing |
| `OXICLOUD_ENABLE_AUTH` | `true` | Toggle authentication |
| `OXICLOUD_ENABLE_TRASH` | `true` | Toggle trash / recycle bin |
2026-04-11 20:58:34 +02:00
Full reference: [`example.env` ](example.env ) · [Deployment guide ](https://diocrafts.github.io/OxiCloud/config/deployment ) · [OIDC setup ](https://diocrafts.github.io/OxiCloud/config/oidc )
2026-02-25 11:29:30 +01:00
---
2026-02-03 17:59:04 +01:00
## Development
2025-03-19 00:44:27 +01:00
2026-04-07 12:21:07 +02:00
### Server side
2025-03-19 00:44:27 +01:00
```bash
2026-02-25 11:29:30 +01:00
cargo build # Dev build
2026-02-03 17:59:04 +01:00
cargo run # Run locally
2026-02-25 11:29:30 +01:00
cargo test --workspace # 112 tests
cargo clippy -- -D warnings # Lint (zero warnings policy)
cargo fmt --all --check # Format check
RUST_LOG = debug cargo run # Debug logging
2025-03-19 00:44:27 +01:00
```
2026-04-07 12:21:07 +02:00
### Client side
Run server in dev profile:
```bash
PROFILE = dev cargo run
```
CSS & JS linter is `biome` (can be installed via `cargo install biome-cli` or on MacOS: `brew install biome` )
2026-02-25 11:29:30 +01:00
### Project stats
2026-02-03 17:59:04 +01:00
2026-02-25 11:29:30 +01:00
| Metric | Value |
|--------|-------|
| Rust source files | 170 |
| Lines of code | ~50 000 |
2026-04-11 20:58:34 +02:00
| Automated tests | 222+ |
| Documentation pages | 35+ |
2026-02-03 17:59:04 +01:00
2026-02-25 11:29:30 +01:00
---
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
## Documentation
2026-04-11 20:58:34 +02:00
📖 **Full documentation:** [**diocrafts.github.io/OxiCloud** ](https://diocrafts.github.io/OxiCloud/ )
| Topic | Online | Source |
|-------|--------|--------|
| Quick Start | [Guide ](https://diocrafts.github.io/OxiCloud/guide/installation ) | [doc/deployment.md ](doc/deployment.md ) |
| WebDAV | [Guide ](https://diocrafts.github.io/OxiCloud/guide/webdav ) | [doc/webdav-integration-guide.md ](doc/webdav-integration-guide.md ) |
| CalDAV / CardDAV | [Guide ](https://diocrafts.github.io/OxiCloud/guide/caldav-carddav ) | [doc/caldav-technical-spec.md ](doc/caldav-technical-spec.md ) |
| OIDC / SSO | [Guide ](https://diocrafts.github.io/OxiCloud/config/oidc ) | [doc/oidc-integration.md ](doc/oidc-integration.md ) |
| WOPI (Office) | [Guide ](https://diocrafts.github.io/OxiCloud/config/wopi ) | [doc/wopi-integration.md ](doc/wopi-integration.md ) |
| Architecture | [Guide ](https://diocrafts.github.io/OxiCloud/architecture/ ) | [doc/internal-architecture.md ](doc/internal-architecture.md ) |
| All env variables | [Reference ](https://diocrafts.github.io/OxiCloud/config/env ) | [`example.env` ](example.env ) |
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
---
## Roadmap
Check [TODO-LIST.md ](TODO-LIST.md ) for the full roadmap. Highlights:
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
- [ ] File versioning & diff viewer
- [ ] End-to-end encryption
- [ ] Desktop sync client (Rust)
- [ ] Android / iOS app
- [ ] OCR & intelligent tagging
- [ ] Automated workflows
---
2025-03-19 00:44:27 +01:00
2026-02-03 17:59:04 +01:00
## Contributing
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
The project is actively developed. Contributions welcome!
2025-03-19 00:44:27 +01:00
2026-02-03 17:59:04 +01:00
Read [CONTRIBUTING.md ](CONTRIBUTING.md ) before submitting a PR. Follow the [Code of Conduct ](CODE_OF_CONDUCT.md ).
2025-03-19 00:44:27 +01:00
2026-02-03 17:59:04 +01:00
## License
2025-03-19 00:44:27 +01:00
2026-02-25 11:29:30 +01:00
MIT — see [LICENSE ](LICENSE ).
2025-03-19 00:44:27 +01:00
---
2026-02-11 21:27:25 +01:00
## Star History
<div align="center">
<a href="https://star-history.com/#DioCrafts/OxiCloud &Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=DioCrafts/OxiCloud&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=DioCrafts/OxiCloud&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=DioCrafts/OxiCloud&type=Date" style="border-radius: 15px; box-shadow: 0 0 30px rgba(0, 217, 255, 0.3);" />
</picture>
</a>
</div>
---
2026-02-25 11:29:30 +01:00
Questions? [Open an issue ](https://github.com/DioCrafts/OxiCloud/issues ). Want to help? PRs welcome.