Skip to content

OxiCloud

v0.7.0 Security

This release includes 3 security fixes for security teams reviewing exposed deployments.

Published 1mo File Storage & Sync
βœ“ No known CVEs patched
Read the diff β†’ Tool health β†’ What is this tool? β†’
This release patches 3 known CVEs

Topics

cloud cloud-storage dropbox file-share file-sync file-upload
+13 more
nas nextcloud nextcloud-alternative onedrive own-your-data owncloud platform privacy rust rust-lang security self-hosted webdav

Affected surfaces

auth rbac

Summary

AI summary

Broad release touches βš™οΈ Upgrade notes, ✨ Headline features, πŸ”’ Reliability & security, and feat.

Full changelog

πŸŒ€ OxiCloud v0.7.0 β€” "Slipstream"

Three weeks. 237 commits. One obsession: make OxiCloud not just complete, but fast β€” fast like it's not even there.

If 0.6.0 "Open Skies" was the release where OxiCloud became a real personal cloud β€” files, calendar, contacts, office, photos β€” then 0.7.0 "Slipstream" is the release where it learned to move. Uploads that only send the bytes that changed. Search that reads inside your documents. A storage path rewritten to stop copying, stop blocking, stop re-computing. Invites that reach people who don't even have an account yet.

This is the engine-room release. Less new furniture, more raw horsepower β€” and a few headline features that genuinely change how you use it.

Self-hosted. No vendor. No telemetry. Just your data, now moving at the speed it always should have.


✨ Headline features

⚑ Delta sync β€” upload only what changed

The marquee feature of this cycle. OxiCloud now does content-defined chunking (FastCDC) right in the browser, compiled to WebAssembly and pipelined across web workers:

  • Instant upload β€” if the server already has your content (by hash), the upload completes with zero bytes on the wire. Re-upload a 2 GB file you already have? Instant.
  • Delta upload β€” the client and server negotiate chunks by hash and transfer only the parts that actually changed. Edit one page of a huge document and you send a few kilobytes, not the whole file.
  • Delta download β€” a file manifest + user-scoped chunk fetch lets sync clients pull only the chunks they're missing.
  • Uploads stream directly into the CDC chunk store β€” no temp spool, a single write, one durability barrier per file instead of an fsync per chunk.

Combined with the existing BLAKE3 dedup, OxiCloud now stores and transfers the absolute minimum.

πŸ”Ž Search inside your files

Full-text search is no longer just filenames. OxiCloud now ships an embedded Tantivy content-search index β€” the actual text inside your documents is indexed and searchable, with relevance ranking, no external service required.

πŸ‘₯ External users & passwordless magic-link login

