restowbackup

← Back to the overview

Roadmap

What Restow does today, what is planned next and later, and what is out of scope. The timeline opens at the current release and moves as you scroll; earlier releases are below it. Planned items carry no version numbers and no dates, and a feature counts as shipped when it is in a published release, not before.

Jump to the earlier releases ↓

  1. Shipped, current line

    0.4.0 to 0.4.7

    File shares, immutable backups, ransomware detection, SharePoint, archive capture from the mailbox, Microsoft 365 groups, update terms for license keys, objects that are no longer backed up, expiry reminders

    Updating to 0.4.0 runs seventeen database migrations. File shares and the database move need the 0.4.0 docker-compose.yml, so run the 0.4.0 installer again after the update; SharePoint needs an added permission and a new admin consent per tenant. Read the upgrade notes of 0.4.0 first. Updating to 0.4.4 runs four more migrations (0059 to 0062); they build indexes on the largest tables, so plan the update of a large installation outside the backup window. Mail jobs that archived before 0.4.4 keep doing exactly that: nothing new starts by itself. Updating to 0.4.5 runs three more migrations (0063 to 0065); none rewrites a table. From then on, an image that is started by hand with a Business or Service Provider key that does not cover it stops before its migrations (every key issued so far is a beta license and covers every 0.x and 1.x release). Microsoft 365 groups are opt-in: after the update no group is backed up until the protection rules switch it on. Updating to 0.4.6 runs no migration; update restow-pve on every Proxmox VE node before relying on container restores or boot tests. Updating to 0.4.7 runs four more migrations (0066 to 0069); none rewrites a table, and restow-pve needs no update. The update excludes no Proxmox VE guest and sets no price. Objects that were already orphaned count as confirmed. Disabled and unlicensed mailboxes and locked OneDrives and sites that failed every night are recognised by the first directory sync or backup after the update (a locked site by its first backup): expect one notice for each (an unlicensed user often has two, mailbox and OneDrive), or one warning for a tenant with many, and confirm them under protected objects once they are intended. Sources connected through their own app before 0.4.7 have no expiry date, so no reminder, until it is noted on the source's page, and a central app whose secret comes from the environment needs ENTRA_CLIENT_SECRET_EXPIRES_AT. Webhooks and notification recipients get the new events only once they are ticked in the notification matrix. Rolling back after the migrations of 0.4.5 (to 0.4.4) or of 0.4.7 (to 0.4.6) was not tested: take a database backup before the update.

    • File shares (SMB and NFS)

    • File share backup and restore

      Back up an SMB share (Windows Server, Samba, a NAS) or an NFS export from the server, without an agent on the file server. Restow mounts it read-only for one run in a short-lived runner container that the mounter starts, and keeps NTFS permissions (NFSv4 and POSIX ACLs on a best-effort basis) in every restore point. Open, unreadable and offline files are skipped and listed, and the run ends with warnings. Restore as a ZIP, to a new folder, to the original location (overwrite, keep both, skip) or into another share, with permissions where the target allows it. SMB 2.1 to 3.1.1; SMB1 and NTLMv1 are refused. New installations start the mounter by default; an existing one gets it through "Enable network shares". Tested against Samba in the release smoke run, not against Windows Server, a Synology or TrueNAS share, real NFS exports or a host with SELinux enforcing. No VSS over SMB: files that are open with an exclusive lock are skipped.

      0.4.0 Every edition

    • File shares: restore checks, copy jobs and budgets

      Every new restore point is checked by reading up to 20 sampled files back and comparing them, the repository gets a weekly restic check of 5 percent of its data, and recovery readiness rates a share by its newest restore point. Copy jobs write the newest checked restore point of one share into a folder of another, in overwrite or mirror mode; a copy job keeps no versions and is labelled as not being a backup. Budgets per share, per tenant and as a default (off by default, set by provider admins) warn at 80 percent and refuse new backups at 100 percent. File shares count in the status tab, the start page, readiness, warnings, history, statistics and the provider view. Not yet: repositories other than the primary one, self-service restore for tenant users and a file share block in scheduled reports.

      0.4.0 Every edition

    • Protection against ransomware and misuse

    • Immutable backups

      Immutability per repository, off until an administrator turns it on (Repositories, "Change immutability"). On S3, Object Lock (compliance or governance, 1 to 3650 days) locks the packs, manifests and wrapped keys of the chunk store (Microsoft 365, IMAP, Proxmox VE disks) and the objects of every restic repository (machines, file shares, Proxmox VE containers). Restow checks the bucket first, renews the lock of data that is still in use, treats a deletion the storage refuses as not yet, and never sends the governance bypass header. For directories (the Docker volume, an NFS share) a deletion delay makes Restow's own code refuse to delete or overwrite a file until the period has passed; it protects against misuse of Restow, not against someone with access to the server, and the interface says that it is not immutability. Restore points show "Immutable until <date>", green only for a compliance retention that the storage itself reported; verification results and warnings appear on the repository card, the dashboard and the provider view. Lowering the protection needs the provider owner with a recent sign-in. Tested against a simulated S3 with Object Lock, not yet against a real service; the installation's default repository cannot be made immutable.

      0.4.0 Every edition

    • Ransomware detection with a retention hold

      Every new restore point of a machine, file share, Proxmox VE guest, mailbox, OneDrive, SharePoint site or IMAP account is judged for signs of ransomware from data the backup already has: the amount of change against the object's own history, mass deletions, renamed extensions, known ransomware extensions and ransom notes, the entropy of sampled new files, and the compression and deduplication ratio of the new data. A suspicious restore point gets a badge, and the restore views offer the newest one without findings. While it is unresolved, a retention hold stops retention and pruning of that object, so clean older restore points are not pruned while encrypted ones pile up; only an administrator ends a hold (false alarm or release, audited). It never reads the data a second time, never blocks a backup and is no virus scanner. Some signals need agent 0.4.0 on machines or restow-pve 0.4.0 on the node, and a signal without data says "not available", never clean. On after the update, with its thresholds and switches under Installation, Ransomware detection. Tested with simulated attacks, not with live ransomware.

      0.4.0 Every edition

    • S3 endpoints need HTTPS

      A new or changed S3 endpoint over plain http:// is refused, for provider admins and the installation default too, except to localhost, 127.0.0.1 and [::1]. Endpoints saved before keep working and say in red that they should move to HTTPS; S3_ALLOW_INSECURE=true accepts plain HTTP for test and development setups only.

      0.4.0 Every edition

    • Notifications

    • Notification matrix

      Under Integrations, Notifications the events are rows, grouped and marked by severity, and the bell, every webhook and every notification recipient are columns, each with the quick choices "Errors only", "Errors and warnings" and "All". Saving is audited. The update fills every column with exactly what the channel received before, so nothing changes at first; a webhook created afterwards starts with the defaults of its format, and an alert rule no longer sends an event to a channel whose column has it off. New events: backup.succeeded and verify.completed for mail and the bell, backup.suspicious and backup.suspicious_hold, boot_test.failed and boot_test.unproven, and installation.disk_low for provider admins.

      0.4.0 Every edition

    • Proxmox VE (preview)

    • Proxmox VE: progress of a running backup

      VMs & containers, the inventory and the guest's page show a progress bar ("34% · 3.2 GB of 9.4 GB · 85 MB/s"), and the helper's own lines (the run id, what restic added, what it could not read) reach the run's log; a backup that succeeded with gaps names the first 20 unreadable items. Container backups now let restic scan first, so there is a total to show progress against. Needs restow-pve 0.4.0 on the node. Tested against the simulated node of the test suites, not against a real Proxmox VE node.

      0.4.0 Every edition

    • Proxmox VE: boot tests of restore points

      A Proxmox VE job can boot the newest restore point of each guest weekly or after every backup (off by default; a memory limit of 8 GiB and five minutes for the guest agent by default), and "Boot test now" asks for one by hand. The node restores it as a new guest in the pool restow-restore, isolates it before the start (network links down, passthrough devices, serial ports, bind mounts and the hook script removed), waits for the QEMU guest agent and destroys it in every case. Green when the guest agent answered, yellow when the VM only started, red when the restore, the start or the boot failed; recovery readiness rates the newest restore point by its boot test. One test per node at a time, never beside a backup. Needs restow-pve 0.4.0; tested against the simulated node, not a real Proxmox VE cluster.

      0.4.0 Every edition

    • Proxmox VE: file restore of containers and VMs (Preview)

      Under Servers & clients, File restore, every container with a restore point is listed in the group "Proxmox VE containers" and every VM in "Proxmox VE VMs", marked Preview: browse a restore point and download files and folders as one ZIP, read by the server from the guest's repository; reads and downloads are audited. For VMs each readable file system of the disks is a folder (GPT and MBR partitions and linear LVM volumes with ext2, ext3, ext4, XFS, NTFS or FAT), read in a restricted child process with nothing mounted on the server or the node. Not readable: btrfs, ZFS, ReFS, LVM thin, RAID, BitLocker and LUKS, NTFS-compressed and EFS files; the XFS and NTFS logs are not replayed, so compare an important file with the original before relying on it. Restoring single files into a running guest is not built.

      0.4.0 Every edition

    • Proxmox VE jobs in Servers & clients

      Proxmox VE jobs appear under Servers & clients, Jobs next to the machine jobs, with a Type column, the guests per job, schedule, last and next run, and "2 of 5 guests done" while a round runs; a backup started by hand shows as a row until it ends. New job is a menu with one entry per type, and the Proxmox VE job form lists the VMs and containers to put into the job. A guest's page shows the average a follow-up backup adds.

      0.4.0 Every edition

    • Servers and clients

    • Agent policies

      Rules for the agents on servers and clients on three levels: the installation (Installation, Agent policy), the tenant and the backup job. Each level may override a setting unless the installation locks it, and every view says where a value comes from. The settings: a backup window (weekdays and a time range) in which scheduled backups, catch-ups and retries may start; catching up missed backups as soon as the machine is on again or in the next window, optionally only up to a maximum age; an upload limit for jobs without one of their own; only on AC power; and the number of automatic retries (0 to 10). A machine's page shows the policy that applies to it and why a due backup waits. Window, catch-up, retries and the waiting reason need agent 0.4.0; the upload limit and AC power reach older agents too. Tested against simulated services only.

      0.4.0 Every edition

    • File restore for the restore role

      Restore operators (the restore role of a tenant) open Servers & clients, File restore: they list the machines, read their restore points and immutability, browse them, download files as a ZIP and restore files onto the machine. For Proxmox VE they read the overview and a guest's restore points and browse and download files of container and VM restore points. Settings, tokens, jobs, backing up, verify and boot tests, restoring a whole guest and revoking or deleting stay with the administrators. Every read, download and restore is audited with the operator as actor.

      0.4.0 Every edition

    • Data folders a job misses, and what a machine runs as

      The agent 0.4.0 reports which of a fixed list of Linux data folders (/opt, /usr/local, /srv, /var/www, Docker and Podman volumes, the PostgreSQL, MySQL and MongoDB folders under /var/lib) exist and hold files, names only. The job editor names the folders the job's machines really have and leaves out, and a machine's page offers "Add this folder to the job". A machine's page says what it runs as (container, virtual machine, physical, with or without a desktop), and a Linux machine in a container or a virtual machine without a desktop gets the server profile; the file browser of a restore point says which folders it contains.

      0.4.0 Every edition

    • Jobs, live view and dashboard

    • Create recommended job

      Next to every "no job" notice (jobs, inventory, sources, directory, VMs & containers) and as "Protect everything without a job" on the dashboard's readiness card: a preview of what the click creates or adds to, then one job per kind (mail every 8 hours; machines per system and profile; one Proxmox VE job, daily at 22:00 in snapshot mode). A second click adds to the same job instead of making another. Admins only, recorded in the audit log.

      0.4.0 Every edition

    • Running backups in the sidebar and a livelier run drawer

      The Jobs entries and VMs & containers show a spinner with the number of running backups and the waiting ones; the tooltip lists them and a click opens the run. In the run drawer the charts move with time between measurements, the numbers count up, the time left counts down, and a line says when the run last reported (or that Microsoft Graph throttles it). The first backup of a large mailbox shows "First backup: X of Y items" over all attempts, with an estimated time left; a OneDrive shows "X items so far" until it is fully listed.

      0.4.0 Every edition

    • All tenants in Jobs

      Under "All tenants", Jobs of Mail & SaaS and of Servers & clients list every tenant with its jobs per kind, what runs and waits, how the newest backups ended and the next run, with filters and sorting; a row opens the tenant's jobs read-only. The view stays fast on large installations by reading through an index and keeping each tenant's figures for 30 seconds.

      0.4.0 Service Provider

    • Storage growth on the dashboard

      The dashboard shows how the stored data of a tenant grew over 1 week, 1 month, 3 months or 1 year; from 3 months on the estimate is a band between the slowest and the fastest growth, and where the free space is known it says when the repository runs full at this growth.

      0.4.0 Every edition

    • Microsoft 365

    • SharePoint Online: backup and restore of sites

      Every directory sync finds the tenant's SharePoint sites (the sites of Microsoft 365 groups and Teams included, personal sites left to their owner's OneDrive), and each site is a protected object of its own, in the mail jobs like mailboxes and OneDrives; the protection rules have a sites mode, all sites or chosen ones. A backup holds every document library (optionally with versions), every list with its columns and each item's field values as JSON, and the site's description. Restore in the explorer: download as ZIP; files and folders into the original or another library of a backed-up site (keep both, overwrite with SharePoint keeping the old file as a version, or skip existing); list items into their original list as new items, writable fields only. Not backed up or restored: Teams chats, attachments of list items, site design, navigation and workflows; permissions are kept as information and never restored; a deleted site or library is not recreated. Needs the application permission Sites.ReadWrite.All (Sites.Read.All is enough to back up) and a new admin consent per tenant. Tested against a simulated Microsoft Graph, not a real Microsoft 365 tenant.

      0.4.0 Every edition

    • Updates, database and storage

    • Runs in progress during an update

      The install dialog counts what runs and waits in every tenant and asks what to do: "Stop them cleanly" (the default: Microsoft 365 and mail runs save a checkpoint and stop; runs on agents and of file shares are waited for, 30 minutes at most), "Wait until they finish" (two hours at most) or "Do not wait". From the confirmation until the update is over no new run starts, and schedules that fall due meanwhile run afterwards; everyone signed in sees a banner. Agents 0.4.0 hold their own schedules and wait; agents older than 0.4.0 do not, so a backup such a machine starts by itself during an update may fail if the API restarts under it. A Proxmox VE backup that runs while Restow updates no longer fails: the node keeps trying for five minutes.

      0.4.0 Every edition

    • Move the database to another disk

      Installation, Database shows where the database keeps its data, its size, the free space under it and under the local default repository, and what the next update needs. With the opt-in updater the provider owner moves the database to a directory on another disk: checked first (another local file system, ext4, XFS, Btrfs or ZFS, room for the data), then copied, compared file by file, test-started and switched, with automatic rollback on any failure; the old copy is kept and blocked from starting until it is removed. The updater's preflight now adds up what an update writes and refuses one that does not fit, and the Updates tab lists the pre-update dumps (the owner can download or delete one). The move was not tested through a real updater and its Docker helper before the release.

      0.4.0 Every edition

    • Low disk space warning

      Every 15 minutes the API checks the disk under the database (through the updater) and under the local default repository. Below a tenth free, and always below 5 GiB, provider admins get a notice in the bell, and alert rules that list "Low disk space" send it, once per episode.

      0.4.0 Every edition

    • Performance on large installations

      Memory stays bounded whatever the size: the first catalog of a file share streams into the database in batches of 5,000 files, SMB permission reuse keeps a compact index so that shares with millions of files do not run out of memory, SharePoint sites with thousands of lists no longer take quadratic time, the block maps of browsed VM disks are cached by size, and Object Lock renewal sends 32 requests at a time and continues an interrupted pass where it stopped. The ransomware judgement and the All tenants view of Jobs read through indexes.

      0.4.0 Every edition

    • 0.4.1

    • Stored data counts the restic repositories

      Repositories, Usage, the Stored tile of the dashboard, the statistics and the API counted only the packs of the chunk store: a tenant with 10 GB of container backups saw "Stored 10.9 kB". Stored now adds the restic repositories of machines, file shares and Proxmox VE containers, and the usage card shows how much is in the chunk store and how much in restic repositories. The size of a container's repository is measured once at its first upload after the update, then counted per upload and deletion and measured again after a prune. The deduplication saving, the growth and the chart stay figures of the chunk store and say so; a repository's size has no history, and "Protected data" still counts the chunk store's sources only.

      0.4.1 Every edition

    • Proxmox VE: an old node helper is named

      A running container backup on a node with restow-pve before 0.4.0 showed "No progress reported yet" for its whole run. It now says that progress needs restow-pve 0.4.0, which version the node runs, and to update the node. restow-pve now asks for an update two minutes after it starts, then every six hours, instead of only after six hours; the update still waits until no backup or restore runs.

      0.4.1 Every edition

    • 0.4.2

    • Stop a backup from the web app

      Proxmox VE: "Stop backup" in the VMs & containers table, on the guest's page and in the run drawer stops a running backup (the node ends the vzdump task through the Proxmox VE API, a backup started in Proxmox VE itself included) and "Withdraw" takes a queued one out at once. Per node, "Pause queue" and "Cancel all queued", also for the whole tenant. Servers and clients: "Stop backup" on the machine's page and in the run drawer; the agent stops restic cleanly with its next contact, within about a minute. Runs of file shares can be cancelled from the run drawer as well (Microsoft 365 and IMAP runs already could). A stopped run ends as cancelled, not as failed: no failure alert, and it does not count as the last backup. Every stop asks first and is audited. It needs restow-pve from 0.4.2 on the node and the agent from 0.4.2 on the machine; an older node ends a cancelled backup at its next upload, an older agent finishes it.

      0.4.2 Every edition

    • Nodes and agents follow a server update

      After the server runs the new release, new runs stay paused while Proxmox VE nodes and agents install it (they are idle then), until every reachable one reports it or 15 minutes have passed. Installation › Updates shows their progress and, for the ones not reached, the command for an update by hand. "Update to <version>" on a node's page and on a machine's page asks for the update at any time. `restow-agent update` on a machine installs the offered release at once, like `restow-pve update` on a node, through the same signed download as the automatic self-update; while a backup runs it refuses, and the agent updates itself once idle.

      0.4.2 Every edition

    • Planned updates and a time zone of the installation

      An update can be planned for a chosen date and time, up to 30 days ahead, besides the lead times from now: nothing pauses before, and everyone signed in sees a notice from a day before. The time is read in the installation's time zone, which is chosen in the setup wizard (the browser's zone preselected) and changed by an owner under Installation › Server & operation › Server; a new tenant starts with it. An installation set up before 0.4.2 keeps using RESTOW_TIME_ZONE, then TZ, then Europe/Berlin until an owner chooses one. When an update is available, the version in the sidebar becomes a highlighted "Update to <version> available" that leads to Installation › Updates, for those who may install updates.

      0.4.2 Every edition

    • Proxmox VE: every new restore point is checked within minutes

      A new restore point of a VM or container is read back within minutes of its backup (a sample of its blocks, for a container a restic check of a subset), a bounded number per pass, besides the weekly check of every guest. The setting "Check every new restore point right after the backup" (Installation › Proxmox VE, owner) is on by default; off, a new restore point waits for the weekly check. Recovery readiness has "Check now" per guest and "Check all unverified". A red check shows the error it found, for example restic's, instead of only "blocks did not match or could not be read". This is the sampled read-back, not a boot test; boot tests stay as in 0.4.0.

      0.4.2 Every edition

    • Proxmox VE: a new backup chain for a container whose repository is gone

      After the primary repository changed with "keep existing backups where they are", every container with an existing repository failed with "repository does not exist". Before a backup gets its credential, the server now checks once per run that the repository is on the primary. Missing everywhere, a new repository and a new backup chain begin, shown on the guest page ("New backup chain started on <date>") and in the audit log; the earlier restore points become "Not available" (no restore, no check, not counted for readiness, skipped by retention). Still on a retired target, the backup is refused with a clear message instead. "Reset repository" (the guest page's danger zone, containers only) does the same on request: the guest's name typed, a recent sign-in, audited. A file share whose repository went missing is not healed this way yet; that is planned.

      0.4.2 Every edition

    • Proxmox VE: job cadences, the Restow server's own VM and backups with warnings

      Proxmox VE backup jobs take the cadences of a mail job: every few hours, daily, on chosen weekdays, monthly or a cron expression, not more often than hourly. The VM that runs Restow itself is found by its SMBIOS UUID (restow-pve from 0.4.2 reports it) or marked by an admin; no job backs it up, and "Back up now" or putting it into a job needs a confirmation that names the risk of backing it up with Restow itself. A backup that vzdump ends with "TASK WARNINGS" after its restore point was committed counts as "Succeeded with warnings" instead of failed.

      0.4.2 Every edition

    • Where backups land is shown

      The tenant's effective primary repository is named on a guest's page and its new "Back up now" dialog, in the Proxmox VE job and connect dialogs, on a machine's and a file share's page and in the job editors, with the installation default on the server's local disk highlighted. The Repositories section and the dialogs that add Proxmox VE nodes, machines and file shares warn "Backups land on the server's own disk" when the primary is a directory on a disk of the server itself (not a network share).

      0.4.2 Every edition

    • A storage move takes the restic repositories along

      A "move" of the primary repository now also copies the restic repositories of containers, machines and file shares, verified by size and by SHA-256 like packs. It waits for running container backups and file share runs before it switches, and it copies the manifests of VM and container restore points. "Keep existing backups where they are" and promoting a copy are refused while containers or file shares have restic repositories, which only "move" takes along. A change of the primary is still refused while a machine of the tenant is active.

      0.4.2 Every edition

    • Storage check: temporarily unreadable is not damaged

      The storage check no longer rates a pack it could not read for the moment (a download cut off mid-transfer, a reset connection, a timeout, S3 asking to slow down, denied access) as damaged. It reads such a pack again, up to three times, and lists what stays unreadable as "temporarily unreadable" in Recovery readiness › Storage integrity, with the error, how many consecutive checks could not read it and when; every later check reads it first, and "Re-check these packs" reads only the flagged packs again. Objects using it are rated "Attention"; they become "Not restorable" only when a pack is proven damaged (missing, wrong size or checksum) or could not be read in 3 consecutive checks over at least 24 hours. Reads from S3, restores and restore checks included, resume a download that breaks off. The integration API's storageIntegrity.state has the new value unreadable (contract 1.5.0, additive).

      0.4.2 Every edition

    • Restore explorer: one entry per person, and a calendar by month

      The restore explorer lists one entry per person: mailbox, OneDrive and a linked IMAP account are grouped, and the second column shows Mail, Calendar, Contacts and OneDrive, each with its own restore points. SharePoint and Teams sites have a section of their own, and an orphaned OneDrive is listed under its owner's name as "Account deleted". The list comes a page at a time, with search over names, addresses and account ids and a type filter in the database; it is fine up to about 10,000 people per tenant and slower beyond. A mailbox's calendar has a month view, day by day across all its calendars or one, and a series opens onto its occurrences, derived from the stored pattern with the changed occurrences in place; events sort by when they start.

      0.4.2 Every edition

    • Mail job editor: back up, archive or both

      The first question of the mail job editor is what the job should do: back up, archive or both (both is the default for a new job). While it archives, the editor names how mail reaches the archive (Exchange journaling, set up once per tenant) with the way to its setup, and suggests backing up every 8 hours; backing up alone names the gap between two runs, in which mail that arrives and is deleted is in no backup. A job that only archives makes no backups on a schedule. Since 0.4.4 the editor also offers the capture ways that fit each kind of mailbox (see 0.4.4).

      0.4.2 Every edition

    • 0.4.3

    • Proxmox VE: VMs & containers in tabs, with search, filters and a detail panel

      VMs & containers has three tabs with counts: Guests, Backup jobs and Nodes. The guests table has a search over ID and name, filters by node, kind (VM or container), backup job (also "No backup job") and state, a "Problems only" button, sortable columns, pages of 25 to 250 and the state in the address, so a link opens the same view. Each row shows one state badge, chosen by priority, with a small progress bar while its backup runs or "+N" for further problems. A click opens a detail panel with every state, the complete error and warnings of the last run in a copyable block, the restore check, the sizes, the job, the newest runs and the actions (back up now, stop, withdraw, check now, open the guest page). The Backup column reads "First: 32 GB on Oct 3 · Last: +210 MB", and the panel shows the new data of the last 30 backups as small bars. The Nodes tab shows each node's heartbeat, its restow-pve version with "Update to …" when it is behind, its Proxmox VE version, its guest count, its queue and its problems. The tables keep fixed column widths and one row height, so they no longer jump while backups run. Tested with DOM tests, not visually in a browser with thousands of guests.

      0.4.3 Every edition

    • Proxmox VE: a locked repository no longer fails a restore check

      Right after a container backup, the new restore check often failed in red with a restic message about stale locks, although the check never ran: another run, usually the guest's own backup, held the repository's lock. A check that a lock keeps out is now postponed and tried again after ten minutes, the previous result standing. After two hours it reads "Could not check: repository locked" in yellow (Attention in Recovery readiness), never red and never green, with who holds the lock. Stale restic locks are removed before the check and before retention, a guest is not checked while a run of it is going, and a new restore point is checked two minutes after its commit at the earliest. restow-pve waits up to 15 minutes for the lock during a container backup. Restore checks that failed red because of a lock before the update stay red until "Check now". Tested against a simulated Proxmox VE API and S3 store, not a real cluster.

      0.4.3 Every edition

    • Update nodes and agents now

      On the card of nodes and agents in Installation › Updates, "Update nodes and agents now" starts the step in which they follow the server when no update led into it: the server was updated by hand, or the answer to an announced update was lost. An administrator with every tenant starts it; new runs pause for at most 15 minutes while reachable nodes and agents that are behind install the release when idle, and the pause ends once they are done (audited as update.fleet_started with manual: true). Outside an update, nodes and agents that are behind show as "Update available". Nodes on restow-pve 0.4.1 do not act on it and need one update by hand.

      0.4.3 Every edition

    • Proxmox VE: restow-pve restarts the Proxmox VE daemons after it updates itself

      After a self-update, the Proxmox VE daemons kept the old storage plugin loaded until they restarted. restow-pve now restarts pvedaemon, pveproxy, pvestatd and pvescheduler as the installer does, and restow-pve update restarts the running restow-pve service too, so the node reports the new release with its next heartbeat. A node that an older restow-pve updated restarts the daemons once by itself. Nodes on restow-pve 0.4.1 need one update by hand: /opt/restow-pve/bin/restow-pve update, then systemctl restart restow-pve pvedaemon pvestatd pveproxy pvescheduler.

      0.4.3 Every edition

    • Updates: no more false "The updater is not running"

      Announcing an update could report "The updater is not running" although the updater accepted it a few seconds later. The api waited 5 seconds for an answer while the updater checks Docker, the Compose configuration, the disk space and the running version first (5 to 12 seconds on real installations); the update then ran without the pause of new runs, without the audit entry update.scheduled and without the step in which Proxmox VE nodes and agents follow the server. The api now waits up to a minute and, when the answer is still lost, reads the updater's state again and treats the update as accepted when the updater shows it; the Updates tab says it is checking whether the update was accepted. The tab also no longer says "not running" for a few seconds now and then: the updater answers at once with its last check and checks again in the background.

      0.4.3 Every edition

    • 0.4.4

    • Archive capture: Microsoft 365 by Graph change notifications

      Restow archives Microsoft 365 mailboxes without journaling. It subscribes to Microsoft Graph change notifications for each archived mailbox and fetches every new mail within minutes of delivery (drafts are skipped, and immutable message ids keep a moved mail from being archived twice). A catch-up over every folder and the recoverable deletions runs every six hours by default and at once after a missed notification, and the existing mail of the mailbox is taken over once, in resumable pages, marked as captured later. No new Microsoft permission is needed. Notifications arrive only when the installation's public URL is https on port 443 and reachable from Microsoft; otherwise every mailbox is polled, by default every 15 minutes, and the capture status says why. This is near-time capture and is not complete: a mail deleted for good before Restow fetched it can be missing, and of the Recoverable Items only the deletions folder is read. Graph cannot export mail over about 150 MB; such mail is logged, not archived. Restow cannot see whether the tenant keeps deleted mail (a retention policy or a litigation hold), because Graph v1.0 offers no way to read that: an administrator confirms it per source on the archive page, which shows the Exchange Online PowerShell commands that check it. Tested against a simulated Graph API, not against a real Microsoft 365 tenant.

      0.4.4 BusinessService Provider

    • Archive capture: IMAP and Google Workspace by IMAP sync with IDLE

      IMAP and Google Workspace accounts are archived by a continuous sync. Activation records where every folder stands, the existing mail is taken over once (resumable, marked as captured later), and every later pass reads only new mail: a status check per folder, metadata first, and the source only of mail the archive does not hold for the account yet. All folders but Drafts are read; on Gmail and Google Workspace only All Mail, Spam and Trash, which hold every mail once. Where the server offers IMAP IDLE, Restow keeps one connection per account open (by default up to 300 accounts per worker) and archives new mail within moments, with a check of the other folders every five minutes by default; other accounts are polled every ten minutes by default. A source can be set to check at intervals only, for providers with a tight connection limit. A changed UIDVALIDITY reads the folder again without archiving anything twice. This is an approximation and is labelled as one: a mail moved or deleted right after delivery can be missed, and IMAP has nothing like a retention hold. Tested against a simulated IMAP server and the Dovecot of the release smoke run, not against a real Google Workspace tenant or hoster. IMAP sources with OAuth2 still cannot be created, so a Google Workspace account is recognised by its host or its folder list.

      0.4.4 BusinessService Provider

    • Forwarded copies into the archive

      For mail systems without Exchange journaling, the provider sends a copy of every incoming and outgoing mail to Restow while the mail is in its transport: a BCC map in Postfix or mailcow, a Sieve redirect :copy, or the routing rule "Add more recipients" in Google Workspace. The journal receiver accepts such plain copies as well as Exchange journal reports. Every IMAP account can have an archive address of its own (issued on request, renewable, audited): a copy sent to it belongs to exactly that account, while a copy sent to the tenant's journal address is assigned by its headers and the SMTP sender. A forwarded copy has no envelope like a journal report, so a BCC recipient shows only if the provider writes it into a header. The copy arises at the provider's transport, before the user can touch the mail. The archive page shows for each account how to set the rule up (Postfix, mailcow, Sieve, Google Workspace) and whether copies arrive. Tested against the receiver itself, never against a real Postfix, mailcow, hoster or Google Workspace. The receiver does not check the sender (SPF).

      0.4.4 BusinessService Provider

    • One archived item per mail, however many ways captured it

      Mail that reaches the archive by more than one way is recognised by its Message-ID and its content (the exact bytes or a hash of the body) and kept once. A capture that is not stronger than what the archive holds becomes a capture entry on that item; a stronger one (a forwarded copy after an IMAP sync, say) becomes the item and names the earlier one it replaces, which stays unchanged in the chain. The same Message-ID with another body is kept twice and flagged. Journal reports and imported messages stay items of their own. Search and the item's detail name forwarded copies, mail captured later and the other ways that captured the same mail again; replaced captures are hidden unless asked for, and the export of a search follows that. Every writer of the archive now appends through one shared path and uploads the original before the tenant's chain lock is taken, so a large report no longer holds up the other deliveries of the tenant.

      0.4.4 BusinessService Provider

    • Mail job editor: only the capture ways that fit the mailbox

      The editor of a mail job recognises the kind of mailbox (Microsoft 365, IMAP, Google Workspace over IMAP, IMAP on a Microsoft host) and offers only the capture ways that fit it: Microsoft Graph and Exchange journaling for Microsoft 365, IMAP archiving and forwarding for IMAP and Google Workspace. Each way is labelled as captured at transport or near-time, locked with the edition that has it, and at least one per kind is required. The defaults of a new job, and of a job that switches archiving on, are Graph and IMAP sync, each with a one-time takeover of the mail already in the mailbox. IMAP accounts on a Microsoft host get the hint to connect a Microsoft 365 source instead. Switching archiving or a way off asks first: new mail is no longer archived from then on, and the archive kept so far stays. A journal address is requested only while Exchange journaling is chosen. Jobs that archived before the update keep journaling only for Microsoft 365 and have no way yet for IMAP and Google Workspace accounts, so nothing new starts by itself: an administrator switches Graph or IMAP archiving on in the job. Pausing a job stops its scheduled backups only; archiving goes on.

      0.4.4 Every edition

    • Archive page: capture status, hold confirmation, PowerShell commands and forwarding addresses

      The archive page shows the capture from the mailboxes (streams, how mail is noticed and why a mailbox is checked at intervals, counts of 24 hours and 7 days, the takeover of existing mail), the capture per mailbox with a catch-up on request and, per Microsoft 365 source, the hold confirmation with the read-only Exchange Online PowerShell commands that check it. Exchange journaling comes as ready-made PowerShell commands (connector, mailbox for undeliverable journal reports, journal rule) and a wait for the first report that checks every 5 seconds. Forwarding has an address per IMAP account (created, copied, renewed after a question), its status and instructions for Postfix, mailcow, Sieve and Google Workspace. A notice that can be put away names the mail jobs where Graph or IMAP archiving could be switched on, and the capture status lists the jobs that wait for a way.

      0.4.4 BusinessService Provider

    • Alerts when archive capture stops

      The alert archive.failed (bell, rules, e-mail) now also reports a mailbox whose capture has been in error for more than an hour, an IMAP account whose forwarded copies stopped for 24 hours while its job wants them, and a journal address without reports for 24 hours, each only after it had received before and once per stretch. The bell and the mail say which of these it is and lead to its section of the archive page.

      0.4.4 BusinessService Provider

    • Journal receiver limits and an archive chain that no longer forks

      One SMTP transaction delivers into one tenant's archive; a recipient of a second tenant is answered 452 and delivered by the sender separately. The limit per sending IP rises from 60 to 600 connections per minute, and a new limit per archive address (300 per minute) answers 451. Mail to the journal address that is not a journal report is archived as a forwarded copy instead of as an incomplete report. Fixed: the archive chain could fork when two writers of one tenant stamped their items with the same time. Writers now take the last item in the order the chain check walks (time, then id) and stamp theirs strictly later.

      0.4.4 BusinessService Provider

    • Restore explorer: large mailboxes and OneDrives open in milliseconds

      Opening a large mailbox or OneDrive in the restore explorer no longer takes seconds to minutes. Every folder listing used to read all entries of the restore point twice per request and matched the folders below against them without an index; it now reads the folder's children and the folders below it from two new indexes. In a test with 120,000 messages and 200,000 files, the mail folder list went from 2.5 s to 15 ms, the root of the mailbox and of the OneDrive from over a minute to 15 ms, and every OneDrive folder from 1.5 to 2.5 s to about 10 ms; a folder of 50,000 messages lists its first page in about 0.5 s (was 1.9 s). The versions OneDrive kept of a file and the calendar's month view read the same indexes, and mail preview and attachment download read exactly the bytes of a chunk with a range request instead of downloading its whole pack of up to 64 MiB. Restore points of 0.3.4 and earlier that the worker has not converted yet are listed as before. The indexes are built while the update runs, which takes longer on a large installation (see the upgrade notes).

      0.4.4 Every edition

    • Proxmox VE: the job dialog fits a desktop screen

      The Proxmox VE job dialog is twice as wide and lays its settings out in two columns from tablet width on (name and schedule with the next runs on the left; scope, restore points, restore check, boot test and guests on the right), so a job's settings fit on a desktop screen without scrolling. On a phone it stays one column at full width.

      0.4.4 Every edition

    • 0.4.5

    • License keys with an update period

      A license key can carry the terms of its updates: an update period (updates_until) and a series. A key with an update period covers every release made up to the end of that day (UTC), whatever its version. A key without one covers a whole series: the key format restow-license-v1 names it, and a key without a series counts as series 1, which also covers every 0.x release. Every key issued so far is a beta license: it carries neither member and covers every 0.x and 1.x release, permanently. The key format takes the new members as optional and ignores members it does not know, so keys that the license server issues later keep verifying; the six members of today stay required and keep their rules. A key may also name the vendor signing key it was signed with (kid), so that a signing key can be rotated without breaking issued keys. Keys with the new members verify only from 0.4.5 on. Keys are still verified offline: Restow contacts no license server, and nothing stops while it runs, because a key has no expiry, only releases it covers and releases it does not.

      0.4.5 BusinessService Provider

    • The image carries its release date

      Every image carries the date of its release (RESTOW_RELEASED_AT, the commit date of the release tag), and GET /api/v1/status reports it as releasedAt. The release notes publish the same date in a released: line next to the image digests, which is how the update check knows the date of a release before it installs anything. License keys with an update period are measured against this date.

      0.4.5 Every edition

    • The update check and the start honor the update period

      The update check marks the releases that the installed Business or Service Provider key does not cover and says so calmly on the Updates page: the installed version keeps working, and the newest covered version installs as usual. Restow refuses to install or plan an uncovered release (409 update-not-covered), and the bell and the update.available alert rules announce only the newest covered release. A release that is started by hand, past the update check, and that the installed key does not cover stops before its database migrations, with a log line naming the version, the end of the update period and the last covered release date; nothing needs to be restored to go back, and the opt-in updater puts the previous version back by itself. With RESTOW_RUN_AS_COMMUNITY=1 it starts as Community instead: the modules stay off and no data is changed. None of this applies to beta licenses, development builds, installations without a key or the public demo.

      0.4.5 BusinessService Provider

    • License page: update terms, a notice before the end and renewal

      The license page shows which updates the installed key includes ("Updates: all 1.x (beta license)" or "Updates: until" with the date) and, from 30 days before the end of the period and after it, a short notice on the same page; no e-mail is sent. A new key replaces the active one even while that one is in force, which is how a renewal is installed: earlier keys stay in the history, and every installation or replacement is written to the audit log with the key's update terms and whether they cover the running version. A key that does not cover the running version is refused (outside_update_period), and so is a key signed with a vendor signing key this version does not know yet (unknown_signing_key): update first, then install it.

      0.4.5 BusinessService Provider

    • Public demo: a fast nightly reset

      The public demo resets from a saved template instead of seeding again. After a full seed, deploy/demo/reset.sh saves a template (a dump of the demo database, its roles and a copy of every volume the seed writes) keyed by the release, the image ids and the .env, and restores it on the following nights, so the demo is offline for about 15 to 25 seconds instead of many minutes. The restore moves every system time forward by the template's age, so the history still ends today and "last backup 12 minutes ago" stays true; the audit log, the mail archive and restic's own snapshot times keep their real times, and sign-ins are removed. A template older than 7 days (configurable), a new release, new images, a changed .env or a failed restore lead to a full seed. The health checks of the demo's services run every 2 to 5 seconds instead of every 10 to 15, so a reset waits less for services that are ready already. This concerns the public demo only, not an installation.

      0.4.5 Every edition

    • Remove a revoked machine from Restow, with or without its backups

      A revoked machine can be removed from Restow. "Remove from Restow" in its danger zone offers "Remove from the list, keep the backups until they expire" (the newest backup plus the longest rule of the machine's retention, read as time) or "Delete the machine and its backups", with the hostname typed and a recent sign-in. The machine leaves every list, picker, dashboard and count and its backup job; its runs, reports and audit entries stay. The worker deletes the machine's restic repository on every target that holds files of it: the primary, its copies and retired primaries. Deleting now is refused while a legal hold over the tenant or an unresolved suspicious restore point holds the backups, and the worker waits for such a hold when the backups expire. Objects that the storage still locks (S3 Object Lock, a directory's deletion delay) are deferred until their lock runs out, recorded like a refused prune. The machines page lists the removals still pending, with the date, the hold or the lock. Every step is audited. Migration 0064 adds the removal state to the machines.

      0.4.5 Every edition

    • Revoke a machine that is gone, and a suggestion to do so

      An uninstall that waits for a machine that is off now offers "Revoke now", and a machine without contact for longer than a configurable number of days (30 by default, under Alerts of the machine) suggests revoking it, on its page and among what needs attention. The machine's detail panel on Inventory shows the suggestion as a state and offers "Revoke now" and, once the machine is revoked, "Remove from Restow" as well.

      0.4.5 Every edition

    • Warning when a directory repository lies on the system disk

      Restow warns when a directory repository lies on the system disk of the Restow server, the disk under the operating system, Docker and the database: a full system disk stops everything, not only the backups. The api recognises it from inside its container by the device and the block device of the path, the installation default and the mounter's shares included. The warning is shown on the Repositories page, in the "Backups land in" line of the job editors and on the dashboard's storage tile, where provider admins also see the free space, its trend over the last week and when the disk would be full. The api now also watches the system disk for low disk space. Nothing is blocked.

      0.4.5 Every edition

    • Microsoft 365 groups as protected objects: calendar and conversations

      The calendar and the conversations of Microsoft 365 groups, and of the groups behind Teams, are protected objects of their own kind, group. The directory sync reads groups/delta as a second delta stream next to the users (a full enumeration on the first and every full sync, only changes in between), keeps only Microsoft 365 groups (security and distribution groups have no group mailbox) and orphans removed ones, whose restore points stay. Groups are opt-in: the protection rules get a switch "Protect all Microsoft 365 groups" (by default only selected groups, which means none unless you include them in the list of protected objects), and single groups can be included there. A mail job with scope "all" covers every protected group, like sites. Group mailboxes never count as protected mailboxes. Migration 0065 adds the object kind. After the update no group is backed up until the protection rules switch it on or groups are included; the first directory sync reads the groups of every Microsoft 365 source once in full.

      0.4.5 Every edition

    • Group calendar and conversations: what a backup holds

      A group's backup holds its calendar, read by the same calendar code as a user's (series masters with their exceptions), and every post of every conversation, stored as an RFC 5322 message under mail/Conversations with its file attachments when Graph hands them out (otherwise their absence is recorded). Where Graph refuses the app the event listing of a group calendar, Restow falls back to the group's calendarView and one read per series master; a calendar that Graph refuses entirely is a warning on the run, not a failure. Only threads with new posts are read again. A group that no longer exists fails with the new cause graph.group_unavailable. No new Microsoft permission is needed: Group.Read.All and Calendars.ReadWrite were always required. Tested against a simulated Graph API, never against a real Microsoft 365 tenant: which calendar reads Graph allows an app on a group can differ by tenant, and the backup reports what it could not read.

      0.4.5 Every edition

    • Group calendar and conversations: restore, download and export

      The restore explorer lists groups in the "SharePoint & Teams" section with the areas "Group calendar" and "Conversations"; download (EML, JSON) and export (EML, MBOX, PST) work as for mailboxes. A restore into a user's mailbox brings back events and conversations, the conversations as mail in a Conversations folder. A restore into the group itself brings back calendar events only, because Microsoft Graph lets no app post into a group conversation: each post is reported as not restorable, with the ways that work. Restoring a group is no impersonation, because a group belongs to no person. The integration API reports lastSuccess.groups and ObjectKind includes group (contract 1.6.0, additive: clients that handle object kinds exhaustively should accept the new value), and the dashboard lists group calendars and conversations among the last backups.

      0.4.5 Every edition

    • Start now and Stop on every job

      Both job lists, Servers & clients and Mail & SaaS, have "Start now" and "Stop" on every row and in the row's "…" menu: one button of a fixed size that says "Start now", "Stop" while the job's backups run or wait, and "Stopping…" once asked. Stopping asks first and says what it means for the kind of job. "Run now" is now called "Start now". New API routes: POST /api/v1/backup-jobs/:id/cancel (every queued or running backup of a mail, machine, share or copy job in one request), POST /api/v1/pve/jobs/:id/run (a backup of every guest a Proxmox VE job (a preview) covers, like its schedule would, without moving the schedule) and POST /api/v1/pve/jobs/:id/cancel. All are audited, are for tenant administrators and provider roles that may operate, and are closed in the public demo.

      0.4.5 Every edition

    • Detail panels on Inventory and the job lists

      Inventory and the job lists open a detail panel like the one of VMs & containers: a click on a row, its name or its state opens it (?machine=<id> on Inventory, ?job=<id> on the job lists, so a link opens it). It lists every state, the full error and warning texts of the newest backup or failed run in a copyable monospace block (for a machine also the end of the log), what needs attention, the restore checks, the key facts, the newest runs and the actions. The tables keep their layout like VMs & containers: fixed column widths, one row height (loading rows included), one compact state badge per row (the most urgent of what applies; green only for a passed restore check) with the progress of a running backup beside it, one-line cells without tooltips and action buttons of one size. Columns that do not fit a screen give way from the right; the panel has everything.

      0.4.5 Every edition

    • Dependencies: translation libraries and the Microsoft token code

      Major update of the translation libraries, i18next 26 and react-i18next 17, updated together; texts, plurals and number and date formats read exactly as before in English and German. @azure/msal-node is no longer a dependency, because nothing used it: the Microsoft 365 app tokens, the admin consent and the IMAP OAuth2 sign-in use Restow's own token client, unchanged.

      0.4.5 Every edition

    • Fixes: attachments folder in the restore explorer, Proxmox VE job dialog on a phone, demo reset

      In the restore explorer, a mail message stored as JSON (too large for a plain message) no longer shows an empty <subject>.attachments folder next to it: its attachments are restored with the message and were never listed, and the folder row that the backup records for them is now hidden from the listing, the folder tree and search. The job dialog of Proxmox VE (preview) stacks its three restore-point fields on a phone (390 px), so "Monthly restore points" no longer runs over the dialog's edge. The reset script of the public demo now reads RESTOW_DEMO_COMPOSE_FILES from deploy/demo/.env, as its README always said, and refuses entries that are not compose files before anything is stopped.

      0.4.5 Every edition

    • Checks of the Entra tenant and of an IMAP OAuth2 secret

      The setup wizard accepts the Entra tenant for Graph mail only as a tenant id (GUID) or a verified domain, as Settings already did; anything else is refused (422) before it can reach the token URL. The URL was never open to another host (the value is URL-encoded and the login host is fixed), but a value such as .. changed its path. An IMAP OAuth2 secret is refused unless its tenantId is a tenant id, a verified domain, common, organizations or consumers, and its tokenEndpoint is an https URL. Neither the API nor the interface creates such secrets yet; the token request will also need the address policy of IMAP connections before XOAUTH2 is offered.

      0.4.5 Every edition

    • 0.4.6

    • Proxmox VE: restoring a container works on current Proxmox VE

      Restoring a container from Restow failed with Can't use string ("restow") as a HASH ref on current Proxmox VE, which passes the storage ID to the backup provider's container restore before the info hash. Boot tests of containers ("Did not boot") and "Restore as a new guest" of containers were affected; VMs were not. The plugin of restow-pve now accepts both forms; it is installed with the restow-pve update, which reloads the PVE daemons. Update restow-pve on every Proxmox VE node before relying on container restores or boot tests (the server offers it after its own update, and nodes update themselves when idle); until then they keep failing as before. For container restore points that read "Did not boot" or have a failed restore check from before 0.4.3, run "Boot test now" or "Check now" once the node is updated. Tested with Perl tests of the plugin (the container restore with and without the storage ID); not run against a real Proxmox VE node before the release.

      0.4.6 Every edition

    • Ransomware detection: a new backup chain is no longer flagged

      The first backup of a container's new backup chain (its repository was missing, or reset) was judged against the old chain and flagged as suspicious, because every file is new in an empty repository. The baseline now begins with the newest chain. A restore point flagged that way before the update stays flagged: mark it as a false alarm. The first backup of a new chain is also called "First backup" now, not "Incremental".

      0.4.6 Every edition

    • Removed machines keep their backups browsable

      Until their backups are deleted, the page of a removed machine offers their restore, and nothing else: the restore points, browsing, the ZIP download and the repository key keep working for them, audited as before. The list of removed machines links "Restore files". Restoring onto the machine and every other action stay refused (404); once the backups are deleted, the machine is gone for every reader. Before 0.4.6 the interface did not offer the backups that a removed machine keeps until they expire; since 0.4.6 it does.

      0.4.6 Every edition

    • "Check queued" while a restore check waits

      After "Check now" of a VM or container, the row says "Check queued" under the last check, and the guest's page says it above the earlier result, until the result is in; both refresh every few seconds meanwhile.

      0.4.6 Every edition

    • Error texts open in a card that can be copied

      Error texts behind a badge or a cut-off line (the boot test, the restore check of a VM or container on its page and in the recovery readiness table) open on hover or keyboard focus in a card with the whole text, selectable and with a Copy button, instead of a browser tooltip. A boot test that did not boot shows the node's message under its badge, on the guest's page and in the recovery readiness table.

      0.4.6 Every edition

    • 0.4.7

    • Microsoft 365: disabled, unlicensed and locked objects read "Not backed up", with the reason

      A mailbox whose account is disabled or has no Exchange Online licence no longer fails its backup every night with "Microsoft rejected the request". The backup asks Microsoft once whether the user exists but has no mailbox, marks the mailbox "Not backed up: account disabled" or "Not backed up: no licence" and ends neutral: no failed count, no red readiness because of age, not overdue, no backup.failed alert or job.failed webhook, existing backups kept. The directory sync sets the same state from its mailbox probe. Only Exchange's answer counts, so a disabled account whose mailbox Microsoft still serves (a shared mailbox, a former employee) is backed up as before, and a 401 or 403 is never read this way. The same holds for a OneDrive or SharePoint site that Microsoft locked (HTTP 423, which Microsoft does to the OneDrive of an unlicensed account): once one cheap read confirms the lock, it reads "Not backed up: locked", ends without retries and is no longer planned; the directory sync resumes it only when a read of the drive or site succeeds again. Backups resume by themselves after the directory sync that finds the account enabled or licensed again. A restore into the original mailbox is refused with the reason. Tested against a simulated Microsoft Graph API, not against a real Microsoft 365 tenant.

      0.4.7 Every edition

    • Not backed up any more, please confirm

      Objects that Restow no longer backs up because the source says they are gone, disabled, unlicensed or locked first read amber "Not backed up any more, please confirm", with the reason and the date. That is no failure, no red and not overdue, but the warnings, the dashboard and the tenant's readiness stay at least yellow (never green), the integration API counts them in readiness.toConfirm, and providers see inactive_to_confirm among a tenant's alerts, until an administrator confirms "Yes, intended": per object, or for several in the list by selection or by the list's filter (at most 1000). Tenant administrators and provider teams with configure rights may confirm, and every confirmation is audited; through the API it can carry a note for the audit log. Confirmed objects read grey "Intentionally no longer backed up", with who confirmed it and when. When the object becomes active again, the confirmation is dropped and backups resume; if it stops again later, Restow asks again. An excluded object that disappears from the source was never backed up and counts as confirmed. The list of protected objects filters by to_confirm and confirmed. The new events object.inactive (a notice per object and transition, in the bell by default) and object.inactive_many (one warning per tenant and day when more than 10 objects, or more than 20 percent of the objects backed up before, stop within a day) are part of the notification matrix; a webhook gets them as report.alert once they are ticked. Objects that were already orphaned before the update count as confirmed, so no long amber list appears. Migration 0069 stores the state.

      0.4.7 Every edition

    • Integration API 1.7.0: orphaned also means no longer backed up

      The one breaking change of the release: status "orphaned" in GET /api/v1/objects, GET /api/v1/users, the object of GET /api/v1/jobs and objects.orphaned of GET /api/v1/status now also covers objects that are still at the source but are no longer backed up (account disabled, no licence, or locked by Microsoft); before, it meant removed from the source. The new statusReason (account_disabled, no_license, locked, null for an object removed from the source) tells them apart, so an integration that treats orphaned as a deleted account should check it before it acts. Everything else in the contract moves additively: inactiveSince and statusConfirmedAt on objects, toConfirm in the readiness summary of status and verify/latest, a user's recoveryReadiness that reads at least yellow while one of its objects waits for a confirmation, excluded Proxmox VE guests as guests.excluded (outside guests.total and guests.withoutJob), the skip reason inactive for POST /api/v1/jobs/backup, data.job.result on the job.completed and job.failed webhooks of a restore, and the new alert events. Clients that handle skip reasons or event names exhaustively should accept the new values.

      0.4.7 Every edition

    • Backups that Microsoft Graph or the storage held back no longer count as failed

      A Mail & SaaS backup that ends, after all its retries, with graph.throttled, graph.service_unavailable or storage.rate_limited reads "Held back by the service, retried" in amber instead of "Failed" in red, in every view: History, the all-tenants job overview, the objects list, the runs of a job, the job page, the dashboard and the run details. It is left out of the failed counts of the statistics and the dashboard, does not make the job failing (the run before it stands), does not make a warning red or end its acknowledgement, and raises no backup.failed alert and no job.failed webhook. The next scheduled run tries again, and an object held back for longer is caught by the overdue and readiness rules, which look at the age of the newest backup. A restore, export, import or check that a service held back has no next run and stays a failure. Earlier runs that ended with these causes read the same after the update and leave the failed counts of past periods. A background job also honours a Retry-After of up to 5 minutes now (before, waits were capped at about a minute, and Exchange refuses a retry before its mailbox concurrency penalty is over); requests from the interface keep the one-minute cap.

      0.4.7 Every edition

    • A permission granted to the Microsoft 365 app takes effect without a new client secret

      A token carries the app's permissions as they were when it was issued, and Restow kept it until shortly before it expired (up to about an hour), so a permission that an administrator granted in between was refused until then or until a new secret was entered. When Graph answers 401 or 403, Restow now fetches a new token once and sends the request again, at most once a minute per tenant or source, so a run of refusals (an item the app may not read) does not fetch a token each time; refused sub-requests of a $batch are sent again once as well. A request refused again with the new token fails as before. This applies to backups, restores, the directory sync, the archive capture, the group search, the connection test and the consent check. A token endpoint that cannot be reached is asked twice more (after 1 and 4 seconds) and then fails the run, which resumes from its checkpoint, instead of recording every item as failed. Notification mail through an app registration does not fetch a new token after a refusal yet: a Mail.Send permission granted later takes effect once the cached token expires.

      0.4.7 Every edition

    • One queued backup no longer blocks the backup queue of every tenant

      A queued backup of an object whose backup was still running (the next scheduled run, "Back up now") blocked the backup queue of every tenant until that backup ended, because the job queue kept offering it first and handed out nothing. Such a job now waits for its object's running backup and lets every other backup pass. Restow ships pg-boss 10.4.2 with a patch of its own for this; the images carry it, and anyone building from source keeps the patches folder.

      0.4.7 Every edition

    • Reminders before the client secret or certificate of an app registration expires

      Restow reminds provider administrators 30 days before the client secret or certificate of the central Microsoft 365 app registration expires, again 7 days before and once it has expired, each stage once per expiry date; the event installation.app_secret_expiring is a warning, an error once expired. A source that is connected through its own app registration gets the same reminders as source.app_secret_expiring, which tenant administrators can choose as well. The date is the one entered under Installation › Microsoft multi-tenant app (ENTRA_CLIENT_SECRET_EXPIRES_AT for a secret from the environment), the "Secret expires on" of a source's own app, or the certificate's own end; Restow does not read it from Microsoft Graph, which would need Application.Read.All. On a source, the connection card shows "Expires", and the date can be noted, changed or removed there without entering the secret again. A new date, secret or certificate starts the reminders over. The bell names the stage ("expires in 5 days", "Renew it now", "has expired"), and the mail lists the date, the days left and the application ID and says how to renew without a gap: create the new secret, enter it with its new date, only then delete the old one in Entra. The expiry badge turns amber 30 days before the end instead of 60, and red from 7. Sources connected through their own app before 0.4.7 have no date yet: note it on the source's page.

      0.4.7 Every edition

    • Mailbox, OneDrive, SharePoint and IMAP: an error costs an area or an item, not the whole run

      Mailbox backup: a 403 for calendars or contacts (permission missing, an access policy that covers mail only) fails that area and keeps the mail of the run, instead of discarding the snapshot; a 401 in the middle of a run checkpoints and resumes; a well-known folder that Graph refuses to resolve is treated as absent; a delta link that Graph rejects as an invalid sync state leads to a full resync; a message that Exchange cannot convert to MIME is stored as JSON with its attachments, like an oversized one; a subfolder deleted while its parent was listed no longer fails the run. SharePoint: a library or list that Graph will not give is an item failure that keeps its last copy, and the rest of the site gets its snapshot. OneDrive and SharePoint: an item that failed and came through later in the same run no longer stays among the failures, and a OneDrive whose drive Graph no longer finds fails as "OneDrive unavailable", permanent and not retried. IMAP backup: a login that the server refuses for now (too many connections, an authentication backend that is down) and a download cap are the new transient cause imap.server_limit, retried by itself, instead of a wrong password or a full mailbox; messages deleted or moved during the backup are not counted as failures. IMAP archive capture: a message that the server refuses no longer holds back its folder or the whole pass (after three passes the capture gives up on it), and folders that a pass did not reach keep their state. Every $batch of Graph also sends an identical read only once, so a repeated request id cannot fail a batch, and a connection broken before Graph answered is retried for reads.

      0.4.7 Every edition

    • Restores that did not restore anything are no longer reported as completed

      A completed restore with failed items and none restored reads "Nothing restored" (red) and raises restore.failed and the job.failed webhook, with "Nothing was restored: N items failed." as its error. One that skipped every item reads "Everything skipped" (amber) and stays restore.completed, saying so instead of claiming it restored something (info, not success, in chat channels). The job.completed and job.failed webhooks of a completed restore carry its counters in data.job.result (restored, skipped, failures, unverified).

      0.4.7 Every edition

    • Recovery readiness and overdue backups: removed objects, members with a schedule of their own, running backups

      An object removed from its source (a mailbox deleted in Microsoft 365, for example) no longer turns red because its last backup grows old: nothing backs it up any more and retention always keeps its newest restore point, so it is rated by whether that backup restores, without the age reasons, and is never overdue; a kept backup that does not restore stays red. The same rating applies in the statistics, the objects list, the tenant's overall readiness, the integration API and the verify.completed notification; the table says "Removed from source, backups kept", and the report page opens with a note "Removed from the source". An object whose newest backup was never checked gets one more check from the weekly planner. For backup.overdue, a mailbox member with a schedule of its own is judged by that schedule or by the tenant's mail jobs (the most relaxed one), whichever allows longer, so a weekly member of a daily job is no longer overdue two days after its backup, and an object whose backup has started and is still running (up to 21 days, a large first backup) is not overdue either.

      0.4.7 Every edition

    • Proxmox VE: exclude a guest from backup on purpose

      An admin can exclude a VM or container from backup, for test VMs or guests that are backed up elsewhere: "Exclude from backup" on the guest's page or, for a selection of a node's guests, in the inventory; "Include again" takes it back. Tenant administrators and the administrators of the provider team may do so. No job backs an excluded guest up, not even the job for all guests, and the recommended job leaves it out; its own job stays recorded, so including it again restores what it had. Excluding withdraws its queued backups (a backup queued in the same moment is withdrawn at the node's next heartbeat, before the node gets it), and "Back up now" and putting the guest into a job are refused until it is included again. An excluded guest counts nowhere as unprotected: not in the overviews, the recovery readiness, the warnings, backup.overdue, the statistics or the provider view, and it never keeps a tenant from green; the guest counts report it as excluded. In VMs & containers it reads "Excluded" (grey, never a problem) and has a state filter of its own, and the inventory shows "Excluded: N" per node. Its restore points stay restorable, and retention treats them as before. New route PUT /api/v1/pve/guests/:id/excluded, audited as pve.guest.excluded. The update excludes no guest; guests in no job keep counting as "in no backup job" until an admin excludes them. restow-pve needs no update for this.

      0.4.7 Every edition

    • Proxmox VE: the size of the first backup and of a follow-up backup as text in the inventory

      The inventory shows the size of a guest's first backup ("First backup on" with the date and the size stored) and what a follow-up backup adds on average ("Average per follow-up backup" with the size and the number of backups it is based on) as text in the guest's row, not only in its tooltip, so both can be read and copied.

      0.4.7 Every edition

    • Recommended job with the mail archive

      While the installation offers archive capture from the mailbox (Business and Service Provider) and the tenant has mailboxes or accounts an archive can capture, "Create recommended job" and "Protect everything without a job" make the new mail job over all objects back up and archive. A mail job over all objects that exists and does not archive yet is switched to archiving instead ("Switch archiving on in …"); its schedules stay, and the change is audited like an edit in the job editor. The click uses the capture ways that need nothing set up in the tenant: Microsoft Graph for Microsoft 365 mailboxes, IMAP sync for the other accounts; journaling and forwarding stay a choice in the editor. The recommended job never changes a mail job over selected objects (its preview names them), and a mail job over all objects whose capture ways were chosen by hand is left as it is, which the preview says. The list of mail jobs shows "Switch archiving on" where the recommendation would switch it on. Without the capture, the recommended job is made as before, and existing mail jobs change only when an administrator applies it.

      0.4.7 Every edition

    • Monthly prices and a price estimate per tenant for providers

      Under Installation › Prices the owner of the installation enters a monthly price per mailbox and per GB or TB of stored backups, in EUR, CHF, USD or GBP (at most four decimals; a price left empty is not shown). Mailboxes are counted as in the mailbox usage (a OneDrive does not count twice); storage is the tenant's stored backups, deduplicated and compressed, in decimal units (1 GB = 10^9 bytes). Provider admins with every tenant can read the prices, only the owner changes them, and each change is audited with the values before and after. Each tenant's overview then shows provider admins a card "Price per month" with what the tenant comes to at these prices, one line for the mailboxes and one for the storage, and a link to the prices. Tenant users never see prices. Restow bills nothing and limits nothing, and the prices are empty after the update.

      0.4.7 Every edition

    • Fixes: IMAP and list restores, job time limits, demo seed, wording

      An IMAP restore whose connection drops now fails and is retried on a fresh connection, where the Message-ID check skips what was already appended, instead of ending "completed" with every remaining item failed. A retried SharePoint list restore in "keep both" mode no longer adds the items the interrupted attempt added, and a retried contacts restore in that mode no longer creates contacts twice. A restore into a mailbox given by address resolves the mailbox the API accepted, so a duplicate address no longer picks another one. The time limit of a job counts from when the queue handed it out, also while it waits for a free slot of its tenant; a cancel that lands while an attempt starts or fails is kept; a job that the reconciler ends for good raises the job.failed webhook, the bell and the notification rules like any other. The seed of the public demo no longer fails when Restow queued an object's first backup itself, which had left the demo on its "being reset" page. The job page names the phases of a SharePoint site backup ("Reading the site", "Lists") and of the discovery of sites and group mailboxes, and the retention notes say that the newest restore point of each object is always kept. "Remove from Restow" no longer says that file restore stops offering the backups of a removed machine (it offers them since 0.4.6), and the license page no longer lists sign-in with Microsoft among what Business unlocks, because it is not available yet.

      0.4.7 Every edition

    • Dependencies: better-auth, mail libraries, Vite, React and the build tools

      better-auth 1.7.14, mailparser 3.14.1, nodemailer 10.3.1, smtp-server 3.21.3, msgreader 1.29.0, Biome 2.6.4, Vitest 5.0.5, Vite 8.3.5, React 19.3.1 and, in the release pipelines, docker/login-action 4.7.0. zod 4 is not part of this release.

      0.4.7 Every edition

    • Dependency advisories: ip-address, seroval and zod

      ip-address 10.7.5 (from 10.7.2), a transitive dependency through socks, resolves a moderate advisory; socks comes with the IMAP library and is used only for connections through a SOCKS proxy, which Restow does not configure. seroval 1.7.5 (from 1.6.7, through the TanStack router) resolves GHSA-7rv5-mrxv-xcr9, GHSA-wp97-x4hv-qvhp and further advisories of its deserializer, and zod 4.6.7 (an override for the copy better-auth uses) resolves GHSA-mrhx-c7xc-m3w5 there. That advisory (memory use when validating a large array) also names zod 3, which Restow's own request validation uses and for which no fixed 3.x exists; the audit of CI ignores this one advisory until Restow moves to zod 4. The request body limit of the api (1 MB on most routes) bounds it: a 1 MB array that fails element by element costs about 150 MB and a second of the api for that request.

      0.4.7 Every edition

  2. Planned

    Next

    Decided and expected to come before the items under Later. No version numbers and no dates: an item moves to Shipped when a published release contains it, not before.

    • Everyday use

    • Inventory and protection groups

      Building on the machine table of 0.2.1, protection groups assign new machines to a job by profile, operating system, host name or tag, and the install command can carry the job. The agent's report of the usual Linux data folders, so that the job editor can suggest paths, shipped in 0.4.0; protection groups did not.

      Every edition

    • Complete wizards

      Step-by-step wizards for adding a source or an agent, switching on the archive and creating a tenant, with a step bar and drafts you can continue later. Drafts never hold secrets.

      Every edition

    • Touch and search

      The row actions of the context menus as a bottom sheet on touch screens, and a command palette that also finds mailboxes, machines and runs by ID.

      Every edition

    • Pins and command palette

      Pin pages, tenants and tenant tabs to the top of the menu, a context menu on menu entries and tabs (pin, open in a new tab, copy link), and a command palette that reaches every page and tenant tab.

      Every edition

    • Microsoft, archive, brand

    • Microsoft 365 app per tenant

      Beyond the Graph app of your own that a source can use since 0.2.2 (a client secret or certificate you enter): each tenant connects Microsoft 365 with its own app, registered in that tenant's Microsoft directory. Restow creates a certificate per tenant whose private key never leaves Restow, guides through the registration with that tenant's values, checks every permission and warns before the certificate expires. The installation-wide multi-tenant app with a consent link remains an option; existing connections keep working unchanged. Since 0.4.7, Restow already reminds 30 days before, 7 days before and once the client secret or certificate of the central app registration or of a source's own app has expired; the date is entered (a certificate carries its own) and never read from Microsoft Graph.

      Every edition

    • Replace mode for OneDrive files

      An optional restore mode for OneDrive files in which the current file becomes an earlier version instead of being deleted. Never for mail.

      Every edition

    • Archive as a mail browser with visible proof per mail

      The archive gets its own area and reads like a mailbox you can browse. Each mail shows its proof: the hash chain values, the last chain verification with its result (stored and recorded in the audit log) and the actual Object Lock state of the storage. Journaling puts a mail on record before the user sees it. Repositories get a purpose, backup or archive; an archive repository requires Object Lock or an explicit acknowledgement that it has none.

      Every edition

    • Archive proofs and end-user search

      An auditor export that carries the chain values, a signed PDF evidence report, a choice per mailbox between back up only and back up and archive, and search of their own archive for end users. Partly there since 0.4.2: the mail job editor asks per job whether it backs up, archives or both; per mailbox is not built.

      Every edition

    • External daily anchors for the archive chain

      The daily anchors of the archive's hash chain, sent by e-mail or as an RFC 3161 timestamp. Since 0.3.1 the worker seals an anchor every night and the archive check compares against it, but the anchors stay inside Restow: nothing sends them out or timestamps them externally yet. Planned.

      Every edition

    • Procedural documentation generator

      A per-tenant document (Verfahrensdokumentation) generated from the actual configuration and a template, as Markdown and PDF, versioned and dated. The full procedural documentation stays your organization's own responsibility. Planned.

      Every edition

    • Sign-in with Microsoft and single sign-on (SSO)

      Sign-in with a Microsoft account for people who already have a Restow account, and single sign-on. The Microsoft sign-in code exists, but nothing links an account to a Microsoft identity yet, so nobody can sign in with Microsoft today and Restow creates no accounts this way.

      BusinessService Provider

    • White label

      Your brand instead of Restow: product name, logos for light and dark, accent colour, sign-in page, support contact and sender name, set for the installation and overridable per tenant. It applies to the interface, the end-user portal, e-mails and PDF reports. Green stays reserved for passed restore checks.

      Service Provider

  3. Planned

    Later

    Decided, further away or not started, and not tied to a release. No version numbers and no dates.

    • Proof and operations

    • Recovery readiness dashboard with trend

      The share of backups proven restorable, split by state (passed, due, not finished and retried, failed, backup too old, never checked), with a twelve-week trend.

      Every edition

    • Repository alerts

      A warning at 80 percent and a critical alert at 90 percent of a repository's capacity on local and NFS targets, and optionally above a size you set on any target, S3 included. New and existing installations get these rules preset. Since 0.4.0 provider admins already get a low disk space notice for the disk under the database and under the local default repository (below a tenth free, and always below 5 GiB). Since 0.4.5 the notice also covers the server's system disk, and the Repositories page, the "Backups land in" line of the job editors and the dashboard's storage tile warn when a directory repository lies on it.

      Every edition

    • Capacity planning

      Utilisation and growth per tenant and per repository, with a plain forecast such as "full in about N days". Beyond what the dashboard shows since 0.4.0: the storage growth of the tenant you look at and, where the free space is known, when its repository runs full at that growth. Since 0.4.5 provider admins also see on the dashboard's storage tile, for a repository on the system disk, the free space, its trend over the last week and the day that disk would be full.

      Every edition

    • PDF reports

      Recovery readiness, a period (backups, restores, checks), the audit log and the tenants as PDF, each one recorded in the audit log with the file's hash. The audit report comes with Business and Service Provider, the tenant reports with Service Provider.

      Every edition

    • Signed restore proof

      A restore report with a checksum and signature that anyone can verify without Restow.

      BusinessService Provider

    • Full test restore into a separate target

      A full test restore into a separate target, beyond the weekly sampled read-back. For Proxmox VE guests, boot tests of restore points have shipped (0.4.0); for mail, OneDrive and files only the sampled read-back exists.

      Every edition

    • Four-eyes approval

      A second person approves restores and deletions before they run.

      BusinessService Provider

    • Role-scoped archive search with four-eyes release

      A provider administrator can search a customer's archive only after the tenant has released it (a four-eyes release), building on four-eyes approval. Planned.

      Every edition

    • Retention policy per tenant

      Today every tenant has the same fixed policy: 8 years, ending on 31 December of the year of receipt. Planned: a policy per tenant, selectable as 6, 8 or 10 years or unlimited, optionally per group of mailboxes, with the clock starting at the capture date or at the end of the calendar year.

      Every edition

    • Archive search in attachments and by size

      The archive search covers the subject, the addresses and the body text. Planned: search in attachments (PDF, DOCX, XLSX, TXT) and by mailbox and size.

      Every edition

    • Deletion log as an entry of the archive chain

      Every deletion after the retention period is written to the audit log today. Planned: a deletion log as an entry of its own in the hash chain, with the number of objects, the period and the hashes of the deleted objects.

      Every edition

    • Archive check in the background, with progress

      The archive check (chain, anchors and a sample of contents) runs in a single request today. Planned: a run in the background that shows its progress.

      Every edition

    • Legal hold per search result

      A legal hold covers a whole tenant or one mailbox today, with a required reason. Planned: a hold on a search result.

      Every edition

    • Signed release.json

      Every release also publishes a machine-readable release.json with the image digests, signed with cosign like the images, so update tooling can check a release before it installs it.

      Every edition

    • Self-healing, first stage

      Restow detects problems and takes safe actions on its own: it retries, releases stale locks, re-checks, re-supplies missing data with a new backup and notifies you with the exact fix. It never deletes data or shortens retention, and every action is visible in the audit log. Three narrow cases exist: since 0.4.2, a container whose repository went missing begins a new backup chain by itself (audited, shown on the guest page; a file share is not covered yet), and the storage check reads a pack it could not read again before it rates anything damaged; since 0.4.3, Restow removes stale restic locks before a Proxmox VE restore check and before retention, and tries a check that a lock keeps out again instead of failing it. The general mechanism, with detection, safe actions and fix hints across the product, is not built.

      Every edition

    • Block level

    • Filesystem snapshots in the agent

      LVM, ZFS and btrfs snapshots on Linux and APFS snapshots on macOS, so files that change during a backup stay consistent. Today consistency comes from optional pre and post hooks, which root on the machine has to allow.

      Every edition

    • Linux image backup at block level with bare-metal restore

      A whole Linux machine is backed up as an image at block level and can be restored onto bare metal. Today the agent backs up files only.

      Every edition

    • Windows agent with VSS and image backup

      The agent for Linux and macOS ships. A Windows service with shadow-copy (VSS) support is planned, for files and for images. Since 0.4.0 an SMB file share backs up a Windows file server from the server, without an agent and without VSS.

      Every edition

    • Remote nodes as data movers

      A second machine, for example at another site, does the backup work next to the data and writes to the repository. Nodes are added with a wizard, sign every request with their own key and receive the key material of one task at a time.

      Every edition

    • Automatic scaling

      Opt-in: workers are added and removed by thresholds, with a cool-down and a maximum.

      Every edition

    • Integrations and formats

    • Google Workspace backup

      Gmail and Google Drive as sources under Mail & SaaS, alongside Microsoft 365 and IMAP, connected per tenant like Microsoft 365.

      Every edition

    • OAuth2 for IMAP sources

      Not implemented yet. Sign-in with OAuth2 instead of a password for IMAP mailboxes hosted on Microsoft 365 or Google.

      Every edition

    • Agent mTLS

      A client certificate per agent instead of a per-agent secret.

      Every edition

    • PST and OST import

      PST and OST files are recognised today and refused with an explanation. Reading them is planned; until then, export to MSG, EML or MBOX first.

      Every edition

    • PST export

      Export as EML in a ZIP and as MBOX ships. PST export is planned. The EML export holds the same messages in their original form.

      Every edition

    • MSG export

      Planned as soon as a writer with a clear, permissive license exists. The EML export holds the same messages in their original form.

      Every edition

    • SFTP repository

      SFTP as a repository.

      Every edition

  4. Deliberate decisions

    Not in scope for now

    • Teams

      Teams chats are not backed up and are out of scope for now. The SharePoint sites behind Teams are covered by the SharePoint Online backup since 0.4.0, and since 0.4.5 the calendar and the conversations of the Microsoft 365 group behind a team are backed up as a group mailbox (opt-in).

      Every edition

    • Also not planned

      Exchange Public Folders, eDiscovery case management and a mobile app. Restow is not an RMM or PSA tool; its API lets yours integrate.

      Every edition

Earlier releases 0.1.0 to 0.3.6

Everything that shipped before the current release line, newest first.

  1. Shipped

    0.3.1 to 0.3.6

    Proxmox VE preview, members, notifications

    0.3.0 was tagged but never published: its release checks found the first two fixes, so 0.3.1 is the first release of the 0.3 line. Updating from 0.2.x runs six database migrations; read the upgrade notes of 0.3.1.

    • Proxmox VE (preview)

      Backup of VMs and containers on Proxmox VE 8.4 and newer through the Backup Provider API: VM disks over NBD with dirty bitmaps, so only changed 4 MiB blocks are uploaded; containers through restic; restore as a new VMID into the pool restow-restore. Guests count in readiness, warnings and overdue alerts. The node side is a storage plugin shim (a separate work under AGPL-3.0-or-later) and the helper restow-pve (Apache-2.0). A preview: tested against qemu-nbd, qemu-img and restic; not yet recommended as the only backup.

      0.3.1 Every edition

    • Several administrators in every edition

      Members with roles, Community included; limiting a member to chosen tenants stays part of Service Provider. Owners can reset a member's access. Before a change of the public URL or the operating mode makes passkeys unusable, the settings name the affected accounts and refuse a self-lockout. The login page offers "Lost access?": a reset link by mail when notification mail is set up, and always the way back through an owner or restow admin recover. Your account: change your password, see and sign out your sessions.

      0.3.1 Every edition

    • NFS network shares from the web interface

      Under Installation, Network shares, through the opt-in mounter container (docker compose --profile mounts up -d mounter, or the installer option --with-mounter): the mounter checks a share before it writes docker-compose.override.yml, restarts api and worker and rolls back on failure, and the updater moves it along with every signed update. Tested against fakes only, not against a real NFS server.

      0.3.1 Every edition

    • Alerts in Discord, Slack and Microsoft Teams

      A webhook gets a format, chosen from its URL: Discord, Slack or Microsoft Teams, beside the signed Restow envelope. 4xx answers from chat services end a delivery at once instead of retrying. Tested against fakes only.

      0.3.1 Every edition

    • Overdue backups and warnings

      A new event, backup.overdue, for mailboxes, OneDrives, IMAP accounts, machines and Proxmox guests, aware of the job schedules; an alert rule can set its own deadline (24 to 720 hours). Warnings list why single items were not backed up (folder, subject, date, cause, what to do) and can be acknowledged with a note. The bell leads to the cause, and a Notifications page keeps the history.

      0.3.1 Every edition

    • Notification mail through Microsoft 365 or Google Workspace

      Notification mail can be sent through Microsoft 365 (an app of your own with Mail.Send, or the backup app) or through Google Workspace (a service account with gmail.send), with guides and plain error messages. Tested against fakes only.

      0.3.1 Every edition

    • Audit log export

      Export of the audit log as CSV and as JSON with hashes. The delivery logs export as CSV.

      0.3.1 BusinessService Provider

    • Archive per mail job, reading and search

      Archive per mail job; journal reports are assigned to the mailboxes they name. The chain check verifies every link, the daily anchors (now written every night) and optionally a sample of message contents. Archived messages can be read and downloaded as .eml; search pages through its results and filters by sender, date and mailbox; a notice says how the storage protects archived mail.

      0.3.1 Every edition

    • Legal holds with an audited release

      A legal hold is released with a required, audited reason; holds can cover a single mailbox.

      0.3.1 BusinessService Provider

    • What is protected, said plainly

      Machines in no backup job no longer count as protected anywhere (overview, provider view, readiness, reports). The directory, the backup jobs and the machines say which job backs up an object and name objects in paused or unscheduled jobs. Overview, Statistics shows the active tenant only; the statistics of every tenant have a page of their own for Service Provider.

      0.3.1 Every edition

    • Connect a Proxmox VE node with one command

      One command per node, with the enrollment token in it. The node installer sets up the user restow@pve, the roles and the restore pool itself, creates its own API token, checks its privileges before it installs anything and picks the thin storage for fleecing by itself. An existing Proxmox VE API token can be used instead and is handed to the node once. The storage plugin reports the storage API of the running Proxmox VE (8.4 up to 9.1). Tested against stand-ins for pveum and pvesm; Proxmox VE is a preview and not yet recommended as the only backup.

      0.3.2 Every edition

    • Microsoft 365 mailbox backups no longer stop in the folders step

      A mailbox backup could fail in the folders step with "Microsoft refused the request" (HTTP 400, an id that has to be unique in a batch) when Microsoft listed a folder twice while the folder list was read. Every batch now uses ids of its own, and each folder is read once.

      0.3.2 Every edition

    • Repositories: an NFS address in the path field

      The path field of a directory repository accepts an NFS address (192.168.1.10:/export/backup, nas.local:/volume1/restow or nfs://). The provider owner can test and mount it right there, and Restow fills in the path; when jobs are running, the mount waits until none runs and can be cancelled. A menu entry Repositories sits under your organisation, and the interface says repository everywhere instead of storage location. Tested against the mounter's stand-ins, not yet against a real NFS server; while a mount waits, new jobs still start.

      0.3.3 Every edition

    • Proxmox VE nodes in the inventory

      Under Servers & clients, Inventory, every Proxmox VE node is a row you can expand, with its online state and counts (protected, failed, no job, not backed up yet); expanded, each VM and container shows its status, backup job and backup state, and why its last backup failed, linked to its page. For administrators, once a cluster is connected.

      0.3.3 Every edition

    • Proxmox VE: containers that are not privileged

      Backups of unprivileged containers on ext4 no longer fail on the lost+found folder. A container backup that restic could not read completely (exit code 3) keeps its restore point and names the unreadable items. VMs & containers show when a backup waits for its node or runs. After the server update, run restow-pve update on every node.

      0.3.4 Every edition

    • Restore operator role

      A new role per tenant: the restore operator sees and restores every backup of the tenant without administering it (jobs, storage, users). Creating a user or an invitation now always needs a role to be chosen; no role is preselected any more.

      0.3.5 Every edition

    • Proxmox VE: what a backup contains and what it added

      VMs & containers and the inventory get a Backup column with what the newest restore point contains and what its run added ("9.4 GB in the backup, +2.5 MB new"), with the first backup on hover. The former Size column is now called Disk. On a guest's page, restore points show their type (first backup, incremental, full read), what they contain and what they added. Proxmox VE stays a preview.

      0.3.5 Every edition

    • Proxmox VE: incomplete container backups are named

      A container backup that restic could not read completely shows as "Succeeded with gaps" ("Last backup incomplete" on the guest's page) with the number of unreadable items, and counts as "Incomplete" in the inventory.

      0.3.5 Every edition

    • Usual data folders in machine jobs and file restore

      For Linux machine jobs and file restore, a notice names the usual data folders (/opt, /srv, /var/lib, /home and others) that the job's paths leave out, with a button to add them.

      0.3.5 Every edition

    • Proxmox VE: Back up now and restore name the node's check-in

      "Back up now" and restore say that the node starts the task at its next check-in; a second click says a backup is already waiting. The pages refresh every 5 seconds while a guest waits for its node or backs up.

      0.3.5 Every edition

    • Long first backups continue after an interruption

      A backup that is interrupted by its time limit (23 hours) or by a worker restart, after it saved a checkpoint, continues without using up one of its retries, for up to 21 days after it first started. The run view shows such an interruption as information, not as an error. Before, the first backup of a large mailbox that needed several days ended as failed after five interruptions, and the next run started over.

      0.3.5 Every edition

    • Microsoft 365: a Graph request without an answer is retried

      A Graph request that gets no answer within 5 minutes is retried, instead of hanging until the job's time limit. Requests and throttling waits end with the job.

      0.3.5 Every edition

    • Backup index stored as item versions

      A backup no longer copies every item of a mailbox or OneDrive into the database. Restow keeps one row per version of an item, so an unchanged item costs nothing on later backups. On an installation with 14 million index rows (25 GB), the index needs about 0.5 to 1.5 GB afterwards. The worker converts existing backups one at a time after the upgrade; that conversion was tested on generated histories, not yet on a production database of 25 GB.

      0.3.5 Every edition

    • Sign-in on a database role of its own

      Sign-in (sessions, passwords, passkeys, two-factor secrets) runs on a third database role. The application role keeps to tenant data under row-level security and may only add jobs to the queue. A hardening; no known exploit.

      0.3.5 Every edition

    • Proxmox VE: protect guests from the inventory

      Under Servers & clients, Inventory, every VM and container has its backup job as a choice (an existing job, "No backup job" or "New job…") and "Back up now". Guests can be ticked one by one, all guests of a node, or all guests without a job in one click, and then added to a job ("Add to job…") or backed up together; "New job…" opens the job dialog and puts the selection into the new job. The inventory's protection column is now called "Protection". Proxmox VE stays a preview.

      0.3.6 Every edition

    • Restart required notice with Restart now

      When a service needs a restart, Installation, Updates shows a "Restart required" notice with the reason, a "Restart now" button and the command to copy, in the installation's directory; provider admins see a notice above every page. "Restart now" goes through the updater, restarts the API, the worker or the scheduler only, never runs while an update is announced or running, and asks for a confirmation first. The owner of the provider team gets the button, and it needs the updater of 0.3.6; an older updater shows the command instead. Nothing restarts without a click. Nothing records a restart request yet; the notice and the button are in place for updates that need them.

      0.3.6 Every edition

    • The installer updates an old docker-compose.yml

      Running install.sh again on an existing installation updates docker-compose.yml to the release named in .env, checked against the release's signed SHA256SUMS, and keeps the previous file as docker-compose.yml.bak-<timestamp>. .env stays as it is. Changes of your own belong in docker-compose.override.yml.

      0.3.6 Every edition

    • Backup index: the old table's space comes back without a restart

      After the 0.3.5 conversion of the backup index has finished, the API gives the old table's disk space back by itself, within about 15 minutes. The API restart that 0.3.5 asked for is no longer needed.

      0.3.6 Every edition

  2. Shipped

    0.2.2

    Microsoft 365 connections

    • A Graph app of your own for a source

      Besides the consent invitation of the shared backup app, a source can be connected through an app the customer created by hand in their own tenant: tenant ID, application ID and a client secret or certificate. The credential is sealed in the organisation's secret store and never shown again. Tested with unit tests and the CI suites only, not against a real Microsoft 365 tenant.

      Every edition

    • The tenant of the backup app connects without a consent link

      For the tenant the backup app lives in, the source page offers a direct connection (provider owners only): a working app token for that tenant is the proof, so the consent round trip, which Entra refuses for an app that is not installed there, is skipped. It needs the directory (tenant) ID of the app under Settings, Microsoft 365.

      Every edition

    • Hetzner Object Storage preset with a location choice

      The preset has a location selector (Falkenstein, Nuremberg, Helsinki) that sets endpoint and region together. Buckets with a dot in their name are reached by path, and the Object Lock detection accepts the answers of S3-compatible services such as Hetzner. Not tested against a real Hetzner bucket.

      Every edition

    • Alpha channel for test builds

      Under Installation, Updates, "Use the alpha channel" selects a source of unsigned test builds in one click. The tab warns while it is selected and while the updater does not verify signatures. Only for test installations, never for one with production data.

      Every edition

  3. Shipped

    0.2.1

    The rest of 0.2.0

    • A machine backs up once it is in a job

      Every machine without a backup job is marked "Without backup", counted in a banner and offered "Create a job" or "Add to job". A newly enrolled machine waits for a job instead of backing up on its own. Servers back up their application data (/opt, /usr/local, /var/lib) by default.

      Every edition

    • Context menus on table rows

      Right-click or the ⋯ button on a table row opens the actions of that row: a new job from the selection, edit a job, run it now, open its history, restore files from a machine.

      Every edition

    • Machine table with "assigned to"

      A table of all machines with host name, the person each machine is assigned to, last backup and recovery readiness. A machine can be assigned to a person from the directory.

      Every edition

    • File restore from the machine table, one timeline

      File restore starts from the machine table. Restore points of machines and mailboxes sit on the same timeline, with day separators, times and a jump to a date.

      Every edition

    • Public demo with simulated running jobs

      The public demo shows backups that run, with progress, throughput charts and the run detail panel, simulated on synthetic data.

      Every edition

    • Default storage in the web interface

      The installation owner sets the default storage (a local path or an S3-compatible bucket) under Installation > Default storage, checked by a probe before it is saved. Tenants on it stay separated by their own prefix and key.

      Every edition

    • Updater with one command, updating itself

      The opt-in updater starts with one command and, after a signed update, moves itself to the verified release. A Community installation switches to the full build from Installation > Edition, with a database dump, health check and rollback.

      Every edition

  4. Shipped

    0.2.0

    Structure and getting started

    • Installation, own organisation and tenant settings

      Every setting has one place and one scope: the installation (server, notification mail, updates, license) and one settings page per tenant (connections, protection, jobs, retention, repositories, archive, agents, notifications, integrations, members, modules), in place of the Setup tab bar of 0.1.0. For service providers, setup creates their own organisation as an internal tenant. Switching a module off pauses its work and never deletes data.

      Every edition

    • Tenant switcher with search in the menu

      Switch between tenants at the top of the menu and find one by name or customer number.

      Service Provider

    • Colour scheme Restow or Neutral beside light and dark

      Choose between the Restow colours and a neutral palette, in addition to light and dark mode.

      Every edition

    • Full-width tables with pinned columns

      Tables use the full width of the page, and pinned columns stay in view while you scroll sideways.

      Every edition

    • Guided installer with a reverse-proxy mode, encrypted to Restow by default

      An installer that guides you through the installation, with a mode for running behind a reverse proxy. The connection to Restow is encrypted by default.

      Every edition

    • Setup wizard starting with the language choice

      The setup wizard now begins with the choice of language.

      Every edition

    • Get started as a checklist in the menu

      A rocket entry at the bottom left of the menu opens the setup checklist: a working repository, a connected source, protected objects, active schedules, the first backup and the first passed restore check, plus notification mail, which can be marked as not needed. The entry disappears once setup is complete.

      Every edition

    • Recovery readiness linked to filtered tables

      Each state of recovery readiness (passed, due, not finished and retried, failed, backup too old, never checked) filters the table below it.

      Every edition

    • Overview across all tenants or one tenant

      The Overview shows every tenant at once or a single tenant, as you choose.

      Service Provider

    • Jobs as templates

      A job says what is backed up, when, into which repository, for how long and how often a restore check proves it, for many mailboxes, OneDrives, IMAP accounts or machines at once, with overrides per object or machine. There are jobs for mail and for servers and clients; for servers and clients you pick the folders to back up and exclude file types. On the update, today's schedules and machine settings become jobs; nothing is deleted.

      Every edition

    • Live updates without reload, run detail panel with throughput charts

      Running jobs and tables update on their own, without reloading the page. A run opens a detail panel with charts of its throughput.

      Every edition

    • Bandwidth limit with a time window

      Limit how much bandwidth a backup may use, within a time window that you set.

      Every edition

    • History including agent runs

      Every run, including the runs of agents on servers and clients, with filters by kind (backup, restore, restore check, export, import, maintenance) and by job. The retries of a restore check show as one line.

      Every edition

  5. 2 October 2026

    Public launch

    • Source code on GitHub

      The core (Apache License 2.0) and the 0.1.0 release are public on GitHub. Every later release is published there too.

      Every edition

    • Pre-sale licenses

      Business and Service Provider at the pre-sale price until general release; every feature below is delivered as it ships.

      BusinessService Provider

  6. 0.1.0 beta, first public release

    Shipped

    • Microsoft 365 backup

      Exchange Online mail, calendar and contacts, and OneDrive, incremental via Microsoft Graph delta queries.

      Every edition

    • IMAP backup

      Any IMAP mailbox, password-authenticated: one login for the whole source, a password per mailbox, or a master user. OAuth2 sign-in for IMAP is not implemented yet.

      Every edition

    • Non-destructive restore

      A single item, a folder, a file version or a whole mailbox or OneDrive, into the original account or another one. The restore explorer has a slim timeline of restore points at the bottom.

      Every edition

    • Weekly restore check

      A sample from every backup is read back and compared byte for byte, shown as recovery readiness.

      Every edition

    • Archive

      An append-only archive with a SHA-256 hash chain, chain verification, search and export (EML in a ZIP, MBOX), in every edition. Search covers subject, addresses and the body text of imported mail, not attachments. It is filled by mail import with archiving; journal receipt is part of the GoBD layer below.

      Every edition

    • GoBD layer for the archive

      Exchange Online journal receipt over SMTP (it needs a TLS certificate of your own), retention policies with an enforced deletion run, and legal hold per tenant or per mailbox. Designed for GoBD-compliant use. Immutability is enforced by the application on local and NFS repositories; on S3 with Object Lock the archive item records are locked, and since 0.4.0 an administrator can lock the packs with the message content too (see Immutable backups).

      BusinessService Provider

    • Multiple tenants

      Many client tenants in one installation, with a cross-tenant API key. Managing several tenants is part of Service Provider.

      Service Provider

    • Delegated tenant administrators and provider overview

      Each tenant has its own administrators who see and manage only that tenant. The provider view of the Overview lists every tenant with its status and the alerts that follow from it.

      Service Provider

    • REST API and operations log

      OpenAPI-documented REST API with per-tenant keys and scopes; job history and errors in every edition.

      Every edition

    • Team with roles

      Several administrators, each an owner, administrator, technician or read only, with every tenant or chosen ones. Owners invite and change members; every change is audited. Business and Service Provider had this from 0.1.0; every edition has it since 0.3.1 (see 0.3.1 to 0.3.6).

      Every edition

    • Audit log viewer

      Search, filters, entry details and hash-chain verification of the audit log. Recording of every read and restore runs in every edition; the export came with 0.3.1.

      BusinessService Provider

    • Scheduled reports

      A daily, weekly or monthly summary by e-mail: success rate, failed items, share proven restorable, failure causes, storage and restores.

      BusinessService Provider

    • Alerts

      Rules that send an e-mail, a bell entry or a signed webhook when a backup fails, a restore check does not pass or storage is damaged, with a delivery log.

      Every edition

    • Server and client backup

      A Go agent for Linux and macOS on restic 0.19.1, set up with one command and a one-time token, installed in a folder only root can change. Signed agent releases, outbound HTTPS only, append-only, one repository per machine, restores into a new folder, restore tests that feed recovery readiness. Hooks run only where root on the machine allows them. Windows is planned.

      Every edition

    • Mail file import and export

      Import EML, MSG, MBOX and MailStore exports as a legacy mailbox you can browse, restore into Microsoft 365 or IMAP, download and optionally archive. Export mailboxes from backups, imports and the archive as EML in a ZIP or as MBOX.

      Every edition

    • Updates

      An update check that is off until you turn it on, with your own release source if you like, and an optional updater that announces maintenance, backs up the database first and rolls back if the new version does not become healthy. The rollback applies only while the database migrations have not run; after a migration the updater stops, keeps the dump and tells you how to restore it.

      Every edition

    • Failure explanations

      Every failed job, item, sync and verification says what happened, why (88 stable cause codes) and what to do, with links and technical details for support.

      Every edition

    • Signed, verified releases

      Every release comes as two builds in four images: the full build (restow, restow-web) and the Community build (restow-community, restow-web-community). Each image is built for amd64 and arm64, signed with cosign, ships an SBOM and passes a release smoke run (fresh install, restores with hash comparison, endpoint backup, mail import, file share backup against Samba) before it is published. Every agent release is signed by the maintainer with an Ed25519 key; the installer and the agent refuse a release without a valid signature. The automated Microsoft 365 check of the release pipeline against a real tenant (check 4, a dev tenant) is not active yet and was skipped in every release so far; a simulated Graph API stands in. In the release checks, the agent installer runs in a Linux container only.

      Every edition

    • Setup token, operator notice, two builds

      The setup wizard first asks for a one-time setup token that only someone with access to the server can read in its log, then for the acceptance of an operator notice. The core (Apache License 2.0) and the Business and Service Provider modules (ee/, under the Restow license terms) live in one repository. The full images carry both, the modules locked until a license key is installed; the Community images carry the core only.

      Every edition

For what ships today in detail, see features; for prices and what each edition unlocks, see pricing; for the archive, see GoBD and email archiving.

Questions about the roadmap? Ask us →