Operating system and container binary deployment and upgrades
C Shell Makefile Yacc M4 JavaScript Other
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
apidoc ostree repo commit: Speed up composing trees with `--tree=ref` Jul 9, 2018
bash ostree/pull: Add network-retries command line option Jul 5, 2018
bsdiff @ 1edf9f6 bsdiff: change submodule location Mar 26, 2015
build-aux Add infrastructure for "make syntax-check" Jan 30, 2015
buildutil Add SPDX-License-Identifier to source files Jan 30, 2018
ci ci: Bump rpm-ostree tag we build for tests Aug 19, 2018
coccinelle tree-wide: Add+run spatch to use glnx_throw() May 26, 2017
docs docs: var/local -> var/usrlocal May 15, 2018
libglnx @ 470af87 Update libglnx Jul 17, 2018
man man/ostree.repo-config: improve min-free-space-* docs Aug 19, 2018
manual-tests Add SPDX-License-Identifier to source files Jan 30, 2018
rust rust/bupsplit: minor idiomatic fixes Mar 17, 2018
src repo: remove outdated note from write_config() docs Aug 19, 2018
tests repo: Add OSTREE_REPO_TEST_ERROR=invalid-cache env var Aug 14, 2018
.dir-locals.el .dir-locals.el: Standard Emacs indentation config Jan 12, 2017
.editorconfig Add a .vimrc and .editorconfig Sep 21, 2017
.gitmodules .gitmodules: Update URL for libglnx May 30, 2018
.papr-ex.yaml ci: Mark insttests as not required Jul 20, 2018
.papr.yml ci: Mark insttests as not required Jul 20, 2018
.travis.yml ci: Move travis scripts from tests/ → ci/ May 9, 2017
.vimrc Add a .vimrc and .editorconfig Sep 21, 2017
CONTRIBUTING.md Rewrite manual in mkdocs Jan 28, 2016
COPYING COPYING: Update to latest FSF with current address Jan 16, 2014
GNUmakefile Add infrastructure for "make syntax-check" Jan 30, 2015
Makefile-bash.am Add SPDX-License-Identifier to source files Jan 30, 2018
Makefile-boot.am Add concept of "staged" deployment Apr 12, 2018
Makefile-decls.am Add SPDX-License-Identifier to source files Jan 30, 2018
Makefile-libostree-defines.am Make P2P API public (no longer experimental) Jun 4, 2018
Makefile-libostree.am build: add ostree-soup-* to build process when configured with avahi Jul 3, 2018
Makefile-man.am Make P2P API public (no longer experimental) Jun 4, 2018
Makefile-ostree.am Make P2P API public (no longer experimental) Jun 4, 2018
Makefile-otutil.am Add SPDX-License-Identifier to source files Jan 30, 2018
Makefile-switchroot.am build: Use ostree_prepare_root_CPPFLAGS for ostree-prepare-root Jul 4, 2018
Makefile-tests.am Avoid race condition in case tests directory does not exist Aug 14, 2018
Makefile.am Add SPDX-License-Identifier to source files Jan 30, 2018
README-historical.md README: Just link to wiki, move most of it to README-historical.md Jan 20, 2014
README.md docs: Add "Hello World" example May 8, 2018
TODO Fix repeated words. Jan 30, 2015
autogen.sh Make sure *.am.inc are up to date before `make dist` Oct 16, 2017
cfg.mk tests: Add a test case for path traversal in a dirtree Jan 12, 2018
configure.ac Post-release version bump Jul 20, 2018
git.mk Use git.mk Apr 7, 2016
maint.mk build/maint.mk: Comment out setting of LC_ALL Aug 23, 2017
mkdocs.yml docs: Add a section on repository management Mar 29, 2016
ostree.doap doap category infrastructure Jul 31, 2014



New! See the docs online at Read The Docs (OSTree)

This project is now known as "libostree", though it is still appropriate to use the previous name: "OSTree" (or "ostree"). The focus is on projects which use libostree's shared library, rather than users directly invoking the command line tools (except for build systems). However, in most of the rest of the documentation, we will use the term "OSTree", since it's slightly shorter, and changing all documentation at once is impractical. We expect to transition to the new name over time.

As implied above, libostree is both a shared library and suite of command line tools that combines a "git-like" model for committing and downloading bootable filesystem trees, along with a layer for deploying them and managing the bootloader configuration.

The core OSTree model is like git in that it checksums individual files and has a content-addressed-object store. It's unlike git in that it "checks out" the files via hardlinks, and they thus need to be immutable to prevent corruption. Therefore, another way to think of OSTree is that it's just a more polished version of Linux VServer hardlinks.


  • Transactional upgrades and rollback for the system
  • Replicating content incrementally over HTTP via GPG signatures and "pinned TLS" support
  • Support for parallel installing more than just 2 bootable roots
  • Binary history on the server side (and client)
  • Introspectable shared library API for build and deployment systems
  • Flexible support for multiple branches and repositories, supporting projects like flatpak which use libostree for applications, rather than hosts.

Projects using OSTree

meta-updater is a layer available for OpenEmbedded systems.

QtOTA is Qt's over-the-air update framework which uses libostree.

rpm-ostree is a next-generation hybrid package/image system for Fedora and CentOS, used by the Atomic Host project. By default it uses libostree to atomically replicate a base OS (all dependency resolution is done on the server), but it supports "package layering", where additional RPMs can be layered on top of the base. This brings a "best of both worlds"" model for image and package systems.

flatpak uses libostree for desktop application containers. Unlike most of the other systems here, flatpak does not use the "libostree host system" aspects (e.g. bootloader management), just the "git-like hardlink dedup". For example, flatpak supports a per-user OSTree repository.

Endless OS uses libostree for their host system as well as flatpak. See their eos-updater and deb-ostree-builder projects.

GNOME Continuous is where OSTree was born - as a high performance continuous delivery/testing system for GNOME.

The BuildStream build and integration tool uses libostree as a caching system to store and share built artifacts.


Releases are available as GPG signed git tags, and most recent versions support extended validation using git-evtag.

However, in order to build from a git clone, you must update the submodules. If you're packaging OSTree and want a tarball, I recommend using a "recursive git archive" script. There are several available online; this code in OSTree is an example.

Once you have a git clone or recursive archive, building is the same as almost every autotools project:

git submodule update --init
env NOCONFIGURE=1 ./autogen.sh
./configure --prefix=...
make install DESTDIR=/path/to/dest

More documentation

New! See the docs online at Read The Docs (OSTree)


See Contributing.


The licensing for the code of libostree can be canonically found in the individual files; and the overall status in the COPYING file in the source. Currently, that's LGPLv2+. This also covers the man pages and API docs.

The license for the manual documentation in the doc/ directory is: SPDX-License-Identifier: (CC-BY-SA-3.0 OR GFDL-1.3-or-later) This is intended to allow use by Wikipedia and other projects.

In general, files should have a SPDX-License-Identifier and that is canonical.