A lightweight Chromium extension (Manifest V3) that automatically fills login forms with per-site credentials. Built for local development and testing environments where you log into the same .test hosts over and over.
- Automatic detection and filling of
email/passwordfields - Per-host credentials — different logins for different sites
- Works with dynamically rendered forms via a
MutationObserver - Credentials sourced from environment variables at build time
- Zero runtime dependencies — plain JS bundled with webpack
- Popup UI for saving credentials on the fly
Works on all Chromium-based browsers:
- Google Chrome
- Microsoft Edge
- Brave
- Opera
- Vivaldi
background.jsseeds a per-host credential map intochrome.storage.syncon install.content.jsruns on matched pages, resolves the current host, looks up its credentials, and fills theemailandpasswordinputs.- A
MutationObserver(plus a fallback timeout) handles forms that load asynchronously. popup.html/popup.jsprovide a small settings form to update stored credentials.
Credential values come from a .env file at build time (via dotenv-webpack), so no secrets are hard-coded in the shipped bundle.
npm installCopy the example environment file and fill in your values:
cp .env.example .env# Default credentials
VITE_DEFAULT_EMAIL=your-default@email.com
VITE_DEFAULT_PASSWORD=your-password
# LibeSoft credentials
VITE_LIBESOFT_EMAIL=your-libesoft@email.com
VITE_LIBESOFT_PASSWORD=your-libesoft-passwordNever commit your real
.env. Only.env.example(with placeholders) belongs in version control.
npm run build # production build into dist/
npm run dev # development build with watch modeThe build outputs background.bundle.js, content.bundle.js, and popup.bundle.js into a dist/ folder, along with the copied manifest.json, popup.html, and icon.
- Open your browser's extension page:
- Chrome:
chrome://extensions/ - Edge:
edge://extensions/ - Brave:
brave://extensions/ - Opera:
opera://extensions/
- Chrome:
- Enable Developer mode (top-right toggle).
- Click Load unpacked and select the
dist/directory. - The extension icon appears in your toolbar.
The list of sites the extension runs on is defined in two places in manifest.json:
host_permissions— grants access to the listed hostscontent_scripts.matches— controls wherecontent.jsis injected
Per-host credential mappings live in background.js (seeded into storage) and config.js. To add a new site:
- Add the URL pattern to
host_permissionsandmatchesinmanifest.json. - Add a matching host entry to the credentials map in
background.js. - Rebuild (
npm run build) and reload the extension.
| Permission | Purpose |
|---|---|
activeTab |
Interact with the current tab |
storage |
Persist credentials via storage.sync |
scripting |
Inject the auto-fill logic |
├── manifest.json # MV3 extension manifest
├── background.js # Service worker — seeds credentials into storage
├── content.js # Detects and fills login forms
├── popup.html # Settings UI markup
├── popup.js # Settings UI logic
├── config.js # Host → credential mapping
├── webpack.config.js # Bundling + env injection + asset copy
├── package.json
├── .env.example # Environment variable template
└── dist/ # Build output (load this in the browser)
- Make changes in the root source files (
background.js,content.js,popup.js, etc.). - Run
npm run devto rebuild on save, ornpm run buildfor a one-off production build. - Reload the extension from your browser's extensions page to pick up the changes.
- Intended strictly for development and testing environments.
- Credentials are stored in the browser's
storage.sync. - Do not use with production or sensitive credentials.
- Only enable it on trusted local domains.
- Form not filling — confirm the site matches a pattern in
manifest.jsonand that the form uses standardemail/passwordinput selectors. - Wrong credentials — check the host key in
background.jsmatches the site's exacthost(including port). - Nothing loads — verify the extension is enabled and check the service worker / page console for errors.
- Dynamic forms — the
MutationObserverand 1s fallback should cover most cases; increase the timeout incontent.jsif a form renders very late.
Released under the MIT License.
Made with 🧠 by Libe.dev