Sharing now reaches beyond your user list:

  • Invite anyone by email β€” grant access to people who don't have an account. They're created as lightweight external users (no storage of their own) and log in via a magic link.
  • Passwordless accounts β€” sign in with an emailed magic link, hardened with a low-TTL cookie challenge and rate limiting.
  • Login by email or username, usernameless and passwordless accounts, email verification flags, and full anti-enumeration (you can't tell whether an account exists).
  • SMTP support with templated, theme-matched emails and the /magic landing page, plus an admin-only SMTP test tool.

πŸ§‘β€πŸ€β€πŸ§‘ Groups & ReBAC grants

Permissions grew up. A first-class Groups implementation lets you grant files and folders to all users or to a defined group, built on the relationship-based access control (ReBAC) model. Legacy shares were merged into the unified grant system, with a normalized My Shares view, grant-expiration handling, and coalesced grant notifications.

πŸ“Έ Photos that know when they were taken

A new photo/video capture-date pipeline extracts real capture dates from media metadata, paired with a premium UI/UX overhaul of the photos experience.

🌍 A frontend that flows

  • Infinite scrolling everywhere β€” no more "load more" buttons; every section streams as you scroll.
  • Normalized light / dark / follow-OS theming.
  • Server-side i18n with templating, tooltips on users and groups, user vignettes with given/family-name preferences, and a pile of new translations.
  • Native media streaming, requestAnimationFrame rubber-band scrolling, Map-based selection, delegated event handlers, and batched rendering across lists and search.

🏎️ Performance β€” the real story

This release landed dozens of measured backend and frontend optimizations. The greatest hits:

  • Storage write path rewritten to consume self and stop cloning; O(1) incremental quota updates instead of a full SUM on every upload; three per-upload DB round-trips collapsed into a single CTE.
  • GET /api/auth/me no longer recomputes storage usage on every call.
  • WebDAV / NextCloud large uploads stream straight to disk β€” no more OOM on huge files; direct-PUT size caps for safety.
  • CalDAV / CardDAV multiget stops loading entire collections into memory; indexed UID lookups for single-object ops.
  • PROPFIND streams in batches with Range + 304 support, and batched oc:fileid resolution kills the NextCloud N+1.
  • Smart compression β€” one layer that stops wastefully compressing already-compressed media on /api and downloads.
  • Thumbnails / transcode β€” decode permits before reading blobs, stop re-transcoding JPEGs, cache negative verdicts.
  • DB β€” statement-level tree-ETag triggers, batched trash purge, dropped two unused indexes, released the blob-cache index mutex before disk I/O.
  • Docker β€” dropped libpq runtime + postgresql-dev build deps, trimmed the build context, and skip recursive chown when the volume is already owned.

The result: less memory, fewer round-trips, lower latency under load β€” across uploads, downloads, listings, search, and sync.


πŸ”’ Reliability & security

  • Per-IP + per-account login lockout β€” scoped the lockout key to (account, IP) to stop a login flood from locking everyone out (#326).
  • External users are sandboxed β€” they can only query themselves and their granters; unnecessary routes are blocked.
  • Magic links & /magic are no-cache, no-referrer, noindex, and rate-limited.
  • Always-on audit logging for every denied or rejected resource access.
  • Dedup ref-counting fix β€” count chunk ref_count per distinct chunk, not per occurrence.
  • NFC filename normalization fixes duplicate-name bugs; centralized, mtime-aware ETags that cascade correctly up the folder tree.
  • Orphan-share cleanup, refresh-token hardening carried forward, and a sweep of aborted-upload orphans from the periodic trash job.

βš™οΈ Upgrade notes

  • Requires Rust 1.93+ (edition 2024) and PostgreSQL 13+ with pg_trgm and ltree.
  • Database migrations apply automatically on startup.
  • Legacy blobs are re-chunked into CDC manifests at startup so existing data gets delta-sync and dedup benefits β€” first boot after upgrade may do extra one-time work.
  • New env knobs for operators: OXICLOUD_DIRECT_PUT_MAX_BYTES, OXICLOUD_CHUNK_DIR, OXICLOUD_SMTP_*, OXICLOUD_EXTERNAL_EMAIL_DOMAINS. See the storage fine-tuning and external-user docs.
  • The container can now run fully rootless (#393).

πŸ’› Thank you β€” this one was built by the community

0.7.0 is, once again, a community triumph.

πŸ† Edouard Vanbelle (@EdouardVanbelle) β€” still, simply, a crack πŸ‘‘

131 commits this cycle. One hundred and thirty-one. Edouard didn't just contribute to "Slipstream" β€” in many ways he is "Slipstream." External users and the entire magic-link / passwordless / email pipeline. Groups and the ReBAC grant unification. Server-side i18n and email templating. The light/dark/like-OS theming. Streaming chunked uploads. Endless UX polish, test coverage, and the kind of relentless, caring craft that makes a project feel loved. Edouard β€” there aren't enough words. Thank you. πŸ™

πŸ™Œ And huge thanks to:

  • @SAY-5 β€” for the per-IP/per-account login-lockout hardening (#326).
  • @Cilenco β€” for making the container run rootless (#393).
  • @jonathansmith9485 β€” for the Helm chart fix (#409).
  • @leofishman β€” for the admin-setup link fix after initialization (#432).
  • Christian Dielitz and everyone who filed an issue, tested a build, or translated a string.

To every self-hoster, every star-gazer, every person running OxiCloud on a Raspberry Pi in a closet: this one moves a little faster, for you. ❀️


What's Changed

  • chore(release): bump version to 0.7.0 β€” "Slipstream" by @DioCrafts in #463
  • perf: six measured backend optimizations (downloads, CDC reads, content cache, write path) by @DioCrafts in #462
  • Clean/front test by @EdouardVanbelle in #460
  • chore(wasm): check, clippy, test, CI by @EdouardVanbelle in #459
  • Delta-upload protocol: client-side chunk negotiation to skip unchanged bytes by @DioCrafts in #455
  • Add embedded Tantivy full-text content search by @DioCrafts in #454
  • Legacy whole-file blob re-chunk migration + DAV multiget optimizations by @DioCrafts in #453
  • chore(test): improve API test coverage by @EdouardVanbelle in #452
  • test(e2e): webdav + nextcloud full e2e test coverage by @EdouardVanbelle in #450
  • Optimize folder tree ETag triggers and fix descendant path cascade by @DioCrafts in #448
  • Optimize encryption, storage, and media streaming performance by @DioCrafts in #447
  • Streaming PROPFIND, range requests, and batch ID resolution by @DioCrafts in #445
  • Batch fsync for blob uploads: unsynced writes + parallel durability sweep by @DioCrafts in #444
  • Optimize volume permission handling and reduce Docker build context by @DioCrafts in #443
  • Reduce lock contention and improve query efficiency across multiple subsystems by @DioCrafts in #440
  • feat: cap chunk size and maximize use of stream by @EdouardVanbelle in #438
  • fix(nextcloud): PROPFIND on chunk upload (permit resume) by @EdouardVanbelle in #437
  • fix(ui): ellipsis list view by @EdouardVanbelle in #436
  • chore(docker): fix docker healthcheck by @EdouardVanbelle in #435
  • feat(nextcloud): use user's image for avatar by @EdouardVanbelle in #434
  • fix(db-migration): fix 2 changes with same ID by @EdouardVanbelle in #433
  • fix(auth): hide admin setup link after language selection when system is initialized by @leofishman in #432
  • perf(quota): stop recomputing storage usage on every GET /api/auth/me by @DioCrafts in #429
  • fix(upload): stream WebDAV/NextCloud PUT to disk to prevent OOM on large files by @DioCrafts in #428
  • refactor & normalize etag for Nextcloud + fix NFC string by @EdouardVanbelle in #426
  • feat: grant notification with coalesce + UI bug fixes by @EdouardVanbelle in #423
  • feat(templating+i18n): for mail and for /magic section by @EdouardVanbelle in #421
  • feat(usernameless & passwordless): passwordless with magic link via email by @EdouardVanbelle in #416
  • feat(user): add external user logged via magic link by @EdouardVanbelle in #414
  • chore(user-lifecycle): normalize user life cycle by @EdouardVanbelle in #413
  • fix(shares): remove orphan shares by @EdouardVanbelle in #412
  • chore(vitepress): ignore non relevant docs, link ReBAC documentation by @EdouardVanbelle in #411
  • fix(SharedWithMe): remove group by size by @EdouardVanbelle in #410
  • FIX bug 397: helm chart changes by @jonathansmith9485 in #409
  • feat(groups): add group, enabling ReBAC for all users or a defined group by @EdouardVanbelle in #408
  • feat(trash): move trash API to normalized version by @EdouardVanbelle in #406
  • feat(light-dark): normalize light/dark/like-os mode + groupBy UX by @EdouardVanbelle in #405
  • feat(grants): finalize merge grants with shares, improve My Shares view by @EdouardVanbelle in #402
  • Allow container to be started as non root user by @Cilenco in #393
  • fix(auth): scope lockout key to (account, IP) to prevent DOS by login flood by @SAY-5 in #326

New Contributors

  • @SAY-5 made their first contribution in #326
  • @Cilenco made their first contribution in #393
  • @jonathansmith9485 made their first contribution in #409
  • @leofishman made their first contribution in #432

Full Changelog: https://github.com/DioCrafts/OxiCloud/compare/v0.6.0...v0.7.0


Built with πŸ¦€ and stubborn love for open source.

What's Changed

  • feat(grants): finalize merge grants with shares, improve My Shares view by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/402
  • Allow container to be started as non root user by @Cilenco in https://github.com/AtalayaLabs/OxiCloud/pull/393
  • feat(trash): move trash API to normalized version by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/406
  • feat(light-dark): normalize light/dark/like-os mode + improve UX groupBy selector by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/405
  • FIX : bug 397 add: helm chart changes by @jonathansmith9485 in https://github.com/AtalayaLabs/OxiCloud/pull/409
  • feat(groups): add group, will permit ReBAC to use All users, or a defined group with permission to files/folders by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/408
  • fix(SharedWithMe): remove group by size, not relevant and not implemented on server side by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/410
  • chore(vitepress): ignore non relevant docs, link ReBAC documentation by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/411
  • fix(shares): remove orphan shares by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/412
  • chore(user-lifecycle): normalize user life cycle to simplify implementation by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/413
  • feat(templating+i18n): for mail and for /magic section by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/421
  • feat(user): add external user logged via magic link by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/414
  • feat(usernameless & passwordless): permit password less with magic link via email by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/416
  • feat:grant notification with coalesce + UI bug fixes by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/423
  • fix(upload): stream WebDAV/NextCloud PUT to disk to prevent OOM on large files by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/428
  • perf(quota): stop recomputing storage usage on every GET /api/auth/me by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/429
  • refactor & normalize etag for Nextcloud + fix NFC string (important fix) by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/426
  • fix(auth): hide admin setup link after language selection when system… by @leofishman in https://github.com/AtalayaLabs/OxiCloud/pull/432
  • fix(db-migration): fix 2 changes with same ID by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/433
  • fix(ui): ellipsis list view by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/436
  • fix(nextcloud): PRODFIND on chunk upload (permit resume) by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/437
  • feat(nextcloud): use user's image for avatar by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/434
  • chore(docker): fix docker healthcheck by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/435
  • Reduce lock contention and improve query efficiency across multiple subsystems by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/440
  • feat: cap chunk size and maximize use of stream by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/438
  • fix(auth): scope lockout key to (account, IP) to prevent DOS by login flood (#323) by @SAY-5 in https://github.com/AtalayaLabs/OxiCloud/pull/326
  • Optimize volume permission handling and reduce Docker build context by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/443
  • Batch fsync for blob uploads: unsynced writes + parallel durability sweep by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/444
  • Streaming PROPFIND, range requests, and batch ID resolution by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/445
  • Optimize encryption, storage, and media streaming performance by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/447
  • Optimize folder tree ETag triggers and fix descendant path cascade by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/448
  • Legacy whole-file blob re-chunk migration + DAV multiget optimizations by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/453
  • Add embedded Tantivy full-text content search by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/454
  • Delta-upload protocol: client-side chunk negotiation to skip unchanged bytes by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/455
  • perf: six measured backend optimizations (downloads, CDC reads, content cache, write path) by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/462
  • chore(test): improve API test coverage by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/452
  • test(e2e): webdav + nextcloud full e2e test coverage by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/450
  • chore(release): bump version to 0.7.0 β€” "Slipstream" by @DioCrafts in https://github.com/AtalayaLabs/OxiCloud/pull/463
  • Clean/front test by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/460
  • chore(wasm): check, clippy, test, CI by @EdouardVanbelle in https://github.com/AtalayaLabs/OxiCloud/pull/459

New Contributors

  • @Cilenco made their first contribution in https://github.com/AtalayaLabs/OxiCloud/pull/393
  • @jonathansmith9485 made their first contribution in https://github.com/AtalayaLabs/OxiCloud/pull/409
  • @leofishman made their first contribution in https://github.com/AtalayaLabs/OxiCloud/pull/432
  • @SAY-5 made their first contribution in https://github.com/AtalayaLabs/OxiCloud/pull/326

Full Changelog: https://github.com/AtalayaLabs/OxiCloud/compare/v0.6.0...v0.7.0

Breaking Changes

  • Requires Rustβ€―1.93+ (editionβ€―2024) and PostgreSQLβ€―13+ with pg_trgm and ltree.
  • Legacy blobs are re‑chunked into CDC manifests on first startup after upgrade, causing extra one‑time work.

Security Fixes

  • Login lockout now scoped to (account, IP) preventing DOS from login floods (#326).
  • External users are sandboxed; only their own data and granters' data can be queried.
  • Magic‑link URLs are `no-cache`, `no-referrer`, rate‑limited and hardened against enumeration.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track OxiCloud

Get notified when new releases ship.

Sign up free

About OxiCloud

☁ Ultra-fast, secure & lightweight self-hosted cloud storage β€” your files, photos, calendars & contacts, all in one place. Built in Rust.

All releases β†’

Related context

Earlier breaking changes

  • v0.6.0 Server no longer reuses the listening port by default.

Beta — feedback welcome: [email protected]