<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: András Tokodi</title>
    <description>The latest articles on DEV Community by András Tokodi (@atokodi).</description>
    <link>https://dev.to/atokodi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2905589%2F4f7c2619-f6c8-41cf-9cd9-6f39b56d245b.jpg</url>
      <title>DEV Community: András Tokodi</title>
      <link>https://dev.to/atokodi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atokodi"/>
    <language>en</language>
    <item>
      <title>My Journey to Sign and Notarize Chromium on macOS</title>
      <dc:creator>András Tokodi</dc:creator>
      <pubDate>Wed, 04 Jun 2025 13:17:39 +0000</pubDate>
      <link>https://dev.to/atokodi/my-journey-to-sign-and-notarize-chromium-on-macos-5cd1</link>
      <guid>https://dev.to/atokodi/my-journey-to-sign-and-notarize-chromium-on-macos-5cd1</guid>
      <description>&lt;p&gt;Code signing and notarization on macOS sound simple — until you try doing it with a behemoth like Chromium. What began as a straightforward attempt to distribute a custom Chromium build quickly spiraled into a maze of entitlements, hardened runtime quirks, and elusive Apple error codes. In this post, I’ll share the pitfalls, gotchas, and hard-won lessons from my (ongoing) battle to get a Chromium build signed and notarized for macOS. If you're heading down this path yourself, consider this your warning—and maybe your roadmap.&lt;/p&gt;

&lt;p&gt;With standard Xcode projects, signing and notarization are mostly automated — you tweak a few settings, hit "Archive," and let Xcode handle the rest. Unfortunately, Chromium doesn’t play by those rules. It uses its own custom build system based on &lt;code&gt;gn&lt;/code&gt; and &lt;code&gt;ninja&lt;/code&gt;, which completely bypasses Xcode. That means you’re on your own when it comes to manually configuring code signing, setting entitlements, and preparing the app for Apple’s notarization service. Your only real option is to replicate what Xcode does—painstakingly — using command-line tools like &lt;code&gt;codesign&lt;/code&gt;, &lt;code&gt;spctl&lt;/code&gt;, and &lt;code&gt;xcrun altool&lt;/code&gt; or &lt;code&gt;notarytool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Luckily, there are some scripts in the Chromium repo that help with signing and notarizing, but they’re not exactly beginner-friendly. Documentation is sparse, and if you try googling for answers, you’ll mostly find outdated threads or vague references with little actionable detail. There is an &lt;a href="https://chromium.googlesource.com/chromium/src/+/main/docs/mac_build_instructions.md" rel="noopener noreferrer"&gt;official Mac build instructions guide&lt;/a&gt;, which is helpful for getting the Chromium source compiled—but it stops short of explaining how to create an installer or package the final app into a DMG.&lt;/p&gt;

&lt;p&gt;For that, Chromium has a separate build target located in &lt;code&gt;chrome/installer/mac&lt;/code&gt;. To build it, you can run the following command from your Chromium source root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;autoninja -C out/Release chrome/installer/mac
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;chrome/installer/mac&lt;/code&gt; target doesn’t just spit out a &lt;code&gt;DMG&lt;/code&gt; — it creates a &lt;code&gt;Chromium Packaging&lt;/code&gt; directory under your build output, which includes several helper tools and scripts for signing and building an installer. There’s also a &lt;a href="https://source.chromium.org/chromium/chromium/src/+/main:chrome/installer/mac/signing/README.md" rel="noopener noreferrer"&gt;README on signing&lt;/a&gt; tucked in there that’s worth reading, though like much of Chromium’s infrastructure, it assumes a fair bit of prior knowledge.&lt;/p&gt;

&lt;p&gt;From this directory, I ended up using two scripts as part of my packaging workflow. The built &lt;code&gt;.app&lt;/code&gt; is almost a gigabyte, which makes it a pain to share directly. To create a more manageable &lt;code&gt;.dmg&lt;/code&gt;, I used the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;out/Mac/Chromium\ Packaging/pkg-dmg --source out/Mac/Chromium.app/ --target out/Mac/Chromium.dmg --sourcefile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting &lt;code&gt;DMG&lt;/code&gt; is much smaller than the raw app bundle, making it easier to distribute. However, don’t celebrate just yet — if you try to share that &lt;code&gt;DMG&lt;/code&gt; with coworkers or testers, it will likely trigger macOS security errors due to it not being signed or notarized. The ugly workaround? Recipients can manually strip the quarantine flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xattr -rd com.apple.quarantine Chromium.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sure, it works — but let’s face it, asking people to run terminal commands just to open your app isn’t exactly user-friendly or secure.&lt;/p&gt;

&lt;p&gt;So what’s the proper solution? The answer is &lt;code&gt;sign_chrome.py&lt;/code&gt; — a script built specifically to handle the complexities of signing Chromium properly. But before you can even think about running it, you’ll need to deal with the most dreaded part of the process: Apple certificates and provisioning.&lt;/p&gt;

