# OpenScript A lightweight, modern user script manager built for Chrome Manifest V3 using the native `chrome.userScripts` API. --- ## ⚡ Prerequisites To run user scripts in Chrome MV3: 1. Open `chrome://extensions` in your browser. 2. Click **Details** on the **OpenScript** extension card. 3. Enable the **"Allow User Scripts"** toggle. --- ## 📖 Writing Scripts Tutorial OpenScript uses standard Tampermonkey-compatible metadata headers with built-in secret injection. ### 1. The Metadata Block Every user script begins with a `// ==UserScript==` block that tells OpenScript when and where to run: ```javascript // ==UserScript== // @name GitHub Notification Cleaner // @version 1.0.0 // @description Hides read notifications automatically // @author YourName // @match https://github.com/* // @run-at document_idle // @grant none // ==/UserScript== (function() { 'use strict'; console.log('OpenScript running on GitHub!'); })(); ``` #### Supported Header Directives | Directive | Description | Example | | :--- | :--- | :--- | | `@name` | Script title shown in OpenScript popup list | `@name My Custom Tool` | | `@version` | Version badge displayed in popup list | `@version 1.2.0` | | `@description` | Summary shown under the script title | `@description Auto-clicks accept buttons` | | `@author` | Author metadata | `@author Alice` | | `@match` / `@include` | URL patterns where script runs (supports multiple) | `@match https://*.example.com/*` | | `@run-at` | Injection timing: `document_idle` (default), `document_start`, `document_end` | `@run-at document_start` | | `@grant` | Compatibility header (e.g. `none`) | `@grant none` | > **Note on `@match` normalization:** OpenScript automatically normalizes bare URLs (e.g., `github.com/*` becomes `*://github.com/*` and `https://github.com` becomes `https://github.com/*`). --- ### 2. Execution Timing (`@run-at`) Control when your script executes relative to page lifecycle: * **`document_idle` (Default):** Runs after the page DOM is fully built and subresources have finished loading. Best for DOM manipulation and button clicks. * **`document_start`:** Runs before any DOM elements are constructed or external page scripts execute. Best for early theme injection, ad/tracker blockers, or prototype overrides. * **`document_end`:** Runs right as the DOM content is parsed (`DOMContentLoaded`), before images and stylesheets finish loading. *(Both hyphenated `document-idle` and underscore `document_idle` formats are supported).* --- ### 3. Using Synced Secrets & Environment Variables OpenScript allows you to store sensitive API tokens or passwords in the **Secrets** tab. Secrets are synced across your devices via `chrome.storage.sync` and injected into every active user script. #### Accessing Secrets in Code You can read secrets using any of these 3 equivalent syntaxes: ```javascript // 1. Direct OpenScript namespace const token = OpenScript.env.GH_PAT; // 2. Shorthand env global const token = env.GH_PAT; // 3. Standard Tampermonkey GM_getValue polyfill const token = GM_getValue('GH_PAT', 'default_value'); ``` #### Complete Example: GitHub API Fetcher with Secrets ```javascript // ==UserScript== // @name GitHub Repo Stats // @version 1.0.0 // @description Fetches repository star count with personal token // @match https://github.com/* // @run-at document_idle // ==/UserScript== (async function() { 'use strict'; // Retrieve secret saved in OpenScript "Secrets" tab const token = env.GH_PAT; if (!token) { console.warn('[OpenScript] Please configure GH_PAT in OpenScript Secrets tab.'); return; } const [, owner, repo] = location.pathname.split('/'); if (!owner || !repo) return; const res = await fetch(`https://api.github.com/repos/${owner}/${repo}`, { headers: { Authorization: `Bearer ${token}` } }); const data = await res.json(); console.log(`[OpenScript] ${data.full_name} has ${data.stargazers_count} stars!`); })(); ``` --- ### 4. Boilerplate Template When you click **+ New** in the extension popup, OpenScript gives you this clean starter template: ```javascript // ==UserScript== // @name New Userscript // @version 1.0.0 // @description try to take over the world! // @author You // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // Access secrets via OpenScript.env or env: // console.log(OpenScript.env); })(); ``` --- ## 🛠️ Development & Building ```bash # Install dependencies npm install # Run Vite dev server npm run dev # Run unit tests npm test # Generate icons from master v2 logo npm run build:icons # Build and package Chrome Web Store zip npm run zip ``` --- ## 🔒 Privacy OpenScript does not track users, log data, or contact external servers. All user scripts are stored locally on your machine. See our [Privacy Policy](PRIVACY.md).