{"id":36464848,"url":"https://github.com/ventsislav-georgiev/prosper","last_synced_at":"2026-06-28T22:00:44.754Z","repository":{"id":366151626,"uuid":"1268414412","full_name":"ventsislav-georgiev/prosper","owner":"ventsislav-georgiev","description":"Prosper — your Mac, autocompleted.","archived":false,"fork":false,"pushed_at":"2026-06-27T17:55:11.000Z","size":9061,"stargazers_count":22,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T19:20:34.767Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ventsislav-georgiev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://getprosper.lemonsqueezy.com/checkout/buy/7452e3cc-d14d-4c14-b795-d9d95b4a5ba9?discount=0\u0026logo=0"]}},"created_at":"2026-06-13T14:01:37.000Z","updated_at":"2026-06-27T17:55:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ventsislav-georgiev/prosper","commit_stats":null,"previous_names":["ventsislav-georgiev/prosper"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/ventsislav-georgiev/prosper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ventsislav-georgiev%2Fprosper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ventsislav-georgiev%2Fprosper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ventsislav-georgiev%2Fprosper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ventsislav-georgiev%2Fprosper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ventsislav-georgiev","download_url":"https://codeload.github.com/ventsislav-georgiev/prosper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ventsislav-georgiev%2Fprosper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34905180,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clipboard","clipboard-manager","ditto","krunner","linux","macos","numi","windows"],"created_at":"2026-01-12T00:01:37.825Z","updated_at":"2026-06-28T22:00:44.748Z","avatar_url":"https://github.com/ventsislav-georgiev.png","language":"Swift","funding_links":["https://getprosper.lemonsqueezy.com/checkout/buy/7452e3cc-d14d-4c14-b795-d9d95b4a5ba9?discount=0\u0026logo=0"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg width=\"128\" height=\"128\" src=\"assets/AppIcon.png\" alt=\"Prosper icon\"\u003e\n\n# Prosper\n\n**Your Mac, autocompleted.** A local LLM at your fingertips — system-wide inline autocomplete and a command palette, 100% on-device.\n\n[![Platform](https://img.shields.io/badge/Apple%20Silicon-black?logo=apple)](#install)\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"Command palette part 1 — calc, percentages, units, currency, time zones\" src=\"https://github.com/user-attachments/assets/ab5b9ed2-ccbb-4e4f-8343-feb659ee0392\" /\u003e\u003c/p\u003e\n\n\u003csub\u003eEverything runs locally. No cloud, no daemon, no typed text leaving your machine.\u003c/sub\u003e\n\n\u003c/div\u003e\n\n---\n\n## Why Prosper\n\n- **Inline autocomplete everywhere** — ghost-text continuations at your caret in *any* app, powered by an in-process MLX model (Gemma 4 E4B QAT 8-bit, auto-downloaded on first launch; lighter E2B/E4B variants selectable in Settings).\n- **A command palette that computes** — calc, units, currency, time zones, translate, base64, shell, window snapping, app launcher, file search, browser bookmarks, snippets, quicklinks, quickdirs… one hotkey, type, `⏎`.\n- **Local by architecture, not by promise** — Swift with **in-process MLX inference**: no extra process, minimal CPU/memory, nothing leaves your Mac but the one-time model pull.\n- **A local coding agent** — `⌥G` opens a chat window driving an on-device tool-using agent (read/edit files, run shells, MCP tools), powered by an in-process MLX model — no API key, no cloud.\n- **Extensible end to end** — Lua commands without recompiling, plus MCP servers, agent lifecycle hooks, and JS/TS plugins for the coding agent.\n\n---\n\n## Install\n\n```sh\nbrew install --cask ventsislav-georgiev/tap/prosper\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eOther ways to install\u003c/summary\u003e\n\n- **Direct download** — grab `Prosper-\u003cversion\u003e.zip` from the [latest release](https://github.com/ventsislav-georgiev/prosper/releases/latest), unzip, drag to `/Applications`. Signed + notarized, so it opens normally — no Gatekeeper workaround.\n\n\u003c/details\u003e\n\n---\n\n## Command palette\n\n`⌥Space` opens a floating palette. `⏎` pastes the result where you were typing, `Esc` cancels. The two clips above walk the expression commands end to end — calc → units → currency → time zones, then emoji → shell → live base64 → fuzzy app launch — without ever closing the palette.\n\n| Command | Example | Result |\n| --- | --- | --- |\n| **Calc** | `128*24` · `52% of 900` · `120 + 10%` | `3072` · `468` · `132` |\n| **Unit** | `1 year to minutes` | `525960 minutes` |\n| **Currency** | `32 usd to eur` · `$30 CAD + 5 USD - 7 EUR` | today's FX (cached daily), mixed-currency math |\n| **Time** | `2:30 pm HKT in Berlin` · `time in Tokyo` | cross-zone conversion, city or zone names |\n| **App** | `o Safari` | launch app by name (fuzzy) |\n| **Files** | `f report.pdf` | Spotlight file/folder search, open one |\n| **Shell** | `\u003e date` | run command, output inline |\n| **Base64** | `base64 hi` / `unbase64 aGk=` | live dual-pane encode/decode |\n| **Bookmarks** | `bm github` | search browser bookmarks (Chrome/Brave/Edge/Vivaldi/Opera/Arc/Safari/Firefox/Zen), open one |\n| **Snippets** | `sn sig` · `sn add` | insert a saved snippet (dynamic placeholders); `add`/`rm`/`list` to manage |\n| **QuickLink** | `ql gh anthropics/repo` | open a saved URL/path with `{query}` |\n| **QuickDir** | `qd projects api` | browse a saved dir's subfolders, run its action on one |\n| **Window** | `win left` / `win max` | snap the focused window (also `⌃⌥←→↑↓` / `⌃⌥⏎` / `⌃⌥C` global hotkeys) |\n| **Emoji** | `:fire` | 🔥 |\n| **Meta** | `:q` / `:c` | quit / clear clipboard history |\n| **Translate** | *free text* (or `⌥L`) | best translation + alternatives, on-device |\n\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"Command palette part 2 — emoji, shell, live base64, fuzzy app launch\" src=\"https://github.com/user-attachments/assets/987e6aae-5e03-4479-9030-9d63b2f41ea0\" /\u003e\u003c/p\u003e\n\n\u003e **Shortcut already taken?** Another launcher may own the hotkey (Raycast claims `⌥Space` by default). Prosper detects the conflict on launch and notifies; rebind in **Settings → Shortcuts**.\n\n---\n\n## Clipboard history\n\n`⇧⌥A` opens a floating history (text, files, image previews). Off by default — enable in **Settings → General**. Blobs live on disk; concealed/transient types are skipped.\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"prosper-demo-clipboard\" src=\"https://github.com/user-attachments/assets/0c54151f-ed67-4606-b104-2164e914a903\" /\u003e\u003c/p\u003e\n\nText is auto-typed into **link / email / color** (with a color swatch preview) for at-a-glance icons and filtering. In-panel keys: `⏎` paste · `⌘.` pin (pinned entries sort to the top and survive eviction / clear-all) · `⌘E` rename · `⌘P` cycle the type filter · `⌘⌫` delete · `↑↓` navigate · `Esc` dismiss.\n\n---\n\n## Inline autocomplete\n\nType in *any* text field → Prosper shows a continuation as ghost text at the caret.\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"290\" alt=\"prosper-demo-typing\" src=\"https://github.com/user-attachments/assets/69ba3409-27c7-469d-91c6-2e2048dc3f46\" /\u003e\u003c/p\u003e\n\n| Key | Action |\n| --- | --- |\n| `→` | accept whole suggestion |\n| `Tab` / `⌥→` | accept one word (repeat to walk word-by-word) |\n| `⌥Tab` | pass a literal Tab through (form navigation) |\n| `Esc` | dismiss + stay quiet in that field until focus moves |\n| `⌥.` | regenerate the suggestion in place |\n| `⌃` + `` ` `` | force a fresh suggestion (also lifts an `Esc` mute) |\n\n- **Type-through ghost** — keep typing what the ghost predicts and it absorbs your keystrokes in place (no flicker, no re-request); steer toward a different word and it snaps to your word instantly while the model catches up.\n- **Always suggests** — quiet only for security: password managers, Secure Input, browser address bars (plus your own `Esc` / per-app rules). Whether the context is \"enough\" is your call, not the model's.\n- **Screen-aware context** — nearby on-screen text and the visible conversation (local OCR), plus app/site-specific prompt context, sharpen suggestions in chat apps and browsers.\n- **Live indicator** (optional accessory icon) — pulses while thinking, shows a lock under Secure Input, turns orange when generation failed (click it, or hit `⌥.`, to retry). The menu bar names the app holding Secure Input when completions are paused.\n- **Electron/Chromium-aware caret tracking** — Slack, Discord \u0026 co. hide caret geometry from assistive tooling; Prosper unlocks their accessibility tree and pins the ghost to the real caret, baseline-aligned with your text.\n- Completion length (short/medium/long), optional trailing space after the final word-accept, custom AI instructions, per-app/per-domain rules, hide-overlays-on-click — **Settings → Completions / Apps**. The menu-bar icon also toggles completions for the app you were just using.\n- **Frees its own RAM** — the model unloads when you turn completions off, and after an idle timeout (default 2 min, configurable), reloading on demand. The inline hot path is untouched.\n\nTyping `:name` also ghost-replaces with an emoji on accept.\n\n---\n\n## Coding agent\n\n`⌥G` opens a chat window with a local, tool-using coding agent — it reads and edits files, runs shell commands, and calls MCP tools, all driven by an in-process MLX model (default **Qwen3-Coder 30B-A3B**; lighter Qwen3 variants selectable in **Settings → Agent**). No API key, no cloud round-trip — the model server is loopback-only and never exposed to the network.\n\n\u003e First agent use downloads two things on demand (so an install that never opens the agent stays slim): the model, and the ~86 MB Codex helper binary (pinned release, SHA-256-verified). Both are cached for later launches.\n\n\u003c!-- TODO: chat window demo gif --\u003e\n\n- **Real tool use** — file read/write, shell, and any MCP server you add; approvals surface inline so you stay in control of writes and commands.\n- **Run from the terminal** — `prosper agent [--cwd \u003cdir\u003e] \u003cprompt…\u003e` queues a one-shot run against the already-running app (sessions persist).\n- **Extensible** — bring your own **MCP servers** (`~/.config/prosper/mcp.json`), **lifecycle hooks** (`~/.config/prosper/hooks.json`, Claude Code-compatible schema), and **JS/TS plugins** (opencode-style, run on a sandboxed Bun host). Manage in **Settings → Agent**.\n\n---\n\n## Translate\n\n`⌥L` (or just type a sentence) — best translation plus alternative renderings, entirely on-device. A single ambiguous word lists its candidate meanings; a full sentence picks up the context.\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"prosper-demo-translate\" src=\"https://github.com/user-attachments/assets/0683c69a-955c-434b-8448-b80758b4b64e\" /\u003e\u003c/p\u003e\n\n---\n\n## QuickLinks \u0026 QuickDirs\n\nSaved URLs with `{query}` templates and saved directories with per-dir actions — browse with a prefix, create new ones inline with `ql add` / `qd add`.\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"prosper-demo-links\" src=\"https://github.com/user-attachments/assets/a9a19b68-4f7d-4324-bbb4-dda5b2710ccb\" /\u003e\u003c/p\u003e\n\n---\n\n## Snippets\n\nInsert saved text snippets with dynamic placeholders — type `sn`, pick one, and it expands at your caret in any app. Manage them inline: `sn add` opens a capture dialog, `sn rm` / `sn list` (an empty `sn` query lists everything).\n\n---\n\n## Bookmarks\n\nSearch and open browser bookmarks from the palette — type `bm` and filter across **Chrome, Brave, Edge, Vivaldi, Opera, Arc, Safari, Firefox, and Zen** at once. Refresh with `bm import`; `bm browsers` lists what was found.\n\n---\n\n## Browser router\n\nMake Prosper your default browser and every clicked link is routed to the right\nbrowser by domain — work links to Chrome, personal to Safari, a localhost rule to\nwhatever you like. Set it up in **Settings → URL Dispatcher**: a one-click *Make\nProsper the Default Browser* button, a fallback browser for unmatched links, and a\n**domain → browser** rule list (first match wins, plain substring). Nothing is\nhardcoded; rules live in your config. A stateless port of [Finicky](https://github.com/johnste/finicky) /\nHammerspoon URL routing — and the Hammerspoon facade runs an existing\n`hs.urlevent.httpCallback` config unmodified.\n\n---\n\n## OpenLid\n\nKeep your Mac awake with the lid closed — no external display or charger required. **Toggle Mac Awake** flips the clamshell-sleep override on/off, guarded by your battery, network, and AC-power state so it won't drain a disconnected laptop. **OpenLid Status** shows what's currently keeping it awake (read-only); **Toggle Display Awake** keeps the screen from sleeping / the screensaver from kicking in while the lid is open.\n\nWorks **out of the box** — no `sudo`, no Terminal, no `sudoers` edit. The lid override needs root, so Prosper installs a tiny privileged helper the first time you enable it (one-time approval in **System Settings → Login Items**); it uses no memory when idle and auto-resets if the app quits or crashes. Nothing is installed unless you use the feature.\n\nInspired by: https://github.com/openlid/openlid\n\n---\n\n## Themes\n\nRe-skin the whole app — palette, menu-bar, and dock chrome — from a flat 12-token color palette, with instant redraw. Pick one in **Settings → Personalization**. Ships with the built-in neon-blue console theme and a warm **amber** theme; extensions can contribute their own (`[[contributes.themes]]` → `theme.json`). See [Writing extensions](extensions.md).\n\n---\n\n## Extensions\n\nAdd commands without recompiling — small **Lua** scripts, auto-loaded, routed by regex. Manage in **Settings → Extensions**: enable/disable, edit live (everything lives in `~/.config/prosper/extensions`), reset bundled extensions to original, **install from GitHub** by pasting a repo URL, or browse the **Marketplace** to one-click-install (and publish) signed extensions — fresh installs stay untrusted until you grant trust.\n\nThe built-in commands above (calc, currency, units, base64, quicklinks, quickdirs, snippets, window, open, find files, translate, shell, browser bookmarks, plus the OpenLid and URL-dispatcher automations) *are* Lua extensions — open them in Settings to see how they're written, or use them as templates. Extensions can also **contribute themes** (a flat 12-token palette that re-skins the whole app, including menu-bar/dock chrome — pick one in **Settings → Personalization**) and drive **system automation** — global hotkeys, key remaps, app launchers, screen/power control, filesystem watches — the Hammerspoon territory, with a facade that even loads an unmodified `~/.hammerspoon/init.lua`. See [Writing extensions](extensions.md).\n\n---\n\n## Menu bar \u0026 Settings\n\nProsper lives in the notification tray: toggle completions globally or per-app, switch completion length, open the runner/clipboard, check for updates, quit.\n\nA full **Settings** window (`⌥\\`) covers General / Shortcuts / QuickLinks / QuickDirs / Extensions / Agent / Completions / Context / Apps / Personalization / Statistics / About — per-app enable lists, Disable-Tab list, model selector, custom AI instructions, hotkey rebinding, and usage stats.\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"960\" height=\"724\" alt=\"prosper-demo-system\" src=\"https://github.com/user-attachments/assets/e61519a5-1cc9-4452-ab09-aa7de9580adc\" /\u003e\u003c/p\u003e\n\n---\n\n## On-device personalization *(opt-in)*\n\nWith personalization on, Prosper records your **accepted** completions to a local, encrypted-at-rest store (off by default; **Delete All** any time). From those it can train a per-user **LoRA adapter** on-device — the model learns *your* phrasing without anything leaving your Mac. Everything here is opt-in and stays local. Per-app behavior (force-enable accessibility for Electron/Chromium apps, caret-mirror fallback, custom instructions) is configurable in **Settings → Apps**.\n\n---\n\n## Permissions\n\nInline autocomplete needs one macOS privacy permission, requested when you enable the feature:\n\n- **Accessibility** — drives the global keystroke tap: watch keys, read the focused field / caret, and insert accepted suggestions. The tap is an active session event tap, so Accessibility alone authorizes it — Input Monitoring (the listen-only HID grant) is not used.\n\nGrant in **System Settings → Privacy \u0026 Security**. Settings → Context links straight to the pane and shows a live status check. (Screen Recording is needed only for screenshot / OCR context.)\n\n---\n\n## First launch\n\nProsper is **Developer ID-signed and notarized by Apple**, so it opens normally — no Gatekeeper workaround, no \"unidentified developer\" dialog. Install via Homebrew, or download the `.zip` from the [latest release](https://github.com/ventsislav-georgiev/prosper/releases/latest), unzip, and drag `Prosper.app` to `/Applications`.\n\n---\n\n## Updates\n\nProsper auto-updates via [Sparkle](https://sparkle-project.org) straight from GitHub Releases — use **Check for Updates** in the menu, or update via `brew` (the cask sets `auto_updates true`, so both coexist).\n\n---\n\n## Support Prosper\n\nProsper is **free, and stays free** — every feature, no paywalls, no subscription. If it earns a place in your workflow and you'd like to chip in, there's an optional, pay-what-you-want supporter option in **Settings → Account** (think *buy me a coffee*). Entirely optional; nothing is gated behind it.\n\nOptionally sign in (passwordless) to sync your settings across Macs — also free, and **end-to-end encrypted with a key that never leaves your devices**. The server stores only ciphertext; no one (not even us) can read your settings.\n\n---\n\n## Limitations\n\n- **Ghost text** renders in a floating overlay at the caret — macOS forbids drawing inside another app's text view. Accepting inserts via synthesized keystrokes / Accessibility.\n- Quality/latency track the model: E2B is fast and light; E4B is better but slower.\n- First launch downloads the model (~8.9 GB for the default E4B QAT 8-bit; smaller variants from ~4.3 GB) to the HuggingFace Hub cache at `~/.config/prosper/hf`; later launches are instant. (An existing `~/Documents/huggingface` cache from older builds is migrated there automatically on first run.)\n\n---\n\n## Privacy\n\nAll inference — including optional LoRA fine-tuning — is local and in-process. Personalization data (accepted completions) is stored on-device in an encrypted-at-rest database and never transmitted. Outbound network is limited to (1) the one-time model download on first launch, (2) at most one currency-rate fetch per day (only if you use the currency command), cached locally, (3) anonymous usage analytics (see below), and (4) — *only if you choose to sign in* — passwordless account and optional settings sync (end-to-end encrypted with an on-device key; the server only ever sees ciphertext). No typed text ever leaves your machine.\n\n### Anonymous usage analytics\n\nProsper sends anonymous usage analytics once a day to help prioritize what to improve. It is **on by default and opt-out** — turn it off any time in **Settings → Analytics**, which also shows the *exact* payload that will be sent.\n\nWhat's collected is strictly **counters and on/off flags** — never personal data:\n\n- A random anonymous id (generated on-device, unlinkable to you or your data).\n- App version, OS, locale, and the AI model ids you run.\n- Per-feature usage **counts** for built-in extensions (e.g. how many times the calculator ran).\n- **Counts only** of things you've customized — user extensions, MCP servers, hooks, commands, agents, quicklinks, shortcuts, plugins, per-app rules, etc.\n- Settings state as booleans (enabled/disabled).\n\nIt **never** sends typed text, completion contents, your name, custom prompts/instructions, file paths, links, app/domain names, or any free text — only the counts and flags above. Data goes to [Aptabase](https://aptabase.com) (EU region).\n\n---\n\n## Extending Prosper\n\nProsper is free and open source. Extend it without touching the core: write **Lua extensions** (no recompile) — see [extensions.md](extensions.md) — or bring your own **MCP servers**, **agent lifecycle hooks**, and **JS/TS plugins** (see [Coding agent](#coding-agent)). Or build from source — `app/` (Swift) and `server/` (Cloudflare Worker) live in this repo.\n\n---\n\n## License\n\nProsper is **free and open source**, licensed under the **GNU General Public License v3.0** — see [LICENSE](LICENSE). You're free to use, study, modify, and redistribute it; derivative works must also be GPLv3. Every feature is free; [supporting](#support-prosper) the project is optional.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fventsislav-georgiev%2Fprosper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fventsislav-georgiev%2Fprosper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fventsislav-georgiev%2Fprosper/lists"}