<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.datagirl.xyz/w/index.php?action=history&amp;feed=atom&amp;title=Make_Anything_Into_an_App_on_macOS</id>
	<title>Make Anything Into an App on macOS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.datagirl.xyz/w/index.php?action=history&amp;feed=atom&amp;title=Make_Anything_Into_an_App_on_macOS"/>
	<link rel="alternate" type="text/html" href="https://wiki.datagirl.xyz/w/index.php?title=Make_Anything_Into_an_App_on_macOS&amp;action=history"/>
	<updated>2026-06-02T21:05:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki.datagirl.xyz/w/index.php?title=Make_Anything_Into_an_App_on_macOS&amp;diff=204&amp;oldid=prev</id>
		<title>Flurry: Created page with &quot;If you've used macOS/MacOSX and never poked around the structure of an App, I have some mind-blowing information for you: it's just a folder. A folder with more folders, in fact!  == How macOS Apps Work ==  The basic structure of a macOS app is a-like so:  &lt;syntaxhighlight lang=&quot;text&quot;&gt; - MyCool.app/   + Contents/     + Info.plist     + MacOS/       + CoolApp     + Resources/       + AppIcon.icns       + SomeOtherJunk.txt  &lt;/syntaxhighlight&gt;  This isn't just specific to a...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.datagirl.xyz/w/index.php?title=Make_Anything_Into_an_App_on_macOS&amp;diff=204&amp;oldid=prev"/>
		<updated>2023-04-17T05:10:08Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;If you&amp;#039;ve used macOS/MacOSX and never poked around the structure of an App, I have some mind-blowing information for you: it&amp;#039;s just a folder. A folder with more folders, in fact!  == How macOS Apps Work ==  The basic structure of a macOS app is a-like so:  &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; - MyCool.app/   + Contents/     + Info.plist     + MacOS/       + CoolApp     + Resources/       + AppIcon.icns       + SomeOtherJunk.txt  &amp;lt;/syntaxhighlight&amp;gt;  This isn&amp;#039;t just specific to a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;If you've used macOS/MacOSX and never poked around the structure of an App, I have some mind-blowing information for you: it's just a folder. A folder with more folders, in fact!&lt;br /&gt;
&lt;br /&gt;
== How macOS Apps Work ==&lt;br /&gt;
&lt;br /&gt;
The basic structure of a macOS app is a-like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
- MyCool.app/&lt;br /&gt;
  + Contents/&lt;br /&gt;
    + Info.plist&lt;br /&gt;
    + MacOS/&lt;br /&gt;
      + CoolApp&lt;br /&gt;
    + Resources/&lt;br /&gt;
      + AppIcon.icns&lt;br /&gt;
      + SomeOtherJunk.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This isn't just specific to applications! Kernel extensions, some plugins, and frameworks also follow this &amp;quot;actually a directory&amp;quot; format. These are called Bundles.&amp;lt;ref&amp;gt;[https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html ''About Bundles''], from the Bundle Programming Guide by Apple.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components of an App Bundle ==&lt;br /&gt;
&lt;br /&gt;
=== Info.plist ===&lt;br /&gt;
&lt;br /&gt;
The core component to a bundle is its &amp;lt;code&amp;gt;Info.plist&amp;lt;/code&amp;gt;. All usable keys are provided in Apple Developer docs&amp;lt;ref&amp;gt;[https://developer.apple.com/documentation/bundleresources/information_property_list/bundle_configuration ''Bundle configuration''], from Apple Developer Documentation.&amp;lt;/ref&amp;gt;, but these should get you started:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dict&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;xyz.datagirl.cool-app&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!-- arbitrary, set by Xcode. prolly don't change it --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleInfoDictionaryVersion&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;6.0&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!--&lt;br /&gt;
         This can only be up to 15 characters! Use CFBundleDisplayName if you&lt;br /&gt;
         need a longer version for Siri and the sort.&lt;br /&gt;
      --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleName&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;CoolApp&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleVersion&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;1.0.69&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!-- relative to Resources/ --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleIconFile&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;AppIcon.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleIconName&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;AppIcon&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!-- relative to MacOS/. technically should be the same as your .app name --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundleExecutable&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;CoolApp&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!-- APPL = we're an App --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;CFBundlePackageType&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;string&amp;gt;APPL&amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Do we support Retina? (idk if this matters for our purposes) --&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;NSHighResolutionCapable&amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;true/&amp;gt;&lt;br /&gt;
&amp;lt;/dict&amp;gt;&lt;br /&gt;
&amp;lt;/plist&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The program itself ===&lt;br /&gt;
&lt;br /&gt;
Make a program named the same as what you set &amp;lt;code&amp;gt;CFBundleExecutable&amp;lt;/code&amp;gt; to in your Info.plist. This can be a macOS binary, or interpreted code, such as a shell script. You'll need to make sure it's executable, of course. Save it to the &amp;lt;code&amp;gt;Contents/MacOS&amp;lt;/code&amp;gt; directory in your app.&lt;br /&gt;
&lt;br /&gt;
=== App Icon ===&lt;br /&gt;
&lt;br /&gt;
Generating an ICNS file is an exercise left to the reader.&amp;lt;ref&amp;gt;But [https://gist.github.com/jamieweavis/b4c394607641e1280d447deed5fc85fc this gist] worked well for me.&amp;lt;/ref&amp;gt; Once you have it, save it with the same name you set as &amp;lt;code&amp;gt;CFBundleIconFile&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;Contents/Resources&amp;lt;/code&amp;gt; directory in your app.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flurry</name></author>
	</entry>
</feed>