docs: add full documentation site with CyberQueer HTML theme
9 Markdown pages covering installation, theming, Hyprland, editors, modules, archiso, FreeIPA/Ansible, and utilities. md-to-html.sh converts them to self-contained styled HTML using the live palette from colors.conf with inline CyberQueer CSS. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>main
parent
f1ea6dcb54
commit
8128ae84e4
|
|
@ -0,0 +1,432 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Archiso — Custom Live Installer — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="archiso-custom-live-installer">Archiso — Custom Live Installer<a class="toc-anchor" href="#archiso-custom-live-installer" title="Permanent link">¶</a></h1>
|
||||
<p>The archiso build system produces a bootable Arch Linux ISO pre-loaded with the M-Archy installer scripts. Optionally, an answerfile can be embedded so the entire install — base OS + dotfiles — runs with zero user interaction.</p>
|
||||
<hr />
|
||||
<h2 id="prerequisites">Prerequisites<a class="toc-anchor" href="#prerequisites" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash">sudo pacman -S archiso jq
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="building-the-iso">Building the ISO<a class="toc-anchor" href="#building-the-iso" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash"># Basic build — interactive installer, no answerfile
|
||||
bash setup/archiso/build.sh
|
||||
|
||||
# Specify output directory
|
||||
bash setup/archiso/build.sh /path/to/output
|
||||
|
||||
# Embed an answerfile for automated deployment
|
||||
bash setup/archiso/build.sh --preconf
|
||||
|
||||
# Embed a specific answerfile
|
||||
bash setup/archiso/build.sh --preconf ~/my-server.json
|
||||
|
||||
# Both flags together
|
||||
bash setup/archiso/build.sh --preconf ~/my-server.json /media/usb/output
|
||||
</code></pre>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Effect</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><em>(none)</em></td>
|
||||
<td>Clean ISO, no answerfile</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--preconf</code></td>
|
||||
<td>Embed <code>~/answerfile.json</code> at <code>/answerfile.json</code> in the ISO</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--preconf FILE</code></td>
|
||||
<td>Embed the specified file instead</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Build artefacts land in <code>~/m-archy-out/</code> by default. Override with the <code>OUT_DIR</code> environment variable or by passing a path argument.</p>
|
||||
<h3 id="environment-variables">Environment Variables<a class="toc-anchor" href="#environment-variables" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Variable</th>
|
||||
<th>Default</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>WORK_DIR</code></td>
|
||||
<td><code>~/m-archy-build</code></td>
|
||||
<td>Scratch space for mkarchiso</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OUT_DIR</code></td>
|
||||
<td><code>~/m-archy-out</code></td>
|
||||
<td>ISO output directory</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="what-the-build-does">What the Build Does<a class="toc-anchor" href="#what-the-build-does" title="Permanent link">¶</a></h2>
|
||||
<ol>
|
||||
<li>Copies the upstream <code>releng</code> Arch base profile</li>
|
||||
<li>Applies the M-Archy overlay (<code>setup/archiso/overlay/</code>)</li>
|
||||
<li>Replaces <code>profiledef.sh</code> with the M-Archy version</li>
|
||||
<li>Adds extra packages from <code>packages.extra</code></li>
|
||||
<li>Embeds both installer scripts (<code>arch-autoinstall.sh</code>, <code>archbaseos-guided-install.sh</code>) into <code>/root/installer/</code></li>
|
||||
<li>If <code>--preconf</code>: copies the answerfile to <code>/answerfile.json</code> in the ISO's airootfs</li>
|
||||
<li>Runs <code>mkarchiso</code> to produce the final <code>.iso</code></li>
|
||||
</ol>
|
||||
<hr />
|
||||
<h2 id="extra-packages-on-the-live-system">Extra Packages on the Live System<a class="toc-anchor" href="#extra-packages-on-the-live-system" title="Permanent link">¶</a></h2>
|
||||
<p>Defined in <code>setup/archiso/overlay/packages.extra</code>:</p>
|
||||
<pre><code>git
|
||||
jq
|
||||
pam-u2f
|
||||
btop
|
||||
fastfetch
|
||||
openssh
|
||||
</code></pre>
|
||||
<p>These are added on top of the standard Arch <code>releng</code> package set.</p>
|
||||
<hr />
|
||||
<h2 id="live-system-entry-points">Live System Entry Points<a class="toc-anchor" href="#live-system-entry-points" title="Permanent link">¶</a></h2>
|
||||
<p>Once booted from the ISO, the following are available:</p>
|
||||
<h3 id="install-arch"><code>install-arch</code><a class="toc-anchor" href="#install-arch" title="Permanent link">¶</a></h3>
|
||||
<p>A command placed in <code>/usr/local/bin/</code>:</p>
|
||||
<pre><code class="language-bash">install-arch # guided mode (default)
|
||||
install-arch guided # guided interactive install
|
||||
install-arch auto # automated mode (reads /answerfile.json)
|
||||
</code></pre>
|
||||
<h3 id="rootlaunchsh"><code>/root/launch.sh</code><a class="toc-anchor" href="#rootlaunchsh" title="Permanent link">¶</a></h3>
|
||||
<p>Internal dispatcher used by <code>install-arch</code>.</p>
|
||||
<h3 id="answerfilejson"><code>/answerfile.json</code><a class="toc-anchor" href="#answerfilejson" title="Permanent link">¶</a></h3>
|
||||
<p>Only present when built with <code>--preconf</code>. Both installer scripts check for this file on startup. If found, all prompts are answered from it — the only interaction required is the disk-encryption password (passwords are never stored in answerfiles).</p>
|
||||
<hr />
|
||||
<h2 id="automated-deployment-workflow">Automated Deployment Workflow<a class="toc-anchor" href="#automated-deployment-workflow" title="Permanent link">¶</a></h2>
|
||||
<pre><code>┌─────────────────────────────────────┐
|
||||
│ Developer machine │
|
||||
│ │
|
||||
│ 1. generate-answerfile.sh │
|
||||
│ → ~/answerfile.json │
|
||||
│ │
|
||||
│ 2. build.sh --preconf │
|
||||
│ → ~/m-archy-out/m-archy.iso │
|
||||
│ │
|
||||
│ 3. dd if=m-archy.iso of=/dev/sdX │
|
||||
└──────────────┬──────────────────────┘
|
||||
│ USB
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Target machine (boots from USB) │
|
||||
│ │
|
||||
│ 4. install-arch auto │
|
||||
│ reads /answerfile.json │
|
||||
│ installs base OS │
|
||||
│ runs tui-install.sh in chroot │
|
||||
│ installs dotfiles & apps │
|
||||
│ │
|
||||
│ 5. Reboot → ready system │
|
||||
└─────────────────────────────────────┘
|
||||
</code></pre>
|
||||
<p>For multi-machine deployments, the <code>hostname</code> field in the answerfile is combined with the machine's MAC address, so each system gets a unique hostname even though they share the same answerfile.</p>
|
||||
<hr />
|
||||
<h2 id="overlay-structure">Overlay Structure<a class="toc-anchor" href="#overlay-structure" title="Permanent link">¶</a></h2>
|
||||
<pre><code>setup/archiso/overlay/
|
||||
├── airootfs/
|
||||
│ ├── etc/motd # Welcome message
|
||||
│ ├── root/
|
||||
│ │ └── launch.sh # Installer entry point
|
||||
│ └── usr/local/bin/
|
||||
│ └── install-arch # User-facing CLI command
|
||||
├── packages.extra # Additional live-system packages
|
||||
└── profiledef.sh # M-Archy ISO profile definition
|
||||
</code></pre>
|
||||
<p>The <code>build.sh</code> script also adds at build time:</p>
|
||||
<pre><code>airootfs/root/installer/
|
||||
├── arch-autoinstall.sh
|
||||
└── archbaseos-guided-install.sh
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="writing-the-iso-to-usb">Writing the ISO to USB<a class="toc-anchor" href="#writing-the-iso-to-usb" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash"># Find the USB drive
|
||||
lsblk
|
||||
|
||||
# Write (replace /dev/sdX with your drive — ALL DATA WILL BE ERASED)
|
||||
sudo dd if=~/m-archy-out/m-archy-*.iso of=/dev/sdX bs=4M status=progress oflag=sync
|
||||
</code></pre>
|
||||
<p>Or use <code>ventoy</code> / <code>balenaEtcher</code> as alternatives.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,575 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Editors — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="editors">Editors<a class="toc-anchor" href="#editors" title="Permanent link">¶</a></h1>
|
||||
<p>Three editors are configured and deployed by the <code>shell</code> component: Neovim (primary), Micro (lightweight), and Yazi (terminal file manager).</p>
|
||||
<hr />
|
||||
<h2 id="neovim">Neovim<a class="toc-anchor" href="#neovim" title="Permanent link">¶</a></h2>
|
||||
<p>Config lives in <code>nvim/</code>. Deployed to <code>~/.config/nvim/</code> during <code>shell</code> module install.</p>
|
||||
<h3 id="plugin-manager">Plugin Manager<a class="toc-anchor" href="#plugin-manager" title="Permanent link">¶</a></h3>
|
||||
<p><a href="https://github.com/junegunn/vim-plug">vim-plug</a> is auto-installed on first launch. Run <code>:PlugInstall</code> after the first start to fetch all plugins.</p>
|
||||
<h3 id="plugins">Plugins<a class="toc-anchor" href="#plugins" title="Permanent link">¶</a></h3>
|
||||
<h4 id="language-completion">Language & Completion<a class="toc-anchor" href="#language-completion" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>neoclide/coc.nvim</code></td>
|
||||
<td>LSP client, auto-completion, diagnostics</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>rust-lang/rust.vim</code></td>
|
||||
<td>Rust filetype support</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>nvim-telescope/telescope.nvim</code></td>
|
||||
<td>Fuzzy finder (files, grep, LSP symbols)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="ui">UI<a class="toc-anchor" href="#ui" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>vim-airline/vim-airline</code></td>
|
||||
<td>Status bar</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>vim-airline/vim-airline-themes</code></td>
|
||||
<td>Airline theme collection</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>junegunn/goyo.vim</code></td>
|
||||
<td>Distraction-free writing mode</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>voldikss/vim-floaterm</code></td>
|
||||
<td>Floating terminal windows</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>norcalli/nvim-colorizer.lua</code></td>
|
||||
<td>Inline colour preview</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="navigation">Navigation<a class="toc-anchor" href="#navigation" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>preservim/nerdtree</code></td>
|
||||
<td>File tree sidebar</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>junegunn/fzf</code> + <code>fzf.vim</code></td>
|
||||
<td>Fuzzy file/buffer search</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>elihunter173/dirbuf.nvim</code></td>
|
||||
<td>Editable directory buffer</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="snippets">Snippets<a class="toc-anchor" href="#snippets" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>SirVer/ultisnips</code></td>
|
||||
<td>Snippet engine</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>honza/vim-snippets</code></td>
|
||||
<td>Snippet collection</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="database">Database<a class="toc-anchor" href="#database" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>tpope/vim-dadbod</code></td>
|
||||
<td>Database query runner</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kristijanhusak/vim-dadbod-ui</code></td>
|
||||
<td>GUI for vim-dadbod</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="markdown">Markdown<a class="toc-anchor" href="#markdown" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>tadmccorkle/markdown.nvim</code></td>
|
||||
<td>Enhanced Markdown support</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ellisonleao/glow.nvim</code></td>
|
||||
<td>Markdown preview in terminal</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4 id="theme">Theme<a class="toc-anchor" href="#theme" title="Permanent link">¶</a></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>the_miro/cyberqueer.nvim</code></td>
|
||||
<td>CyberQueer colour scheme (local)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="coc-lsp-settings">CoC LSP Settings<a class="toc-anchor" href="#coc-lsp-settings" title="Permanent link">¶</a></h3>
|
||||
<p><code>nvim/coc-settings.json</code> configures language servers for:
|
||||
- Python (pyright)
|
||||
- Lua (lua-language-server)
|
||||
- Rust (rust-analyzer via rust.vim)</p>
|
||||
<h3 id="cyberqueer-airline-theme">CyberQueer Airline Theme<a class="toc-anchor" href="#cyberqueer-airline-theme" title="Permanent link">¶</a></h3>
|
||||
<p><code>nvim/cyberqueer-airline.vim</code> — a custom vim-airline theme using the CyberQueer palette, providing hot-pink/violet segments in the status bar.</p>
|
||||
<hr />
|
||||
<h2 id="micro">Micro<a class="toc-anchor" href="#micro" title="Permanent link">¶</a></h2>
|
||||
<p>A modern, keyboard-friendly terminal editor. Config in <code>micro/</code>. Deployed to <code>~/.config/micro/</code>.</p>
|
||||
<h3 id="settings-settingsjson">Settings (<code>settings.json</code>)<a class="toc-anchor" href="#settings-settingsjson" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Value</th>
|
||||
<th>Effect</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>colorscheme</code></td>
|
||||
<td><code>miro-darcula</code></td>
|
||||
<td>Custom dark colour scheme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Various</td>
|
||||
<td>—</td>
|
||||
<td>File-type-specific settings</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="keybindings-bindingsjson">Keybindings (<code>bindings.json</code>)<a class="toc-anchor" href="#keybindings-bindingsjson" title="Permanent link">¶</a></h3>
|
||||
<p>Custom keybindings extending Micro's defaults. See <code>micro/bindings.json</code> for the full list.</p>
|
||||
<h3 id="colour-schemes">Colour Schemes<a class="toc-anchor" href="#colour-schemes" title="Permanent link">¶</a></h3>
|
||||
<p><code>micro/colorschemes/</code> contains additional colour scheme definitions including the custom <code>miro-darcula</code> scheme.</p>
|
||||
<h3 id="plugins-microplug">Plugins (<code>micro/plug/</code>)<a class="toc-anchor" href="#plugins-microplug" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Plugin</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>filemanager</code></td>
|
||||
<td>Sidebar file browser</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mlsp</code></td>
|
||||
<td>Language Server Protocol integration</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="yazi">Yazi<a class="toc-anchor" href="#yazi" title="Permanent link">¶</a></h2>
|
||||
<p>A fast, feature-rich terminal file manager written in Rust.<br />
|
||||
Config in <code>yazi/</code>. Deployed to <code>~/.config/yazi/</code>.</p>
|
||||
<h3 id="configuration-files">Configuration Files<a class="toc-anchor" href="#configuration-files" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>File</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>yazi.toml</code></td>
|
||||
<td>Core settings (openers, file rules, display)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>theme.toml</code></td>
|
||||
<td>CyberQueer colour palette</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>keymap.toml</code></td>
|
||||
<td>Keybindings (17 KB, extensively customised)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="theme_1">Theme<a class="toc-anchor" href="#theme_1" title="Permanent link">¶</a></h3>
|
||||
<p><code>yazi/theme.toml</code> maps the CyberQueer colours to Yazi's theme variables. It is a colour-substitution target in <code>apply-theme.sh</code>, so it updates automatically when you change the palette.</p>
|
||||
<h3 id="file-openers">File Openers<a class="toc-anchor" href="#file-openers" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>File type</th>
|
||||
<th>Opens with</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>*.svg</code></td>
|
||||
<td>Inkscape</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Text files</td>
|
||||
<td>Neovim</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Everything else</td>
|
||||
<td><code>xdg-open</code> (system default)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="display-options">Display Options<a class="toc-anchor" href="#display-options" title="Permanent link">¶</a></h3>
|
||||
<ul>
|
||||
<li>Hidden files visible by default</li>
|
||||
<li>Symlinks shown and followed</li>
|
||||
<li>Three-pane layout (parent, current, preview)</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h2 id="launching-editors">Launching Editors<a class="toc-anchor" href="#launching-editors" title="Permanent link">¶</a></h2>
|
||||
<p>From the Hyprland desktop:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Shortcut</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Super + M</code></td>
|
||||
<td>Open Micro in Kitty</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + E</code></td>
|
||||
<td>Open Yazi in Kitty</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + T</code> then <code>nvim</code></td>
|
||||
<td>Neovim in terminal</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>From the shell:</p>
|
||||
<pre><code class="language-bash">nvim file.rs # Neovim
|
||||
micro config.yaml # Micro
|
||||
yazi # Yazi file manager
|
||||
</code></pre>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,441 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>FreeIPA & Ansible — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="freeipa-ansible">FreeIPA & Ansible<a class="toc-anchor" href="#freeipa-ansible" title="Permanent link">¶</a></h1>
|
||||
<p>The FreeIPA/Ansible system provides centralised identity management for a fleet of Arch Linux machines: single sign-on, host-group-driven package and module deployment, LUKS backup key collection, and automatic Keycloak configuration.</p>
|
||||
<p>All relevant files live under <code>setup/modules/FreeipaAnsible/</code>.</p>
|
||||
<hr />
|
||||
<h2 id="architecture">Architecture<a class="toc-anchor" href="#architecture" title="Permanent link">¶</a></h2>
|
||||
<pre><code>┌────────────────────────────────────┐
|
||||
│ FreeIPA Server │
|
||||
│ (can run in Docker / LXC) │
|
||||
│ │
|
||||
│ • User/host directory │
|
||||
│ • Kerberos KDC │
|
||||
│ • DNS (optional) │
|
||||
│ • Host group management │
|
||||
└──────────┬─────────────────────────┘
|
||||
│ SSSD / Kerberos
|
||||
▼
|
||||
┌────────────────────────────────────┐
|
||||
│ Enrolled client machine │
|
||||
│ │
|
||||
│ • sssd — authentication │
|
||||
│ • ipa CLI — host group queries │
|
||||
│ • Ansible-deployed timers │
|
||||
│ ├── package installer │
|
||||
│ ├── module installer │
|
||||
│ ├── Flatpak installer │
|
||||
│ └── baseuser group sync │
|
||||
└────────────────────────────────────┘
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="freeipa-server">FreeIPA Server<a class="toc-anchor" href="#freeipa-server" title="Permanent link">¶</a></h2>
|
||||
<h3 id="docker-oci-image">Docker / OCI Image<a class="toc-anchor" href="#docker-oci-image" title="Permanent link">¶</a></h3>
|
||||
<p>A pre-built Docker image is available via <code>setup/modules/FreeipaAnsible/image/</code>:</p>
|
||||
<pre><code class="language-bash">cd setup/modules/FreeipaAnsible/image
|
||||
cp .env.example .env
|
||||
# Edit .env with your domain, admin password, realm, etc.
|
||||
docker compose up -d
|
||||
</code></pre>
|
||||
<p>The container runs <code>ipa-first-boot.sh</code> on first start to initialise the IPA instance, then optionally <code>keycloak-configure.sh</code> to wire up Keycloak as an OIDC provider.</p>
|
||||
<h3 id="interactive-server-setup">Interactive Server Setup<a class="toc-anchor" href="#interactive-server-setup" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash setup/modules/optional-Modules/apps/freeipa-server.sh
|
||||
</code></pre>
|
||||
<p>Prompts for realm, domain, admin password, and whether to generate client-install scripts.</p>
|
||||
<hr />
|
||||
<h2 id="client-enrollment">Client Enrollment<a class="toc-anchor" href="#client-enrollment" title="Permanent link">¶</a></h2>
|
||||
<h3 id="via-installer-module">Via Installer Module<a class="toc-anchor" href="#via-installer-module" title="Permanent link">¶</a></h3>
|
||||
<p>Select <code>freeipa-client</code> during <code>tui-install.sh</code> or <code>install-modules.sh</code>.</p>
|
||||
<h3 id="manual-enrollment">Manual Enrollment<a class="toc-anchor" href="#manual-enrollment" title="Permanent link">¶</a></h3>
|
||||
<p>Three modes:</p>
|
||||
<pre><code class="language-bash"># Answerfile mode (unattended)
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh \
|
||||
--answerfile setup/modules/FreeipaAnsible/freeipa-client-answerfile.json
|
||||
|
||||
# Interactive prompts
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh --interactive
|
||||
|
||||
# Direct flag passthrough to freeipa-enroll.sh
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh \
|
||||
--domain freeipa.example.com \
|
||||
--server ipa.example.com \
|
||||
--principal admin
|
||||
</code></pre>
|
||||
<h3 id="client-answerfile-schema">Client Answerfile Schema<a class="toc-anchor" href="#client-answerfile-schema" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-json">{
|
||||
"domain": "freeipa.abdelbaki.eu",
|
||||
"realm": "FREEIPA.ABDELBAKI.EU",
|
||||
"server": "freeipa.abdelbaki.eu",
|
||||
"hostname": "",
|
||||
"principal": "admin",
|
||||
"password": "",
|
||||
"mkhomedir": true,
|
||||
"sudo": true,
|
||||
"dns_update": true,
|
||||
"ntp_server": "",
|
||||
"fido2": false,
|
||||
"fido2_users": []
|
||||
}
|
||||
</code></pre>
|
||||
<p>Leave <code>hostname</code> blank to use the current machine hostname. Leave <code>password</code> blank to be prompted at enrollment time.</p>
|
||||
<hr />
|
||||
<h2 id="ansible-playbooks">Ansible Playbooks<a class="toc-anchor" href="#ansible-playbooks" title="Permanent link">¶</a></h2>
|
||||
<p>All playbooks live in <code>setup/modules/FreeipaAnsible/ansible/</code> and require an inventory of enrolled IPA clients.</p>
|
||||
<h3 id="deploy-package-auto-installer">Deploy Package Auto-Installer<a class="toc-anchor" href="#deploy-package-auto-installer" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">ansible-playbook -i inventory deploy-ansipa-install.yml
|
||||
</code></pre>
|
||||
<p>Deploys <code>ansipa-install-packages.sh</code> + a systemd timer that runs every 30 minutes. The script queries IPA for host groups named <code>ansipa-install-<package></code> and installs/removes packages to match.</p>
|
||||
<p><strong>Group naming convention:</strong> <code>ansipa-install-firefox</code> → installs the <code>firefox</code> package.</p>
|
||||
<h3 id="deploy-module-auto-installer">Deploy Module Auto-Installer<a class="toc-anchor" href="#deploy-module-auto-installer" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">ansible-playbook -i inventory deploy-ansipa-modules.yml \
|
||||
[-e ansipa_user=amir]
|
||||
</code></pre>
|
||||
<p>Deploys <code>ansipa-install-modules.sh</code> + timer. Queries for groups named <code>ansipa-module-<name></code> and runs the matching script from <code>/usr/local/lib/ansipa-modules/<name>.sh</code>.</p>
|
||||
<p>Module scripts are the same ones used by <code>install-modules.sh</code> — copied from <code>setup/modules/optional-Modules/apps/*.sh</code>.</p>
|
||||
<p><strong>Group naming convention:</strong> <code>ansipa-module-docker</code> → runs <code>docker.sh</code> on the host.</p>
|
||||
<p>Each module is applied once and stamped in <code>/var/lib/ansipa-modules/<name>.done</code>. Re-running the timer skips already-applied modules.</p>
|
||||
<h3 id="deploy-baseuser-sync">Deploy BaseUser Sync<a class="toc-anchor" href="#deploy-baseuser-sync" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">ansible-playbook -i inventory deploy-baseuser-sync.yml
|
||||
</code></pre>
|
||||
<p>Deploys a <code>systemd.path</code> unit that triggers whenever a user logs in. If the user is a member of the IPA <code>BaseUser</code> group, they are automatically added to the local <code>baseusers</code> group — useful for desktop permission grants.</p>
|
||||
<h3 id="collect-luks-backup-keys">Collect LUKS Backup Keys<a class="toc-anchor" href="#collect-luks-backup-keys" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">ansible-playbook -i inventory collect-luks-keys.yml \
|
||||
[-e luks_keys_store=/secure/location]
|
||||
</code></pre>
|
||||
<p>For each enrolled host, checks for <code>/_LUKS_BACKUP_KEY</code> (placed there by the M-Archy installer when disk encryption is enabled) and fetches it to the controller as:</p>
|
||||
<pre><code><luks_keys_store>/<HOSTNAME>_LUKS_BACKUP_KEY
|
||||
</code></pre>
|
||||
<p>Keys are stored with mode <code>0400</code>. The store directory is created with mode <code>0700</code>.</p>
|
||||
<p><strong>Schedule for automatic collection:</strong></p>
|
||||
<pre><code class="language-bash"># Add to crontab on the Ansible controller
|
||||
0 3 * * * cd /path/to/playbooks && ansible-playbook -i inventory collect-luks-keys.yml
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="host-group-reference">Host Group Reference<a class="toc-anchor" href="#host-group-reference" title="Permanent link">¶</a></h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Group prefix</th>
|
||||
<th>Handled by</th>
|
||||
<th>Effect</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>ansipa-install-<pkg></code></td>
|
||||
<td><code>ansipa-install-packages.sh</code></td>
|
||||
<td>Install/remove native package</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ansipa-module-<name></code></td>
|
||||
<td><code>ansipa-install-modules.sh</code></td>
|
||||
<td>Run module script once</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>fp_install-<app></code></td>
|
||||
<td><code>ansipa-install-flatpaks.sh</code></td>
|
||||
<td>Install Flatpak app</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>BaseUser</code></td>
|
||||
<td><code>auto-add-baseuser.sh</code></td>
|
||||
<td>Add user to local <code>baseusers</code> group</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="luks-key-flow">LUKS Key Flow<a class="toc-anchor" href="#luks-key-flow" title="Permanent link">¶</a></h2>
|
||||
<pre><code> Install time (arch-autoinstall.sh or archbaseos-guided-install.sh)
|
||||
─────────────────────────────────────────────────────────────────
|
||||
1. User sets primary LUKS passphrase interactively
|
||||
2. 64-byte random key generated from /dev/urandom
|
||||
3. Key enrolled in second LUKS slot
|
||||
4. Key written to /_LUKS_BACKUP_KEY (mode 0400, root-only)
|
||||
inside the encrypted Btrfs volume
|
||||
|
||||
Post-install (Ansible)
|
||||
──────────────────────
|
||||
5. collect-luks-keys.yml runs from the controller
|
||||
6. Fetches /_LUKS_BACKUP_KEY from each client
|
||||
7. Stores as luks-keys/<HOSTNAME>_LUKS_BACKUP_KEY (mode 0400)
|
||||
on the controller
|
||||
</code></pre>
|
||||
<p>The backup key lives inside the encrypted partition, so it is only accessible when the disk is already unlocked. Its purpose is to allow an admin to unlock the disk for recovery without knowing the user's passphrase.</p>
|
||||
<hr />
|
||||
<h2 id="auto-enrollment-ansible">Auto Enrollment + Ansible<a class="toc-anchor" href="#auto-enrollment-ansible" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash">bash setup/modules/FreeipaAnsible/auto-enroll-ansible.sh
|
||||
</code></pre>
|
||||
<p>Combines FreeIPA client enrollment and Ansible deployment in one shot. Useful for provisioning scripts that run on first boot.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,780 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Hyprland Desktop Environment — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="hyprland-desktop-environment">Hyprland Desktop Environment<a class="toc-anchor" href="#hyprland-desktop-environment" title="Permanent link">¶</a></h1>
|
||||
<p>The Hyprland setup is the primary desktop environment — a Wayland compositor with a full ecosystem of bars, launchers, notification daemons, and theming tools.</p>
|
||||
<hr />
|
||||
<h2 id="overview">Overview<a class="toc-anchor" href="#overview" title="Permanent link">¶</a></h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Component</th>
|
||||
<th>Role</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Hyprland</strong></td>
|
||||
<td>Wayland tiling compositor (dwindle layout)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Kitty</strong></td>
|
||||
<td>Primary terminal emulator</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>EWW</strong></td>
|
||||
<td>Status bar (three device variants)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Waybar</strong></td>
|
||||
<td>Alternative status bar</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Wofi</strong></td>
|
||||
<td>App launcher (keyboard-driven)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Walker</strong></td>
|
||||
<td>Fast CLI launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>uLauncher</strong></td>
|
||||
<td>GUI app launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Dunst</strong></td>
|
||||
<td>Notification daemon</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Hyprlock</strong></td>
|
||||
<td>Screen locker</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Hyprpaper</strong></td>
|
||||
<td>Wallpaper daemon</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Hypridle</strong></td>
|
||||
<td>Idle management (sleep, lock)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>nwg-dock</strong></td>
|
||||
<td>Application dock</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>nwg-drawer</strong></td>
|
||||
<td>Application drawer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>nwg-panel</strong></td>
|
||||
<td>Desktop menu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Vicinae</strong></td>
|
||||
<td>Gesture-triggered context launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>ly</strong></td>
|
||||
<td>TUI login manager</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="config-file-map">Config File Map<a class="toc-anchor" href="#config-file-map" title="Permanent link">¶</a></h2>
|
||||
<pre><code>desktopenvs/hyprland/
|
||||
├── hypr/
|
||||
│ ├── hyprland.conf # Root config — imports all below
|
||||
│ ├── hyprtoolkit.conf # Toolkit utilities
|
||||
│ ├── hyprlock.conf # Lock screen
|
||||
│ ├── hypridle.conf # Idle timeouts
|
||||
│ └── hyprpaper.conf # Wallpaper
|
||||
├── hypr-usr/ # Per-user override layer
|
||||
│ ├── binds.conf # All keybindings
|
||||
│ ├── input.conf # Keyboard/mouse settings
|
||||
│ ├── monitors.conf # Display layout
|
||||
│ ├── windowrules.conf # Per-app behaviour rules
|
||||
│ └── autostart.conf # Startup programs
|
||||
├── kitty/
|
||||
│ ├── kitty.conf # Terminal config
|
||||
│ ├── current-theme.conf # Active palette (CyberQueer)
|
||||
│ └── themes/cyberqueer.conf # Theme definition
|
||||
├── waybar/
|
||||
│ ├── config # Module layout and data sources
|
||||
│ └── style.css # CyberQueer styling
|
||||
├── wofi/style.css # Launcher styling
|
||||
├── walker/themes/ # Walker theme (cyberqueer.css)
|
||||
├── dunst/ # Notification styling
|
||||
├── eww/ # EWW bar (PC — no battery)
|
||||
├── eww-nobattery/ # EWW bar alias
|
||||
├── eww-touch/ # EWW bar (tablet / touchscreen)
|
||||
├── spicetify/ # Spotify CyberQueer themes
|
||||
├── Vencord/ # Discord CyberQueer themes
|
||||
├── btop/ # System monitor + cyberqueer.theme
|
||||
├── scripts/ # 20+ utility scripts
|
||||
└── config-updater/ # Config synchronisation tool
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="keybindings">Keybindings<a class="toc-anchor" href="#keybindings" title="Permanent link">¶</a></h2>
|
||||
<p>All bindings live in <code>hypr-usr/binds.conf</code>.</p>
|
||||
<h3 id="applications">Applications<a class="toc-anchor" href="#applications" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Binding</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Super + T</code></td>
|
||||
<td>Kitty terminal</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Shift + T</code></td>
|
||||
<td>Cool Retro Term (CRT profile)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + M</code></td>
|
||||
<td>Micro editor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + E</code></td>
|
||||
<td>Thunar file manager</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + X</code></td>
|
||||
<td>Wofi app launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + F</code></td>
|
||||
<td>File search (wofi)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Shift + F</code></td>
|
||||
<td>Folder search (wofi)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="window-management">Window Management<a class="toc-anchor" href="#window-management" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Binding</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Super + Q</code></td>
|
||||
<td>Close focused window</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + V</code></td>
|
||||
<td>Toggle floating</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Shift + V</code></td>
|
||||
<td>Centre floating window</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + P</code></td>
|
||||
<td>Toggle pseudo-tiling</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + J</code></td>
|
||||
<td>Toggle split direction</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Arrow / hjkl</code></td>
|
||||
<td>Focus window by direction</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Shift + Arrow / hjkl</code></td>
|
||||
<td>Move window by direction</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + [0-9]</code></td>
|
||||
<td>Switch workspace</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Shift + [0-9]</code></td>
|
||||
<td>Move window to workspace</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + mouse drag</code></td>
|
||||
<td>Move/resize floating window</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="system">System<a class="toc-anchor" href="#system" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Binding</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Super + O</code></td>
|
||||
<td>Lock screen (hyprlock)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Alt + O</code></td>
|
||||
<td>Power menu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Ctrl + O</code></td>
|
||||
<td>Shutdown immediately</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Z</code></td>
|
||||
<td>Toggle EWW bar</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Super + Ctrl + P</code></td>
|
||||
<td>Start screen recording</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="touchpad-gestures">Touchpad Gestures<a class="toc-anchor" href="#touchpad-gestures" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Gesture</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>3-finger swipe left/right</td>
|
||||
<td>Switch workspace</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3-finger swipe up/down</td>
|
||||
<td>Move window to workspace</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3-finger pinch</td>
|
||||
<td>Toggle overview</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4-finger tap</td>
|
||||
<td>Open launcher</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="status-bar-eww">Status Bar (EWW)<a class="toc-anchor" href="#status-bar-eww" title="Permanent link">¶</a></h2>
|
||||
<p>EWW (Elkowar's Wayland Window Manager) is compiled from source during Hyprland install and comes in three variants:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Variant</th>
|
||||
<th>Device</th>
|
||||
<th>Battery Widget</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>eww/</code></td>
|
||||
<td>Desktop PC</td>
|
||||
<td>No</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>eww-nobattery/</code></td>
|
||||
<td>Desktop PC</td>
|
||||
<td>No</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>eww-touch/</code></td>
|
||||
<td>Laptop / tablet</td>
|
||||
<td>Yes</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>During install the EWW installer asks which variant to use.</p>
|
||||
<h3 id="waybar">Waybar<a class="toc-anchor" href="#waybar" title="Permanent link">¶</a></h3>
|
||||
<p>An alternative to EWW — always installed. The bar layout:</p>
|
||||
<ul>
|
||||
<li><strong>Left</strong>: clock, disk usage, RAM, CPU, temperature</li>
|
||||
<li><strong>Centre</strong>: workspace switcher, active window title</li>
|
||||
<li><strong>Right</strong>: network speed, IP address, system tray, audio volume, battery (if present)</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h2 id="launchers">Launchers<a class="toc-anchor" href="#launchers" title="Permanent link">¶</a></h2>
|
||||
<h3 id="wofi">Wofi<a class="toc-anchor" href="#wofi" title="Permanent link">¶</a></h3>
|
||||
<p>Keyboard-driven app/file launcher. Activated with <code>Super + X</code>.<br />
|
||||
Config: <code>wofi/style.css</code> — themed with CyberQueer colours.</p>
|
||||
<h3 id="walker">Walker<a class="toc-anchor" href="#walker" title="Permanent link">¶</a></h3>
|
||||
<p>Fast CLI launcher (<code>walker</code>). Pre-configured with <code>walker/config.toml</code> and the <code>cyberqueer.css</code> / <code>cyberqueer.toml</code> theme files.</p>
|
||||
<h3 id="ulauncher">uLauncher<a class="toc-anchor" href="#ulauncher" title="Permanent link">¶</a></h3>
|
||||
<p>GUI launcher with plugin support. Theme: <code>ulauncher/user-themes/cyberqueer/</code>.<br />
|
||||
Colours in the theme are colour-substitution targets (updated by <code>apply-theme.sh</code>).</p>
|
||||
<hr />
|
||||
<h2 id="notification-daemon-dunst">Notification Daemon (Dunst)<a class="toc-anchor" href="#notification-daemon-dunst" title="Permanent link">¶</a></h2>
|
||||
<p>Lightweight notification daemon. Config in <code>dunst/dunstrc</code>.<br />
|
||||
Notifications appear top-right with CyberQueer styling.</p>
|
||||
<hr />
|
||||
<h2 id="lock-screen-hyprlock">Lock Screen (Hyprlock)<a class="toc-anchor" href="#lock-screen-hyprlock" title="Permanent link">¶</a></h2>
|
||||
<p><code>hyprlock</code> is the Wayland screen locker. Config at <code>hypr/hyprlock.conf</code>.<br />
|
||||
Activated by <code>Super + O</code> or automatically via <code>hypridle</code> after idle timeout.</p>
|
||||
<hr />
|
||||
<h2 id="scripts-reference">Scripts Reference<a class="toc-anchor" href="#scripts-reference" title="Permanent link">¶</a></h2>
|
||||
<p>All scripts live in <code>desktopenvs/hyprland/scripts/</code> and are deployed to <code>~/.config/scripts/</code>.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Script</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>caffeine.sh</code></td>
|
||||
<td>Toggle hypridle (prevent sleep)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ewwstart.sh</code></td>
|
||||
<td>Launch EWW bar on startup</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ewwstart-niri.sh</code></td>
|
||||
<td>EWW for niri compositor variant</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>togglebar.sh</code></td>
|
||||
<td>Show/hide EWW bar (monitor-aware)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>helpmenu.sh</code></td>
|
||||
<td>Display keybindings from binds.conf</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>screenshot.sh</code></td>
|
||||
<td>Region/full screenshot via grim + slurp</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>screenrec.sh</code></td>
|
||||
<td>Screen recording</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>screenrotationacw.sh</code></td>
|
||||
<td>Rotate screen anti-clockwise (tablet)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>screenrotationwcw.sh</code></td>
|
||||
<td>Rotate screen clockwise (tablet)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>unified-rotate.sh</code></td>
|
||||
<td>Unified rotation handler</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hyprland-toggle-touchpad.sh</code></td>
|
||||
<td>Enable/disable touchpad</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>wofi-file-search.sh</code></td>
|
||||
<td>File search via wofi</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>foldersearch.sh</code></td>
|
||||
<td>Folder search via wofi</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>pwr-dmenu.sh</code></td>
|
||||
<td>Power menu (shutdown/reboot/suspend)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>caffeine.sh</code></td>
|
||||
<td>Toggle idle inhibitor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>getispeed.sh</code></td>
|
||||
<td>Internet speed test display</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>journal.sh</code></td>
|
||||
<td>Quick journal entry</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>date.sh</code> / <code>time.sh</code></td>
|
||||
<td>Date/time waybar helpers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>uptime.sh</code></td>
|
||||
<td>Uptime display</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>dysk-phydisks.sh</code></td>
|
||||
<td>Physical disk info (dysk)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>drawer.sh</code></td>
|
||||
<td>Open nwg-drawer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>menu.sh</code></td>
|
||||
<td>Application menu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>onscreenkb.sh</code></td>
|
||||
<td>On-screen keyboard (wvkbd)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>bluetooth-applet.sh</code></td>
|
||||
<td>Bluetooth UI wrapper</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>togglewinbars.sh</code></td>
|
||||
<td>Toggle window title bars</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>toggle-layout.sh</code></td>
|
||||
<td>Switch tiling layout</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>playpause.sh</code></td>
|
||||
<td>Media play/pause</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>calender-fix.sh</code></td>
|
||||
<td>Calendar waybar widget fix</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="application-theming">Application Theming<a class="toc-anchor" href="#application-theming" title="Permanent link">¶</a></h2>
|
||||
<h3 id="spotify-spicetify">Spotify (Spicetify)<a class="toc-anchor" href="#spotify-spicetify" title="Permanent link">¶</a></h3>
|
||||
<p>Two CyberQueer Spicetify themes are available:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Theme</th>
|
||||
<th>Style</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>cli-cyberqueer</code></td>
|
||||
<td>CLI-inspired, minimal</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>matte-cyberqueer</code></td>
|
||||
<td>Matte finish variant</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Applied automatically when the <code>spotify</code> module is installed.</p>
|
||||
<h3 id="discord-vencord">Discord (Vencord)<a class="toc-anchor" href="#discord-vencord" title="Permanent link">¶</a></h3>
|
||||
<p>Two Discord themes:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Theme</th>
|
||||
<th>Location</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>cyberqueer.theme.css</code></td>
|
||||
<td>Standalone CyberQueer theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>system24/…/cyberqueer.theme.css</code></td>
|
||||
<td>system24 framework with CyberQueer colours</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="terminal-kitty">Terminal (Kitty)<a class="toc-anchor" href="#terminal-kitty" title="Permanent link">¶</a></h3>
|
||||
<p>The <code>kitty/themes/cyberqueer.conf</code> file defines the full 16-colour palette mapped to CyberQueer values. It is sourced by <code>current-theme.conf</code> which is imported in <code>kitty.conf</code>.</p>
|
||||
<hr />
|
||||
<h2 id="login-manager-ly">Login Manager (ly)<a class="toc-anchor" href="#login-manager-ly" title="Permanent link">¶</a></h2>
|
||||
<p><code>ly</code> is a TUI display manager configured via <code>etc-ly-config.ini</code> (deployed to <code>/etc/ly/config.ini</code>). Its colours are tracked by <code>apply-theme.sh</code> (system file, applied via <code>sudo</code>).</p>
|
||||
<hr />
|
||||
<h2 id="installing-hyprland">Installing Hyprland<a class="toc-anchor" href="#installing-hyprland" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash"># Via the TUI installer
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
# → Select "shell" and "Hyprland" in the dialogs
|
||||
|
||||
# On an existing system
|
||||
bash ~/Dotfiles/setup/install-modules.sh
|
||||
# → Not available; Hyprland is a base DE, use the full installer
|
||||
|
||||
# Direct script
|
||||
bash ~/Dotfiles/setup/modules/Desktop-Environments/hyprland.sh
|
||||
</code></pre>
|
||||
<p>The install script compiles EWW from source (requires Rust), copies all configs, installs the GTK and cursor themes, enables <code>ly@tty1</code>, and configures <code>greetd</code>.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,396 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>M-Archy Dotfiles — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<h1 id="m-archy-dotfiles">M-Archy Dotfiles<a class="toc-anchor" href="#m-archy-dotfiles" title="Permanent link">¶</a></h1>
|
||||
<p><strong>Arch Linux · Hyprland · Wayland · CyberQueer</strong></p>
|
||||
<p>A production-grade Arch Linux configuration for network administration, development, and gaming — built around the Hyprland Wayland compositor and the CyberQueer colour theme.</p>
|
||||
<hr />
|
||||
<h2 id="whats-inside">What's Inside<a class="toc-anchor" href="#whats-inside" title="Permanent link">¶</a></h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Area</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="installation.md">Installation</a></td>
|
||||
<td>Interactive TUI installer, answerfile automation, ISO building</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="theming.md">Theming</a></td>
|
||||
<td>CyberQueer colour system and <code>apply-theme.sh</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="hyprland.md">Hyprland</a></td>
|
||||
<td>Desktop environment, keybindings, bars, launchers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="modules.md">Modules</a></td>
|
||||
<td>Core modules and full optional-app catalogue</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="archiso.md">Archiso</a></td>
|
||||
<td>Building the custom live installer ISO</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="freeipa-ansible.md">FreeIPA & Ansible</a></td>
|
||||
<td>Identity management and automated config deployment</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="editors.md">Editors</a></td>
|
||||
<td>Neovim, Micro, Yazi</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="utilities.md">Utilities</a></td>
|
||||
<td>Encryption helpers, ClamAV, credentials, update scripts</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="quick-start">Quick Start<a class="toc-anchor" href="#quick-start" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash"># 1 — clone
|
||||
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git ~/Dotfiles
|
||||
|
||||
# 2 — run the interactive installer
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
|
||||
# 3 — optionally apply a custom colour palette
|
||||
nano ~/Dotfiles/colors.conf
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
</code></pre>
|
||||
<p>For a fully automated install from a live USB, see <a href="archiso.md">Archiso</a>.</p>
|
||||
<hr />
|
||||
<h2 id="cyberqueer-colour-palette">CyberQueer Colour Palette<a class="toc-anchor" href="#cyberqueer-colour-palette" title="Permanent link">¶</a></h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Role</th>
|
||||
<th>Name</th>
|
||||
<th>Hex</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Background</td>
|
||||
<td>Dark grey</td>
|
||||
<td><code>#1A1A1A</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Text</td>
|
||||
<td>Rose white</td>
|
||||
<td><code>#D6ABAB</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Primary accent</td>
|
||||
<td>Hot pink</td>
|
||||
<td><code>#E40046</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Secondary accent</td>
|
||||
<td>Electric violet</td>
|
||||
<td><code>#5018DD</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Danger / alerts</td>
|
||||
<td>Red</td>
|
||||
<td><code>#F50505</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="repository-layout">Repository Layout<a class="toc-anchor" href="#repository-layout" title="Permanent link">¶</a></h2>
|
||||
<pre><code>Dotfiles/
|
||||
├── apply-theme.sh # Propagate colours across all configs
|
||||
├── colors.conf # Single source of truth for the palette
|
||||
├── update.sh # pacman + yay full system update
|
||||
├── setup/
|
||||
│ ├── tui-install.sh # Main interactive / answerfile installer
|
||||
│ ├── generate-answerfile.sh # Dry-run to produce answerfile.json
|
||||
│ ├── arch-autoinstall.sh # Automated base OS installer
|
||||
│ ├── archbaseos-guided-install.sh # Guided base OS installer
|
||||
│ ├── install-modules.sh # Add optional modules to existing system
|
||||
│ ├── archiso/ # Custom Arch live ISO builder
|
||||
│ └── modules/ # Modular install scripts
|
||||
├── desktopenvs/hyprland/ # All Hyprland / Wayland configs
|
||||
├── gtk-themes/cyberqueer/ # GTK 3 & 4 theme
|
||||
├── qt-themes/cyberqueer/ # Qt platform theme
|
||||
├── nvim/ # Neovim config
|
||||
├── micro/ # Micro editor config
|
||||
├── yazi/ # Yazi file manager config
|
||||
├── clamav/ # ClamAV on-access scan setup
|
||||
└── docs/ # This documentation
|
||||
</code></pre>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,501 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Installation — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="installation">Installation<a class="toc-anchor" href="#installation" title="Permanent link">¶</a></h1>
|
||||
<p>Three paths are available depending on how much you want to automate:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<th>When to use</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="#interactive-tui">Interactive TUI</a></td>
|
||||
<td>Fresh Arch system, guided dialogs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="#answerfile-automated">Answerfile (automated)</a></td>
|
||||
<td>Unattended or repeatable installs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="#custom-live-iso">Custom ISO</a></td>
|
||||
<td>Deploy from USB to multiple machines</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="prerequisites">Prerequisites<a class="toc-anchor" href="#prerequisites" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li>Arch Linux (base install completed, user created)</li>
|
||||
<li>Internet connection</li>
|
||||
<li><code>git</code> available (<code>sudo pacman -S git</code>)</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h2 id="interactive-tui">Interactive TUI<a class="toc-anchor" href="#interactive-tui" title="Permanent link">¶</a></h2>
|
||||
<p>Clone the repo and run the installer:</p>
|
||||
<pre><code class="language-bash">git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git ~/Dotfiles
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
</code></pre>
|
||||
<p>The TUI walks you through:</p>
|
||||
<ol>
|
||||
<li><strong>Hostname</strong> — optional; sets <code>/etc/hostname</code> immediately</li>
|
||||
<li><strong>Components</strong> — pick any combination:</li>
|
||||
<li><code>pkg</code> — package managers (yay, nvm, Rust)</li>
|
||||
<li><code>core</code> — 100+ base system packages</li>
|
||||
<li><code>svc</code> — core services (NetworkManager, cronie, fail2ban, greetd)</li>
|
||||
<li><code>shell</code> — zsh, Neovim, Yazi, Micro, Starship</li>
|
||||
<li><strong>Desktop Environment</strong> — Hyprland, Sway, KDE Plasma, GNOME, COSMIC, XFCE, LXQt, or none</li>
|
||||
<li><strong>Applications</strong> — checklist of ~50 optional apps (see <a href="modules.md">Modules</a>)</li>
|
||||
<li><strong>Colorway</strong> — optional; enter hex values to customise the CyberQueer palette</li>
|
||||
</ol>
|
||||
<p>All activity is logged to <code>~/dotfiles-install.log</code>.</p>
|
||||
<h3 id="adding-modules-later">Adding Modules Later<a class="toc-anchor" href="#adding-modules-later" title="Permanent link">¶</a></h3>
|
||||
<p>To install additional optional apps on an already-configured system:</p>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/setup/install-modules.sh
|
||||
</code></pre>
|
||||
<p>This presents the same app checklist without re-running core setup.</p>
|
||||
<hr />
|
||||
<h2 id="answerfile-automated">Answerfile (Automated)<a class="toc-anchor" href="#answerfile-automated" title="Permanent link">¶</a></h2>
|
||||
<p>An <strong>answerfile</strong> lets the entire install — base OS <em>and</em> dotfiles — run without any user input.</p>
|
||||
<h3 id="generating-an-answerfile">Generating an Answerfile<a class="toc-anchor" href="#generating-an-answerfile" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/setup/generate-answerfile.sh [OUTPUT_PATH]
|
||||
# Default output: ~/answerfile.json
|
||||
</code></pre>
|
||||
<p>This dry-runs every installer dialog and saves your choices. <strong>No software is installed.</strong> Passwords are intentionally excluded — you will be prompted at install time.</p>
|
||||
<h3 id="answerfile-schema">Answerfile Schema<a class="toc-anchor" href="#answerfile-schema" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-json">{
|
||||
"_generated": "2026-05-18T12:00:00+00:00",
|
||||
"drive": "/dev/sda",
|
||||
"kernel": "linux",
|
||||
"hostname": "myhost",
|
||||
"username": "amir",
|
||||
"encrypt": true,
|
||||
"fido2_root": false,
|
||||
"fido2_user": false,
|
||||
"run_tui": true,
|
||||
"components": ["pkg", "core", "svc", "shell"],
|
||||
"desktop_environment": "hyprland",
|
||||
"apps": ["firefox-browser", "vscodium", "docker"],
|
||||
"colors": {
|
||||
"COLOR_TEXT": "D6ABAB",
|
||||
"COLOR_BG": "1A1A1A",
|
||||
"COLOR_HIGHLIGHT": "E40046",
|
||||
"COLOR_DARK": "5018DD",
|
||||
"COLOR_RED": "F50505"
|
||||
}
|
||||
}
|
||||
</code></pre>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>drive</code></td>
|
||||
<td>string</td>
|
||||
<td>Install target (<code>/dev/sda</code>, <code>/dev/nvme0n1</code>, …)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kernel</code></td>
|
||||
<td>string</td>
|
||||
<td><code>linux</code>, <code>linux-lts</code>, or <code>linux-zen</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hostname</code></td>
|
||||
<td>string</td>
|
||||
<td>Base hostname — a MAC-address suffix is appended automatically</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>username</code></td>
|
||||
<td>string</td>
|
||||
<td>Primary user account name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>encrypt</code></td>
|
||||
<td>bool</td>
|
||||
<td>Enable LUKS2 root encryption</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>fido2_root</code></td>
|
||||
<td>bool</td>
|
||||
<td>Enroll FIDO2 key for LUKS unlock</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>fido2_user</code></td>
|
||||
<td>bool</td>
|
||||
<td>Enroll FIDO2 key for PAM login</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>run_tui</code></td>
|
||||
<td>bool</td>
|
||||
<td>Run dotfiles setup automatically after base install</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>components</code></td>
|
||||
<td>array</td>
|
||||
<td>Dotfiles components to install</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>desktop_environment</code></td>
|
||||
<td>string</td>
|
||||
<td>DE name or <code>"none"</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>apps</code></td>
|
||||
<td>array</td>
|
||||
<td>Optional app IDs (see <a href="modules.md">Modules</a>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>colors</code></td>
|
||||
<td>object</td>
|
||||
<td>Optional colour overrides (omit to keep defaults)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="hostname-uniqueness">Hostname Uniqueness<a class="toc-anchor" href="#hostname-uniqueness" title="Permanent link">¶</a></h3>
|
||||
<p>When <code>hostname</code> is set in the answerfile, the MAC address of the primary network interface is automatically appended:</p>
|
||||
<pre><code>myhost → myhost-aabbccddee11
|
||||
</code></pre>
|
||||
<p>This prevents hostname conflicts when the same answerfile is used across multiple machines.</p>
|
||||
<h3 id="running-with-an-answerfile">Running with an Answerfile<a class="toc-anchor" href="#running-with-an-answerfile" title="Permanent link">¶</a></h3>
|
||||
<p>Place the file at <code>/answerfile.json</code> (or set the <code>ANSWERFILE</code> environment variable):</p>
|
||||
<pre><code class="language-bash"># Use default location
|
||||
sudo cp ~/answerfile.json /answerfile.json
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
|
||||
# Or override the path
|
||||
ANSWERFILE=~/my-setup.json bash ~/Dotfiles/setup/tui-install.sh
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="base-os-installers">Base OS Installers<a class="toc-anchor" href="#base-os-installers" title="Permanent link">¶</a></h2>
|
||||
<p>Two scripts install Arch Linux itself (before the dotfiles step):</p>
|
||||
<h3 id="guided-installer-archbaseos-guided-installsh">Guided Installer (<code>archbaseos-guided-install.sh</code>)<a class="toc-anchor" href="#guided-installer-archbaseos-guided-installsh" title="Permanent link">¶</a></h3>
|
||||
<p>Interactive, dialog-based. Prompts for each setting with sensible defaults. Good for hands-on installs where you want to review each option.</p>
|
||||
<pre><code class="language-bash">bash ~/installer/archbaseos-guided-install.sh
|
||||
</code></pre>
|
||||
<h3 id="auto-installer-arch-autoinstallsh">Auto Installer (<code>arch-autoinstall.sh</code>)<a class="toc-anchor" href="#auto-installer-arch-autoinstallsh" title="Permanent link">¶</a></h3>
|
||||
<p>Reads all settings from <code>/answerfile.json</code> if present; falls back to prompts for anything missing.</p>
|
||||
<pre><code class="language-bash">bash ~/installer/arch-autoinstall.sh
|
||||
</code></pre>
|
||||
<p>Both installers perform the same steps:</p>
|
||||
<ol>
|
||||
<li>Partition disk (EFI 15 GiB · Root · Swap = RAM size)</li>
|
||||
<li>Optionally encrypt root with LUKS2</li>
|
||||
<li>Format root as Btrfs with <code>@</code> and <code>@home</code> subvolumes</li>
|
||||
<li><code>pacstrap</code> base system</li>
|
||||
<li>Configure locale, timezone, hostname, user, sudo</li>
|
||||
<li>Set up mkinitcpio hooks and GRUB</li>
|
||||
<li>Optionally run <code>tui-install.sh</code> inside the chroot</li>
|
||||
</ol>
|
||||
<h3 id="disk-encryption">Disk Encryption<a class="toc-anchor" href="#disk-encryption" title="Permanent link">¶</a></h3>
|
||||
<p>When encryption is enabled:</p>
|
||||
<ul>
|
||||
<li><strong>Primary key</strong>: entered interactively at install time</li>
|
||||
<li><strong>Backup key</strong>: generated automatically from <code>/dev/urandom</code>, enrolled into a second LUKS slot, and written to <code>/_LUKS_BACKUP_KEY</code> inside the new system (mode <code>0400</code>, root-readable only, inside the encrypted container)</li>
|
||||
<li><strong>FIDO2</strong> (optional): enroll a hardware key for passwordless unlock</li>
|
||||
</ul>
|
||||
<p>The backup key can be collected by Ansible — see <a href="freeipa-ansible.md">FreeIPA & Ansible</a>.</p>
|
||||
<h3 id="mkinitcpio-hook-sets">mkinitcpio Hook Sets<a class="toc-anchor" href="#mkinitcpio-hook-sets" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Scenario</th>
|
||||
<th>Hooks</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>No encryption</td>
|
||||
<td><code>base udev autodetect microcode modconf kms consolefont block btrfs filesystems keyboard fsck</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>LUKS + password</td>
|
||||
<td><code>base udev autodetect microcode modconf kms consolefont block encrypt lvm2 btrfs filesystems keyboard keymap fsck</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>LUKS + FIDO2</td>
|
||||
<td><code>base udev systemd autodetect microcode modconf kms consolefont block sd-encrypt lvm2 btrfs filesystems keyboard keymap fsck</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="custom-live-iso">Custom Live ISO<a class="toc-anchor" href="#custom-live-iso" title="Permanent link">¶</a></h2>
|
||||
<p>See <a href="archiso.md">Archiso</a> for building a bootable USB that embeds the installer and, optionally, a pre-baked answerfile for zero-touch deployment.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,807 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Modules Reference — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="modules-reference">Modules Reference<a class="toc-anchor" href="#modules-reference" title="Permanent link">¶</a></h1>
|
||||
<p>The setup system is modular — core components are installed first, then any combination of optional apps can be added. All module scripts are idempotent (safe to re-run).</p>
|
||||
<hr />
|
||||
<h2 id="core-modules">Core Modules<a class="toc-anchor" href="#core-modules" title="Permanent link">¶</a></h2>
|
||||
<p>These are selected during the initial <code>tui-install.sh</code> run.</p>
|
||||
<h3 id="pkg-package-managers"><code>pkg</code> — Package Managers<a class="toc-anchor" href="#pkg-package-managers" title="Permanent link">¶</a></h3>
|
||||
<p>Installs the AUR helper, language runtimes, and build toolchains:</p>
|
||||
<ul>
|
||||
<li><strong>yay</strong> — AUR helper (built from source via <code>makepkg</code>)</li>
|
||||
<li><strong>Rust / Cargo</strong> — via <code>rustup</code> with the stable toolchain</li>
|
||||
<li><strong>nvm</strong> — Node Version Manager; installs Node.js v22 LTS by default</li>
|
||||
</ul>
|
||||
<h3 id="core-core-packages"><code>core</code> — Core Packages<a class="toc-anchor" href="#core-core-packages" title="Permanent link">¶</a></h3>
|
||||
<p>~100 packages including:</p>
|
||||
<p><code>7zip</code> · <code>base-devel</code> · <code>bluez</code> · <code>bluez-utils</code> · <code>btop</code> · <code>fastfetch</code> · <code>fdupes</code> · <code>ffmpeg</code> · <code>git</code> · <code>greetd-tuigreet</code> · <code>htop</code> · <code>jq</code> · <code>less</code> · <code>lynx</code> · <code>neovim</code> · <code>networkmanager</code> · <code>openssh</code> · <code>pipewire</code> · <code>pipewire-alsa</code> · <code>pipewire-pulse</code> · <code>ripgrep</code> · <code>rsync</code> · <code>tmux</code> · <code>udiskie</code> · <code>yazi</code> · <code>zram-generator</code></p>
|
||||
<p>Also installs <code>pamtester</code> from the AUR.</p>
|
||||
<h3 id="svc-core-services"><code>svc</code> — Core Services<a class="toc-anchor" href="#svc-core-services" title="Permanent link">¶</a></h3>
|
||||
<p>Enables and starts these systemd units:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Service</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>NetworkManager</code></td>
|
||||
<td>Network connectivity</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>cronie</code></td>
|
||||
<td>Cron daemon</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>fail2ban</code></td>
|
||||
<td>Brute-force protection</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>greetd</code></td>
|
||||
<td>Login session manager</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>udisks2</code></td>
|
||||
<td>Removable media</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Also deploys <code>greetd-tuigreet</code> config from the dotfiles.</p>
|
||||
<h3 id="shell-shell-setup"><code>shell</code> — Shell Setup<a class="toc-anchor" href="#shell-shell-setup" title="Permanent link">¶</a></h3>
|
||||
<ul>
|
||||
<li><strong>zsh</strong> with <strong>Oh My Zsh</strong> and plugins (zsh-syntax-highlighting, zsh-autosuggestions)</li>
|
||||
<li><strong>Starship</strong> shell prompt</li>
|
||||
<li><strong>Neovim</strong> with Vim-Plug (see <a href="editors.md">Editors</a>)</li>
|
||||
<li><strong>Micro</strong> editor</li>
|
||||
<li><strong>Yazi</strong> file manager</li>
|
||||
<li>Deploys <code>.bashrc</code>, <code>.zshrc</code>, <code>starship.toml</code>, Micro config, Neovim config</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h2 id="desktop-environments">Desktop Environments<a class="toc-anchor" href="#desktop-environments" title="Permanent link">¶</a></h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>Notes</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>hyprland</code></td>
|
||||
<td>Hyprland</td>
|
||||
<td>Primary DE — see <a href="hyprland.md">Hyprland</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>sway</code></td>
|
||||
<td>Sway</td>
|
||||
<td>Wayland tiling WM, lighter</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kde-plasma</code></td>
|
||||
<td>KDE Plasma</td>
|
||||
<td>Full-featured with sddm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gnome</code></td>
|
||||
<td>GNOME</td>
|
||||
<td>Modern Wayland DE with gdm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>cosmic</code></td>
|
||||
<td>COSMIC</td>
|
||||
<td>Rust-based DE from System76</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>xfce</code></td>
|
||||
<td>XFCE</td>
|
||||
<td>Lightweight X11 with lightdm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>lxqt</code></td>
|
||||
<td>LXQt</td>
|
||||
<td>Lightweight Qt X11 with sddm</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="optional-applications">Optional Applications<a class="toc-anchor" href="#optional-applications" title="Permanent link">¶</a></h2>
|
||||
<p>Install via <code>tui-install.sh</code> at first install, or add later:</p>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/setup/install-modules.sh
|
||||
</code></pre>
|
||||
<h3 id="ai-machine-learning">AI & Machine Learning<a class="toc-anchor" href="#ai-machine-learning" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Package</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>ollama</code></td>
|
||||
<td>ollama</td>
|
||||
<td>Local LLM runner with REST API server</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>llama-cpp</code></td>
|
||||
<td>llama.cpp</td>
|
||||
<td>Standalone inference CLI + server</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>open-webui</code></td>
|
||||
<td>open-webui</td>
|
||||
<td>Browser UI for Ollama / OpenAI-compatible backends</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>claude</code></td>
|
||||
<td>claude (npm)</td>
|
||||
<td>Anthropic Claude Code CLI</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="networking-security">Networking & Security<a class="toc-anchor" href="#networking-security" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Packages</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>networking-cli</code></td>
|
||||
<td>nmap · nethogs · mitmproxy · httpie</td>
|
||||
<td>Network analysis and HTTP tooling</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>disk-recovery</code></td>
|
||||
<td>ddrescue · f3</td>
|
||||
<td>Disk imaging and flash drive testing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ssh-server</code></td>
|
||||
<td>openssh</td>
|
||||
<td>SSH daemon with key-auth enforcement</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>wireshark</code></td>
|
||||
<td>wireshark-qt</td>
|
||||
<td>Packet capture and analysis GUI</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="development">Development<a class="toc-anchor" href="#development" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Packages</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>python</code></td>
|
||||
<td>pyright · pipx · pynvim</td>
|
||||
<td>Python LSP, isolated tool runner, Neovim integration</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>docker</code></td>
|
||||
<td>docker · docker-compose</td>
|
||||
<td>Container runtime</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>podman</code></td>
|
||||
<td>podman · buildah · podman-compose</td>
|
||||
<td>Rootless containers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>cockpit</code></td>
|
||||
<td>cockpit · machines · podman</td>
|
||||
<td>Web-based system management UI</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>k8s</code></td>
|
||||
<td>kubectl · podman-desktop</td>
|
||||
<td>Kubernetes CLI and desktop client</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>db-clients</code></td>
|
||||
<td>pgcli · mycli</td>
|
||||
<td>Enhanced interactive database CLIs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>mysql</code></td>
|
||||
<td>mariadb</td>
|
||||
<td>MariaDB server with initial setup</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="ides-editors">IDEs & Editors<a class="toc-anchor" href="#ides-editors" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Package</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>vscodium</code></td>
|
||||
<td>vscodium-bin (AUR)</td>
|
||||
<td>VS Code without telemetry</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>zed-ide</code></td>
|
||||
<td>zed</td>
|
||||
<td>High-performance Rust IDE</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>geany</code></td>
|
||||
<td>geany · geany-plugins</td>
|
||||
<td>Lightweight IDE</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>codeblocks</code></td>
|
||||
<td>codeblocks</td>
|
||||
<td>C/C++ IDE</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kate</code></td>
|
||||
<td>kate</td>
|
||||
<td>KDE advanced text editor</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="browsers">Browsers<a class="toc-anchor" href="#browsers" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Package</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>chromium</code></td>
|
||||
<td>chromium</td>
|
||||
<td>Open-source Chromium</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>firefox-browser</code></td>
|
||||
<td>firefox</td>
|
||||
<td>Mozilla Firefox</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>zen-browser</code></td>
|
||||
<td>zen-browser-bin (AUR)</td>
|
||||
<td>Privacy-focused Firefox fork</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>nyxt</code></td>
|
||||
<td>nyxt (AUR)</td>
|
||||
<td>Keyboard-driven, hackable browser</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>librewolf</code></td>
|
||||
<td>librewolf-bin (AUR)</td>
|
||||
<td>Hardened Firefox fork</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>min-browser</code></td>
|
||||
<td>min (AUR)</td>
|
||||
<td>Minimal Electron browser</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="gaming">Gaming<a class="toc-anchor" href="#gaming" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Package</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>steam</code></td>
|
||||
<td>steam</td>
|
||||
<td>Steam gaming platform</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>vesktop</code></td>
|
||||
<td>vesktop (AUR)</td>
|
||||
<td>Discord client with Vencord built-in</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>spotify</code></td>
|
||||
<td>spotify (AUR) + spicetify</td>
|
||||
<td>Music player with CyberQueer theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>prism</code></td>
|
||||
<td>prismlauncher (Flatpak)</td>
|
||||
<td>Minecraft launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>vintagestory</code></td>
|
||||
<td>vintagestory (AUR)</td>
|
||||
<td>Survival / voxel game</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="media-creative">Media & Creative<a class="toc-anchor" href="#media-creative" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Packages</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>ffmpeg</code></td>
|
||||
<td>gst-plugin-pipewire · gst-plugins-good · ffmpegthumbnailer</td>
|
||||
<td>GStreamer codecs + thumbnailer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>sox</code></td>
|
||||
<td>sox</td>
|
||||
<td>Command-line audio processing</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>imagemagick</code></td>
|
||||
<td>imagemagick</td>
|
||||
<td>Image manipulation suite</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>yt-dlp</code></td>
|
||||
<td>yt-dlp</td>
|
||||
<td>YouTube / media downloader</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>blender</code></td>
|
||||
<td>blender</td>
|
||||
<td>3D creation suite</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>gnuplot</code></td>
|
||||
<td>gnuplot</td>
|
||||
<td>Scientific plotting</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>povray</code></td>
|
||||
<td>povray</td>
|
||||
<td>Ray-tracing renderer</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="productivity">Productivity<a class="toc-anchor" href="#productivity" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Packages</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>productivity</code></td>
|
||||
<td>taskwarrior · watson · jrnl</td>
|
||||
<td>Task management, time tracking, journaling</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>himalaya</code></td>
|
||||
<td>himalaya (AUR)</td>
|
||||
<td>Terminal email client</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>toot</code></td>
|
||||
<td>toot (AUR)</td>
|
||||
<td>Mastodon CLI client</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="system-utilities">System Utilities<a class="toc-anchor" href="#system-utilities" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Packages</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>tlp</code></td>
|
||||
<td>tlp · tlp-rdw</td>
|
||||
<td>Laptop battery optimisation</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>zfs</code></td>
|
||||
<td>zfs-dkms</td>
|
||||
<td>ZFS kernel module</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>wprs</code></td>
|
||||
<td>wprs-git (AUR)</td>
|
||||
<td>Wayland proxy for remote sessions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>butter</code></td>
|
||||
<td>butter (AUR)</td>
|
||||
<td>Btrfs snapshot backup manager</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>localsend</code></td>
|
||||
<td>localsend (AUR)</td>
|
||||
<td>LAN file transfer (AirDrop-like)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>croc</code></td>
|
||||
<td>croc</td>
|
||||
<td>Cross-platform encrypted file transfer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>localtunnel</code></td>
|
||||
<td>localtunnel (npm)</td>
|
||||
<td>Expose localhost over a public URL</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>onlyoffice</code></td>
|
||||
<td>onlyoffice-bin (AUR)</td>
|
||||
<td>Office suite (Docs, Sheets, Slides)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="identity-infrastructure">Identity & Infrastructure<a class="toc-anchor" href="#identity-infrastructure" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>freeipa-client</code></td>
|
||||
<td>sssd + ipa-client-install + auto-enrollment (see <a href="freeipa-ansible.md">FreeIPA</a>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>freeipa-server</code></td>
|
||||
<td>Interactive FreeIPA server setup + client generator</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>freeipa-image</code></td>
|
||||
<td>OCI / LXC / Proxmox LXC image builder + Keycloak</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="container-shell-setups">Container Shell Setups<a class="toc-anchor" href="#container-shell-setups" title="Permanent link">¶</a></h2>
|
||||
<p>Scripts in <code>setup/Setup-shell-4-containers/</code> configure a minimal shell environment inside containers or chroots for each major distribution:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Script</th>
|
||||
<th>Target</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>alpine.sh</code></td>
|
||||
<td>Alpine Linux</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>arch.sh</code></td>
|
||||
<td>Arch Linux</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>debian.sh</code></td>
|
||||
<td>Debian</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>fedora.sh</code></td>
|
||||
<td>Fedora</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>suse.sh</code></td>
|
||||
<td>openSUSE</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ubuntu.sh</code></td>
|
||||
<td>Ubuntu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>void.sh</code></td>
|
||||
<td>Void Linux</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>other.sh</code></td>
|
||||
<td>Generic fallback</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,465 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>CyberQueer Theme System — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="cyberqueer-theme-system">CyberQueer Theme System<a class="toc-anchor" href="#cyberqueer-theme-system" title="Permanent link">¶</a></h1>
|
||||
<p>The CyberQueer theme is a single-source colour system: every config file that needs colours references a small set of hex values that can be changed in one place and propagated everywhere with a single command.</p>
|
||||
<hr />
|
||||
<h2 id="the-palette">The Palette<a class="toc-anchor" href="#the-palette" title="Permanent link">¶</a></h2>
|
||||
<p>Defined in <code>~/Dotfiles/colors.conf</code> (bare 6-digit hex, no <code>#</code> prefix):</p>
|
||||
<pre><code class="language-ini">COLOR_TEXT=D6ABAB # Rose-white — foreground text, labels
|
||||
COLOR_BG=1A1A1A # Near-black — base surface, backgrounds
|
||||
COLOR_HIGHLIGHT=E40046 # Hot pink — primary accent, active borders
|
||||
COLOR_DARK=5018DD # Violet — secondary accent, inactive borders
|
||||
COLOR_RED=F50505 # Red — danger indicators, alerts
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="applying-the-theme">Applying the Theme<a class="toc-anchor" href="#applying-the-theme" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash"># Apply using the default colors.conf
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
|
||||
# Apply from a custom palette file
|
||||
bash ~/Dotfiles/apply-theme.sh /path/to/custom-colors.conf
|
||||
</code></pre>
|
||||
<p><code>apply-theme.sh</code> will:</p>
|
||||
<ol>
|
||||
<li>Read <code>colors.conf</code> (or the file you pass)</li>
|
||||
<li>Compare against the last-applied state in <code>~/.config/colors.state</code></li>
|
||||
<li>Replace only <strong>changed</strong> colour values across all tracked files</li>
|
||||
<li>Save the new state to <code>colors.state</code></li>
|
||||
</ol>
|
||||
<p>If nothing changed it exits immediately — safe to call repeatedly.</p>
|
||||
<h3 id="first-run-bootstrap">First-Run Bootstrap<a class="toc-anchor" href="#first-run-bootstrap" title="Permanent link">¶</a></h3>
|
||||
<p>On a fresh install where configs have been copied but no state file exists yet, <code>apply-theme.sh</code> bootstraps <code>~/.config/colors.state</code> with the repository defaults so the diff works correctly from the start.</p>
|
||||
<hr />
|
||||
<h2 id="what-gets-themed">What Gets Themed<a class="toc-anchor" href="#what-gets-themed" title="Permanent link">¶</a></h2>
|
||||
<h3 id="user-configs-config">User Configs (<code>~/.config/…</code>)<a class="toc-anchor" href="#user-configs-config" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>File</th>
|
||||
<th>What it styles</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>starship.toml</code></td>
|
||||
<td>Shell prompt segment colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>yazi/theme.toml</code></td>
|
||||
<td>File manager UI colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hypr/hyprland.conf</code></td>
|
||||
<td>Active/inactive window border gradients</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hypr/hyprtoolkit.conf</code></td>
|
||||
<td>Additional Hyprland colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>hypr/hyprlock.conf</code></td>
|
||||
<td>Lock screen colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kitty/current-theme.conf</code></td>
|
||||
<td>Terminal colour palette</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kitty/kitty.conf</code></td>
|
||||
<td>Terminal background & accents</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kitty/themes/cyberqueer.conf</code></td>
|
||||
<td>Kitty colour scheme definition</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>waybar/style.css</code></td>
|
||||
<td>Top bar widget colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>wofi/style.css</code></td>
|
||||
<td>App launcher colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>walker/themes/cyberqueer.css</code></td>
|
||||
<td>Walker launcher theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>nwg-dock-hyprland/style.css</code></td>
|
||||
<td>Application dock</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>nwg-drawer/drawer.css</code></td>
|
||||
<td>Application drawer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>nwg-panel/menu-start.css</code></td>
|
||||
<td>Panel start menu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>vicinae/cyberqueer.toml</code></td>
|
||||
<td>Gesture launcher</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>scripts/onscreenkb.sh</code></td>
|
||||
<td>On-screen keyboard colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>spicetify/Themes/*/color.ini</code></td>
|
||||
<td>Spotify client theme (×2 variants)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ulauncher/user-themes/cyberqueer/manifest.json</code></td>
|
||||
<td>uLauncher theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ulauncher/user-themes/cyberqueer/theme.css</code></td>
|
||||
<td>uLauncher CSS</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ulauncher/user-themes/cyberqueer/generated.css</code></td>
|
||||
<td>uLauncher generated CSS</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Vencord/themes/cyberqueer.theme.css</code></td>
|
||||
<td>Discord theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Vencord/themes/system24/…/cyberqueer.theme.css</code></td>
|
||||
<td>Discord system24 variant</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="system-files-applied-via-sudo">System Files (applied via <code>sudo</code>)<a class="toc-anchor" href="#system-files-applied-via-sudo" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>File</th>
|
||||
<th>What it styles</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>/etc/ly/config.ini</code></td>
|
||||
<td>TUI login manager colours</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>/usr/share/themes/cyberqueer/gtk-3.0/gtk.css</code></td>
|
||||
<td>GTK 3 theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>/usr/share/themes/cyberqueer/gtk-4.0/gtk.css</code></td>
|
||||
<td>GTK 4 theme</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="customising-the-palette">Customising the Palette<a class="toc-anchor" href="#customising-the-palette" title="Permanent link">¶</a></h2>
|
||||
<p>Edit <code>~/Dotfiles/colors.conf</code>, then run <code>apply-theme.sh</code>:</p>
|
||||
<pre><code class="language-bash"># Example: shift the accent to cyan
|
||||
nano ~/Dotfiles/colors.conf
|
||||
# → COLOR_HIGHLIGHT=00B4D8
|
||||
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
</code></pre>
|
||||
<p>The tui-install.sh installer also offers a colorway dialog as its final step:
|
||||
enter new hex values in the form; leave them unchanged to skip.</p>
|
||||
<hr />
|
||||
<h2 id="how-it-works-internally">How It Works Internally<a class="toc-anchor" href="#how-it-works-internally" title="Permanent link">¶</a></h2>
|
||||
<p><code>apply-theme.sh</code> reads two key–value files and computes the diff:</p>
|
||||
<pre><code>~/.config/colors.state (old values — what's currently applied)
|
||||
colors.conf (new values — what you want)
|
||||
</code></pre>
|
||||
<p>For each changed key it runs:</p>
|
||||
<pre><code class="language-bash">sed -i "s/${OLD_HEX}/${NEW_HEX}/gI" <file>
|
||||
</code></pre>
|
||||
<p>The case-insensitive (<code>I</code>) flag matches uppercase hex codes that some apps emit. After all replacements succeed, <code>colors.state</code> is updated.</p>
|
||||
<h3 id="symlink-guard">Symlink Guard<a class="toc-anchor" href="#symlink-guard" title="Permanent link">¶</a></h3>
|
||||
<p><code>apply-theme.sh</code> refuses to run if any deployed config path resolves back into <code>~/Dotfiles/</code> via symlink. This prevents theme changes from being committed directly into the git repository. The new-style install (via <code>tui-install.sh</code>) <strong>copies</strong> configs instead of symlinking them, so this guard is normally never triggered.</p>
|
||||
<hr />
|
||||
<h2 id="answerfile-theming">Answerfile Theming<a class="toc-anchor" href="#answerfile-theming" title="Permanent link">¶</a></h2>
|
||||
<p>If you generate an answerfile with <code>generate-answerfile.sh</code>, custom colours can be embedded in it:</p>
|
||||
<pre><code class="language-json">{
|
||||
"colors": {
|
||||
"COLOR_TEXT": "D6ABAB",
|
||||
"COLOR_BG": "1A1A1A",
|
||||
"COLOR_HIGHLIGHT": "E40046",
|
||||
"COLOR_DARK": "5018DD",
|
||||
"COLOR_RED": "F50505"
|
||||
}
|
||||
}
|
||||
</code></pre>
|
||||
<p><code>tui-install.sh</code> will apply these at the end of an automated install.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,403 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Utilities — M-Archy Dotfiles</title>
|
||||
<style>
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: #1A1A1A;
|
||||
--bg2: #242424;
|
||||
--bg3: #2e2e2e;
|
||||
--text: #D6ABAB;
|
||||
--accent: #E40046;
|
||||
--violet: #5018DD;
|
||||
--danger: #F50505;
|
||||
--border: #5018DD;
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
<a class="back-link" href="index.html">← Index</a>
|
||||
<main>
|
||||
<h1 id="utilities">Utilities<a class="toc-anchor" href="#utilities" title="Permanent link">¶</a></h1>
|
||||
<p>Miscellaneous scripts and tools that live at the top level or in the <code>clamav/</code> directory.</p>
|
||||
<hr />
|
||||
<h2 id="system-update">System Update<a class="toc-anchor" href="#system-update" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/update.sh
|
||||
</code></pre>
|
||||
<p>Runs a full system update:
|
||||
1. <code>sudo pacman -Syu</code> — official repos
|
||||
2. <code>yay -Syu --answerdiff None --answerclean All --removemake</code> — AUR packages (no prompts)</p>
|
||||
<p>For per-package AUR updates with confirmation:</p>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/update-aur-onebyone.sh
|
||||
</code></pre>
|
||||
<hr />
|
||||
<h2 id="package-audit">Package Audit<a class="toc-anchor" href="#package-audit" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/setup/audit-packages.sh
|
||||
</code></pre>
|
||||
<p>Audits installed packages — useful for finding orphans or unexpected installations.</p>
|
||||
<hr />
|
||||
<h2 id="encryption-utilities">Encryption Utilities<a class="toc-anchor" href="#encryption-utilities" title="Permanent link">¶</a></h2>
|
||||
<p>Simple OpenSSL wrappers for encrypting/decrypting arbitrary strings. Useful for storing secrets in scripts or config files without plaintext exposure.</p>
|
||||
<h3 id="encrypt">Encrypt<a class="toc-anchor" href="#encrypt" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/encrypt.sh "my secret text" "my-passphrase"
|
||||
# Output: base64-encoded AES-256-CBC ciphertext
|
||||
</code></pre>
|
||||
<h3 id="decrypt">Decrypt<a class="toc-anchor" href="#decrypt" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/decrypt.sh "<ciphertext>" "my-passphrase"
|
||||
# Output: original plaintext
|
||||
</code></pre>
|
||||
<p>Both use AES-256-CBC with PBKDF2 key derivation via OpenSSL.</p>
|
||||
<hr />
|
||||
<h2 id="credential-storage">Credential Storage<a class="toc-anchor" href="#credential-storage" title="Permanent link">¶</a></h2>
|
||||
<h3 id="initial-setup">Initial Setup<a class="toc-anchor" href="#initial-setup" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/setup-creds-missing.sh
|
||||
</code></pre>
|
||||
<p>Installs <code>gnome-keyring</code> and <code>seahorse</code> (GUI manager), then sets git's credential helper to <code>store</code>.</p>
|
||||
<h3 id="git-credentials">Git Credentials<a class="toc-anchor" href="#git-credentials" title="Permanent link">¶</a></h3>
|
||||
<p><code>git/</code> contains <code>.gitconfig</code> with:</p>
|
||||
<pre><code class="language-ini">[user]
|
||||
name = The_miro
|
||||
email = amir@abdelbaki.eu
|
||||
|
||||
[credential]
|
||||
helper = store
|
||||
|
||||
[init]
|
||||
defaultBranch = main
|
||||
|
||||
[push]
|
||||
autoSetupRemote = true
|
||||
</code></pre>
|
||||
<p>The <code>store</code> helper writes credentials to <code>~/.git-credentials</code>. For higher security, <code>gnome-keyring</code> intercepts this and stores the credentials in the system keyring instead of plaintext.</p>
|
||||
<hr />
|
||||
<h2 id="zsh-plugins">Zsh Plugins<a class="toc-anchor" href="#zsh-plugins" title="Permanent link">¶</a></h2>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/zshplugins.sh
|
||||
</code></pre>
|
||||
<p>Clones (or updates) the two Oh My Zsh community plugins:
|
||||
- <code>zsh-syntax-highlighting</code> — real-time syntax colouring in the prompt
|
||||
- <code>zsh-autosuggestions</code> — fish-style history-based suggestions</p>
|
||||
<p>These are referenced in <code>.zshrc</code> and active after the next shell start.</p>
|
||||
<hr />
|
||||
<h2 id="clamav-on-access-scanning">ClamAV On-Access Scanning<a class="toc-anchor" href="#clamav-on-access-scanning" title="Permanent link">¶</a></h2>
|
||||
<p>Full real-time antivirus scanning via ClamAV's <code>clamonacc</code> daemon.</p>
|
||||
<h3 id="installation">Installation<a class="toc-anchor" href="#installation" title="Permanent link">¶</a></h3>
|
||||
<pre><code class="language-bash">bash ~/Dotfiles/clamav/install-clam-onaccess.sh
|
||||
</code></pre>
|
||||
<p>What it does:
|
||||
1. Installs <code>clamav</code>
|
||||
2. Copies <code>clamd.conf</code> to <code>/etc/clamav/</code>
|
||||
3. Installs <code>clamav-clamonacc.service</code> to <code>/etc/systemd/system/</code>
|
||||
4. Installs the sudoers entry from <code>clamav-sudoer</code>
|
||||
5. Updates virus definitions (<code>freshclam</code>)
|
||||
6. Enables and starts <code>clamd</code> + <code>clamav-clamonacc</code></p>
|
||||
<h3 id="key-files">Key Files<a class="toc-anchor" href="#key-files" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>File</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>clamav/clamd.conf</code></td>
|
||||
<td>Daemon configuration (30 KB, full options)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>clamav/clamav-clamonacc.service</code></td>
|
||||
<td>systemd unit for on-access scanning</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>clamav/clamav-sudoer</code></td>
|
||||
<td>sudoers rule for ClamAV processes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>clamav/virus-event.bash</code></td>
|
||||
<td>Handler executed when a virus is detected</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="virus-event-handler">Virus Event Handler<a class="toc-anchor" href="#virus-event-handler" title="Permanent link">¶</a></h3>
|
||||
<p><code>virus-event.bash</code> is called by clamonacc when a threat is found. Customise it to send notifications, quarantine files, or alert an admin.</p>
|
||||
<hr />
|
||||
<h2 id="shell-configuration">Shell Configuration<a class="toc-anchor" href="#shell-configuration" title="Permanent link">¶</a></h2>
|
||||
<h3 id="zshrc"><code>.zshrc</code><a class="toc-anchor" href="#zshrc" title="Permanent link">¶</a></h3>
|
||||
<ul>
|
||||
<li><strong>Framework</strong>: Oh My Zsh</li>
|
||||
<li><strong>Theme</strong>: robbyrussell (overridden visually by Starship)</li>
|
||||
<li><strong>Plugins</strong>: syntax-highlighting, autosuggestions</li>
|
||||
<li><strong>Walk integration</strong>: <code>lk</code> function opens the <code>walk</code> file navigator</li>
|
||||
<li><strong><code>WALK_MAIN_COLOR</code></strong>: set to <code>#5018DD</code> (CyberQueer violet)</li>
|
||||
<li>Sources Starship init at the end</li>
|
||||
</ul>
|
||||
<h3 id="bashrc"><code>.bashrc</code><a class="toc-anchor" href="#bashrc" title="Permanent link">¶</a></h3>
|
||||
<p>Minimal bash config — sets <code>PS1</code>, loads <code>~/.bash_profile</code> if present.</p>
|
||||
<h3 id="starship-prompt">Starship Prompt<a class="toc-anchor" href="#starship-prompt" title="Permanent link">¶</a></h3>
|
||||
<p><code>starship.toml</code> at the repo root is deployed to <code>~/.config/starship.toml</code>.</p>
|
||||
<p>Key customisations:
|
||||
- OS, username, directory, git, language, docker, and time segments
|
||||
- CyberQueer colours throughout (colour-substitution target)
|
||||
- Directory abbreviated to 3 levels with <code>…/</code> truncation
|
||||
- Common directory substitutions (<code>~/Documents</code> → <code>📄</code>, etc.)</p>
|
||||
<hr />
|
||||
<h2 id="login-manager-ly">Login Manager (ly)<a class="toc-anchor" href="#login-manager-ly" title="Permanent link">¶</a></h2>
|
||||
<p><code>etc-ly-config.ini</code> is deployed to <code>/etc/ly/config.ini</code> during Hyprland install and kept as a colour-substitution target in <code>apply-theme.sh</code>.</p>
|
||||
<p>ly is a minimal TUI display manager that runs on <code>tty1</code>:</p>
|
||||
<pre><code>systemctl enable ly@tty1
|
||||
</code></pre>
|
||||
<p>Session selection, auto-login, and timeout settings are all in the config.</p>
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · 2026-05-18
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,407 @@
|
|||
#!/usr/bin/env bash
|
||||
# md-to-html.sh — Convert Markdown docs to styled HTML with the CyberQueer theme.
|
||||
#
|
||||
# Usage:
|
||||
# bash docs/md-to-html.sh # convert all docs/md/*.md
|
||||
# bash docs/md-to-html.sh docs/md/foo.md # convert one file
|
||||
#
|
||||
# Output lands in docs/html/ with the same base name.
|
||||
# Requires: python3 with the 'markdown' package (python-markdown on Arch).
|
||||
# sudo pacman -S python-markdown
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
MD_DIR="$SCRIPT_DIR/md"
|
||||
HTML_DIR="$SCRIPT_DIR/html"
|
||||
|
||||
# ── Preflight ─────────────────────────────────────────────────────────────────
|
||||
if ! python3 -c "import markdown" 2>/dev/null; then
|
||||
echo "python-markdown not found. Installing..."
|
||||
sudo pacman -S --noconfirm python-markdown \
|
||||
|| { echo "Error: please install python-markdown manually."; exit 1; }
|
||||
fi
|
||||
|
||||
mkdir -p "$HTML_DIR"
|
||||
|
||||
# ── CyberQueer inline CSS ─────────────────────────────────────────────────────
|
||||
# Read live palette from colors.conf if available, otherwise use defaults.
|
||||
_hex() {
|
||||
local key="$1" default="$2"
|
||||
if [[ -f "$SCRIPT_DIR/../colors.conf" ]]; then
|
||||
local v
|
||||
v=$(grep -m1 "^${key}=" "$SCRIPT_DIR/../colors.conf" 2>/dev/null | cut -d= -f2 | tr -d '[:space:]' | sed 's/#.*//')
|
||||
[[ -n "$v" ]] && { printf '#%s' "${v^^}"; return; }
|
||||
fi
|
||||
printf '#%s' "$default"
|
||||
}
|
||||
|
||||
C_BG=$(_hex COLOR_BG 1A1A1A)
|
||||
C_TEXT=$(_hex COLOR_TEXT D6ABAB)
|
||||
C_HI=$(_hex COLOR_HIGHLIGHT E40046)
|
||||
C_VIO=$(_hex COLOR_DARK 5018DD)
|
||||
C_RED=$(_hex COLOR_RED F50505)
|
||||
|
||||
# Derived
|
||||
C_BG2="#242424"
|
||||
C_BG3="#2e2e2e"
|
||||
C_BORDER="${C_VIO}"
|
||||
|
||||
CSS="
|
||||
/* ── CyberQueer Theme ──────────────────────────────────────────────── */
|
||||
:root {
|
||||
--bg: ${C_BG};
|
||||
--bg2: ${C_BG2};
|
||||
--bg3: ${C_BG3};
|
||||
--text: ${C_TEXT};
|
||||
--accent: ${C_HI};
|
||||
--violet: ${C_VIO};
|
||||
--danger: ${C_RED};
|
||||
--border: ${C_BORDER};
|
||||
--radius: 10px;
|
||||
--radius-sm: 5px;
|
||||
}
|
||||
|
||||
/* ── Reset & Base ──────────────────────────────────────────────────── */
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: 'Agave Nerd Font Mono', 'JetBrains Mono', 'Fira Code',
|
||||
'Cascadia Code', 'Source Code Pro', monospace;
|
||||
font-size: 15px;
|
||||
line-height: 1.75;
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 2rem 5rem;
|
||||
}
|
||||
|
||||
/* ── Typography ────────────────────────────────────────────────────── */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'Agave Nerd Font Mono', monospace;
|
||||
font-weight: 700;
|
||||
line-height: 1.25;
|
||||
margin-top: 2.2rem;
|
||||
margin-bottom: 0.6rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: var(--accent);
|
||||
font-size: 2.2rem;
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: var(--accent);
|
||||
font-size: 1.55rem;
|
||||
border-bottom: 2px solid var(--violet);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: var(--violet);
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
h4, h5, h6 {
|
||||
color: var(--text);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.9rem 0;
|
||||
}
|
||||
|
||||
strong { color: var(--accent); font-weight: 700; }
|
||||
em { color: var(--violet); font-style: italic; }
|
||||
|
||||
/* ── Links ─────────────────────────────────────────────────────────── */
|
||||
a {
|
||||
color: var(--violet);
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: color 0.15s, border-color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent);
|
||||
border-bottom-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ── Code ──────────────────────────────────────────────────────────── */
|
||||
code {
|
||||
font-family: inherit;
|
||||
background: var(--bg2);
|
||||
color: var(--violet);
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: var(--radius-sm);
|
||||
padding: 0.1em 0.42em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: var(--bg2);
|
||||
border: 2px solid var(--violet);
|
||||
border-radius: var(--radius);
|
||||
padding: 1.2rem 1.4rem;
|
||||
overflow-x: auto;
|
||||
margin: 1.2rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
pre code {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 0;
|
||||
color: var(--text);
|
||||
font-size: 0.875em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Syntax-like token colouring (no JS required — structural only) */
|
||||
pre code .kw { color: var(--accent); }
|
||||
pre code .str { color: var(--violet); }
|
||||
pre code .cm { color: #666; font-style: italic; }
|
||||
|
||||
/* ── Horizontal Rule ───────────────────────────────────────────────── */
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 2px solid var(--violet);
|
||||
margin: 2rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
/* ── Blockquote ────────────────────────────────────────────────────── */
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--bg2);
|
||||
margin: 1.2rem 0;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 0 var(--radius) var(--radius) 0;
|
||||
color: var(--text);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
blockquote p { margin: 0; }
|
||||
|
||||
/* ── Tables ────────────────────────────────────────────────────────── */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin: 1.2rem 0;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
th {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
text-align: left;
|
||||
padding: 0.55rem 0.9rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0.5rem 0.9rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
tr:nth-child(even) td { background: var(--bg2); }
|
||||
tr:hover td { background: var(--bg3); }
|
||||
|
||||
/* ── Lists ─────────────────────────────────────────────────────────── */
|
||||
ul, ol {
|
||||
padding-left: 1.6rem;
|
||||
margin: 0.7rem 0;
|
||||
}
|
||||
|
||||
li { margin: 0.25rem 0; }
|
||||
|
||||
ul li::marker { color: var(--accent); }
|
||||
ol li::marker { color: var(--violet); font-weight: 700; }
|
||||
|
||||
/* ── Nav sidebar (index page) ──────────────────────────────────────── */
|
||||
nav ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav li { margin: 0.3rem 0; }
|
||||
|
||||
/* ── Page Header Bar ───────────────────────────────────────────────── */
|
||||
.page-header {
|
||||
border-bottom: 3px solid var(--accent);
|
||||
padding-bottom: 0.6rem;
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.page-header .site-title {
|
||||
color: var(--accent);
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ── Back link ─────────────────────────────────────────────────────── */
|
||||
.back-link {
|
||||
display: inline-block;
|
||||
color: var(--violet);
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 1.5rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border: 1px solid var(--violet);
|
||||
border-radius: 30px;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.back-link:hover {
|
||||
background: var(--violet);
|
||||
color: var(--bg);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
/* ── Footer ────────────────────────────────────────────────────────── */
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--bg3);
|
||||
color: var(--text);
|
||||
opacity: 0.4;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Responsive ────────────────────────────────────────────────────── */
|
||||
@media (max-width: 680px) {
|
||||
body { padding: 1.2rem 1rem 3rem; font-size: 14px; }
|
||||
h1 { font-size: 1.7rem; }
|
||||
h2 { font-size: 1.3rem; }
|
||||
table { display: block; overflow-x: auto; }
|
||||
}
|
||||
|
||||
/* ── Selection ─────────────────────────────────────────────────────── */
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--bg);
|
||||
}
|
||||
|
||||
/* ── Scrollbar ─────────────────────────────────────────────────────── */
|
||||
::-webkit-scrollbar { width: 8px; height: 8px; }
|
||||
::-webkit-scrollbar-track { background: var(--bg2); }
|
||||
::-webkit-scrollbar-thumb { background: var(--violet); border-radius: 4px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
|
||||
"
|
||||
|
||||
# ── HTML template ─────────────────────────────────────────────────────────────
|
||||
render_html() {
|
||||
local title="$1"
|
||||
local body_html="$2"
|
||||
local is_index="$3" # "true" or "false"
|
||||
|
||||
local back_link=""
|
||||
if [[ "$is_index" == "false" ]]; then
|
||||
back_link='<a class="back-link" href="index.html">← Index</a>'
|
||||
fi
|
||||
|
||||
cat <<HTML
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${title} — M-Archy Dotfiles</title>
|
||||
<style>${CSS}</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="page-header">
|
||||
<span class="site-title">M-Archy Dotfiles</span>
|
||||
</header>
|
||||
${back_link}
|
||||
<main>
|
||||
${body_html}
|
||||
</main>
|
||||
<footer>
|
||||
Generated by md-to-html.sh · CyberQueer theme · $(date '+%Y-%m-%d')
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
HTML
|
||||
}
|
||||
|
||||
# ── Python converter ──────────────────────────────────────────────────────────
|
||||
convert_file() {
|
||||
local src="$1"
|
||||
local base; base="$(basename "$src" .md)"
|
||||
local dest="$HTML_DIR/${base}.html"
|
||||
local is_index="false"
|
||||
[[ "$base" == "index" ]] && is_index="true"
|
||||
|
||||
# Extract title from first H1 in the markdown
|
||||
local title
|
||||
title=$(grep -m1 '^# ' "$src" | sed 's/^# //' || echo "$base")
|
||||
|
||||
# Convert markdown → HTML body via python-markdown
|
||||
local body_html
|
||||
body_html=$(python3 - "$src" <<'PYEOF'
|
||||
import sys, markdown
|
||||
|
||||
with open(sys.argv[1], encoding="utf-8") as fh:
|
||||
text = fh.read()
|
||||
|
||||
extensions = [
|
||||
"tables",
|
||||
"fenced_code",
|
||||
"toc",
|
||||
"attr_list",
|
||||
"def_list",
|
||||
"abbr",
|
||||
"meta",
|
||||
]
|
||||
|
||||
md = markdown.Markdown(extensions=extensions, extension_configs={
|
||||
"toc": {"permalink": True, "permalink_class": "toc-anchor"},
|
||||
})
|
||||
|
||||
print(md.convert(text))
|
||||
PYEOF
|
||||
)
|
||||
|
||||
render_html "$title" "$body_html" "$is_index" > "$dest"
|
||||
printf " %-40s → %s\n" "$(basename "$src")" "$(basename "$dest")"
|
||||
}
|
||||
|
||||
# ── Main ──────────────────────────────────────────────────────────────────────
|
||||
if [[ $# -gt 0 ]]; then
|
||||
# Explicit file list
|
||||
for f in "$@"; do
|
||||
[[ -f "$f" ]] || { echo "Not found: $f" >&2; continue; }
|
||||
convert_file "$f"
|
||||
done
|
||||
else
|
||||
# All markdown files in docs/md/
|
||||
shopt -s nullglob
|
||||
files=("$MD_DIR"/*.md)
|
||||
if [[ ${#files[@]} -eq 0 ]]; then
|
||||
echo "No .md files found in $MD_DIR"
|
||||
exit 0
|
||||
fi
|
||||
echo "Converting ${#files[@]} files → $HTML_DIR/"
|
||||
for f in "${files[@]}"; do
|
||||
convert_file "$f"
|
||||
done
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Done. Open docs/html/index.html in a browser."
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
# Archiso — Custom Live Installer
|
||||
|
||||
The archiso build system produces a bootable Arch Linux ISO pre-loaded with the M-Archy installer scripts. Optionally, an answerfile can be embedded so the entire install — base OS + dotfiles — runs with zero user interaction.
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
```bash
|
||||
sudo pacman -S archiso jq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Building the ISO
|
||||
|
||||
```bash
|
||||
# Basic build — interactive installer, no answerfile
|
||||
bash setup/archiso/build.sh
|
||||
|
||||
# Specify output directory
|
||||
bash setup/archiso/build.sh /path/to/output
|
||||
|
||||
# Embed an answerfile for automated deployment
|
||||
bash setup/archiso/build.sh --preconf
|
||||
|
||||
# Embed a specific answerfile
|
||||
bash setup/archiso/build.sh --preconf ~/my-server.json
|
||||
|
||||
# Both flags together
|
||||
bash setup/archiso/build.sh --preconf ~/my-server.json /media/usb/output
|
||||
```
|
||||
|
||||
| Flag | Effect |
|
||||
|------|--------|
|
||||
| _(none)_ | Clean ISO, no answerfile |
|
||||
| `--preconf` | Embed `~/answerfile.json` at `/answerfile.json` in the ISO |
|
||||
| `--preconf FILE` | Embed the specified file instead |
|
||||
|
||||
Build artefacts land in `~/m-archy-out/` by default. Override with the `OUT_DIR` environment variable or by passing a path argument.
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Variable | Default | Purpose |
|
||||
|----------|---------|---------|
|
||||
| `WORK_DIR` | `~/m-archy-build` | Scratch space for mkarchiso |
|
||||
| `OUT_DIR` | `~/m-archy-out` | ISO output directory |
|
||||
|
||||
---
|
||||
|
||||
## What the Build Does
|
||||
|
||||
1. Copies the upstream `releng` Arch base profile
|
||||
2. Applies the M-Archy overlay (`setup/archiso/overlay/`)
|
||||
3. Replaces `profiledef.sh` with the M-Archy version
|
||||
4. Adds extra packages from `packages.extra`
|
||||
5. Embeds both installer scripts (`arch-autoinstall.sh`, `archbaseos-guided-install.sh`) into `/root/installer/`
|
||||
6. If `--preconf`: copies the answerfile to `/answerfile.json` in the ISO's airootfs
|
||||
7. Runs `mkarchiso` to produce the final `.iso`
|
||||
|
||||
---
|
||||
|
||||
## Extra Packages on the Live System
|
||||
|
||||
Defined in `setup/archiso/overlay/packages.extra`:
|
||||
|
||||
```
|
||||
git
|
||||
jq
|
||||
pam-u2f
|
||||
btop
|
||||
fastfetch
|
||||
openssh
|
||||
```
|
||||
|
||||
These are added on top of the standard Arch `releng` package set.
|
||||
|
||||
---
|
||||
|
||||
## Live System Entry Points
|
||||
|
||||
Once booted from the ISO, the following are available:
|
||||
|
||||
### `install-arch`
|
||||
|
||||
A command placed in `/usr/local/bin/`:
|
||||
|
||||
```bash
|
||||
install-arch # guided mode (default)
|
||||
install-arch guided # guided interactive install
|
||||
install-arch auto # automated mode (reads /answerfile.json)
|
||||
```
|
||||
|
||||
### `/root/launch.sh`
|
||||
|
||||
Internal dispatcher used by `install-arch`.
|
||||
|
||||
### `/answerfile.json`
|
||||
|
||||
Only present when built with `--preconf`. Both installer scripts check for this file on startup. If found, all prompts are answered from it — the only interaction required is the disk-encryption password (passwords are never stored in answerfiles).
|
||||
|
||||
---
|
||||
|
||||
## Automated Deployment Workflow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Developer machine │
|
||||
│ │
|
||||
│ 1. generate-answerfile.sh │
|
||||
│ → ~/answerfile.json │
|
||||
│ │
|
||||
│ 2. build.sh --preconf │
|
||||
│ → ~/m-archy-out/m-archy.iso │
|
||||
│ │
|
||||
│ 3. dd if=m-archy.iso of=/dev/sdX │
|
||||
└──────────────┬──────────────────────┘
|
||||
│ USB
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Target machine (boots from USB) │
|
||||
│ │
|
||||
│ 4. install-arch auto │
|
||||
│ reads /answerfile.json │
|
||||
│ installs base OS │
|
||||
│ runs tui-install.sh in chroot │
|
||||
│ installs dotfiles & apps │
|
||||
│ │
|
||||
│ 5. Reboot → ready system │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
For multi-machine deployments, the `hostname` field in the answerfile is combined with the machine's MAC address, so each system gets a unique hostname even though they share the same answerfile.
|
||||
|
||||
---
|
||||
|
||||
## Overlay Structure
|
||||
|
||||
```
|
||||
setup/archiso/overlay/
|
||||
├── airootfs/
|
||||
│ ├── etc/motd # Welcome message
|
||||
│ ├── root/
|
||||
│ │ └── launch.sh # Installer entry point
|
||||
│ └── usr/local/bin/
|
||||
│ └── install-arch # User-facing CLI command
|
||||
├── packages.extra # Additional live-system packages
|
||||
└── profiledef.sh # M-Archy ISO profile definition
|
||||
```
|
||||
|
||||
The `build.sh` script also adds at build time:
|
||||
```
|
||||
airootfs/root/installer/
|
||||
├── arch-autoinstall.sh
|
||||
└── archbaseos-guided-install.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Writing the ISO to USB
|
||||
|
||||
```bash
|
||||
# Find the USB drive
|
||||
lsblk
|
||||
|
||||
# Write (replace /dev/sdX with your drive — ALL DATA WILL BE ERASED)
|
||||
sudo dd if=~/m-archy-out/m-archy-*.iso of=/dev/sdX bs=4M status=progress oflag=sync
|
||||
```
|
||||
|
||||
Or use `ventoy` / `balenaEtcher` as alternatives.
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
# Editors
|
||||
|
||||
Three editors are configured and deployed by the `shell` component: Neovim (primary), Micro (lightweight), and Yazi (terminal file manager).
|
||||
|
||||
---
|
||||
|
||||
## Neovim
|
||||
|
||||
Config lives in `nvim/`. Deployed to `~/.config/nvim/` during `shell` module install.
|
||||
|
||||
### Plugin Manager
|
||||
|
||||
[vim-plug](https://github.com/junegunn/vim-plug) is auto-installed on first launch. Run `:PlugInstall` after the first start to fetch all plugins.
|
||||
|
||||
### Plugins
|
||||
|
||||
#### Language & Completion
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `neoclide/coc.nvim` | LSP client, auto-completion, diagnostics |
|
||||
| `rust-lang/rust.vim` | Rust filetype support |
|
||||
| `nvim-telescope/telescope.nvim` | Fuzzy finder (files, grep, LSP symbols) |
|
||||
|
||||
#### UI
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `vim-airline/vim-airline` | Status bar |
|
||||
| `vim-airline/vim-airline-themes` | Airline theme collection |
|
||||
| `junegunn/goyo.vim` | Distraction-free writing mode |
|
||||
| `voldikss/vim-floaterm` | Floating terminal windows |
|
||||
| `norcalli/nvim-colorizer.lua` | Inline colour preview |
|
||||
|
||||
#### Navigation
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `preservim/nerdtree` | File tree sidebar |
|
||||
| `junegunn/fzf` + `fzf.vim` | Fuzzy file/buffer search |
|
||||
| `elihunter173/dirbuf.nvim` | Editable directory buffer |
|
||||
|
||||
#### Snippets
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `SirVer/ultisnips` | Snippet engine |
|
||||
| `honza/vim-snippets` | Snippet collection |
|
||||
|
||||
#### Database
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `tpope/vim-dadbod` | Database query runner |
|
||||
| `kristijanhusak/vim-dadbod-ui` | GUI for vim-dadbod |
|
||||
|
||||
#### Markdown
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `tadmccorkle/markdown.nvim` | Enhanced Markdown support |
|
||||
| `ellisonleao/glow.nvim` | Markdown preview in terminal |
|
||||
|
||||
#### Theme
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `the_miro/cyberqueer.nvim` | CyberQueer colour scheme (local) |
|
||||
|
||||
### CoC LSP Settings
|
||||
|
||||
`nvim/coc-settings.json` configures language servers for:
|
||||
- Python (pyright)
|
||||
- Lua (lua-language-server)
|
||||
- Rust (rust-analyzer via rust.vim)
|
||||
|
||||
### CyberQueer Airline Theme
|
||||
|
||||
`nvim/cyberqueer-airline.vim` — a custom vim-airline theme using the CyberQueer palette, providing hot-pink/violet segments in the status bar.
|
||||
|
||||
---
|
||||
|
||||
## Micro
|
||||
|
||||
A modern, keyboard-friendly terminal editor. Config in `micro/`. Deployed to `~/.config/micro/`.
|
||||
|
||||
### Settings (`settings.json`)
|
||||
|
||||
| Setting | Value | Effect |
|
||||
|---------|-------|--------|
|
||||
| `colorscheme` | `miro-darcula` | Custom dark colour scheme |
|
||||
| Various | — | File-type-specific settings |
|
||||
|
||||
### Keybindings (`bindings.json`)
|
||||
|
||||
Custom keybindings extending Micro's defaults. See `micro/bindings.json` for the full list.
|
||||
|
||||
### Colour Schemes
|
||||
|
||||
`micro/colorschemes/` contains additional colour scheme definitions including the custom `miro-darcula` scheme.
|
||||
|
||||
### Plugins (`micro/plug/`)
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `filemanager` | Sidebar file browser |
|
||||
| `mlsp` | Language Server Protocol integration |
|
||||
|
||||
---
|
||||
|
||||
## Yazi
|
||||
|
||||
A fast, feature-rich terminal file manager written in Rust.
|
||||
Config in `yazi/`. Deployed to `~/.config/yazi/`.
|
||||
|
||||
### Configuration Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `yazi.toml` | Core settings (openers, file rules, display) |
|
||||
| `theme.toml` | CyberQueer colour palette |
|
||||
| `keymap.toml` | Keybindings (17 KB, extensively customised) |
|
||||
|
||||
### Theme
|
||||
|
||||
`yazi/theme.toml` maps the CyberQueer colours to Yazi's theme variables. It is a colour-substitution target in `apply-theme.sh`, so it updates automatically when you change the palette.
|
||||
|
||||
### File Openers
|
||||
|
||||
| File type | Opens with |
|
||||
|-----------|-----------|
|
||||
| `*.svg` | Inkscape |
|
||||
| Text files | Neovim |
|
||||
| Everything else | `xdg-open` (system default) |
|
||||
|
||||
### Display Options
|
||||
|
||||
- Hidden files visible by default
|
||||
- Symlinks shown and followed
|
||||
- Three-pane layout (parent, current, preview)
|
||||
|
||||
---
|
||||
|
||||
## Launching Editors
|
||||
|
||||
From the Hyprland desktop:
|
||||
|
||||
| Shortcut | Action |
|
||||
|----------|--------|
|
||||
| `Super + M` | Open Micro in Kitty |
|
||||
| `Super + E` | Open Yazi in Kitty |
|
||||
| `Super + T` then `nvim` | Neovim in terminal |
|
||||
|
||||
From the shell:
|
||||
```bash
|
||||
nvim file.rs # Neovim
|
||||
micro config.yaml # Micro
|
||||
yazi # Yazi file manager
|
||||
```
|
||||
|
|
@ -0,0 +1,211 @@
|
|||
# FreeIPA & Ansible
|
||||
|
||||
The FreeIPA/Ansible system provides centralised identity management for a fleet of Arch Linux machines: single sign-on, host-group-driven package and module deployment, LUKS backup key collection, and automatic Keycloak configuration.
|
||||
|
||||
All relevant files live under `setup/modules/FreeipaAnsible/`.
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌────────────────────────────────────┐
|
||||
│ FreeIPA Server │
|
||||
│ (can run in Docker / LXC) │
|
||||
│ │
|
||||
│ • User/host directory │
|
||||
│ • Kerberos KDC │
|
||||
│ • DNS (optional) │
|
||||
│ • Host group management │
|
||||
└──────────┬─────────────────────────┘
|
||||
│ SSSD / Kerberos
|
||||
▼
|
||||
┌────────────────────────────────────┐
|
||||
│ Enrolled client machine │
|
||||
│ │
|
||||
│ • sssd — authentication │
|
||||
│ • ipa CLI — host group queries │
|
||||
│ • Ansible-deployed timers │
|
||||
│ ├── package installer │
|
||||
│ ├── module installer │
|
||||
│ ├── Flatpak installer │
|
||||
│ └── baseuser group sync │
|
||||
└────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FreeIPA Server
|
||||
|
||||
### Docker / OCI Image
|
||||
|
||||
A pre-built Docker image is available via `setup/modules/FreeipaAnsible/image/`:
|
||||
|
||||
```bash
|
||||
cd setup/modules/FreeipaAnsible/image
|
||||
cp .env.example .env
|
||||
# Edit .env with your domain, admin password, realm, etc.
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
The container runs `ipa-first-boot.sh` on first start to initialise the IPA instance, then optionally `keycloak-configure.sh` to wire up Keycloak as an OIDC provider.
|
||||
|
||||
### Interactive Server Setup
|
||||
|
||||
```bash
|
||||
bash setup/modules/optional-Modules/apps/freeipa-server.sh
|
||||
```
|
||||
|
||||
Prompts for realm, domain, admin password, and whether to generate client-install scripts.
|
||||
|
||||
---
|
||||
|
||||
## Client Enrollment
|
||||
|
||||
### Via Installer Module
|
||||
|
||||
Select `freeipa-client` during `tui-install.sh` or `install-modules.sh`.
|
||||
|
||||
### Manual Enrollment
|
||||
|
||||
Three modes:
|
||||
|
||||
```bash
|
||||
# Answerfile mode (unattended)
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh \
|
||||
--answerfile setup/modules/FreeipaAnsible/freeipa-client-answerfile.json
|
||||
|
||||
# Interactive prompts
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh --interactive
|
||||
|
||||
# Direct flag passthrough to freeipa-enroll.sh
|
||||
bash setup/modules/FreeipaAnsible/freeipa-client.sh \
|
||||
--domain freeipa.example.com \
|
||||
--server ipa.example.com \
|
||||
--principal admin
|
||||
```
|
||||
|
||||
### Client Answerfile Schema
|
||||
|
||||
```json
|
||||
{
|
||||
"domain": "freeipa.abdelbaki.eu",
|
||||
"realm": "FREEIPA.ABDELBAKI.EU",
|
||||
"server": "freeipa.abdelbaki.eu",
|
||||
"hostname": "",
|
||||
"principal": "admin",
|
||||
"password": "",
|
||||
"mkhomedir": true,
|
||||
"sudo": true,
|
||||
"dns_update": true,
|
||||
"ntp_server": "",
|
||||
"fido2": false,
|
||||
"fido2_users": []
|
||||
}
|
||||
```
|
||||
|
||||
Leave `hostname` blank to use the current machine hostname. Leave `password` blank to be prompted at enrollment time.
|
||||
|
||||
---
|
||||
|
||||
## Ansible Playbooks
|
||||
|
||||
All playbooks live in `setup/modules/FreeipaAnsible/ansible/` and require an inventory of enrolled IPA clients.
|
||||
|
||||
### Deploy Package Auto-Installer
|
||||
|
||||
```bash
|
||||
ansible-playbook -i inventory deploy-ansipa-install.yml
|
||||
```
|
||||
|
||||
Deploys `ansipa-install-packages.sh` + a systemd timer that runs every 30 minutes. The script queries IPA for host groups named `ansipa-install-<package>` and installs/removes packages to match.
|
||||
|
||||
**Group naming convention:** `ansipa-install-firefox` → installs the `firefox` package.
|
||||
|
||||
### Deploy Module Auto-Installer
|
||||
|
||||
```bash
|
||||
ansible-playbook -i inventory deploy-ansipa-modules.yml \
|
||||
[-e ansipa_user=amir]
|
||||
```
|
||||
|
||||
Deploys `ansipa-install-modules.sh` + timer. Queries for groups named `ansipa-module-<name>` and runs the matching script from `/usr/local/lib/ansipa-modules/<name>.sh`.
|
||||
|
||||
Module scripts are the same ones used by `install-modules.sh` — copied from `setup/modules/optional-Modules/apps/*.sh`.
|
||||
|
||||
**Group naming convention:** `ansipa-module-docker` → runs `docker.sh` on the host.
|
||||
|
||||
Each module is applied once and stamped in `/var/lib/ansipa-modules/<name>.done`. Re-running the timer skips already-applied modules.
|
||||
|
||||
### Deploy BaseUser Sync
|
||||
|
||||
```bash
|
||||
ansible-playbook -i inventory deploy-baseuser-sync.yml
|
||||
```
|
||||
|
||||
Deploys a `systemd.path` unit that triggers whenever a user logs in. If the user is a member of the IPA `BaseUser` group, they are automatically added to the local `baseusers` group — useful for desktop permission grants.
|
||||
|
||||
### Collect LUKS Backup Keys
|
||||
|
||||
```bash
|
||||
ansible-playbook -i inventory collect-luks-keys.yml \
|
||||
[-e luks_keys_store=/secure/location]
|
||||
```
|
||||
|
||||
For each enrolled host, checks for `/_LUKS_BACKUP_KEY` (placed there by the M-Archy installer when disk encryption is enabled) and fetches it to the controller as:
|
||||
|
||||
```
|
||||
<luks_keys_store>/<HOSTNAME>_LUKS_BACKUP_KEY
|
||||
```
|
||||
|
||||
Keys are stored with mode `0400`. The store directory is created with mode `0700`.
|
||||
|
||||
**Schedule for automatic collection:**
|
||||
```bash
|
||||
# Add to crontab on the Ansible controller
|
||||
0 3 * * * cd /path/to/playbooks && ansible-playbook -i inventory collect-luks-keys.yml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Host Group Reference
|
||||
|
||||
| Group prefix | Handled by | Effect |
|
||||
|--------------|-----------|--------|
|
||||
| `ansipa-install-<pkg>` | `ansipa-install-packages.sh` | Install/remove native package |
|
||||
| `ansipa-module-<name>` | `ansipa-install-modules.sh` | Run module script once |
|
||||
| `fp_install-<app>` | `ansipa-install-flatpaks.sh` | Install Flatpak app |
|
||||
| `BaseUser` | `auto-add-baseuser.sh` | Add user to local `baseusers` group |
|
||||
|
||||
---
|
||||
|
||||
## LUKS Key Flow
|
||||
|
||||
```
|
||||
Install time (arch-autoinstall.sh or archbaseos-guided-install.sh)
|
||||
─────────────────────────────────────────────────────────────────
|
||||
1. User sets primary LUKS passphrase interactively
|
||||
2. 64-byte random key generated from /dev/urandom
|
||||
3. Key enrolled in second LUKS slot
|
||||
4. Key written to /_LUKS_BACKUP_KEY (mode 0400, root-only)
|
||||
inside the encrypted Btrfs volume
|
||||
|
||||
Post-install (Ansible)
|
||||
──────────────────────
|
||||
5. collect-luks-keys.yml runs from the controller
|
||||
6. Fetches /_LUKS_BACKUP_KEY from each client
|
||||
7. Stores as luks-keys/<HOSTNAME>_LUKS_BACKUP_KEY (mode 0400)
|
||||
on the controller
|
||||
```
|
||||
|
||||
The backup key lives inside the encrypted partition, so it is only accessible when the disk is already unlocked. Its purpose is to allow an admin to unlock the disk for recovery without knowing the user's passphrase.
|
||||
|
||||
---
|
||||
|
||||
## Auto Enrollment + Ansible
|
||||
|
||||
```bash
|
||||
bash setup/modules/FreeipaAnsible/auto-enroll-ansible.sh
|
||||
```
|
||||
|
||||
Combines FreeIPA client enrollment and Ansible deployment in one shot. Useful for provisioning scripts that run on first boot.
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
# Hyprland Desktop Environment
|
||||
|
||||
The Hyprland setup is the primary desktop environment — a Wayland compositor with a full ecosystem of bars, launchers, notification daemons, and theming tools.
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
| Component | Role |
|
||||
|-----------|------|
|
||||
| **Hyprland** | Wayland tiling compositor (dwindle layout) |
|
||||
| **Kitty** | Primary terminal emulator |
|
||||
| **EWW** | Status bar (three device variants) |
|
||||
| **Waybar** | Alternative status bar |
|
||||
| **Wofi** | App launcher (keyboard-driven) |
|
||||
| **Walker** | Fast CLI launcher |
|
||||
| **uLauncher** | GUI app launcher |
|
||||
| **Dunst** | Notification daemon |
|
||||
| **Hyprlock** | Screen locker |
|
||||
| **Hyprpaper** | Wallpaper daemon |
|
||||
| **Hypridle** | Idle management (sleep, lock) |
|
||||
| **nwg-dock** | Application dock |
|
||||
| **nwg-drawer** | Application drawer |
|
||||
| **nwg-panel** | Desktop menu |
|
||||
| **Vicinae** | Gesture-triggered context launcher |
|
||||
| **ly** | TUI login manager |
|
||||
|
||||
---
|
||||
|
||||
## Config File Map
|
||||
|
||||
```
|
||||
desktopenvs/hyprland/
|
||||
├── hypr/
|
||||
│ ├── hyprland.conf # Root config — imports all below
|
||||
│ ├── hyprtoolkit.conf # Toolkit utilities
|
||||
│ ├── hyprlock.conf # Lock screen
|
||||
│ ├── hypridle.conf # Idle timeouts
|
||||
│ └── hyprpaper.conf # Wallpaper
|
||||
├── hypr-usr/ # Per-user override layer
|
||||
│ ├── binds.conf # All keybindings
|
||||
│ ├── input.conf # Keyboard/mouse settings
|
||||
│ ├── monitors.conf # Display layout
|
||||
│ ├── windowrules.conf # Per-app behaviour rules
|
||||
│ └── autostart.conf # Startup programs
|
||||
├── kitty/
|
||||
│ ├── kitty.conf # Terminal config
|
||||
│ ├── current-theme.conf # Active palette (CyberQueer)
|
||||
│ └── themes/cyberqueer.conf # Theme definition
|
||||
├── waybar/
|
||||
│ ├── config # Module layout and data sources
|
||||
│ └── style.css # CyberQueer styling
|
||||
├── wofi/style.css # Launcher styling
|
||||
├── walker/themes/ # Walker theme (cyberqueer.css)
|
||||
├── dunst/ # Notification styling
|
||||
├── eww/ # EWW bar (PC — no battery)
|
||||
├── eww-nobattery/ # EWW bar alias
|
||||
├── eww-touch/ # EWW bar (tablet / touchscreen)
|
||||
├── spicetify/ # Spotify CyberQueer themes
|
||||
├── Vencord/ # Discord CyberQueer themes
|
||||
├── btop/ # System monitor + cyberqueer.theme
|
||||
├── scripts/ # 20+ utility scripts
|
||||
└── config-updater/ # Config synchronisation tool
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Keybindings
|
||||
|
||||
All bindings live in `hypr-usr/binds.conf`.
|
||||
|
||||
### Applications
|
||||
|
||||
| Binding | Action |
|
||||
|---------|--------|
|
||||
| `Super + T` | Kitty terminal |
|
||||
| `Super + Shift + T` | Cool Retro Term (CRT profile) |
|
||||
| `Super + M` | Micro editor |
|
||||
| `Super + E` | Thunar file manager |
|
||||
| `Super + X` | Wofi app launcher |
|
||||
| `Super + F` | File search (wofi) |
|
||||
| `Super + Shift + F` | Folder search (wofi) |
|
||||
|
||||
### Window Management
|
||||
|
||||
| Binding | Action |
|
||||
|---------|--------|
|
||||
| `Super + Q` | Close focused window |
|
||||
| `Super + V` | Toggle floating |
|
||||
| `Super + Shift + V` | Centre floating window |
|
||||
| `Super + P` | Toggle pseudo-tiling |
|
||||
| `Super + J` | Toggle split direction |
|
||||
| `Super + Arrow / hjkl` | Focus window by direction |
|
||||
| `Super + Shift + Arrow / hjkl` | Move window by direction |
|
||||
| `Super + [0-9]` | Switch workspace |
|
||||
| `Super + Shift + [0-9]` | Move window to workspace |
|
||||
| `Super + mouse drag` | Move/resize floating window |
|
||||
|
||||
### System
|
||||
|
||||
| Binding | Action |
|
||||
|---------|--------|
|
||||
| `Super + O` | Lock screen (hyprlock) |
|
||||
| `Super + Alt + O` | Power menu |
|
||||
| `Super + Ctrl + O` | Shutdown immediately |
|
||||
| `Super + Z` | Toggle EWW bar |
|
||||
| `Super + Ctrl + P` | Start screen recording |
|
||||
|
||||
### Touchpad Gestures
|
||||
|
||||
| Gesture | Action |
|
||||
|---------|--------|
|
||||
| 3-finger swipe left/right | Switch workspace |
|
||||
| 3-finger swipe up/down | Move window to workspace |
|
||||
| 3-finger pinch | Toggle overview |
|
||||
| 4-finger tap | Open launcher |
|
||||
|
||||
---
|
||||
|
||||
## Status Bar (EWW)
|
||||
|
||||
EWW (Elkowar's Wayland Window Manager) is compiled from source during Hyprland install and comes in three variants:
|
||||
|
||||
| Variant | Device | Battery Widget |
|
||||
|---------|--------|---------------|
|
||||
| `eww/` | Desktop PC | No |
|
||||
| `eww-nobattery/` | Desktop PC | No |
|
||||
| `eww-touch/` | Laptop / tablet | Yes |
|
||||
|
||||
During install the EWW installer asks which variant to use.
|
||||
|
||||
### Waybar
|
||||
|
||||
An alternative to EWW — always installed. The bar layout:
|
||||
|
||||
- **Left**: clock, disk usage, RAM, CPU, temperature
|
||||
- **Centre**: workspace switcher, active window title
|
||||
- **Right**: network speed, IP address, system tray, audio volume, battery (if present)
|
||||
|
||||
---
|
||||
|
||||
## Launchers
|
||||
|
||||
### Wofi
|
||||
|
||||
Keyboard-driven app/file launcher. Activated with `Super + X`.
|
||||
Config: `wofi/style.css` — themed with CyberQueer colours.
|
||||
|
||||
### Walker
|
||||
|
||||
Fast CLI launcher (`walker`). Pre-configured with `walker/config.toml` and the `cyberqueer.css` / `cyberqueer.toml` theme files.
|
||||
|
||||
### uLauncher
|
||||
|
||||
GUI launcher with plugin support. Theme: `ulauncher/user-themes/cyberqueer/`.
|
||||
Colours in the theme are colour-substitution targets (updated by `apply-theme.sh`).
|
||||
|
||||
---
|
||||
|
||||
## Notification Daemon (Dunst)
|
||||
|
||||
Lightweight notification daemon. Config in `dunst/dunstrc`.
|
||||
Notifications appear top-right with CyberQueer styling.
|
||||
|
||||
---
|
||||
|
||||
## Lock Screen (Hyprlock)
|
||||
|
||||
`hyprlock` is the Wayland screen locker. Config at `hypr/hyprlock.conf`.
|
||||
Activated by `Super + O` or automatically via `hypridle` after idle timeout.
|
||||
|
||||
---
|
||||
|
||||
## Scripts Reference
|
||||
|
||||
All scripts live in `desktopenvs/hyprland/scripts/` and are deployed to `~/.config/scripts/`.
|
||||
|
||||
| Script | Purpose |
|
||||
|--------|---------|
|
||||
| `caffeine.sh` | Toggle hypridle (prevent sleep) |
|
||||
| `ewwstart.sh` | Launch EWW bar on startup |
|
||||
| `ewwstart-niri.sh` | EWW for niri compositor variant |
|
||||
| `togglebar.sh` | Show/hide EWW bar (monitor-aware) |
|
||||
| `helpmenu.sh` | Display keybindings from binds.conf |
|
||||
| `screenshot.sh` | Region/full screenshot via grim + slurp |
|
||||
| `screenrec.sh` | Screen recording |
|
||||
| `screenrotationacw.sh` | Rotate screen anti-clockwise (tablet) |
|
||||
| `screenrotationwcw.sh` | Rotate screen clockwise (tablet) |
|
||||
| `unified-rotate.sh` | Unified rotation handler |
|
||||
| `hyprland-toggle-touchpad.sh` | Enable/disable touchpad |
|
||||
| `wofi-file-search.sh` | File search via wofi |
|
||||
| `foldersearch.sh` | Folder search via wofi |
|
||||
| `pwr-dmenu.sh` | Power menu (shutdown/reboot/suspend) |
|
||||
| `caffeine.sh` | Toggle idle inhibitor |
|
||||
| `getispeed.sh` | Internet speed test display |
|
||||
| `journal.sh` | Quick journal entry |
|
||||
| `date.sh` / `time.sh` | Date/time waybar helpers |
|
||||
| `uptime.sh` | Uptime display |
|
||||
| `dysk-phydisks.sh` | Physical disk info (dysk) |
|
||||
| `drawer.sh` | Open nwg-drawer |
|
||||
| `menu.sh` | Application menu |
|
||||
| `onscreenkb.sh` | On-screen keyboard (wvkbd) |
|
||||
| `bluetooth-applet.sh` | Bluetooth UI wrapper |
|
||||
| `togglewinbars.sh` | Toggle window title bars |
|
||||
| `toggle-layout.sh` | Switch tiling layout |
|
||||
| `playpause.sh` | Media play/pause |
|
||||
| `calender-fix.sh` | Calendar waybar widget fix |
|
||||
|
||||
---
|
||||
|
||||
## Application Theming
|
||||
|
||||
### Spotify (Spicetify)
|
||||
|
||||
Two CyberQueer Spicetify themes are available:
|
||||
|
||||
| Theme | Style |
|
||||
|-------|-------|
|
||||
| `cli-cyberqueer` | CLI-inspired, minimal |
|
||||
| `matte-cyberqueer` | Matte finish variant |
|
||||
|
||||
Applied automatically when the `spotify` module is installed.
|
||||
|
||||
### Discord (Vencord)
|
||||
|
||||
Two Discord themes:
|
||||
|
||||
| Theme | Location |
|
||||
|-------|----------|
|
||||
| `cyberqueer.theme.css` | Standalone CyberQueer theme |
|
||||
| `system24/…/cyberqueer.theme.css` | system24 framework with CyberQueer colours |
|
||||
|
||||
### Terminal (Kitty)
|
||||
|
||||
The `kitty/themes/cyberqueer.conf` file defines the full 16-colour palette mapped to CyberQueer values. It is sourced by `current-theme.conf` which is imported in `kitty.conf`.
|
||||
|
||||
---
|
||||
|
||||
## Login Manager (ly)
|
||||
|
||||
`ly` is a TUI display manager configured via `etc-ly-config.ini` (deployed to `/etc/ly/config.ini`). Its colours are tracked by `apply-theme.sh` (system file, applied via `sudo`).
|
||||
|
||||
---
|
||||
|
||||
## Installing Hyprland
|
||||
|
||||
```bash
|
||||
# Via the TUI installer
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
# → Select "shell" and "Hyprland" in the dialogs
|
||||
|
||||
# On an existing system
|
||||
bash ~/Dotfiles/setup/install-modules.sh
|
||||
# → Not available; Hyprland is a base DE, use the full installer
|
||||
|
||||
# Direct script
|
||||
bash ~/Dotfiles/setup/modules/Desktop-Environments/hyprland.sh
|
||||
```
|
||||
|
||||
The install script compiles EWW from source (requires Rust), copies all configs, installs the GTK and cursor themes, enables `ly@tty1`, and configures `greetd`.
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
# M-Archy Dotfiles
|
||||
|
||||
**Arch Linux · Hyprland · Wayland · CyberQueer**
|
||||
|
||||
A production-grade Arch Linux configuration for network administration, development, and gaming — built around the Hyprland Wayland compositor and the CyberQueer colour theme.
|
||||
|
||||
---
|
||||
|
||||
## What's Inside
|
||||
|
||||
| Area | Description |
|
||||
|------|-------------|
|
||||
| [Installation](installation.md) | Interactive TUI installer, answerfile automation, ISO building |
|
||||
| [Theming](theming.md) | CyberQueer colour system and `apply-theme.sh` |
|
||||
| [Hyprland](hyprland.md) | Desktop environment, keybindings, bars, launchers |
|
||||
| [Modules](modules.md) | Core modules and full optional-app catalogue |
|
||||
| [Archiso](archiso.md) | Building the custom live installer ISO |
|
||||
| [FreeIPA & Ansible](freeipa-ansible.md) | Identity management and automated config deployment |
|
||||
| [Editors](editors.md) | Neovim, Micro, Yazi |
|
||||
| [Utilities](utilities.md) | Encryption helpers, ClamAV, credentials, update scripts |
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# 1 — clone
|
||||
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git ~/Dotfiles
|
||||
|
||||
# 2 — run the interactive installer
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
|
||||
# 3 — optionally apply a custom colour palette
|
||||
nano ~/Dotfiles/colors.conf
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
```
|
||||
|
||||
For a fully automated install from a live USB, see [Archiso](archiso.md).
|
||||
|
||||
---
|
||||
|
||||
## CyberQueer Colour Palette
|
||||
|
||||
| Role | Name | Hex |
|
||||
|------|------|-----|
|
||||
| Background | Dark grey | `#1A1A1A` |
|
||||
| Text | Rose white | `#D6ABAB` |
|
||||
| Primary accent | Hot pink | `#E40046` |
|
||||
| Secondary accent | Electric violet | `#5018DD` |
|
||||
| Danger / alerts | Red | `#F50505` |
|
||||
|
||||
---
|
||||
|
||||
## Repository Layout
|
||||
|
||||
```
|
||||
Dotfiles/
|
||||
├── apply-theme.sh # Propagate colours across all configs
|
||||
├── colors.conf # Single source of truth for the palette
|
||||
├── update.sh # pacman + yay full system update
|
||||
├── setup/
|
||||
│ ├── tui-install.sh # Main interactive / answerfile installer
|
||||
│ ├── generate-answerfile.sh # Dry-run to produce answerfile.json
|
||||
│ ├── arch-autoinstall.sh # Automated base OS installer
|
||||
│ ├── archbaseos-guided-install.sh # Guided base OS installer
|
||||
│ ├── install-modules.sh # Add optional modules to existing system
|
||||
│ ├── archiso/ # Custom Arch live ISO builder
|
||||
│ └── modules/ # Modular install scripts
|
||||
├── desktopenvs/hyprland/ # All Hyprland / Wayland configs
|
||||
├── gtk-themes/cyberqueer/ # GTK 3 & 4 theme
|
||||
├── qt-themes/cyberqueer/ # Qt platform theme
|
||||
├── nvim/ # Neovim config
|
||||
├── micro/ # Micro editor config
|
||||
├── yazi/ # Yazi file manager config
|
||||
├── clamav/ # ClamAV on-access scan setup
|
||||
└── docs/ # This documentation
|
||||
```
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
# Installation
|
||||
|
||||
Three paths are available depending on how much you want to automate:
|
||||
|
||||
| Path | When to use |
|
||||
|------|-------------|
|
||||
| [Interactive TUI](#interactive-tui) | Fresh Arch system, guided dialogs |
|
||||
| [Answerfile (automated)](#answerfile-automated) | Unattended or repeatable installs |
|
||||
| [Custom ISO](#custom-live-iso) | Deploy from USB to multiple machines |
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Arch Linux (base install completed, user created)
|
||||
- Internet connection
|
||||
- `git` available (`sudo pacman -S git`)
|
||||
|
||||
---
|
||||
|
||||
## Interactive TUI
|
||||
|
||||
Clone the repo and run the installer:
|
||||
|
||||
```bash
|
||||
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git ~/Dotfiles
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
```
|
||||
|
||||
The TUI walks you through:
|
||||
|
||||
1. **Hostname** — optional; sets `/etc/hostname` immediately
|
||||
2. **Components** — pick any combination:
|
||||
- `pkg` — package managers (yay, nvm, Rust)
|
||||
- `core` — 100+ base system packages
|
||||
- `svc` — core services (NetworkManager, cronie, fail2ban, greetd)
|
||||
- `shell` — zsh, Neovim, Yazi, Micro, Starship
|
||||
3. **Desktop Environment** — Hyprland, Sway, KDE Plasma, GNOME, COSMIC, XFCE, LXQt, or none
|
||||
4. **Applications** — checklist of ~50 optional apps (see [Modules](modules.md))
|
||||
5. **Colorway** — optional; enter hex values to customise the CyberQueer palette
|
||||
|
||||
All activity is logged to `~/dotfiles-install.log`.
|
||||
|
||||
### Adding Modules Later
|
||||
|
||||
To install additional optional apps on an already-configured system:
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/setup/install-modules.sh
|
||||
```
|
||||
|
||||
This presents the same app checklist without re-running core setup.
|
||||
|
||||
---
|
||||
|
||||
## Answerfile (Automated)
|
||||
|
||||
An **answerfile** lets the entire install — base OS _and_ dotfiles — run without any user input.
|
||||
|
||||
### Generating an Answerfile
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/setup/generate-answerfile.sh [OUTPUT_PATH]
|
||||
# Default output: ~/answerfile.json
|
||||
```
|
||||
|
||||
This dry-runs every installer dialog and saves your choices. **No software is installed.** Passwords are intentionally excluded — you will be prompted at install time.
|
||||
|
||||
### Answerfile Schema
|
||||
|
||||
```json
|
||||
{
|
||||
"_generated": "2026-05-18T12:00:00+00:00",
|
||||
"drive": "/dev/sda",
|
||||
"kernel": "linux",
|
||||
"hostname": "myhost",
|
||||
"username": "amir",
|
||||
"encrypt": true,
|
||||
"fido2_root": false,
|
||||
"fido2_user": false,
|
||||
"run_tui": true,
|
||||
"components": ["pkg", "core", "svc", "shell"],
|
||||
"desktop_environment": "hyprland",
|
||||
"apps": ["firefox-browser", "vscodium", "docker"],
|
||||
"colors": {
|
||||
"COLOR_TEXT": "D6ABAB",
|
||||
"COLOR_BG": "1A1A1A",
|
||||
"COLOR_HIGHLIGHT": "E40046",
|
||||
"COLOR_DARK": "5018DD",
|
||||
"COLOR_RED": "F50505"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `drive` | string | Install target (`/dev/sda`, `/dev/nvme0n1`, …) |
|
||||
| `kernel` | string | `linux`, `linux-lts`, or `linux-zen` |
|
||||
| `hostname` | string | Base hostname — a MAC-address suffix is appended automatically |
|
||||
| `username` | string | Primary user account name |
|
||||
| `encrypt` | bool | Enable LUKS2 root encryption |
|
||||
| `fido2_root` | bool | Enroll FIDO2 key for LUKS unlock |
|
||||
| `fido2_user` | bool | Enroll FIDO2 key for PAM login |
|
||||
| `run_tui` | bool | Run dotfiles setup automatically after base install |
|
||||
| `components` | array | Dotfiles components to install |
|
||||
| `desktop_environment` | string | DE name or `"none"` |
|
||||
| `apps` | array | Optional app IDs (see [Modules](modules.md)) |
|
||||
| `colors` | object | Optional colour overrides (omit to keep defaults) |
|
||||
|
||||
### Hostname Uniqueness
|
||||
|
||||
When `hostname` is set in the answerfile, the MAC address of the primary network interface is automatically appended:
|
||||
|
||||
```
|
||||
myhost → myhost-aabbccddee11
|
||||
```
|
||||
|
||||
This prevents hostname conflicts when the same answerfile is used across multiple machines.
|
||||
|
||||
### Running with an Answerfile
|
||||
|
||||
Place the file at `/answerfile.json` (or set the `ANSWERFILE` environment variable):
|
||||
|
||||
```bash
|
||||
# Use default location
|
||||
sudo cp ~/answerfile.json /answerfile.json
|
||||
bash ~/Dotfiles/setup/tui-install.sh
|
||||
|
||||
# Or override the path
|
||||
ANSWERFILE=~/my-setup.json bash ~/Dotfiles/setup/tui-install.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Base OS Installers
|
||||
|
||||
Two scripts install Arch Linux itself (before the dotfiles step):
|
||||
|
||||
### Guided Installer (`archbaseos-guided-install.sh`)
|
||||
|
||||
Interactive, dialog-based. Prompts for each setting with sensible defaults. Good for hands-on installs where you want to review each option.
|
||||
|
||||
```bash
|
||||
bash ~/installer/archbaseos-guided-install.sh
|
||||
```
|
||||
|
||||
### Auto Installer (`arch-autoinstall.sh`)
|
||||
|
||||
Reads all settings from `/answerfile.json` if present; falls back to prompts for anything missing.
|
||||
|
||||
```bash
|
||||
bash ~/installer/arch-autoinstall.sh
|
||||
```
|
||||
|
||||
Both installers perform the same steps:
|
||||
|
||||
1. Partition disk (EFI 15 GiB · Root · Swap = RAM size)
|
||||
2. Optionally encrypt root with LUKS2
|
||||
3. Format root as Btrfs with `@` and `@home` subvolumes
|
||||
4. `pacstrap` base system
|
||||
5. Configure locale, timezone, hostname, user, sudo
|
||||
6. Set up mkinitcpio hooks and GRUB
|
||||
7. Optionally run `tui-install.sh` inside the chroot
|
||||
|
||||
### Disk Encryption
|
||||
|
||||
When encryption is enabled:
|
||||
|
||||
- **Primary key**: entered interactively at install time
|
||||
- **Backup key**: generated automatically from `/dev/urandom`, enrolled into a second LUKS slot, and written to `/_LUKS_BACKUP_KEY` inside the new system (mode `0400`, root-readable only, inside the encrypted container)
|
||||
- **FIDO2** (optional): enroll a hardware key for passwordless unlock
|
||||
|
||||
The backup key can be collected by Ansible — see [FreeIPA & Ansible](freeipa-ansible.md).
|
||||
|
||||
### mkinitcpio Hook Sets
|
||||
|
||||
| Scenario | Hooks |
|
||||
|----------|-------|
|
||||
| No encryption | `base udev autodetect microcode modconf kms consolefont block btrfs filesystems keyboard fsck` |
|
||||
| LUKS + password | `base udev autodetect microcode modconf kms consolefont block encrypt lvm2 btrfs filesystems keyboard keymap fsck` |
|
||||
| LUKS + FIDO2 | `base udev systemd autodetect microcode modconf kms consolefont block sd-encrypt lvm2 btrfs filesystems keyboard keymap fsck` |
|
||||
|
||||
---
|
||||
|
||||
## Custom Live ISO
|
||||
|
||||
See [Archiso](archiso.md) for building a bootable USB that embeds the installer and, optionally, a pre-baked answerfile for zero-touch deployment.
|
||||
|
|
@ -0,0 +1,191 @@
|
|||
# Modules Reference
|
||||
|
||||
The setup system is modular — core components are installed first, then any combination of optional apps can be added. All module scripts are idempotent (safe to re-run).
|
||||
|
||||
---
|
||||
|
||||
## Core Modules
|
||||
|
||||
These are selected during the initial `tui-install.sh` run.
|
||||
|
||||
### `pkg` — Package Managers
|
||||
|
||||
Installs the AUR helper, language runtimes, and build toolchains:
|
||||
|
||||
- **yay** — AUR helper (built from source via `makepkg`)
|
||||
- **Rust / Cargo** — via `rustup` with the stable toolchain
|
||||
- **nvm** — Node Version Manager; installs Node.js v22 LTS by default
|
||||
|
||||
### `core` — Core Packages
|
||||
|
||||
~100 packages including:
|
||||
|
||||
`7zip` · `base-devel` · `bluez` · `bluez-utils` · `btop` · `fastfetch` · `fdupes` · `ffmpeg` · `git` · `greetd-tuigreet` · `htop` · `jq` · `less` · `lynx` · `neovim` · `networkmanager` · `openssh` · `pipewire` · `pipewire-alsa` · `pipewire-pulse` · `ripgrep` · `rsync` · `tmux` · `udiskie` · `yazi` · `zram-generator`
|
||||
|
||||
Also installs `pamtester` from the AUR.
|
||||
|
||||
### `svc` — Core Services
|
||||
|
||||
Enables and starts these systemd units:
|
||||
|
||||
| Service | Purpose |
|
||||
|---------|---------|
|
||||
| `NetworkManager` | Network connectivity |
|
||||
| `cronie` | Cron daemon |
|
||||
| `fail2ban` | Brute-force protection |
|
||||
| `greetd` | Login session manager |
|
||||
| `udisks2` | Removable media |
|
||||
|
||||
Also deploys `greetd-tuigreet` config from the dotfiles.
|
||||
|
||||
### `shell` — Shell Setup
|
||||
|
||||
- **zsh** with **Oh My Zsh** and plugins (zsh-syntax-highlighting, zsh-autosuggestions)
|
||||
- **Starship** shell prompt
|
||||
- **Neovim** with Vim-Plug (see [Editors](editors.md))
|
||||
- **Micro** editor
|
||||
- **Yazi** file manager
|
||||
- Deploys `.bashrc`, `.zshrc`, `starship.toml`, Micro config, Neovim config
|
||||
|
||||
---
|
||||
|
||||
## Desktop Environments
|
||||
|
||||
| ID | Name | Notes |
|
||||
|----|------|-------|
|
||||
| `hyprland` | Hyprland | Primary DE — see [Hyprland](hyprland.md) |
|
||||
| `sway` | Sway | Wayland tiling WM, lighter |
|
||||
| `kde-plasma` | KDE Plasma | Full-featured with sddm |
|
||||
| `gnome` | GNOME | Modern Wayland DE with gdm |
|
||||
| `cosmic` | COSMIC | Rust-based DE from System76 |
|
||||
| `xfce` | XFCE | Lightweight X11 with lightdm |
|
||||
| `lxqt` | LXQt | Lightweight Qt X11 with sddm |
|
||||
|
||||
---
|
||||
|
||||
## Optional Applications
|
||||
|
||||
Install via `tui-install.sh` at first install, or add later:
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/setup/install-modules.sh
|
||||
```
|
||||
|
||||
### AI & Machine Learning
|
||||
|
||||
| ID | Package | Description |
|
||||
|----|---------|-------------|
|
||||
| `ollama` | ollama | Local LLM runner with REST API server |
|
||||
| `llama-cpp` | llama.cpp | Standalone inference CLI + server |
|
||||
| `open-webui` | open-webui | Browser UI for Ollama / OpenAI-compatible backends |
|
||||
| `claude` | claude (npm) | Anthropic Claude Code CLI |
|
||||
|
||||
### Networking & Security
|
||||
|
||||
| ID | Packages | Description |
|
||||
|----|---------|-------------|
|
||||
| `networking-cli` | nmap · nethogs · mitmproxy · httpie | Network analysis and HTTP tooling |
|
||||
| `disk-recovery` | ddrescue · f3 | Disk imaging and flash drive testing |
|
||||
| `ssh-server` | openssh | SSH daemon with key-auth enforcement |
|
||||
| `wireshark` | wireshark-qt | Packet capture and analysis GUI |
|
||||
|
||||
### Development
|
||||
|
||||
| ID | Packages | Description |
|
||||
|----|---------|-------------|
|
||||
| `python` | pyright · pipx · pynvim | Python LSP, isolated tool runner, Neovim integration |
|
||||
| `docker` | docker · docker-compose | Container runtime |
|
||||
| `podman` | podman · buildah · podman-compose | Rootless containers |
|
||||
| `cockpit` | cockpit · machines · podman | Web-based system management UI |
|
||||
| `k8s` | kubectl · podman-desktop | Kubernetes CLI and desktop client |
|
||||
| `db-clients` | pgcli · mycli | Enhanced interactive database CLIs |
|
||||
| `mysql` | mariadb | MariaDB server with initial setup |
|
||||
|
||||
### IDEs & Editors
|
||||
|
||||
| ID | Package | Description |
|
||||
|----|---------|-------------|
|
||||
| `vscodium` | vscodium-bin (AUR) | VS Code without telemetry |
|
||||
| `zed-ide` | zed | High-performance Rust IDE |
|
||||
| `geany` | geany · geany-plugins | Lightweight IDE |
|
||||
| `codeblocks` | codeblocks | C/C++ IDE |
|
||||
| `kate` | kate | KDE advanced text editor |
|
||||
|
||||
### Browsers
|
||||
|
||||
| ID | Package | Description |
|
||||
|----|---------|-------------|
|
||||
| `chromium` | chromium | Open-source Chromium |
|
||||
| `firefox-browser` | firefox | Mozilla Firefox |
|
||||
| `zen-browser` | zen-browser-bin (AUR) | Privacy-focused Firefox fork |
|
||||
| `nyxt` | nyxt (AUR) | Keyboard-driven, hackable browser |
|
||||
| `librewolf` | librewolf-bin (AUR) | Hardened Firefox fork |
|
||||
| `min-browser` | min (AUR) | Minimal Electron browser |
|
||||
|
||||
### Gaming
|
||||
|
||||
| ID | Package | Description |
|
||||
|----|---------|-------------|
|
||||
| `steam` | steam | Steam gaming platform |
|
||||
| `vesktop` | vesktop (AUR) | Discord client with Vencord built-in |
|
||||
| `spotify` | spotify (AUR) + spicetify | Music player with CyberQueer theme |
|
||||
| `prism` | prismlauncher (Flatpak) | Minecraft launcher |
|
||||
| `vintagestory` | vintagestory (AUR) | Survival / voxel game |
|
||||
|
||||
### Media & Creative
|
||||
|
||||
| ID | Packages | Description |
|
||||
|----|---------|-------------|
|
||||
| `ffmpeg` | gst-plugin-pipewire · gst-plugins-good · ffmpegthumbnailer | GStreamer codecs + thumbnailer |
|
||||
| `sox` | sox | Command-line audio processing |
|
||||
| `imagemagick` | imagemagick | Image manipulation suite |
|
||||
| `yt-dlp` | yt-dlp | YouTube / media downloader |
|
||||
| `blender` | blender | 3D creation suite |
|
||||
| `gnuplot` | gnuplot | Scientific plotting |
|
||||
| `povray` | povray | Ray-tracing renderer |
|
||||
|
||||
### Productivity
|
||||
|
||||
| ID | Packages | Description |
|
||||
|----|---------|-------------|
|
||||
| `productivity` | taskwarrior · watson · jrnl | Task management, time tracking, journaling |
|
||||
| `himalaya` | himalaya (AUR) | Terminal email client |
|
||||
| `toot` | toot (AUR) | Mastodon CLI client |
|
||||
|
||||
### System Utilities
|
||||
|
||||
| ID | Packages | Description |
|
||||
|----|---------|-------------|
|
||||
| `tlp` | tlp · tlp-rdw | Laptop battery optimisation |
|
||||
| `zfs` | zfs-dkms | ZFS kernel module |
|
||||
| `wprs` | wprs-git (AUR) | Wayland proxy for remote sessions |
|
||||
| `butter` | butter (AUR) | Btrfs snapshot backup manager |
|
||||
| `localsend` | localsend (AUR) | LAN file transfer (AirDrop-like) |
|
||||
| `croc` | croc | Cross-platform encrypted file transfer |
|
||||
| `localtunnel` | localtunnel (npm) | Expose localhost over a public URL |
|
||||
| `onlyoffice` | onlyoffice-bin (AUR) | Office suite (Docs, Sheets, Slides) |
|
||||
|
||||
### Identity & Infrastructure
|
||||
|
||||
| ID | Description |
|
||||
|----|-------------|
|
||||
| `freeipa-client` | sssd + ipa-client-install + auto-enrollment (see [FreeIPA](freeipa-ansible.md)) |
|
||||
| `freeipa-server` | Interactive FreeIPA server setup + client generator |
|
||||
| `freeipa-image` | OCI / LXC / Proxmox LXC image builder + Keycloak |
|
||||
|
||||
---
|
||||
|
||||
## Container Shell Setups
|
||||
|
||||
Scripts in `setup/Setup-shell-4-containers/` configure a minimal shell environment inside containers or chroots for each major distribution:
|
||||
|
||||
| Script | Target |
|
||||
|--------|--------|
|
||||
| `alpine.sh` | Alpine Linux |
|
||||
| `arch.sh` | Arch Linux |
|
||||
| `debian.sh` | Debian |
|
||||
| `fedora.sh` | Fedora |
|
||||
| `suse.sh` | openSUSE |
|
||||
| `ubuntu.sh` | Ubuntu |
|
||||
| `void.sh` | Void Linux |
|
||||
| `other.sh` | Generic fallback |
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
# CyberQueer Theme System
|
||||
|
||||
The CyberQueer theme is a single-source colour system: every config file that needs colours references a small set of hex values that can be changed in one place and propagated everywhere with a single command.
|
||||
|
||||
---
|
||||
|
||||
## The Palette
|
||||
|
||||
Defined in `~/Dotfiles/colors.conf` (bare 6-digit hex, no `#` prefix):
|
||||
|
||||
```ini
|
||||
COLOR_TEXT=D6ABAB # Rose-white — foreground text, labels
|
||||
COLOR_BG=1A1A1A # Near-black — base surface, backgrounds
|
||||
COLOR_HIGHLIGHT=E40046 # Hot pink — primary accent, active borders
|
||||
COLOR_DARK=5018DD # Violet — secondary accent, inactive borders
|
||||
COLOR_RED=F50505 # Red — danger indicators, alerts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Applying the Theme
|
||||
|
||||
```bash
|
||||
# Apply using the default colors.conf
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
|
||||
# Apply from a custom palette file
|
||||
bash ~/Dotfiles/apply-theme.sh /path/to/custom-colors.conf
|
||||
```
|
||||
|
||||
`apply-theme.sh` will:
|
||||
|
||||
1. Read `colors.conf` (or the file you pass)
|
||||
2. Compare against the last-applied state in `~/.config/colors.state`
|
||||
3. Replace only **changed** colour values across all tracked files
|
||||
4. Save the new state to `colors.state`
|
||||
|
||||
If nothing changed it exits immediately — safe to call repeatedly.
|
||||
|
||||
### First-Run Bootstrap
|
||||
|
||||
On a fresh install where configs have been copied but no state file exists yet, `apply-theme.sh` bootstraps `~/.config/colors.state` with the repository defaults so the diff works correctly from the start.
|
||||
|
||||
---
|
||||
|
||||
## What Gets Themed
|
||||
|
||||
### User Configs (`~/.config/…`)
|
||||
|
||||
| File | What it styles |
|
||||
|------|---------------|
|
||||
| `starship.toml` | Shell prompt segment colours |
|
||||
| `yazi/theme.toml` | File manager UI colours |
|
||||
| `hypr/hyprland.conf` | Active/inactive window border gradients |
|
||||
| `hypr/hyprtoolkit.conf` | Additional Hyprland colours |
|
||||
| `hypr/hyprlock.conf` | Lock screen colours |
|
||||
| `kitty/current-theme.conf` | Terminal colour palette |
|
||||
| `kitty/kitty.conf` | Terminal background & accents |
|
||||
| `kitty/themes/cyberqueer.conf` | Kitty colour scheme definition |
|
||||
| `waybar/style.css` | Top bar widget colours |
|
||||
| `wofi/style.css` | App launcher colours |
|
||||
| `walker/themes/cyberqueer.css` | Walker launcher theme |
|
||||
| `nwg-dock-hyprland/style.css` | Application dock |
|
||||
| `nwg-drawer/drawer.css` | Application drawer |
|
||||
| `nwg-panel/menu-start.css` | Panel start menu |
|
||||
| `vicinae/cyberqueer.toml` | Gesture launcher |
|
||||
| `scripts/onscreenkb.sh` | On-screen keyboard colours |
|
||||
| `spicetify/Themes/*/color.ini` | Spotify client theme (×2 variants) |
|
||||
| `ulauncher/user-themes/cyberqueer/manifest.json` | uLauncher theme |
|
||||
| `ulauncher/user-themes/cyberqueer/theme.css` | uLauncher CSS |
|
||||
| `ulauncher/user-themes/cyberqueer/generated.css` | uLauncher generated CSS |
|
||||
| `Vencord/themes/cyberqueer.theme.css` | Discord theme |
|
||||
| `Vencord/themes/system24/…/cyberqueer.theme.css` | Discord system24 variant |
|
||||
|
||||
### System Files (applied via `sudo`)
|
||||
|
||||
| File | What it styles |
|
||||
|------|---------------|
|
||||
| `/etc/ly/config.ini` | TUI login manager colours |
|
||||
| `/usr/share/themes/cyberqueer/gtk-3.0/gtk.css` | GTK 3 theme |
|
||||
| `/usr/share/themes/cyberqueer/gtk-4.0/gtk.css` | GTK 4 theme |
|
||||
|
||||
---
|
||||
|
||||
## Customising the Palette
|
||||
|
||||
Edit `~/Dotfiles/colors.conf`, then run `apply-theme.sh`:
|
||||
|
||||
```bash
|
||||
# Example: shift the accent to cyan
|
||||
nano ~/Dotfiles/colors.conf
|
||||
# → COLOR_HIGHLIGHT=00B4D8
|
||||
|
||||
bash ~/Dotfiles/apply-theme.sh
|
||||
```
|
||||
|
||||
The tui-install.sh installer also offers a colorway dialog as its final step:
|
||||
enter new hex values in the form; leave them unchanged to skip.
|
||||
|
||||
---
|
||||
|
||||
## How It Works Internally
|
||||
|
||||
`apply-theme.sh` reads two key–value files and computes the diff:
|
||||
|
||||
```
|
||||
~/.config/colors.state (old values — what's currently applied)
|
||||
colors.conf (new values — what you want)
|
||||
```
|
||||
|
||||
For each changed key it runs:
|
||||
```bash
|
||||
sed -i "s/${OLD_HEX}/${NEW_HEX}/gI" <file>
|
||||
```
|
||||
|
||||
The case-insensitive (`I`) flag matches uppercase hex codes that some apps emit. After all replacements succeed, `colors.state` is updated.
|
||||
|
||||
### Symlink Guard
|
||||
|
||||
`apply-theme.sh` refuses to run if any deployed config path resolves back into `~/Dotfiles/` via symlink. This prevents theme changes from being committed directly into the git repository. The new-style install (via `tui-install.sh`) **copies** configs instead of symlinking them, so this guard is normally never triggered.
|
||||
|
||||
---
|
||||
|
||||
## Answerfile Theming
|
||||
|
||||
If you generate an answerfile with `generate-answerfile.sh`, custom colours can be embedded in it:
|
||||
|
||||
```json
|
||||
{
|
||||
"colors": {
|
||||
"COLOR_TEXT": "D6ABAB",
|
||||
"COLOR_BG": "1A1A1A",
|
||||
"COLOR_HIGHLIGHT": "E40046",
|
||||
"COLOR_DARK": "5018DD",
|
||||
"COLOR_RED": "F50505"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`tui-install.sh` will apply these at the end of an automated install.
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
# Utilities
|
||||
|
||||
Miscellaneous scripts and tools that live at the top level or in the `clamav/` directory.
|
||||
|
||||
---
|
||||
|
||||
## System Update
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/update.sh
|
||||
```
|
||||
|
||||
Runs a full system update:
|
||||
1. `sudo pacman -Syu` — official repos
|
||||
2. `yay -Syu --answerdiff None --answerclean All --removemake` — AUR packages (no prompts)
|
||||
|
||||
For per-package AUR updates with confirmation:
|
||||
```bash
|
||||
bash ~/Dotfiles/update-aur-onebyone.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Package Audit
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/setup/audit-packages.sh
|
||||
```
|
||||
|
||||
Audits installed packages — useful for finding orphans or unexpected installations.
|
||||
|
||||
---
|
||||
|
||||
## Encryption Utilities
|
||||
|
||||
Simple OpenSSL wrappers for encrypting/decrypting arbitrary strings. Useful for storing secrets in scripts or config files without plaintext exposure.
|
||||
|
||||
### Encrypt
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/encrypt.sh "my secret text" "my-passphrase"
|
||||
# Output: base64-encoded AES-256-CBC ciphertext
|
||||
```
|
||||
|
||||
### Decrypt
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/decrypt.sh "<ciphertext>" "my-passphrase"
|
||||
# Output: original plaintext
|
||||
```
|
||||
|
||||
Both use AES-256-CBC with PBKDF2 key derivation via OpenSSL.
|
||||
|
||||
---
|
||||
|
||||
## Credential Storage
|
||||
|
||||
### Initial Setup
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/setup-creds-missing.sh
|
||||
```
|
||||
|
||||
Installs `gnome-keyring` and `seahorse` (GUI manager), then sets git's credential helper to `store`.
|
||||
|
||||
### Git Credentials
|
||||
|
||||
`git/` contains `.gitconfig` with:
|
||||
|
||||
```ini
|
||||
[user]
|
||||
name = The_miro
|
||||
email = amir@abdelbaki.eu
|
||||
|
||||
[credential]
|
||||
helper = store
|
||||
|
||||
[init]
|
||||
defaultBranch = main
|
||||
|
||||
[push]
|
||||
autoSetupRemote = true
|
||||
```
|
||||
|
||||
The `store` helper writes credentials to `~/.git-credentials`. For higher security, `gnome-keyring` intercepts this and stores the credentials in the system keyring instead of plaintext.
|
||||
|
||||
---
|
||||
|
||||
## Zsh Plugins
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/zshplugins.sh
|
||||
```
|
||||
|
||||
Clones (or updates) the two Oh My Zsh community plugins:
|
||||
- `zsh-syntax-highlighting` — real-time syntax colouring in the prompt
|
||||
- `zsh-autosuggestions` — fish-style history-based suggestions
|
||||
|
||||
These are referenced in `.zshrc` and active after the next shell start.
|
||||
|
||||
---
|
||||
|
||||
## ClamAV On-Access Scanning
|
||||
|
||||
Full real-time antivirus scanning via ClamAV's `clamonacc` daemon.
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
bash ~/Dotfiles/clamav/install-clam-onaccess.sh
|
||||
```
|
||||
|
||||
What it does:
|
||||
1. Installs `clamav`
|
||||
2. Copies `clamd.conf` to `/etc/clamav/`
|
||||
3. Installs `clamav-clamonacc.service` to `/etc/systemd/system/`
|
||||
4. Installs the sudoers entry from `clamav-sudoer`
|
||||
5. Updates virus definitions (`freshclam`)
|
||||
6. Enables and starts `clamd` + `clamav-clamonacc`
|
||||
|
||||
### Key Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `clamav/clamd.conf` | Daemon configuration (30 KB, full options) |
|
||||
| `clamav/clamav-clamonacc.service` | systemd unit for on-access scanning |
|
||||
| `clamav/clamav-sudoer` | sudoers rule for ClamAV processes |
|
||||
| `clamav/virus-event.bash` | Handler executed when a virus is detected |
|
||||
|
||||
### Virus Event Handler
|
||||
|
||||
`virus-event.bash` is called by clamonacc when a threat is found. Customise it to send notifications, quarantine files, or alert an admin.
|
||||
|
||||
---
|
||||
|
||||
## Shell Configuration
|
||||
|
||||
### `.zshrc`
|
||||
|
||||
- **Framework**: Oh My Zsh
|
||||
- **Theme**: robbyrussell (overridden visually by Starship)
|
||||
- **Plugins**: syntax-highlighting, autosuggestions
|
||||
- **Walk integration**: `lk` function opens the `walk` file navigator
|
||||
- **`WALK_MAIN_COLOR`**: set to `#5018DD` (CyberQueer violet)
|
||||
- Sources Starship init at the end
|
||||
|
||||
### `.bashrc`
|
||||
|
||||
Minimal bash config — sets `PS1`, loads `~/.bash_profile` if present.
|
||||
|
||||
### Starship Prompt
|
||||
|
||||
`starship.toml` at the repo root is deployed to `~/.config/starship.toml`.
|
||||
|
||||
Key customisations:
|
||||
- OS, username, directory, git, language, docker, and time segments
|
||||
- CyberQueer colours throughout (colour-substitution target)
|
||||
- Directory abbreviated to 3 levels with `…/` truncation
|
||||
- Common directory substitutions (`~/Documents` → `📄`, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Login Manager (ly)
|
||||
|
||||
`etc-ly-config.ini` is deployed to `/etc/ly/config.ini` during Hyprland install and kept as a colour-substitution target in `apply-theme.sh`.
|
||||
|
||||
ly is a minimal TUI display manager that runs on `tty1`:
|
||||
|
||||
```
|
||||
systemctl enable ly@tty1
|
||||
```
|
||||
|
||||
Session selection, auto-login, and timeout settings are all in the config.
|
||||
Loading…
Reference in New Issue