Skip to content

Releases: PicGo/PicGo-Core

v3.0.0

Choose a tag to compare

@Molunerfinn Molunerfinn released this 01 Jul 02:16
9018569

Features

PicGo Cloud Uploader (New Built-in Uploader)

PicGo Cloud is now a built-in uploader and the new default (previously SM.MS). Upload images directly to PicGo Cloud with multipart upload support for large files.

Every registered user gets a free tier200 file items and 500 MB storage — no credit card required.

How to use (new users):

New installations default to picgo-cloud uploader, no extra configuration needed:

picgo login            # login to PicGo Cloud first
picgo upload image.png # upload using the default uploader (picgo-cloud)

Upgrading from v2.x:

If you already have an uploader configured (e.g., smms), you need to switch manually:

picgo login                        # login to PicGo Cloud first
picgo use uploader picgo-cloud      # switch to picgo-cloud uploader
picgo upload image.png             # now uploads to PicGo Cloud
  • Multipart Upload: Large files are automatically split into chunks and uploaded in parallel with progress tracking. Interrupted uploads can be resumed.
  • Auto Import: Uploaded images are automatically added to your cloud album (configurable).

For plugin authors and Node.js users

The default uploader resolution order is: picBed.uploaderpicBed.currentpicgo-cloud. If neither is configured, PicGo Cloud is used automatically.


PicGo Cloud Album Management

A full-featured album management system for PicGo Cloud. You can now import your local upload history to the cloud, and manage cloud album items directly from the CLI.

How to use:

Import your existing upload history to PicGo Cloud:

picgo cloud album import

Manage cloud album items:

picgo cloud album list          # list album items with pagination
picgo cloud album get <id>      # get details of a specific item
picgo cloud album update <id>   # update an item
picgo cloud album delete <id>   # delete an item (with confirmation)
picgo cloud album retry         # retry failed imports
picgo cloud status              # check login & plan status
  • Batch Import: Import from local picgo.db, JSON file, or inline JSON. Features a visual progress bar and spinner, with --verbose for per-batch details.
  • Auto Import: When you upload via PicGo Cloud uploader, successfully uploaded images are automatically synced to your cloud album.
  • Retry Queue: Failed imports go to a pending queue. Run picgo cloud album retry to retry them.
  • Flexible Output: All commands support --format json (compact JSON for scripts/AI) and --format pretty (human-readable, default).

Shortcuts:

For convenience, some frequently used commands have top-level shortcuts:

picgo cloud list       # shortcut for cloud album list
picgo cloud import     # shortcut for cloud album import
picgo login            # shortcut for cloud login
picgo logout           # shortcut for cloud logout
picgo config sync      # shortcut for cloud config sync

Upload Flow Enhancements

Several improvements to the upload pipeline for better observability and reliability.

JSON output for uploads:

picgo upload image.png --format json

Outputs compact JSON with origin, imgUrl, fileName, type, contentType, size and more.

origin field tracking: The path transformer now sets an origin field on each output item, allowing you to trace back to the original input (URL or file path). This benefits plugins like pic-migrater which can now pass URLs directly to upload().

Partial upload failure handling: When uploading multiple images, if some succeed and others fail:

  • Successfully uploaded URLs are still output to the user.
  • afterUploadPlugins and afterFinishPlugins (e.g., cloud auto-import) still execute for successful items.
  • Both FINISHED and FAILED events are emitted.

Server API response: The upload endpoint now returns an items array with per-item details (origin, imgUrl, fileName, etc.) alongside the existing result array (URL strings only), maintaining backward compatibility.


picgo get — Query Current Configuration

A new command to quickly inspect your current PicGo configuration.

picgo get uploader      # show current uploader
picgo get transformer   # show current transformer
picgo get plugins       # list installed plugins with enabled/disabled state

All subcommands support --format json for machine-readable output.


Reactive Plugin Config

Resolves PicGo#1411 — plugin configuration panels now support cascading dropdowns and reactive fields.

For plugin authors

  • dependsOn: Declare field dependencies with dependsOn: ['otherField']. When the depended field changes, your field's choices and default are re-evaluated.
  • Function-form choices / default: choices: (answers) => [...] and default: (answers) => value now receive the correct answers snapshot on both CLI and GUI.
  • Zero overhead for existing plugins: If you don't declare dependsOn, nothing changes. The reactive pipeline is only triggered when dependsOn is present.
const config = (ctx) => [
  {
    name: 'region',
    type: 'list',
    choices: ['us-east', 'us-west', 'eu-central'],
    default: 'us-east'
  },
  {
    name: 'bucket',
    type: 'list',
    dependsOn: ['region'],
    choices: (answers) => getBucketsForRegion(answers.region),
    default: (answers) => getDefaultBucket(answers.region)
  }
]

New Plugin Config Field: type: 'editor'

Resolves PicGo#1408 — plugin config now supports a multi-line text editor field.

