Skip to content

Instantly share code, notes, and snippets.

@mathiasbynens
Forked from subtleGradient/appify
Created November 12, 2010 13:46
Show Gist options
  • Save mathiasbynens/674099 to your computer and use it in GitHub Desktop.
Save mathiasbynens/674099 to your computer and use it in GitHub Desktop.
appify — create the simplest possible Mac app from a shell script
#!/bin/bash
if [ "$1" = "-h" -o "$1" = "--help" -o -z "$1" ]; then cat <<EOF
appify v3.0.1 for Mac OS X - http://mths.be/appify
Creates the simplest possible Mac app from a shell script.
Appify takes a shell script as its first argument:
`basename "$0"` my-script.sh
Note that you cannot rename appified apps. If you want to give your app
a custom name, use the second argument:
`basename "$0"` my-script.sh "My App"
Copyright (c) Thomas Aylott <http://subtlegradient.com/>
Modified by Mathias Bynens <http://mathiasbynens.be/>
EOF
exit; fi
APPNAME=${2:-$(basename "$1" ".sh")}
DIR="$APPNAME.app/Contents/MacOS"
if [ -a "$APPNAME.app" ]; then
echo "$PWD/$APPNAME.app already exists :("
exit 1
fi
mkdir -p "$DIR"
cp "$1" "$DIR/$APPNAME"
chmod +x "$DIR/$APPNAME"
echo "$PWD/$APPNAME.app"
@jayfresh
Copy link

same error message as PacoH for me, unfortunately!

@bhanquier
Copy link

Same problem, the end result seems to be a PowerPC app. I guess it's just a matter of changing one of the triggers (?) but which one… If somebody has an idea, it would be great!

@jrmedd
Copy link

jrmedd commented Jan 19, 2015

I got around that PowerPC issue by ensuring that #!/bin/bash was at the top of my script ;)

@gregd49
Copy link

gregd49 commented Feb 28, 2015

Running on mac OSX 10.10.2
I had trouble with the powerpc error.
I had to add the #!/bin/bash line to my shell script as noted above.
I had to modify my plist to be correct as noted previously.
In particular I had to change CFBundleSignature from ???? to a 4 character string.
It then worked for me.

@davidfavor
Copy link

Can someone post a simple .plist file that does the following...

  1. Allows App to be a drag + drop target.

  2. Passes dropped files into script $* to allow files to be dropped on App.

I'll also look around + if I find a good example, post it here.

Thanks.

@andreif
Copy link

andreif commented Jun 6, 2015

I made it to work on OS X 10.10 by adding file $APPNAME.app/Contents/Info.plist containing <plist><dict></dict></plist>

@andreif
Copy link

andreif commented Jun 6, 2015

@mathew-kurian
Copy link

Neat idea. However, what directory does the script run in so that I can use relative paths?

@CosmicWebServices
Copy link

-bash: /Users/--------/Desktop/appify.sh: Permission denied

@nueh
Copy link

nueh commented Jul 21, 2015

@CosmicWebServices
chmod +x /Users/--------/Desktop/appify.sh

@drew1kun
Copy link

OS X 10.10.5: You can’t open the application “My App.app” because it is not supported on this type of Mac
😞

adding the Info.plist with next content didn't help:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>MyApp</string>
    <key>CFBundleGetInfoString</key>
    <string>MyApp</string>
    <key>CFBundleIconFile</key>
    <string>MyApp</string>
    <key>CFBundleName</key>
    <string>MyApp</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
</dict>
</plist>

Any ideas how to make it work on Yosemite?

@tilo
Copy link

tilo commented Nov 12, 2015

+1 any idea on how to make this work on OS X 10.10 or higher?
I'm not familiar with the OS X plists internals... could somebody please post a working example?

@tilo
Copy link

tilo commented Nov 12, 2015

I worked for me after I ran this: /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f MyAppName.app

@yvanin
Copy link

yvanin commented Jul 26, 2016

It started working (OS X 10.11.2) when I changed #!/bin/bash to #!/usr/bin/env bash at the first line of my .sh script

@holacode
Copy link

holacode commented Aug 6, 2016

use this awesome utility for creating .app package no error related to power pc
http://sveinbjorn.org/platypus

@pelizza
Copy link

