PLUGINS Tab β
The plugin manager for Nothing Browser. Plugins are JavaScript files injected into every page at DocumentCreation β the earliest possible injection point, before any page code runs.
Overview β
| Sub-Tab | Purpose |
|---|---|
| INSTALLED | Manage your installed plugins |
| COMMUNITY | Browse and install from the registry |
INSTALLED Sub-Tab β
Shows all installed plugins with:
- Name, author, version
- Enable / Disable toggle
- Uninstall button
- Description and how-to-use text
Install from Local Folder β
Click + FROM FOLDER to install a plugin from a local directory containing:
my-plugin/
βββ manifest.json
βββ content.jsManaging Plugins β
| Action | How To |
|---|---|
| Enable/Disable | Click the toggle button |
| Uninstall | Click UNINSTALL |
| View details | Select the plugin from the list |
Note: If a plugin has requires_restart: true in its manifest, you need to restart the browser for the change to take effect.
COMMUNITY Sub-Tab β
Loads the community plugin registry from:
github.com/ernest-tech-house-co-operation/nothing-browser-pluginsBrowse and Install β
- Click βΊ REFRESH to fetch the latest plugin list
- Browse available plugins
- Select any plugin to see its details
- Click β INSTALL to install it directly
Already-installed plugins are shown with an [INSTALLED] label.
Plugin Structure β
Directory Layout β
my-plugin/
βββ manifest.json
βββ content.jsmanifest.json β
{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "What does this plugin do?",
"author": "Your Name",
"how_to_use": "Navigate to any page and the plugin runs automatically.",
"requires_restart": false,
"enabled": true,
"permissions": ["network", "storage"]
}Manifest Fields β
| Field | Required | Description |
|---|---|---|
id | β Yes | Unique identifier (no spaces) |
name | β Yes | Display name |
version | β Yes | Semantic version |
description | β Yes | Short description |
author | β No | Your name/handle |
how_to_use | β No | Instructions for users |
requires_restart | β No | true if browser restart needed |
enabled | β No | Default enabled state |
permissions | β No | Requested permissions |
content.js β
Plain JavaScript. Runs in the page's main world context on every page load.
(function() {
'use strict';
// Prevent double initialization
if (window.__MY_PLUGIN_INIT__) return;
window.__MY_PLUGIN_INIT__ = true;
// Your code here β runs before any page JS
console.log('[MyPlugin] loaded');
// Example: Modify page behavior
document.addEventListener('DOMContentLoaded', () => {
// Page is ready
});
})();Writing a Plugin β
Step 1: Create Folder β
mkdir my-awesome-plugin
cd my-awesome-pluginStep 2: Create manifest.json β
{
"id": "awesome-plugin",
"name": "Awesome Plugin",
"version": "1.0.0",
"description": "Makes browsing awesome",
"author": "Your Name",
"how_to_use": "Installed and ready to go",
"requires_restart": false,
"enabled": true
}Step 3: Create content.js β
(function() {
'use strict';
if (window.__AWESOME_PLUGIN_INIT__) return;
window.__AWESOME_PLUGIN_INIT__ = true;
// Remove annoying popups
const style = document.createElement('style');
style.textContent = `
.popup, .modal, .newsletter-signup {
display: none !important;
}
`;
document.head.appendChild(style);
console.log('[AwesomePlugin] Active on', window.location.hostname);
})();Step 4: Install β
- From folder: PLUGINS β INSTALLED β + FROM FOLDER β select
my-awesome-plugin - To publish: Submit PR to community registry
Example Plugins β
Dark Mode Enforcer β
// content.js
(function() {
if (window.__DARK_MODE_INIT__) return;
window.__DARK_MODE_INIT__ = true;
const style = document.createElement('style');
style.textContent = `
html {
filter: invert(1) hue-rotate(180deg);
}
img, video {
filter: invert(1) hue-rotate(180deg);
}
`;
document.head.appendChild(style);
})();Auto Clicker β
// content.js
(function() {
if (window.__AUTO_CLICK_INIT__) return;
window.__AUTO_CLICK_INIT__ = true;
// Click all "Load More" buttons
setInterval(() => {
document.querySelectorAll('.load-more, #load-more, [data-action="load"]').forEach(btn => {
btn.click();
});
}, 3000);
})();Ad Remover β
// content.js
(function() {
if (window.__AD_REMOVER_INIT__) return;
window.__AD_REMOVER_INIT__ = true;
// Remove common ad elements
const selectors = [
'.ad',
'.advertisement',
'[class*="ad-"]',
'[id*="ad-"]',
'.sponsored'
];
const observer = new MutationObserver(() => {
selectors.forEach(selector => {
document.querySelectorAll(selector).forEach(el => el.remove());
});
});
observer.observe(document.body, { childList: true, subtree: true });
})();Permissions β
| Permission | What It Allows |
|---|---|
network | Intercept network requests |
storage | Access localStorage/sessionStorage |
tabs | Create/modify tabs |
notifications | Show browser notifications |
Request only the permissions you need.
Publishing to Community Registry β
- Fork nothing-browser-plugins
- Add your plugin folder to
plugins/ - Update
registry.jsonwith your plugin info - Submit a Pull Request
registry.json entry β
{
"id": "awesome-plugin",
"name": "Awesome Plugin",
"version": "1.0.0",
"description": "Makes browsing awesome",
"author": "Your Name",
"download_url": "https://github.com/your-username/awesome-plugin/archive/main.zip"
}Troubleshooting β
Plugin Not Loading β
- Check the plugin is ENABLED in INSTALLED tab
- Check
requires_restartβ restart the browser if needed - Open DevTools (F12) and look for console errors
Plugin Crashes β
- Disable the plugin
- Check
content.jsfor syntax errors - Test in isolation
Uninstalling β
Select the plugin and click UNINSTALL. The plugin folder is deleted from ~/.config/nothing-browser/plugins/.
Security Notes β
- β Plugins run in isolation (can't access your system)
- β Permissions system limits what plugins can do
- β οΈ Only install plugins from trusted sources
- β οΈ Review
content.jsbefore installing
Next Steps β
- DEVTOOLS Tab β Network capture and inspection
- BROWSER Tab β Core browsing features
- Session Management β Save and restore sessions
Nothing Ecosystem Β· Ernest Tech House Β· Kenya Β· 2026