Warning: This document is for an old version of zrepl. The main version is master.


The changelog summarizes bugfixes that are deemed relevant for users and package maintainers. Developers should consult the git commit log or GitHub issue tracker.

We use the following annotations for classifying changes:

  • [CONFIG] Change that breaks the config. As a package maintainer, make sure to warn your users about config breakage somehow.
  • [BREAK] Change that breaks interoperability or persistent state representation with previous releases. As a package maintainer, make sure to warn your users about config breakage somehow. Note that even updating the package on both sides might not be sufficient, e.g. if persistent state needs to be migrated to a new format.
  • [FEATURE] Change that introduces new functionality.
  • [BUG] Change that fixes a bug, no regressions or incompatibilities expected.
  • [DOCS] Change to the documentation.


This release is a milestone for zrepl and required significant refactoring if not rewrites of substantial parts of the application. It breaks both configuration and transport format, and thus requires manual intervention and updates on both sides of a replication setup.


The changes in the pruning system for this release require you to explicitly define keep rules: for any snapshot that you want to keep, at least one rule must match. This is different from previous releases where pruning only affected snapshots with the configured snapshotting prefix. Make sure that snapshots to be kept or ignored by zrepl are covered, e.g. by using the regex keep rule. Learn more in the config docs…

Notes to Package Maintainers

  • If the daemon crashes, the stack trace produced by the Go runtime and possibly diagnostic output of zrepl will be written to stderr. This behavior is independent from the stdout outlet type. Please make sure the stderr output of the daemon is captured somewhere. To conserve precious stack traces, make sure that multiple service restarts do not directly discard previous stderr output.
  • Make it obvious for users how to set the GOTRACEBACK environment variable to GOTRACEBACK=crash. This functionality will cause SIGABRT on panics and can be used to capture a coredump of the panicking process. To that extend, make sure that your package build system, your OS’s coredump collection and the Go delve debugger work together. Use your build system to package the Go program in this tutorial on Go coredumps and the delve debugger , and make sure the symbol resolution etc. work on coredumps captured from the binary produced by your build system. (Special focus on symbol stripping, etc.)
  • Use of ssh+stdinserver transport is no longer encouraged. Please encourage users to use the new tcp or tls transports. You might as well mention some of the tunneling options listed here.


  • [FEATURE] issue #55 : Push replication (see push job and sink job)
  • [FEATURE] TCP Transport
  • [FEATURE] TCP + TLS client authentication transport
  • [FEATURE] issue #78 commit 074f989 : Replication protocol rewrite
    • Uses github.com/problame/go-streamrpc for RPC layer
    • [BREAK] Protocol breakage, update and restart of all zrepl daemons is required
    • [FEATURE] issue #83: Improved error handling of network-level errors (zrepl retries instead of failing the entire job)
    • [BUG] issue #75 issue #81: use connection timeouts and protocol-level heartbeats
    • [BREAK] [CONFIG]: mappings are no longer supported
      • Receiving sides (pull and sink job) specify a single root_fs. Received filesystems are then stored per client in ${root_fs}/${client_identity}.
  • [FEATURE] [BREAK] [CONFIG] Manual snapshotting + triggering of replication
    • [FEATURE] issue #69: include manually created snapshots in replication
    • [CONFIG] manual and periodic snapshotting types
    • [FEATURE] zrepl signal wakeup JOB subcommand to trigger replication + pruning
    • [FEATURE] zrepl signal reset JOB subcommand to abort current replication + pruning
  • [FEATURE] [BREAK] [CONFIG] New pruning system
    • The active side of a replication (pull or push) decides what to prune for both sender and receiver. The RPC protocol is used to execute the destroy operations on the remote side.
    • New pruning policies (see configuration documentation )
      • The decision what snapshots shall be pruned is now made based on keep rules
      • [FEATURE] issue #68: keep rule not_replicated prevents divergence of sender and receiver
    • [FEATURE] [BREAK] Bookmark pruning is no longer necessary
      • Per filesystem, zrepl creates a single bookmark (#zrepl_replication_cursor) and moves it forward with the most recent successfully replicated snapshot on the receiving side.
      • Old bookmarks created by prior versions of zrepl (named like their corresponding snapshot) must be deleted manually.
      • [CONFIG] keep_bookmarks parameter of the grid keep rule has been removed
  • [FEATURE] zrepl status for live-updating replication progress (it’s really cool!)
  • [FEATURE] issue #67: Expose Prometheus metrics via HTTP (config docs)
  • [CONFIG] Logging outlet types must be specified using the type instead of outlet key
  • [BREAK] issue #53: CLI: zrepl control * subcommands have been made direct subcommands of zrepl *
  • [BUG] Goroutine leak on ssh transport connection timeouts
  • [BUG] issue #81 issue #77 : handle failed accepts correctly (source job)

Previous Releases


Due to limitations in our documentation system, we only show the changelog since the last release and the time this documentation is built. For the changelog of previous releases, use the version selection in the hosted version of these docs at zrepl.github.io.