diff --git a/README.md b/README.md index 12f7c5bc..6e15f3f8 100644 --- a/README.md +++ b/README.md @@ -1,149 +1,307 @@ # Repertory -Repertory allows you to mount S3 and Sia via FUSE on Linux/macOS or via WinFSP -on Windows. +Repertory allows you to mount **S3** and **Sia** storage as local drives using: +- **FUSE** (Linux/macOS) +- **WinFSP** (Windows) -## Contents +It supports: +- Local mounts +- Remote encrypted mounts between systems +- Optional file name and data encryption using `XChaCha20-Poly1305` -1. [Details and Features](#details-and-features) -2. [Minimum Requirements](#minimum-requirements) - 1. [Supported Operating Systems](#supported-operating-systems) -3. [GUI](#gui) -4. [Usage](#usage) - 1. [Important Options](#important-options) - 2. [Sia](#sia) - * [Sia Initial Configuration](#sia-initial-configuration) - * [Sia Mounting](#sia-mounting) - * [Sia Configuration File](#sia-configuration-file) - 3. [S3](#s3) - * [S3 Initial Configuration](#s3-initial-configuration) - * [S3 Mounting](#s3-mounting) - * [S3 Configuration File](#s3-configuration-file) -5. [Data Directories](#data-directories) - 1. [Linux Directories](#linux-directories) - 2. [Windows Directories](#windows-directories) -6. [Remote Mounting](#remote-mounting) - 1. [Server Setup](#server-setup) - * [Remote Mount Configuration File Section](#remote-mount-configuration-file-section) - 2. [Client Setup](#client-setup) - * [Client Remote Mounting](#client-remote-mounting) - * [Remote Mount Configuration File](#remote-mount-configuration-file) -7. [Compiling](#compiling) - 1. [Linux Compilation](#linux-compilation) - 2. [Windows Setup](#windows-compilation) -8. [Credits](#credits) -9. [Developer Public Key](#developer-public-key) -10. [Consult the Wiki for additional information](https://git.fifthgrid.com/BlockStorage/repertory/wiki) +--- -## Details and Features +## 📖 Contents -* Optimized for [Plex Media Server](https://www.plex.tv/) -* Remote mounting of `repertory` instances between Linux, macOS, and/or Windows - * Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet. -* Cross-platform support (Linux, macOS, and Windows) -* Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts +1. [Quick Start (Sia Example)](#-quick-start-sia-example) +2. [Details & Features](#-details-and-features) +3. [Minimum Requirements](#-minimum-requirements) + - [Supported Operating Systems](#supported-operating-systems) +4. [Data Directories](#-data-directories) +5. [GUI](#-gui) +6. [Usage](#-usage) + - [Important Options](#important-options) + - [Unmounting](#unmounting) +7. [Sia Setup](#-sia) + - [Sia Initial Configuration](#sia-initial-configuration) + - [Sia Mounting](#sia-mounting) + - [Sia Configuration File](#sia-configuration-file) +8. [S3 Setup](#-s3) + - [S3 Initial Configuration](#s3-initial-configuration) + - [S3 Mounting](#s3-mounting) + - [S3 Configuration File](#s3-configuration-file) +9. [Remote Mounting](#-remote-mounting) + - [Server Setup](#server-setup) + - [Client Setup](#client-setup) + - [Remote Mount Configuration File](#remote-mount-configuration-file) +10. [Compiling from Source](#-compiling) + - [Linux Compilation](#linux-compilation) + - [macOS Compilation](#macos-compilation) + - [Windows Compilation](#windows-compilation) +11. [Credits](#-credits) +12. [Developer Public Key](#-developer-public-key) +13. [Consult the Wiki for additional information](https://git.fifthgrid.com/BlockStorage/repertory/wiki) -## Minimum Requirements +--- -* [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support -* Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support -* macOS requires the following dependencies to be installed: - * [macFUSE 4.10-2](https://github.com/macfuse/macfuse/releases/download/macfuse-4.10.2/macfuse-4.10.2.dmg) -* Windows requires the following dependencies to be installed: - * [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi) +## 🚀 Quick Start (Sia Example) + +> 💡 Want to mount S3 instead? +> Skip ahead to [S3 Setup](#-s3) — the process is almost identical. + +This example mounts a Sia bucket from a running [renterd](https://github.com/SiaFoundation/renterd) instance. + +--- + +### 1. Install dependencies + +**Linux** +```bash +sudo apt install fuse3 # Debian/Ubuntu +# or +sudo dnf install fuse3 # Fedora +``` + +**macOS** +- Install [macFUSE 4.10.2](https://github.com/macfuse/macfuse/releases/download/macfuse-4.10.2/macfuse-4.10.2.dmg) + +**Windows** +- Install [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi) + +--- + +### 2. Configure + +Replace placeholders with your values: +```bash +repertory --name mybucket -set HostConfig.ApiPassword "" +repertory --name mybucket -set SiaConfig.Bucket "" +``` + +Optional: +```bash +# If renterd is not running locally +repertory --name mybucket -set HostConfig.HostNameOrIp "" + +# If renterd uses a non-default port (default 9980) +repertory --name mybucket -set HostConfig.ApiPort +``` + +--- + +### 3. Mount + +**Linux** +```bash +repertory --name mybucket /mnt/mybucket +``` + +**macOS** +```bash +repertory --name mybucket /Volumes/mybucket +``` + +**Windows** +```powershell +repertory --name mybucket t: +``` + +--- + +### 4. Unmount + +**Linux** +```bash +fusermount3 -u /mnt/mybucket +``` + +**macOS** +```bash +diskutil unmount /Volumes/mybucket +``` + +**Windows** +```powershell +net use t: /delete +``` + +--- + +## ✨ Details and Features + +- **Optimized for [Plex Media Server](https://www.plex.tv/).** +- Remote mounting of `repertory` instances between Linux, macOS, and/or Windows. + - Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet. +- Cross-platform support (Linux, macOS, and Windows). +- Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts. + +--- + +## 📋 Minimum Requirements + +- **Sia:** [renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support +- **Linux:** requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support +- **macOS:** requires: + - [macFUSE 4.10.2](https://github.com/macfuse/macfuse/releases/download/macfuse-4.10.2/macfuse-4.10.2.dmg) +- **Windows:** requires: + - [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi) ### Supported Operating Systems -Only 64-bit operating systems are supported +Only **64-bit operating systems** are supported: -* Linux `arm64/aarch64` -* Linux `x86-64` -* macOS `arm64/aarch64` -* macOS `x86-64` -* Windows `x86-64` 10, 11 +- Linux `arm64/aarch64` +- Linux `x86_64` +- macOS `arm64/aarch64` +- macOS `x86_64` +- Windows `x86_64` 10, 11 -## GUI +--- -As of `v2.0.6-release`, mounts can be managed using the `Repertory Management Portal`. -To launch the portal, execute the following command: +## 📂 Data Directories -* `repertory -ui` - * The default username is `repertory` - * The default password is `repertory` +**Linux** +``` +~/.local/repertory2/s3 +~/.local/repertory2/sia +``` -After first launch, `ui.json` will be created in the appropriate data directory. -See [Data Directories](#data-directories). -You should modify this file directly or use the portal to change the default -username and password. +**Windows** +``` +%LOCALAPPDATA%\repertory2\s3 +%LOCALAPPDATA%\repertory2\sia +``` +**IMPORTANT:** +It is highly recommended to **exclude** these folders from any anti-virus/anti-malware applications as severe performance issues may arise. Excluding the mounted drive letter is also highly recommended. -### Screenshot - +--- + +## 🖥 GUI + +As of `v2.0.6-release`, mounts can be managed using the **Repertory Management Portal**. + +Launch the portal: +```bash +repertory -ui +``` +- Default username: `repertory` +- Default password: `repertory` + +After first launch, `ui.json` will be created in the appropriate data directory (see [Data Directories](#-data-directories)). Modify this file directly or use the portal to change the default credentials. + +**Screenshot** repertory-portal -## Usage +--- + +## 🛠 Usage ### Important Options -* `--help` - * Display all mount utility options +- `--help` + Display all mount utility options. -* `-f` - * Keep process in foreground on Linux. +- `-f` + Keep process in foreground on Linux. -* `--name, -na [name]` - * Identifies a unique configuration name to support multiple mounts. - * The `--name` option can be set to any valid value allowed as a file name for your filesystem. - * The `--name` option is required +- `--name, -na [name]` + Identifies a unique configuration name to support multiple mounts. + The `--name` option can be set to any valid value allowed as a file name for your filesystem. + **The `--name` option is required.** -* `-dc` - * Display mount configuration - * For Sia, the `--name` option is required - * For S3, the `-s3` and `--name` options are required +- `-dc` + Display mount configuration. + For Sia, the `--name` option is required. + For S3, the `-s3` and `--name` options are required. -### Sia +### Unmounting -#### Sia Initial Configuration +**Linux** +```bash +fusermount3 -u /path/to/mountpoint +``` -* Required steps: - * Set the appropriate bucket name and `renterd` API password in `repertory` configuration: - * `repertory --name '' -set HostConfig.ApiPassword ''` - * `repertory --name '' -set SiaConfig.Bucket ''` +**macOS** +```bash +diskutil unmount /Volumes/yourmount +``` -* Optional steps: - * Set a user name used during `renterd` basic authentication: - * `repertory -set HostConfig.ApiUser ''` - * `repertory --name '' -set HostConfig.ApiUser ''` - * Set a custom agent string (default `Sia-Agent`): - * `repertory -set HostConfig.AgentString ''` - * `repertory --name '' -set HostConfig.AgentString ''` - * Set the host name or IP of the `renterd` instance (default `localhost`): - * `repertory -set HostConfig.HostNameOrIp ''` - * `repertory --name '' -set HostConfig.HostNameOrIp ''` - * Set the `renterd` API port (default `9980`): - * `repertory -set HostConfig.ApiPort 9981` - * `repertory --name '' -set HostConfig.ApiPort 9981` +**Windows** +```powershell +net use : /delete +``` -* To verify/view all configuration options: - * `repertory -dc` - * `repertory --name '' -dc` - * Example: - * `repertory --name my_bucket -dc` +--- -#### Sia Mounting +## 🔒 Security Best Practices -* Linux: - * `repertory /mnt/location` - * `repertory --name '' /mnt/location` - * Example: - * `repertory --name my_bucket /mnt/location` +When enabling **encryption tokens** for S3 or remote mounts: +- Use a **long, random string**. +- Store it **offline** (password manager and an offline backup). +- Losing it means **permanent data loss**. -* Windows: - * `repertory t:` - * `repertory --name '' t:` - * Example: - * `repertory --name my_bucket t:` +--- -#### Sia Configuration File +## 🗄 Sia + +### Sia Initial Configuration + +**Required steps:** +- Set the appropriate bucket name and `renterd` API password in `repertory` configuration: +```bash +repertory --name '' -set HostConfig.ApiPassword '' +repertory --name '' -set SiaConfig.Bucket '' +``` + +**Optional steps:** +- Set a user name used during `renterd` basic authentication: +```bash +repertory --name '' -set HostConfig.ApiUser '' +``` +- Set a custom agent string (default `Sia-Agent`): +```bash +repertory --name '' -set HostConfig.AgentString '' +``` +- Set the host name or IP of the `renterd` instance (default `localhost`): +```bash +repertory --name '' -set HostConfig.HostNameOrIp '' +``` +- Set the `renterd` API port (default `9980`): +```bash +repertory --name '' -set HostConfig.ApiPort 9981 +``` + +**Verify/view all configuration options:** +```bash +repertory --name '' -dc +# Example: +repertory --name my_bucket -dc +``` + +### Sia Mounting + +**Linux** +```bash +repertory --name '' /mnt/location +# Example: +repertory --name my_bucket /mnt/location +``` + +**macOS** +```bash +repertory --name '' /Volumes/mybucket +# Example: +repertory --name my_bucket /Volumes/mybucket +``` + +**Windows** +```powershell +repertory --name '' t: +# Example: +repertory --name my_bucket t: +``` + +### Sia Configuration File ```json { @@ -190,48 +348,77 @@ username and password. } ``` -### S3 +--- -#### S3 Initial Configuration +## 🗄 S3 -* Required steps: - * Set the appropriate base URL: - * `repertory -s3 --name '' -set S3Config.URL ''` - * Example: - * `repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'` - * Set the appropriate bucket name: - * `repertory -s3 --name '' -set S3Config.Bucket ''` - * Set the appropriate access key: - * `repertory -s3 --name '' -set S3Config.AccessKey ''` - * Set the appropriate secret key: - * `repertory -s3 --name '' -set S3Config.SecretKey ''` - * For Sia and most local S3 gateway instances, enable path style URL's: - * `repertory -s3 --name '' -set S3Config.UsePathStyle true` +### S3 Initial Configuration -* Optional steps: - * Set an appropriate region. Default is set to `any`: - * `repertory -s3 --name '' -set S3Config.Region ''` - * Enable encrypted file names and file data. Set a strong, random encryption token and be sure to store it in a secure backup location: - * `repertory -s3 --name '' -set S3Config.EncryptionToken ''` +**Required steps:** +- Set the appropriate base URL: +```bash +repertory -s3 --name '' -set S3Config.URL '' +# Example: +repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000' +``` +- Set the appropriate bucket name: +```bash +repertory -s3 --name '' -set S3Config.Bucket '' +``` +- Set the appropriate access key: +```bash +repertory -s3 --name '' -set S3Config.AccessKey '' +``` +- Set the appropriate secret key: +```bash +repertory -s3 --name '' -set S3Config.SecretKey '' +``` +- For Sia and most local S3 gateway instances, enable path style URLs: +```bash +repertory -s3 --name '' -set S3Config.UsePathStyle true +``` -* To verify/view all configuration options: - * `repertory -s3 --name '' -dc` - * Example: - * `repertory -s3 --name minio -dc` +**Optional steps:** +- Set an appropriate region. Default is `any`: +```bash +repertory -s3 --name '' -set S3Config.Region '' +``` +- Enable encrypted file names and file data. Set a strong, random encryption token and store it securely: +```bash +repertory -s3 --name '' -set S3Config.EncryptionToken '' +``` -#### S3 Mounting +**Verify/view all configuration options:** +```bash +repertory -s3 --name '' -dc +# Example: +repertory -s3 --name minio -dc +``` -* Linux: - * `repertory -s3 --name '' /mnt/location` - * Example: - * `repertory -s3 --name minio /mnt/location` +### S3 Mounting -* Windows: - * `repertory -s3 --name '' t:` - * Example: - * `repertory -s3 --name minio t:` +**Linux** +```bash +repertory -s3 --name '' /mnt/location +# Example: +repertory -s3 --name minio /mnt/location +``` -#### S3 Configuration File +**macOS** +```bash +repertory -s3 --name '' /Volumes/minio +# Example: +repertory -s3 --name minio /Volumes/minio +``` + +**Windows** +```powershell +repertory -s3 --name '' t: +# Example: +repertory -s3 --name minio t: +``` + +### S3 Configuration File ```json { @@ -276,100 +463,103 @@ username and password. } ``` -### Data Directories +--- -#### Linux Directories +## 🌐 Remote Mounting -* `~/.local/repertory2/s3` -* `~/.local/repertory2/sia` - -#### Windows Directories - -* `%LOCALAPPDATA%\repertory2\s3` -* `%LOCALAPPDATA%\repertory2\sia` - * Examples: - * `C:\Users\Tom\AppData\Local\repertory2\s3` - * `C:\Users\Tom\AppData\Local\repertory2\sia` -* IMPORTANT: - * It is highly recommended to exclude this folder from any anti-virus/anti-malware applications as severe performance issues may arise. - * Excluding the mounted drive letter is also highly recommended. - -## Remote Mounting - -`repertory` allows local mounts to be shared with other computers on your network -or over the internet. This option is referred to as remote mounting. +`repertory` allows local mounts to be shared with other computers on your network or over the internet. This option is referred to as **remote mounting**. ### Server Setup -The following steps must be performed on the mount you wish to share with -other systems. Changes to configuration will not take affect while a mount is -active, so it is recommended to unmount beforehand. +The following steps must be performed on the mount you wish to share with other systems. Changes to configuration will not take effect while a mount is active, so it is recommended to unmount beforehand. -* Required steps: - * Enable remote mount: - * Sia - * `repertory -set RemoteMount.Enable true` - * `repertory --name '' -set RemoteMount.Enable true` - * S3: - * `repertory -s3 --name '' -set RemoteMount.Enable true` - * Set a secure encryption token: - * Sia: - * `repertory -set RemoteMount.EncryptionToken ''` - * `repertory --name '' -set RemoteMount.EncryptionToken ''` - * S3: - * `repertory -s3 --name '' -set RemoteMount.EncryptionToken ''` +**Required steps:** +- Enable remote mount: + - **Sia** + ```bash + repertory -set RemoteMount.Enable true + repertory --name '' -set RemoteMount.Enable true + ``` + - **S3** + ```bash + repertory -s3 --name '' -set RemoteMount.Enable true + ``` +- Set a secure encryption token: + - **Sia** + ```bash + repertory -set RemoteMount.EncryptionToken '' + repertory --name '' -set RemoteMount.EncryptionToken '' + ``` + - **S3** + ```bash + repertory -s3 --name '' -set RemoteMount.EncryptionToken '' + ``` -* Optional steps: - * Change the port clients will use to connect to your mount: - * Sia: - * `repertory -set RemoteMount.ApiPort 20000` - * `repertory --name '' -set RemoteMount.ApiPort 20000` - * S3: - * `repertory -s3 --name '' -set RemoteMount.ApiPort 20000` +**Optional steps:** +- Change the port clients will use to connect to your mount: + - **Sia** + ```bash + repertory -set RemoteMount.ApiPort 20000 + repertory --name '' -set RemoteMount.ApiPort 20000 + ``` + - **S3** + ```bash + repertory -s3 --name '' -set RemoteMount.ApiPort 20000 + ``` -* IMPORTANT: - * Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.ApiPort`. +**IMPORTANT:** +Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.ApiPort`. #### Remote Mount Configuration File Section ```json { - ... "RemoteMount": { "ApiPort": 20000, "ClientPoolSize": 20, "Enable": true, "EncryptionToken": "" - }, - ... + } } ``` ### Client Setup -Client configuration is provider agnostic, so there's no need to specify `-s3` -for S3 providers. +Client configuration is provider agnostic, so there's no need to specify `-s3` for S3 providers. -* Required steps: - * Set the encryption token to the same value configured during server setup: - * `repertory -rm : -set RemoteConfig.EncryptionToken ''` - * Replace `` with the host name or IP of the server - * Replace `` with the value of `RemoteMount.ApiPort` used in the server configuration - * Example: - * `repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken ''` - * `repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken ''` +**Required steps:** +- Set the encryption token to the same value configured during server setup: +```bash +repertory -rm : -set RemoteConfig.EncryptionToken '' +# Replace with the host name or IP of the server +# Replace with the value of RemoteMount.ApiPort used in the server configuration +# Example: +repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '' +repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '' +``` #### Client Remote Mounting -* Linux: - * `repertory -rm : /mnt/location` - * Example: - * `repertory -rm 192.168.1.10:20000 /mnt/location` +**Linux** +```bash +repertory -rm : /mnt/location +# Example: +repertory -rm 192.168.1.10:20000 /mnt/location +``` -* Windows: - * `repertory -rm : t:` - * Example: - * `repertory -rm 192.168.1.10:20000 t:` +**macOS** +```bash +repertory -rm : /Volumes/remotemount +# Example: +repertory -rm 192.168.1.10:20000 /Volumes/remotemount +``` + +**Windows** +```powershell +repertory -rm : t: +# Example: +repertory -rm 192.168.1.10:20000 t: +``` #### Remote Mount Configuration File @@ -393,81 +583,96 @@ for S3 providers. } ``` -## Compiling +--- -Successful compilation will result in all files required for execution to be placed -in the `dist/` directory +## 🧰 Compiling + +Successful compilation will place all required files for execution in the `dist/` directory. ### Linux Compilation -* Ensure `docker` is installed -* For `x86-64`: - * RelWithDebInfo: `scripts/make_unix.sh x86_64` - * Release: `scripts/make_unix.sh x86_64 Release` - * Debug: `scripts/make_unix.sh x86_64 Debug` - -* For `aarch64`: - * RelWithDebInfo: `scripts/make_unix.sh aarch64` - * Release: `scripts/make_unix.sh aarch64 Release` - * Debug: `scripts/make_unix.sh aarch64 Debug` +- Ensure `docker` is installed +- For `x86_64`: + ```bash + scripts/make_unix.sh x86_64 + scripts/make_unix.sh x86_64 Release + scripts/make_unix.sh x86_64 Debug + ``` +- For `aarch64`: + ```bash + scripts/make_unix.sh aarch64 + scripts/make_unix.sh aarch64 Release + scripts/make_unix.sh aarch64 Debug + ``` ### macOS Compilation -* Ensure `Xcode` and `CMake` are installed -* For `x86-64`: - * RelWithDebInfo: `scripts/make_unix.sh x86_64` - * Release: `scripts/make_unix.sh x86_64 Release` - * Debug: `scripts/make_unix.sh x86_64 Debug` - -* For `aarch64`: - * RelWithDebInfo: `scripts/make_unix.sh aarch64` - * Release: `scripts/make_unix.sh aarch64 Release` - * Debug: `scripts/make_unix.sh aarch64 Debug` +- Ensure `Xcode` and `CMake` are installed +- For `x86_64`: + ```bash + scripts/make_unix.sh x86_64 + scripts/make_unix.sh x86_64 Release + scripts/make_unix.sh x86_64 Debug + ``` +- For `aarch64`: + ```bash + scripts/make_unix.sh aarch64 + scripts/make_unix.sh aarch64 Release + scripts/make_unix.sh aarch64 Debug + ``` ### Windows Compilation -* OFFICIAL: Cross-compiling on Linux - * Ensure `docker` is installed - * RelWithDebInfo: `scripts/make_win32.sh x86_64` - * Release: `scripts/make_win32.sh x86_64 Release` - * Debug: `scripts/make_win32.sh x86_64 Debug` +- **OFFICIAL: Cross-compiling on Linux** + - Ensure `docker` is installed + ```bash + scripts/make_win32.sh x86_64 + scripts/make_win32.sh x86_64 Release + scripts/make_win32.sh x86_64 Debug + ``` -* UNOFFICIAL: Compiling on Windows - * Ensure latest [MSYS2](https://www.msys2.org/) is installed - * RelWithDebInfo: `scripts\make_win32.cmd x86_64` - * Release: `scripts\make_win32.cmd x86_64 Release` - * Debug: `scripts\make_win32.cmd x86_64 Debug` +- **UNOFFICIAL: Compiling on Windows** + - Ensure latest [MSYS2](https://www.msys2.org/) is installed + ```powershell + scripts\make_win32.cmd x86_64 + scripts\make_win32.cmd x86_64 Release + scripts\make_win32.cmd x86_64 Debug + ``` -## Credits +--- -* [binutils](https://www.gnu.org/software/binutils/) -* [boost c++ libraries](https://www.boost.org/) -* [cpp-httplib](https://github.com/yhirose/cpp-httplib) -* [curl](https://curl.haxx.se/) -* [docker](https://www.docker.com/) -* [Google Test](https://github.com/google/googletest) -* [ICU](https://icu.unicode.org/) -* [JSON for Modern C++](https://github.com/nlohmann/json) -* [libexpat](https://github.com/libexpat/libexpat) -* [libfuse](https://github.com/libfuse/libfuse) -* [libsodium](https://doc.libsodium.org/) -* [macFUSE](https://macfuse.github.io/) -* [mingw-w64](https://www.mingw-w64.org/) -* [MSYS2](https://www.msys2.org) -* [OpenSSL](https://www.openssl.org/) -* [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) -* [pugixml](https://pugixml.org/) -* [RocksDB](https://rocksdb.org) -* [ScPrime](https://scpri.me/) -* [Sia Decentralized Cloud Storage](https://sia.tech/) -* [spdlog](https://github.com/gabime/spdlog) -* [SQLite](https://www.sqlite.org) -* [stduuid](https://github.com/mariusbancila/stduuid) -* [Storj](https://www.storj.io/) -* [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp) -* [zlib](https://zlib.net/) +## 📜 Credits -## Developer Public Key +- [binutils](https://www.gnu.org/software/binutils/) +- [boost c++ libraries](https://www.boost.org/) +- [cpp-httplib](https://github.com/yhirose/cpp-httplib) +- [curl](https://curl.haxx.se/) +- [docker](https://www.docker.com/) +- [Google Test](https://github.com/google/googletest) +- [ICU](https://icu.unicode.org/) +- [JSON for Modern C++](https://github.com/nlohmann/json) +- [libexpat](https://github.com/libexpat/libexpat) +- [libfuse](https://github.com/libfuse/libfuse) +- [libsodium](https://doc.libsodium.org/) +- [macFUSE](https://macfuse.github.io/) +- [mingw-w64](https://www.mingw-w64.org/) +- [MSYS2](https://www.msys2.org) +- [OpenSSL](https://www.openssl.org/) +- [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) +- [pugixml](https://pugixml.org/) +- [RocksDB](https://rocksdb.org) +- [ScPrime](https://scpri.me/) +- [Sia Decentralized Cloud Storage](https://sia.tech/) +- [spdlog](https://github.com/gabime/spdlog) +- [SQLite](https://www.sqlite.org) +- [stduuid](https://github.com/mariusbancila/stduuid) +- [Storj](https://www.storj.io/) +- [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp) +- [zlib](https://zlib.net/) + +--- + +## 🔑 Developer Public Key ```text -----BEGIN PUBLIC KEY-----