getting-started.html
Rama main · réplica de lectura del repositorio original.
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Content-Security-Policy. GitHub Pages serves no custom headers, so the
policy has to travel in the markup (PRODUCT_BLUEPRINT 4.2, block F).
Note two limits of the meta form: frame-ancestors and report-uri are
ignored here, they exist only as real headers.
'unsafe-inline' is present for both script and style and is a deliberate
compromise, not an oversight: the pages carry inline <style> plus dozens
of style attributes, which no hash can cover, and two inline scripts one
of which differs per page. Hashes would make every later edit break the
page silently. On static pages with no user input the value left is
bounding WHERE external code, connections and frames may come from, and
that part is strict. -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; base-uri 'self'; object-src 'none'; script-src 'self' 'unsafe-inline' https://cdn.vemetric.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self' https://hub.vemetric.com; frame-src 'none'; form-action 'self'; upgrade-insecure-requests" />
<!-- Language: English is canonical, the switch happens client-side towards a
published translation only. Rule and rationale: PROJECT_BLUEPRINT 3.0quinquies.
Loaded in <head>, before rendered content, so nobody sees a flash of the
wrong language. -->
<script src="/languages.js"></script>
<script src="/lang_switch.js"></script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Spendif.ai: Install & first launch</title>
<meta name="description" content="Download Spendif.ai for macOS, Windows or Linux. Step-by-step install, first launch and initial setup guide." />
<meta property="og:title" content="Spendif.ai: Install & first launch" />
<meta property="og:description" content="Three steps: download, install, first launch. All offline, no cloud." />
<!-- SEO/GEO (managed) -->
<link rel="canonical" href="https://spendif.ai/getting-started.html" />
<link rel="alternate" hreflang="en" href="https://spendif.ai/getting-started.html" />
<link rel="alternate" hreflang="it" href="https://spendif.ai/it/getting-started.html" />
<link rel="alternate" hreflang="de" href="https://spendif.ai/de/getting-started.html" />
<link rel="alternate" hreflang="es" href="https://spendif.ai/es/getting-started.html" />
<link rel="alternate" hreflang="fr" href="https://spendif.ai/fr/getting-started.html" />
<link rel="alternate" hreflang="ja" href="https://spendif.ai/ja/getting-started.html" />
<link rel="alternate" hreflang="nl" href="https://spendif.ai/nl/getting-started.html" />
<link rel="alternate" hreflang="pl" href="https://spendif.ai/pl/getting-started.html" />
<link rel="alternate" hreflang="pt" href="https://spendif.ai/pt/getting-started.html" />
<link rel="alternate" hreflang="x-default" href="https://spendif.ai/getting-started.html" />
<meta name="robots" content="index,follow" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://spendif.ai/getting-started.html" />
<meta property="og:site_name" content="Spendif.ai" />
<meta property="og:locale" content="en_US" />
<meta property="og:locale:alternate" content="it_IT" />
<meta property="og:locale:alternate" content="de_DE" />
<meta property="og:locale:alternate" content="es_ES" />
<meta property="og:locale:alternate" content="fr_FR" />
<meta property="og:locale:alternate" content="ja_JP" />
<meta property="og:locale:alternate" content="nl_NL" />
<meta property="og:locale:alternate" content="pl_PL" />
<meta property="og:locale:alternate" content="pt_PT" />
<meta property="og:image" content="https://spendif.ai/og-image.en.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://spendif.ai/og-image.en.png" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "Spendif.ai: Install & first launch",
"description": "Download Spendif.ai for macOS, Windows or Linux. Step-by-step install, first launch and initial setup guide.",
"inLanguage": "en",
"url": "https://spendif.ai/it/getting-started.html",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Download for your system",
"url": "https://spendif.ai/it/getting-started.html#download"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Install",
"url": "https://spendif.ai/it/getting-started.html#install"
},
{
"@type": "HowToStep",
"position": 3,
"name": "First launch",
"url": "https://spendif.ai/it/getting-started.html#first-launch"
}
],
"about": {
"@type": "SoftwareApplication",
"name": "Spendif.ai",
"applicationCategory": "FinanceApplication",
"operatingSystem": "Windows, macOS, Linux",
"isAccessibleForFree": true,
"url": "https://spendif.ai/"
}
}
</script>
<!-- /SEO/GEO -->
<!-- Vemetric Analytics -->
<script>
window.vmtrcq = window.vmtrcq || [];
window.vmtrc = window.vmtrc || function (){window.vmtrcq.push(Array.prototype.slice.call(arguments))};
</script>
<script defer src="https://cdn.vemetric.com/main.js" id="vmtrc-scr" data-token="o10JyrtkgQ8RAn1q"></script>
<style>
/* Language menu. lang_switch.js is copied from the blueprint and fills
[data-lang-switcher] with bare <a> elements, so it is wrapped rather than
modified: a native details element needs no JavaScript of its own and works
keyboard and by touch, unlike a hover menu.
Why a menu and not a row: the rule requires each language written in its
own name, and nine full names do not fit a navbar. Collapsed, one name
shows. The closed label is hard-coded per page because a static page
already knows its own language. */
.lang-menu {
position: relative;
margin-left: 1rem;
font-size: 0.78rem;
}
.lang-menu > summary {
list-style: none;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.2rem 0.55rem;
border: 1px solid var(--border);
border-radius: 6px;
color: var(--muted);
white-space: nowrap;
}
.lang-menu > summary::-webkit-details-marker { display: none; }
.lang-menu > summary:hover,
.lang-menu[open] > summary { color: var(--text); border-color: var(--blue); }
.lang-menu [data-lang-switcher] {
position: absolute;
right: 0;
top: calc(100% + 0.35rem);
z-index: 50;
display: flex;
flex-direction: column;
min-width: 9.5rem;
padding: 0.3rem;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
.lang-menu [data-lang-switcher] a {
color: var(--muted);
text-decoration: none;
padding: 0.35rem 0.6rem;
border-radius: 4px;
white-space: nowrap;
}
.lang-menu [data-lang-switcher] a:hover { color: var(--text); background: var(--surface2); }
/* The language you are already reading is the closed label: repeating it
inside the menu would offer a link to where you already are. */
.lang-menu [data-lang-switcher] a[aria-current] { display: none; }
/* Without JavaScript the list stays empty, and an empty menu is worse than
no menu: the reader correctly stays on the page they landed on. */
.lang-menu:has([data-lang-switcher]:empty) { display: none; }
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0d1117;
--surface: #161b22;
--surface2: #21262d;
--border: #30363d;
--blue: #58a6ff;
--green: #3fb950;
--purple: #bc8cff;
--orange: #e3b341;
--red: #f85149;
--text: #e6edf3;
--muted: #8b949e;
--radius: 12px;
}
html { scroll-behavior: smooth; }
body {
background: var(--bg);
color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
line-height: 1.6;
}
a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }
.nav { position: sticky; top: 0; background: rgba(13,17,23,0.92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); z-index: 100; }
.nav-inner { max-width: 1100px; margin: 0 auto; padding: 1rem 1.5rem; display: flex; justify-content: space-between; align-items: center; }
.nav-brand { font-weight: 700; font-size: 1.15rem; }
.nav-brand a { color: var(--text); }
.nav-links { display: flex; gap: 1.5rem; align-items: center; }
.nav-links a { color: var(--muted); font-size: 0.95rem; }
.hero { padding: 4rem 1.5rem 2rem; text-align: center; }
.hero h1 { font-size: 2.4rem; line-height: 1.2; margin-bottom: 0.8rem; }
.hero .lead { font-size: 1.15rem; color: var(--muted); max-width: 640px; margin: 0 auto; }
.wrap { max-width: 1100px; margin: 0 auto; padding: 0 1.5rem 4rem; }
section { margin-top: 3.5rem; }
h2 { font-size: 1.6rem; margin-bottom: 1rem; }
h3 { font-size: 1.2rem; margin: 1.5rem 0 0.8rem; color: var(--text); }
p { color: var(--muted); margin-bottom: 0.8rem; }
.step-num { display: inline-block; width: 2.2rem; height: 2.2rem; border-radius: 50%; background: var(--blue); color: white; text-align: center; line-height: 2.2rem; font-weight: 700; margin-right: 0.8rem; vertical-align: middle; }
.dl-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1rem; margin-top: 1.5rem; }
.dl-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.5rem;
transition: border-color 0.2s, transform 0.2s;
}
.dl-card:hover { border-color: var(--blue); transform: translateY(-2px); }
.dl-card h3 { margin: 0 0 0.5rem; color: var(--text); }
.dl-card .os-icon { font-size: 2rem; margin-bottom: 0.5rem; }
.dl-card .ext { color: var(--muted); font-size: 0.85rem; font-family: monospace; margin-bottom: 1rem; }
.dl-btn {
display: inline-block;
background: var(--blue);
color: white;
padding: 0.6rem 1.1rem;
border-radius: 8px;
font-weight: 600;
text-decoration: none;
transition: opacity 0.2s;
}
.dl-btn:hover { opacity: 0.9; text-decoration: none; }
.dl-notes { color: var(--muted); font-size: 0.85rem; margin-top: 0.8rem; }
/* Marks the card matching the visitor's system. Deliberately wordless:
the page exists in nine languages and a label here would be English in
eight of them. */
.dl-card.is-yours { border-color: var(--blue); box-shadow: 0 0 0 2px var(--blue) inset; }
.dl-meta { color: var(--muted); font-size: 0.8rem; margin-top: 0.5rem; font-variant-numeric: tabular-nums; min-height: 1em; }
.step {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
margin: 2rem 0;
align-items: start;
}
.step.reverse { grid-template-columns: 1fr 1fr; }
.step.reverse .step-text { order: 2; }
.step.reverse .step-img { order: 1; }
@media (max-width: 720px) {
.step, .step.reverse { grid-template-columns: 1fr; }
.step.reverse .step-text, .step.reverse .step-img { order: 0; }
}
.step-img {
background: var(--surface2);
border: 1px dashed var(--border);
border-radius: var(--radius);
aspect-ratio: 16 / 10;
display: flex;
align-items: center;
justify-content: center;
color: var(--muted);
font-size: 0.9rem;
text-align: center;
padding: 1rem;
overflow: hidden;
}
.step-img img { max-width: 100%; max-height: 100%; border-radius: 8px; }
.step-img .ph {
display: flex; flex-direction: column; align-items: center; gap: 0.5rem;
}
.step-img .ph code { background: var(--bg); padding: 0.2rem 0.5rem; border-radius: 4px; font-size: 0.8rem; }
/* Finché non esistono gli screenshot reali (assets/screenshots/ è vuota), i
riquadri segnaposto restano nel markup ma non a schermo: comunicavano
"cantiere aperto" a chi visitava la pagina. Le due regole si disattivano
da sole nel momento in cui .ph viene sostituito da un <img>. */
.step:has(.ph) { grid-template-columns: 1fr; }
.step-img:has(.ph) { display: none; }
.note {
background: var(--surface);
border-left: 4px solid var(--orange);
padding: 1rem 1.2rem;
border-radius: 6px;
margin: 1.5rem 0;
}
.note strong { color: var(--orange); }
footer { border-top: 1px solid var(--border); padding: 2rem 1.5rem; text-align: center; color: var(--muted); font-size: 0.9rem; }
footer a { color: var(--blue); }
</style>
</head>
<body>
<nav class="nav">
<div class="nav-inner">
<div class="nav-brand"><a href="/">Spendif.ai</a></div>
<div class="nav-links">
<a href="#what-you-get">What you get</a>
<a href="#download">Download</a>
<a href="#install">Install</a>
<a href="#first-launch">First launch</a>
<details class="lang-menu">
<summary>🌐 English</summary>
<nav data-lang-switcher aria-label="Language"></nav>
</details>
</div>
</div>
</nav>
<section class="hero">
<h1>Install & first launch</h1>
<p class="lead">Three steps to get Spendif.ai running on your computer: download, install, first launch. All offline, no account required.</p>
</section>
<div class="wrap">
<section id="what-you-get">
<h2><span class="step-num" style="background:var(--green)">✨</span>What you get</h2>
<ul class="features-list">
<li><strong>Imports any bank's CSV/XLSX</strong>: auto-detects format, no manual mapping</li>
<li><strong>AI categorisation, fully offline</strong>: local LLM included, no cloud needed</li>
<li><strong>Local AI by default</strong>: data stays on your machine; remote LLM is opt-in and redacts IBAN / cards / owner names (amounts and dates still travel: see roadmap)</li>
<li><strong>Five languages</strong>: Italian, English, French, German, Spanish</li>
<li><strong>Card-account reconciliation</strong> <span class="beta-tag">(beta)</span>: pairs credit-card settlements with the underlying expenses to avoid double-counting<span class="beta-note">(edge cases still being refined)</span></li>
<li><strong>Internal transfer detection</strong> <span class="beta-tag">(beta)</span>: matches transfers across your own accounts so they don't inflate dashboards<span class="beta-note">(edge cases still being refined)</span></li>
</ul>
</section>
<section id="download">
<h2><span class="step-num">1</span>Download for your system</h2>
<div class="dl-grid">
<div class="dl-card">
<div class="os-icon">🍎</div>
<h3>macOS</h3>
<div class="ext">SpendifAi-*.dmg</div>
<a id="dl-mac" class="dl-btn" href="https://github.com/spendifai/spendif-ai/releases/latest/download/SpendifAi-arm64.dmg" target="_blank" rel="noopener noreferrer">Download DMG</a>
<div class="dl-notes">macOS 12 Monterey or later. Apple Silicon only (M1 or newer).<br>On an Intel Mac? <a href="https://github.com/spendifai/spendif-ai/discussions" target="_blank" rel="noopener noreferrer">Tell us</a>: an Intel build is not planned, but one request is enough to reconsider.</div>
</div>
<div class="dl-card">
<div class="os-icon">🪟</div>
<h3>Windows</h3>
<div class="ext">SpendifAi-*.msix</div>
<a id="dl-win" class="dl-btn" href="https://github.com/spendifai/spendif-ai/releases/latest/download/SpendifAi.msix" target="_blank" rel="noopener noreferrer">Download MSIX</a>
<div class="dl-notes">Windows 10 1809+ / Windows 11. Sideload + trusted cert needed during pre-alpha.</div>
</div>
<div class="dl-card">
<div class="os-icon">🐧</div>
<h3>Debian / Ubuntu</h3>
<div class="ext">spendifai_*_amd64.deb</div>
<a id="dl-deb" class="dl-btn" href="https://github.com/spendifai/spendif-ai/releases/latest/download/spendifai_amd64.deb" target="_blank" rel="noopener noreferrer">Download .deb</a>
<div class="dl-notes">Ubuntu 22.04+, Debian 12+, Mint 21+.</div>
</div>
<div class="dl-card">
<div class="os-icon">🎩</div>
<h3>Fedora / RHEL</h3>
<div class="ext">spendifai-*.rpm</div>
<a id="dl-rpm" class="dl-btn" href="https://github.com/spendifai/spendif-ai/releases/latest/download/spendifai.rpm" target="_blank" rel="noopener noreferrer">Download .rpm</a>
<div class="dl-notes">Fedora 40+, RHEL 9+, Rocky / Alma 9+.</div>
</div>
<div class="dl-card">
<div class="os-icon">🏔️</div>
<h3>Arch Linux</h3>
<div class="ext">spendifai-*.pkg.tar.zst</div>
<a id="dl-arch" class="dl-btn" href="https://github.com/spendifai/spendif-ai/releases/latest/download/spendifai.pkg.tar.zst" target="_blank" rel="noopener noreferrer">Download .pkg.tar.zst</a>
<div class="dl-notes">Arch, Manjaro, EndeavourOS<br><code>sudo pacman -Syu</code><br><code>sudo pacman -U ./spendifai-*.pkg.tar.zst</code></div>
</div>
</div>
<p class="dl-notes" style="margin-top:1.5rem">Looking for a specific version? See <a href="https://github.com/spendifai/spendif-ai/releases" target="_blank" rel="noopener noreferrer">all releases</a> · Source code: <a href="https://github.com/spendifai/spendif-ai" target="_blank" rel="noopener noreferrer">spendifai/spendif-ai</a>.</p>
</section>
<section id="install">
<h2><span class="step-num">2</span>Install</h2>
<div class="step">
<div class="step-text">
<h3>macOS: DMG</h3>
<p>1. Double-click the downloaded <code>.dmg</code>.</p>
<p>2. Drag <strong>SpendifAi.app</strong> into the <strong>Applications</strong> folder.</p>
<p>3. Eject the DMG (Cmd+E) and launch the app from Launchpad.</p>
<p>The DMG is signed with a Developer ID certificate and notarised by Apple, so macOS opens it with no warnings.</p>
<p style="margin-top:1.2rem"><strong>Alternatively, with Homebrew:</strong></p>
<p>
<code>brew tap spendifai/spendifai</code><br>
<code>brew trust --cask spendifai/spendifai/spendifai</code><br>
<code>brew install --cask spendifai</code>
</p>
<p>From then on you update with <code>brew update && brew upgrade --cask spendifai</code>.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/macos-dmg-dragdrop.png</code>
<div>(drag & drop from DMG to Applications)</div>
</div>
<!-- <img src="/assets/screenshots/macos-dmg-dragdrop.png" alt="DMG drag and drop to Applications"> -->
</div>
</div>
<div class="step reverse">
<div class="step-text">
<h3>Windows: MSIX</h3>
<p>1. Double-click the downloaded <code>.msix</code>.</p>
<p>2. The built-in App Installer opens. Click <strong>Install</strong>.</p>
<p>3. The app appears in the Start Menu: launch from there.</p>
<p>The first few times, Windows may show "Windows protected your PC": click "More info", then "Run anyway". The warning fades as the certificate builds reputation. Details in the <a href="https://github.com/spendifai/spendif-ai/blob/main/docs/installation_windows.md" target="_blank" rel="noopener noreferrer">guide</a>.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/windows-msix-install.png</code>
<div>(Windows App Installer dialog)</div>
</div>
<!-- <img src="/assets/screenshots/windows-msix-install.png" alt="Windows App Installer"> -->
</div>
</div>
<div class="step">
<div class="step-text">
<h3>Linux: .deb / .rpm</h3>
<p>From the terminal:</p>
<p><code>sudo apt install ./spendifai_*.deb</code> (Debian/Ubuntu)</p>
<p><code>sudo dnf install ./spendifai-*.rpm</code> (Fedora/RHEL)</p>
<p>The <code>postinst</code> only installs <code>uv</code>. The venv, the model download and <code>.env</code> happen at <strong>first launch</strong>, so the first start takes a few minutes. Full guide: <a href="https://github.com/spendifai/spendif-ai/blob/main/docs/installazione.en.md" target="_blank" rel="noopener noreferrer">installation docs</a>.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/linux-deb-install.png</code>
<div>(dpkg/dnf terminal output)</div>
</div>
<!-- <img src="/assets/screenshots/linux-deb-install.png" alt="Linux install output"> -->
</div>
</div>
</section>
<section id="first-launch">
<h2><span class="step-num">3</span>First launch</h2>
<p>On first launch Spendif.ai sets up its environment: it's the longest step, but happens only once.</p>
<div class="note">
<strong>⏱ Time required:</strong> depends on your connection speed (usually 5-15 minutes). Free disk space required: ~5 GB. Good news: <strong>you can start filling in the wizard right away</strong>, the model downloads in parallel.
</div>
<div class="step">
<div class="step-text">
<h3>3a. Splash + AI model download (in parallel)</h3>
<p>Double-clicking opens a native window with a <strong>splash screen</strong>. Spendif.ai detects your RAM/VRAM and kicks off a background download of the LLM best suited for your hardware (Qwen 2.5, Gemma 3: sizes from 1 to 8 GB).</p>
<p>The model lives at <code>~/.spendifai/models/</code> (macOS/Linux) or <code>%USERPROFILE%\.spendifai\models\</code> (Windows) and survives reinstalls. <strong>The configuration wizard appears within seconds</strong>, without waiting for the download to finish.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/splash-download-progress.png</code>
<div>(splash + model download progress)</div>
</div>
<!-- <img src="/assets/screenshots/splash-download-progress.png" alt="Splash screen with model download progress"> -->
</div>
</div>
<div class="step reverse">
<div class="step-text">
<h3>3b. Onboarding wizard: 4 steps</h3>
<p>While the model continues downloading in the background, the <strong>configuration wizard</strong> guides you through 4 steps:</p>
<p>1. <strong>Language</strong>: taxonomy, date format, number separators.<br>
2. <strong>Holders</strong>: your name and the variants your bank uses.<br>
3. <strong>Accounts</strong>: current account, cards, cash.<br>
4. <strong>Summary + Start</strong>: everything is written only here, no partial persistence.</p>
<p>Every step shows a <strong>live download banner</strong> at the top (e.g. "📚 78% · ~3 min"). On the final summary, the <em>Start</em> button stays disabled until the model is 100%: so the Import page works immediately when you reach the app. Everything is changeable from <em>Settings</em> later.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/onboarding-step-1-language.png</code>
<div>(wizard step 1: language selection)</div>
</div>
<!-- <img src="/assets/screenshots/onboarding-step-1-language.png" alt="Onboarding step 1: language"> -->
</div>
</div>
<div class="step">
<div class="step-text">
<h3>3c. App ready</h3>
<p>On confirm the wizard creates the SQLite database and lands you on the <strong>Import</strong> page. From here you load your first bank CSV/XLSX files.</p>
<p>From then on the flow is: double-click → splash (1-2 seconds) → app. No more downloads, no more wizard.</p>
</div>
<div class="step-img">
<div class="ph">
<div>📷 Screenshot</div>
<code>assets/screenshots/app-ready-import-page.png</code>
<div>(app ready, Import page)</div>
</div>
<!-- <img src="/assets/screenshots/app-ready-import-page.png" alt="App ready: import page"> -->
</div>
</div>
</section>
<!-- Uninstall -->
<section id="uninstall">
<h2>Uninstalling</h2>
<p>Nothing stays on your computer against your will. The command depends on how you installed:</p>
<p>Not sure how you installed? If you used the Terminal it was Homebrew, otherwise it was the DMG.</p>
<p><strong>macOS, Homebrew:</strong> <code>brew uninstall --cask spendifai</code></p>
<p><strong>macOS, DMG:</strong> drag <code>SpendifAi.app</code> to the Trash</p>
<p><strong>Debian / Ubuntu:</strong> <code>sudo apt remove spendifai</code></p>
<p><strong>Fedora / RHEL:</strong> <code>sudo dnf remove spendifai</code></p>
<p><strong>Windows:</strong> Settings > Apps > Spendif.ai > Uninstall</p>
<p><strong>Your data stays, on purpose.</strong> <code>~/.spendifai</code> (<code>%USERPROFILE%\.spendifai</code> on Windows) holds your transaction database, your settings and the AI models, several GB in all. None of the commands above touch it.</p>
<p><strong>Export what you want to keep before deleting it</strong>, from the Ledger page: once removed it cannot be recovered.</p>
<p>To remove the data too: with Homebrew, <code>brew uninstall --zap --cask spendifai</code>. Otherwise use the uninstaller for your system (<a href="https://github.com/spendifai/spendif-ai/blob/main/packaging/macos/uninstall.sh" target="_blank" rel="noopener noreferrer">macOS</a>, <a href="https://github.com/spendifai/spendif-ai/blob/main/packaging/linux/uninstall.sh" target="_blank" rel="noopener noreferrer">Linux</a>, <a href="https://github.com/spendifai/spendif-ai/blob/main/packaging/windows/uninstall.ps1" target="_blank" rel="noopener noreferrer">Windows</a>), which asks separately about the database and the models, or delete the folder yourself.</p>
</section>
<section id="help">
<h2>Having trouble?</h2>
<p>
Full documentation:
<a href="https://github.com/spendifai/spendif-ai/blob/main/docs/installazione.en.md" target="_blank" rel="noopener noreferrer">install guide</a> ·
<a href="https://github.com/spendifai/spendif-ai/blob/main/docs/guida_utente.en.md" target="_blank" rel="noopener noreferrer">user guide</a> ·
<a href="https://github.com/spendifai/spendif-ai/blob/main/docs/installation_macos.md" target="_blank" rel="noopener noreferrer">macOS deep-dive</a> ·
<a href="https://github.com/spendifai/spendif-ai/blob/main/docs/installation_windows.md" target="_blank" rel="noopener noreferrer">Windows deep-dive</a>.
</p>
<p>Bugs, questions, requests: <a href="https://github.com/spendifai/spendif-ai/issues" target="_blank" rel="noopener noreferrer">open a GitHub issue</a>.</p>
<p>Prefer email? Write to <a href="mailto:support@spendif.ai">support@spendif.ai</a>.</p>
</section>
<!-- ── What's coming next (alpha-driven roadmap) ─────────────────── -->
<section id="roadmap">
<h2>What's coming next</h2>
<p>Spendif.ai is in alpha. The features we add next are decided together with the people using the app today: no speculative work, no roadmap dictated from above.</p>
<p>Features under evaluation based on alpha-tester feedback:</p>
<ul>
<li><strong>Cash tracking</strong>: log cash purchases manually, with no bank statement attached</li>
<li><strong>Investment performance</strong>: see at a glance how the instruments in your portfolio are doing</li>
<li><strong>Companion mobile app</strong>: capture cash on the fly from your phone and sync with the desktop</li>
</ul>
<p>Would one of these help you? Tell us in <a href="https://github.com/spendifai/spendif-ai/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a>. When enough requests stack up on the same feature, it moves to the top of the queue.</p>
</section>
</div>
<footer>
<p>© 2026 Luigi Corsaro · Spendif.ai · MIT License · <a href="https://github.com/spendifai/spendif-ai" target="_blank" rel="noopener noreferrer">Source on GitHub</a></p>
</footer>
<!-- The download buttons resolve without this script: their href is already
the stable per-OS name under releases/latest/download/. What follows is
decoration only - which card is yours, and what you are about to get. -->
<script>
(function () {
var CARD_OF = { mac: 'dl-mac', win: 'dl-win', deb: 'dl-deb', rpm: 'dl-rpm', arch: 'dl-arch' };
var ALIAS = {
'dl-mac': 'SpendifAi-arm64.dmg',
'dl-win': 'SpendifAi.msix',
'dl-deb': 'spendifai_amd64.deb',
'dl-rpm': 'spendifai.rpm',
'dl-arch': 'spendifai.pkg.tar.zst'
};
function guessOs() {
var ua = navigator.userAgent || '';
var plat = (navigator.userAgentData && navigator.userAgentData.platform) || navigator.platform || '';
// A phone cannot install any of these, so highlighting one would be a lie.
if (/Android|iPhone|iPad|iPod/i.test(ua)) return null;
if (/Mac/i.test(plat) || /Mac OS X/i.test(ua)) return 'mac';
if (/Win/i.test(plat) || /Windows/i.test(ua)) return 'win';
if (/Linux|X11/i.test(plat + ' ' + ua)) {
if (/Arch|Manjaro|EndeavourOS/i.test(ua)) return 'arch';
return /Fedora|Red Hat|CentOS|Rocky|Alma|SUSE/i.test(ua) ? 'rpm' : 'deb';
}
return null;
}
var os = guessOs();
if (os) {
var btn = document.getElementById(CARD_OF[os]);
var card = btn && btn.closest('.dl-card');
if (card) {
card.classList.add('is-yours');
var grid = card.parentNode;
if (grid && grid.firstChild !== card) grid.insertBefore(card, grid.firstChild);
}
}
// Version and size, when GitHub answers. Numbers only, no words: see the
// note on .is-yours above. A failure here leaves the cards as they are.
fetch('https://api.github.com/repos/spendifai/spendif-ai/releases/latest', { headers: { 'Accept': 'application/vnd.github+json' } })
.then(function (r) { return r.ok ? r.json() : Promise.reject(r.status); })
.then(function (rel) {
var assets = (rel && rel.assets) || [];
var byName = {};
assets.forEach(function (a) { byName[a.name] = a; });
Object.keys(ALIAS).forEach(function (id) {
var el = document.getElementById(id);
var asset = byName[ALIAS[id]];
if (!el || !asset) return;
var card = el.closest('.dl-card');
if (!card) return;
var meta = card.querySelector('.dl-meta');
if (!meta) { meta = document.createElement('div'); meta.className = 'dl-meta'; card.appendChild(meta); }
meta.textContent = (rel.tag_name || '') + ' \u00b7 ' + Math.round(asset.size / 1048576) + ' MB';
});
})
.catch(function () { /* the links work anyway */ });
})();
</script>
</body>
</html>