<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Development on Deevnet FileSync</title><link>https://deevnet.github.io/deevnet-filesync/docs/development/</link><description>Recent content in Development on Deevnet FileSync</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-filesync/docs/development/index.xml" rel="self" type="application/rss+xml"/><item><title>Build Tooling</title><link>https://deevnet.github.io/deevnet-filesync/docs/development/tooling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/development/tooling/</guid><description>&lt;h1 id="build-tooling">
 Build Tooling
 &lt;a class="anchor" href="#build-tooling">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Tracking list. Development so far happens on the Deevnet build server. This page
records every tool added there &lt;strong>beyond what the Ansible-built builder provides&lt;/strong>, so that it can
later become a &lt;code>filesync&lt;/code> builder role, or be handled in another way.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tool&lt;/th>
 &lt;th>Version installed&lt;/th>
 &lt;th>Installed how&lt;/th>
 &lt;th>Needed for&lt;/th>
 &lt;th>Since&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>rust&lt;/code>, &lt;code>cargo&lt;/code>&lt;/td>
 &lt;td>1.99.0 (Fedora 43 packages)&lt;/td>
 &lt;td>&lt;code>dnf install rust cargo&lt;/code>&lt;/td>
 &lt;td>Building the Rust workspace&lt;/td>
 &lt;td>Prototype&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>clippy&lt;/code>, &lt;code>rustfmt&lt;/code>&lt;/td>
 &lt;td>1.99.0 (Fedora 43 packages)&lt;/td>
 &lt;td>&lt;code>dnf install clippy rustfmt&lt;/code>&lt;/td>
 &lt;td>Linting and formatting&lt;/td>
 &lt;td>Prototype&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>MinIO container image&lt;/td>
 &lt;td>&lt;code>quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z&lt;/code>&lt;/td>
 &lt;td>Already present in local podman storage; public pulls of MinIO images now fail&lt;/td>
 &lt;td>A disposable local S3 endpoint for end-to-end tests&lt;/td>
 &lt;td>Prototype&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>hugo&lt;/code> (extended)&lt;/td>
 &lt;td>0.140.1&lt;/td>
 &lt;td>Already present on the build server&lt;/td>
 &lt;td>Building the docs site&lt;/td>
 &lt;td>Docs&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Rust crates are fetched by Cargo from crates.io at build time and pinned in &lt;code>Cargo.lock&lt;/code>. They are
project dependencies, not host tooling, so they are not listed here.&lt;/p></description></item><item><title>Prototype</title><link>https://deevnet.github.io/deevnet-filesync/docs/development/prototype/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/development/prototype/</guid><description>&lt;h1 id="prototype">
 Prototype
 &lt;a class="anchor" href="#prototype">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Working (2026-10-15). This is the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/roadmap/#phase-p-prototype">Phase P&lt;/a> prototype:
the &lt;code>filesync&lt;/code> CLI and the &lt;code>filesync-core&lt;/code> library, in &lt;code>crates/&lt;/code>.&lt;/p>
&lt;h2 id="what-it-does">
 What it does
 &lt;a class="anchor" href="#what-it-does">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Encrypted hub on any S3-compatible store (tested against MinIO), or on a local directory.&lt;/li>
&lt;li>Roots, mounted at any path, with a different path on each device.&lt;/li>
&lt;li>&lt;code>status&lt;/code>, &lt;code>sync&lt;/code> (push now), and &lt;code>pull&lt;/code> (pull now), plus &lt;code>run --interval N&lt;/code> for unattended
polling.&lt;/li>
&lt;li>Three-way sync: changes flow both ways, conflicting edits keep both versions as a conflict copy,
and an edit beats a delete.&lt;/li>
&lt;li>Receive-only mounts (&lt;code>mount --receive-only&lt;/code>).&lt;/li>
&lt;li>Portable-name checks (Windows-invalid names and case/normalization collisions are skipped, with
a warning), symlinks skipped, a per-file size limit (100 MiB by default).&lt;/li>
&lt;li>Version history (&lt;code>history&lt;/code>) and restore of a whole root or one path from any snapshot
(&lt;code>restore&lt;/code>).&lt;/li>
&lt;li>Refuses to sync a root whose folder is missing, or to propagate &amp;ldquo;everything deleted&amp;rdquo; without
&lt;code>--allow-mass-delete&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="what-it-deliberately-does-not-do-yet">
 What it deliberately does not do (yet)
 &lt;a class="anchor" href="#what-it-deliberately-does-not-do-yet">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Shortcut&lt;/th>
 &lt;th>Final design&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>One shared hub key, copied to each device by hand&lt;/td>
 &lt;td>PKI device identity, enrollment, revocation (SEC-7, SEC-9..12)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Whole-file blobs, no chunking&lt;/td>
 &lt;td>Content-defined chunking (PERF-3)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Blob sizes visible to the hub&lt;/td>
 &lt;td>Padding or chunking to hide sizes (SEC-2)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Every snapshot lists every path&lt;/td>
 &lt;td>Incremental snapshots or a compacted index&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>No garbage collection or retention&lt;/td>
 &lt;td>VER-2, VER-6, HUB-7&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Polling only (&lt;code>run --interval&lt;/code>)&lt;/td>
 &lt;td>Filesystem watching plus rescans (LNX-7)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>One static S3 credential, with delete rights&lt;/td>
 &lt;td>Per-device, least-privilege credentials (HUB-6, HUB-7)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="build-and-test">
 Build and test
 &lt;a class="anchor" href="#build-and-test">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cargo build --release &lt;span style="color:#75715e"># target/release/filesync&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cargo test &lt;span style="color:#75715e"># unit tests, plus two-device tests on a directory hub&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="try-it-with-two-devices-on-one-machine">
 Try it with two &amp;ldquo;devices&amp;rdquo; on one machine
 &lt;a class="anchor" href="#try-it-with-two-devices-on-one-machine">#&lt;/a>
&lt;/h2>
&lt;p>Each device is a config directory plus a state directory. A directory hub needs no credentials:&lt;/p></description></item></channel></rss>