<!DOCTYPE html>
<html lang="en" data-accent-color="teal" data-content_root="../">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Quickstart - snapper 0.1.0 documentation</title><link rel="shortcut icon" href="../_static/favicon.ico"/><link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="next" title="Editor Integration" href="../howto/editor-integration.html" /><link rel="prev" title="snapper" href="../index.html" />
<link rel="canonical" href="https://snapper.turtletech.us/docs/tutorials/quickstart.html" /><script>
function setColorMode(t){let e=document.documentElement;e.setAttribute("data-color-mode",t);let a=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,s=t;"auto"===t&&(s=a?"dark":"light"),"light"===s?(e.classList.remove("dark"),e.classList.add("light")):(e.classList.remove("light"),e.classList.add("dark"))}
setColorMode(localStorage._theme||"auto");
</script><link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=e1a1ceaf" />
<link rel="stylesheet" type="text/css" href="../_static/shibuya.css?v=44020203" />
<link media="print" rel="stylesheet" type="text/css" href="../_static/print.css?v=20ff2c19" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=ae410d03" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--sy-f-text: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
--sy-f-heading: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
}
</style>
<meta property="og:type" content="website"/>
<meta property="og:url" content="https://snapper.turtletech.us/docs/tutorials/quickstart.html"/>
<meta property="og:title" content="Quickstart"/>
<meta name="twitter:card" content="summary"/>
<link rel="alternate" hreflang="is" href="/docs/is/tutorials/quickstart/" />
<link rel="alternate" hreflang="pl" href="/docs/pl/tutorials/quickstart/" />
<!-- Umami injection -->
<script
defer
data-website-id="af8c1286-06aa-414b-958c-e015bed1e569"
src="https://analytics.turtletech.us/script.js"
></script>
<script>
window.umami = window.umami || { track: function () {} };
document.addEventListener("click", function (e) {
var link = e.target.closest("a");
if (link && link.hostname !== location.hostname) {
umami.track("Outbound Link", { url: link.href });
}
});
</script></head>
<body><div class="sy-head">
<div class="sy-head-blur"></div>
<div class="sy-head-inner sy-container mx-auto">
<a class="sy-head-brand" href="../index.html">
<img class="light-logo" src="../_static/snapper_logo.png" alt="snapper" height="28" loading="lazy" />
<img class="dark-logo" src="../_static/snapper_logo.png" alt="snapper" height="28" loading="lazy" />
<strong>snapper</strong>
</a>
<div class="sy-head-nav" id="head-nav">
<nav class="sy-head-links"></nav>
<div class="sy-head-extra flex items-center print:hidden"><form class="searchbox flex items-center" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search" />
<kbd>/</kbd>
</form><div class="nav-languages">
<button type="button">
<span class="md:hidden">Translations</span>
<iconify-icon icon="lucide:languages"></iconify-icon>
</button>
<div class="nav-languages-choices">
<ul><li><a href="/docs/tutorials/quickstart/">English</a></li><li><a href="/docs/is/tutorials/quickstart/">Islenska</a></li><li><a href="/docs/pl/tutorials/quickstart/">Polski</a></li></ul>
</div>
</div><div class="sy-head-socials">
<a href="https://github.com/TurtleTech-ehf/snapper" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div></div>
</div>
<div class="sy-head-actions flex items-center shrink-0 print:hidden"><button class="js-theme theme-switch flex items-center"
data-aria-auto="Switch to light color mode"
data-aria-light="Switch to dark color mode"
data-aria-dark="Switch to auto color mode">
<i class="i-lucide theme-icon"></i>
</button><button class="md:hidden flex items-center js-menu" aria-label="Menu" type="button" aria-controls="head-nav" aria-expanded="false">
<div class="hamburger">
<span class="hamburger_1"></span>
<span class="hamburger_2"></span>
<span class="hamburger_3"></span>
</div>
</button>
</div>
</div>
</div>
<div class="sy-page sy-container flex mx-auto">
<aside id="lside" class="sy-lside md:w-72 md:shrink-0 print:hidden">
<div class="sy-lside-inner md:sticky">
<div class="sy-scrollbar p-6">
<div class="globaltoc" data-expand-depth="2"><p class="caption" role="heading" aria-level="3"><span class="caption-text">Tutorials</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Quickstart</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">How-to guides</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/editor-integration.html">Editor Integration</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/ci-enforcement.html">CI Enforcement</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/git-filter.html">Git Smudge/Clean Filter</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/vale-integration.html">Vale Integration</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/neural-detection.html">Neural Sentence Detection</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/pragmas.html">Skip Regions with Pragmas</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../howto/pandoc-backend.html">Pandoc Backend</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/cli.html">CLI Reference</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/formats.html">Supported Formats</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/abbreviations.html">Abbreviation Handling</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../reference/config.html">Configuration</a></li>
</ul>
<p class="caption" role="heading" aria-level="3"><span class="caption-text">Development</span></p>
<ul>
<li class="toctree-l1 _expand"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1 _expand"><a class="reference internal" href="../changelog.html">Changelog</a></li>
</ul>
</div>
</div>
</div>
</aside>
<div class="lside-overlay js-menu" role="button" aria-label="Close left sidebar" aria-controls="lside" aria-expanded="false"></div>
<aside id="rside" class="sy-rside pb-3 w-64 shrink-0 order-last">
<button class="rside-close js-menu xl:hidden" aria-label="Close Table of Contents" type="button" aria-controls="rside" aria-expanded="false">
<i class="i-lucide close"></i>
</button>
<div class="sy-scrollbar sy-rside-inner px-6 xl:top-16 xl:sticky xl:pl-0 pt-6 pb-4"><div class="localtoc"><h3>On this page</h3><ul>
<li><a class="reference internal" href="#installation">Installation</a></li>
<li><a class="reference internal" href="#basic-usage">Basic usage</a></li>
<li><a class="reference internal" href="#what-it-does">What it does</a></li>
<li><a class="reference internal" href="#format-detection">Format detection</a></li>
<li><a class="reference internal" href="#sentence-level-diff">Sentence-level diff</a></li>
<li><a class="reference internal" href="#watch-mode">Watch mode</a></li>
<li><a class="reference internal" href="#project-setup">Project setup</a></li>
<li><a class="reference internal" href="#ci-integration">CI integration</a></li>
<li><a class="reference internal" href="#pre-commit-hook">Pre-commit hook</a></li>
<li><a class="reference internal" href="#emacs-apheleia">Emacs (Apheleia)</a></li>
</ul>
</div><a class="js-repo-stats repo-stats flex items-center" href="https://github.com/TurtleTech-ehf/snapper"
data-type="github" data-user="TurtleTech-ehf" data-repo="snapper">
<span class="w-8 flex items-center justify-around shrink-0 text-3xl">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</span>
<span class="flex-grow px-2 break-all">
<span>snapper</span>
<span class="flex text-sm repo-stats-count">
<span class="flex items-center pr-3">
<iconify-icon icon="lucide:star"></iconify-icon>
<strong class="js-repo-stars ml-1">0</strong>
</span>
<span class="flex items-center">
<iconify-icon icon="lucide:git-fork"></iconify-icon>
<strong class="js-repo-forks ml-1">0</strong>
</span>
</span>
</span>
</a><div class="edit-this-page">
<a href="https://github.com/TurtleTech-ehf/snapper/blob/main/docs/source/tutorials/quickstart.rst">Edit this page</a>
</div><div id="ethical-ad-placement" data-ea-publisher="readthedocs"></div></div>
</aside>
<div class="rside-overlay js-menu" role="button" aria-label="Close Table of Contents" aria-controls="rside" aria-expanded="false"></div>
<main class="sy-main w-full max-sm:max-w-full print:pt-6">
<div class="sy-breadcrumbs" role="navigation">
<div class="sy-breadcrumbs-inner flex items-center">
<div class="md:hidden mr-3">
<button class="js-menu" aria-label="Menu" type="button" aria-controls="lside" aria-expanded="false">
<i class="i-lucide menu"></i>
</button>
</div>
<ol class="flex-1" itemscope itemtype="https://schema.org/BreadcrumbList"><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="../index.html"><span itemprop="name">snapper</span></a>
<span>/</span>
<meta itemprop="position" content="1" />
</li><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<strong itemprop="name">Quickstart</strong>
<meta itemprop="position" content="2" />
</li></ol>
<div class="xl:hidden ml-1">
<button class="js-menu" aria-label="Show table of contents" type="button" aria-controls="rside"
aria-expanded="false">
<i class="i-lucide outdent"></i>
</button>
</div>
</div>
</div><div class="flex flex-col break-words justify-between">
<div class="relative min-w-0 max-w-6xl px-6 pb-6 pt-8 xl:px-12">
<div class="copy-page-wrapper relative pb-4 lg:absolute lg:top-8 lg:right-6 xl:right-12">
<div id="copy-page-trigger">
<button
type="button"
class="js-copy px-3 py-1 inline-flex items-center gap-1"
data-url="https://snapper.turtletech.us/docs/_sources/tutorials/quickstart.rst.txt"
>
<i class="i-lucide" data-icon="copy"></i>
<span>Copy page</span>
</button>
<button class="js-menu px-2 py-1" type="button" aria-label="More actions"
aria-haspopup="menu" aria-expanded="false" aria-controls="copy-page-content">
<i class="i-lucide chevron-down"></i>
</button>
</div>
<div id="copy-page-content" role="menu" aria-orientation="vertical" aria-hidden="true">
<div role="presentation">
<div class="flex flex-col" role="group">
<button class="js-copy" type="button" role="menuitem"
data-url="https://snapper.turtletech.us/docs/_sources/tutorials/quickstart.rst.txt">
<span class="iconify-icon">
<i class="i-lucide" data-icon="copy"></i>
</span>
<span>Copy page</span>
</button>
<a role="menuitem" href="https://snapper.turtletech.us/docs/_sources/tutorials/quickstart.rst.txt" target="_blank" rel="nofollow"><iconify-icon icon="bi:code-slash"></iconify-icon>
<span>View Source</span></a><a role="menuitem" href="https://chatgpt.com/?hints=search&q=Read%20https%3A//snapper.turtletech.us/docs/_sources/tutorials/quickstart.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:openai"></iconify-icon>
<span>Open in ChatGPT</span>
</a><a role="menuitem" href="https://claude.ai/new?q=Read%20https%3A//snapper.turtletech.us/docs/_sources/tutorials/quickstart.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:claude"></iconify-icon>
<span>Open in Claude</span>
</a></div>
</div>
</div>
</div><article class="yue dark-code" role="main">
<section id="quickstart">
<h1>Quickstart<a class="headerlink" href="#quickstart" title="Link to this heading">¶</a></h1>
<section id="installation">
<h2>Installation<a class="headerlink" href="#installation" title="Link to this heading">¶</a></h2>
<p>Pre-built binary (fastest, no compilation):</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">cargo<span class="w"> </span>binstall<span class="w"> </span>snapper-fmt
</span></pre></div>
</div>
<p>Or compile from source:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">cargo<span class="w"> </span>install<span class="w"> </span>snapper-fmt
</span></pre></div>
</div>
<p>Shell one-liner (Linux/macOS):</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">curl<span class="w"> </span>-LsSf<span class="w"> </span>https://github.com/TurtleTech-ehf/snapper/releases/latest/download/snapper-fmt-installer.sh<span class="w"> </span><span class="p">|</span><span class="w"> </span>sh
</span></pre></div>
</div>
<p>Homebrew (macOS/Linux):</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">brew<span class="w"> </span>install<span class="w"> </span>TurtleTech-ehf/tap/snapper-fmt
</span></pre></div>
</div>
<p>pip:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">pip<span class="w"> </span>install<span class="w"> </span>snapper-fmt
</span></pre></div>
</div>
<p>Nix:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">nix<span class="w"> </span>build<span class="w"> </span>github:TurtleTech-ehf/snapper
</span></pre></div>
</div>
<p>The crate is <code class="docutils literal notranslate"><span class="pre">snapper-fmt</span></code> on all registries; the binary it installs is <code class="docutils literal notranslate"><span class="pre">snapper</span></code>.</p>
</section>
<section id="basic-usage">
<h2>Basic usage<a class="headerlink" href="#basic-usage" title="Link to this heading">¶</a></h2>
<p>Format a file, printing to stdout:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>paper.org
</span></pre></div>
</div>
<p>Format in place:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>--in-place<span class="w"> </span>paper.org
</span></pre></div>
</div>
<p>Pipe through stdin (for editor integration):</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">cat<span class="w"> </span>draft.org<span class="w"> </span><span class="p">|</span><span class="w"> </span>snapper<span class="w"> </span>--format<span class="w"> </span>org
</span></pre></div>
</div>
</section>
<section id="what-it-does">
<h2>What it does<a class="headerlink" href="#what-it-does" title="Link to this heading">¶</a></h2>
<p>Given a paragraph like this:</p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span><span data-line="1">This is the first sentence. It continues with more details about the topic. See Fig. 3 for the results.
</span></pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">snapper</span></code> produces:</p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span><span data-line="1">This is the first sentence.
</span><span data-line="2">It continues with more details about the topic.
</span><span data-line="3">See Fig. 3 for the results.
</span></pre></div>
</div>
<p>Each sentence occupies its own line.
Structural elements like code blocks, tables, drawers, math environments, and front matter pass through unchanged.</p>
</section>
<section id="format-detection">
<h2>Format detection<a class="headerlink" href="#format-detection" title="Link to this heading">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">snapper</span></code> auto-detects the format from the file extension:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">.org</span></code> – Org-mode</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.tex</span></code>, <code class="docutils literal notranslate"><span class="pre">.latex</span></code> – LaTeX</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.md</span></code>, <code class="docutils literal notranslate"><span class="pre">.markdown</span></code> – Markdown</p></li>
<li><p>Everything else – plaintext</p></li>
</ul>
<p>Override with <code class="docutils literal notranslate"><span class="pre">--format</span></code>:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>--format<span class="w"> </span>latex<span class="w"> </span>draft.tex
</span></pre></div>
</div>
</section>
<section id="sentence-level-diff">
<h2>Sentence-level diff<a class="headerlink" href="#sentence-level-diff" title="Link to this heading">¶</a></h2>
<p>Compare two versions of a file at the sentence level, ignoring whitespace reflow:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>sdiff<span class="w"> </span>paper_v1.org<span class="w"> </span>paper_v2.org
</span></pre></div>
</div>
<p>Only actual content changes appear.
Reformatting (rewrapping) the same text produces zero diff.
Useful for reviewing collaborator edits on shared papers.</p>
</section>
<section id="watch-mode">
<h2>Watch mode<a class="headerlink" href="#watch-mode" title="Link to this heading">¶</a></h2>
<p>Auto-reformat files on save:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>watch<span class="w"> </span><span class="s1">'*.org'</span><span class="w"> </span><span class="s1">'sections/*.tex'</span>
</span></pre></div>
</div>
<p>Monitors files and runs <code class="docutils literal notranslate"><span class="pre">--in-place</span></code> on change (200ms debounce).
Press Ctrl+C to stop.</p>
</section>
<section id="project-setup">
<h2>Project setup<a class="headerlink" href="#project-setup" title="Link to this heading">¶</a></h2>
<p>Initialize snapper for a new project:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>init
</span></pre></div>
</div>
<p>Detects which formats exist and generates <code class="docutils literal notranslate"><span class="pre">.snapperrc.toml</span></code>, <code class="docutils literal notranslate"><span class="pre">.gitattributes</span></code>, pre-commit config, and Apheleia snippets.
Use <code class="docutils literal notranslate"><span class="pre">--dry-run</span></code> to preview.</p>
</section>
<section id="ci-integration">
<h2>CI integration<a class="headerlink" href="#ci-integration" title="Link to this heading">¶</a></h2>
<p>Use <code class="docutils literal notranslate"><span class="pre">--check</span></code> mode to verify formatting without modifying files.
Exits with code 1 if any file would change:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>--check<span class="w"> </span>paper.org
</span></pre></div>
</div>
<p>For GitHub Code Scanning, use SARIF output:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span data-line="1">snapper<span class="w"> </span>--check<span class="w"> </span>--output-format<span class="w"> </span>sarif<span class="w"> </span>paper.org<span class="w"> </span>><span class="w"> </span>snapper.sarif
</span></pre></div>
</div>
</section>
<section id="pre-commit-hook">
<h2>Pre-commit hook<a class="headerlink" href="#pre-commit-hook" title="Link to this heading">¶</a></h2>
<p>Add to your <code class="docutils literal notranslate"><span class="pre">.pre-commit-config.yaml</span></code>:</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span data-line="1"><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">repo</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/TurtleTech-ehf/snapper</span>
</span><span data-line="2"><span class="w"> </span><span class="nt">rev</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">v0.2.1</span>
</span><span data-line="3"><span class="w"> </span><span class="nt">hooks</span><span class="p">:</span>
</span><span data-line="4"><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">snapper</span>
</span></pre></div>
</div>
</section>
<section id="emacs-apheleia">
<h2>Emacs (Apheleia)<a class="headerlink" href="#emacs-apheleia" title="Link to this heading">¶</a></h2>
<p>Add to your Emacs config:</p>
<div class="highlight-elisp notranslate"><div class="highlight"><pre><span></span><span data-line="1"><span class="p">(</span><span class="nb">with-eval-after-load</span><span class="w"> </span><span class="ss">'apheleia</span>
</span><span data-line="2"><span class="w"> </span><span class="p">(</span><span class="nb">push</span><span class="w"> </span><span class="o">'</span><span class="p">(</span><span class="nv">snapper</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="s">"snapper"</span><span class="w"> </span><span class="s">"--format"</span><span class="w"> </span><span class="s">"org"</span><span class="p">))</span><span class="w"> </span><span class="nv">apheleia-formatters</span><span class="p">)</span>
</span><span data-line="3"><span class="w"> </span><span class="p">(</span><span class="nb">push</span><span class="w"> </span><span class="o">'</span><span class="p">(</span><span class="nv">org-mode</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="nv">snapper</span><span class="p">)</span><span class="w"> </span><span class="nv">apheleia-mode-alist</span><span class="p">))</span>
</span></pre></div>
</div>
<p>This runs <code class="docutils literal notranslate"><span class="pre">snapper</span></code> on save for Org-mode buffers.</p>
</section>
</section>
</article><button class="back-to-top" type="button">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</button><div class="navigation flex print:hidden"><div class="navigation-prev">
<a href="../index.html">
<i class="i-lucide chevron-left"></i>
<div class="page-info">
<span>Previous</span><div class="title">Home</div></div>
</a>
</div><div class="navigation-next">
<a href="../howto/editor-integration.html">
<div class="page-info">
<span>Next</span>
<div class="title">Editor Integration</div>
</div>
<i class="i-lucide chevron-right"></i>
</a>
</div></div></div>
</div>
</main>
</div>
<footer class="sy-foot">
<div class="sy-foot-inner sy-container mx-auto">
<div
style="
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.5rem;
margin-bottom: 1.5rem;
color: var(--sy-c-text-weak);
font-size: 0.9em;
"
>
<div
style="
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 1rem;
align-items: center;
"
>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<svg
xmlns="http://www.w3.org/2000/svg"
width="1em"
height="1em"
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
>
<path d="M7,20H4V4h3V20z M14,20h-3V12h3V20z M21,20h-3V8h3V20z" />
</svg>
<span
>Analytics by
<a
href="https://umami.is/"
target="_blank"
rel="noopener noreferrer"
style="color: inherit; text-decoration: underline"
>Umami</a
></span
>
</span>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<span>provided by</span>
<span style="display: inline-flex; align-items: center; gap: 0.3em">
<svg xmlns="http://www.w3.org/2000/svg" width="1.4em" height="1.4em" viewBox="0 0 64 64" aria-hidden="true"><g fill-rule="evenodd"><ellipse cx="32" cy="11" fill="#80D25B" rx="7" ry="9"/><path fill="#80D25B" d="M20.3,46c0,0-3.2,9.9.3,13.8c3.5,3.9 6.1,3.4 6.1-6C26.8,44.3 20.3,46 20.3,46Z"/><path fill="#80D25B" d="M38.3,46c0,0-3.2,9.9.4,13.8c3.5,3.9 6.1,3.4 6.1-6C44.8,44.3 38.3,46 38.3,46Z" transform="matrix(-1 0 0 1 81.8 0)"/><path fill="#80D25B" d="M20.6,21.2c0,0-6.7-5.8-10.5-5.2C6.2,16.7 6,22.2 6,24c0,1.8 1.8,13.3 3.8,12.5c2-0.8 4-8.5 4-8.5c1.9,2.3 4.8,2.5 4.8,2.5L20.6,21.2Z"/><path fill="#80D25B" d="M57.6,21.2c0,0-6.6-5.8-10.5-5.2C43.2,16.7 43,22.2 43,24c0,1.8 1.8,13.3 3.8,12.5c2-0.8 4-8.5 4-8.5c1.9,2.3 4.8,2.5 4.8,2.5L57.6,21.2Z" transform="matrix(-1 0 0 1 100.623 0)"/><path fill="#BD7575" stroke="#595959" stroke-linecap="round" stroke-width="2" d="M32,53C40.8,53 48,44.5 48,34C48,23.5 46.7,17 32,17C17.3,17 16,23.5 16,34C16,44.5 23.2,53 32,53Z"/><polygon fill="#BD7575" stroke="#595959" stroke-linecap="round" stroke-width="2" points="32 22 38.9 26 38.9 34 32 38 25.1 34 25.1 26"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M30,8C28.9,8 28,8.9 28,10"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M36,8C34.9,8 34,8.9 34,10" transform="matrix(-1 0 0 1 70 0)"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M32.1,38.2L32.1,52.4M32,21.7L32,17M25.2,26L17.7,23.1M25.1,34.2L16.8,38.9"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M46.2,26L38.7,23.1" transform="matrix(-1 0 0 1 84.951 0)"/><path stroke="#595959" stroke-linecap="round" stroke-width="2" d="M47.1,34.2L38.8,38.9" transform="matrix(-1 0 0 1 85.891 0)"/></g></svg>
<a
href="https://turtletech.us/"
target="_blank"
rel="noopener noreferrer"
style="color: inherit; text-decoration: underline"
>TurtleTech ehf</a
>
</span>
</span>
</div>
</div>
<div class="sy-foot-reserved md:flex justify-between items-center">
<div class="sy-foot-copyright"><p>2026--present, <a href="https://rgoswami.me">Rohit Goswami</a></p>
<p>
Made with
<a href="https://www.sphinx-doc.org/">Sphinx</a> and
<a href="https://shibuya.lepture.com">Shibuya theme</a>.
</p>
</div> <div class="sy-foot-socials">
<a href="https://github.com/TurtleTech-ehf/snapper" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div>
</div>
</div>
</footer>
<script src="../_static/documentation_options.js?v=01f34227"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/shibuya.js?v=cac61aee"></script></body>
</html>