<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Satisfies]]></title><description><![CDATA[My personal Substack]]></description><link>https://satisfies.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!vIx9!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ce9531-6db7-4ae0-a0ac-6dc2158cfef6_472x472.png</url><title>Satisfies</title><link>https://satisfies.dev</link></image><generator>Substack</generator><lastBuildDate>Sun, 19 Apr 2026 12:42:26 GMT</lastBuildDate><atom:link href="https://satisfies.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Wildan Zulfikar]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[satisfies@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[satisfies@substack.com]]></itunes:email><itunes:name><![CDATA[Wildan Zulfikar]]></itunes:name></itunes:owner><itunes:author><![CDATA[Wildan Zulfikar]]></itunes:author><googleplay:owner><![CDATA[satisfies@substack.com]]></googleplay:owner><googleplay:email><![CDATA[satisfies@substack.com]]></googleplay:email><googleplay:author><![CDATA[Wildan Zulfikar]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Speech to Text in Expo in 2026: SFSpeechRecognizer vs SFSpeechAnalyzer]]></title><description><![CDATA[A practical guide for Expo developers choosing between expo-speech-recognition and expo-speech-transcriber.]]></description><link>https://satisfies.dev/p/speech-to-text-in-expo-in-2026-sfspeechrecognize</link><guid isPermaLink="false">https://satisfies.dev/p/speech-to-text-in-expo-in-2026-sfspeechrecognize</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Fri, 13 Mar 2026 09:24:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vIx9!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ce9531-6db7-4ae0-a0ac-6dc2158cfef6_472x472.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you've tried to add real-time speech recognition to an Expo app, you've probably stumbled across two packages: <a href="https://github.com/jamsch/expo-speech-recognition">expo-speech-recognition</a>  and <a href="https://github.com/DaveyEke/expo-speech-transcriber">expo-speech-transcriber</a>. They sound nearly identical, but they are not! The big difference comes down to <em>which native Apple API each one wraps</em>, which has consequences for accuracy and platform coverage.</p><h3>Let&#8217;s break it down.</h3><p>Before comparing the packages, you need to understand what&#8217;s happening under the hood on iOS. Apple ships two distinct speech frameworks, <a href="https://developer.apple.com/documentation/speech/sfspeechrecognizer">SFSpeechRecognizer</a> and <a href="https://developer.apple.com/documentation/speech/speechanalyzer">SFSpeechAnalyzer</a>. What are they?</p><h4>SFSpeechRecognizer: the classic, supported in most versions</h4><p><code>SFSpeechRecognizer</code> has been around since iOS 10. It&#8217;s the same engine that powers Siri dictation. By default it <em>sends audio to Apple&#8217;s servers</em> for transcription, though an on-device mode was added in iOS 13. It supports both live microphone streaming and file-based recognition, and returns a rolling &#8220;best guess&#8221; transcript that gets revised as the user keeps speaking.</p><h4>SFSpeechAnalyzer: the new one</h4><p><code>SFSpeechAnalyzer</code> is a newer, higher-level API introduced in iOS 17. It&#8217;s Apple&#8217;s modern take on speech analysis and was designed for more structured, analytics-focused use cases. It offers better integration with the system and can return richer metadata alongside the transcription but it comes with stricter OS requirements.</p><p>Now let&#8217;s talk about the expo packages.</p><h4>expo-speech-recognition</h4><p>It wraps <code>SFSpeechRecognizer</code> on iOS and uses the <strong>SpeechRecognition Web API</strong> on Android (via the <code>android.speech.SpeechRecognizer</code> class) and on Web. Platform support:</p><ul><li><p>iOS: iOS 13+ recommended for on-device mode</p></li><li><p>Android: Requires Google app / Speech services</p></li><li><p>Web: Chromium-based browsers only</p></li></ul><h5>How it works</h5><p>You get a streaming experience where partial results come in as the user speaks. The API design closely mirrors the browser&#8217;s <code>SpeechRecognition</code> interface, so if you&#8217;ve worked with Web Speech API before, this will feel familiar. </p><p>Code example (simplified):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;d6602ecc-22d5-45f2-93f5-0e36d8b6c6b4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">import { useSpeechRecognitionEvent, ExpoSpeechRecognitionModule } from "expo-speech-recognition";

