Molunerfinn/PicGo · warning

Failed to read local plugin readme

Error message

Failed to read local plugin readme

What it means

fetchPluginReadme calls the GET_INSTALLED_PLUGIN_README RPC; if the response envelope has success:false it throws 'Failed to read local plugin readme' (or result.error if the main process supplied one). The main side could not read the plugin's README file, typically because the plugin directory or readme is missing.

Source

Thrown at src/renderer/adapters/plugins.ts:109

  },
  async saveTransformer (transformer: string) {
    await saveConfig({
      'picBed.transformer': transformer
    })
  },
  async fetchPluginReadme (fullName: string, options?: { installed?: boolean }) {
    // For installed plugins (including locally imported ones not on npm),
    // read README from disk via the main process — jsdelivr 404s on
    // unpublished plugins. Non-installed plugins (e.g. search results) fall
    // back to the CDN.
    if (options?.installed) {
      const result = await invokeRPC<string>(
        IRPCActionType.GET_INSTALLED_PLUGIN_README,
        fullName
      )

      if (!result.success) {
        throw new Error(result.error || 'Failed to read local plugin readme')
      }

      return result.data ?? ''
    }

    let lastError: unknown = null

    for (const readmeFileName of README_FILE_CANDIDATES) {
      try {
        const response = await axios.get<string>(
          `https://cdn.jsdelivr.net/npm/${fullName}/${readmeFileName}`,
          {
            responseType: 'text'
          }
        )

        return response.data || ''
      } catch (error) {

View on GitHub (pinned to 07ec7068a5)

Solutions

  1. Check result.error/logs for the main-process read failure path (ENOENT vs permissions)
  2. Reinstall the plugin to restore its README and directory contents
  3. Verify the plugin's install path exists and README.md is readable
  4. Fall back to the npm registry readme for the package when the local file is absent

Example fix

// before
const readme = await fetchPluginReadme(fullName) // throws if local README missing
// after
let readme = ''
try {
  readme = await fetchPluginReadme(fullName)
} catch {
  readme = await fetchReadmeFromNpm(fullName)
}
Defensive patterns

Strategy: fallback

Validate before calling

const readmePath = path.join(pluginDir(fullName), 'README.md')
if (!(await fs.pathExists(readmePath))) {
  return fetchReadmeFromNpm(fullName)
}

Try / catch

try {
  readme = await fetchPluginReadme(fullName)
} catch {
  readme = await fetchReadmeFromNpm(fullName).catch(() => '')
}

Prevention

When it happens

Trigger: Requesting the readme for a fullName whose installed plugin folder lacks README.md (or is unreadable), or when the RPC handler fails and returns success:false with no error message.

Common situations: Plugin installed from a package without a README; plugin folder partially deleted or corrupted node_modules; permission issues on the plugin directory; requesting a plugin that was uninstalled in another window.

Related errors


AI-assisted analysis of Molunerfinn/PicGo@07ec7068a5 (2026-08-30). Data as JSON: /api/errors/4656995fa09ca67d. Report an issue: GitHub.