Purple
Linux · Local · Powered by Ollama

Purple

An agentic AI assistant that can actually do things on Linux.

Execute shell commands, manage your Gmail and Calendar, search the web, read Dropbox files, capture your screen, and run complex multi-step tasks — all from a beautiful local-first desktop window. No cloud, no subscription.

100% Local — zero cloud, zero telemetry
15+ Integrated tools
5 Approval tiers keep you in control
3 Distribution formats
What is Purple

A local AI client that goes beyond chat

Purple connects to your local Ollama instance and gives the model real tools to act on your Linux system. Unlike cloud assistants, it has no API key to manage, no usage caps, and no privacy trade-offs.

All data — conversation history, OAuth tokens, user memories, approval preferences — lives in a local SQLite database at ~/.purple/purple.db. Switch models instantly from the UI dropdown: Llama 3, Gemma, Mistral, Qwen, anything Ollama runs.

A configurable approval workflow gates every action by tier: read-only commands run silently, modification commands prompt once and remember your choice, destructive and sudo commands always require explicit confirmation.

Go 1.23 Ollama WebKitGTK 4.1 SQLite Linux Gin HTTP
Purple App
Capabilities

Everything the model needs to act

Each tool has a defined approval tier — from fully automatic reads to explicit per-execution approval for destructive operations.

💻

Shell Command Execution

Run any command on your system. Read-only commands (ls, df, ps, find) run automatically. Destructive, sudo, and network-post commands prompt the user — every time, no exceptions.

5 tiers
📧

Gmail, Calendar & Drive

Search threads, read emails, send replies with image attachments, save drafts. Create, update, and delete calendar events. Search Drive, read and write Google Docs.

12 tools · OAuth2
📦

Dropbox Files

List folders, search by name or content, read text files, create new files, and overwrite existing ones — using raw HTTP for maximum compatibility.

5 tools · OAuth2
🔍

Web Search & Fetch

Search via Brave Search API or self-hosted SearXNG. Fetch and read the plain text of any URL. Open links or app URIs (Spotify, Slack, Netflix) via xdg-open.

Automatic · No approval
🧠

Persistent Memory

Facts about you — name, email, location, preferences — are stored across all conversations and injected into every system prompt so the model always knows context.

Cross-session · SQLite
📷

Screenshot & Camera

Capture your full screen with a visible 5-second countdown, or grab a frame from your webcam. Images are sent to multimodal models for analysis or emailed as attachments.

Multimodal
📎

File Upload

Attach images for multimodal prompts or text files that get appended to your message. Configurable upload limit (default 20 MB). Images sent as base64 to Ollama.

Image + text
🎬

Inline YouTube Player

When the model responds with a YouTube URL on its own line, the chat UI automatically embeds it as a playable inline video — no tab switching required.

Auto-embed
⚙️

In-app Settings

Configure Ollama server URL, Google OAuth credentials, Dropbox keys, and search API keys from a settings panel. No environment variables or config files needed.

DB-persisted
🛡️

Kids Friendly Mode

Age-aware AI companion for children 5–16. Adapts language and tone, blocks sudo and write operations at the system level, and validates every web search result and URL for age-appropriateness. Password-protected.

New · Child safety
Agentic Task Mode

Give it a complex task. Watch it plan and execute.

Click ▶ to start an Agentic conversation. Purple operates as an agent — it plans, reasons, dispatches tool calls in parallel, and checks off progress as it goes.

Purple App
Child Safety

Kids Friendly Mode — AI your child can use safely

One button, one password. Enable Kids Friendly Mode and Purple becomes a safe, age-aware learning companion — adapting everything it says and does to the child's age, with no way to disable it without the parent's password.

  • 🧒 Age-adapted responses — tone, vocabulary, and depth tuned for children 5–16. Automatically redirects inappropriate questions.
  • 🚫 Hard-blocked operations — sudo commands and all write/send tools (file creation, Gmail send, Docs write) are blocked at the system level before any approval prompt.
  • 🔍 Web safety protocol — search results are assessed for age-appropriateness before display. Questionable results are silently skipped; unsafe URLs are never fetched.
  • 📚 Safe source preference — when fetching content, Purple prefers educational domains: Khan Academy, NASA, Britannica Kids, PBS Kids, and similar platforms.
  • 🔒 Password protected — enabling kids mode sets a protection password. Only someone with that password can disable the mode. Stored as a salted SHA-256 hash.
Purple App
👨‍👧

Kids Profile Mode — for dedicated child accounts

A deeper, always-on alternative that requires no passwords

Create a dedicated Linux account for your child and set PURPLE_KID_AGE=9 in their environment. Purple detects this automatically at startup — the model is locked to a safe choice, age-adapted responses are always active, conversation history is accessible, and parents can configure integrations from the child's account. The child cannot disable Kids Profile Mode. No passwords involved.

