```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
}
]
}
```