pelizza commented Aug 8, 2016

Hey guys,

Just put the correct shebang on your .sh file and everything will work fine. For instance: #!/bin/bash.
Also, don't forget to add execution permission for your .sh file: chmod +x myFile.sh.
With these steps, there is no PowerPC error :)

@davidroettger
Copy link

Hi,
my script looks like this

#!/bin/bash
cd /Users/dr/Documents/Leo/leo-editor
python launchLeo.py

and i added the execution permission for my .sh file.

The applified application dies immediately and I see the following entry in the console log:

15/08/16 12:52:55,087 com.apple.xpc.launchd[1]: (com.apple.xpc.launchd.oneshot.0x10000046.leo[12195]) Service exited with abnormal code: 1

os is 10.11.5

@labor4
Copy link

labor4 commented Nov 21, 2016

here's a hack to make it open in Mac Terminal:
https://github.com/labor4/ya-appify

@oubiwann
Copy link

oubiwann commented Dec 9, 2016

I forked this and added option-parsing, overridable icons file, and some other bits: https://gist.github.com/oubiwann/453744744da1141ccc542ff75b47e0cf

@aleclarson
Copy link

aleclarson commented Jul 26, 2017

Trying to run Electron without using electron-packager.

I can get open MyApp.app in the Terminal to work.

But not when I double-click from the Finder, or right-click and select "Open".

Here are the repro steps:

  • Create MyApp.app/Contents/MacOS/MyApp
  • Modify the shell script:
#!/bin/bash
cd $(dirname "$0")/../../..
./node_modules/.bin/electron .
  • Call chmod +x MyApp.app/Contents/MacOS/MyApp
  • Confirm open MyApp.app works as intended
  • Confirm double-clicking in the Finder does nothing

Any help would be awesome.

Edit

Looks like it wasn't working because node_modules/.bin/electron spawns a child process.

This works as intended:

../node_modules/electron/dist/Electron.app/Contents/MacOS/Electron .

@Panther22881
Copy link

can any one help???
im only new to mac and command line entry im trying to see if any on can turn 2 commands into a ON / OFF switch/toggle? that i can just click to open from desktop or something with a status icon so you know it on or off

ON:
"sudo pmset -b sleep 0; sudo pmset -b disablesleep 1"

OFF:
sudo pmset -b sleep 5; sudo pmset -b disablesleep 0

@willbprog127
Copy link

willbprog127 commented Mar 30, 2018

Thanks so much for this!

I tried the Automater way of doing it, but it wasn't ideal. After removing the parameter variable from my command ("$@"), it worked fine...the applified app wouldn't launch with it there.

@Geri-Borbas
Copy link

Adding plist and make sure that schell scripts and plist values have the same name as the app made it work fine.

@thedzy
Copy link

thedzy commented Oct 21, 2018

You can grab out of my frameworks and just edit the script continained.
https://github.com/thedzy/Run-script-as-an-Applicaiton

@dlpigpen
Copy link

How to add icon to this mac app generated?

@timelessthee
Copy link

You can grab out of my frameworks and just edit the script continained.
https://github.com/thedzy/Run-script-as-an-Applicaiton

Thank you for this. Much appreciated.

@Inthenew
Copy link

don't do /Users/--------/Desktop/appify.sh: Permission denied
instead do sh /Users/--------/Desktop/appify.sh

@mgdmdz
Copy link

mgdmdz commented Jul 28, 2022

Hi, is there an option to run the app as hidden?

@80N35
Copy link

80N35 commented Aug 3, 2022

This is the only "appify" script that is working on Catalina. Thanks, friend. Do you want to fork Conky-Mac with me. I have great configs but really haven't done serious code since the 90's in LA.

@craigfrancis
Copy link

On an ARM64 Mac, it kept prompting me to install Rosetta; adding the LSArchitecturePriority to the /Contents/Info.plist seems to work (although this is cached somehow, so I had to change the CFBundleIdentifier to get Rosetta to check again):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleExecutable</key>
	<string>run</string>
	<key>CFBundleIdentifier</key>
	<string>com.testing</string>
	<key>LSArchitecturePriority</key>
	<array>
		<string>arm64</string>
	</array>
	<key>LSRequiresNativeExecution</key>
	<true/>
</dict>
</plist>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment