### DesktopReleases JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example JSON object for DesktopReleases, showing both stable and beta release information. ```json { "minimumVersion": "0.14.5", "latestVersion": "1.12.7", "downloadUrl": "...", "hash": "...", "signature": "...", "beta": { "minimumVersion": "0.14.5", "latestVersion": "1.13.0", "downloadUrl": "...", "hash": "...", "signature": "..." } } ``` -------------------------------- ### Example Plugin Statistics Analysis Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Provides an example analysis of download metrics for a specific plugin, showing version breakdowns and deriving insights. ```text Plugin: table-editor-obsidian Total downloads: 2,886,210 Version breakdown: - 0.22.1: 922,244 downloads (most popular, was recent) - 0.21.0: 403,089 downloads - 0.13.0: 70,744 downloads (old version still used) - 0.23.1: 102 downloads (very recent, few downloads yet) Insights: - Plugin is very popular overall - Users gradually migrate to new versions - Some users stay on old versions (compatibility/preferences) - Release 0.22.1 was widely adopted when current ``` -------------------------------- ### Obsidian Plugin Installation Workflow: Installation Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Outlines the final steps of installing a plugin. This includes downloading the necessary files (manifest.json, main.js, styles.css) from GitHub releases and storing them in the vault. ```text User clicks "Install" ↓ Obsidian fetches from GitHub releases: - manifest.json - main.js (the compiled plugin code) - styles.css (if available) ↓ Download tag: github.com/{repo}/releases/download/v{version}/ ↓ Verify hash (optional, good practice) ↓ Store in vault/.obsidian/plugins/{plugin-id}/ ↓ Plugin loads on next restart (or immediately if hot-reload enabled) ``` -------------------------------- ### ReleaseInfo JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example of a ReleaseInfo object as found in JSON configuration files. ```json { "minimumVersion": "0.14.5", "latestVersion": "1.12.7", "downloadUrl": "https://github.com/obsidianmd/obsidian-releases/releases/download/v1.12.7/obsidian-1.12.7.asar.gz", "hash": "dd008UydtVj7rRnoDwsgG8mAW1G3OINwJ34PkaOL2FA=", "signature": "cwtFXU3vTvuY3fNhfr9VCVDo0l/BZIjg1k7QAI5CxnRj53UJ3aLozUmsFgYFSp3JQjAJUWU0Rgx9mGfQ8iSzkU6bglgRsaX/Arr9TNdBXC7P9Kx45F/tbRIBIo6ORFhjFPF310wKCbN4Gbgg7Hrlm1TcD21nPxrJuwLWKE6xuAPMM1VrV5pCm53kUQyBlYJGVXY/4yMeg5d2il7xHIRkU7qWZssid5Q/sOUdCiJIyrkAZm7PtTGYWca1C3JUPYgq0vSm2g4BoDlh4nigyUJwPdJ+GnSaO+kbL+eYNDUL5bDlg8ml0NWYWlvtRntMsLhTzkxOtUfeb5IRPJ61u3Mr6g==" } ``` -------------------------------- ### Theme Installation Flow Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Details the steps involved when a user selects and installs a theme from the community browser. ```text User selects a theme ↓ Obsidian clones/downloads from GitHub repo ↓ Copy theme.css to vault/.obsidian/themes/{theme-name}/ ↓ Apply theme to UI ↓ If theme supports multiple modes, handle mode switching ``` -------------------------------- ### Plugin Manifest Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md An example of a plugin's manifest.json file, showing the 'id', 'version', and 'minAppVersion' fields. ```json { "id": "example-plugin", "name": "Example Plugin", "version": "2.0.0", "minAppVersion": "0.15.6" } ``` -------------------------------- ### Plugin Download Statistics Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Partial example of the JSON response for plugin download statistics. It includes version-specific and total download counts for plugins. ```json { "table-editor-obsidian": { "0.8.2": 3883, "0.8.1": 649, "0.8.0": 1762, "0.7.0": 5300, "downloads": 2886210, "0.22.1": 922244, "updated": 1778695852000 }, "obsidian-git": { "1.5.0": 8166, "1.4.0": 2110, "downloads": 2625413, "updated": 1614234853000 } } ``` -------------------------------- ### Plugin Versions Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md An example of a plugin's versions.json file, mapping plugin versions to their minimum required Obsidian versions. ```json { "2.0.0": "0.15.6", "1.5.0": "0.13.0", "1.0.0": "0.10.0" } ``` -------------------------------- ### Example Plugin ID Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md Provides examples of valid plugin IDs that can be used as keys in the deprecation file. ```string obsidian-reading-time ``` ```string templater-obsidian ``` ```string obsidian-checklist-plugin ``` ```string linked-data-vocabularies ``` -------------------------------- ### Example: Fetching Community Plugins Data Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/README.md Demonstrates how to fetch the community plugins registry JSON file directly from GitHub using its raw content URL. ```http https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json ``` -------------------------------- ### Example Deprecated Version Arrays Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md Shows example arrays of version strings for specific plugins, representing deprecated releases. ```json "obsidian-reading-time": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"] ``` ```json "obsidian-checklist-plugin": ["1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.0.9", "1.0.10"] ``` -------------------------------- ### Backwards Compatibility Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/desktop-releases.md Demonstrates how the `minimumVersion` field ensures safe upgrade paths by preventing users from jumping over critical migration versions. This protects against potential data corruption or application instability. ```text User on v0.14.5 wants to upgrade to v1.12.7 If minimumVersion = "0.14.5": ✓ Can upgrade directly If minimumVersion = "1.0.0": ✗ Must first upgrade to v1.0.0 If minimumVersion = "1.5.0": ✗ Must first upgrade to v1.5.0 ``` -------------------------------- ### Popular Plugin Examples Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-stats.md Highlights total download counts for highly popular community plugins. ```text table-editor-obsidian: 2,886,210 total downloads obsidian-git: 2,625,413 total downloads [These are among the most popular community plugins] ``` -------------------------------- ### ThemeEntry JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example of a `ThemeEntry` object as it would appear in `community-css-themes.json`. ```json { "name": "Atom", "author": "kognise", "repo": "kognise/obsidian-atom", "screenshot": "screenshot-hybrid.png", "modes": ["dark", "light"] } ``` -------------------------------- ### Obsidian Plugin Installation Workflow: Discovery Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Illustrates the initial step of plugin discovery within Obsidian. It shows how Obsidian fetches the community-plugins.json file to display a list of available plugins to the user. ```text User opens Obsidian → Settings → Community plugins → Browse ↓ Obsidian fetches community-plugins.json ↓ Displays list of ~900 plugins ``` -------------------------------- ### Version Popularity Examples Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-stats.md Illustrates download counts for different plugin versions, showing early, growth, peak, and recent version trends. ```json "0.0.1": 10, "0.0.2": 25, "0.0.3": 50 ``` ```json "0.5.0": 5000, "0.6.0": 12000, "0.7.0": 35000 ``` ```json "0.22.1": 922244 // Most popular version of table-editor-obsidian ``` ```json "0.23.0": 200000, "0.23.1": 102, "0.23.2": 71664 ``` -------------------------------- ### SnippetEntry JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example of a `SnippetEntry` object as it would appear in `community-snippets.json`. ```json { "name": "Plugin name on the right", "author": "Silver", "description": "Move the plugin name to the right end in your command palette for easier scanning.", "repo": "ericaxu/test-snippets" } ``` -------------------------------- ### PluginStatistics JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example JSON object for PluginStatistics, showing download counts for specific versions and overall statistics. ```json { "0.8.2": 3883, "0.8.1": 649, "downloads": 2886210, "0.9.2": 2390, "updated": 1778695852000, "0.22.1": 922244, "0.23.1": 102 } ``` -------------------------------- ### Example Beta Release JSON Structure Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/desktop-releases.md Illustrates the JSON structure for beta releases, mirroring the root level but containing pre-release information. This object is included only when beta releases are being tested. ```json "beta": { "minimumVersion": "0.14.5", "latestVersion": "1.13.0", "downloadUrl": "https://releases.obsidian.md/release/obsidian-1.13.0.asar.gz", "hash": "4Msbmd2Y7EbuUeGgNjw9SbVmo3A2ldg9na5XHzUQbk4=", "signature": "zdQwfmljr1SHuGvvsNtCYGhIYi9B8+5TC3kxM772W/bFYCBC8TOcIZ2VI+W5B18IRE7uwTIV1+2fhwrn/Q7fPRupAsZKugtXl041dgebAgDPXspOib6qS92a7lEc0YpSrkCf9PL8Gou7DNxsDS5WhD+VQO/CWwg5O1Oc1/Clxsv+q5eKVqvph5ODGCBWHBU+Erh6bQB0gTH33oIs4peOVvRCre9uWbnLlQrpit+t3PQ+SE/mzym7RWkP/me/yrwkgiuPROhK+xPQI2KrMzNiVMxZqIQQxPoNOOYdTk0rZSI8Cbi2DS+BtT24I53UzleZMa/eOjeFtDusieMeDb1Spg==" } ``` -------------------------------- ### PluginStatisticsMap JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md Example JSON structure for PluginStatisticsMap, showing multiple plugin IDs mapped to their respective statistics objects. ```json { "table-editor-obsidian": { ... }, "obsidian-git": { ... }, "periodic-notes": { ... } } ``` -------------------------------- ### PluginEntry JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example of a `PluginEntry` object as it would appear in `community-plugins.json`. ```json { "id": "obsidian-git", "name": "Git", "author": "Vinzent", "description": "Integrate Git version control with automatic backup and other advanced features.", "repo": "vinzent03/obsidian-git" } ``` -------------------------------- ### Removed Theme Record Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/community-css-themes-removed.md An example of a single removed theme record, including its name, the reason for removal, and an optional GitHub issue URL. ```json { "name": "Molecule", "reason": "Developer policies violation: Remote resources", "issue": "https://github.com/manassadasivuni/obsidian-molecule/issues/1" } ``` -------------------------------- ### Example Snippet Object for Registry Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/community-snippets.md Illustrates how to format a new snippet entry for submission to the community snippets registry. ```json { "name": "Custom theme adjustments", "author": "yourname", "description": "Adjusts the dark theme colors to reduce eye strain at night.", "repo": "yourname/obsidian-custom-snippet" } ``` -------------------------------- ### PluginDeprecationMap JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md Example JSON structure for PluginDeprecationMap, illustrating plugin IDs mapped to lists of their deprecated versions. ```json { "obsidian-reading-time": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"], "templater-obsidian": ["0.5.2", "0.5.3"], "obsidian-checklist-plugin": ["1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5"] } ``` -------------------------------- ### RemovedPluginEntry JSON Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md An example of a `RemovedPluginEntry` object as it would appear in `community-plugins-removed.json`. ```json { "id": "ava", "name": "Ava", "reason": "No longer functional" } ``` -------------------------------- ### Obsidian Plugin Installation Workflow: Details Lookup Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Details the process of retrieving comprehensive information for a selected plugin. It involves fetching manifest.json and README.md from the plugin's repository. ```text User clicks on a plugin ↓ Obsidian fetches manifest.json from the plugin's GitHub repo ↓ Obsidian fetches README.md from the plugin's GitHub repo ↓ Display full details: long description, version, download count ``` -------------------------------- ### Plugin Version Deprecation Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Example JSON response for plugin version deprecation. This maps plugin IDs to arrays of their deprecated version strings. ```json { "obsidian-reading-time": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"], "templater-obsidian": ["0.5.2", "0.5.3"], "obsidian-checklist-plugin": [ "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.0.9", "1.0.10" ] } ``` -------------------------------- ### Small Version Deprecation List Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md Shows only a few versions are marked as deprecated. This might indicate active maintenance or that only recent versions are recommended. ```json "templater-obsidian": ["0.5.2", "0.5.3"] ``` -------------------------------- ### Example Deprecation File Structure Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md Illustrates the JSON object structure mapping plugin IDs to arrays of their deprecated version strings. ```json { "obsidian-reading-time": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"], "templater-obsidian": ["0.5.2", "0.5.3"], "obsidian-checklist-plugin": [ "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.0.9", "1.0.10" ], "linked-data-vocabularies": [ "0.0.1", "0.0.2", "0.0.3" ] } ``` -------------------------------- ### Get Latest Obsidian Desktop Version Info Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md JavaScript code to fetch desktop release information and log the latest stable or beta version, download URL, and minimum compatible version. It prioritizes beta if available. ```javascript const releases = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json' ).then(r => r.json()); const channel = releases.beta || releases; console.log(`Latest version: ${channel.latestVersion}`); console.log(`Download URL: ${channel.downloadUrl}`); console.log(`Minimum compatible version: ${channel.minimumVersion}`); ``` -------------------------------- ### Plugin Version Compatibility Fallback Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Illustrates how Obsidian handles installing older plugin versions when a user's Obsidian version is not compatible with the latest plugin version. ```text Plugin releases versions: 1.0.0, 1.5.0, 2.0.0 (requires Obsidian 0.15.0) ↓ User has Obsidian 0.13.0 ↓ User tries to install plugin ↓ Obsidian checks manifest.json → minAppVersion: "0.15.0" (too new!) ↓ Obsidian looks up plugin in community-plugin-deprecation.json → Maybe: ["1.0.0", "1.5.0"] ↓ Obsidian fetches plugin's versions.json from GitHub → {"2.0.0": "0.15.0", "1.5.0": "0.13.0", "1.0.0": "0.10.0"} ↓ Find latest version compatible with 0.13.0 → Version 1.5.0 requires 0.13.0 (matches!) ↓ Install version 1.5.0 instead of 2.0.0 ``` -------------------------------- ### Multiple Removed Theme Records Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/community-css-themes-removed.md A JSON array containing multiple removed theme records, demonstrating the structure of the community-css-themes-removed.json file. ```json [ { "name": "Molecule", "reason": "Developer policies violation: Remote resources", "issue": "https://github.com/manassadasivuni/obsidian-molecule/issues/1" }, { "name": "Creature", "reason": "Repository archived" }, { "name": "WilcoxOne", "reason": "Developer policies violation: Remote resources", "issue": "https://github.com/MattWilcox/obsidian-wilcox-one/issues/3" } ] ``` -------------------------------- ### Obsidian Plugin Installation Workflow: Compatibility Check Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Describes the compatibility check process for a plugin. It involves comparing the plugin's minimum app version with the user's current Obsidian version and checking deprecation status. ```text Obsidian reads manifest.json ↓ Check: minAppVersion (from manifest) ≤ currentAppVersion (user's version) ↓ ├─ YES: Show "Install" button └─ NO: Check community-plugin-deprecation.json ↓ Check: Is plugin in deprecation list? ↓ ├─ YES: Fetch versions.json from GitHub │ Find latest compatible version │ Install that version instead └─ NO: Show error: plugin requires newer Obsidian ``` -------------------------------- ### Get Top 10 Plugins by Downloads Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md JavaScript code to fetch plugin statistics and identify the top 10 plugins based on their total download counts. Assumes the stats JSON has been fetched. ```javascript const stats = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugin-stats.json' ).then(r => r.json()); // Get top 10 plugins by downloads const topPlugins = Object.entries(stats) .map(([id, data]) => ({ id, downloads: data.downloads })) .sort((a, b) => b.downloads - a.downloads) .slice(0, 10); topPlugins.forEach(p => console.log(`${p.id}: ${p.downloads}`)); ``` -------------------------------- ### Fetch Desktop Releases using JavaScript Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Demonstrates how to fetch and parse the desktop-releases.json file using the fetch API in JavaScript. This is useful for checking for new desktop application versions. ```javascript // Fetch desktop releases const releases = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json' ).then(r => r.json()); ``` -------------------------------- ### New Obsidian Desktop Release Process Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md Steps for updating the repository when a new Obsidian desktop version is released. ```markdown 1. Build process creates obsidian-X.X.X.asar.gz 2. Calculate SHA256 hash of release file 3. Sign release with Ed25519 private key 4. Update desktop-releases.json 5. Push to repository 6. Obsidian clients detect update and notify users ``` -------------------------------- ### Build a Plugin Search Service Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Implement a service to load and search community plugins. It fetches data from multiple URLs and builds lookup maps for efficient searching and detail retrieval. ```javascript class PluginSearchService { async loadData() { const [active, removed, stats, deprecation] = await Promise.all([ fetch(communityPluginsUrl).then(r => r.json()), fetch(removedPluginsUrl).then(r => r.json()), fetch(pluginStatsUrl).then(r => r.json()), fetch(deprecationUrl).then(r => r.json()) ]); // Build lookup maps this.plugins = Object.fromEntries(active.map(p => [p.id, p])); this.removed = Object.fromEntries(removed.map(p => [p.id, p])); this.stats = stats; this.deprecated = deprecation; } search(query) { const lower = query.toLowerCase(); return Object.values(this.plugins) .filter(p => p.name.toLowerCase().includes(lower) || p.description.toLowerCase().includes(lower) || p.author.toLowerCase().includes(lower) ) .map(p => ({ ...p, downloads: this.stats[p.id]?.downloads || 0, isDeprecated: p.id in this.deprecated, versions: this.deprecated[p.id] })) .sort((a, b) => b.downloads - a.downloads); } getDetails(pluginId) { const plugin = this.plugins[pluginId]; if (!plugin) { const removed = this.removed.find(p => p.id === pluginId); return { ...removed, isRemoved: true }; } return { ...plugin, stats: this.stats[pluginId], deprecatedVersions: this.deprecated[pluginId] || [], isRemoved: false }; } } ``` -------------------------------- ### Fetch and Analyze Plugin Statistics Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-stats.md Demonstrates how to fetch plugin statistics from a URL, access total downloads for a specific plugin, identify the most popular version, and interpret the last updated timestamp. ```javascript const stats = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugin-stats.json' ).then(r => r.json()); const tableEditorStats = stats['table-editor-obsidian']; const totalDownloads = tableEditorStats['downloads']; console.log(`Table Editor Total: ${totalDownloads}`); const versions = Object.entries(tableEditorStats) .filter(([key]) => key !== 'downloads' && key !== 'updated') .sort((a, b) => b[1] - a[1]); console.log(`Most popular version: ${versions[0][0]} (${versions[0][1]} downloads)`); const lastUpdated = new Date(tableEditorStats['updated']); console.log(`Statistics last updated: ${lastUpdated}`); ``` -------------------------------- ### User Impact of Removed Plugin Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Describes the user experience and options when a plugin they have installed is removed from the community list. ```text Obsidian still loads the plugin from vault/.obsidian/plugins/ ↓ User sees notification: "Plugin 'X' removed from community" ↓ User can: - Uninstall the plugin - Keep using it (local copy) - Archive it manually ↓ No automatic disabling or deletion occurs ``` -------------------------------- ### DesktopReleases Interface Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md Extends ReleaseInfo to include optional beta release details. This structure represents the root of the desktop releases configuration. ```typescript interface DesktopReleases extends ReleaseInfo { beta?: ReleaseInfo; } ``` -------------------------------- ### Check Formatting and Required Fields Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md Verify that the code formatting is correct and that all required fields (id, name, author, description, repo) are present in the plugin manifest. Run `npm run format` and check for minimal changes with `git diff`. ```bash # Check formatting npm run format && git diff # Should have minimal changes # Verify required fields # Manually check: id, name, author, description, repo present ``` -------------------------------- ### Community Plugins Registry Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Retrieves the complete registry of active community plugins available for installation. This endpoint is updated weekly. ```APIDOC ## GET community-plugins.json ### Description Complete registry of active community plugins available for installation. ### Method GET ### Endpoint /community-plugins.json ### Parameters #### Query Parameters None #### Request Body None ### Request Example ```bash curl -s https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json ``` ### Response #### Success Response (200) - **PluginEntry[]**: An array of plugin objects, each containing id, name, author, description, and repo. #### Response Example ```json [ { "id": "table-editor-obsidian", "name": "Advanced Tables", "author": "tgrosinger", "description": "Improved table navigation, formatting, and manipulation.", "repo": "tgrosinger/advanced-tables-obsidian" }, { "id": "hotkeysplus-obsidian", "name": "Hotkeys++", "author": "argenos", "description": "Additional hotkeys to do common things.", "repo": "argenos/hotkeysplus-obsidian" } ] ``` ``` -------------------------------- ### Fetch and Filter Community Plugins with JavaScript Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Demonstrates how to fetch the community plugins list and filter it by search terms using JavaScript. Useful for third-party tools like plugin managers. ```javascript // Fetch all community plugins const plugins = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json' ).then(r => r.json()); // Filter/search plugins const matching = plugins.filter(p => p.name.includes(searchTerm) || p.description.includes(searchTerm) ); // Direct installation from GitHub for (const plugin of matching) { const manifestUrl = `https://github.com/${plugin.repo}/raw/master/manifest.json`; const manifest = await fetch(manifestUrl).then(r => r.json()); // Install plugin... } ``` -------------------------------- ### Understanding Download Metrics Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Explains the data tracked in `community-plugin-stats.json`, including total downloads per version and plugin, and last update timestamps. ```text community-plugin-stats.json tracks: - Total downloads per version - Total downloads per plugin - Last update timestamp Use cases: - Ranking plugins by popularity - Identifying trending plugins - Analyzing adoption patterns - Detecting abandoned plugins ``` -------------------------------- ### Check for Desktop App Updates Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/desktop-releases.md This JavaScript snippet demonstrates how to fetch the desktop release manifest, check for a newer version, download the release, and verify its integrity using a SHA256 hash. ```javascript // Check for updates async function checkForUpdates(currentVersion) { const response = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json' ); const releases = await response.json(); const channelInfo = releases.beta || releases; if (channelInfo.latestVersion > currentVersion) { console.log(`Update available: ${channelInfo.latestVersion}`); console.log(`Download: ${channelInfo.downloadUrl}`); // Download and verify const file = await downloadFile(channelInfo.downloadUrl); const hash = calculateSHA256(file); if (hash === channelInfo.hash) { console.log('Hash verification passed'); // Proceed with installation } else { console.error('Hash mismatch - download corrupted'); } } else { console.log('Already on latest version'); } } ``` -------------------------------- ### Git Ignore Rules Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md Specifies files that Git should ignore during change tracking. Common entries include build artifacts and temporary files. ```gitignore node_modules/ .DS_Store *.swp ``` -------------------------------- ### Example Unix Timestamp Conversion Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md Demonstrates how to convert a Unix timestamp (in milliseconds) to a JavaScript Date object. This is useful for interpreting the 'updated' field in plugin statistics. ```javascript new Date(1778695852000) // → Wed May 11 2026 ... ``` -------------------------------- ### Fetch Active Plugins using JavaScript Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Demonstrates how to fetch and parse the community-plugins.json file using the fetch API in JavaScript. This is useful for applications that need to list or process active plugins. ```javascript // Fetch active plugins const plugins = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json' ).then(r => r.json()); ``` -------------------------------- ### Plugin Contribution Process Overview Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md Steps for plugin authors to create, release, and submit their plugins to the Obsidian community registry. ```markdown 1. Create plugin in GitHub repository ├─ Include manifest.json in root ├─ Include README.md ├─ Follow Obsidian Plugin API └─ Comply with Developer Policies 2. Create release in GitHub ├─ Tag version (matching manifest.json) ├─ Upload main.js and styles.css └─ Include manifest.json and README.md 3. Submit to community registry └─ Create PR to obsidian-releases ├─ Add entry to community-plugins.json ├─ Maintain alphabetical order by ID ├─ Include all required fields └─ Link to GitHub repo for verification 4. Obsidian review ├─ Check Obsidian compatibility ├─ Verify Developer Policy compliance ├─ Review plugin code/functionality ├─ Approve or request changes └─ Merge PR when approved ``` -------------------------------- ### Community Plugins Registry JSON Structure Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/community-plugins.md This is an example of the root-level JSON array structure for the community plugins registry. Each object represents a registered community plugin. ```json [ { "id": "table-editor-obsidian", "name": "Advanced Tables", "author": "tgrosinger", "description": "Improved table navigation, formatting, and manipulation.", "repo": "tgrosinger/advanced-tables-obsidian" }, { "id": "obsidian-git", "name": "Git", "author": "Vinzent", "description": "Integrate Git version control with automatic backup and other advanced features.", "repo": "vinzent03/obsidian-git" } ] ``` -------------------------------- ### Obsidian Application Update Workflow: Check for Updates Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Explains how Obsidian desktop checks for available application updates. It involves fetching desktop-releases.json and comparing the user's version with the latest available version. ```text Obsidian desktop (on startup or periodically) ↓ Fetch desktop-releases.json ↓ Compare user's version vs latestVersion ↓ ├─ User on latest: No action needed ├─ Update available: Notify user └─ User on beta: Check beta.latestVersion instead ``` -------------------------------- ### Parse Community Plugins Registry Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Fetch and parse the community plugins JSON data using JavaScript. This snippet demonstrates how to get the total count and iterate through plugin details. ```javascript const plugins = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json' ).then(r => r.json()); console.log(`Total plugins: ${plugins.length}`); plugins.forEach(p => console.log(`${p.name} by ${p.author}`)); ``` -------------------------------- ### Large Version Deprecation List Example Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/plugin-deprecation.md Indicates a plugin has many older versions available as fallbacks. Users on older Obsidian versions can likely find a compatible version in this list. ```json "obsidian-checklist-plugin": [ "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.0.9", "1.0.10" ] ``` -------------------------------- ### Handle Fetch Errors Gracefully Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Demonstrates how to use a try-catch block to handle potential errors during the fetch operation and network issues. ```javascript // 1. Handle errors gracefully try { const response = await fetch(fileUrl); if (!response.ok) throw new Error(`HTTP ${response.status}`); const data = await response.json(); // Process data... } catch (error) { console.error('Failed to fetch:', error); // Use cached data if available } ``` -------------------------------- ### Example of External Font Import in CSS Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/community-css-themes-removed.md This CSS snippet demonstrates importing an external font from Google Fonts. Such imports can lead to theme removal due to privacy and security policy violations. ```css /* Obsidian theme with external font */ @import url('https://fonts.googleapis.com/css2?family=Inter'); ``` -------------------------------- ### Theme Contribution Process Overview Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md Steps for theme authors to create, release, and submit their themes to the Obsidian community registry. ```markdown 1. Create theme in GitHub repository ├─ Include theme.css or esbuild configuration ├─ Ensure dark/light mode compatibility ├─ No remote resource loading └─ Include screenshot (screenshot.png or similar) 2. Follow CSS standards ├─ Use CSS variables for colors ├─ Support both light and dark modes ├─ Test on latest Obsidian version └─ Ensure no layout breakage 3. Submit to community registry └─ Create PR to obsidian-releases ├─ Add entry to community-css-themes.json ├─ Maintain alphabetical order ├─ Include screenshot filename ├─ List supported modes (dark/light) └─ Set legacy: false for modern themes 4. Obsidian review ├─ Check for policy violations ├─ Verify screenshot availability ├─ Test theme loading ├─ Approve or request changes └─ Merge PR when approved ``` -------------------------------- ### Implement Client-Side Caching Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Shows how to cache fetched data in localStorage to improve performance and reduce redundant requests. ```javascript // 2. Implement caching const cacheKey = 'obsidian-plugins-' + new Date().toDateString(); const cached = localStorage.getItem(cacheKey); if (cached) return JSON.parse(cached); const data = await fetch(url).then(r => r.json()); localStorage.setItem(cacheKey, JSON.stringify(data)); return data; ``` -------------------------------- ### Desktop Application Releases Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Provides metadata for Obsidian desktop application releases, including the latest stable and beta versions, download URLs, and version hashes. ```APIDOC ## GET desktop-releases.json ### Description Metadata for Obsidian desktop application releases. ### Method GET ### Endpoint /desktop-releases.json ### Response #### Success Response (200) - **DesktopReleases** (object) - An object containing release information for stable and beta channels. ### Response Example ```json { "minimumVersion": "0.14.5", "latestVersion": "1.12.7", "downloadUrl": "https://github.com/obsidianmd/obsidian-releases/releases/download/v1.12.7/obsidian-1.12.7.asar.gz", "hash": "dd008UydtVj7rRnoDwsgG8mAW1G3OINwJ34PkaOL2FA=", "signature": "cwtFXU3vTvuY3fNhfr9VCVDo0l/BZIjg1k7QAI5CxnRj53UJ3aLozUmsFgYFSp3JQjAJUWU0Rgx9mGfQ8iSzkU6bglgRsaX/Arr9TNdBXC7P9Kx45F/tbRIBIo6ORFhjFPF310wKCbN4Gbgg7Hrlm1TcD21nPxrJuwLWKE6xuAPMM1VrV5pCm53kUQyBlYJGVXY/4yMeg5d2il7xHIRkU7qWZssid5Q/sOUdCiJIyrkAZm7PtTGYWca1C3JUPYgq0vSm2g4BoDlh4nigyUJwPdJ+GnSaO+kbL+eYNDUL5bDlg8ml0NWYWlvtRntMsLhTzkxOtUfeb5IRPJ61u3Mr6g==", "beta": { "minimumVersion": "0.14.5", "latestVersion": "1.13.0", "downloadUrl": "https://releases.obsidian.md/release/obsidian-1.13.0.asr.gz", "hash": "4Msbmd2Y7EbuUeGgNjw9SbVmo3A2ldg9na5XHzUQbk4=", "signature": "zdQwfmljr1SHuGvvsNtCYGhIYi9B8+5TC3kxM772W/bFYCBC8TOcIZ2VI+W5B18IRE7uwTIV1+2fhwrn/Q7fPRupAsZKugtXl041dgebAgDPXspOib6qS92a7lEc0YpSrkCf9PL8Gou7DNxsDS5WhD+VQO/CWwg5O1Oc1/Clxsv+q5eKVqvph5ODGCBWHBU+Erh6bQB0gTH33oIs4peOVvRCre9uWbnLlQrpit+t3PQ+SE/mzym7RWkP/me/yrwkgiuPROhK+xPQI2KrMzNiVMxZqIQQxPoNOOYdTk0rZSI8Cbi2DS+BtT24I53UzleZMa/eOjeFtDusieMeDb1Spg==" } } ``` ### Usage ```javascript const releases = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json' ).then(r => r.json()); const channel = releases.beta || releases; console.log(`Latest version: ${channel.latestVersion}`); console.log(`Download URL: ${channel.downloadUrl}`); console.log(`Minimum compatible version: ${channel.minimumVersion}`); ``` ``` -------------------------------- ### ReleaseInfo Interface Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/types.md Defines the structure for release information, including versioning, download URLs, and security hashes. Used for both stable and beta releases. ```typescript interface ReleaseInfo { minimumVersion: string; latestVersion: string; downloadUrl: string; hash: string; signature: string; } ``` -------------------------------- ### Fetch Removed Plugins using JavaScript Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Demonstrates how to fetch and parse the community-plugins-removed.json file using the fetch API in JavaScript. Use this to identify plugins that are no longer active. ```javascript // Fetch removed plugins const removed = await fetch( 'https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins-removed.json' ).then(r => r.json()); ``` -------------------------------- ### Troubleshooting Version Compatibility Issues Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md For version compatibility issues, check the plugin's `manifest.json` `minAppVersion`, the user's Obsidian version, and if the plugin is listed in `community-plugin-deprecation.json`. Also, review the plugin's `versions.json` for compatible versions. ```text Check: 1. Plugin's manifest.json minAppVersion 2. User's Obsidian version 3. Is plugin in community-plugin-deprecation.json? 4. Plugin's versions.json for compatible versions ``` -------------------------------- ### NPM Package Configuration for Prettier Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/repository-structure.md NPM configuration file defining scripts and development dependencies for repository tooling. Used here to set up Prettier for consistent JSON formatting. ```json { "name": "obsidian-community-releases", "scripts": { "format": "prettier --write \"**/community*.json\"" }, "devDependencies": { "prettier": "3.5.3" } } ``` -------------------------------- ### Handle Rate Limiting Considerations Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Provides notes on rate limiting, distinguishing between GitHub raw content (no limit) and the GitHub API (with limits). ```javascript // 4. Handle rate limiting // GitHub raw content has no rate limit // GitHub API has rate limits (60 req/hr unauthenticated, 5000 authenticated) ``` -------------------------------- ### Repository Structure Overview Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/README.md This snippet shows the directory structure of the obsidian-releases repository, highlighting key JSON files and their purposes. ```tree obsidian-releases/ ├── desktop-releases.json # Desktop/Electron app release metadata ├── community-plugins.json # Active community plugins registry ├── community-plugins-removed.json # Removed plugins with reason ├── community-css-themes.json # Active CSS themes registry ├── community-css-themes-removed.json # Removed themes with reason ├── community-snippets.json # CSS snippets registry ├── community-plugin-deprecation.json # Deprecated plugin versions per ID ├── community-plugin-stats.json # Download statistics per plugin version ├── package.json # NPM metadata (formatting only) └── README.md # Submission guidelines ``` -------------------------------- ### Browser-Safe Fetch for Community Plugins Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Demonstrates a simple fetch request from a browser to retrieve community plugin data, handling potential errors. ```javascript // Browser-safe fetch fetch('https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json') .then(r => r.json()) .then(plugins => console.log(`${plugins.length} plugins available`)) .catch(err => console.error('Failed:', err)); ``` -------------------------------- ### Release File Signature Validation (Pseudocode) Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/schemas/desktop-releases.md Outlines the steps for validating a release file's digital signature using its SHA256 hash and Obsidian's public Ed25519 key. This process ensures the authenticity and integrity of the downloaded file. ```pseudocode 1. Download release file from downloadUrl 2. Calculate SHA256 hash of file 3. Verify hash matches the 'hash' field 4. Load Obsidian's public Ed25519 key 5. Verify signature against the file's content 6. If all checks pass, file is authentic ``` -------------------------------- ### Obsidian Application Update Workflow: Download & Verify Release Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Details the process of downloading and verifying a new Obsidian desktop release. It includes downloading the release file and verifying its SHA256 hash and Ed25519 signature. ```text User clicks "Install Update" ↓ Download release from downloadUrl ↓ Verify SHA256 hash matches 'hash' field ↓ Verify Ed25519 signature matches 'signature' field ↓ ├─ Verification passed: Proceed with installation └─ Verification failed: Show error, do not install ``` -------------------------------- ### Fetch Community Plugins Registry Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/api-reference.md Retrieve the complete registry of active community plugins. This is useful for displaying available plugins or checking for updates. ```bash curl -s https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json ``` -------------------------------- ### Handle Incompatibilities Source: https://github.com/obsidianmd/obsidian-releases/blob/master/_autodocs/integration-guide.md Describes the process for handling plugin incompatibilities when a new release requires a minimum version higher than the user's current version. ```text If user is on old version and new release requires minimum version: ↓ Check minimumVersion in desktop-releases.json ↓ ├─ User version ≥ minimumVersion: Update directly └─ User version < minimumVersion: Must upgrade to intermediate version first (Multi-step update process) ```