ExpoSpeechRecognitionModule.start({ lang: "en-US", interimResults: true });

useSpeechRecognitionEvent("result", (event) =&gt; {
  console.log(event.results[0]?.transcript); // live partial results
});</code></pre></div><h5>Result quality</h5><p>Decent. On iOS, when Apple&#8217;s cloud is involved, accuracy is solid for common vocabulary. On Android, quality heavily depends on the device and whether Google&#8217;s speech service is up to date, which can vary noticeably across manufacturers. Web support is Chromium-only, so Firefox and Safari users are out of luck.</p><h4>expo-speech-transcriber</h4><p>It wraps <code>SFSpeechAnalyzer</code>, so it&#8217;s only available for <strong>iOS 17+</strong>. This is the biggest trade off; if your app needs to run on Android, web, or iOS below iOS 17, this package won't work.</p><h5>How it works</h5><p><code>SFSpeechAnalyzer</code> takes a more structured approach. Rather than giving you a raw rolling transcript, it returns segmented results with higher confidence metadata. The API is cleaner and the results tend to be more stable, less &#8220;jumping around&#8221; while the user speaks.</p><p>Code example (simplified):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;95595f39-7939-40cf-b662-e0f8272522e4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">import * as SpeechTranscriber from "expo-speech-transcriber";

// Use the hook for realtime updates
const { text, isFinal, error, isRecording } =
  SpeechTranscriber.useRealTimeTranscription();

// Start transcription
await SpeechTranscriber.recordRealTimeAndTranscribe();

