```json { // === REQUIRED KEYS === "manifest_version": 3, // This MUST be set to 3 for modern extensions. Manifest V2 is deprecated and V1 is no longer supported. "name": "Tab Context Grouper", // This is the full name of your extension as it appears in the Chrome Web Store and Extensions page. // Maximum length is 75 characters. Choose something descriptive but concise. // Example alternative: "Website Context Analyzer and Tab Grouper" "version": "1.0.0", // Version number in semantic versioning format (major.minor.patch). // major: breaking changes, minor: new features, patch: bug fixes // Must be string, not number. Chrome uses this to determine when to update. // Example alternatives: "0.1.0" for early beta, "2.4.1" for established extension with updates // === CHROME WEB STORE REQUIRED KEYS === "description": "Groups tabs into different contexts based on website content", // Description visible in Chrome Web Store and Extensions page // Maximum 132 characters // Should clearly explain what your extension does // Example alternative: "Automatically organizes browser tabs into groups based on content analysis and keyword detection" "icons": { // Dictionary of icon sizes that represent your extension in various contexts "16": "icons/icon16.png", // 16x16 pixels: Used for extension favicon and context menus // Must be a relative path from the extension's root directory // PNG format recommended for transparency support "48": "icons/icon48.png", // 48x48 pixels: Used on the extensions management page (chrome://extensions) // Same format requirements as the 16px icon "128": "icons/icon128.png" // 128x128 pixels: Used in the Chrome Web Store // Higher resolution for your store listing // Same format requirements as other icons }, // === OPTIONAL KEYS (WITH COMPLETE EXPLANATIONS) === "action": { // Defines the browser action toolbar button behavior // In Manifest V3, "action" replaces "browser_action" from V2 // Omit this key if you don't want a toolbar button "default_popup": "popup.html", // HTML file shown when button is clicked // Path is relative to extension root // This file contains your popup UI // Example alternative: "pages/popup.html" for different directory structure "default_icon": { // Icons at different resolutions for the toolbar button // Multiple sizes support different display densities "16": "icons/action16.png", // 16x16 pixels for normal displays // Path relative to extension root "32": "icons/action32.png" // 32x32 pixels for high-density displays // Path relative to extension root // You could add more sizes like 24, 48 for different scales }, "default_title": "Tab Context Grouper" // Tooltip text when hovering over the toolbar button // Should be brief but descriptive // Example alternative: "Analyze and Group Tabs by Context" }, "author": "[email protected]", // Email address of the extension's creator // Not visible to users, but useful for Chrome Web Store // Must be a valid email address // Example alternative: "[email protected]" "background": { // Defines the extension's event handler background script // In Manifest V3, this must use a service worker (not persistent) "service_worker": "background.js" // Single JavaScript file that runs as a service worker // Path is relative to extension root // This script handles events when extension isn't active // Note: Service workers are terminated when not in use // Example alternative: "scripts/background.js" for different directory structure }, "chrome_settings_overrides": { // Allows extension to override specific Chrome settings // Requires appropriate permissions // All fields are optional but at least one must be included "homepage": "https://www.example.com", // URL that overrides Chrome's homepage setting // Must be a fully qualified URL with protocol // Example alternative: "https://your-custom-page.com" "search_provider": { // Configures a custom search engine // All fields are required for search provider "name": "Example Search", // Display name of the search engine // Appears in Chrome's search engine settings // Example alternative: "Context Search" "keyword": "example", // Keyword to trigger this search in omnibox // User types this keyword, then space, then search terms // Example alternative: "ctx" for a shorter keyword "search_url": "https://www.example.com/search?q={searchTerms}", // URL template for searches // {searchTerms} is replaced with the user's search query // Must include the {searchTerms} parameter // Example alternative: "https://your-api.com/search?query={searchTerms}" "favicon_url": "https://www.example.com/favicon.ico", // URL to the search engine's favicon // Should be a 16x16 or 32x32 icon // Example alternative: "https://your-site.com/icon.png" "is_default": true // Whether this should be the default search engine // true = make this the default, false = don't change default // Usage note: Users must explicitly approve a default search engine change }, "startup_pages": ["https://www.example.com/welcome"] // Array of URLs to open when browser starts // Each must be a fully qualified URL // Example alternative: ["https://your-dashboard.com", "https://your-news.com"] }, "chrome_url_overrides": { // Replaces default Chrome pages with custom HTML // Can only specify one of these three options "newtab": "newtab.html" // HTML file to replace Chrome's New Tab page // Path is relative to extension root // Example alternative: "pages/custom-tab.html" // Other possible values (choose only one): // "bookmarks": "bookmarks.html" // Replace the bookmarks page // "history": "history.html" // Replace the history page }, "commands": { // Defines keyboard shortcuts for extension actions // Each command has a unique name as its key "_execute_action": { // Special command to open the action popup // This is a reserved name that triggers the default action "suggested_key": { // Recommended keyboard shortcuts // You can specify different keys for different platforms "default": "Ctrl+Shift+Y", // Default shortcut for Windows/Linux/ChromeOS // Format: modifier+modifier+key // Modifiers: Ctrl, Alt, Shift, Command // Example alternative: "Ctrl+Shift+G" "mac": "Command+Shift+Y" // Mac-specific override // Uses Command instead of Ctrl // Example alternative: "Command+Shift+G" }, "description": "Open the Tab Grouper popup" // Human-readable description // Shown in Chrome's keyboard shortcuts page // Example alternative: "Show Tab Grouper interface" }, "analyze-tabs": { // Custom command name (you define this) // Will be available to your extension via the commands API // Example alternative: "group-all-tabs" "suggested_key": { // Recommended keyboard shortcuts "default": "Alt+Shift+T" // Default shortcut for all platforms // Format: modifier+modifier+key // Example alternative: "Alt+Shift+G" }, "description": "Analyze and group tabs" // Human-readable description // Shown in Chrome's keyboard shortcuts page // Example alternative: "Organize all open tabs" } }, "content_scripts": [ // Array of scripts to inject into web pages // These run in the context of matched web pages // Used for analyzing page content and modifying pages { "matches": ["*://*.example.com/*", "https://*.google.com/*"], // URL patterns where script runs // Uses match patterns: [scheme]://[host]/[path] // * is wildcard, can match multiple characters // Example alternative: ["<all_urls>"] to run on all sites "css": ["styles/content.css"], // CSS files to inject into matched pages // Array of relative paths from extension root // Applied in order listed // Example alternative: ["css/analyzer.css", "css/theme.css"] "js": ["scripts/content.js"], // JavaScript files to inject into matched pages // Array of relative paths from extension root // Executed in order listed // Example alternative: ["js/analyzer.js", "js/ui.js"] "run_at": "document_idle", // When to inject the scripts // "document_idle": after page has loaded (default) // "document_start": before any DOM is constructed // "document_end": after DOM is loaded, before subresources // Example alternative: "document_start" to run before page loads "all_frames": false, // Whether to inject into all frames // false: only inject into top-level frame (default) // true: inject into all frames including iframes // Example alternative: true if you need to analyze iframe content "match_about_blank": false // Whether to inject into about:blank frames // false: don't inject into about:blank frames (default) // true: inject into frames with about:blank source // Useful for dynamically created frames }, { // Second content script configuration for different sites "matches": ["https://*.github.com/*"], // GitHub-specific URL pattern // Allows different scripts for different sites // Example alternative: ["https://*.stackoverflow.com/*"] "js": ["scripts/github-analyzer.js"] // GitHub-specific JavaScript // Different script for this site // Example alternative: ["scripts/stackoverflow-analyzer.js"] } ], "content_security_policy": { // Security policy restrictions for your extension // In Manifest V3, this is an object with contexts "extension_pages": "script-src 'self'; object-src 'self'" // CSP for extension pages // Restricts what scripts can run in extension pages // 'self': only scripts from extension package // Example alternative: "script-src 'self' https://apis.google.com; object-src 'self'" }, "cross_origin_embedder_policy": { // Controls cross-origin embedding // Enables Site Isolation features "value": "require-corp" // Requires resources to explicitly grant permission // "require-corp": resources must opt-in to being loaded // "credentialless": loads resources without credentials // Example alternative: "credentialless" }, "cross_origin_opener_policy": { // Controls cross-origin window interactions // Enables extra isolation "value": "same-origin" // Restricts which windows can interact with extension // "same-origin": only same-origin windows // "same-origin-allow-popups": allows popups // "unsafe-none": allows cross-origin windows // Example alternative: "same-origin-allow-popups" }, "declarative_net_request": { // Rules for network request modification // Allows blocking/redirecting requests without host permissions "rule_resources": [{ // Array of rule set resources // Each item defines a set of rules "id": "ruleset_1", // Unique identifier for this rule set // Used in API calls to enable/disable // Example alternative: "trackers_blocking" "enabled": true, // Whether this rule set is enabled by default // true: rules apply when extension installs // false: rules must be enabled programmatically // Example alternative: false if you want user control "path": "rules/rules_1.json" // Path to JSON file containing rules // Relative to extension root // Example alternative: "data/blocking_rules.json" }] }, "default_locale": "en", // Base language for internationalization // Must correspond to a directory in _locales/ // Required if you use internationalized strings // Example alternative: "fr" for French as base language "devtools_page": "devtools.html", // HTML page that adds features to Chrome DevTools // Relative path from extension root // Loaded when DevTools is opened // Example alternative: "pages/dev-panel.html" "export": { // Resources that other extensions can import // Allows extensions to share code/assets "allowlist": [ // Array of exportable resources // Paths are relative to extension root "shared/utils.js", // JavaScript utility functions to share // Can be imported by other extensions // Example alternative: "lib/helpers.js" "shared/styles.css" // CSS styles to share // Can be imported by other extensions // Example alternative: "assets/common.css" ] }, "externally_connectable": { // Defines what can connect to this extension // Controls messaging security "ids": [ // Array of extension IDs that can connect // These extensions can use chrome.runtime.connect/sendMessage "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // Specific extension ID (32 character string) // Format: 32 lowercase letters or numbers // Example alternative: "abcdefghijklmnopqrstuvwxyz123456" "*" // Wildcard that allows all extensions from same developer // Chrome Web Store enforces this developer check // Alternative: remove this for more restrictive permissions ], "matches": [ // Array of web page URL patterns that can connect // These sites can use chrome.runtime.connect/sendMessage "https://*.example.com/*" // URL pattern with wildcards // Same format as content script matches // Example alternative: "https://your-main-site.com/*" ], "accepts_tls_channel_id": false // Whether to send TLS channel ID to connecting sites // false: don't send ID (default, more private) // true: send channel ID (allows stronger authentication) // Example alternative: true if you need secure identification }, "homepage_url": "https://www.example.com/tab-grouper", // URL to extension's homepage // Shown as a link in extension management page // Must be a full URL including protocol // Example alternative: "https://github.com/yourusername/tab-grouper" "host_permissions": [ // Array of URL patterns extension can access // Needed for cross-origin XMLHttpRequest or fetch "https://*.example.com/*", // URL pattern with protocol, host, path // Same format as content script matches // Example alternative: "https://api.yourservice.com/*" "https://api.example.org/v1/*" // More specific API endpoint access // Grants permission to all URLs matching this pattern // Example alternative: "https://*.github.com/api/*" ], "import": { // Resources to import from other extensions // Must be paired with export in source extension "id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // Extension ID to import from // Format: 32 character string // Must match a published extension // Example alternative: "bcdefghijklmnopqrstuvwxyz123456" "minimum_version": "1.0" // Required minimum version of source extension // Uses semantic versioning format // Example alternative: "2.4.1" for a specific minimum version }, "incognito": "spanning", // How extension behaves in incognito mode // Three possible values: // "spanning": single shared instance for normal & incognito (default) // "split": separate instances for normal & incognito // "not_allowed": extension doesn't run in incognito // Example alternative: "split" for privacy-focused extension "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...", // Developer key for consistent ID // Base64-encoded public key // Used during development to keep same ID // Typically generated by Chrome when you first load an unpacked extension // Example: A different long base64 string "minimum_chrome_version": "88", // Oldest Chrome version this works with // Can be major version only (e.g., "88") // Can include minor version (e.g., "88.0.4300.0") // Example alternative: "95" for newer API features "oauth2": { // OAuth 2.0 configuration for API access // Required for Google API access via OAuth "client_id": "your-client-id.apps.googleusercontent.com", // OAuth client ID // Get from Google API Console // Must be registered for your extension // Example: A different client ID string "scopes": [ // Array of API scopes to request // Each string defines access to specific API functions "https://www.googleapis.com/auth/userinfo.email", // Access to user's email // Used for user identification // Example alternative: "https://www.googleapis.com/auth/userinfo.profile" "https://www.googleapis.com/auth/drive.readonly" // Read-only access to Google Drive // Allows reading files but not writing // Example alternative: "https://www.googleapis.com/auth/calendar" ] }, "omnibox": { // Address bar keyword integration // Allows activation via the address bar "keyword": "tab" // Keyword that activates in address bar // User types this, then space, to activate // Example alternative: "group" for a different activation word }, "optional_host_permissions": [ // URLs that extension can request access to at runtime // Not granted automatically at install "https://*.github.com/*" // URL pattern with protocol, host, path // Same format as host_permissions // Example alternative: "https://*.twitter.com/*" ], "optional_permissions": [ // Permissions that can be requested at runtime // Not granted automatically at install "bookmarks", // Access to read/modify bookmarks // Reference: https://developer.chrome.com/docs/extensions/reference/bookmarks/ // Example alternative: "history" for browsing history access "cookies" // Access to read/modify cookies // Reference: https://developer.chrome.com/docs/extensions/reference/cookies/ // Example alternative: "downloads" for download management ], "options_page": "options.html", // Full-page options (older style) // Opens in its own tab // Path relative to extension root // Example alternative: "pages/settings.html" "options_ui": { // Modern embedded options interface // Recommended over options_page "page": "options.html", // HTML page with options UI // Path relative to extension root // Example alternative: "settings/options.html" "open_in_tab": false // Whether to open in a tab or embedded panel // false: embedded in extensions page (recommended) // true: opens in a full tab // Example alternative: true for complex configuration UI }, "permissions": [ // Array of permissions required by extension // Requested at install time "tabs", // Access to query, create, modify tabs // Can get info about page titles, URLs, etc. // Reference: https://developer.chrome.com/docs/extensions/reference/tabs/ "tabGroups", // Access to create and manage tab groups // Required for grouping tabs together // Reference: https://developer.chrome.com/docs/extensions/reference/tabGroups/ "storage", // Persistent storage for extension data // More flexible than localStorage // Reference: https://developer.chrome.com/docs/extensions/reference/storage/ "activeTab", // Access to current active tab only // Less invasive than full tabs permission // Grants temporary access when user invokes extension "notifications" // Ability to display system notifications // Reference: https://developer.chrome.com/docs/extensions/reference/notifications/ // Example alternative: "contextMenus" for right-click menu items ], "requirements": { // Technologies required by the extension // Chrome won't install if requirements aren't met "3D": { // 3D graphics requirements // Only include if you need 3D capabilities "features": ["webgl"] // WebGL support required // Chrome must support WebGL for installation // Example alternative: ["webgl2"] for WebGL 2.0 support } }, "sandbox": { // Sandbox configuration for untrusted code // Runs pages with reduced privileges "pages": [ "sandbox.html" // Pages that run in a restricted sandbox environment // Path relative to extension root // Example alternative: "sandbox/untrusted.html" ] }, "short_name": "TabGrouper", // Shortened name for space-constrained contexts // Maximum 12 characters // Used when full name won't fit // Example alternative: "TContext" for even shorter "side_panel": { // Configuration for a side panel // Chrome 114+ feature for sidebar UI "default_path": "sidepanel.html" // HTML file to show in the side panel // Path relative to extension root // Example alternative: "panels/side.html" }, "storage": { // Managed storage schema for enterprise settings // For admin-controlled extension settings "managed_schema": "schema.json" // JSON Schema defining managed settings // Path relative to extension root // Format follows JSON Schema specification // Example alternative: "config/managed_schema.json" }, "tts_engine": { // Text-to-speech engine configuration // Registers extension as a speech engine "voices": [ // Array of voice configurations // Each object defines a single voice { "voice_name": "Alice", // Human-readable name for the voice // Displayed in TTS settings // Example alternative: "Bob" for a different voice "lang": "en-US", // Language code for this voice // Format: ISO 639-1 language code + ISO 3166-1 country code // Example alternative: "fr-FR" for French "gender": "female", // Gender of the voice // "female" or "male" // Example alternative: "male" "event_types": ["start", "end", "error"] // Events this voice reports // "start": beginning of speech // "end": completion of speech // "error": speech synthesis error // "word": word boundaries (not included here) // "sentence": sentence boundaries (not included here) } ] }, "update_url": "https://example.com/updates.xml", // URL for update manifest // For self-hosted extensions (not Web Store) // XML file defining updates // Example alternative: "https://your-server.com/extension-updates.xml" "version_name": "1.0 Beta", // User-friendly version string // Displayed instead of version number // Can include labels like "alpha", "beta", etc. // Example alternative: "2.0 Release Candidate" "web_accessible_resources": [ // Resources that web pages can access // In Manifest V3, must specify sites that can access { "resources": [ // Array of resource paths // Can use wildcards for file patterns "images/*.png", // All PNG images in images directory // Accessible via chrome-extension:// URLs // Example alternative: "assets/icons/*.png" "fonts/*.woff2" // All WOFF2 font files in fonts directory // Accessible via chrome-extension:// URLs // Example alternative: "styles/fonts/*.ttf" ], "matches": [ // Sites that can access these resources // Same URL pattern format as content scripts "https://*.example.com/*" // Example site that can access resources // Can use wildcards for subdomains // Example alternative: "https://your-app.com/*" ] } ], // === CHROMEOS-SPECIFIC KEYS === // These only apply when extension runs on ChromeOS "file_browser_handlers": [ // Context menu handlers for ChromeOS file browser // Adds actions to right-click menu in Files app { "id": "analyze", // Unique identifier for this handler // Used in API calls // Example alternative: "process-html" "default_title": "Analyze with Tab Grouper", // Menu item text // Displayed in context menu // Example alternative: "Extract Keywords" "file_filters": [ // File types this handler applies to // Array of file type patterns "filesystem:*.html", // HTML files in File System API // Format: filesystem:[type]:[pattern] // Example alternative: "filesystem:*.txt" "filesystem:*.htm" // Alternative HTML extension // Format: filesystem:[type]:[pattern] // Example alternative: "filesystem:*.md" ] } ], "file_handlers": [ // File type handlers for ChromeOS // Registers app to handle specific file types { "action": "/open-tab-group.html", // Page to handle the file // Path relative to extension root // Example alternative: "/handlers/document-viewer.html" "name": "Open Tab Group", // Display name for this handler // Shown in "Open with" menu // Example alternative: "View as Context" "accept": { // Dictionary of MIME types and extensions // Maps content types to file extensions "text/html": [".html", ".htm"], // HTML MIME type // Array of file extensions // Example alternative: "text/markdown": [".md", ".markdown"] "application/json": [".json"] // JSON MIME type // Array of file extensions // Example alternative: "text/csv": [".csv"] } } ], "file_system_provider_capabilities": { // File system provider for ChromeOS // Allows creating virtual file systems "configurable": true, // Whether file system is configurable // true: users can configure via UI // false: fixed configuration // Example alternative: false for a fixed remote file system "multiple_mounts": true, // Whether multiple instances can be mounted // true: can mount multiple instances // false: only one instance allowed // Example alternative: false for a single-instance provider "source": "network" // Source type of the file system // "network": files from network/internet // "file": files from local disk // "device": files from connected device // Example alternative: "device" for USB device file system }, "input_components": [ // Input methods for ChromeOS // Registers input method editors (IMEs) { "name": "Tab Grouper IME", // Display name for the input method // Shown in ChromeOS input method settings // Example alternative: "Context Analyzer Keyboard" "type": "ime", // Component type // "ime" for input method editors // Currently the only supported value "id": "tabgrouper", // Unique identifier for this component // Used in API calls // Example alternative: "contextanalyzer" "description": "Tab Grouper Input Method", // Detailed description // Shown in input method settings // Example alternative: "Analyzes typing context for suggestions" "language": "en-US", // Primary language supported // Format: ISO 639-1 language code + ISO 3166-1 country code // Example alternative: "zh-CN" for Simplified Chinese "layouts": ["us"] // Keyboard layouts supported // "us" for standard US layout // Also supports others like "dvorak", "colemak" // Example alternative: ["dvorak", "us"] to support multiple layouts } ] } ```