&lt;p&gt;First, you must be enrolled in the Apple Developer Program and have an active developer account. Without that, none of the signing or notarization steps will work. Once you're in, you need to obtain a signing certificate. The easiest way to do that is via Xcode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Xcode &amp;gt; Settings &amp;gt; Accounts&lt;/li&gt;
&lt;li&gt;Select your team&lt;/li&gt;
&lt;li&gt;Click Manage Certificates&lt;/li&gt;
&lt;li&gt;Add a new "Apple Development" certificate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once added, verify the certificate is available by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;security find-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 1) ABC123... "Apple Development: Your Name (TEAMID)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This identity will be used for signing. For notarization you’ll need an App Store Connect credential. Apple has &lt;a href="https://developer.apple.com/documentation/security/customizing-the-notarization-workflow#Upload-your-app-to-the-notarization-service" rel="noopener noreferrer"&gt;official documentation on notarization&lt;/a&gt;, but here’s the condensed version for Chromium:&lt;/p&gt;

&lt;p&gt;First, you need to store credentials for &lt;code&gt;notarytool&lt;/code&gt;. This means generating a one-time app-specific password from your Apple account (under the “Manage” tab) and running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
xcrun notarytool store-credentials "notarytool-password" \
  --apple-id "&amp;lt;your developer email&amp;gt;" \
  --team-id "TEAMID" \
  --password "&amp;lt;your app-specific password&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once your credentials are stored, you're ready to both sign and notarize your build in one go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;out/Mac/Chromium\ Packaging/sign_chrome.py \
  --identity "Apple Development: Your Name (TEAMID)" \
  --development \
  --input out/Mac/ \
  --output out/Mac/packaged \
  --notarize \
  --notary-arg="--keychain-profile" \
  --notary-arg="notarytool-password"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more options or debugging, you can run the script with --help.&lt;/p&gt;

&lt;p&gt;At this point, the script will handle the full signing flow and send the app off to Apple for notarization. It might take a few minutes, so grab a coffee and let it do its thing. Once it finishes, you’ll have a fully signed and notarized Chromium build — finally ready to share with others without triggering macOS security alarms.&lt;/p&gt;

&lt;p&gt;So that’s the story of how I wrangled Chromium into a signed and notarized macOS app—wading through sparse documentation, quirky tooling, and the ever-painful Apple developer portal. It took trial, error, and way too much coffee, but the end result is a shareable, properly notarized Chromium build that macOS won’t immediately quarantine. Of course, the struggle doesn’t end here — next up, I dive into the equally delightful process of uploading a Chromium-based Android App Bundle (AAB) to the Play Console, while juggling multiple ABIs. Stay tuned.&lt;/p&gt;

</description>
      <category>chromium</category>
    </item>
    <item>
      <title>Navigating the Chromium Maze</title>
      <dc:creator>András Tokodi</dc:creator>
      <pubDate>Mon, 03 Mar 2025 21:19:36 +0000</pubDate>
      <link>https://dev.to/atokodi/navigating-the-chromium-maze-352i</link>
      <guid>https://dev.to/atokodi/navigating-the-chromium-maze-352i</guid>
      <description>&lt;p&gt;This is the first entry in what I hope will be a useful and ongoing chronicle of my journey into Chromium development. Also, this is my first time writing an online blog! I plan to publish multiple posts on different topics, all revolving around Chromium.&lt;/p&gt;

&lt;p&gt;The main reason I started using dev.to is that I wanted a place to document the different aspects of Chromium I’ve worked on so that valuable insights don’t fade with time. Chromium is a massive, complex project, and the learning curve can be steep. By writing things down, I can solidify my own understanding and create a reference I can return to later.&lt;/p&gt;

&lt;p&gt;Beyond that, I secretly hope to find a community where we can discuss these topics and share our thoughts.&lt;/p&gt;

&lt;p&gt;Additionally, writing posts like these pushes me out of my comfort zone and makes me try things I don’t usually do—like expressing myself through words to other people. I never realized how hard writing is...&lt;/p&gt;

&lt;p&gt;Here are some topics I plan to cover in future posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rebranding Chromium&lt;/li&gt;
&lt;li&gt;Pre-bundle extensions for Chromium&lt;/li&gt;
&lt;li&gt;Implementing custom web UIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are areas I’ve recently worked on, and I want to make notes on while the thought are still fresh. I’ve been working with Chromium for over four years now, so in the future, I may dive into more complex topics and specific aspects of the Chromium codebase.&lt;/p&gt;

&lt;p&gt;If you're interested in browser development, open-source contributions, or just the inner workings of one of the most widely used browsers in the world, I hope you’ll find something valuable here.&lt;/p&gt;

&lt;p&gt;This is just the beginning—stay tuned!&lt;/p&gt;

</description>
      <category>chromium</category>
    </item>
  </channel>
</rss>