// Stop when done
SpeechTranscriber.stopListening();</code></pre></div><h5>Result quality</h5><p>Noticeably better on iOS 17+ devices. The transcription is more accurate out of the box, punctuation handling is improved, and the metadata you get alongside the transcript is richer. If your entire user base is on modern iPhones, this is the better experience.</p><h3>Which one should you to use?</h3><ul><li><p>Use expo-speech-recognition if your app targets Android, Web, and iOS versions below 17. In short, use this when you want the largest possible device coverage. The trade-off could be quality of the result, but it&#8217;s something you will need to test based on your use case.</p></li><li><p>Use expo-speech-transcriber if your app is iOS-only, only need to support iOS 17+, and you want to optimize for better transcription result. This can happen if you're building an app for enterprise iPhone users on managed devices, which you have some knowledge or even control on which version the devices are using. </p></li></ul><p>As of today (March 2026), both packages are actively maintained and easy to set up with Expo managed workflow. The &#8220;right&#8221; answer almost always comes down to your platform requirements first, then the accuracy. Hope it helps!</p>]]></content:encoded></item><item><title><![CDATA[From dev to devices: Understanding Expo Build Profiles]]></title><description><![CDATA[Writing it here because I keep forgetting about it.]]></description><link>https://satisfies.dev/p/expo-from-dev-to-devices</link><guid isPermaLink="false">https://satisfies.dev/p/expo-from-dev-to-devices</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Fri, 16 Jan 2026 15:27:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fNBR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In Expo you can use Expo Go or development build. In this post, we are only discussing about the development build. Let&#8217;s start off with a package.json file that contains the build scripts we&#8217;ll use:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fNBR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fNBR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 424w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 848w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 1272w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fNBR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png" width="825" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:825,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133750,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184761920?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fNBR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 424w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 848w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 1272w, https://substackcdn.com/image/fetch/$s_!fNBR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93ca956e-079a-49b0-b6d4-38327a30908c_825x499.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>1. Local development (simulator, hot reload)</strong></p><p>Command: <code>bun ios</code> or <code>bun android</code></p><p>This is what we use for day-to-day development and the simplest to get up and running. The command will start expo dev server, open the simulator, install the app if it&#8217;s not installed, and finally opens the app.</p><p><strong>2. Development build (device, hot reload, IPA/APK file)</strong></p><p>Command: <code>bun build:ios</code> or <code>bun build:android</code></p><p>Sometimes there are features that only work in real device, like notifications. To test the feature, we can run the app in real device while still connecting to Expo server that runs on our machine. The app will still have hot reload, and we can develop the app like usual. To be clear, even though you&#8217;ll have IPA/APK file from this, you can&#8217;t share it to other users (e.g. internal testers). The app will not run, as it needs to connect to your local Expo server. </p><p><strong>3. Preview build (device, no hot reload, for pre-release or QA, IPA/APK file)</strong></p><p>Command: <code>bun build:ios:preview</code> or <code>bun build:android:preview</code></p><p>When you&#8217;re done with a feature development, you can create a production-like build that you install in your device (or internal testers&#8217; devices). It doesn&#8217;t depend on Expo server, the app can use your production endpoints, and you don&#8217;t have to wait for approval from App Store or Play Store. Just run the build to create the IPA/APK file, share and download it to your device, then install.</p><p>With this build, it&#8217;s good to add some indicator, like in the name or the app icon. For example, if your app name is &#8220;My App&#8221;, then you want it to show as &#8220;My App (preview)&#8221; for the preview build. This way, the preview and production app can live side by side in your device. If you&#8217;re curious on how to do this, check the Expo documentation for &#8220;<a href="https://docs.expo.dev/build-reference/variants/">App Variants</a>&#8221;.</p><p><strong>4. Production build (device, no hot reload, for release or store submission, IPA/AAB file)</strong></p><p>Command: <code>bun build:ios:prod</code> or <code>bun build:android:prod</code></p><p>This is the release build that you can distribute to users. It should be nearly identical with the preview build (e.g. except for the app name suffix). Which means, you can be confident enough to run the build command for this and submit to app store, as long as you have tested the preview build. From here, the next step is to submit the app! With eas, you can run  <code>eas submit </code>and follow the steps.</p><p>&#8212;</p><p>That&#8217;s it! Those are the 4 different builds from development to distribution. It&#8217;s not definitive and you can tweak your <code>eas.json</code> and <code>package.json</code> file to customize. </p><blockquote><p>Bonus: The script also have <code>build:ios:prod-eas</code> and <code>build:android:prod-eas</code>. You can use it to run the build in eas instead of locally.</p></blockquote><p>P.S: for reference, here&#8217;s my <code>eas.json</code> where I define the different build profiles.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hlHC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hlHC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 424w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 848w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 1272w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png" width="459" height="1182" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1182,&quot;width&quot;:459,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106907,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184761920?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hlHC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 424w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 848w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 1272w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11bed43d-7348-4abe-a426-b5b1a3e8b560_459x1182.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Choosing Background Remover for Your AI Workflow]]></title><description><![CDATA[From web based to open source, I tested so you don't have to.]]></description><link>https://satisfies.dev/p/choosing-background-remover-for-your</link><guid isPermaLink="false">https://satisfies.dev/p/choosing-background-remover-for-your</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Mon, 12 Jan 2026 11:04:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LhFX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LhFX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LhFX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LhFX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:405345,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LhFX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LhFX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ee952bb-4dd6-446f-a831-3fbd75e7ed60_1200x630.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example image before and after background removal.</figcaption></figure></div><p>Let&#8217;s create an image first. I&#8217;ll use Gemini:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2NM2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2NM2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 424w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 848w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 1272w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2NM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png" width="628" height="698.9270588235294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:946,&quot;width&quot;:850,&quot;resizeWidth&quot;:628,&quot;bytes&quot;:267012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2NM2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 424w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 848w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 1272w, https://substackcdn.com/image/fetch/$s_!2NM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F875b2d5e-b685-4d55-b2b5-41e366151e31_850x946.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now let&#8217;s remove the background using different tools.</p><ol><li><p><a href="https://www.photoroom.com/tools/background-remover">Photoroom Background Remover</a>. Web based, free (no log in), very good result (smooth edges, text not removed).</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UtiA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UtiA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 424w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 848w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UtiA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png" width="1280" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:725190,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UtiA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 424w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 848w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!UtiA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F538117c6-25e0-450d-9ffc-198c5593fd61_1280x1280.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol start="2"><li><p>macOS &#8220;Remove Background&#8221; (built-in). Local, available by right-clicking an image, then &#8220;Quick Actions&#8221;, then &#8220;Remove Background&#8221;. It&#8217;s quick and convenient but very bad result (rough edges, text removed).</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5YVr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5YVr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5YVr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1413143,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5YVr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!5YVr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa500664-c2dd-469b-b47d-b10005ff900b_2048x2048.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol start="3"><li><p><a href="https://github.com/danielgatis/rembg">rembg</a>: open source, run from command line, can use different models. This is where it gets interesting. With the default model, the result is not desirable:</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5KNo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5KNo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5KNo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1295757,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5KNo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!5KNo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ee7f9d-757b-4a09-9b90-9e79e1041273_2048x2048.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example command: <code>rembg i input.png output.png</code></figcaption></figure></div><p>But by specifying different model <code>bria-rmbg</code>), the result can be as good as Photoroom:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cnB-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cnB-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cnB-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1360749,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183646880?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cnB-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!cnB-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6563a127-7c50-421c-a194-1a4cf644d995_2048x2048.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Use <code>-m</code> to specify model. Example: <code>rembg i -m bria-rmbg input.png output.png</code></figcaption></figure></div><p>For me, the result from rembg is sufficient for my workflow and since it runs locally, I can create custom Quick Actions using macOS Automator. </p><p>Pick an image, right click, rembg!</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a9393e29-f03b-4f55-8420-630245aaba32&quot;,&quot;duration&quot;:null}"></div><p>It can be slower than Photoroom (took ~20 seconds in my MacbookAir M4, 24GB) but that&#8217;s not a pain for me because I can leave it running in the background.</p>]]></content:encoded></item><item><title><![CDATA[The 3 App Kinds for Expo Development]]></title><description><![CDATA[TL;DR &#8211; development for local, preview for testers, production for app store submission.]]></description><link>https://satisfies.dev/p/the-3-app-kinds-for-expo-development</link><guid isPermaLink="false">https://satisfies.dev/p/the-3-app-kinds-for-expo-development</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Mon, 12 Jan 2026 10:04:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1u7o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1u7o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1u7o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1u7o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:462467,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184290530?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1u7o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1u7o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6561b220-c189-44a0-a293-5aa4aabbc559_1200x630.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You are building one app but in reality, you&#8217;ll interact with 3 different &#8220;kind&#8221; of your app. Each kind has different purpose, from local development to production. To understand the difference, let&#8217;s see it from multiple angles: supports hot reload, config, and build output. We&#8217;ll use <code>package.json</code> and <code>eas.json</code> from <a href="https://github.com/infinitered/ignite">React Native Ignite</a> boilerplate for reference.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!68M4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!68M4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 424w, https://substackcdn.com/image/fetch/$s_!68M4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 848w, https://substackcdn.com/image/fetch/$s_!68M4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 1272w, https://substackcdn.com/image/fetch/$s_!68M4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!68M4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png" width="1456" height="1016" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1016,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:572307,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184290530?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!68M4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 424w, https://substackcdn.com/image/fetch/$s_!68M4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 848w, https://substackcdn.com/image/fetch/$s_!68M4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 1272w, https://substackcdn.com/image/fetch/$s_!68M4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7de3c6-3c08-484b-9dfb-2b823e4b3065_1456x1016.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://github.com/infinitered/ignite/blob/56d3453f56f827992415fe233335e4f6021ae449/boilerplate/package.json">package.json</a> and <a href="https://github.com/infinitered/ignite/blob/56d3453f56f827992415fe233335e4f6021ae449/boilerplate/eas.json">eas.json</a> from Ignite Github repo.</figcaption></figure></div><ol><li><p>Development: supports hot reload, uses development config (i.e. connects to your local endpoints), and has no build output. This is what you get when running <code>expo run:ios</code> or <code>expo run:android</code>.<br>Use case: local development.<br>Alternatively, if you need to test the app in a real device, you can run the <code>build:ios:device</code> or <code>build:android:device</code> script which produces IPA/APK file that you can install in your device.<br>Use case: testing the app in real device, with development config and hot reload enabled.</p></li></ol><blockquote><p>Some features like push notification, camera, are not available in simulator and can only be tested in real devices. Hence the need for &#8220;development&#8221; build above.</p></blockquote><ol start="3"><li><p>Preview: no hot reload, uses production config (i.e. connects to your production endpoints), creates IPA/APK file. It&#8217;s similar like development app above except that it doesn&#8217;t need to connect to Expo (hence there&#8217;s no hot reload support). Command: <code>build:ios:preview </code>or <code>build:android:preview</code>.<br>Use case: QA before release (e.g. install in multiple testers&#8217; devices)</p></li><li><p>Production: no hot reload, uses production config, creates IPA/APK file. This is the one that you use for the app store submission. Command: <code>build:ios:prod</code> or <code>build:android:prod</code>.<br>Use case: submission to App Store or Play Store</p></li></ol><blockquote><p>When the app supports hot reload, it means it has to connect to Expo server in the same network. Which also means that you can&#8217;t use it for external testers.</p></blockquote><p>With this knowledge, we can enhance our development workflow by customizing the app (e.g. the app name) based on the kind. This strategy is referred to as &#8220;app variants&#8221; in Expo (<a href="https://docs.expo.dev/build-reference/variants/">docs</a>). Consider this snippet in Expo config (<code>app.config.ts</code>):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wp6j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wp6j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 424w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 848w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wp6j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png" width="1456" height="1765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1765,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:266332,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184290530?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wp6j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 424w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 848w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!Wp6j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F711f84dc-bb05-4e7b-938a-35b4dff9b60e_1470x1782.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of <code>withConfig</code> function to adjust Expo config based on app variant</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ecB9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ecB9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 424w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 848w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 1272w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ecB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png" width="502" height="353.13852813852816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:924,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:41932,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/184290530?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ecB9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 424w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 848w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 1272w, https://substackcdn.com/image/fetch/$s_!ecB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f804c62-8c9e-4461-b2a4-ea9cc17d03a5_924x650.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of adding APP_VARIANT in eas.json file</figcaption></figure></div><p>The idea is to customize the app name, e.g. by adding suffix, based on the <code>APP_VARIANT</code> environment variable. This way, we can install 3 different apps in simulator or real devices, for example:</p><ul><li><p>&#8220;My App&#8221;: production app (e.g. downloaded from app store)</p></li><li><p>&#8220;My App (dev)&#8221;: app for local development</p></li><li><p>&#8220;My App (preview)&#8221;: app for testers (production build, connects to production endpoints, downloaded from secret link not from app store)</p></li></ul><p>That&#8217;s it! Honestly, it was pretty overwhelming when I first try to figure this out. But writing this out has helped me understand it better.</p>]]></content:encoded></item><item><title><![CDATA[A Versatile Flow for Your Next Mobile App]]></title><description><![CDATA[Check this out if you're not sure how to structure your mobile app.]]></description><link>https://satisfies.dev/p/a-versatile-flow-for-your-next-mobile</link><guid isPermaLink="false">https://satisfies.dev/p/a-versatile-flow-for-your-next-mobile</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Mon, 05 Jan 2026 19:43:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a30d1b9c-854a-4bb1-972c-3c29ca665b4a_2280x1426.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You have an idea for a mobile app. You started with the core functionality, but soon you realised that you&#8217;ll need to introduce the app&#8217;s offering to the users. Then you think of adding an onboarding screen.</p><p>You want to authenticate the users before using the core functionality, so you put a login screen in front. You then realised that you want to collect few extra info from the users to understand them better. Things like how they know about your app, their display name, etc. This info should be entered once, ideally right after they signed up. </p><p>Then comes the actual app screens like the home screen, settings, etc. Seems like the steps to the core functionality are long but they&#8217;re necessary. Dropping the users right into the log in screen and then to the home screen will not work optimally because they aren&#8217;t primed to understand what value the app gives. So here I&#8217;m sharing a flow that I think is versatile enough to be applicable for most apps. </p><p>The flow:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dwm7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dwm7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 424w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 848w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 1272w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dwm7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png" width="1238" height="936" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1238,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104143,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://satisfies.dev/i/183532365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dwm7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 424w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 848w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 1272w, https://substackcdn.com/image/fetch/$s_!Dwm7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8f6e583-a36d-4a68-9814-b1d2eec5559e_1238x936.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p><strong>User opens the app</strong>. What the user sees about your app so far: the app icon and app name.</p></li><li><p>App shows the <strong>splash screen</strong>. From technical perspective, it&#8217;s a good place to wait for app initiation process (few seconds). From user&#8217;s perspective, it&#8217;s a good step to prime the user for the app&#8217;s experience.</p></li><li><p>App shows the <strong>onboarding screen</strong>. This is where you explain the app&#8217;s purpose in few steps. User will slides through the onboarding screens. Each screen can contain an image or animation, a title, and description to explain what users can get from the app. At the end of the onboarding screen, users can press the &#8220;Get Started&#8221; button which brings the to the next step. </p></li><li><p>The <strong>login screen </strong>(optional) and <strong>onboarding form</strong>. You can remove the login screen if your app doesn&#8217;t need authentication. The onboarding form is where you collect extra info like user&#8217;s display name, how they know about your app, referral code, etc.</p></li><li><p>Once the onboarding form is filled, user can navigate to the <strong>home screen</strong>. This is where they get the main value from the app. Be it a recipe app, marketplace, note taker, etc. A home screen can have a common structure (layout) of a screen with bottom tab bar. The bottom tabs consist of: home, some other main pages, then settings.</p></li></ol><p>That&#8217;s the flow! It&#8217;s quite generic and can be applied in most apps. The goal is to prepare the users as best as possible so they know how to get the value (the aha! moment) by the time they see the home screen.</p><h2>Demo</h2><p>Here&#8217;s a preview of the flow in a demo app I created:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e9b62406-8536-4d2b-bdf5-639b27cd47b0&quot;,&quot;duration&quot;:null}"></div><p>If you&#8217;re curious, here are the tools I use to create the app:</p><ul><li><p><a href="https://github.com/infinitered/ignite">Ignite boilerplate</a>: an open source Expo boilerplate from <a href="https://infinite.red">InfiniteRed</a>. It provides dark mode, I18n including RTL, and more.</p></li><li><p><a href="https://www.npmjs.com/package/react-native-onboarding-swiper">react-native-onboarding-swiper</a> for the onboarding screens</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Let's Write Again]]></title><description><![CDATA[The longer I go without writing, the more I feel incomplete.]]></description><link>https://satisfies.dev/p/lets-write-again</link><guid isPermaLink="false">https://satisfies.dev/p/lets-write-again</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Wed, 31 Dec 2025 15:02:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1ecb59f1-1cb0-4f1c-9e1b-54aef539da72_1200x630.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Days feel long with works, years feel short with no traces to look back. The last blog entry I wrote was January this year, which was almost a year ago. I did post more in X (Twitter!) but it doesn&#8217;t feel same as writing a long form. I guess it&#8217;s true: writing is like going to gym but for your mind.</p><p>I&#8217;ll write more liberally here. Software engineering, reviews on products I bought, or recent news where I want to exercise my opinion. I&#8217;ll still maintain my other blog, wzulfikar.com, for essays and reflections. </p><p>Now, I&#8217;ll write this for myself: <strong>a perfect task is a task completed.</strong> </p><p>Nothing can be perfect if it&#8217;s never done. Don&#8217;t fuss over small details. Substance over form. Define finish line, polish post completion. </p><p>So much happened over a year; buildings being built, papers published, companies went public, yet I&#8217;ve done very small.</p><p>Don&#8217;t waste time. Stay focused. Prioritize.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://satisfies.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Satisfies.]]></description><link>https://satisfies.dev/p/coming-soon</link><guid isPermaLink="false">https://satisfies.dev/p/coming-soon</guid><dc:creator><![CDATA[Wildan Zulfikar]]></dc:creator><pubDate>Wed, 06 Aug 2025 13:20:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vIx9!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ce9531-6db7-4ae0-a0ac-6dc2158cfef6_472x472.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is <em>Satisfies</em>.</p>]]></content:encoded></item></channel></rss>