Vibe coding level:

You don't think of yourself as a "builder" but you'd like to become one. You want to move from "just talking in meetings" to actually building real software. The terminal is a terrifying black box.

Prompt history and search

Every prompt you send in Sparkle is remembered, across every project and every agent, and all of it is searchable. Two features ride on top of that memory: a full-text history search that can scroll the terminal straight to the exact prompt you sent, and ghost-text autocomplete that finishes your past prompts as you type (press Tab to accept). Your shell has a faint version of this (the up-arrow). Sparkle's is a different animal.

How it works

The Composer records every prompt you submit. The recent list lives locally for instant prefix-matching, and the full archive is written to a local SQLite database with an FTS5 full-text index, so search is fast and works across all your projects, not just the agent in front of you.

Think of it like the search bar in your messaging app, but for everything you have ever asked Sparkle to build. When you send a prompt (the plain-English request you type into the box at the bottom, the Composer), Sparkle quietly saves it. Later, a little search box lets you type a few words you remember ("the login bug," "rename the button") and Sparkle finds the matching prompt, even if you sent it last week in a totally different project. Click a result and Sparkle scrolls the terminal right to where that prompt happened, so you can see what the agent did with it. Nothing to set up. It just remembers.

Two surfaces. First, a sidebar search dropdown: type a query, get back past prompts with the matched words highlighted in a snippet, hit one, and Sparkle scrolls the terminal to that prompt's marker so you land on the exact moment in context. Second, the inline ghost completion in the Composer (see below). Search is cross-project and full-text, so "that thing I told the other agent to do on Tuesday" is a query, not a memory game. The latest prompt also stays pinned as a header so you never lose the thread of what you most recently asked for.

Capture path: the Composer records each submitted prompt into a global newest-first list (deduped, most-recent-wins, bounded at 500 entries for the prefix-match cache) and persists the durable copy to a local SQLite DB. Search runs against an FTS5 virtual table mirroring the entries, using snippet() to wrap hits in match markers; the query is tokenized and each term quoted, so arbitrary punctuation can never be parsed as FTS5 syntax. The DB lives in the app-data dir, outside any worktree, so it never shows up in git status. A hit carries the entry id, which correlates to a terminal marker so selecting a result scrolls the PTY view to the originating prompt. Capture is camelCase across the Tauri boundary; the frontend supplies the id and created_at, Rust only stores and prunes by an absolute cutoff.

Ghost-text autocomplete

As you type in the Composer, Sparkle suggests the rest of your most recent matching past prompt in muted ghost text. Press Tab or the right-arrow to accept the whole suggestion. Esc dismisses it. It only fires when the caret is at the very end of the text, so it never fights you while you edit mid-line.

You know how your phone suggests the next word as you text? This is that, but the suggestion is your own past request. Start typing "fix the" and if you once sent "fix the alignment on the header," Sparkle shows the rest in a faded gray. Like what you see? Tap Tab and it fills in. Do not like it? Just keep typing, or press Esc to wave it away. You are never forced to take it. It is there to save you from re-typing the same instruction you have given before.

This is the typing tax killer for repeated work. The completion is the suffix of your most recent past prompt that starts with what you have typed (case-insensitive, your casing preserved), so the more consistent your phrasing, the more it finishes itself. Tab or right-arrow accepts, Esc dismisses, and it stays out of your way while a model dictation interim is streaming or while your caret is mid-line. Build a habit of clean, reusable prompt phrasing and you will accept-complete most of your routine instructions in one keystroke.

computeGhost(value, history) walks the global history newest-first and returns the first entry that is longer than the input and whose lowercased form starts with the lowercased input, sliced by length so the visible suffix keeps the stored prompt's own casing. Render is gated on caret-at-end and not-dismissed and not-mid-dictation. Right-arrow or Tab (not Shift+Tab, which stays free for reverse focus traversal) accepts; Esc dismisses without clearing the input so Tab can move focus. IME composition is respected, so a candidate-committing keystroke is not hijacked into an accept. It is prefix completion, not fuzzy search; deterministic and local.

Why it matters

Everything you have ever asked is findable and reusable, which means you are never starting from a blank page. Forgot how you phrased a request that worked? Search for it and send it again. This is also the quiet superpower behind ghost-text: the more you build, the more Sparkle can finish your sentences, so building gets easier the longer you do it.

Your history is leverage. The prompts that worked are a personal playbook you can search and re-run, and the ones you type often complete themselves. Less re-typing, less "what did I say last time," more shipping. It compounds: a clean prompt you sent once becomes a one-keystroke completion forever.

Two real wins over scrollback grepping. One, search is cross-project and persistent, so it survives quitting the app and is not scoped to a single shell session. Two, hit-to-context: a search result is not just text, it is a pointer back to where the agent acted on it, which makes "what did I tell it and what did it do" a one-click round trip instead of an archaeology project. Ghost-text is the same data reused as input completion. One store, two ergonomic payoffs.

vs. the 1980s terminal

A shell gives you the up-arrow: a blunt, per-session, line-at-a-time recall of whole commands in the order you ran them. That is the whole feature.

In a regular terminal, the only "history" is pressing the up-arrow to walk backward through commands one at a time, and only for the current window. Close it and that history is mostly gone, and there is no way to search it by meaning or jump to where something happened. Sparkle's history is searchable, sticks around across projects, and can take you right back to the moment a prompt ran. It is the difference between a vague memory and a real, findable record.

Up-arrow is sequential, per-session, and line-oriented: you mash it until the command you want scrolls by. No search, no snippets, no cross-project reach, no jump-to-context. Sparkle's history is full-text searchable across every project, returns highlighted snippets, and scrolls you to the exact prompt. And ghost-text is prefix-aware inline completion rendered live as you type, not a backward walk through a flat list. Same intent (reuse what you already typed), categorically better tool.

Bash history is a flat per-session file walked with C-p/up or poked with C-r reverse-i-search; it is line-keyed, not indexed, and not project-aware. Sparkle keeps an FTS5 index over a durable cross-project store with snippet highlighting and a marker correlation back into the PTY scrollback, plus an inline prefix completion off the same data. You can keep your shell history too; this is the layer above it, where the prompts are the unit and "find the one I want" is a query, not a scroll.

Where to go next