CLI tool
sveinbjornt/Platypus avatar
sveinbjornt/Platypus

Platypus: the version number lives in an Info.plist key, and the default build is unsigned

Create native macOS applications from command line scripts.

3,463 stars198 forksObjective-CBSD-3-Clause

At a glance

What is it?
Platypus wraps a script interpreter into a native macOS application bundle. Its makefile reads the version out of a plist rather than a tag, its CI recipe is pinned to one release and runs a script as root, and the page rates its own output in adjectives rather than numbers.
Who is it for?
Adequate fit: a macOS team that has scripts already and wants them handed to non-technical colleagues as ordinary application bundles, with a choice of progress bar, text window, web view, status menu or droplet front ends. Poor fit: anyone who needs a reproducible release pipeline without pinning every step by hand, since the version comes out of a plist key and the CI install recipe is hardcoded to v5.5.0.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Activity is slowing. The repository last received commits 6 months ago.
What is it written in?
Mainly Objective-C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • sveinbjornt/Platypus3,463 ★ · +12
Star history
Repository2026-09-242026-11-14
sveinbjornt/Platypus3.5k3.5k

12 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

make build_unsigned is the default, and the version comes out of a plist

`make build_unsigned` is what you get from the makefile with no target at all, because the default rule is `all: build_unsigned`. The unsigned word is not decoration: a separate `release` rule depends on `build_signed`, `archives`, `sparkle` and `size`, so signing and archiving live on a different path from the one the front page tells you to use.

bash
$ make build_unsigned

The version number is not in the makefile. `VERSION` is produced by shelling out to `/usr/libexec/PlistBuddy` and printing the `CFBundleShortVersionString` key out of `Application/Resources/Platypus-Info.plist`, and `APP_NAME` is read the same way from `CFBundleName` in the same file. Archive names are assembled from those two, a lowercased app name plus the version, once for the app zip and once for a source zip. So the plist inside the repository is the one place a release number has to be edited, and a build from an uncommitted working copy quietly takes whatever that key says. The clean rule names three schemes: one derived from the app name, one called `platypus_clt`, and one called `ScriptExec`.

The CI recipe pins v5.5.0 and runs a shell script as root

The command line tool has its own installation recipe, written for a build machine, and it is tied to one release. Four lines do the work:

bash
curl -L -O https://github.com/sveinbjornt/Platypus/releases/download/v5.5.0/platypus5.5.0.zip
unzip -q platypus5.5.0.zip
cd Platypus.app/Contents/Resources
sudo bash InstallCommandLineTool.sh

Three things stand out. The URL is a GitHub release asset whose filename carries the version, while the download link elsewhere on the same page points at a website path ending in `platypus.zip` with no version in the filename, so the two routes do not use the same name. The last line runs a script as root, because the binary lands in `/usr/local/bin/platypus`. And the version is written into the URL instead of being resolved, so a job running this recipe stays on v5.5.0 until a person edits the line.

Two lists of supported interpreters, and they are not the same list

Two lists of interpreters appear on this page and they differ. The opening paragraph names shell scripts plus Python, Perl, Ruby, Tcl, JavaScript and PHP. The first bullet further down adds Swift, Expect, AWK, Dart and AppleScript, then closes with any other user-specified interpreter. AppleScript is the unusual name in that list, since it is the one language here that macOS itself knows how to run, which makes it a different kind of target from the rest. Underneath both lists the mechanism is identical for every entry: the script goes into an application bundle next to a small binary whose only job is to run it. That is also the whole of the wrapping story, and it is stated once, in the first paragraph, and not repeated in the feature list that follows. The rest of the tree splits along the same lines. The makefile treats `ScriptExec/` and `CLT/` as separate schemes, one for the runner binary and one named for the command line tool, with `Shared/` and `Icons/` beside them, and a `make_examples.pl` script at the repository root.

Slim, speedy, fast, responsive: four adjectives and no figure

Three feature bullets make performance claims and one makes a size claim, and none of them carries a number. The generated apps are described as slim and speedy, launching and running quickly, and the tool itself as fast and responsive. Slim appears a fourth time in the opening paragraph, where the wrapper binary that runs the script is called slim. The only figure on the page is the 3.5 MB attached to the Platypus download itself, and that is the weight of the tool rather than of anything it produces. A reader comparing two ways of shipping a script therefore has no size and no timing figure to check the output against. The same bullet list is otherwise concrete, with lines about dropped files being passed to the script as arguments, URI scheme handlers, user notifications, background running and profiles for saved configurations.

The author says his beginner mistakes from 2003 are still in the structure

