# uPic review: a macOS upload client for S3, OSS and your own API

> uPic is a native macOS menu bar app that uploads images and files to a dozen hosts and copies the resulting link to your clipboard. The repository is still receiving commits, but the downloadable binaries other than the App Store build are pinned at v0.21.1 from December 2020.

**gee1k/uPic** — 📤uPic is a native, powerful, beautiful and simple picture and file upload tool for macOS.

- Repository: https://github.com/gee1k/uPic
- Website: https://blog.svend.cc/upic
- Stars: 3,721 · Forks: 265
- Language: Swift
- License: Apache-2.0
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/gee1k-upic

## The clipboard round trip uPic is built to remove

Writing a post or a chat message usually means moving a picture from your screen to a URL, and the manual version of that trip is tedious: save the screenshot, open the storage console, upload, find the object, copy the public link, then paste it back into the editor in whatever syntax the editor wants. uPic collapses that into one action. The README describes the app as an image and file hosting client for Mac, and the core loop it advertises is automatic uploading of local files and screenshots, with the resulting link copied to the clipboard on completion.

The audience is narrow and specific. This is a macOS-only tool, written in Swift, for people who already own storage somewhere and want a faster path to it: bloggers, developers writing documentation, support staff pasting screenshots into tickets. It is not a hosting service. You bring the bucket, the token or the endpoint, and uPic is the client that talks to it. The supported list in the README covers smms, UPYUN USS, Qiniu KODO, Aliyun OSS, Tencent Cloud COS, Baidu Cloud BOS, Weibo, GitHub, Gitee, Amazon S3, Imgur, and a custom upload API. That last entry is the escape hatch for anything not on the list.

One detail worth noticing before anything else: the README states that only the App Store build is the latest version, and that other installations stay at v0.21.1. The GitHub releases confirm it. The three most recent releases are v0.21.1 from 2020-12-11, v0.21.0 from 2020-11-14 and v0.20.1 from 2020-10-02. So the repository is being pushed to, but the tagged release line has not moved in years. If you install from Homebrew or from a release download, you are getting a five-year-old binary.

## Menu bar app, share extension, and a command line entry point

The architecture visible from the repository layout is a standard macOS application bundle plus two companions. The top level contains uPic/ (the main app), uPicShareExtension/ (the Finder share target), uPic.xcodeproj/ (the Xcode project), libs/, and a uPic.sketch file. The primary language is Swift. There is no server component and no daemon in the listing; the app runs in the menu bar and shows upload progress there.

The README lists seven ways to hand a file to the app. You can pick files from Finder, upload whatever is on the clipboard, take a screenshot and upload it directly, drag a local file onto the status bar, drag an image out of a browser onto the status bar, right-click a file and use the Share Extension, or invoke the app from the command line. Global shortcuts can be assigned, and the README shows a shortcuts preferences pane. Upload history is also a first-class screen, which matters more than it sounds: when a link is copied to the clipboard and then overwritten by the next copy, history is the only way back.

The link format is configurable. The README says the copied link can be a plain URL, HTML or Markdown, which is the difference between pasting into a Markdown editor and pasting into a rich text field. The upload itself goes to whichever host you configured, using credentials you supply. For GitHub and Gitee the README points at personal access token pages; for the object storage providers you supply the usual bucket, region and key material. The custom upload API option is documented on the project's blog rather than in the README, which is worth knowing if you intend to point uPic at an internal service.

## Installing uPic and uploading your first file

There are three installation routes in the README, and they do not deliver the same thing. The App Store build is described as the only one that is current. The Homebrew cask installs the older release, and the release page on GitHub or Gitee gives you the same older release as a download. If you are in mainland China and GitHub is slow, the README points to the Gitee release page instead.

The Homebrew command is a single line against a third-party tap, not homebrew-core:

```bash
brew install bigwig-club/brew/upic --cask
```

After launching the app, the README has a step that people skip and then wonder why nothing works. uPic needs Full Disk Access. The README says to make sure the app has it, and that it is authorized in Preferences, under Advanced. Without that permission, screenshot and file access paths will fail in ways that look like the app is broken rather than blocked.

Once permission is granted, the first real use is a screenshot upload. Assign a global shortcut in the shortcuts preferences pane, take a screenshot, and the menu bar shows the upload progressing. When it finishes, the link is on your clipboard in the format you selected. If you configured Markdown output, you can paste straight into a post. If the paste produces a bare URL when you wanted Markdown, that is a format setting, not an upload failure, and the upload history screen will show the entry either way.

## The version split is the real limitation

The most consequential thing about uPic is not a missing feature. It is that the README tells you plainly that non-App Store installs are frozen at v0.21.1 while the App Store build moves on. That creates a fork in the user base with no documented reconciliation. If you install from Homebrew because you prefer managing software that way, you are on a 2020 build. If you build from source, you are on whatever master contains, which the README describes as something you can pull and compile yourself, with no statement about whether that matches the App Store version.