Kids Mode (🧒 toggle)
  • Manual toggle + password to disable
  • History locked
  • Settings hidden
  • Write tools blocked
Kids Profile (Linux account)
  • Always on — child cannot disable
  • History accessible
  • Settings visible for parents
  • File & cloud tools allowed

Kids Friendly Mode operates on a best-effort basis. As with all AI-generated content, accuracy and completeness cannot be guaranteed. This feature does not constitute a certified parental control system and may not prevent all exposure to inappropriate content. Parental supervision is recommended at all times.

Demo

See Purple in action

Watch a demonstration of agentic task execution — from planning through parallel tool calls to a completed result.

Download

Get Purple for your Linux system

Three distribution formats. All require Ollama running locally at http://localhost:11434.

📦

AppImage

Self-contained executable — bundles GTK3 and WebKit2GTK4.1. Runs on any modern Linux with an X11 display. No installation required, no root needed.

115.0 MB AppImage
⬇  Download AppImage
🎁

RPM

Native RPM package. Installs to /usr/bin/purple and registers a desktop entry. Runtime dependencies (gtk3, webkit2gtk4.1) installed automatically via dnf.

7.1 MB RPM
⬇  Download RPM
🗜️

TGZ

Portable tarball with an install.sh helper. Run as a regular user to install to ~/.local, or with DESTDIR=/usr sudo ./install.sh for a system-wide install.

8.6 MB TGZ
⬇  Download TGZ
Changelog

What's new

Recent release notes — each alpha ships multiple improvements across the assistant, tools, and packaging.

alpha27 May 31 2026
  • Kids Profile Mode: system-level always-on kids safety for a dedicated Linux child account. Activated by PURPLE_KID_AGE=<5-16> env var; optional PURPLE_KID_MODEL (default gemma4:e2b). No password — child cannot disable it.
  • Profile vs Mode differences: history accessible, settings visible (parents can add integrations), file/cloud write tools allowed, only sudo hard-blocked. kidsMode.profileMode=true triggers kidsProfilePrompt instead of kidsModePrompt.
  • Model locked to profile model at handleChat level; model selector disabled in UI.
  • Age badge (👧 Kids Profile · Age N) injected into topbar via applyKidsProfileUI().
  • Kids Mode toggle button (🧒) hidden in template when KidsProfileEnabled=true.
  • Kids profile welcome screen: child-friendly greeting, Start conversation button, simplified "What I can help with" capabilities, connected services if authorised.
  • Adult welcome screen: new "Setting up for a child?" panel with brief explanation and "How to set up Kids Profile →" link opening the in-app doc viewer.
  • New doc: web/static/docs/kids-profile.md — step-by-step Linux account setup, comparison table vs Kids Mode, autostart instructions, integrations guide.
  • New API: GET /api/kids-profile → {enabled, age, model}.
  • Website (purple_web): Kids Profile Mode callout with comparison table added to the Kids Friendly Mode section.
alpha26 May 31 2026
  • Welcome screen: shown on fresh start (no active conversation). Panels in order: Ollama status (install commands if not running, Start conversation / Agentic task buttons + model list if running), What I can do (6-cap grid), Kids Friendly Mode (enable/manage button), Integrations (Google, Dropbox, Web Search with auth status).
  • Gemma4 pinned as recommended model: sorted to the top of the model list with a "Recommended" badge; if not installed, shows `ollama pull gemma4:e2b` hint. Clicking Start from the welcome screen auto-selects Gemma4 in the model dropdown if it is available.
  • Welcome screen disappears automatically when any conversation is opened or started (dom.messages.innerHTML cleared by existing openConversation / createNewConversation).
alpha25 May 31 2026
  • Kids mode UI restrictions: conversation history locked (pointer-events:none), model selector disabled, settings button hidden while kids mode is active. Amber top border on the sidebar serves as a visible "protected" indicator.
  • Kids mode documentation: new web/static/docs/kids-mode.md covering how to enable/disable, all blocked operations, web safety protocol, UI restrictions, and password storage. Accessible via "How does Kids Mode work? →" button in the enable panel, using the same doc viewer as Google/Dropbox integration docs.
  • Registered kids-mode doc in validDocs allowlist (GET /api/docs/kids-mode).
alpha24 May 31 2026
  • Fix kids mode modal not closing: .kids-mode-overlay[hidden] { display: none; } was missing, so the CSS display:flex overrode the hidden attribute. Same fix pattern already used by .settings-overlay[hidden] on line 700 of style.css.
