tacitmacOS · menu bar · 0.1.0

it already knows.

Tacit reads the field your caret is sitting in — its label, its placeholder, the words around it — and pastes what belongs there.

Your clipboard history and saved snippets, arbitrated by a model that only gets consulted when the answer isn’t already obvious.

curl -fsSL https://tacit.grannis.xyz/install.sh | sh

macOS 14+. Installs to ~/Applications, no sudo. Not notarized yet — it’s signed locally, so treat it as a beta you’re choosing to trust.

SafariCheckout — Norton Supply Co.
Email
Shipping address
Billing address
City
ZIP code
Name on card
what Tacit reads
appSafari
urlshop.example.com/checkout
roleAXTextField
labelShipping address
placeholder"Street address"
nearbyDelivery · City · ZIP code

Click any field, then press V — the page intercepts it the way Tacit does.

how it decides

Every field asks the model. ⌘V never waits for it.

⌘V is the most-used shortcut on the machine. Taking it over is only defensible if the worst case is an ordinary paste — so declining is a first-class outcome here, not an error path.

The trick is when the model is asked. A round trip is 200–800 ms and ⌘V has to feel instant, so Tacit calls Jev when your caret lands in the field — typically seconds before you paste. By keystroke time the answer is already in memory, and the handler is a dictionary lookup.

refuse
Password fields. Refused before anything is extracted — not read, not ranked, not logged, not sent.
declines
ask
Everything else asks Jev the moment your caret lands. Not when you press ⌘V — seconds earlier. By paste time the answer is a dictionary lookup.
asks Jev · prefetched
race
Paste faster than the round trip? If the field is obvious — “Email”, one email stored — a local answer stands in provisionally. Jev overwrites it the moment it lands.
pastes · local, 0 ms
decline
No answer, no action. Call still in flight with no obvious local answer, confidence too low, or Jev said none of these belong. The keystroke passes through untouched.
declines
playground

Try it on a real form.

This runs the same ranking code the app runs — the Swift scorer ported line for line — and when a field escalates to tier 2, it makes a live call to jev-latest. The clipboard is seeded, not yours: a browser page can’t read your real history, which is rather the point of Tacit being a native app. Click into a field, press ⌘V, and watch which tier fires.

A labelled form. Every field asks Jev live — watch the confidence and the probability spread change with the field.

SafariCheckout — Norton Supply Co.
Email
Shipping address
Billing address
City
ZIP code
Name on card
what Tacit reads
Click a field to see it.

Click a field to begin.

install

One command, then forget it’s there.

curl -fsSL https://tacit.grannis.xyz/install.sh | sh
01

Grant Accessibility

Tacit needs to read field labels and watch for ⌘V. It asks on first launch and starts working the moment you flip the switch.

02

Save a few values

Address, email, phone. Name them the way a form would label the field — the name is a strong ranking signal, not a caption.

03

Press ⌘V

That’s it. There’s no second shortcut to learn and nothing to configure. When Tacit isn’t sure, you get a normal paste.