For plugin authors

Use type: 'editor' for config fields that need multi-line input (API key lists, scripts, templates, etc.):

{
  name: 'customScript',
  type: 'editor',
  required: false,
  message: 'Enter your custom script'
}
  • CLI: Opens your system editor ($VISUAL$EDITOR → platform default).
  • GUI (PicGo >= 3.0.0): Renders as a resizable <Textarea> that auto-grows with content.
  • Backward compatible: Older PicGo GUI versions silently skip unknown field types — no errors.

Breaking Changes

  • Node.js >= 20.19.0 or >= 22.12.0 is now required, due to the stability of ES Module support.
  • Default uploader changed: The default uploader is now picgo-cloud (previously smms / SM.MS). If you have picBed.uploader or picBed.current configured, your existing setting is respected — run picgo use uploader to switch. This only affects fresh installations with no prior configuration.

v2.0.2

Choose a tag to compare

@Molunerfinn Molunerfinn released this 10 Feb 14:04
98ce098

Bug fix

  • Fix: S.EE upload error

v2.0.1

Choose a tag to compare

@Molunerfinn Molunerfinn released this 10 Feb 02:02
a27f5a4

Features

  • Support the new SM.MS endpoint -> S.EE

All you need to change is the smms backupDomain. You can remove the backupDomain or change it to s.ee

v2.0.0

Choose a tag to compare

@Molunerfinn Molunerfinn released this 27 Jan 07:54
0b496d9

Features

PicGo Server (Local HTTP API)

The local server has been rebuilt to be more robust and secure. It now supports automatic port detection and optional authentication, making it safer to run in shared environments.

How to use:

Simply run the following command to start the server:

picgo server
  • Smart Port Management: By default, it uses port 36677. If the port is busy, PicGo will intelligently detect if another PicGo instance is running and reuse it, or automatically find the next available port.
  • Upload Endpoint: Send POST /upload requests with:
    • JSON body: { "list": ["/path/to/image.png"] }. if list is not provided, it will upload images from the clipboard.
    • Multipart form-data: files field.
  • Health Check: POST /heartbeat to check server status.

Security & Authentication:

You can now protect your upload server with a secret token.

  • Set a secret: Use the --secret flag, set the PICGO_SERVER_SECRET env var, or configure settings.server.secret.
  • Authenticate requests: If secret is set, clients must provide the secret via the Authorization: Bearer <secret> header, X-PicGo-Secret header, or ?secret= query parameter.

For plugin authors and Node.js users

  • New Router APIs: Use picgo.server.registerGet, picgo.server.registerPost, and picgo.server.mount to add custom routes safely.
  • Programmatic Control: You can now control the server lifecycle via picgo.server.listen(), picgo.server.shutdown(), and check status with picgo.server.isListening().

PicGo Cloud Login

We have introduced a seamless login experience for PicGo Cloud. You can now authenticate directly via your browser without manually copying tokens.

How to use:

picgo login
  • Browser Flow: This command opens your default browser for a secure login (PKCE). Once authorized, PicGo automatically saves your token.
  • Manual Token: If you cannot open a browser (e.g., on a headless server), you can still log in manually using picgo login [token].
  • Logout: Run picgo logout to remove your credentials.

For plugin authors and Node.js users

  • New Auth API: Use picgo.cloud.login([token]) and picgo.cloud.logout() to manage authentication programmatically.

PicGo Config Sync

Keep your configuration synchronized across multiple devices with conflict resolution and optional End-to-End Encryption (E2EE).

How to use:

picgo config sync
  • Smart Sync: PicGo performs a 3-way merge (Snapshot + Local + Remote) to ensure no settings are lost.
  • Conflict Resolution: If conflicts occur (e.g., you changed the same setting on two different computers), the CLI will present a diff tree and ask you to choose: Use Local, Use Remote, or Abort.
  • Privacy First: Sensitive fields like your Cloud Token are never synced.

Encryption Options:

You can choose how your data is protected in the cloud:

picgo config sync --encrypt e2ee
  • auto: Default behavior.
  • sse (Server-Side Encryption): We use AES-256-GCM to encrypt your config on our servers. No PIN is required.
  • e2ee (End-to-End Encryption): Uses PBKDF2 + AES-256-GCM. Your config is encrypted locally before uploading. A PIN will be required to decrypt it on other devices.

Breaking Changes

  • Node.js v20.19.0+ is now required.
  • If Authentication is enabled: If you configure a server secret (--secret or settings.server.secret), all clients (including plugins making requests to the local server) must provide the correct credentials. Unauthorized requests to /upload will receive a 401 Unauthorized error.

v1.8.1

Choose a tag to compare

@Molunerfinn Molunerfinn released this 12 Jan 09:50
672a7f6

Features

