<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Clients on Deevnet FileSync</title><link>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/</link><description>Recent content in Clients on Deevnet FileSync</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux</title><link>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/linux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/linux/</guid><description>&lt;h1 id="linux-client">
 Linux Client
 &lt;a class="anchor" href="#linux-client">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Draft. &lt;strong>Phase:&lt;/strong> 1–3 (MVP). Linux is the first platform and the reference platform for
the sync engine. Common client requirements are on the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/">Clients&lt;/a> page.&lt;/p>
&lt;h2 id="distributions-and-filesystems">
 Distributions and filesystems
 &lt;a class="anchor" href="#distributions-and-filesystems">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-1 (MVP, proposed):&lt;/strong> Fedora (the current release) is the primary, tested distribution.
Other distributions are expected to work but are not tested in the MVP.&lt;/li>
&lt;li>&lt;strong>LNX-2 (MVP):&lt;/strong> Roots on ext4, btrfs, and xfs are supported.&lt;/li>
&lt;li>&lt;strong>LNX-3 (MVP, proposed):&lt;/strong> Roots on network filesystems (NFS, SMB) are allowed, but get rescan
only: inotify does not report changes made by other machines. The client says so when the
root is mounted.&lt;/li>
&lt;li>&lt;strong>LNX-4 (MVP, proposed):&lt;/strong> Works with SELinux in enforcing mode, without policy changes.&lt;/li>
&lt;/ul>
&lt;h2 id="agent">
 Agent
 &lt;a class="anchor" href="#agent">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-5 (MVP):&lt;/strong> The background agent runs as a &lt;strong>systemd user service&lt;/strong>, starting at login.&lt;/li>
&lt;li>&lt;strong>LNX-6 (MVP, proposed):&lt;/strong> Optional &amp;ldquo;keep running while logged out&amp;rdquo;, via systemd lingering,
for always-on machines.&lt;/li>
&lt;/ul>
&lt;h2 id="change-detection">
 Change detection
 &lt;a class="anchor" href="#change-detection">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-7 (MVP):&lt;/strong> inotify for live changes, plus periodic full rescans as a safety net (PERF-1).&lt;/li>
&lt;li>&lt;strong>LNX-8 (MVP, proposed):&lt;/strong> When the inotify watch limit (&lt;code>max_user_watches&lt;/code>) is too low for a
root, the client says so, explains the fix, and falls back to rescans. It never silently misses
changes.&lt;/li>
&lt;/ul>
&lt;h2 id="keys-and-secrets">
 Keys and secrets
 &lt;a class="anchor" href="#keys-and-secrets">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-9 (MVP, proposed):&lt;/strong> The device private key is protected by one of: the Secret Service
(GNOME Keyring / KWallet), a TPM 2.0, or a passphrase-encrypted key file for headless machines.&lt;/li>
&lt;/ul>
&lt;h2 id="packaging">
 Packaging
 &lt;a class="anchor" href="#packaging">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-10 (MVP, proposed):&lt;/strong> Distributed as an RPM for Fedora, plus a standalone binary tarball.&lt;/li>
&lt;li>&lt;strong>LNX-11 (Non-goal, proposed):&lt;/strong> Flatpak and Snap. Their sandboxes restrict filesystem access,
which conflicts with &amp;ldquo;any folder can be a root&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2 id="desktop-integration-phase-4">
 Desktop integration (Phase 4)
 &lt;a class="anchor" href="#desktop-integration-phase-4">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>LNX-12 (Phase 4):&lt;/strong> The tray app uses the StatusNotifierItem standard. On GNOME this needs
the AppIndicator extension, which should be documented.&lt;/li>
&lt;li>&lt;strong>LNX-13 (Phase 4):&lt;/strong> Notifications use the freedesktop notification standard.&lt;/li>
&lt;/ul>
&lt;h2 id="open-questions">
 Open Questions
 &lt;a class="anchor" href="#open-questions">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Other distributions:&lt;/strong> is Fedora-only testing right for the MVP, or does Debian/Ubuntu also
matter early?&lt;/li>
&lt;li>&lt;strong>Headless/server machines:&lt;/strong> should a machine without a desktop session (e.g. a Deevnet VM)
be a supported device?&lt;/li>
&lt;/ol></description></item><item><title>Windows</title><link>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/windows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/windows/</guid><description>&lt;h1 id="windows-client">
 Windows Client
 &lt;a class="anchor" href="#windows-client">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Draft. &lt;strong>Phase:&lt;/strong> 4. Common client requirements are on the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/">Clients&lt;/a> page.&lt;/p>