This project is unusually direct about its own code. A section set aside as notes on the code says the software dates back to the early days of Mac OS X, around 2003, when the author was first learning Objective-C and the Cocoa APIs. It says he made many beginner mistakes, and that some of them remain in the structure of the code. It goes on to say the software has been through dozens of significant versions since, that it has been patched and bugfixed, that it was moved over to modern Objective-C many years ago, and that it is not how he would write it today. The tree matches that account without needing the prose. Two source files sit at the repository root instead of inside a target directory, a `wip/` directory is committed at the top level, and a `TODO.md` sits next to a `CHANGES.md`.

Five interfaces named twice, described once, and never compared

Five user interfaces are named on this page, and they are named twice without ever being described. Under a screenshots heading there is a main window subheading, then five interface subheadings in a row: progress bar, text window, web view, status menu, droplet. Further down, under a heading about interfaces, the same five appear in a single sentence as five alternatives to select between. The only technical detail the page attaches to any of them lives in one feature bullet, which lists the same five again and says apps can display graphical feedback of script execution as a progress bar, a text window with script output, a droplet, WebKit HTML rendering, or a status item menu. That bullet is also the only place a rendering technology is named anywhere. Nothing tells a reader which interface suits which script. The shipped examples answer that question indirectly, in the only way the project offers. `Examples/` holds eighteen files carrying the `.platypus` extension, and the filenames pick out the cases: `ProgressBar.platypus`, `WebViewDroplet.platypus`, `SpeakDroplet.platypus` and `StatusMenuDemo.platypus` sit alongside `MacbethMenu.platypus`, `ProcessMenu.platypus` and `SysLoadMenu.platypus`. Each is a saved configuration rather than code, so what the page never says in prose, the directory listing implies.

Over 20 years of development, with three years between the last two point releases

The install section describes the project as free open source software that has been continuously developed and maintained for over 20 years, and the span is not in doubt: the license carries a copyright range starting at 2003. The release record is less continuous. Three recent tags are visible, v5.5.0 on 2025-12-02, v5.4.1 on 2022-10-22 and v5.4 on 2022-09-03, so more than three years separate the two most recent point releases, and the last push to the branch is dated 2026-05-13. Two links on the page are about getting older code rather than newer ones: an appcast XML feed for the updater, which the tree backs with a `Sparkle/` directory, and a page of old versions. The copyright range in the license text stops at 2025, a year short of that last push.

Editorial conclusion

Adequate fit: a macOS team that has scripts already and wants them handed to non-technical colleagues as ordinary application bundles, with a choice of progress bar, text window, web view, status menu or droplet front ends. Poor fit: anyone who needs a reproducible release pipeline without pinning every step by hand, since the version comes out of a plist key and the CI install recipe is hardcoded to v5.5.0. Four things are worth settling before adopting it. The last push to the branch is dated 2026-05-13 while the newest tag is v5.5.0 from 2025-12-02 and the one before it is more than three years older. The command line install script runs as root and writes into /usr/local/bin. The app generator can run scripts with root privileges through the macOS Security Framework, so that toggle deserves a look before any script is wrapped. And every speed and size claim on the page is an adjective with no figure attached. Nothing above was built or run.

Frequently asked questions

What does Platypus do?

It turns a command line script into a native macOS application by wrapping the script in an application bundle next to a small binary that runs it. Named interpreters include shell, Python, Perl, Ruby, PHP, Swift, Expect, Tcl, AWK, JavaScript, Dart and AppleScript, plus any interpreter you specify.

How do you build Platypus from source?

Run `make build_unsigned` from the repository root with the Xcode build tools installed, and the bundle lands in the `products` directory. The version and the app name are read out of `Application/Resources/Platypus-Info.plist` with PlistBuddy, so that plist is where the number is set.

How do you install the Platypus command line tool in CI?

Fetch the release asset with curl, unzip it, change into `Platypus.app/Contents/Resources`, then run `sudo bash InstallCommandLineTool.sh`. The recipe hardcodes the v5.5.0 tag, and the binary is installed to `/usr/local/bin/platypus`.

What macOS version does Platypus require?

The download link describes a Universal ARM and Intel 64-bit app for macOS 11 or later, Developer ID signed and notarized, at about 3.5 MB.

What are the most recent Platypus releases?

v5.5.0 on 2025-12-02, followed by v5.4.1 on 2022-10-22 and v5.4 on 2022-09-03. The repository is not archived and its last push is dated 2026-05-13. The license is BSD-3-Clause with a copyright range of 2003 to 2025.

Official sources

  1. License: BSD-3-Clause
  2. Project website
  3. README
  4. Releases
  5. sveinbjornt/Platypus on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sveinbjornt-platypus.svg)](https://hysenlabs.com/projects/sveinbjornt-platypus)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/sveinbjornt-platypus.svg)](https://hysenlabs.com/projects/sveinbjornt-platypus)

Was this useful?