alpha23 May 31 2026
  • Kids Friendly Mode: age-aware AI companion for children aged 5–16. Enable via the 🧒 toolbar button; requires setting a protection password each time. Disabling requires the same password, preventing the child from turning it off.
  • Age-adapted system prompt: responses, vocabulary, and tone are tuned to the configured child age. Inappropriate questions are gently redirected.
  • Hard enforcement in kids mode: TierSudo commands and write/send operations (gdocs_create, gdocs_write, dropbox_create_file, dropbox_update_file, gmail_send) are blocked at the dispatcher level before any approval prompt is shown.
  • Web safety protocol: search results assessed for age-appropriateness before display; questionable results silently skipped; fetch_url refuses suspect URLs and redirects to kid-safe sources (khanacademy.org, nasa.gov, britannica.com/kids).
  • Password storage: random 16-byte salt + SHA-256 hash in the settings table; no plain-text password is ever persisted.
  • API: GET /api/kids-mode, POST /api/kids-mode/enable, POST /api/kids-mode/disable.
  • purple_web: new Kids Friendly Mode feature card and dedicated section with an active-state UI mockup; Kids Mode added to nav and footer links.
alpha22 May 31 2026
  • Agentic mode per-conversation: POST /api/conversations {"agentic":true} creates an agentic conversation persisted in SQLite (ALTER TABLE migration for existing DBs).
  • Three agentic-only tools: think (silent scratchpad), task_plan(steps[]) (live checklist card in UI), complete_step(index) (checks off plan items).
  • Context compaction: old tool-result messages truncated to 400 chars at 80% of NumCtx (16384 tokens); most recent 4 tool messages always kept intact.
  • Parallel TierRead dispatch: when all tool calls in a batch are TierRead, they run concurrently via goroutines with mutex-protected SSE writes.
  • UI: agentic task button (▶), sidebar ⚙ indicator for agentic conversations, task-plan-card checklist, compaction-notice styling.
  • Tests: handlers_test.go (agentic conv, think/task_plan/complete_step, compaction unit tests, parallel dispatch); store_test.go (agentic flag CRUD).
  • New distribution targets: purple_tgz (portable tarball with install.sh) and purple_appimage (self-contained AppImage bundling GTK3, WebKit2GTK4.1, and ~130 transitive shared libraries; GPU/display-protocol libs come from the host). AppRun sets GDK_BACKEND=x11, LD_LIBRARY_PATH, GIO_MODULE_DIR, WEBKIT_EXEC_PATH, WEBKIT_INJECTED_BUNDLE_PATH, and patches the GDK pixbuf loaders cache at runtime using a __APPDIR__ placeholder replaced by sed on each launch.
  • Fixed purple.desktop: removed unregistered Categories value "Accessories" (appimagetool validates the XDG desktop entry spec strictly).
  • README.md and INSTALL fully rewritten: correct binary name, all features documented (agentic mode, memory, capture, settings UI), all four distribution formats documented with build commands and install instructions.

Cache refreshed: 2026-06-04 16:25 UTC

Matt Mierzwinski
About the author

Hi, I'm Matt.

I'm a Senior Engineering Manager — though ask anyone I work with and they'll tell you I'm still very much in the code most of the time. I genuinely believe that a good engineering manager has to love and understand technology. You can't lead engineers well from a distance; you need to get your hands dirty, feel the friction, and care about the craft. So I do.

I'm a Linux veteran. I've built Linux From Scratch more times than I'd consider sane, and I'm a long-time Gentoo Linux user and supporter. My heart is still with Gentoo — there's something deeply satisfying about understanding exactly what's on your system and why. But I built Purple for Fedora, because that's where most of my daily work happens these days. I've also packaged it as an AppImage so it can be useful to anyone on any modern Linux distribution, Gentoo included.

Purple is the assistant I always wanted: running on Linux, using local models, completely free and offline. No subscription, no API key, no one watching what you ask. I care about liberalising access to LLMs — the idea that powerful AI assistance shouldn't require a credit card or a cloud account. Everyone with decent hardware should be able to run a capable assistant locally. That's what Purple is about.

A few months of evenings and weekends later it had grown into something I was using every day. That's when I thought: maybe others would find this useful too. So I cleaned it up, wrote some documentation, built a proper installer, and decided to put it out there.

Purple is still very much a personal project. I build it for my own workflow, fix things when I hit them, and add features when I need them. It's not a commercial product — there's no support team, no SLA, no guarantee it'll work flawlessly on your setup. Like most open-source software, it comes with the understanding that it works for me and might work for you, and that some rough edges are part of the deal. I've done my best to make it solid, but I'm one person with a day job, and software is never perfect. Use it at your own discretion, and keep backups of anything important.

If Purple genuinely helps you — that makes the evenings worthwhile. And if something breaks, open an issue. I'll take a look.

Purple is provided as-is, without warranties of any kind, express or implied. The author makes no representations about fitness for a particular purpose, reliability, or correctness. Use it knowing it's a passion project, not a product.

Connect on LinkedIn →
Stack

Built with technologies I love

Every layer of Purple is built on open, proven tools — chosen for reliability, not popularity.