Opt-in URL rewrite rules. When configured, PicGo applies URL rewrite after uploader execution and before afterUploadPlugins.

  • type: Array<Rule>
  • default: not set (no rewrite; no warnings)

Each rule supports:

  • match (string, required): JavaScript RegExp source (no surrounding /).
  • replace (string, required): Replacement string (supports $1, $2, ...).
  • enable (boolean, optional): defaults to true; only explicit false disables the rule.
  • global (boolean, optional): maps to the regex g flag; defaults to false.
  • ignoreCase (boolean, optional): maps to the regex i flag; defaults to false.

Behavior:

  • Rules are evaluated in array order; first enabled match wins (only one rule is applied per image).
  • If rewrite changes imgUrl, PicGo stores the original URL in originImgUrl (set once and never overwritten).
  • Invalid regex patterns are logged and skipped without failing the upload.
  • If a rewrite produces an empty string, PicGo logs a warning and continues.

For plugin authors and Node.js users

  • afterUploadPlugins will see the rewritten imgUrl in ctx.output; use originImgUrl to access the original URL produced by the uploader.
  • picgo.upload() (Node.js API) returns IImgInfo[] with the rewritten imgUrl; use originImgUrl if you need the pre-rewrite value.
  • originImgUrl is only set when PicGo actually rewrites the URL; otherwise it stays undefined.

Examples

Example (simple prefix rewrite / switch to CDN):

Rewrite:

  • https://example.com/images/2026/1.png
  • https://cdn.example.com/blog-images/2026/1.png
{
  "settings": {
    "urlRewrite": {
      "rules": [
        {
          "match": "https://example.com/images/",
          "replace": "https://cdn.example.com/blog-images/"
        }
      ]
    }
  }
}

Example (ignore case: normalize file extension):

Rewrite:

  • https://cdn.example.com/blog-images/2026/1.PNG
  • https://cdn.example.com/blog-images/2026/1.png
{
  "settings": {
    "urlRewrite": {
      "rules": [
        {
          "match": "PNG",
          "replace": "png",
          "ignoreCase": true
        }
      ]
    }
  }
}

Example (global: replace all underscores in the URL):

Rewrite:

  • https://cdn.example.com/blog_images/2026/hello_world.png
  • https://cdn.example.com/blog-images/2026/hello-world.png
{
  "settings": {
    "urlRewrite": {
      "rules": [
        {
          "match": "_",
          "replace": "-",
          "global": true
        }
      ]
    }
  }
}

TIPS: Regex and escaping

match is a JavaScript regular expression source. For advanced patterns, you may need to escape backslashes in JSON strings, e.g., \\. for a literal dot.

Advanced: capture groups ($1, $2, ...)

Rewrite:

  • https://example.com/images/2026/1.png
  • https://cdn.example.com/blog-images/2026/1.png

If your match uses parentheses to capture parts of the URL, you can reference them in replace (e.g. $1 for the first group, $2 for the second).
In this example, $1 is the captured images, and $2 is the rest of the path (2026/1.png):

{
  "settings": {
    "urlRewrite": {
      "rules": [
        {
          "match": "^https://example.com/(images)/(.*)$",
          "replace": "https://cdn.example.com/blog-$1/$2"
        }
      ]
    }
  }
}

Advanced example (rewrite GitHub raw URLs to jsDelivr):

Rewrite:

  • https://raw.githubusercontent.com/user/repo/main/path/to/1.png
  • https://cdn.jsdelivr.net/gh/user/repo@main/path/to/1.png
{
  "settings": {
    "urlRewrite": {
      "rules": [
        {
          "match": "^https://raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.*)$",
          "replace": "https://cdn.jsdelivr.net/gh/$1/$2@$3/$4"
        }
      ]
    }
  }
}

v1.8.0

Choose a tag to compare

@Molunerfinn Molunerfinn released this 09 Jan 14:32
b9f92da

Feature

Since v1.8.0, PicGo-Core supports multiple configurations per uploader. Just like the configuration of the Electron version of PicGo.

You can use picgo set uploader <type> [configName] to configure different uploader configurations.

And you can use picgo use uploader <type> [configName] to switch between different uploader configurations.

For example:

picgo set uploader github Test

picgo use uploader github Test

For more details, you can use picgo uploader -h to check the help of uploader management:

Usage: picgo uploader [options] [command]


Options:
  -h, --help                                display help for command

Commands:
  list [type]                               list uploader configurations
  rename <type> <oldName> <newName>         rename a config
  copy <type> <configName> <newConfigName>  copy a config (does not switch current uploader)
  rm <type> <configName>                    remove a config

v1.7.0

Choose a tag to compare

@Molunerfinn Molunerfinn released this 08 Jan 08:35
c86b5ca

Refactor

Breaking change: The picgo init command is no longer available. Please use npx picgo-init to initialize PicGo plugin template.

For more details, please refer to PicGo-Init.

And this refactor reduces the size of PicGo core package. Enjoy!