&lt;h2 id="versions-and-filesystems">
 Versions and filesystems
 &lt;a class="anchor" href="#versions-and-filesystems">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-1 (Phase 4, proposed):&lt;/strong> Windows 11. Windows 10 reached end of support in October 2025.&lt;/li>
&lt;li>&lt;strong>WIN-2 (Phase 4):&lt;/strong> Roots on NTFS. ReFS, FAT32, and exFAT are not supported for roots.&lt;/li>
&lt;/ul>
&lt;h2 id="agent">
 Agent
 &lt;a class="anchor" href="#agent">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-3 (Phase 4, proposed):&lt;/strong> The agent runs &lt;strong>per user&lt;/strong>, started at sign-in, not as a
Windows Service. A service runs as a different account, which complicates access to the user&amp;rsquo;s
files and the user&amp;rsquo;s key store.&lt;/li>
&lt;/ul>
&lt;h2 id="change-detection">
 Change detection
 &lt;a class="anchor" href="#change-detection">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-4 (Phase 4):&lt;/strong> &lt;code>ReadDirectoryChangesW&lt;/code> for live changes, plus periodic rescans. The NTFS
change journal (USN) is not used, because it needs administrator rights.&lt;/li>
&lt;/ul>
&lt;h2 id="file-system-behavior">
 File system behavior
 &lt;a class="anchor" href="#file-system-behavior">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-5 (Phase 4):&lt;/strong> Long paths (over 260 characters) are handled whether or not the system&amp;rsquo;s
long-path setting is enabled.&lt;/li>
&lt;li>&lt;strong>WIN-6 (Phase 4):&lt;/strong> &lt;strong>Locked files.&lt;/strong> Office and other applications hold files open with
exclusive locks. The client reads with shared access, retries files it cannot read, and
delays applying an incoming change to a locked file. It never fails the whole sync because of
one locked file.&lt;/li>
&lt;li>&lt;strong>WIN-7 (Phase 4):&lt;/strong> Incoming changes are written to a temporary file and swapped into place
atomically, so applications never see a half-written file.&lt;/li>
&lt;li>&lt;strong>WIN-8 (Phase 4):&lt;/strong> Names follow the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/metadata/">Metadata Matrix&lt;/a> name policy: reserved
names, forbidden characters, trailing dots and spaces, and case-only collisions.&lt;/li>
&lt;li>&lt;strong>WIN-9 (Phase 4, proposed):&lt;/strong> Tolerates antivirus scanning (Microsoft Defender) briefly
locking newly written files.&lt;/li>
&lt;/ul>
&lt;h2 id="overlap-with-onedrive">
 Overlap with OneDrive
 &lt;a class="anchor" href="#overlap-with-onedrive">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-10 (Phase 4):&lt;/strong> Windows 11 often redirects Documents, Desktop, and Pictures into OneDrive
(&amp;ldquo;Known Folder Move&amp;rdquo;). The client detects a root inside a OneDrive-managed folder and warns
(ROOT-8).&lt;/li>
&lt;/ul>
&lt;h2 id="keys-and-secrets">
 Keys and secrets
 &lt;a class="anchor" href="#keys-and-secrets">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-11 (Phase 4, proposed):&lt;/strong> The device private key is held by the TPM (through the Windows
platform crypto provider) where available, or else protected with DPAPI.&lt;/li>
&lt;/ul>
&lt;h2 id="packaging-and-ui">
 Packaging and UI
 &lt;a class="anchor" href="#packaging-and-ui">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>WIN-12 (Phase 4, proposed):&lt;/strong> A per-user installer that does not need administrator rights.&lt;/li>
&lt;li>&lt;strong>WIN-13 (Phase 4):&lt;/strong> A notification-area (tray) icon and Windows toast notifications (UI-1).&lt;/li>
&lt;/ul>
&lt;h2 id="open-questions">
 Open Questions
 &lt;a class="anchor" href="#open-questions">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Code signing:&lt;/strong> unsigned binaries trigger SmartScreen warnings. Is a code-signing
certificate worth buying for a personal tool, or are the warnings acceptable?&lt;/li>
&lt;/ol></description></item><item><title>macOS</title><link>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/macos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/macos/</guid><description>&lt;h1 id="macos-client">
 macOS Client
 &lt;a class="anchor" href="#macos-client">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Draft. &lt;strong>Phase:&lt;/strong> 5. Common client requirements are on the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/">Clients&lt;/a> page.&lt;/p>
&lt;h2 id="versions-and-hardware">
 Versions and hardware
 &lt;a class="anchor" href="#versions-and-hardware">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-1 (Phase 5, proposed):&lt;/strong> The two most recent major macOS releases, on Apple Silicon. Intel
Macs are not supported.&lt;/li>
&lt;li>&lt;strong>MAC-2 (Phase 5):&lt;/strong> Roots on APFS. Both the default case-insensitive variant and the
case-sensitive variant are supported.&lt;/li>
&lt;/ul>
&lt;h2 id="agent">
 Agent
 &lt;a class="anchor" href="#agent">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-3 (Phase 5):&lt;/strong> The agent runs as a per-user &lt;strong>launchd agent&lt;/strong>, started at login.&lt;/li>
&lt;/ul>
&lt;h2 id="change-detection">
 Change detection
 &lt;a class="anchor" href="#change-detection">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-4 (Phase 5):&lt;/strong> FSEvents for live changes, plus periodic rescans.&lt;/li>
&lt;/ul>
&lt;h2 id="privacy-permissions">
 Privacy permissions
 &lt;a class="anchor" href="#privacy-permissions">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-5 (Phase 5):&lt;/strong> macOS requires the user&amp;rsquo;s explicit consent before an app can read
Desktop, Documents, Downloads, iCloud Drive, or removable and network volumes. The client
asks for access when a root is mounted in one of these places, explains why, and reports
clearly when access is denied rather than treating the folder as empty. &lt;em>An empty-looking root
must never be synced as &amp;ldquo;everything was deleted&amp;rdquo;.&lt;/em>&lt;/li>
&lt;/ul>
&lt;h2 id="overlap-with-icloud">
 Overlap with iCloud
 &lt;a class="anchor" href="#overlap-with-icloud">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-6 (Phase 5):&lt;/strong> With &amp;ldquo;Desktop &amp;amp; Documents Folders&amp;rdquo; in iCloud Drive, those folders are
managed by iCloud, and &amp;ldquo;Optimize Mac Storage&amp;rdquo; can replace files with placeholders. The client
detects a root inside iCloud-managed storage and warns (ROOT-8). It skips placeholders rather
than triggering downloads.&lt;/li>
&lt;/ul>
&lt;h2 id="file-system-behavior">
 File system behavior
 &lt;a class="anchor" href="#file-system-behavior">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-7 (Phase 5):&lt;/strong> Names follow the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/metadata/">Metadata Matrix&lt;/a> name policy. In
particular, NFC and NFD forms of the same name are the same file on APFS.&lt;/li>
&lt;li>&lt;strong>MAC-8 (Phase 5):&lt;/strong> Package/bundle directories are synced as directories (see the Metadata
Matrix).&lt;/li>
&lt;/ul>
&lt;h2 id="keys-and-secrets">
 Keys and secrets
 &lt;a class="anchor" href="#keys-and-secrets">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-9 (Phase 5, proposed):&lt;/strong> The device private key is held in the Secure Enclave where the
key algorithm allows it (P-256 only), or in the Keychain otherwise.&lt;/li>
&lt;/ul>
&lt;h2 id="distribution-and-ui">
 Distribution and UI
 &lt;a class="anchor" href="#distribution-and-ui">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>MAC-10 (Phase 5):&lt;/strong> A menu bar app with status, push now, pull now, and notifications (UI-1).&lt;/li>
&lt;/ul>
&lt;h2 id="open-questions">
 Open Questions
 &lt;a class="anchor" href="#open-questions">#&lt;/a>
&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Signing and notarization:&lt;/strong> distributing a macOS app without Gatekeeper warnings needs a
paid Apple Developer membership and Apple&amp;rsquo;s notarization service. That is a dependency on
Apple. For a personal tool, is building locally (or approving an unsigned app once) acceptable
instead?&lt;/li>
&lt;/ol></description></item><item><title>Android</title><link>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/android/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-filesync/docs/requirements/clients/android/</guid><description>&lt;h1 id="android-client">
 Android Client
 &lt;a class="anchor" href="#android-client">#&lt;/a>
&lt;/h1>
&lt;p>&lt;strong>Status:&lt;/strong> Draft. &lt;strong>Phase:&lt;/strong> 6. Common client requirements are on the 
 &lt;a href="https://deevnet.github.io/deevnet-filesync/deevnet-filesync/docs/requirements/">Clients&lt;/a> page.&lt;/p>
&lt;p>The Android client is an app built on the same Rust core, called from Kotlin.&lt;/p>
&lt;h2 id="role-read-only-access">
 Role: read-only access
 &lt;a class="anchor" href="#role-read-only-access">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>AND-10 (Phase 6):&lt;/strong> &lt;strong>Android is a read-only device&lt;/strong> (a receive-only device, ROOT-9). It
downloads and presents files from the hub; files never originate on, or are changed from,
Android.&lt;/li>
&lt;/ul>
&lt;p>This removes most of what makes Android hard:&lt;/p></description></item></channel></rss>