Never lose what you typed.
A cross-browser extension that quietly remembers what you've typed into form fields, so an accidental Esc, a rogue keyboard shortcut, a refresh, or a tab close never destroys your draft again. Open the toolbar icon, find the input you lost, copy it back.
Built and maintained by one indie developer. If it saves you a painful retype, ☕ buy me a coffee — it keeps InputStash free and ad-free.
Scaffold only. No input-capture logic is wired up yet — the popup, content script, and background entrypoints are stubs with TODOs. The hard parts (catching input across <input>, <textarea>, contenteditable, shadow DOM, iframes, SPAs) are deliberately deferred to a follow-up.
browser.* polyfill..nvmrc is included)npm i -g pnpm)pnpm install
pnpm dev # launches Chrome with the extension auto-loaded
pnpm dev:firefox # same, in Firefox Developer Edition
pnpm build # → .output/chrome-mv3/
pnpm build:firefox # → .output/firefox-mv2/
pnpm zip # store-ready Chromium zip
pnpm zip:firefox # store-ready Firefox zip
After pnpm build, the unpacked extension lives in .output/chrome-mv3/ (or .output/firefox-mv2/ after pnpm build:firefox).
All four use the same flow — they're all Chromium under the hood.
chrome://extensions (or edge://extensions, opera://extensions, brave://extensions)..output/chrome-mv3/.about:debugging#/runtime/this-firefox..output/firefox-mv2/manifest.json.(Temporary add-ons are removed when Firefox restarts. For permanent local install, you'd need to sign through AMO.)
Deferred. Safari supports the WebExtension API but requires an Xcode wrapper for distribution. When ready, Apple's safari-web-extension-converter can wrap .output/chrome-mv3/ directly:
xcrun safari-web-extension-converter .output/chrome-mv3/
You'll need Xcode and an Apple Developer account to ship; for local testing you can enable unsigned extensions under Safari → Settings → Advanced → Develop menu → Allow unsigned extensions.
pnpm compile
Runs svelte-check followed by tsc --noEmit.
.
├── wxt.config.ts # manifest, permissions, browser targets
├── tsconfig.json
├── entrypoints/
│ ├── background.ts # MV3 service worker — TODO
│ ├── content.ts # injected into all frames — TODO
│ └── popup/
│ ├── index.html
│ ├── main.ts
│ ├── App.svelte
│ └── app.css
├── components/
│ ├── storage.ts # thin wrapper around browser.storage.local — TODO
│ └── types.ts # StashEntry
└── public/
└── icon/ # placeholder icons — replace with real artwork
The interesting work is still ahead. Rough order:
input and change listeners on <input> and <textarea>, debounced per element, with a stable per-field identity (form name + field name + index fallback).contenteditable — the rich-text editors that power Gmail, Notion, Slack, etc. Listen on input events of editable elements; serialize as text (and optionally HTML).MutationObserver events.MutationObserver so dynamically-mounted inputs get captured too.<input type="password">, fields with sensitive autocomplete tokens (cc-number, one-time-code, etc.), or content on origins the user has opted out.browser.storage.local, capped at N entries per origin, dedupe consecutive snapshots, age out old entries.safari-web-extension-converter, address any WebKit-specific quirks.InputStash is a solo indie effort — no company, no investors, no ads, no analytics. Every snapshot stays on your device.
If it earned its place in your toolbar, the easiest way to help is to chip in a coffee:
Other ways to help that cost nothing:
MIT © Nikita R