<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MacOS on yshalsager</title><link>https://yshalsager.com/en/tags/macos/</link><description>Recent content in MacOS on yshalsager</description><generator>Hugo</generator><language>en-US</language><copyright>Copyright © 2013-2026 yshalsager. All Rights Reserved.</copyright><lastBuildDate>Tue, 11 Aug 2026 11:48:56 +0300</lastBuildDate><atom:link href="https://yshalsager.com/en/tags/macos/index.xml" rel="self" type="application/rss+xml"/><item><title>Managing macOS apps with mise</title><link>https://yshalsager.com/en/posts/managing-macos-apps-with-mise/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://yshalsager.com/en/posts/managing-macos-apps-with-mise/</guid><description>&lt;p>&lt;a
 href="https://mise.jdx.dev/"
 
 target="_blank" rel="noopener noreferrer">mise&lt;/a> is a fast, flexible tool manager that can install and keep development tools in sync across machines. Its GitHub backend can also download arbitrary release assets, making it useful for managing macOS applications alongside your usual command-line tools.&lt;/p>
&lt;p>mise downloads GitHub release assets, but it does not install DMG applications into &lt;code>/Applications&lt;/code>. Add this custom global task to &lt;code>~/.config/mise/config.toml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tasks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="s2">&amp;#34;macos:install-dmg-app&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">&lt;span class="nx">hide&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="nx">run&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="s1">set -euo pipefail
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="s1">install_path=&amp;#34;${MISE_TOOL_INSTALL_PATH:?MISE_TOOL_INSTALL_PATH is required}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="s1">dmg_pattern=&amp;#34;${MACOS_DMG_PATTERN:-*.dmg}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="s1">app_pattern=&amp;#34;${MACOS_APP_PATTERN:-*.app}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="s1">dmg=&amp;#34;$(find &amp;#34;$install_path&amp;#34; -maxdepth 1 -name &amp;#34;$dmg_pattern&amp;#34; -type f -print -quit)&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">&lt;span class="s1">app_root=&amp;#34;$install_path&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">&lt;span class="s1">if [ -n &amp;#34;$dmg&amp;#34; ]; then
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl">&lt;span class="s1"> mount=&amp;#34;$(hdiutil attach &amp;#34;$dmg&amp;#34; -nobrowse -readonly |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl">&lt;span class="s1"> awk &amp;#39;&lt;/span>&lt;span class="err">/\/&lt;/span>&lt;span class="nx">Volumes&lt;/span>&lt;span class="err">\//&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="nx">print&lt;/span> &lt;span class="nx">substr&lt;/span>&lt;span class="err">($&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">index&lt;/span>&lt;span class="err">($&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;/Volumes/&amp;#34;&lt;/span>&lt;span class="err">));&lt;/span> &lt;span class="nx">exit&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="s1">&amp;#39;)&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl">&lt;span class="s1"> cleanup() {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl">&lt;span class="s1"> hdiutil detach &amp;#34;$mount&amp;#34; -quiet 2&amp;gt;/dev/null || true
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl">&lt;span class="s1"> trap cleanup EXIT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl">&lt;span class="s1"> app_root=&amp;#34;$mount&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl">&lt;span class="s1">fi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">24&lt;/span>&lt;span class="cl">&lt;span class="s1">app=&amp;#34;$(find &amp;#34;$app_root&amp;#34; -maxdepth 1 -name &amp;#34;$app_pattern&amp;#34; -type d -print -quit)&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">25&lt;/span>&lt;span class="cl">&lt;span class="s1">[ -n &amp;#34;$app&amp;#34; ] || { echo &amp;#34;No .app found in $app_root&amp;#34;; exit 1; }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">26&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">27&lt;/span>&lt;span class="cl">&lt;span class="s1">app_name=&amp;#34;${MACOS_APP_NAME:-$(basename &amp;#34;$app&amp;#34;)}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">28&lt;/span>&lt;span class="cl">&lt;span class="s1">case &amp;#34;$app_name&amp;#34; in
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">29&lt;/span>&lt;span class="cl">&lt;span class="s1"> *.app) ;;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">30&lt;/span>&lt;span class="cl">&lt;span class="s1"> *) app_name=&amp;#34;$app_name.app&amp;#34; ;;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">31&lt;/span>&lt;span class="cl">&lt;span class="s1">esac
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">32&lt;/span>&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">33&lt;/span>&lt;span class="cl">&lt;span class="s1">ditto &amp;#34;$app&amp;#34; &amp;#34;/Applications/$app_name&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">34&lt;/span>&lt;span class="cl">&lt;span class="s1">&amp;#39;&amp;#39;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then declare apps using mise&amp;rsquo;s GitHub backend:&lt;/p></description></item></channel></rss>