The README does not document a migration path between the two, and it does not say what changed after v0.21.1. Release notes for the App Store line are not in the repository. So a user evaluating uPic cannot tell from the repository alone whether the App Store build fixes something they care about, or whether the older build is simply the last one that was packaged for direct distribution.

There is a second, quieter constraint. uPic is macOS-only, and the README's own software recommendation points to Bob, another macOS app. Nothing in the repository suggests a Linux or Windows client. If your team is mixed-platform, this tool covers one platform and the rest of the team keeps doing the manual clipboard dance.

Finally, the maintenance picture needs care. The repository is not archived and the last push was on 2026-06-12, so commits are still landing. But the release tags stopped in 2020, and the README's own install instructions admit that the downloadable artifacts are old. Recent commits and a current release are not the same thing, and for a tool you install rather than build, the release line is what you actually get.

## uPic against the command line tools you already have

The obvious alternative is not another GUI uploader. It is a shell script wrapping the provider's CLI, or an S3-compatible client such as aws-cli or mc with a shell function bound to a hotkey. The difference in approach is real. A script gives you exactly the behavior you wrote, versioned in your dotfiles, testable, and portable to Linux. It also gives you nothing else: no menu bar progress, no drag and drop onto a status bar, no share extension in Finder, no upload history screen, and no built-in formatting of the resulting link as Markdown or HTML. You would be writing the clipboard handling and the link formatting yourself.

A second alternative is a screenshot tool with upload built in, where the capture and the upload are one gesture rather than two. uPic's model is closer to a general file uploader that happens to support screenshots well, which is broader but means the capture step is handled by macOS rather than by uPic.

The honest split is this. If your upload destinations are one or two and you live in a terminal, a script around your provider's CLI is less machinery and easier to audit. uPic earns its place when you want the same upload action available from Finder, from the clipboard, from a global shortcut and from the command line, all writing to a destination you configured once. The share extension and the drag-to-status-bar paths have no equivalent in a shell script without extra work.

## Licence, upgrade cost, and what the Apache-2.0 label does not cover

The repository carries an Apache-2.0 licence, and the LICENSE file is at the top level. That covers the source in the repository. It does not automatically describe the App Store binary, which is a separate distribution channel with its own terms, and the README does not discuss how the two relate. If your organization cares about which artefact you are running, that distinction is worth resolving with the project rather than assuming the repository licence settles it. This is a description of what the repository states, not legal advice.

Upgrade cost depends entirely on which channel you chose. Homebrew and release-download users are pinned at v0.21.1 with no newer tag to move to, so upgrading means changing channels, either to the App Store build or to a self-compiled binary from master. Self-compiling means tracking a Swift/Xcode project, which the repository layout confirms is an Xcode project with a share extension target. That is a heavier maintenance commitment than a package upgrade, and the README's ReleaseTutorial.md is the file to read before attempting it.

Configuration is the other migration surface. Each host you configured in uPic holds credentials and endpoint settings. The README does not document an export or import format for that configuration, so treat the cost of re-entering your hosts as part of any channel switch.

## Conclusion

Adopt uPic if you are on macOS, you already have storage with one of the listed providers or a custom endpoint, and you want the same upload action reachable from Finder, the clipboard, a global shortcut and the command line. Skip it if you work across platforms, if you prefer a script you can version and audit, or if running a binary frozen at v0.21.1 is unacceptable. Before installing, decide which channel you are committing to, because the README states that only the App Store build is current while Homebrew and the release downloads stay at v0.21.1, and check whether the App Store build is available in your region's storefront.

## FAQ

### How do I install uPic on macOS?

The README gives three routes: the App Store, which it says is the only current version, a Homebrew cask at bigwig-club/brew/upic, and a download from the GitHub or Gitee release pages. The Homebrew and release routes stay at v0.21.1, while the App Store build is the one that keeps moving.

### Which image hosts does uPic support?

The README lists smms, UPYUN USS, Qiniu KODO, Aliyun OSS, Tencent Cloud COS, Baidu Cloud BOS, Weibo, GitHub, Gitee, Amazon S3 and Imgur, plus a custom upload API for anything else. The custom API option is documented on the project's blog rather than in the README.

### Why does uPic need Full Disk Access?

The README's installation section includes a check for system share permission and says the app must have Full Disk Access, authorized in Preferences under Advanced. Without it, the file and screenshot paths the app relies on will not work.

## Sources

- [gee1k/uPic on GitHub](https://github.com/gee1k/uPic)
- [License: Apache-2.0](https://github.com/gee1k/uPic/blob/master/LICENSE)
- [Project website](https://blog.svend.cc/upic)
- [README](https://github.com/gee1k/uPic/blob/master/README.md)
- [Releases](https://github.com/gee1k/uPic/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/gee1k-upic
