🐂 Oxen
Create a world where everyone can contribute to an Artificial General Intelligence, starting with the data.
🌾 What is Oxen?
Oxen at its core is a data version control library, written in Rust. Its goals are to be fast, reliable, and easy to use. It's designed to be used in a variety of ways, from a simple command line tool, to a remote server to sync to, to integrations into other ecosystems such as python.
📚 Documentation
The documentation for the Oxen.ai tool chain can be found here.
✅ TODO
- Configurable storage backends
- Local filesystem
- S3
- GCS
- Azure
- Backblaze
- Block level deduplication
🔨 Build & Run
Install Prerequisites
See the prerequisites section of the main readme to install the needed prerequisites.
Build
Build the entire workspace (CLI, server, and library):
Or build a specific crate:
If on intel mac, you may need to build with the following
If on Windows, you may need to add the following directories to the 'INCLUDE' environment variable
"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include"
"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.27023\include"
"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\Llvm\lib\clang\12.0.0\include"
These are example paths and will vary between machines. If you install 'C++ Clang tools for Windows' through Microsoft Visual Studio Build Tools, the directories can be located from the Visual Studio installation under 'BuildTools\VC\Tools'
Speed up the build process
Linux
Note: Rust 1.90+ on x86_64-unknown-linux-gnu already uses an optimized linker by default. For other variants of Linux, the instructions below may speed things up.
On Linux, you can use the mold linker to speed up builds.
Then create .cargo/config.toml in your Oxen repo root with the following
content:
[]
= ["-C", "link-arg=-fuse-ld=/usr/local/bin/ld64.mold"]
macOS with Apple Silicon
For macOS with Apple Silicon, you can use the lld linker.
Then create .cargo/config.toml in your Oxen repo root with the following:
[]
= [ "-C", "link-arg=-fuse-ld=/opt/homebrew/opt/llvm/bin/ld64.lld", ]
Run
CLI
To run Oxen from the command line, add the oxen-rust/target/debug directory to the 'PATH' environment variable
On Windows, you can use
$env:PATH += ";/path/to/Oxen/oxen-rust/target/debug"
Initialize a new repository or clone an existing one
This will create the .oxen dir in your current directory and allow you to run Oxen CLI commands
Oxen Server
To run a local Oxen Server, generate a config file and token to authenticate the user
Copy the config to the default locations
Set where you want the data to be synced to. The default sync directory is ./data/ to change it set the SYNC_DIR environment variable to a path.
You can also create a .env.local file in the /crates/server directory which can contain the SYNC_DIR variable to avoid setting it every time you run the server.
Run the server
Or run the compiled binary directly:
To run the server with live reload, use bacon:
Then run the server like this
Nix Flake
If you have Nix installed you can use the flake to build and run the server. This will automatically install and configure the required build toolchain dependencies for Linux & macOS.
To develop with the standard rust toolchain in a Nix dev shell:
The flake also provides derivations to build OCI (Docker) images with the minimal
set of dependencies required to build and run oxen & oxen-server.
This will export the OCI image and can be loaded with:
Unit & Integration Tests
Manual Test Setup
Here are the steps to manually configure and run tests (see also the Automatic Test Setup section). Make sure your user is configured and server is running on the default port and host, by following these setup steps:
# Configure a user
# Start the oxen-server
Note: tests open up a lot of file handles, so limit num test threads if running everything.
You can also increase the number of open files your system allows ulimit before running tests:
Then you can run the tests with the cargo test or cargo nextest (preferred) directly. To run all tests with the default number of threads:
Automatic Test Setup
You can use the following script to run tests. It will set up config files, build and run an oxen-server, run the tests against it, and shutdown the server. Any arguments passed to the script will be passed to cargo nextest run, so you can use it to run specific tests or set test threads.
It can be faster (in terms of compilation and runtime) to run a specific test. To run a specific library test:
To run with all debug output and run a specific test
To explicitly set the port for the oxen-server used in tests, set OXEN_PORT:
Oxen Server
Structure
Remote repositories have the same internal structure as local ones, with the caveat that all the data is in the .oxen dir and not duplicated into a "local workspace".
APIs
Server defaults to localhost 3000
You can grab your auth token from the config file above (~/.oxen/user_config.toml)
List Repositories
Create Repository
Docker
Create the docker image
Run a container on port 3000 with a local filesystem mounted from /var/oxen/data on the host to /var/oxen/data in the container.
Or use docker compose
Run Benchmark
we use criterion to handle benchmarks.
To save baseline you can run
Which would then store the benchmark under target/criterion/add
Enable ffmpeg
To enable thumbnailing for videos, you will have to build with ffmpeg enabled
Or for a specific crate: