<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>MacondoBits</title>
    <link>https://www.macondobits.com/</link>
    <description>Recent content on MacondoBits</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 09 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.macondobits.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Mewdoku</title>
      <link>https://www.macondobits.com/products/mewdoku/</link>
      <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/products/mewdoku/</guid>
      <description>A cat-themed logic puzzle — place every mew where it belongs.</description>
    </item>
    <item>
      <title>APIkulture</title>
      <link>https://www.macondobits.com/products/apikulture/</link>
      <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/products/apikulture/</guid>
      <description>A native desktop REST API client — requests, collections, environments, OpenAPI.</description>
    </item>
    <item>
      <title>EPUB Translator</title>
      <link>https://www.macondobits.com/products/epub-translator/</link>
      <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/products/epub-translator/</guid>
      <description>Translate whole EPUB books while keeping structure, chapters, and formatting intact.</description>
    </item>
    <item>
      <title>ScreenScrobbler</title>
      <link>https://www.macondobits.com/products/screenscrobbler/</link>
      <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/products/screenscrobbler/</guid>
      <description>Self-hosted media tracking — scrobble from Kodi and Netflix, keep your own watch history.</description>
    </item>
    <item>
      <title>Linux Directory</title>
      <link>https://www.macondobits.com/products/linux-directory/</link>
      <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/products/linux-directory/</guid>
      <description>A calm home for Linux identity and host policy — users, HBAC, sudo, SSO, and fleet care under one roof.</description>
    </item>
    <item>
      <title>How to install Ollama on Linux with models on external storage using Lindir</title>
      <link>https://www.macondobits.com/blog/ollama-models-on-expansion/</link>
      <pubDate>Sat, 07 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/blog/ollama-models-on-expansion/</guid>
      <description>Install Ollama through Lindir fleet, put model files on an external disk, bind OLLAMA_HOST=0.0.0.0 for Tailnet clients, and start a user service only when you need inference.</description>
    </item>
    <item>
      <title>How to install Linux Directory (Lindir)</title>
      <link>https://www.macondobits.com/blog/installing-linux-directory/</link>
      <pubDate>Fri, 06 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/blog/installing-linux-directory/</guid>
      <description>A calm walkthrough from empty machine to first enrolled host — database, server, day-one identity, and the client that keeps accounts in sync.</description>
    </item>
    <item>
      <title>Admin CLI (`lindir-admin`)</title>
      <link>https://www.macondobits.com/docs/linux-directory/admin/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/admin/</guid>
      <description>&lt;h1 id=&#34;admin-cli-lindir-admin&#34;&gt;Admin CLI (&lt;code&gt;lindir-admin&lt;/code&gt;)&lt;/h1&gt;&#xA;&lt;p&gt;Thin Bearer-API client for day-to-day IdM and fleet tasks without hand-written &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For the browser UI (Vue 3 at &lt;code&gt;/admin/&lt;/code&gt;), see &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/admin-ui/&#34;&gt;Admin Web UI&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;build&#34;&gt;Build&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COMPILER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;COMPILER&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;ldc2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# ldc2 | dmd | gdc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd cli &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# → cli/lindir-admin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;auth&#34;&gt;Auth&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export LINDIR_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;https://id.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export LINDIR_TOKEN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;…   &lt;span style=&#34;color:#75715e&#34;&gt;# break-glass bootstrap or API token (ldt_…)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# or: --url … --token …&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# lab TLS: --insecure   custom CA: --ca-file /path/ca.pem&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Day-to-day Admin UI login uses a directory username/password (or passkey) plus an &lt;strong&gt;Admin ACL&lt;/strong&gt; binding (&lt;code&gt;admin_ro&lt;/code&gt; / &lt;code&gt;admin_rw&lt;/code&gt;). Bearer tokens remain emergency break-glass and always have full write.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Admin Web UI</title>
      <link>https://www.macondobits.com/docs/linux-directory/admin-ui/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/admin-ui/</guid>
      <description>&lt;h1 id=&#34;admin-web-ui&#34;&gt;Admin Web UI&lt;/h1&gt;&#xA;&lt;p&gt;Vue 3 + Vite SPA served by the existing HTTP server at &lt;code&gt;/admin/&lt;/code&gt; (same origin as the JSON API).&lt;/p&gt;&#xA;&lt;h2 id=&#34;build&#34;&gt;Build&lt;/h2&gt;&#xA;&lt;p&gt;Requires &lt;strong&gt;Node.js ≥18.19&lt;/strong&gt; (Vite 6). Ubuntu 24.04’s default &lt;code&gt;nodejs&lt;/code&gt; (18.19.x) works.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd admin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf node_modules   &lt;span style=&#34;color:#75715e&#34;&gt;# optional; avoids stale installs after new deps (e.g. xterm)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ci                &lt;span style=&#34;color:#75715e&#34;&gt;# installs from package-lock.json (required on every build host)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# → admin/dist/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; refuses to start if the Node version is too old or &lt;code&gt;package.json&lt;/code&gt;&#xA;dependencies are missing from &lt;code&gt;node_modules&lt;/code&gt; (see &lt;code&gt;scripts/check-deps.mjs&lt;/code&gt;).&#xA;Packaging/&lt;code&gt;makepkg&lt;/code&gt; always runs a clean &lt;code&gt;npm ci&lt;/code&gt; first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Architecture</title>
      <link>https://www.macondobits.com/docs/linux-directory/architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/architecture/</guid>
      <description>&lt;h1 id=&#34;architecture&#34;&gt;Architecture&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐&#xA;│  lindir server (D)                                      │&#xA;│  ┌─────────┐ ┌──────────┐ ┌────────┐ ┌───────────────┐  │&#xA;│  │ identity│ │ policy   │ │ auth   │ │ vpn plugins   │  │&#xA;│  │ users   │ │ HBAC     │ │ tokens │ │ Tailscale…    │  │&#xA;│  │ groups  │ │ sudo     │ │ enroll │ │ (optional)    │  │&#xA;│  │ hosts   │ │ SSH keys │ │ PBKDF2 │ │               │  │&#xA;│  └────┬────┘ └────┬─────┘ └───┬────┘ └───────┬───────┘  │&#xA;│  ┌────┴───────────┴───────────┴──────────────┴───────┐  │&#xA;│  │ fleet: inventory · labels · packages · energy ·   │  │&#xA;│  │        queries/scripts · ops attention            │  │&#xA;│  │ oidc · webauthn · ldap gateway · audit            │  │&#xA;│  └───────────────────────┬───────────────────────────┘  │&#xA;│              repo layer (parameterized SQL)             │&#xA;│                         │                               │&#xA;│              Database interface (?, tx)                 │&#xA;│         memory://  |  postgres   |  mysql                 │&#xA;└─────────────────────────────────────────────────────────┘&#xA;          │&#xA;          ▼&#xA;┌─────────────────────────────────────────────────────────┐&#xA;│  lindir-client (D)                                      │&#xA;│  enroll · sync · pam-auth · authorized-keys             │&#xA;│  → extrausers · sudoers.d · package jobs · energy       │&#xA;│  → inventory · query/script runs                        │&#xA;└─────────────────────────────────────────────────────────┘&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;modules&#34;&gt;Modules&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Path&lt;/th&gt;&#xA;          &lt;th&gt;Role&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/api.d&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;HTTP JSON API + static &lt;code&gt;/admin&lt;/code&gt; SPA + OpenAPI serving&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;admin/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Vue 3 admin UI (Vite → &lt;code&gt;admin/dist&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/auth.d&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Bootstrap / API tokens, host enrollment auth, one-shot enroll tokens, account-policy login checks&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/crypto/password.d&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PBKDF2-HMAC-SHA256&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/identity.d&lt;/code&gt; / &lt;code&gt;policy.d&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Domain services + audit&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/repo/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;SQL repositories (users, hosts, fleet, account_policy, enroll_tokens, audit, …)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/oidc/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;OpenID Connect IdP (RS256/JWKS, refresh, public/PKCE)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/webauthn/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Passkeys / WebAuthn (ES256, register + assert)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/ldap/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Read-only LDAP gateway (BER + bind/search)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/storage/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;DB interface, memory, PostgreSQL, MySQL, migrations&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/vpn/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pluggable VPN (Tailscale, Headscale, WireGuard)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/fleet/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Native fleet (packages, labels, queries/scripts, energy)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;source/lindir/net/*&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Shared HTTPS JSON client (libcurl)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;cli/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;lindir-admin&lt;/code&gt; Bearer API CLI&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;client/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;lindir-client&lt;/code&gt; (sync applies IdM + fleet packages + energy)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sql/migrations/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Versioned schema (&lt;code&gt;001&lt;/code&gt; … &lt;code&gt;012_fleet_energy&lt;/code&gt;, …)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;host-login&#34;&gt;Host login&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sync = cache refresh.&lt;/strong&gt; Each successful &lt;code&gt;lindir-client sync&lt;/code&gt; writes NSS files (&lt;code&gt;/var/lib/extrausers/&lt;/code&gt;), policy (&lt;code&gt;cache.json&lt;/code&gt;), and password hashes (&lt;code&gt;cache-auth.json&lt;/code&gt;), and &lt;strong&gt;renews the offline login window&lt;/strong&gt; for &lt;code&gt;offlineMaxAgeSeconds&lt;/code&gt; (default &lt;strong&gt;72 hours&lt;/strong&gt; from the sync timestamp).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Distro compatibility (laptop fleets)</title>
      <link>https://www.macondobits.com/docs/linux-directory/distro/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/distro/</guid>
      <description>&lt;h1 id=&#34;distro-compatibility-laptop-fleets&#34;&gt;Distro compatibility (laptop fleets)&lt;/h1&gt;&#xA;&lt;p&gt;Lindir targets &lt;strong&gt;remote administration of laptops and similar hosts&lt;/strong&gt;. &lt;strong&gt;Ubuntu&#xA;LTS&lt;/strong&gt; and &lt;strong&gt;CachyOS&lt;/strong&gt; are first-class for server and client. &lt;strong&gt;Debian&lt;/strong&gt;,&#xA;&lt;strong&gt;Fedora / RHEL-like&lt;/strong&gt;, and &lt;strong&gt;openSUSE / SLES&lt;/strong&gt; are first-class for the&#xA;&lt;strong&gt;client&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;support-matrix&#34;&gt;Support matrix&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Component&lt;/th&gt;&#xA;          &lt;th&gt;Ubuntu / Debian&lt;/th&gt;&#xA;          &lt;th&gt;CachyOS (Arch)&lt;/th&gt;&#xA;          &lt;th&gt;Fedora / RHEL-like&lt;/th&gt;&#xA;          &lt;th&gt;openSUSE / SLES&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lindir-server&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.deb&lt;/code&gt; / install script&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;PKGBUILD&lt;/code&gt; / pacman&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.rpm&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.rpm&lt;/code&gt; (openSUSE)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lindir-client&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.deb&lt;/code&gt; + sync timer&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;PKGBUILD&lt;/code&gt; + sync timer&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.rpm&lt;/code&gt; + sync timer&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.rpm&lt;/code&gt; + sync timer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Config &lt;code&gt;/etc/lindir/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;NSS (&lt;code&gt;libnss-extrausers&lt;/code&gt;)&lt;/td&gt;&#xA;          &lt;td&gt;apt (required)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;AUR required&lt;/strong&gt; (&lt;code&gt;paru&lt;/code&gt;/&lt;code&gt;yay&lt;/code&gt;)&lt;/td&gt;&#xA;          &lt;td&gt;Distro package when available; else build from Debian source&lt;/td&gt;&#xA;          &lt;td&gt;Distro package when available; else build from Debian source&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Default login shell (sync)&lt;/td&gt;&#xA;          &lt;td&gt;Directory value (usually &lt;code&gt;/bin/bash&lt;/code&gt;)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;&lt;code&gt;/usr/bin/fish&lt;/code&gt;&lt;/strong&gt; when installed&lt;/td&gt;&#xA;          &lt;td&gt;Directory value&lt;/td&gt;&#xA;          &lt;td&gt;Directory value&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;systemd / PAM / SSH&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/client/&#34;&gt;Client&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;VPN plugins&lt;/td&gt;&#xA;          &lt;td&gt;Optional (&lt;code&gt;--skip-vpn&lt;/code&gt; OK)&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;          &lt;td&gt;Same&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet packages&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;apt-get&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;pacman&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;dnf&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;zypper&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Energy (logind/DPMS/dconf)&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;          &lt;td&gt;Yes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;osFamily&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;debian&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;arch&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;rhel&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;suse&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;Pacman-based hosts (CachyOS, Arch, derivatives):&lt;/strong&gt; official repos do not ship &lt;code&gt;libnss-extrausers&lt;/code&gt;. Installing the client for password/SSH login &lt;strong&gt;requires&lt;/strong&gt; the AUR package first: &lt;code&gt;paru -S libnss-extrausers&lt;/code&gt; (or &lt;code&gt;yay -S libnss-extrausers&lt;/code&gt;). See &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/client/#requirements&#34;&gt;Client&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux client</title>
      <link>https://www.macondobits.com/docs/linux-directory/client/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/client/</guid>
      <description>&lt;h1 id=&#34;linux-client&#34;&gt;Linux client&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;lindir-client&lt;/code&gt; joins a host to the domain, syncs POSIX accounts/policy, applies fleet package and energy jobs, and hooks into PAM/SSH/sudo.&lt;/p&gt;&#xA;&lt;h2 id=&#34;build&#34;&gt;Build&lt;/h2&gt;&#xA;&lt;p&gt;Needs &lt;strong&gt;dub&lt;/strong&gt; and one of three first-class D compilers — &lt;strong&gt;LDC&lt;/strong&gt; (&lt;code&gt;ldc2&lt;/code&gt;), &lt;strong&gt;DMD&lt;/strong&gt; (&lt;code&gt;dmd&lt;/code&gt;), or &lt;strong&gt;GDC&lt;/strong&gt; (&lt;code&gt;gdc&lt;/code&gt;):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COMPILER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;COMPILER&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;ldc2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# ldc2 | dmd | gdc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# server → ./lindir-server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# client → ./lindir-client&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd client &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;requirements&#34;&gt;Requirements&lt;/h2&gt;&#xA;&lt;p&gt;Directory accounts are projected into &lt;code&gt;/var/lib/extrausers/&lt;/code&gt; and must be visible to glibc via &lt;strong&gt;NSS &lt;code&gt;extrausers&lt;/code&gt;&lt;/strong&gt;. Install the module &lt;strong&gt;before&lt;/strong&gt; enroll/sync (or password login will not see users).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Directory — shape of the present system</title>
      <link>https://www.macondobits.com/docs/linux-directory/scope/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/scope/</guid>
      <description>&lt;h1 id=&#34;linux-directory--shape-of-the-present-system&#34;&gt;Linux Directory — shape of the present system&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-it-is&#34;&gt;What it is&lt;/h2&gt;&#xA;&lt;p&gt;Linux Directory (&lt;code&gt;lindir&lt;/code&gt;) gathers &lt;strong&gt;identity&lt;/strong&gt;, &lt;strong&gt;host policy&lt;/strong&gt;, optional &lt;strong&gt;VPN plugins&lt;/strong&gt;, and &lt;strong&gt;native fleet care&lt;/strong&gt; — inventory, labels, packages across apt/pacman/dnf/zypper, energy policies, TLS certificates (ACME), cron/systemd automation, remote queries and scripts — together with day-to-day operations: an attention dashboard, account policy, enroll tokens, and searchable audit. See &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/fleet/&#34;&gt;Fleet&lt;/a&gt;, &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/certificates/&#34;&gt;Certificates&lt;/a&gt;, and &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/#13-fleet-native&#34;&gt;Operator handbook §13&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;capabilities&#34;&gt;Capabilities&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Area&lt;/th&gt;&#xA;          &lt;th&gt;What you have&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Users, groups, hosts&lt;/td&gt;&#xA;          &lt;td&gt;Full directory objects in SQL&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Host enrollment&lt;/td&gt;&#xA;          &lt;td&gt;Admin enroll, client enroll, and one-shot &lt;code&gt;len_…&lt;/code&gt; tokens&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Account policy&lt;/td&gt;&#xA;          &lt;td&gt;Length, expiry, must-change, disable; Admin login IP throttle&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;HBAC&lt;/td&gt;&#xA;          &lt;td&gt;Group↔host login rules (empty rule set allows all — tighten before production)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Central sudo&lt;/td&gt;&#xA;          &lt;td&gt;Rules distributed on sync&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;SSH key distribution&lt;/td&gt;&#xA;          &lt;td&gt;Public keys for users, applied on sync&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OIDC / app SSO&lt;/td&gt;&#xA;          &lt;td&gt;RS256, refresh tokens, public/PKCE clients&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Passkeys / WebAuthn&lt;/td&gt;&#xA;          &lt;td&gt;ES256 registration and OIDC sign-in&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Offline / cached login&lt;/td&gt;&#xA;          &lt;td&gt;Hardened client cache against 401/403&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Read-only LDAP gateway&lt;/td&gt;&#xA;          &lt;td&gt;Bind and search projection from SQL&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Tailscale / Headscale / WireGuard / Pangolin&lt;/td&gt;&#xA;          &lt;td&gt;Optional pluggable mesh providers&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Admin API&lt;/td&gt;&#xA;          &lt;td&gt;HTTP JSON (&lt;code&gt;openapi.json&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Admin CLI&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;lindir-admin&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Admin Web UI&lt;/td&gt;&#xA;          &lt;td&gt;Vue 3 at &lt;code&gt;/admin&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Ops attention&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;/v1/ops/attention&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Audit&lt;/td&gt;&#xA;          &lt;td&gt;Filters, CSV export, expandable package-job logs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet inventory &amp;amp; labels&lt;/td&gt;&#xA;          &lt;td&gt;Distro-aware package and host metadata&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet packages&lt;/td&gt;&#xA;          &lt;td&gt;Install, remove, upgrade, refresh, reboot, update-client; apt sources / PPA ops; label targeting&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet cron &amp;amp; systemd automation&lt;/td&gt;&#xA;          &lt;td&gt;User/&lt;code&gt;cron.d&lt;/code&gt; crontabs; &lt;code&gt;lindir-*&lt;/code&gt; timers, oneshots, services; system unit catalog operate&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet vulnerability findings&lt;/td&gt;&#xA;          &lt;td&gt;Ubuntu Security, Arch AVG, OSV (Debian/RHEL/SUSE); findings for operators&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet energy policies&lt;/td&gt;&#xA;          &lt;td&gt;Idle sleep, screen blank/off, lid via logind/DPMS/dconf&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet TLS certificates&lt;/td&gt;&#xA;          &lt;td&gt;ACME policies (DNS-01 / HTTP-01), many per host; discovery of existing PEMs — &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/certificates/&#34;&gt;Certificates&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;MDM compliance&lt;/td&gt;&#xA;          &lt;td&gt;Distro/encryption/password/VPN posture (seeded &lt;code&gt;fleet-vpn&lt;/code&gt;); lock and retire; OIDC device gate — &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/mdm/&#34;&gt;MDM &amp;amp; Compliance&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Fleet queries &amp;amp; scripts&lt;/td&gt;&#xA;          &lt;td&gt;Define and queue; results under Runs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Storage&lt;/td&gt;&#xA;          &lt;td&gt;PostgreSQL or MySQL/MariaDB (plus in-memory for labs)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Platforms&lt;/td&gt;&#xA;          &lt;td&gt;Ubuntu LTS and CachyOS (server + client); Debian, Fedora/RHEL-like, openSUSE clients&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Packaging&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;PKGBUILD&lt;/code&gt;, RPM, install scripts&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;design-commitments&#34;&gt;Design commitments&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Server backend: &lt;strong&gt;D&lt;/strong&gt; (&lt;code&gt;dub&lt;/code&gt;; first-class compilers &lt;strong&gt;LDC&lt;/strong&gt;, &lt;strong&gt;DMD&lt;/strong&gt;, &lt;strong&gt;GDC&lt;/strong&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Storage: &lt;strong&gt;PostgreSQL or MySQL/MariaDB&lt;/strong&gt; — SQL is the system of record.&lt;/li&gt;&#xA;&lt;li&gt;Platforms: &lt;strong&gt;CachyOS&lt;/strong&gt; and &lt;strong&gt;Ubuntu&lt;/strong&gt; first-class for server and client; &lt;strong&gt;Debian&lt;/strong&gt;, &lt;strong&gt;Fedora/RHEL-like&lt;/strong&gt;, and &lt;strong&gt;openSUSE&lt;/strong&gt; first-class for the client.&lt;/li&gt;&#xA;&lt;li&gt;VPN is &lt;strong&gt;optional&lt;/strong&gt;; LAN-only fleets need no mesh provider.&lt;/li&gt;&#xA;&lt;li&gt;The product is built for &lt;strong&gt;Linux fleets&lt;/strong&gt; — laptops and servers under one directory — without a Windows domain-protocol layer.&lt;/li&gt;&#xA;&lt;li&gt;Emphasis: &lt;strong&gt;remote care of hosts&lt;/strong&gt; (packages, energy, compliance, optional VPN).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;natural-boundaries&#34;&gt;Natural boundaries&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Kerberos realms, Dogtag CA, and integrated DNS remain external companions when you want them.&lt;/li&gt;&#xA;&lt;li&gt;Compliance actions are &lt;strong&gt;lock&lt;/strong&gt; and &lt;strong&gt;retire&lt;/strong&gt;; there is no factory-reset wipe path.&lt;/li&gt;&#xA;&lt;li&gt;Device posture can gate &lt;strong&gt;OIDC&lt;/strong&gt; clients that require a compliant device.&lt;/li&gt;&#xA;&lt;li&gt;Mail, calendar, and groupware live in companions such as &lt;strong&gt;Nextcloud&lt;/strong&gt; via OIDC (&lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/#86-example-nextcloud-user_oidc&#34;&gt;Operator handbook §8.6&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;LDAP is a &lt;strong&gt;read-only projection&lt;/strong&gt; of SQL, not the primary store (&lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/ldap/&#34;&gt;LDAP&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Agent updates through packaged repos, or the fleet &lt;code&gt;update-client&lt;/code&gt; job (&lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/fleet/&#34;&gt;Fleet&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>MDM (device compliance)</title>
      <link>https://www.macondobits.com/docs/linux-directory/mdm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/mdm/</guid>
      <description>&lt;h1 id=&#34;mdm-device-compliance&#34;&gt;MDM (device compliance)&lt;/h1&gt;&#xA;&lt;p&gt;lindir’s MDM layer provides compliance policies, custom discovery scripts, &lt;strong&gt;retire&lt;/strong&gt; and &lt;strong&gt;lock&lt;/strong&gt; remote actions, and &lt;strong&gt;OIDC Conditional Access&lt;/strong&gt; via device assertions — a calm way to know a host’s posture before it opens an application.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-you-get&#34;&gt;What you get&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Capability&lt;/th&gt;&#xA;          &lt;th&gt;Behavior&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Allowed distro/version&lt;/td&gt;&#xA;          &lt;td&gt;Policy &lt;code&gt;allowedDistros[{family,minVersion,maxVersion}]&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Disk encryption&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;requireEncryption&lt;/code&gt; — dm-crypt/LUKS on root (mapper/&lt;code&gt;dm-&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;VPN posture&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;requireVpn&lt;/code&gt; — host reports mesh/VPN up (see seeded &lt;strong&gt;fleet-vpn&lt;/strong&gt; below)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Local password mins&lt;/td&gt;&#xA;          &lt;td&gt;Compare &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt; (and PAM hints) to policy mins&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Custom scripts&lt;/td&gt;&#xA;          &lt;td&gt;Admin POSIX scripts → JSON stdout; &lt;code&gt;customAssert&lt;/code&gt; on policy&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Lock&lt;/td&gt;&#xA;          &lt;td&gt;Queue &lt;code&gt;loginctl lock-sessions&lt;/code&gt; on next sync&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Retire&lt;/td&gt;&#xA;          &lt;td&gt;Clear enrollment secret, mark host retired, agent clears local secret + energy drop-ins; VPN &lt;code&gt;removeHost&lt;/code&gt; when a provider is configured&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Conditional Access&lt;/td&gt;&#xA;          &lt;td&gt;OIDC clients with &lt;code&gt;requireCompliantDevice&lt;/code&gt; need a short-lived device assertion&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;Remote actions today:&lt;/strong&gt; lock sessions and retire enrollment. Compliance can gate OIDC clients that require a compliant device.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Native fleet</title>
      <link>https://www.macondobits.com/docs/linux-directory/fleet/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/fleet/</guid>
      <description>&lt;h1 id=&#34;native-fleet&#34;&gt;Native fleet&lt;/h1&gt;&#xA;&lt;p&gt;lindir includes a &lt;strong&gt;built-in fleet&lt;/strong&gt; layer: host inventory, labels, &lt;strong&gt;package management&lt;/strong&gt;, &lt;strong&gt;energy policies&lt;/strong&gt;, &lt;strong&gt;cron / systemd automation&lt;/strong&gt; (timers, oneshots, services, unit catalog), &lt;strong&gt;blocklists&lt;/strong&gt; (&lt;code&gt;/etc/hosts&lt;/code&gt;), remote queries, and scripts. Device management lives in the same SQL control plane as IdM.&lt;/p&gt;&#xA;&lt;h2 id=&#34;package-management&#34;&gt;Package management&lt;/h2&gt;&#xA;&lt;p&gt;First-class install / remove / upgrade / refresh for supported platforms:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Distro&lt;/th&gt;&#xA;          &lt;th&gt;Manager&lt;/th&gt;&#xA;          &lt;th&gt;Client backends&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt; (and Debian)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;apt-get&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;noninteractive, confold, &lt;code&gt;update&lt;/code&gt; before install/upgrade&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;CachyOS&lt;/strong&gt; (and Arch)&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;pacman&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;--noconfirm&lt;/code&gt;, &lt;code&gt;-Sy&lt;/code&gt; / &lt;code&gt;-Syu&lt;/code&gt; / &lt;code&gt;-R&lt;/code&gt; as appropriate&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Fedora / RHEL / Rocky / Alma&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;dnf&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;-y install/remove/upgrade&lt;/code&gt;; &lt;code&gt;check-update&lt;/code&gt; for refresh (&lt;code&gt;yum&lt;/code&gt; shim OK)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;openSUSE / SLES&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;zypper&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;--non-interactive&lt;/code&gt; install/remove/update; &lt;code&gt;refresh&lt;/code&gt; for indexes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;actions&#34;&gt;Actions&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Action&lt;/th&gt;&#xA;          &lt;th&gt;Packages&lt;/th&gt;&#xA;          &lt;th&gt;Behavior&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;install&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;Install named packages&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;remove&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;Remove named packages (&lt;code&gt;apt-get remove --purge&lt;/code&gt; / &lt;code&gt;pacman -R&lt;/code&gt; / &lt;code&gt;dnf remove&lt;/code&gt; / &lt;code&gt;zypper remove&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;upgrade&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;optional&lt;/td&gt;&#xA;          &lt;td&gt;Specific packages, or &lt;strong&gt;empty list = full system upgrade&lt;/strong&gt; (&lt;code&gt;apt-get upgrade&lt;/code&gt; / &lt;code&gt;pacman -Syu&lt;/code&gt; / &lt;code&gt;dnf upgrade&lt;/code&gt; / &lt;code&gt;zypper update&lt;/code&gt;) if &lt;code&gt;allowFullSystemUpgrade&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;refresh&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;none&lt;/td&gt;&#xA;          &lt;td&gt;Update indexes only (&lt;code&gt;apt-get update&lt;/code&gt; / &lt;code&gt;pacman -Sy&lt;/code&gt; / &lt;code&gt;dnf check-update&lt;/code&gt; / &lt;code&gt;zypper refresh&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;reboot&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;none&lt;/td&gt;&#xA;          &lt;td&gt;Schedule host reboot a few seconds after the agent reports the job (next sync)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;update-client&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;none&lt;/td&gt;&#xA;          &lt;td&gt;Upgrade/install the &lt;code&gt;lindir-client&lt;/code&gt; package via apt/pacman/dnf/zypper (must be in host repos)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;add-ppa&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Ubuntu/apt only:&lt;/strong&gt; Launchpad &lt;code&gt;ppa:owner/name&lt;/code&gt; via &lt;code&gt;add-apt-repository -y&lt;/code&gt; then &lt;code&gt;apt-get update&lt;/code&gt; (needs &lt;code&gt;software-properties-common&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;enable-ppa&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;apt only:&lt;/strong&gt; re-enable inventoriable source id (&lt;code&gt;.list.disabled&lt;/code&gt; → &lt;code&gt;.list&lt;/code&gt;, or deb822 &lt;code&gt;Enabled: yes&lt;/code&gt;) then &lt;code&gt;apt-get update&lt;/code&gt; — no package changes&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;disable-ppa&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;apt only:&lt;/strong&gt; disable inventoriable source id (&lt;code&gt;.list&lt;/code&gt; → &lt;code&gt;.list.disabled&lt;/code&gt;, or deb822 &lt;code&gt;Enabled: no&lt;/code&gt;) then &lt;code&gt;apt-get update&lt;/code&gt; — packages stay installed&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;remove-ppa&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;required&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;apt only:&lt;/strong&gt; disable inventoriable &lt;code&gt;/etc/apt/sources.list.d/{id}&lt;/code&gt; and &lt;strong&gt;revert packages&lt;/strong&gt; from that origin to remaining archive versions. &lt;code&gt;packages[]&lt;/code&gt; = source basenames (&lt;code&gt;.list&lt;/code&gt; / &lt;code&gt;.sources&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Package names are &lt;strong&gt;strictly validated&lt;/strong&gt; on the server (no shell metacharacters). PPA specs and apt source ids use dedicated validators. The agent never builds shell strings from operator input — it passes argv arrays to &lt;code&gt;apt-get&lt;/code&gt; / &lt;code&gt;pacman&lt;/code&gt; / &lt;code&gt;dnf&lt;/code&gt; / &lt;code&gt;zypper&lt;/code&gt; / &lt;code&gt;add-apt-repository&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenID Connect (OIDC)</title>
      <link>https://www.macondobits.com/docs/linux-directory/oidc/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/oidc/</guid>
      <description>&lt;h1 id=&#34;openid-connect-oidc&#34;&gt;OpenID Connect (OIDC)&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-oidc-is&#34;&gt;What OIDC is&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;OpenID Connect&lt;/strong&gt; is an identity layer on top of &lt;strong&gt;OAuth 2.0&lt;/strong&gt;. An application (relying party) sends the user to an &lt;strong&gt;identity provider&lt;/strong&gt; (IdP). After the user signs in, the IdP returns:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;an &lt;strong&gt;ID token&lt;/strong&gt; (JWT) asserting &lt;em&gt;who&lt;/em&gt; the user is (&lt;code&gt;sub&lt;/code&gt;, name, email, …)&lt;/li&gt;&#xA;&lt;li&gt;usually an &lt;strong&gt;access token&lt;/strong&gt; for calling APIs (e.g. UserInfo)&lt;/li&gt;&#xA;&lt;li&gt;optionally a &lt;strong&gt;refresh token&lt;/strong&gt; to obtain new tokens without re-login&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That is how apps like Grafana, Nextcloud, or internal portals do &lt;strong&gt;SSO&lt;/strong&gt; against a central directory — without each app storing passwords.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OWASP Top 10:2025 compliance</title>
      <link>https://www.macondobits.com/docs/linux-directory/owasp/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/owasp/</guid>
      <description>&lt;h1 id=&#34;owasp-top-102025-compliance&#34;&gt;OWASP Top 10:2025 compliance&lt;/h1&gt;&#xA;&lt;p&gt;lindir treats the &lt;a href=&#34;https://owasp.org/Top10/2025/&#34;&gt;OWASP Top 10:2025&lt;/a&gt; as a standing requirement. This document maps each risk to &lt;strong&gt;controls&lt;/strong&gt;, &lt;strong&gt;residual risks&lt;/strong&gt;, and ops guidance.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;ID&lt;/th&gt;&#xA;          &lt;th&gt;Risk&lt;/th&gt;&#xA;          &lt;th&gt;Status&lt;/th&gt;&#xA;          &lt;th&gt;Controls in lindir&lt;/th&gt;&#xA;          &lt;th&gt;Residual risks&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A01&lt;/td&gt;&#xA;          &lt;td&gt;Broken Access Control&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Separate &lt;strong&gt;Bearer&lt;/strong&gt; (admin) vs &lt;strong&gt;Host&lt;/strong&gt; (enrolled machine) vs &lt;strong&gt;enroll&lt;/strong&gt; (&lt;code&gt;len_…&lt;/code&gt; one-shot, limited to &lt;code&gt;POST /v1/hosts/enroll&lt;/code&gt;); HBAC on client login when rules exist; host routes reject missing/invalid enrollment secret; console WS uses short-lived single-use &lt;code&gt;wsTicket&lt;/code&gt; (not the admin Bearer in the URL)&lt;/td&gt;&#xA;          &lt;td&gt;Empty HBAC rule set &lt;strong&gt;allows all&lt;/strong&gt; logins. API tokens are effectively all-admin. Fleet scripts/packages/&lt;strong&gt;console&lt;/strong&gt; are intentional root RCE for any Bearer admin. Admin SPA stores token in &lt;code&gt;sessionStorage&lt;/code&gt; (XSS → full control).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A02&lt;/td&gt;&#xA;          &lt;td&gt;Security Misconfiguration&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Bind default &lt;code&gt;127.0.0.1&lt;/code&gt;; refuse weak &lt;code&gt;bootstrapToken&lt;/code&gt; unless &lt;code&gt;allowInsecureBootstrap&lt;/code&gt;; security response headers (&lt;code&gt;nosniff&lt;/code&gt;, &lt;code&gt;X-Frame-Options&lt;/code&gt;, &lt;code&gt;Referrer-Policy&lt;/code&gt;); TLS via reverse proxy + &lt;code&gt;requireForwardedHttps&lt;/code&gt; / &lt;code&gt;trustedProxies&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;No Content-Security-Policy. HTTP cleartext by design. LDAP &lt;code&gt;allowAnonymous&lt;/code&gt; defaults &lt;strong&gt;true&lt;/strong&gt;. Listening on &lt;code&gt;0.0.0.0&lt;/code&gt; warns but does not refuse.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A03&lt;/td&gt;&#xA;          &lt;td&gt;Software Supply Chain Failures&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Pin Dub deps via &lt;code&gt;dub.selections.json&lt;/code&gt;; pin admin UI via &lt;code&gt;package-lock.json&lt;/code&gt;; first-class LDC/DMD/GDC builds; &lt;code&gt;update-client&lt;/code&gt; uses distro packages&lt;/td&gt;&#xA;          &lt;td&gt;Client updates trust the distro package repositories you configure.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A04&lt;/td&gt;&#xA;          &lt;td&gt;Cryptographic Failures&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;PBKDF2-HMAC-SHA256 (~210k iter) for passwords; hashed API/enroll tokens; enrollment secrets random; client config/cache mode &lt;code&gt;600&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;TLS not terminated in-process. Host bundle includes password hashes for offline PAM (host secret compromise → hash dump). Enrollment secrets compared as plaintext strings.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A05&lt;/td&gt;&#xA;          &lt;td&gt;Injection&lt;/td&gt;&#xA;          &lt;td&gt;Strong&lt;/td&gt;&#xA;          &lt;td&gt;Parameterized SQL (&lt;code&gt;?&lt;/code&gt;); package name allowlist; typed JSON fields; &lt;code&gt;maxBodyBytes&lt;/code&gt;; energy drop-ins from allowlisted enums/ints&lt;/td&gt;&#xA;          &lt;td&gt;Fleet queries/scripts and MDM custom compliance scripts execute shell on hosts &lt;strong&gt;by design&lt;/strong&gt; (admin-trusted).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A06&lt;/td&gt;&#xA;          &lt;td&gt;Insecure Design&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Optional VPN (default null); least privilege host vs admin APIs; password hashes only on Host-auth channel; offline PAM refuses fallback on 401/403&lt;/td&gt;&#xA;          &lt;td&gt;HBAC empty-set allow is easy to leave open. No approval workflow for fleet RCE / energy / logind changes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A07&lt;/td&gt;&#xA;          &lt;td&gt;Authentication Failures&lt;/td&gt;&#xA;          &lt;td&gt;Strong&lt;/td&gt;&#xA;          &lt;td&gt;Bootstrap vs API tokens + revoke; global + Admin-login per-IP rate limiting; account policy (min length, expiry, must-change); disable user for account denial; WebAuthn for OIDC; generic client auth errors; enroll tokens (TTL / maxUses / hostname hint)&lt;/td&gt;&#xA;          &lt;td&gt;Admin API is long-lived Bearer without MFA/step-up. Compromised admin token = full domain.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A08&lt;/td&gt;&#xA;          &lt;td&gt;Software or Data Integrity Failures&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Versioned SQL migrations (&lt;code&gt;001&lt;/code&gt;–&lt;code&gt;027&lt;/code&gt;…); audit log of admin mutations; sudoers written with restrictive mode&lt;/td&gt;&#xA;          &lt;td&gt;Client bundle / inventory / energy payloads are auth-protected but &lt;strong&gt;not signed&lt;/strong&gt;. MITM without TLS can rewrite host policy.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A09&lt;/td&gt;&#xA;          &lt;td&gt;Security Logging and Alerting Failures&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;audit_events&lt;/code&gt; for auth ok/deny (&lt;code&gt;login.auth_denied&lt;/code&gt; with channel actor; no password lockout counter), tokens, fleet (incl. package results with hostname), enroll, account policy, VPN, MDM; searchable Admin &lt;strong&gt;Audit&lt;/strong&gt; (newest-first sort, expandable package-job stdout/stderr) + CLI filters/CSV export; Dashboard denial strip&lt;/td&gt;&#xA;          &lt;td&gt;Alerts (webhooks, SIEM, paging) for denial spikes, enroll abuse, or failed package jobs are left to your surrounding stack. Source IP is not stored in audit (use reverse-proxy access logs).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;A10&lt;/td&gt;&#xA;          &lt;td&gt;Mishandling of Exceptional Conditions&lt;/td&gt;&#xA;          &lt;td&gt;Partial&lt;/td&gt;&#xA;          &lt;td&gt;Generic &lt;code&gt;internal&lt;/code&gt; when &lt;code&gt;exposeErrorDetails&lt;/code&gt; is false; rate limit → 429; offline PAM fail-closed on 401/403&lt;/td&gt;&#xA;          &lt;td&gt;Empty HBAC fails open. Some &lt;code&gt;Exception&lt;/code&gt; catches ignore (e.g. early &lt;code&gt;account_policy&lt;/code&gt; ensure). Energy/logind restart failure only warns.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;config-knobs-server&#34;&gt;Config knobs (server)&lt;/h2&gt;&#xA;&lt;p&gt;Security-relevant keys (full server config reference: &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/#43-server-config-reference&#34;&gt;Operator handbook §4.3&lt;/a&gt;):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Packaging</title>
      <link>https://www.macondobits.com/docs/linux-directory/packaging/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/packaging/</guid>
      <description>&lt;h1 id=&#34;packaging&#34;&gt;Packaging&lt;/h1&gt;&#xA;&lt;p&gt;Build binaries first, then package.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;dub&lt;/strong&gt; + one of three first-class D compilers: &lt;strong&gt;LDC&lt;/strong&gt; (&lt;code&gt;ldc2&lt;/code&gt;), &lt;strong&gt;DMD&lt;/strong&gt; (&lt;code&gt;dmd&lt;/code&gt;), &lt;strong&gt;GDC&lt;/strong&gt; (&lt;code&gt;gdc&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;code&gt;COMPILER=ldc2|dmd|gdc&lt;/code&gt; to choose; &lt;code&gt;install.sh&lt;/code&gt; / PKGBUILDs / &lt;code&gt;migrate-db.sh&lt;/code&gt; auto-pick the first available if unset&lt;/li&gt;&#xA;&lt;li&gt;Ubuntu &lt;code&gt;.deb&lt;/code&gt;: &lt;code&gt;dpkg-deb&lt;/code&gt; (dpkg-dev)&lt;/li&gt;&#xA;&lt;li&gt;CachyOS/Arch: &lt;code&gt;makepkg&lt;/code&gt; (base-devel)&lt;/li&gt;&#xA;&lt;li&gt;Fedora/RHEL &lt;code&gt;.rpm&lt;/code&gt;: &lt;code&gt;podman&lt;/code&gt; (rpmbuild runs inside a Fedora container)&lt;/li&gt;&#xA;&lt;li&gt;openSUSE &lt;code&gt;.rpm&lt;/code&gt;: &lt;code&gt;podman&lt;/code&gt; (rpmbuild runs inside an openSUSE container)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;local-install-no-package&#34;&gt;Local install (no package)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COMPILER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;COMPILER&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;ldc2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# ldc2 | dmd | gdc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cd cli &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cd admin &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf node_modules &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm ci &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# Vue admin → admin/dist&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ./packaging/install-server.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# client install.sh rebuilds with $COMPILER (default ldc2)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COMPILER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; sudo -E ./client/packaging/install.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ubuntu-deb&#34;&gt;Ubuntu &lt;code&gt;.deb&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;COMPILER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;COMPILER&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;ldc2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; --build&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cd cli &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; --build&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;release&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cd admin &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf node_modules &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm ci &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/packaging/build-deb-server.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cd client &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dub build --compiler&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$COMPILER&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; --build&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;release&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/packaging/build-deb-client.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# → dist/lindir-server_*.deb  dist/lindir-client_*.deb&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dpkg -i dist/lindir-server_*.deb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;cachyos--arch&#34;&gt;CachyOS / Arch&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Fast path (from source tree)&lt;/strong&gt; — preferred while developing:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Passkeys / WebAuthn</title>
      <link>https://www.macondobits.com/docs/linux-directory/webauthn/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/webauthn/</guid>
      <description>&lt;h1 id=&#34;passkeys--webauthn&#34;&gt;Passkeys / WebAuthn&lt;/h1&gt;&#xA;&lt;p&gt;lindir is a WebAuthn &lt;strong&gt;relying party&lt;/strong&gt;. Users register platform or roaming passkeys and can sign in on the OIDC login page without a password.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-supported&#34;&gt;What is supported&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Piece&lt;/th&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Algorithms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;ES256&lt;/strong&gt; (P-256) — covers platform passkeys&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Attestation&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;none&lt;/code&gt; (packed authData still accepted if present)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Registration&lt;/td&gt;&#xA;          &lt;td&gt;Admin Bearer API (&lt;code&gt;/v1/webauthn/register/*&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Authentication&lt;/td&gt;&#xA;          &lt;td&gt;Public API (&lt;code&gt;/v1/webauthn/authenticate/*&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OIDC&lt;/td&gt;&#xA;          &lt;td&gt;Login page &lt;strong&gt;Sign in with passkey&lt;/strong&gt; → short-lived &lt;code&gt;loginToken&lt;/code&gt; → auth code&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Resident keys&lt;/td&gt;&#xA;          &lt;td&gt;Preferred; discoverable login (empty username) supported&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;config&#34;&gt;Config&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;issuerUrl&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://id.example.com&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;webauthnRpId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id.example.com&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;webauthnRpName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;lindir&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;webauthnOrigins&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://id.example.com&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Defaults: &lt;code&gt;webauthnRpId&lt;/code&gt; = hostname of &lt;code&gt;issuerUrl&lt;/code&gt; (or listen host); &lt;code&gt;webauthnOrigins&lt;/code&gt; = &lt;code&gt;[issuerUrl]&lt;/code&gt;.&lt;br&gt;&#xA;WebAuthn requires a &lt;strong&gt;secure context&lt;/strong&gt; (HTTPS or &lt;code&gt;localhost&lt;/code&gt;). Use &lt;code&gt;requireForwardedHttps&lt;/code&gt; behind a TLS terminator.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pluggable VPN architecture</title>
      <link>https://www.macondobits.com/docs/linux-directory/vpn/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/vpn/</guid>
      <description>&lt;h1 id=&#34;pluggable-vpn-architecture&#34;&gt;Pluggable VPN architecture&lt;/h1&gt;&#xA;&lt;p&gt;VPN/mesh management is &lt;strong&gt;optional&lt;/strong&gt;. LAN-only deployments use &lt;code&gt;vpn.provider: &amp;quot;null&amp;quot;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;interface&#34;&gt;Interface&lt;/h2&gt;&#xA;&lt;p&gt;D interface &lt;code&gt;VpnProvider&lt;/code&gt; (&lt;code&gt;source/lindir/vpn/provider.d&lt;/code&gt;):&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Method&lt;/th&gt;&#xA;          &lt;th&gt;Purpose&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;enrollHost(hostname, tags)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Create a mesh &lt;strong&gt;auth / preauth key&lt;/strong&gt; or WireGuard peer; return status&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;syncGroupAcls(group → members)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Merge IdM groups into control-plane ACL / policy / sidecar map&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;removeHost(hostname)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Delete matching device/node/peer from the mesh&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;backends&#34;&gt;Backends&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Provider config&lt;/th&gt;&#xA;          &lt;th&gt;Implementation&lt;/th&gt;&#xA;          &lt;th&gt;Status&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;null&lt;/code&gt; / &lt;code&gt;none&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;NullVpnProvider&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Done — no-op&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;tailscale&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;TailscaleVpnProvider&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Live API&lt;/strong&gt; when &lt;code&gt;apiKey&lt;/code&gt; + &lt;code&gt;tailnet&lt;/code&gt; set; otherwise dry-run&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;headscale&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;HeadscaleVpnProvider&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Live API&lt;/strong&gt; when &lt;code&gt;apiBase&lt;/code&gt; + &lt;code&gt;apiKey&lt;/code&gt; + &lt;code&gt;tailnet&lt;/code&gt; (user) set; otherwise dry-run&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;wireguard&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;WireGuardVpnProvider&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Local peer registry + config files; optional &lt;code&gt;wg set&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pangolin&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;PangolinVpnProvider&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Live API&lt;/strong&gt; when &lt;code&gt;apiKey&lt;/code&gt; + &lt;code&gt;pangolin.orgId&lt;/code&gt; set; otherwise dry-run&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;config--tailscale&#34;&gt;Config — Tailscale&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vpn&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;provider&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tailscale&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;apiBase&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.tailscale.com&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;apiKey&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tskey-api-…&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;tailnet&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;example.ts.net&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create an API access token in the Tailscale admin console with scopes to manage &lt;strong&gt;auth keys&lt;/strong&gt;, &lt;strong&gt;devices&lt;/strong&gt;, and the &lt;strong&gt;policy file&lt;/strong&gt; (ACL). Tags used at enroll (default &lt;code&gt;tag:lindir&lt;/code&gt;) must be defined in the ACL &lt;code&gt;tagOwners&lt;/code&gt; and allowed for that token / OAuth client.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Read-only LDAP gateway</title>
      <link>https://www.macondobits.com/docs/linux-directory/ldap/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/ldap/</guid>
      <description>&lt;h1 id=&#34;read-only-ldap-gateway&#34;&gt;Read-only LDAP gateway&lt;/h1&gt;&#xA;&lt;p&gt;lindir can project SQL users and groups as a &lt;strong&gt;read-only LDAP&lt;/strong&gt; directory for apps that only speak LDAP (Grafana LDAP auth, some NAS/NAS-like tools, legacy clients). SQL remains the system of record; NSS on hosts still uses the Linux client / extrausers path.&lt;/p&gt;&#xA;&lt;h2 id=&#34;enable&#34;&gt;Enable&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ldap&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;listenHost&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;listenPort&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1389&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;baseDn&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dc=lindir,dc=local&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;allowAnonymous&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Default port &lt;strong&gt;1389&lt;/strong&gt; (non-root). Set &lt;code&gt;enabled: true&lt;/code&gt; to start a background LDAP listener beside the HTTP API. In production, set &lt;code&gt;allowAnonymous: false&lt;/code&gt; (&lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/owasp/&#34;&gt;OWASP Controls&lt;/a&gt; A02).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reference labs</title>
      <link>https://www.macondobits.com/docs/linux-directory/lab/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/lab/</guid>
      <description>&lt;h1 id=&#34;reference-labs&#34;&gt;Reference labs&lt;/h1&gt;&#xA;&lt;p&gt;Two kinds of lab work sit beside the product docs: &lt;strong&gt;orientation&lt;/strong&gt; against other IdM systems, and &lt;strong&gt;regression&lt;/strong&gt; of Linux Directory itself across real guest images.&lt;/p&gt;&#xA;&lt;h2 id=&#34;linux-directory-isolated-e2e-lab&#34;&gt;Linux Directory isolated e2e lab&lt;/h2&gt;&#xA;&lt;p&gt;The in-tree stack under &lt;code&gt;scripts/integration/e2e-lab/&lt;/code&gt; brings up IdP + Postgres, Headscale, Nextcloud, and &lt;strong&gt;six fleet guests&lt;/strong&gt; (Ubuntu, Debian, Arch-as-CachyOS-stand-in, Fedora, openSUSE Leap, Rocky). It is the place that encoded day-one IdM, enroll/sync, Headscale mesh, Nextcloud SSO, console, and retire — see &lt;code&gt;README.md&lt;/code&gt; and &lt;code&gt;CHECKLIST.md&lt;/code&gt; there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Storage</title>
      <link>https://www.macondobits.com/docs/linux-directory/storage/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/storage/</guid>
      <description>&lt;h1 id=&#34;sql-storage&#34;&gt;SQL storage&lt;/h1&gt;&#xA;&lt;p&gt;Persistent state for lindir lives in &lt;strong&gt;PostgreSQL&lt;/strong&gt; or &lt;strong&gt;MySQL/MariaDB&lt;/strong&gt;. Development can use &lt;code&gt;memory://&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;choice-at-deploy-time&#34;&gt;Choice at deploy time&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Config&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;dbEngine&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;postgres&lt;/code&gt; (default) or &lt;code&gt;mysql&lt;/code&gt; / &lt;code&gt;mariadb&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;dbDsn&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Connection URL, or &lt;code&gt;memory://&lt;/code&gt; for local/dev without a DB&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Full sample files in the Lindir tree (identical keys; only engine/DSN and bootstrap hardening differ): &lt;code&gt;config.example.json&lt;/code&gt; (&lt;code&gt;memory://&lt;/code&gt;), &lt;code&gt;config.postgres.example.json&lt;/code&gt;, &lt;code&gt;config.mysql.example.json&lt;/code&gt;. Field-by-field reference: &lt;a href=&#34;https://www.macondobits.com/docs/linux-directory/#43-server-config-reference&#34;&gt;Operator handbook §4.3&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;memory://&lt;/code&gt; (also bare &lt;code&gt;memory&lt;/code&gt; or empty DSN) always uses the in-process store; &lt;code&gt;dbEngine&lt;/code&gt; is ignored for that DSN.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The landscape of Linux identity systems</title>
      <link>https://www.macondobits.com/docs/linux-directory/alternatives/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/alternatives/</guid>
      <description>&lt;h1 id=&#34;the-landscape-of-linux-identity-systems&#34;&gt;The landscape of Linux identity systems&lt;/h1&gt;&#xA;&lt;p&gt;A quiet survey of how communities have gathered users, hosts, and policy under one roof — and where &lt;strong&gt;Linux Directory&lt;/strong&gt; (&lt;code&gt;lindir&lt;/code&gt;) sits among them: a greenfield IdM with a D server backend, PostgreSQL or MySQL storage, first-class CachyOS and Ubuntu support, and optional pluggable Tailscale/VPN.&lt;/p&gt;&#xA;&lt;h2 id=&#34;scope&#34;&gt;Scope&lt;/h2&gt;&#xA;&lt;p&gt;Linux Directory centers on &lt;strong&gt;identity and host enrollment/policy&lt;/strong&gt; (users, groups, hosts, auth, sudo/HBAC, SSH keys) and optional &lt;strong&gt;mesh VPN&lt;/strong&gt; management, with &lt;strong&gt;native fleet&lt;/strong&gt; care: apt/pacman/dnf/zypper packages, energy policies, vulnerability findings, inventory, and remote queries/scripts. Groupware and mail live in companions such as Nextcloud via OIDC.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TLS certificates for fleet hosts</title>
      <link>https://www.macondobits.com/docs/linux-directory/certificates/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.macondobits.com/docs/linux-directory/certificates/</guid>
      <description>&lt;h1 id=&#34;tls-certificates-for-fleet-hosts&#34;&gt;TLS certificates for fleet hosts&lt;/h1&gt;&#xA;&lt;p&gt;Public names on the open network are a kind of address in space: browsers, APIs, and reverse proxies ask whether the machine answering that name is the one they meant to reach. &lt;strong&gt;TLS certificates&lt;/strong&gt; are how we answer that question with cryptography instead of hope. Linux Directory helps you issue and renew those certificates on enrolled hosts through a &lt;strong&gt;native ACME client&lt;/strong&gt; inside &lt;code&gt;lindir-client&lt;/code&gt; — no certbot dependency, no separate certificate daemon required for the common case.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
