<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Innovation Resources | Infinum</title>
		<atom:link href="https://infinum.com/blog/category/innovation/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/category/innovation/</link>
		<description>Building digital products</description>
		<lastBuildDate>Thu, 16 Apr 2026 15:26:52 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>19276916https://infinum.com/uploads/2026/03/android-protection-hero-2.webp</url>
				</image>
				<title>Understanding &#038; Defeating Android Protections</title>
				<link>https://infinum.com/blog/understanding-defeating-android-protections/</link>
				<pubDate>Thu, 19 Mar 2026 11:13:28 +0000</pubDate>
				<dc:creator>Hrvoje Filaković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19276916</guid>
				<description>
					<![CDATA[<p>Discover how hackers bypass Android root detection, anti-hooking, and anti-debug protections with real code examples and penetration testing techniques to strengthen your mobile security knowledge.</p>
<p>The post <a href="https://infinum.com/blog/understanding-defeating-android-protections/">Understanding &amp; Defeating Android Protections</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-536"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-94'
	>
	Many modern Android applications are highly advanced and operate in sensitive domains like banking, money transfers, and other critical services people rely on daily. A rooted environment gives attackers elevated access to the device, which they can abuse in order to bypass the app’s restrictions, extract sensitive data, and interfere with the app’s behavior.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-97'
	>
	To counter these threats, many apps implement protections against common tools and techniques used in reverse engineering. These include anti-root, anti-hook, and anti-debug mechanisms, which are designed to make an attacker’s job significantly more difficult—often requiring considerable effort and creativity to bypass.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-99">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-100'
	>
	<li>Anti-Root – Detects whether the device has been rooted.</li><li>Anti-Hook – Detects function hooking attempts using tools like Frida.</li><li>Anti-Debug – Detects whether the application is being debugged.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-103'
	>
	A practical look at protection mechanisms</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-106'
	>
	This article provides other security researchers with a practical look at how some of these protection mechanisms are implemented and how they can be bypassed during <a href="https://infinum.com/blog/penetration-testing-steps/" id="https://infinum.com/blog/penetration-testing-steps/">penetration testing</a> or security research.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-109'
	>
	Additionally, by understanding how these protections work, developers can <a href="https://infinum.com/blog/ssdlc-application-security/" id="https://infinum.com/blog/ssdlc-application-security/">build stronger, more resilient security mechanisms</a> into their apps and even extend these ideas to develop more advanced and effective techniques.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-112'
	>
	Furthermore, during this research, an application called TamperLab was created. It includes various protection mechanisms to detect whether a device is rooted, whether any hooking is in place, or whether the application is being debugged. The project is fully open-source, and contributions are welcome.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-114">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-115'
	>
	It can be found on the following GitHub page for you to check out:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">https://github.com/infinum/cs-tamperlab
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-119"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-120">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/03/Screenshot-2026-03-17-at-11.23.01-1400x910.webp				media='(max-width: 699px)'
				type=image/webp								height="910"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/03/Screenshot-2026-03-17-at-11.23.01.webp"
					class="image__img block-media__image-img"
					alt="TamperLab Android app showing root detection, hook detection, and debug detection status indicators with green and red checkmarks"
										height="968"
															width="1490"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-124"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-122">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-123'
	>
	Anti-Root Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-127"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-125">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-126'
	>
	In this section, we will look at some commonly used root detection techniques and their implementations, and immediately follow each one with an example of how it can be bypassed during testing or reverse engineering.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-128">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-129'
	>
	The “One Function” Folly</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-131">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-132'
	>
	The most common way of implementing protection measures such as anti-root, anti-hook, and anti-debug is by placing all checks inside a single function. This is a common mistake, as it gives attackers the opportunity to <a href="https://infinum.com/blog/ai-generated-code-security-risks/" id="https://infinum.com/blog/ai-generated-code-security-risks/">bypass all protections</a> within seconds.For example, in the following scenario, the <a href="https://github.com/scottyab/rootbeer">RootBeer</a> library is used to quickly demonstrate why placing all checks in a single function can be problematic. As shown in the code snippet below, the isRooted() function is called.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">isRooted</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">rootBeer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">isRooted</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">showRootStatusDialog</span><span class="token">(</span><span class="token">isRooted</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-136">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-137'
	>
	Such a function includes various methods to detect if the device is rooted.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #6f42c1;">isRooted</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #6f42c1;">detectRootManagementApps</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token"> 
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">detectPotentiallyDangerousApps</span><span class="token">(</span><span class="token">)</span><span class="token">  </span><span class="token" style="color: #d73a49;">||</span><span class="token"> 
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForBinary</span><span class="token">(</span><span class="token">BINARY_SU</span><span class="token">)</span><span class="token">         </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForDangerousProps</span><span class="token">(</span><span class="token">)</span><span class="token">          </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForRWPaths</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-141">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-142'
	>
	Although the function includes many ways to detect if the device is rooted, it is not sufficient because the isRooted() function itself can be hooked, allowing an attacker to bypass all detections with a single hook.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-145'
	>
	Using the following simple Frida script, we can do exactly that. We obtain a reference to the RootBeer class and hook the isRooted() function, immediately returning false.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-javascript github-light" data-language="javascript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">perform</span><span class="token">(</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">=&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #005cc5;">rootbeer</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">use</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.scottyab.rootbeer.RootBeer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">rootbeer</span><span class="token">.</span><span class="token" style="color: #24292e;">isRooted</span><span class="token">.</span><span class="token" style="color: #6f42c1;">implementation</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">function</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[+] isRooted() hooked -&gt; returning false</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-149">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-150'
	>
	Using the following command, the targeted application can be started with the hook applied.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-153"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">frida </span><span class="token" style="color: #d73a49;">-</span><span class="token">U </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #24292e;">evade_root</span><span class="token">.</span><span class="token" style="color: #24292e;">js</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">f </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-154">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-155'
	>
	As shown in the following image, the previously created script successfully bypasses all the checks because they are contained within a single function.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-157"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-158">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_2.webp"
					class="image__img block-media__image-img"
					alt="Frida terminal output showing isRooted() hook successfully returning false, bypassing all RootBeer root checks with a single Frida script"
										height="311"
															width="745"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-161'
	>
	Testing this inside TamperLab shows that we successfully bypass the protection measure, and a green checkmark is displayed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-163"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-164">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_3.webp"
					class="image__img block-media__image-img"
					alt="TamperLab app displaying green checkmark after successful bypass of root detection using Frida isRooted() hook"
										height="310"
															width="478"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-166">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-167'
	>
	SU Binary Check (Shell)</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-169">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-170'
	>
	All rooted Android devices contain the su binary, and any application requiring root access must use su to elevate privileges and perform privileged actions on the device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-172">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-173'
	>
	When present on a device, applications can detect the existence of the binary and conclude that the device is rooted. A quick way to check for it is by programmatically executing the which su system command.In my application, I created a simple HelperClass that contains various functionalities and detection methods. One of its purposes is to execute system commands.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">String</span><span class="token"> </span><span class="token" style="color: #24292e;">output</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">HelperClass</span><span class="token">.</span><span class="token" style="color: #6f42c1;">executeCommand</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-177">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-178'
	>
	The executeCommand() function essentially passes the given command as an argument to the exec() function, which executes it on the device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Process</span><span class="token"> </span><span class="token" style="color: #24292e;">process</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Runtime</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getRuntime</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">BufferedReader</span><span class="token"> </span><span class="token" style="color: #24292e;">reader</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">BufferedReader</span><span class="token">(</span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">InputStreamReader</span><span class="token">(</span><span class="token" style="color: #24292e;">process</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getInputStream</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">String</span><span class="token"> </span><span class="token" style="color: #24292e;">output</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">reader</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readLine</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">reader</span><span class="token">.</span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">return</span><span class="token"> output</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-184"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-182">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-183'
	>
	If the su binary exists, the command will return its full system path, otherwise, an error code will be returned.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-185">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-186'
	>
	Using Frida, we can bypass this technique by hooking the exec() function itself. If we detect a command such as which su, we can replace it at runtime with another non-existent command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-189"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">perform</span><span class="token">(</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> Runtime </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">use</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">java.lang.Runtime</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">Runtime</span><span class="token">.</span><span class="token" style="color: #24292e;">exec</span><span class="token">.</span><span class="token" style="color: #6f42c1;">overload</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">java.lang.String</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #24292e;">implementation</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">command</span><span class="token">.</span><span class="token" style="color: #6f42c1;">trim</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">===</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] called exec(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> command </span><span class="token" style="color: #d73a49;">+</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">)</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] returning a fake binary.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            command </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which DoesNotExist</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-192"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-190">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-191'
	>
	As demonstrated, by using this technique, we can target specific exec() parameters after reverse engineering the application and bypass the detection mechanisms in place.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-195"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-193"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-194">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_4.webp"
					class="image__img block-media__image-img"
					alt="Frida script output intercepting Runtime.exec() call for &quot;which su&quot; command and substituting a non-existent binary path to bypass SU binary shell check"
										height="315"
															width="742"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-198"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-196">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-197'
	>
	SU Binary Check (Native C/C++)</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-201"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-199">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-200'
	>
	Another way developers may check for the su binary or for rooted devices in general is by writing native C/C++ code using JNI. In case you are unfamiliar, JNI (Java Native Interface) is a framework that allows Java code running on the Android platform to interact with native applications and libraries written in C or C++.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-202">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-203'
	>
	For example, we can check for the su binary by iterating through common system paths where it might exist, and then using the std::ifstream function to check if the file can be opened.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">extern </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">C</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #24292e;">JNIEXPORT</span><span class="token"> jboolean </span><span class="token" style="color: #24292e;">JNICALL</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token">(</span><span class="token">JNIEnv </span><span class="token" style="color: #d73a49;">*</span><span class="token">env</span><span class="token">,</span><span class="token"> jclass clazz</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #d73a49;">char</span><span class="token" style="color: #d73a49;">*</span><span class="token"> paths</span><span class="token">[</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/sbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/su/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/.ext/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/failsafe/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/sd/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/usr/we-need-root/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/cache/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/dev/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Scan directories for &quot;su&quot; binary, if found return true.</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">for</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #d73a49;">char</span><span class="token" style="color: #d73a49;">*</span><span class="token"> path</span><span class="token" style="color: #d73a49;">:</span><span class="token"> paths</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">string fullPath </span><span class="token" style="color: #d73a49;">=</span><span class="token"> std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #6f42c1;">string</span><span class="token">(</span><span class="token">path</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">ifstream </span><span class="token" style="color: #6f42c1;">file</span><span class="token">(</span><span class="token">fullPath</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">file</span><span class="token">.</span><span class="token" style="color: #6f42c1;">good</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">file</span><span class="token">.</span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_FALSE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-207">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-208'
	>
	A small Java class is then created to serve as a bridge between the Java code and the native C/C++ code in the application. It uses JNI (Java Native Interface) to perform the native task.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NativeChecks</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">System</span><span class="token">.</span><span class="token" style="color: #6f42c1;">loadLibrary</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">tamper-lib</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token" style="color: #d73a49;">native</span><span class="token"> </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #6f42c1;">CheckSuBinaryNative</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-213'
	>
	Under normal circumstances, you wouldn’t have access to the source code. However, a common way to reverse engineer the application is by decompiling it using <a href="https://github.com/skylot/jadx">JADX</a>, which can be done with the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-216"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">$ jadx </span><span class="token" style="color: #d73a49;">-</span><span class="token">d </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pwd</span><span class="token">)</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #24292e;">TamperLab_Decompiled</span><span class="token"> </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pwd</span><span class="token">)</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #24292e;">TamperLab</span><span class="token">.</span><span class="token" style="color: #24292e;">apk</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-217">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-218'
	>
	Once decompiled, your application may contain various libraries. You can easily filter through them by searching for files with the .so extension, which indicates native libraries.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">$ find TamperLab_Decompiled -type f -name &quot;*.so&quot;                        
</span></span><span class="line"><span class="token">TamperLab_Decompiled/resources/lib/arm64-v8a/libtamper-lib.so
</span></span><span class="line"><span class="token">TamperLab_Decompiled/resources/lib/arm64-v8a/libtoolChecker.so
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-222">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-223'
	>
	To reverse engineer the library, tools such as <a href="https://github.com/NationalSecurityAgency/ghidra">Ghidra</a> or <a href="https://hex-rays.com/ida-pro">IDA Pro</a> can be used. In this case, Ghidra was used.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-225"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-226">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_5.webp"
					class="image__img block-media__image-img"
					alt="Ghidra decompiled view of libtamper-lib.so native library showing ifstream file check logic, JNI_TRUE return (1) if su binary found, and JNI_FALSE return (0) if not found"
										height="675"
															width="877"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-229'
	>
	The decompiled code shows that ifstream is first used (1) to check whether the file exists. Based on this check, the function returns \x01 (JNI_TRUE) (2) if the su binary is found, otherwise, it returns \x00 (JNI_FALSE) (3).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-232'
	>
	Since this is a JNI function and is exposed using extern &#8220;C&#8221;, it appears in the symbol table with the exact name observed in Ghidra.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-236">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-237'
	>
	Bypassing such checks is relatively straightforward. To hook a native function using Frida, we use Interceptor.attach() and specify the target function using Module.findExportByName().</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-240"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">findExportByName</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">libtamper-lib.so</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] CheckSuBinaryNative() called</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Overriding return with JNI_FALSE</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-243"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-241">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-242'
	>
	Since we are intercepting a function from the native library, we need to attach to the process while it is already running by using the -n parameter with the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">frida </span><span class="token" style="color: #d73a49;">-</span><span class="token">U </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #24292e;">evade_root</span><span class="token">.</span><span class="token" style="color: #24292e;">js</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">n tamperlab
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-246">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-247'
	>
	As shown in the script&#8217;s output, we successfully bypass the check even though it resides within JNI code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-249"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-250">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_6.webp"
					class="image__img block-media__image-img"
					alt="Frida Interceptor.attach output showing successful override of CheckSuBinaryNative() return value to JNI_FALSE, bypassing native C/C++ SU binary detection"
										height="320"
															width="745"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-252">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-253'
	>
	Another clever approach is to hook the open() function instead of the entire native function implemented in the application.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-255">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-256'
	>
	Since std::ifstream() ultimately invokes the open() system call, we can hook open() to intercept any attempt to access a binary whose path contains &#8220;su&#8221;. We can then substitute that path with a fake one to bypass the check.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-259"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">open</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">const</span><span class="token"> path </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readUtf8String</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">path</span><span class="token">.</span><span class="token" style="color: #6f42c1;">includes</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[i] called open(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> path </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">);</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[i] App searching for the &#039;su&#039; binary</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Overriding with random path value.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">const</span><span class="token"> newPath </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">allocUtf8String</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/dev/null</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> newPath</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-262"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-260">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-261'
	>
	As shown in the image, this technique effectively bypasses native checks early by using the -f flag to hook before execution, unlike the -n flag, which attaches the hook while the process is already running.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-265"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-263"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-264">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_7.webp"
					class="image__img block-media__image-img"
					alt="Frida script hooking the open() system call to redirect any path containing &quot;su&quot; to /dev/null, bypassing native root detection before process execution using the -f flag"
										height="475"
															width="868"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-268"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-266">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-267'
	>
	Spoofing /proc/mounts</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-269">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-270'
	>
	Nowadays, many Android devices are commonly rooted using <a href="https://github.com/topjohnwu/Magisk">Magisk</a>, which comes with a variety of built-in features.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-272">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-273'
	>
	The /proc/mounts file contains a list of all currently mounted filesystems on the device. Additionally, when a device is rooted using Magisk, it modifies the boot image and mounts partitions dynamically by default, so you may find traces of Magisk there as well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-275"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-276">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_8.webp"
					class="image__img block-media__image-img"
					alt="Contents of /proc/mounts on a Magisk-rooted Android device showing magisk-related mount entries that reveal root status to detection mechanisms"
										height="171"
															width="1028"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-279'
	>
	An implementation to detect this might look like the following, where an application reads the contents of /proc/mounts in search of Magisk.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">public static boolean isMagiskInMounts() {
</span></span><span class="line"><span class="token">  try {
</span></span><span class="line"><span class="token">    BufferedReader reader = new BufferedReader(new FileReader(&quot;/proc/mounts&quot;));
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    String line;
</span></span><span class="line"><span class="token">    while ((line = reader.readLine()) != null) {
</span></span><span class="line"><span class="token">      if (line.contains(&quot;magisk&quot;)        ||
</span></span><span class="line"><span class="token">          line.contains(&quot;/sbin/.magisk&quot;) ||
</span></span><span class="line"><span class="token">          line.contains(&quot;/dev/&quot;) &amp;&amp; line.contains(&quot;magisk&quot;)) {
</span></span><span class="line"><span class="token">        return true;
</span></span><span class="line"><span class="token">      }
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">    reader.close();
</span></span><span class="line"><span class="token">  } catch (IOException e) {
</span></span><span class="line"><span class="token">    e.printStackTrace();
</span></span><span class="line"><span class="token">  }
</span></span><span class="line"><span class="token">  return false;
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-283">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-284'
	>
	To bypass this, we can create a script like the following, where we define a list of mounts that don’t contain Magisk traces or any other suspicious entries, for that matter.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-286">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-287'
	>
	The first interceptor hooks the open() system call to capture the file descriptor used when accessing /proc/mounts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-291"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-289">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-290'
	>
	The second interceptor hooks read(), checks if the file descriptor corresponds to /proc/mounts, ensures the content hasn’t already been spoofed (to prevent repeated modifications and potential crashes), and finally replaces the buffer with our fake mount data defined at the top.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-293"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">const</span><span class="token"> fake_mounts </span><span class="token" style="color: #d73a49;">=</span><span class="token"> `
</span></span><span class="line"><span class="token" style="color: #d73a49;">/</span><span class="token">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token">block</span><span class="token" style="color: #d73a49;">/</span><span class="token">dm</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">8</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token"> ext4 ro</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">dev tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">devpts </span><span class="token" style="color: #d73a49;">/</span><span class="token">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token">pts devpts rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">600</span><span class="token">,</span><span class="token">ptmxmode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">proc </span><span class="token" style="color: #d73a49;">/</span><span class="token">proc proc rw</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">3009</span><span class="token">,</span><span class="token">hidepid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">2</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">sysfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">sys sysfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">selinuxfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">sys</span><span class="token" style="color: #d73a49;">/</span><span class="token">fs</span><span class="token" style="color: #d73a49;">/</span><span class="token">selinux selinuxfs rw</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">mnt tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">nodev</span><span class="token">,</span><span class="token">noexec</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">1000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">mnt</span><span class="token" style="color: #d73a49;">/</span><span class="token">installer tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">nodev</span><span class="token">,</span><span class="token">noexec</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">1000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">`</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">const</span><span class="token"> fakeMountBuffer </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">allocUtf8String</span><span class="token">(</span><span class="token">fake_mounts</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">let fakeMountFds </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Set</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">let hasSpoofed </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">open</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">path</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readUtf8String</span><span class="token">(</span><span class="token">args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">path</span><span class="token"> </span><span class="token" style="color: #d73a49;">===</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/mounts</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[i] /proc/mounts opened -&gt; file descriptor:</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">fakeMountFds</span><span class="token">.</span><span class="token" style="color: #6f42c1;">add</span><span class="token">(</span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">read</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">fd</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buf</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">1</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">count</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">2</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">fakeMountFds</span><span class="token">.</span><span class="token" style="color: #6f42c1;">has</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">fd</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">!</span><span class="token">hasSpoofed</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">const</span><span class="token"> length </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">fake_mounts</span><span class="token">.</span><span class="token" style="color: #24292e;">length</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">length </span><span class="token" style="color: #d73a49;">&lt;=</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">count</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    hasSpoofed </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Spoofing read() from /proc/mounts with fake one.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">copy</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buf</span><span class="token">,</span><span class="token"> fakeMountBuffer</span><span class="token">,</span><span class="token"> length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token">length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[-] Buffer too small to spoof.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] /proc/mounts already spoofed, continuing...</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-296"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-294">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-295'
	>
	By running the hook, we successfully spoof the contents of /proc/mounts with our fake data, effectively bypassing the detection check.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-299"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-297"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-298">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_9.webp"
					class="image__img block-media__image-img"
					alt="Frida script output confirming successful spoofing of /proc/mounts read() call with clean fake mount data, bypassing Magisk detection"
										height="446"
															width="982"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-302"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-300">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-301'
	>
	It’s important to note that these techniques can be implemented and bypassed in various ways. Consequently, multiple solutions and countermeasures exist to address them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-305"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-303">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-304'
	>
	Anti-Hooking Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-308"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-306">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-307'
	>
	Hooking is a powerful technique used during mobile penetration tests because it allows intercepting, modifying, and monitoring an application’s behavior at runtime. It provides direct access to function calls, arguments, return values, and the internal logic of methods.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-311"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-309">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-310'
	>
	To perform such attacks, <a href="https://github.com/frida/frida">Frida</a> is a widely used tool that enables pentesters and attackers to bypass security controls or extract potentially sensitive data.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-314"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-312">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-313'
	>
	Frida Port Detection</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-317"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-315">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-316'
	>
	A common way to detect Frida is by checking for open frida-server ports, since Frida communicates using WebSockets. Simple checks often look for ports like 27042 or 27043, which are the default ports used by Frida.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-320"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-318">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-319'
	>
	Such checks can be easily bypassed by simply starting the Frida server on a different port using the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-322"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">.</span><span class="token" style="color: #d73a49;">/</span><span class="token">frida</span><span class="token" style="color: #d73a49;">-</span><span class="token">server</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">16.5</span><span class="token">.</span><span class="token" style="color: #b31d28;font-style: italic;">9</span><span class="token" style="color: #d73a49;">-</span><span class="token">android</span><span class="token" style="color: #d73a49;">-</span><span class="token">arm64 </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #005cc5;">0.0</span><span class="token">.</span><span class="token">0</span><span class="token">.</span><span class="token">0</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">1337</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-323">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-324'
	>
	A more advanced detection method involves scanning all ports by sending specific HTTP requests and checking for a 101 Switching Protocols response, which indicates the presence of a Frida server.An example of such native code would involve sending a WebSocket upgrade request to every open port on the device. If the response contains 101 Switching Protocols, it confirms that a Frida server has been successfully detected.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-327"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">for</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">int</span><span class="token"> </span><span class="token" style="color: #24292e;">i</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">;</span><span class="token"> i </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">65535</span><span class="token">;</span><span class="token"> i</span><span class="token" style="color: #d73a49;">++</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #6f42c1;">connect</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">const</span><span class="token"> struct sockaddr</span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">addr</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">addr</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">snprintf</span><span class="token">(</span><span class="token">req</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">req</span><span class="token">)</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">GET /ws HTTP/1.1</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Host: %s:%d</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Upgrade: websocket</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Connection: Upgrade</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Sec-WebSocket-Key: CpxD2C5REVLHvsUC9YAoqg==</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Sec-WebSocket-Version: 13</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">User-Agent: Frida</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #6f42c1;">inet_ntoa</span><span class="token">(</span><span class="token" style="color: #24292e;">addr</span><span class="token">.</span><span class="token" style="color: #24292e;">sin_addr</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ntohs</span><span class="token">(</span><span class="token" style="color: #24292e;">addr</span><span class="token">.</span><span class="token" style="color: #24292e;">sin_port</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">write</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> req</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">strlen</span><span class="token">(</span><span class="token">req</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        ssize_t bytes_read </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">read</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> res</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">res</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">bytes_read </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                res</span><span class="token">[</span><span class="token">bytes_read</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #005cc5;">\0</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #6f42c1;">strstr</span><span class="token">(</span><span class="token">res</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">101 Switching Protocols</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">sock</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-330"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-328">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-329'
	>
	This check can be bypassed by hooking the read() calls and inspecting the buffer content after the call completes. If the buffer contains 101 Switching Protocols, indicating a Frida server query, we can modify the response to something benign such as HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n to evade detection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-332"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">findExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">read</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">1</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">size</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">2</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">response</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readCString</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">response</span><span class="token">.</span><span class="token" style="color: #6f42c1;">includes</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">101 Switching Protocols</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] Application detected Frida server via WebSocket</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Modifying the WebSocket response</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">modifiedResponse</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">HTTP/1.1 200 OK</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">Content-Length: 0</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">writeUtf8String</span><span class="token">(</span><span class="token">modifiedResponse</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #24292e;">modifiedResponse</span><span class="token">.</span><span class="token" style="color: #24292e;">length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-335"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-333">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-334'
	>
	As demonstrated, once the hook is executed, the check is successfully bypassed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-338"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-336"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-337">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_10.webp"
					class="image__img block-media__image-img"
					alt="Frida read() hook modifying WebSocket 101 Switching Protocols response to HTTP 200 OK, successfully bypassing Frida port detection across all 65535 ports"
										height="313"
															width="755"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-339">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-340'
	>
	Frida Threads Detection</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-344"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-342">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-343'
	>
	In Linux-based environments (including Android), each process has a task directory located at /proc/self/task, containing a subdirectory for each thread within the process. Each of these subdirectories includes a comm file that holds the name of the corresponding thread.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-347"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-345">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-346'
	>
	When Frida is injected into a process, it typically creates several threads for its internal operations. These threads often have distinctive names such as frida, gum-js-loop, gmain, gdbus or some other which can be used to detect Frida&#8217;s presence.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-350"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-348">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-349'
	>
	To better understand this, we can run the following command on the device to retrieve the names of all threads for a specified process.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-352"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">PPID</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pidof </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">)</span><span class="token">;</span><span class="token"> </span><span class="token" style="color: #d73a49;">for</span><span class="token"> i in </span><span class="token" style="color: #d73a49;">/</span><span class="token">proc</span><span class="token" style="color: #d73a49;">/</span><span class="token">$PPID</span><span class="token" style="color: #d73a49;">/</span><span class="token">task</span><span class="token" style="color: #6a737d;">/*</span><span class="token" style="color: #6a737d;">; do cat &quot;$i/comm&quot; 2&gt;/dev/null; done
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-355"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-353">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-354'
	>
	As shown in the following snippet, this is the output of the thread list when no Frida hooks are active.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-357"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Signal</span><span class="token"> </span><span class="token" style="color: #24292e;">Catcher</span><span class="token">
</span></span><span class="line"><span class="token">perfetto_hprof_
</span></span><span class="line"><span class="token">ADB</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">JDWP</span><span class="token"> </span><span class="token" style="color: #24292e;">Connec</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Jit</span><span class="token"> thread pool
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">utility</span><span class="token" style="color: #d73a49;">-</span><span class="token">wo
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">cmar</span><span class="token" style="color: #d73a49;">-</span><span class="token">backe
</span></span><span class="line"><span class="token">ged</span><span class="token" style="color: #d73a49;">-</span><span class="token">swd
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-360"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-358">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-359'
	>
	When a Frida hook is applied to the process, threads named gmain and gdbus appear both associated with Frida’s runtime. This allows us to detect Frida based on the presence of these thread names.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-362"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token">perfetto_hprof_
</span></span><span class="line"><span class="token">ADB</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">JDWP</span><span class="token"> </span><span class="token" style="color: #24292e;">Connec</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Jit</span><span class="token"> thread pool
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">cmar</span><span class="token" style="color: #d73a49;">-</span><span class="token">backe
</span></span><span class="line"><span class="token" style="color: #24292e;">RenderThread</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token">gmain
</span></span><span class="line"><span class="token">gdbus
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-365"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-363">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-364'
	>
	To detect this, we can use C++ code like the following, which loops through each comm file in the /proc/self/task directory to retrieve thread names and checks them against a list of common thread names used by Frida.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-367"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">DIR</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #005cc5;">dir</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">opendir</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/self/task</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">struct</span><span class="token"> </span><span class="token" style="color: #005cc5;">dirent</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #005cc5;">entry</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">char</span><span class="token"> </span><span class="token" style="color: #005cc5;">path</span><span class="token">[</span><span class="token" style="color: #005cc5;">PATH_MAX</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">char</span><span class="token"> </span><span class="token" style="color: #005cc5;">comm</span><span class="token">[</span><span class="token" style="color: #005cc5;">256</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">while</span><span class="token"> </span><span class="token">(</span><span class="token">(</span><span class="token" style="color: #005cc5;">entry</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">readdir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">NULL</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">snprintf</span><span class="token">(</span><span class="token" style="color: #005cc5;">path</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">sizeof</span><span class="token">(</span><span class="token" style="color: #005cc5;">path</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/self/task/%s/comm</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">entry</span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token" style="color: #24292e;">d_name</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">fgets</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">sizeof</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">NULL</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #005cc5;">comm</span><span class="token">[</span><span class="token" style="color: #005cc5;">strcspn</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">frida</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">gum</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">   </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">gmain</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">fclose</span><span class="token">(</span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">closedir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">fclose</span><span class="token">(</span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">closedir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">JNI_FALSE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-370"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-368">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-369'
	>
	One intriguing approach to evade detection is to patch the entire frida-server binary by replacing all occurrences of strings like gmain. By searching for gmain in Ghidra, we can observe the following results.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-373"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-371"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-372">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_11.webp"
					class="image__img block-media__image-img"
					alt="Ghidra search results showing multiple occurrences of the &quot;gmain&quot; string inside the frida-server binary, used for Frida thread name detection"
										height="522"
															width="917"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-376"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-374">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-375'
	>
	By selecting one of the instances, we can examine the disassembled code to pinpoint its exact location.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-379"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-377"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-378">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_12.webp"
					class="image__img block-media__image-img"
					alt="Ghidra disassembly view showing exact memory location of the gmain string in the frida-server binary for targeted patching"
										height="305"
															width="848"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-382"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-380">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-381'
	>
	We can now use Ghidra’s built-in hex editor to modify these strings, replacing gmain with another string, such as hackr.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-385"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-383"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-384">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_13.webp"
					class="image__img block-media__image-img"
					alt="Ghidra hex editor view showing gmain string being replaced with hackr to rename Frida&#039;s internal thread and evade thread-name-based detection"
										height="247"
															width="933"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-388"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-386">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-387'
	>
	After injecting the Frida hook, we can see that we have successfully bypassed the detection, as it no longer identifies Frida’s threads.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-391"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-389"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-390">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_14.webp"
					class="image__img block-media__image-img"
					alt="Frida injection output after frida-server binary patch showing Frida threads no longer detected, with renamed thread appearing as hackr instead of gmain"
										height="310"
															width="478"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-394"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-392">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-393'
	>
	If we loop through the thread names again for the application we are attacking, we can see that it now successfully contains the hackr thread name.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-396"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">ReferenceQueueD</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">FinalizerDaemon</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">FinalizerWatchd</span><span class="token">
</span></span><span class="line"><span class="token">binder</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">7261_1</span><span class="token">
</span></span><span class="line"><span class="token">binder</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">7261_2</span><span class="token">
</span></span><span class="line"><span class="token">hackr
</span></span><span class="line"><span class="token">gdbus
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-399"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-397">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-398'
	>
	Of course, there are other detectable strings, but this simple example demonstrates one way to bypass detection by directly patching the frida-server binary yourself. This way you could build an entirely different frida-server to avoid detections or modify the original source code as well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-402"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-400">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-401'
	>
	Anti-Debug Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-405"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-403">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-404'
	>
	Anti-debug protections are another way to protect your Android application from reverse engineering. These mechanisms aim to detect or prevent debugging attempts, stopping attackers from stepping through the app’s code instruction by instruction to understand its internal logic.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-408"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-406">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-407'
	>
	Like most security measures, anti-debug mechanisms can also be bypassed using Frida hooks. However, I want to show you how you can defeat these protections using a debugger itself.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-411"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-409">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-410'
	>
	Defeating Anti-Debug using Debugger</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-414"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-412">
	<h4	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-413'
	>
	isDebuggerConnected()</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-417"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-415">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-416'
	>
	This is a simple, ready-made function that checks if a debugger is connected to the application. It returns true if a debugger is detected, otherwise, it returns false.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-420"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-418">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-419'
	>
	Implementing such a function is straightforward, and you can call it as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-422"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Debug</span><span class="token">.</span><span class="token" style="color: #6f42c1;">isDebuggerConnected</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-425"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-423">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-424'
	>
	To use the debugger and bypass this check, we can utilize JADX’s integrated debugger. Before launching it, ensure the application is already running.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-428"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-426">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-427'
	>
	Another way to start an application is by using the following ADB command, which will launch the app but pause and wait for the debugger to attach.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-430"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">adb shell am set</span><span class="token" style="color: #d73a49;">-</span><span class="token">debug</span><span class="token" style="color: #d73a49;">-</span><span class="token">app </span><span class="token" style="color: #d73a49;">-</span><span class="token">w </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-433"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-431">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-432'
	>
	As shown, when you launch the application, it will display a message indicating that it is waiting for a debugger.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-436"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-434"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-435">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_15.webp"
					class="image__img block-media__image-img"
					alt="Android device screen showing &quot;Waiting For Debugger&quot; dialog after launching TamperLab with ADB debug flag, pausing app execution until debugger attaches"
										height="214"
															width="355"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-439"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-437">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-438'
	>
	In my case, it doesn’t work, but I can open the application without it waiting for the debugger. However, your application might require this behavior, so it’s important to test both methods.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-442"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-440">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-441'
	>
	Additionally, whenever you’re done or close the application, make sure to run the following command to remove the app from waiting for a debugger.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-444"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">adb shell am clear</span><span class="token" style="color: #d73a49;">-</span><span class="token">debug</span><span class="token" style="color: #d73a49;">-</span><span class="token">app
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-447"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-445">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-446'
	>
	Once ready, you can open JADX and load the APK file of the target application. You can also pull the APK from your device using ADB.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-450"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-448">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-449'
	>
	Once loaded into JADX, select the green bug icon, which opens a dialog prompting you to choose the application to debug along with its process ID.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-453"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-451"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-452">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_16.webp"
					class="image__img block-media__image-img"
					alt="JADX integrated debugger showing process selection dialog for com.hacking.tamperlab to attach debugger to the running TamperLab application"
										height="255"
															width="864"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-456"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-454">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-455'
	>
	After the debugger attaches, the application’s execution is automatically paused inside the MainActivity. You can then press the green play button to continue running the application.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-459"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-457"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-458">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_17.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger paused at MainActivity entry point after attaching, with green play button ready to resume application execution"
										height="377"
															width="968"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-462"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-460">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-461'
	>
	Once you find the correct position to set a breakpoint, you can do so by pressing the F2 key. For this example, I set the breakpoint exactly where the isDebuggerConnected() function is called.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-465"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-463"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-464">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_18.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger showing breakpoint set on invoke-static opcode calling isDebuggerConnected(), with v0 register visible in the debug variables panel"
										height="239"
															width="957"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-468"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-466">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-467'
	>
	The following instruction essentially calls the isDebuggerConnected() function using the invoke-static opcode.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-470"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">invoke</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token">{</span><span class="token">}</span><span class="token">,</span><span class="token"> Landroid</span><span class="token" style="color: #d73a49;">/</span><span class="token">os</span><span class="token" style="color: #d73a49;">/</span><span class="token">Debug</span><span class="token">;</span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token" style="color: #6f42c1;">isDebuggerConnected</span><span class="token">(</span><span class="token">)</span><span class="token">Z # method</span><span class="token">@</span><span class="token" style="color: #d73a49;">0008</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-473"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-471">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-472'
	>
	Then, the move-result instruction moves the return value of the function (either true or false) into the v0 register.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-475"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">move-result v0
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-478"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-476">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-477'
	>
	By stepping over these two instructions, we can observe that the v0 register contains the value 1, indicating that a debugger has been detected.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-481"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-479"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-480">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_19.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger showing v0 register containing value 1 (true) after move-result instruction, confirming debugger was detected by isDebuggerConnected()"
										height="324"
															width="1129"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-484"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-482">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-483'
	>
	To bypass this check, we can simply set the value to 0 using the debugger, as shown below:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-487"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-485"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-486">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_20.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger view showing v0 register value manually overridden to 0 (false) to bypass isDebuggerConnected() check during live debugging session"
										height="302"
															width="1139"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-490"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-488">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-489'
	>
	Continuing the application’s execution, we successfully bypass the check by manipulating the variables during debugging.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-493"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-491"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-492">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_21.webp"
					class="image__img block-media__image-img"
					alt="TamperLab app showing green checkmark after successfully bypassing isDebuggerConnected() anti-debug protection by manipulating register value in JADX debugger"
										height="261"
															width="344"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-496"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-494">
	<h4	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-495'
	>
	Detection via USB &amp; ADB</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-499"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-497">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-498'
	>
	Another interesting way to detect debugging is by checking if the device is connected via USB with ADB enabled. While this isn’t a direct debugger detection method, it remains a useful check nonetheless.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-502"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-500">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-501'
	>
	A simple implementation might look like the following, where the app dynamically listens for the USB_STATE broadcast and parses the connected and adb boolean extras from the received intent.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-504"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">IntentFilter</span><span class="token"> </span><span class="token" style="color: #24292e;">filter</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">IntentFilter</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">android.hardware.usb.action.USB_STATE</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">BroadcastReceiver</span><span class="token"> </span><span class="token" style="color: #24292e;">usbReceiver</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">BroadcastReceiver</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">@</span><span class="token" style="color: #d73a49;">Override</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">void</span><span class="token"> </span><span class="token" style="color: #6f42c1;">onReceive</span><span class="token">(</span><span class="token" style="color: #24292e;">Context</span><span class="token"> </span><span class="token" style="color: #e36209;">ctx</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">Intent</span><span class="token"> </span><span class="token" style="color: #e36209;">intent</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">connected</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">intent</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getBooleanExtra</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">connected</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">adbEnabled</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">intent</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getBooleanExtra</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">adb</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">callback</span><span class="token">.</span><span class="token" style="color: #6f42c1;">accept</span><span class="token">(</span><span class="token">connected </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> adbEnabled</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">ctx</span><span class="token">.</span><span class="token" style="color: #6f42c1;">unregisterReceiver</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">context</span><span class="token">.</span><span class="token" style="color: #6f42c1;">registerReceiver</span><span class="token">(</span><span class="token">usbReceiver</span><span class="token">,</span><span class="token"> filter</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">Intent</span><span class="token"> </span><span class="token" style="color: #24292e;">sticky</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">context</span><span class="token">.</span><span class="token" style="color: #6f42c1;">registerReceiver</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> filter</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">sticky </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">usbReceiver</span><span class="token">.</span><span class="token" style="color: #6f42c1;">onReceive</span><span class="token">(</span><span class="token">context</span><span class="token">,</span><span class="token"> sticky</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-507"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-505">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-506'
	>
	We can also bypass this check by using the debugger to place breakpoints at the appropriate locations.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-510"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-508">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-509'
	>
	In this case, I set a breakpoint on the if-eqz instructions, which checks whether the values in registers v0 and v2 are equal to zero. These registers correspond to the connected and adbEnabled flags.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-513"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-511">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-512'
	>
	When the breakpoint is hit, we observe that both values are set to 1 (true), indicating that USB is connected and ADB is enabled.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-516"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-514"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-515">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_22.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger breakpoint showing if-eqz instructions with v0 (connected=1) and v2 (adbEnabled=1) registers, detecting USB connection with ADB enabled"
										height="501"
															width="1088"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-519"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-517">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-518'
	>
	We can now simply set these two values to 0 (false), causing the check to fail and allowing the app to continue execution.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-522"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-520">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-521'
	>
	Conclusion</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-525"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-523">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-524'
	>
	We have explored several common anti-root, anti-hook, and anti-debug techniques and demonstrated how each can ultimately be bypassed. However, it is important to recognize that these protections still play a critical role in Android security.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-528"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-526">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-527'
	>
	No protection is entirely foolproof. Given enough time and the right tools, a determined attacker can often find a way around most defenses. However, the goal of these mechanisms isn’t to create an unbreakable application, but rather to increase the complexity of attacks. This raises the time, effort, and skill required for an attacker to compromise the application, which can deter casual attackers and slow down more advanced ones.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-531"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-529">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-530'
	>
	In short, while these security checks can be bypassed, they remain a valuable part of a defense-in-depth strategy. Labs like TamperLab that we have created, provide a practical environment where you can practice implementing these detection mechanisms and learn how to bypass them. It’s about making it hard enough that breaking the security is no longer worth the effort.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-534"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-532">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-533'
	>
	At Infinum, we help you stay ahead with tailored cybersecurity services, including <a href="https://infinum.com/cybersecurity/penetration-testing/" id="https://infinum.com/cybersecurity/penetration-testing/">penetration testing</a> and <a href="https://infinum.com/cybersecurity/red-teaming/" id="https://infinum.com/cybersecurity/red-teaming/">security assessments</a>. Whether launching new products or protecting existing ones, we identify weaknesses before attackers do so you can focus on what matters. Learn more about how we keep your digital world secure on our <a href="https://infinum.com/cybersecurity/">cybersecurity page</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/understanding-defeating-android-protections/">Understanding &amp; Defeating Android Protections</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19276581https://infinum.com/uploads/2026/03/Snapshot-testing-audio-dsp-hero.webp</url>
				</image>
				<title>Snapshot Testing for Audio DSP</title>
				<link>https://infinum.com/blog/snapshot-testing-for-audio-dsp/</link>
				<pubDate>Mon, 09 Mar 2026 09:52:59 +0000</pubDate>
				<dc:creator>Josip Ćavar</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19276581</guid>
				<description>
					<![CDATA[<p>Learn about AudioSnapshotTesting, a new open-source library developed in collaboration with AudioKit, designed to bring the benefits of snapshot testing to audio development.</p>
<p>The post <a href="https://infinum.com/blog/snapshot-testing-for-audio-dsp/">Snapshot Testing for Audio DSP</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-676"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-537">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-540"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-538">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-539'
	>
	Snapshot Testing has become a commonly adopted technique for testing user interfaces. The popularity stems from its ability to address the unique challenges of UI testing and the simplicity of setup.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-543"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-541">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-542'
	>
	Despite its success in UI testing, snapshot testing hasn’t gained much traction in other areas of software development. This lack of adoption is unfortunate, as many challenges in software development mirror those encountered in UI testing: hard-to-define outputs, complex interactions, and the need for reliable, repeatable tests.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-546"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-544">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-545'
	>
	This is especially relevant in the age of AI, where a feedback loop is crucial for autonomous agentic development.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-549"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-547">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-548'
	>
	But snapshot testing can be extended beyond UI and applied effectively to audio development. Enter AudioSnapshotTesting, a library developed in collaboration with AudioKit, designed to simplify and streamline the testing of audio processing workflows.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-554"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-550">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-551'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-552'
	>
	<em>There is no greater impediment to the advancement of knowledge than the ambiguity of words.</em></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-553'
	>
	<em>Thomas Reid</em></div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-557"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-555">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-556'
	>
	The idea of snapshot testing was popularised in the iOS community by Facebook’s <a href="https://github.com/facebookarchive/ios-snapshot-test-case">FBSnapshotTestCase</a>, later renamed and maintained by Uber as <a href="https://github.com/uber/ios-snapshot-test-case">iOSSnapshotTestCase</a>. The API of those libraries was constrained to UI testing. Later on, a “delightful” Swift <a href="https://github.com/pointfreeco/swift-snapshot-testing">Snapshot testing library</a> has gained popularity. While swift-snapshot-testing made a significant step in generalising the idea of snapshot testing &#8211; by providing strategies to <a href="https://github.com/pointfreeco/swift-snapshot-testing?tab=readme-ov-file#snapshot-anything">“Snapshot Anything”</a> &#8211; in practice, companies <a href="https://github.com/MobileNativeFoundation/discussions/discussions/6#discussioncomment-427538">mostly use it for UI testing</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-560"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-558">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-559'
	>
	Snapshot Testing, Golden Master Testing, Characterization Testing, Approval Testing and Reference Testing all describe the same fundamental idea &#8211; verifying that software behaviour remains consistent over time. Unfortunately, terminological fragmentation creates artificial barriers, leading to missed opportunities.<br />
To explore Snapshot Testing outside of the UI domain, we will work on a simple metronome app.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-563"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-561">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-562'
	>
	Testing Metronome</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-566"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-564">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-565'
	>
	Building a metronome seems straightforward: generate periodic audio clicks at a specified tempo?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-569"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-567">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-568'
	>
	However, when we start implementing one, questions arise quickly:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-572"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-570">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-571'
	>
	<li>How do we verify that the timing is accurate and doesn&#8217;t drift over time?</li><li>How do we ensure your audio processing doesn&#8217;t introduce artifacts?</li><li> How do we catch regressions when refactoring?</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-575"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-573">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-574'
	>
	The traditional approach is tedious: build the app, run it and listen carefully. Maybe export audio and inspect it in a third-party tool. Repeat for every change.<br />
<br />
Snapshot testing offers a different workflow. Here&#8217;s a simple test for our metronome&#8217;s audio output:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-577"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">record:</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">strategy:</span><span class="token"> .</span><span class="token">waveform(</span><span class="token">width:</span><span class="token"> </span><span class="token" style="color: #005cc5;">3000</span><span class="token">, </span><span class="token">height:</span><span class="token"> </span><span class="token" style="color: #005cc5;">800</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">@MainActor</span><span class="token">
</span></span><span class="line"><span class="token">func testMetronomeOutput</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token" style="color: #d73a49;">throws</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> metronome </span><span class="token" style="color: #d73a49;">= Met</span><span class="token">ronome(</span><span class="token">bpm:</span><span class="token"> </span><span class="token" style="color: #005cc5;">120</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">let</span><span class="token"> buffer </span><span class="token" style="color: #d73a49;">= try</span><span class="token"> metronome.</span><span class="token">render(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">of:</span><span class="token"> buffer</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">metronome-120bpm</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-580"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-578">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-579'
	>
	Running this test with <code>record: true</code> saves the audio buffer to disk as a lossless ALAC-encoded file. The ALAC format produces significantly smaller files than WAV while maintaining audio fidelity. Additionally, while in recording mode, the library generates a waveform visualization that allows us to iterate on our metronome implementation and see changes in the generated image.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-583"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-581">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-582'
	>
	Once we have a reference we are confident in, we switch to <code>record: false</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-586"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-584">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-585'
	>
	Now the test compares the current output against that reference audio file, failing if anything changes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-589"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-587">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-588'
	>
	This workflow transforms audio development. Instead of rebuilding and running our app dozens of times, we run our test suite. Each test runs quickly and provides the iterative feedback we (or AI agent) need to implement our audio features.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-592"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-590">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-591'
	>
	The real power emerges when refactoring. Want to optimize your audio rendering or change your DSP algorithm? The expected output is now covered by tests. If the visual output remains identical, we haven&#8217;t broken anything. If it changes, we can immediately see what changed and decide if it&#8217;s intended or a bug.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-595"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-593">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-594'
	>
	A picture truly is worth a thousand tests</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-598"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-596">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-597'
	>
	AudioSnapshotTesting Library</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-601"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-599">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-600'
	>
	AudioSnapshotTesting is designed to work seamlessly with Swift Testing framework, providing specialized support for snapshotting AVAudioPCMBuffer’s with various visualization strategies.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-604"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-602">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-603'
	>
	Waveform: Time-Domain Visualization</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-607"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-605">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-606'
	>
	The waveform strategy provides the familiar amplitude-over-time view. It&#8217;s perfect for spotting timing issues, clipping, unexpected silence, or amplitude problems:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-609"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">strategy:</span><span class="token"> .</span><span class="token">waveform(</span><span class="token">width:</span><span class="token"> </span><span class="token" style="color: #005cc5;">3000</span><span class="token">, </span><span class="token">height:</span><span class="token"> </span><span class="token" style="color: #005cc5;">800</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">func testSineWave</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">of:</span><span class="token"> buffer</span><span class="token">, </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">sine</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-612"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-610"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-611">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/03/image-92-1-1400x373.jpg				media='(max-width: 699px)'
				type=image/jpeg								height="373"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/03/image-92-1.jpg"
					class="image__img block-media__image-img"
					alt=""
										height="533"
															width="1999"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-615"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-613">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-614'
	>
	Want to compare two audio buffers visually? The waveform strategy automatically overlays multiple buffers:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-617"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">strategy:</span><span class="token"> .</span><span class="token">waveform(</span><span class="token">width:</span><span class="token"> </span><span class="token" style="color: #005cc5;">3000</span><span class="token">, </span><span class="token">height:</span><span class="token"> </span><span class="token" style="color: #005cc5;">800</span><span class="token">)</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">func testComparison</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">of:</span><span class="token"> </span><span class="token">(</span><span class="token">sineBuffer</span><span class="token">, </span><span class="token">squareBuffer</span><span class="token">)</span><span class="token">, 
</span></span><span class="line"><span class="token">        </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">sine-over-square</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-620"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-618"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-619">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/03/image-93-1-1400x350.jpg				media='(max-width: 699px)'
				type=image/jpeg								height="350"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/03/image-93-1.jpg"
					class="image__img block-media__image-img"
					alt=""
										height="500"
															width="1999"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-623"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-621">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-622'
	>
	This renders the first buffer in red, the second in green, making differences immediately obvious.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-626"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-624">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-625'
	>
	Spectrum: Frequency-Domain Visualization</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-629"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-627">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-628'
	>
	While waveforms show what happens over time, spectrum analysis reveals frequency content. This is invaluable when testing filters, equalizers, or any DSP that operates in the frequency domain:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-631"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">strategy:</span><span class="token"> .</span><span class="token">spectrum(</span><span class="token">width:</span><span class="token"> </span><span class="token" style="color: #005cc5;">1500</span><span class="token">, </span><span class="token">height:</span><span class="token"> </span><span class="token" style="color: #005cc5;">400</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">func testWhiteNoise</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">of:</span><span class="token"> buffer</span><span class="token">, </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">white-noise</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-634"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-632"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-633">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/03/image-94-1-1400x373.webp				media='(max-width: 699px)'
				type=image/webp								height="373"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/03/image-94-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="400"
															width="1500"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-637"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-635">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-636'
	>
	Spectrogram: Time-Frequency Representation</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-640"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-638">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-639'
	>
	The spectrogram strategy combines time and frequency analysis, showing how spectral content evolves:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-642"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">strategy:</span><span class="token"> .</span><span class="token">spectrogram(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">hopSize:</span><span class="token"> </span><span class="token" style="color: #005cc5;">4096</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">frequencyCount:</span><span class="token"> </span><span class="token" style="color: #005cc5;">2048</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">amplitudeScale:</span><span class="token"> .</span><span class="token">logarithmic(</span><span class="token">range:</span><span class="token"> </span><span class="token" style="color: #005cc5;">120</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">func testChirp</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">of:</span><span class="token"> buffer</span><span class="token">, </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">chirp</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-645"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-643">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-644'
	>
	Spectrograms are particularly useful for analyzing complex signals, transient events, or any audio where frequency content changes over time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-648"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-646">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-647'
	>
	Streamlined Workflow</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-651"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-649">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-650'
	>
	For an even smoother development experience, the library offers the <code>autoOpen</code> parameter. When enabled during recording, it automatically opens visualizations in Preview (on macOS), eliminating the need to manually locate and open files:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-653"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">@Test</span><span class="token">(</span><span class="token">
</span></span><span class="line"><span class="token">    .</span><span class="token">audioSnapshot(</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">record:</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">strategy:</span><span class="token"> .</span><span class="token">waveform(</span><span class="token">width:</span><span class="token"> </span><span class="token" style="color: #005cc5;">3000</span><span class="token">, </span><span class="token">height:</span><span class="token"> </span><span class="token" style="color: #005cc5;">800</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">        </span><span class="token">autoOpen:</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">func testWithAutoOpen</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">async</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">await</span><span class="token"> </span><span class="token">assertAudioSnapshot(</span><span class="token">of:</span><span class="token"> buffer</span><span class="token">, </span><span class="token">named:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">test</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-656"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-654">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-655'
	>
	This is particularly useful when iterating on DSP algorithms—run the test, and the waveform appears instantly for visual verification.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-659"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-657">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-658'
	>
	Why a Standalone Library?</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-662"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-660">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-661'
	>
	While swift-snapshot-testing is an excellent library, we wanted a specialised approach. Audio is about samples—raw numeric data representing sound waves. In AudioSnapshotTesting, sample-by-sample comparison is the source of truth. Visualizations are secondary, generated only on failure or during recording as debugging aids. The audio files are always preserved, allowing inspection in any audio editor.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-665"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-663">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-664'
	>
	Try it out</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-668"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-666">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-667'
	>
	In this article, we&#8217;ve shown how snapshot testing serves dual purposes: providing rapid feedback during development and acting as a comprehensive regression suite. The techniques we&#8217;ve explored—waveform visualization, spectrum analysis, and spectrogram generation—aren&#8217;t new, but integrating them into your test suite transforms them from manual verification tools into automated quality gates.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-671"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-669">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-670'
	>
	With audio files always preserved for detailed inspection, configurable bit depth for balancing file size and precision, and workflow enhancements like auto-opening, AudioSnapshotTesting makes audio testing both powerful and practical.<br />
<br />
As long-term AudioKit users, we&#8217;ve benefited immensely from the community&#8217;s contributions to audio development on Apple platforms. We&#8217;re thrilled to give back with this tool and hope it helps others build more reliable audio software.<br />
<br />
The library is open source and available on GitHub, and we welcome contributions from the community:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-674"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-672">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-673'
	>
	<li><a href="https://github.com/AudioKit/AudioSnapshotTesting">AudioSnapshotTesting Github Repository</a></li><li><a href="https://github.com/jcavar/Metronome">Metronome implementation guided by snapshot testing</a></li></ul></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/snapshot-testing-for-audio-dsp/">Snapshot Testing for Audio DSP</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19273808https://infinum.com/uploads/2025/12/img-Ai-automation-hero-min-2.webp</url>
				</image>
				<title>AI Automation: What It Is and How AI-Powered Workflow Helps Your Business</title>
				<link>https://infinum.com/blog/ai-automation/</link>
				<pubDate>Mon, 22 Dec 2025 12:16:50 +0000</pubDate>
				<dc:creator>Tanja Bezjak</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19273808</guid>
				<description>
					<![CDATA[<p>Discover what AI automation is and how it helps your business boost efficiency, streamline workflows, and make smarter data-driven decisions.</p>
<p>The post <a href="https://infinum.com/blog/ai-automation/">AI Automation: What It Is and How AI-Powered Workflow Helps Your Business</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-850"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-677">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-680"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-678">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-679'
	>
	Businesses are enthusiastically adopting artificial intelligence, with McKinsey reporting that <a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai#:~:text=In%20the%20latest%20survey%2C%2078%20percent%20of%20respondents%20say%20their%20organizations%20use%20AI%20in%20at%20least%20one%20business%20function" target="_blank" rel="noreferrer noopener">78% of companies now use at least one AI tool</a>. Not surprisingly, the adoption rate is even higher in <a href="https://infinum.com/news/infinum-embeds-ai-across-product-development/" target="_blank" rel="noreferrer noopener">tech companies</a>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-683"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-681">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-682'
	>
	With this information in mind, it is only natural that <strong>AI automation</strong> is a much sought-after innovation.<br><br>Of course, you might want to understand it better before you decide you need it for your operations. We are here to help you with that.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-686"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-684">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-685'
	>
	What is AI automation?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-689"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-687">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-688'
	>
	AI automation is the process of using advanced technologies to make standard automated operations smarter and context-aware. It reduces the manual effort your team needs to put in by using AI and intelligent automation for tasks such as data analysis, report generation, and workflow optimization.<br><br>AI automation uses a mix of software, data, and decision logic to quickly and automatically execute tasks that normally require time and human judgment.<br><br>The specific technologies involved depend entirely on the business case: sometimes it’s simple rules, sometimes it’s document processing, and in certain cases it can include <a href="https://infinum.com/machine-learning-development-services/" id="https://infinum.com/machine-learning-development-services/">machine-learning</a> or NLP models. The goal is always to make a workflow faster, more consistent, and less manually intensive.<br><br>Instead of predicting the “right” action on its own, AI supports the decisions that have already been defined. It can classify information, extract meaning from text or images, or surface relevant insights so that the system can follow the workflow the business has set.<br><br>When conditions change, the model can adjust its behavior within those boundaries, which makes it more flexible than fixed, step-by-step scripting.<br>As the system is used, its components can be refined through controlled cycles of periodic updates or retraining based on new data. <br><br>In short, AI automation expands what traditional automation can do by helping systems understand inputs and choose the right path in a defined workflow, all within clear business rules and oversight.<br><br>Since the process is still responsive, AI automation can be very useful in areas where you want constant monitoring. In cybersecurity, it can spot <a href="https://infinum.com/blog/cybersecurity-trends-2026/" id="https://infinum.com/blog/cybersecurity-trends-2026/">suspicious behavior</a> and trigger alerts instantly. In fraud detection, it can analyze transactions in real time to prevent losses.<br><br>Similarly, it can also be very useful for initial screening tasks, where the technology can decide who to send the problem to. For example, AI can be used to scan <a href="https://infinum.com/healthcare-application-development-services/" id="https://infinum.com/healthcare-application-development-services/">medical test reports</a> and X-rays to make initial diagnoses, significantly reducing manual effort. They then forward it to the specialists who verify it and recommend treatment. <br><br>This makes the process of getting healthcare quicker for patients and frees up healthcare providers to focus on the people who need them most.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-692"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple__content-align--left"
	data-id="es-690"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-691'
	>
	Curious as to how technology professionals use AI? Here are the <a href="https://infinum.com/blog/ai-agency-ai-tools/" target="_blank" rel="noreferrer noopener">five ways we use AI solutions</a> at Infinum.</p>		</div>

			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-695"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-693">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-694'
	>
	How is AI automation different from traditional automation?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-698"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-696">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-697'
	>
	Traditional Automation, without AI, is a mechanical process that follows fixed and predefined rules. For example, a conveyor belt is automated: You flip a switch, and it starts moving. It might be programmed to stop if there is no weight on it, but it cannot react to a situation for which it was not explicitly programmed.<br><br>In contrast, AI-driven process automation can adapt its behavior based on input: it can interpret unstructured text, classify information, or extract relevant details, allowing the workflow to respond appropriately without manual intervention. The automation still follows defined steps, but the AI components enable the system to process a wider range of human input, formats, and real-world variability.<br><br>A simple example is a smart chatbot. The user enters a query using natural language, and the tool interprets the intent to create an appropriate response accordingly, leveraging large language models.<br><br>At a slightly more advanced level, <a href="https://infinum.com/artificial-intelligence/agent-development/" id="https://infinum.com/artificial-intelligence/agent-development/">AI agents</a> take this a step further. Agentic AI can autonomously or semi-autonomously automate entire processes rather than individual tasks. They can plan, reason, and even collaborate with other systems or humans to achieve their goals.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-701"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-699">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-700'
	>
	Intelligent automation: Taking AI automation further</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-704"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-702">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-703'
	>
	Intelligent automation (IA) is the next level of AI automation. Here, instead of tasks or processes, entire ecosystems are automated. They can run, adapt, and improve over time, all on their own.<br><br>There are three key technologies that power these digital workers:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-708"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-705"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-20-text js-typography card-simple__heading'
	data-id='es-706'
	>
	Robotic process automation (RPA)</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-707'
	 id='es-705-paragraph'>
	This component is made up of software, not hardware, “robots” that automate repetitive, rule-based digital tasks. For example, they may be used to copy data between systems, generate reports, or update customer records without requiring any creativity or strategy. In these cases, RPA mimics human actions to complete these jobs, while saving you time and reducing manual errors.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-712"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-709"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-20-text js-typography card-simple__heading'
	data-id='es-710'
	>
	Business process management (BPM)</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-711'
	 id='es-709-paragraph'>
	BPM tools help visualize processes so you can identify bottlenecks and orchestrate work between humans, bots, and systems. This visualization helps you define how tasks and data flow across your organization, reducing complex workflows that slow productivity.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-716"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-713"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-20-text js-typography card-simple__heading'
	data-id='es-714'
	>
	Artificial intelligence</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-715'
	 id='es-713-paragraph'>
	This is the layer that adds reasoning, learning, and adaptability. AI analyzes data to identify patterns and make proactive decisions based on context. AI includes technologies such as ML, NLP, and computer vision.<br><br>With these components working together, you can move beyond automating isolated tasks. Intelligent automation can handle end-to-end workflows. It can detect issues, trigger corrective actions, and even enhance business outcomes. Getting there requires AI that&#8217;s properly integrated into your systems, not bolted on. Our <strong><a href="https://infinum.com/artificial-intelligence/custom-solutions/">custom AI solutions</a></strong> are built for exactly this kind of production-grade, workflow-embedded deployment.<br><br>Essentially, while AI automation makes individual processes smarter, intelligent automation transforms how entire business operations function. For AI agents to operate reliably in these workflows, they need live access to the data they&#8217;re acting on — the infrastructure that makes this possible is explained in our overview of <a href="https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/">Model Context Protocols</a>.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-719"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-717">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-718'
	>
	How AI automation works</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-722"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-720">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-721'
	>
	To create AI automation, you need to integrate processes with artificial intelligence. The processes create the framework around which algorithms are built.<br><br>These algorithms use the same decision-making logic that a person would, and are trained on business data. This informs them of the type of information and the patterns to expect. <br><br>The logic built into them allows them to use new data to spot these patterns and make predictions. Meanwhile, ML allows them to learn from it, so the systems continuously refine and improve their results.<br><br>Here is a quick overview of the parts that come together to make this technology work: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-726"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-723"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-724'
	>
	Foundational models and cloud services</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-725'
	 id='es-723-paragraph'>
	This infrastructure enables AI automation to function and scale effectively, with foundational models serving as the “thinking” component and <a href="https://infinum.com/cloud-application-development-services/" id="https://infinum.com/cloud-application-development-services/">cloud services</a> as the delivery mechanism.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-730"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-727"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-728'
	>
	Data collection and processing</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-729'
	 id='es-727-paragraph'>
	Data is the fuel that powers your system. Both structured and unstructured data need to be collected and made ready to be used in AI training.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-734"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-731"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-732'
	>
	AI model training</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-733'
	 id='es-731-paragraph'>
	The AI-ready data is used to “teach” the model how to complete its assigned tasks, using the following techniques:</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-737"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-735">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-736'
	>
	<li><strong>Machine learning algorithms:</strong> While not all automation solutions will include ML elements, some will use it to further optimize their operations and enable additional features, as needed. In these cases, automation solutions will be empowered with ML algorithms, including:</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-740"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-738">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-739'
	>
	<li><strong>Supervised learning</strong>: The model is given explicitly labeled data, so it learns how to categorize it.</li><li><strong>Unsupervised learning</strong>: The training data is unlabeled, and the model must find patterns and meaning on its own.</li><li><strong>Reinforcement learning</strong>: The model learns from the feedback it receives while interacting with its environment.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-743"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-741">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-742'
	>
	<li><strong>Deep learning</strong>: A subset of ML that uses neural networks with many layers to automatically discover features and patterns in large volumes of data.</li><li><strong>Natural language processing</strong>: The ability of a model to understand and interpret the way people talk and respond in a similar manner.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-747"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-744"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-745'
	>
	Execution</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-746'
	 id='es-744-paragraph'>
	The model is deployed into the workflow, where it uses the decision engine to make predictions, and applies these to determine how to action the next step.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-751"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-748"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-749'
	>
	Continuous learning</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-750'
	 id='es-748-paragraph'>
	Also known as lifelong or incremental learning, this allows the model to perpetually refine algorithms and improve results based on the new data it receives.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-757"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-752"
	 href='https://infinum.com/blog/ai-strategy/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-753'
	>
	Not sure about how to draft your AI strategy? Let us give you a hand.</p>		</div>

		<button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-754"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-755'
	>
	Read more</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-756'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-760"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-758">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-759'
	>
	Benefits of AI-powered automation in your business</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-763"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-761">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-762'
	>
	We already know that AI automation can free up your human workers by taking over routine tasks. Let us take a look at how this can benefit your business:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-767"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-764"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-765'
	>
	Fewer errors, more accuracy</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-766'
	 id='es-764-paragraph'>
	Unlike people, AI does not get bored or distracted. Once a system has been trained, it will carry out tasks consistently, without losing focus or requiring much human intervention. As a result, you will see fewer or even zero mistakes. Automation with AI can empower your workers to deliver better, faster results, especially when tasks are repetitive.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-771"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-768"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-769'
	>
	Faster operations</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-770'
	 id='es-768-paragraph'>
	AI automation can complete even the most complex tasks in a matter of seconds. It helps your team deliver more work, but without a corresponding increase in mistakes. This improves efficiency across the board and eliminates redundant work, boosting your employees’ morale.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-775"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-772"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-773'
	>
	Real-time responsiveness</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-774'
	 id='es-772-paragraph'>
	AI can identify the new inputs and process them in the blink of an eye. This allows your business to adapt to changes and issues in real time. As a result, your operations stay agile, and any potential problems are caught by automated systems before they escalate.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-779"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-776"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-777'
	>
	Scalable growth</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-778'
	 id='es-776-paragraph'>
	As your business grows, you need more hands on deck to complete the workload manually. Automating processes with AI, however, means you can handle more complex data, interactions, and transactions without hiring more staff. You might need to buy or rent more resources, but that will only be required if the growth is exponential.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-783"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-780"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-781'
	>
	Data-led decision-making</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-782'
	 id='es-780-paragraph'>
	Artificial intelligence can analyze large data sets to find trends and enable predictive analytics. It helps you extract actionable insights from your business information. Most importantly, it does so quickly, often in real time. As a result, you can make informed decisions based on hard facts and numbers.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-787"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-784"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-785'
	>
	More time for human creativity</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-786'
	 id='es-784-paragraph'>
	Not everything can be replaced with technology, but you can automate tedious work so that your human resources are free to focus on strategic or creative endeavors. It helps your people innovate and solve complex problems without worrying about “busy work.” That helps your business productivity and boosts employee morale and engagement.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-790"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-788">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-789'
	>
	AI automation use cases</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-793"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-791">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-792'
	>
	Reading about benefits in an abstract sense does not paint a very clear picture. Here&#8217;s how businesses across industries are applying AI automation to solve their challenges:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-797"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-794"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-795'
	>
	Finance and accounting</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-796'
	 id='es-794-paragraph'>
	The finance industry is heavily regulated, so accuracy and compliance are a priority. You also need to make quick, data-driven decisions. AI automation is the ideal solution here, reducing manual work and human error in data-heavy tasks.<br><br>One of its most important uses in financial services is to flag anomalies and detect potential fraud in real time. However, it can also reconcile transactions and automate expense reporting and invoice processing to save teams hours of administrative work.<br><br>The result is cleaner data, faster reporting, and improved financial visibility.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-801"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-798"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-799'
	>
	Healthcare and life sciences</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-800'
	 id='es-798-paragraph'>
	Automated AI systems scan X-rays, lab results, and medical records to provide initial diagnoses. Urgent cases are prioritized and flagged for specialists to look at, while routine cases can be automatically given treatment plans. This reduces waiting times for patients and allows healthcare professionals to focus on direct care.<br><br>AI tools also streamline the administrative side, by automating appointment scheduling, patient record updates, and discharge documentation to save time and reduce paperwork.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-805"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-802"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-803'
	>
	Manufacturing and logistics</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-804'
	 id='es-802-paragraph'>
	In manufacturing and logistics, automation technologies predict problems before they occur, to keep operations running smoothly. They monitor equipment performance to detect maintenance needs and automatically adjust production schedules. <br><br>These technologies can reroute shipments to optimize delivery times based on real-time conditions. The result: fewer delays, lower costs, and stronger supply chain resilience.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-809"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-806"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-807'
	>
	Marketing and sales</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-808'
	 id='es-806-paragraph'>
	AI marketing automation personalizes engagement at scale. It segments audiences based on behavior and demographics to create tailored messages that deliver more engagement and results, improving customer experience. <br><br>AI-powered automation analyzes customer data to predict purchasing intent and suggest the best next action for each lead to improve conversion rates and help teams focus on high-value prospects. For customer-facing automation specifically, the conversation is shifting toward entirely new channels — our breakdown of <a href="https://infinum.com/blog/apps-in-chatgpt-and-the-apps-sdk/">ChatGPT Apps</a> covers how brands are building agentic experiences directly inside the ChatGPT interface.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-813"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-810"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-811'
	>
	Human resources</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-812'
	 id='es-810-paragraph'>
	Automated tools can screen resumes to match candidates to roles. They can even handle initial communication. Once employees are onboarded, AI-driven HR systems can manage routine queries and update records automatically. <br><br>This leaves HR professionals free to focus on talent development and culture-building.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-817"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-814"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-815'
	>
	Customer service and support</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-816'
	 id='es-814-paragraph'>
	AI automation tools streamline customer interactions. Chatbots and virtual assistants powered by generative AI development provide round-the-clock support. They handle common questions and route complex issues to the right human agent. <br><br>Meanwhile, customer service teams can spend their time on the conversations that need a human touch.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-820"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple__content-align--left"
	data-id="es-818"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-819'
	>
	We helped the surgeons at Mount Sinai Hospital to identify prosthetic implants with an AI-powered app. Read more about it in our <a href="https://infinum.com/work/aidentyfy/" target="_blank" rel="noreferrer noopener">case study</a>.</p>		</div>

			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-823"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-821">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-822'
	>
	Challenges of implementing AI automation</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-826"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-824">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-825'
	>
	Implementing AI workflow automation solutions can be a great way to optimize your operations. However, the process requires careful planning, or it will not increase efficiency. <br><br>Here are some caveats to consider:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-830"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-827"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-828'
	>
	Data quality and accessibility</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-829'
	 id='es-827-paragraph'>
	AI and automation systems are only as good as the data that powers them. If your data is outdated, inconsistent, or siloed across departments, your models will not deliver accurate results. This is the problem Databricks is specifically designed to address, and we cover how in our article on <strong><a href="https://infinum.com/blog/scaling-ai-with-databricks/">scaling AI with Databricks</a></strong>. Clean, structured, and accessible data is often a bigger hurdle than the technology itself.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-834"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-831"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-832'
	>
	Integration with existing systems</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-833'
	 id='es-831-paragraph'>
	It is highly likely that your business runs on a combination of legacy platforms and custom software. Seamlessly integrate your business-critical software into your existing ecosystem with the help of a bespoke software development company.<br> <br>Without proper integration, you will find it hard to ensure that AI delivers insights and actions across your entire ecosystem. If you aren’t careful, automation efforts could potentially create new silos instead of eliminating them.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-838"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-835"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-836'
	>
	Skills and expertise gaps</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-837'
	 id='es-835-paragraph'>
	You need more than coding knowledge to implement AI automation. You also need expertise in data engineering, process mapping, and user experience design, along with a clear understanding of your business goals. <br><br>Most teams don’t have all these capabilities in-house, which can make it hard to move from pilot projects to production-ready systems.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-842"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-839"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-840'
	>
	Ethics, compliance, and governance</h3>		</div>

		<p	class='typography typography--size-20-text-roman js-typography card-simple__paragraph'
	data-id='es-841'
	 id='es-839-paragraph'>
	AI systems must handle data responsibly. Bias, privacy concerns, and regulatory requirements can create significant risks if not addressed early. <br><br>Establishing strong governance practices, from data management to model transparency, is essential to ensure automation remains ethical and compliant.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-845"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-843">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-844'
	>
	Automate your business with the right partner</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-848"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-846">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-847'
	>
	Several of the above challenges can be mitigated by working with the right technology partner, such as Infinum. <br><br>We have the experience that allows us to develop solutions tailored to your needs, so they can integrate easily with your existing technology and workflows.  <br><br>Most importantly, our methods, reporting, and internal processes meet strict, internationally <a href="https://infinum.com/certifications-partnerships/" target="_blank" rel="noreferrer noopener">recognised security standards</a>. With Infinum, the security of your AI automation solution will be in safe hands. <br><br>We have a large team that can help you navigate strategy development, <a href="https://infinum.com/artificial-intelligence/data-engineering/" target="_blank" rel="noreferrer noopener">data engineering</a>, model building, deployment and integration, as well as ongoing monitoring and maintenance. <br><br><em>Interested in learning more about how we can help you with your AI automation journey? <a href="https://infinum.com/contact/" target="_blank" rel="noreferrer noopener">Talk to us</a>!</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/ai-automation/">AI Automation: What It Is and How AI-Powered Workflow Helps Your Business</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19272193https://infinum.com/uploads/2025/11/img-GPT-apps.webp</url>
				</image>
				<title>Your Brand Needs a ChatGPT App Strategy, Now</title>
				<link>https://infinum.com/blog/apps-in-chatgpt-and-the-apps-sdk/</link>
				<pubDate>Tue, 11 Nov 2025 17:27:03 +0000</pubDate>
				<dc:creator>Branimir Akmadža</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19272193</guid>
				<description>
					<![CDATA[<p>The new era of apps is conversational. ChatGPT-native apps are redefining how users discover, interact with, and transact with digital products, and Infinum is ready to help brands lead this shift.</p>
<p>The post <a href="https://infinum.com/blog/apps-in-chatgpt-and-the-apps-sdk/">Your Brand Needs a ChatGPT App Strategy, Now</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper js-table-of-contents-data"
	data-id="es-868"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-851">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-854"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-852">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-853'
	>
	<strong>OpenAI’s new Apps SDK unlocks a powerful new frontier where apps live inside ChatGPT – interactive, real-time, and seamlessly part of natural conversation. This shift is going to redefine how customers discover, interact with, and purchase digital products. And it’s a big deal.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-857"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-855">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-856'
	>
	There are moments in tech when everything changes: the rise of the web, the move to the cloud, the boom of app stores. We believe we&#8217;re witnessing the next one: apps inside ChatGPT.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-860"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-858">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-859'
	>
	<strong>What are the apps inside ChatGPT, and how do they work?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-863"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-861">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-862'
	>
	OpenAI&#8217;s new <a href="https://openai.com/index/introducing-apps-in-chatgpt/" target="_blank" rel="noreferrer noopener">Apps SDK allows developers to build native apps</a> that live inside the ChatGPT interface, enabling users to transact, explore, and interact through natural language. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-866"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-864">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-865'
	>
	Instead of asking users to visit your site, download your app, or fill out a form, you’ll be able to meet them where they already are: inside ChatGPT, right in the flow of conversation.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-871"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-869"
	 data-media-type='video'>

	<div class="video__wrapper" data-id="es-870">
		<video
		class="video block-media__video js-video js-block-media-video video--cursor-takeover-use"
		 loop autoplay playsinline muted preload='metadata'>
		<source  src='https://infinum.com/uploads/2025/11/Domi-Chat-GPT-2.mp4' type='video/mp4' />	</video>
	</div></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-889"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-872">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-876"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-873"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
					</div>

		<div class="intro-label card-simple__outro-label intro-label__line-type--outro" data-id="es-874">
	<p	class='typography typography--size-14-text-roman js-typography intro-label__outro-label'
	data-id='es-875'
	>
	WELCOME TO THE ERA OF CHATGPT APPS.</p></div>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-879"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-877">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-878'
	>
	Whether users are booking a trip, checking their finances, or buying a product, the entire customer journey happens in one interface: fast, intuitive, and frictionless. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-881"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-880'
	>
	<strong>For users, it means fewer redirects and smoother interactions. For brands, it opens up a new channel, a new revenue stream, and a more direct way to turn interest into action. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-884"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-882">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-883'
	>
	At Infinum, we’ve been building mobile and web apps for 20 years. We know how to work with app stores, backend platforms, complex UX, and <a href="https://infinum.com/artificial-intelligence/agent-development/" id="https://infinum.com/artificial-intelligence/agent-development/">intelligent, agentic automation</a>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-887"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-885">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-886'
	>
	ChatGPT Apps feel like a natural next step, and we are ready to help you claim a place in the new AI-native web. </p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-918"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-890">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-893"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-891">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-892'
	>
	<strong>Why GPT Apps are a turning point for digital experiences</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-896"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-894">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-895'
	>
	ChatGPT is no longer just a place to ask questions.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-899"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-897">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-898'
	>
	With over<strong> </strong><a href="https://techcrunch.com/2025/10/06/sam-altman-says-chatgpt-has-hit-800m-weekly-active-users/" target="_blank" rel="noreferrer noopener">800 million weekly ChatGPT users</a>, it’s quickly becoming a connective layer of the internet, bringing together natural information, easily accessible information, and now services into one unified flow. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-902"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-900">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-901'
	>
	Success now means being genuinely useful at the exact moment of need, not the loudest voice in the room.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-907"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-903">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-904'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-905'
	>
	<strong>People don’t search for answers anymore – they expect to ask and get them instantly. With </strong><a href="https://www.capgemini.com/wp-content/uploads/2019/09/Report-%E2%80%93-Conversational-Interfaces_Web-Final.pdf?utm_source=chatgpt.com"><strong>74% of consumers</strong></a><strong> embracing chat and voice assistants, brands have a once-in-a-generation opportunity to capture first-mover advantage, define the new standard of customer experience, and be truly innovative in their vertical.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-906'
	>
	KASPER KUIJPERS, FOUNDER &amp; CTO OF YOUR MAJESTY, PART OF INFINUM<br />
</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-910"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-908">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-909'
	>
	And while it was only a matter of time before ChatGPT moved beyond search and became a platform for doing, this isn’t happening in isolation.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-913"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-911">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-912'
	>
	Microsoft Copilot, Google Gemini, and Meta’s AI efforts are all moving toward embedding services into conversational AI. But OpenAI’s ChatGPT is leading the way with native app capabilities. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-916"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-914">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-915'
	>
	This isn&#8217;t just a product trend — it&#8217;s a strategic inflection point. If you haven&#8217;t mapped out where AI fits in your business model, our <a href="https://infinum.com/blog/ai-strategy/">AI strategy guide</a> covers how to evaluate and prioritize AI use cases before committing to a build.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-924"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-919">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-922"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-920">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-921'
	>
	<strong>What GPT Apps can do for your business</strong></h2></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-977"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="grid block-grid__grid" data-id="es-976">
	
<div class="block-grid-item" data-id="es-925">
	

</div>

<div class="block-grid-item" data-id="es-935">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-927"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-926"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-930"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-928">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-929'
	>
	1</p>	<div class="bullet__content">
			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-934"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-931"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-932'
	>
	<strong>Get discovered at the right moment</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-933'
	 id='es-931-paragraph'>
	ChatGPT actively recommends apps based on users&#8217; requests. Your brand can appear in conversations that match your offer, opening an organic path to discovery.</p>	</div>
</div>	</div>
</div>

<div class="block-grid-item" data-id="es-945">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-937"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-936"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-940"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-938">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-939'
	>
	2</p>	<div class="bullet__content">
			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-944"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-941"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-942'
	>
	<strong>Reduce friction to boost conversions</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-943'
	 id='es-941-paragraph'>
	No downloads, no redirects, just a question and an answer. Embedding your product or service directly in the conversation shortens the conversion funnel.<br />
</p>	</div>
</div>	</div>
</div>

<div class="block-grid-item" data-id="es-955">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-947"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-946"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-950"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-948">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-949'
	>
	3</p>	<div class="bullet__content">
			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-954"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-951"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-952'
	>
	<strong>Build a high-intent revenue stream</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-953'
	 id='es-951-paragraph'>
	Unlike traditional ads that try to create interest, GPT Apps connect you with people who already have it. You’re meeting users right when they’re expressing a need, turning intent into action.</p>	</div>
</div>	</div>
</div>

<div class="block-grid-item" data-id="es-965">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-957"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-956"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-960"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-958">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-959'
	>
	4</p>	<div class="bullet__content">
			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-964"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-961"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-962'
	>
	<strong>Shape the market as an early mover</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-963'
	 id='es-961-paragraph'>
	Like in the early days of the App Store, early adopters will shape expectations, gain visibility, and build loyalty, all while unlocking opportunities for new kinds of applications and businesses to emerge.<br />
</p>	</div>
</div>	</div>
</div>

<div class="block-grid-item" data-id="es-975">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-967"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-966"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-970"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-968">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-969'
	>
	5</p>	<div class="bullet__content">
			</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-974"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-971"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-972'
	>
	<strong><strong>Learn from real interactions</strong><br />
</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-973'
	 id='es-971-paragraph'>
	Every conversation tells you something: what users want, where they drop off, and how you can improve their experience.<strong> </strong></p>	</div>
</div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1010"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-978">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-981"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-979">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-980'
	>
	<strong>What you can build inside ChatGPT Apps</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-984"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-982">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-983'
	>
	ChatGPT Apps combine the best of conversation and interactivity, creating experiences that feel both natural and capable. Here’s what you can build:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-988"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-985">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-986'
	>
	<strong><strong><strong>Conversational commerce experiences</strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-987'
	>
	Let users discover, compare, and purchase products directly in chat. Offer personalized recommendations, real-time inventory checks, and seamless checkout flows. <br />
<br />
For bonus points, let users delegate actions like “If this laptop’s price drops below X, buy it.” The agent can track prices and automatically execute approved actions.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-992"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-989">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-990'
	>
	<strong><strong><strong><strong>Personalized recommendations, booking, and scheduling</strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-991'
	>
	Combine AI with your business logic to provide custom suggestions: products, learning paths, travel plans, or wellness routines tailored to each user’s needs. <br />
<br />
Building off of recommendations, allow users to book appointments, trips, rentals, or restaurant tables through simple conversation. With calendar integrations and smart prompts, booking becomes effortless.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-996"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-993">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-994'
	>
	<strong><strong><strong><strong><strong>Data analysis &amp; visualization</strong></strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-995'
	>
	Let users analyze personal or business data: spending, health, traffic, engagement, and more, and get instant visualizations, comparisons, and insights. This is the foundation of an <a href="https://infinum.com/blog/ai-knowledge-hubs/">AI-powered knowledge hub</a> — we&#8217;ve built these for insurance underwriters, fitness brands, and procurement teams, turning raw data into decisions through a chat interface.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1000"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-997">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-998'
	>
	<strong><strong><strong><strong><strong><strong>Configuration &amp; support</strong></strong></strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-999'
	>
	Turn FAQs, troubleshooting, and account management into guided conversational flows. Users can set up services, customize products, solve issues, update details, or access information without switching channels or contacting support. Building this well is harder than it looks — our breakdown of <a href="https://infinum.com/blog/ai-chatbot-development-pain-points/">AI chatbot development pain points</a> covers the three most common ways these projects go wrong.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1004"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1001">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1002'
	>
	<strong><strong><strong><strong><strong><strong><strong>Real-time transactions</strong></strong></strong></strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1003'
	>
	Let users complete actions like money transfers, document signing, or file uploads directly in ChatGPT conversations.<br />
</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1008"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1005">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1006'
	>
	<strong><strong><strong><strong><strong><strong><strong><strong>Microlearning &amp; training</strong></strong></strong></strong></strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1007'
	>
	Deliver short, interactive lessons for education, compliance, or professional development, perfect for learning in context or on the go.</p>	</div>
</div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1016"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-1015">
	
<div class="block-column" data-id="es-1014">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1013"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1011"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1012">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/11/gpt-app-2-1400x735.webp				media='(max-width: 699px)'
				type=image/webp								height="735"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/11/gpt-app-2.webp"
					class="image__img block-media__image-img"
					alt="ChatGPT interface showing a Finix finance app responding to a user query with a spending activity chart and transaction history, illustrating a conversational finance GPT app"
										height="1260"
															width="2400"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1022"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-1021">
	
<div class="block-column" data-id="es-1020">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1019"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1017"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1018">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/11/gpt-app-3-new-1400x735.webp				media='(max-width: 699px)'
				type=image/webp								height="735"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/11/gpt-app-3-new.webp"
					class="image__img block-media__image-img"
					alt="ChatGPT interface showing a Solenne fashion app responding to a purchase request with three handbag product cards and Shop Now buttons, demonstrating conversational commerce inside ChatGPT"
										height="1260"
															width="2400"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-1046"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1023">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1026"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1024">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1025'
	>
	<strong>Which industries can benefit from Apps inside ChatGPT?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1029"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1027">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1028'
	>
	While <strong>retail and ecommerce </strong>are the obvious front-runners, because of the direct path from browsing to purchase, any business offering a product or service can benefit from GPT-native experiences.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1032"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1030">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1031'
	>
	<strong>Travel services</strong> can handle <strong>accommodation, car rentals, ticketing, and dining </strong>booking, confirmations, and itinerary changes through natural queries. In<strong> finance and insurance,</strong> users can analyze spending, receive optimization advice, or complete policy onboarding, all without forms or separate logins.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1035"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1033">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1034'
	>
	In <strong>healthcare,</strong> apps can track metrics from wearables and suggest personalized health actions or recommend lifestyle adjustments. For <strong>education,</strong> GPT-native apps can analyse lessons and learning materials, generate study plans, and adapt based on progress. Even <strong>real estate, legal, and public services </strong>can use this channel to offer instant document reviews, local insights, or access to experts. And with the<strong> Internet of Things, </strong>GPT-native experiences can bridge voice, sensors, and automation, letting users control, monitor, and optimize connected devices just by asking.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1038"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1036">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1037'
	>
	The unifying theme? If your customers can ask for it, we can build an experience for it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-1041"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1039">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1040'
	>
	<strong>How to prepare for ChatGPT App integration</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1044"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1042">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1043'
	>
	ChatGPT App development takes both strategic readiness and technical execution. We recommend focusing on speed, ROI, and user experience. </p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1100"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div data-id="es-1095" class="block-horizontal-manual-carousel js-block-horizontal-manual-carousel block-horizontal-manual-carousel__align-items--top">
	<div class="block-horizontal-manual-carousel__container block-horizontal-manual-carousel__container--gutter-default js-block-horizontal-manual-carousel-container">
		<div class="cursor-takeover block-horizontal-manual-carousel__cursor-takeover" data-id="es-1096">
		<div class="cursor-takeover__cursor js-block-horizontal-manual-carousel-cursor-takeover block-horizontal-manual-carousel__cursor">
		<div class="cursor-takeover__wrap">
			<i
	class="icon cursor-takeover__drag-left icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-left-16' data-id='es-1097'>
	<svg height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g fill='none' fill-rule='evenodd' stroke='currentColor' stroke-width='2' transform='matrix(-1 0 0 1 17 0)'><g transform='translate(0 2)'><path d='m.5 5.99999 14 .00001'/><path d='m9.23352.7251 5.97848 5.97852'/><path d='m9.23352 11.2744 5.97848-5.9785'/></g></g></svg></i><i
	class="icon cursor-takeover__drag-right icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1098'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>
			<div class="cursor-takeover__circle js-block-horizontal-manual-carousel-cursor-takeover-circle" aria-hidden="true">
				<p	class='typography typography--size-12-text typography--uppercase js-typography cursor-takeover__label'
	data-id='es-1099'
	>
	drag</p>			</div>
		</div>
	</div>
	</div>		
<div class="block-carousel-item" data-id="es-1054">
	
<div class="block-typography" data-id="es-1047">
	<p	class='typography typography--size-14-text-roman js-typography block-typography__typography'
	data-id='es-1048'
	>
	STRATEGIC READINESS<br></p></div>

<div class="block-typography" data-id="es-1049">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1050'
	>
	01</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1051"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1052'
	>
	<br />
<strong><strong>Identify conversational moments</strong></strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1053'
	 id='es-1051-paragraph'>
	Ask: where would chat feel more natural than forms or menus? Review support tickets, drop-off points, and key product flows. Look for places where a simple prompt can replace a multi-step process. <a href="https://infinum.com/blog/ai-automation/">AI automation</a> tools already solve parts of this — the question is where conversational AI goes further by replacing structured flows entirely with natural-language interactions.<br><br><em>Need help mapping this? We can guide </em><a href="https://infinum.com/strategy-design/" target="_blank" rel="noreferrer noopener"><em>discovery and user research.</em></a><em> </em></p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1062">
	
<div class="block-typography" data-id="es-1055">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1056'
	>
	.</p></div>

<div class="block-typography" data-id="es-1057">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1058'
	>
	02</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1059"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1060'
	>
	<br />
<strong><strong>Audit your data</strong></strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1061'
	 id='es-1059-paragraph'>
	Map out your data sources, formats, and ownership. Check for accuracy, duplication, and sensitive fields that shouldn’t be exposed. Classifying your data early prevents compliance risks and ensures AI works with clean, reliable inputs later on. If your data isn&#8217;t production-ready, this step is where you&#8217;ll need <a href="https://infinum.com/artificial-intelligence/data-engineering/">data engineering</a> support — clean pipelines and governed data sources are a prerequisite for any AI system that produces reliable outputs. For organisations in regulated sectors, our <a href="https://infinum.com/cybersecurity/">cybersecurity services</a> include the technical assessments needed to ensure your AI systems meet security and compliance requirements before launch.<br></p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1070">
	
<div class="block-typography" data-id="es-1063">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1064'
	>
	.</p></div>

<div class="block-typography" data-id="es-1065">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1066'
	>
	03</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1067"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1068'
	>
	<br />
<strong><strong><strong>Design for conversation</strong></strong></strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1069'
	 id='es-1067-paragraph'>
	GPT Apps aren’t websites in a chat box, they’re apps that feel like dialogue. That means designing flows that are short, contextual, and responsive. Focus on natural prompts, clear responses, and interaction patterns that match how people actually talk while staying true to your brand voice.<br />
</p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1078">
	
<div class="block-typography" data-id="es-1071">
	<p	class='typography typography--size-14-text-roman js-typography block-typography__typography'
	data-id='es-1072'
	>
	TECHNICAL EXECUTION<br></p></div>

<div class="block-typography" data-id="es-1073">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1074'
	>
	04</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1075"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1076'
	>
	<br />
<strong><strong><strong><strong>Connect your systems</strong></strong></strong></strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1077'
	 id='es-1075-paragraph'>
	Your backend probably doesn’t need an overhaul – just a smart integration layer that exposes it through the <a href="https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/" id="https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/">Model Context Protocol</a>. By implementing an MCP server around your API, you’ve already done most of the work to join the GPT Apps ecosystem. Then, add secure session handling and real-time sync to enable dynamic content.<br></p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1086">
	
<div class="block-typography" data-id="es-1079">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1080'
	>
	.</p></div>

<div class="block-typography" data-id="es-1081">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1082'
	>
	05</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1083"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1084'
	>
	<br />
<strong style="font-weight: bold">Build and test with the Apps SDK</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1085'
	 id='es-1083-paragraph'>
	Set up the Apps SDK, implement OpenAI’s Model Context Protocol, and build a responsive front end. Validate with real user flows, track where users succeed or stall, and iterate quickly to ensure product-market fit.<br />
</p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1094">
	
<div class="block-typography" data-id="es-1087">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1088'
	>
	.</p></div>

<div class="block-typography" data-id="es-1089">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1090'
	>
	06</p></div>

<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1091"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h3	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1092'
	>
	<br />
<strong>Prepare for marketplace launch</strong></h3>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1093'
	 id='es-1091-paragraph'>
	A compelling app isn’t just functional, it’s discoverable. Once your app is ready, we can help refine branding, connect analytics, and ensure conversion optimization post-launch.</p>	</div>
</div>
</div>
	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1171"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1101">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div
	class="block-featured-card js-block-featured-card"
	data-id="es-1102"
	data-orientation="vertical">
	<a
		href="https://infinum.com/artificial-intelligence/agent-development/"
		class="block-featured-card__link js-block-featured-card-link"
		>

		
		<div class="block-featured-card__content js-block-featured-card-content">
			<div class="block-featured-card__heading-wrap js-block-featured-card-heading-wrap">
				<p	class='typography typography--size-36-text js-typography block-featured-card__heading'
	data-id='es-1103'
	>
	<strong>Want to move fast? Try our Agentic Sprint and turn the right business use case into a live AI agent prototype in just 10 days.</strong><br />
</p>			</div>

					</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right block-featured-card__btn js-block-featured-card-btn js-block-featured-card-button"
	data-id="es-1104"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-1105'
	>
	Learn more</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1106'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</a>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-1110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1108">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1109'
	>
	<strong>Technical foundation for GPT Apps</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1111">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1112'
	>
	To build a production-ready GPT App, your stack should include:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1114">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1115'
	>
	<li><strong>Well-documented APIs</strong> for core business functions (e.g., pricing, account access, bookings)</li><li><strong>Secure authentication flows</strong> to manage sessions within the GPT context</li><li><strong>Lightweight frontend assets</strong> (HTML/CSS/JS) that can be rendered inline or full-screen inside ChatGPT</li><li><strong>Structured data sources</strong> like product catalogs or user history for personalized responses</li><li><strong>Integration via Model Context Protocol (MCP)</strong> so ChatGPT understands and responds in sync with your app’s state</li><li><strong>Optional: analytics hooks</strong> to monitor usage, performance, and conversion in real time</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1117">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1118'
	>
	We help you scope, prioritize, and build what’s needed, starting with use cases that deliver clear user and business value.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-1122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1120">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1121'
	>
	<strong>Why act now?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1123">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1124'
	>
	GPT Apps are in early rollout, which means the market is open, but it won’t be for long. Just like early app store adopters or companies that invested early in mobile, the ones who explore ChatGPT apps first will enjoy:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1126">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1127'
	>
	Greater visibility as one of the few apps in a category</h3>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1129">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1130'
	>
	More room to define interaction patterns and user expectations</h3>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1132">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1133'
	>
	Better data, sooner, giving you a head start on optimization</h3>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1135">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1136'
	>
	By the time this ecosystem matures, brands that moved early will have more traction, more insights, and a stronger position.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-1140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1138">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1139'
	>
	<strong>Should you build in-house or outsource?</strong><br />
</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1141">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1142'
	>
	If you already have strong in-house teams across AI, UX, and platform engineering, you can probably build internally.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1144">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1145'
	>
	But if speed, quality, and confidence matter, partnering with a team like<strong> Infinum</strong> can get you further, faster. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1147'
	>
	For over two decades, we have been building award-winning digital products that succeed in competitive ecosystems, including the Apple App Store, Google Play, and enterprise marketplaces.  </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1149">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1150'
	>
	We know what it takes to build for evolving platforms. See everything we offer under our <a href="https://infinum.com/artificial-intelligence/">AI and data engineering services</a> — from agent development to custom AI solutions and data infrastructure.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1152">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1153'
	>
	Our experience with marketplaces, app standards, and the OpenAI Apps SDK means we can turn early ideas into launch-ready products with clarity and precision.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1155">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1156'
	>
	<strong>What we offer:</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1160"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1158">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1159'
	>
	<li>Discovery workshops to align goals and identify opportunities</li><li>Rapid prototyping and MVP delivery to test the market quickly</li><li>Full-stack engineering for production-ready GPT Apps</li><li>Post-launch support, analytics, and iteration</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true js-table-of-contents-data"
	data-id="es-1163"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1161">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1162'
	>
	<strong>Your move: build where 800M users already are</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1166"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1164">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1165'
	>
	ChatGPT-native apps represent a shift in how users find and use digital products. Infinum is here to help you be part of that change, from strategy to shipping.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1169"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1167">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1168'
	>
	<em><a href="https://infinum.com/contact/" target="_blank" rel="noreferrer noopener">Let’s turn your service into a ChatGPT-native app</a> and get you in front of 800 million users, faster.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/apps-in-chatgpt-and-the-apps-sdk/">Your Brand Needs a ChatGPT App Strategy, Now</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19271031https://infinum.com/uploads/2025/10/Three_Months_of_the_EAA-2.webp</url>
				</image>
				<title>Self-Reporting Is the Future of Accessibility Compliance</title>
				<link>https://infinum.com/blog/self-reporting-accessibility-compliance/</link>
				<pubDate>Thu, 16 Oct 2025 16:56:58 +0000</pubDate>
				<dc:creator>Ana Šekerija</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19271031</guid>
				<description>
					<![CDATA[<p>Why self-reporting is emerging as the leading enforcement model, and what you should be doing right now to stay ahead.</p>
<p>The post <a href="https://infinum.com/blog/self-reporting-accessibility-compliance/">Self-Reporting Is the Future of Accessibility Compliance</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1411"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1172">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1175"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1173">
	<p	class='typography typography--size-36-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1174'
	>
	<strong>Since June 28, 2025, the European Accessibility Act (EAA) has moved from slides to sprint boards. Monitoring bodies are in place, and penalties are on the table. But the real question is: Who checks compliance, and how does enforcement actually work?</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1178"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1176">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1177'
	>
	The <a href="https://infinum.com/blog/european-accessibility-act/" target="_blank" rel="noreferrer noopener">European Accessibility Act (EAA) </a>is an EU directive, fully in effect since June 2025, that requires all businesses serving EU users to make their websites, apps, and digital interfaces accessible to people with disabilities – from compatibility with assistive technologies to clear navigation and text alternatives.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1179">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1180'
	>
	While accessibility benefits all digital products, helping them reach more customers, boost satisfaction, and strengthen retention, the EAA specifically highlights key industries that must ensure their products and services are accessible.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1182'
	>
	The EAA applies to digital services in banking, e-commerce, transportation, telecommunications, and media. Non-compliance can result in fines, product withdrawal, or even restricted market access, depending on the country.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1186"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1184">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1185'
	>
	Since accessibility is not only a legal requirement but also a clear business advantage, the EAA now gives you two strong reasons to make it a priority.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1189"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1187">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1188'
	>
	Let’s see how this plays out across European countries.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1192"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1190">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1191'
	>
	<strong>Compliance  starts with owning your accessibility gaps</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1195"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1193">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1194'
	>
	Early signals point to two complementary forces. For one thing, users and advocacy groups are pushing cases into the open. On the other hand, regulators are leaning into structured self-reporting, asking companies to disclose accessibility gaps and fix them on the clock. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1198"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1196">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1197'
	>
	Together, they’re setting a new baseline: accessibility you can prove.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1201"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1199">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1200'
	>
	<strong>Advocacy groups stepping </strong>up in France</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1202">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1203'
	>
	Disability and advocacy groups have formally notified several major retailers of inaccessible online shopping experiences. It’s one of the first signs that strategic, plaintiff-led actions will quickly surface non-compliance. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1207"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1205">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1206'
	>
	These groups acted as soon as the EAA came into effect, and that timing says a lot: people have waited a long time to be heard. For many, this is about daily independence—buying groceries, managing time, living life.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1210"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1208">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1209'
	>
	This also hits the heart of digital commerce. People with disabilities shop online more often than the general population. Inaccessible flows don’t just violate rights, they block real demand.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1211'
	>
	One 2025 survey found that 50% of disabled consumers shop online weekly, and 6% daily, compared to just 22% of the general population (Fable, 2025).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1215"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1213">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1214'
	>
	Once a notice goes public, the impact is immediate. Headlines move faster than fixes. Legal teams scramble. Roadmaps derail. The French cases show that fixing accessibility early avoids this spiral. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1218"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1216">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1217'
	>
	You’ll need to meet the requirements anyway—so why not do it ahead of the curve and turn a potential legal or PR issue into a competitive advantage.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1219">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1220'
	>
	The Netherlands’ bold bet on self-reporting</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1222">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1223'
	>
	The Dutch have taken a different, rather pragmatic approach. Instead of waiting for complaints to pour in, companies serving Dutch consumers must self-report any WCAG 2.1 AA breaches and explain how they’ll fix them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1226"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1225'
	>
	Self-reporting builds evidence, reduces risk, and embeds accessibility into your process rather than leaving it to a one-time push. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1229"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1227">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1228'
	>
	We believe this is the future: transparent, scalable, and fair. Other countries will follow.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1230">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1231'
	>
	Although the first deadline for self-reporting has just passed in the Netherlands (October 15), late reporting is still encouraged and a far better choice than silence and pasivity.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1233">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1234'
	>
	Who must self-report in the Netherlands?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1236">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1237'
	>
	Short answer: any company serving Dutch consumers with a product that isn’t fully accessible.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1241"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1239">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1240'
	>
	It doesn’t matter where your HQ is, the EAA applies to the markets you serve.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1244"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1242">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1243'
	>
	If you are a Dutch company and your service was inaccessible on June 28, and you didn’t report by October 15, your legal and financial risk has increased, but late reporting is still the right move.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1247"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1245">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1246'
	>
	What should be reported?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1250"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1248">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1249'
	>
	If an update introduces an accessibility issue later from October 15 onwards, report it by severity:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1251">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1252'
	>
	Critical or serious</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1253'
	>
	report within 1 week</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1258"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1255">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1256'
	>
	Moderate or minor</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1257'
	>
	report within 1 month</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1261"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1259">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1260'
	>
	Note that if it&#8217;s detected and fully fixed within that window, you don’t need to report.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1262">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1263'
	>
	<br />
Which regulator do you report to?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1267"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1265">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1266'
	>
	<br />
That depends on your sector:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1268">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1269'
	>
	ACM</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1270'
	>
	e-commerce, platforms, electronic communications</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1275"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1272">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1273'
	>
	AFM</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1274'
	>
	financial and banking services</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1279"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1276">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1277'
	>
	CvdM</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1278'
	>
	audiovisual media and e-books</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1280">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1281'
	>
	ILT</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1282'
	>
	transport and online bookings</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1284">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1285'
	>
	What the report should include</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1290"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1287">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1288'
	>
	<strong>A clear, plain-language audit</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1289'
	>
	List accessibility issues in your website or app. Include screenshots, examples, and user journeys (like search, checkout, or login). Use WCAG 2.2 AA as your working standard. It’s future-proof and improves UX, even if 2.1 AA is the current legal baseline.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1291">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1292'
	>
	<strong><strong><strong><strong>Impact and severity</strong></strong></strong></strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1293'
	>
	Tag each issue as critical, serious, moderate, or minor. Describe the user impact in a sentence. If possible, estimate how many users are affected—it strengthens your case.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1298"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1295">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1296'
	>
	<strong><strong><strong>A remediation plan</strong></strong></strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1297'
	>
	For every issue, note the owner, fix approach, and target date. Group fixes that can be solved through your design system so they scale across products.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1302"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1299">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1300'
	>
	<strong><strong><strong><strong>Any exceptions</strong></strong></strong></strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1301'
	>
	If you claim disproportionate burden or a fundamental alteration, explain why. Also, share what support you&#8217;ll provide in the meantime.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1306"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-1303">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1304'
	>
	<strong><strong><strong><strong><strong>Evidence and updates</strong></strong></strong></strong></strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1305'
	>
	Link to tickets and shipped fixes. Update the plan when timelines shift. Keep it centralized and current so you can demonstrate progress when asked.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1309"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1307">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1308'
	>
	Penalties &amp; cooperation</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1312"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1310">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1311'
	>
	Dutch regulators can issue fines up to €900,000, or 1–10% of annual turnover for larger companies. Media fines are typically lower (up to €90,000). </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1315"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1313">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1314'
	>
	But proactive self-reporting and visible progress reduce exposure and signal control.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1318"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1316">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1317'
	>
	Why self-reporting is the future of EAA enforcement</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1321"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1319">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1320'
	>
	Even outside the Netherlands, this model applies. It provides documentation, reduces risk, and turns accessibility into a repeatable operational habit.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1324"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1322">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1323'
	>
	Most importantly, it addresses the scale problem. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1326"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1325'
	>
	No regulator can manually inspect every product, release, or patch. But asking companies to name gaps, commit to fixes, and show progress? That can scale.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1329"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1327">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1328'
	>
	The Dutch model rewards honesty and progress. You disclose issues, prioritize by impact, and work on a visible timeline. This directs effort to where it matters most: unblocking logins, checkouts, and support flows, and building system-level improvements across shared components.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1332"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1330">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1331'
	>
	Finally, it’s fair and portable. Whether you’re local or global, the rules and expectations are the same. Publish your current status. Maintain a severity-based backlog. Show ownership and updates. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1335"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1333">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1334'
	>
	That gives users access they can feel, provides regulators with proof of progress, and offers you a system that holds up over time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1338"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1336">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1337'
	>
	Action points based on your product maturity</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1339">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1340'
	>
	If your product is live</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1346"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1342">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1343'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1344'
	>
	Run a proper audit</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1345'
	>
	Don’t rely solely on scanners; include manual tests with assistive tech and map findings to WCAG 2.2 AA</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1347">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1348'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1349'
	>
	Prioritize by impact and effort</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1350'
	>
	Mark critical/serious issues for immediate work to meet reporting timelines</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1356"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1352">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1353'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1354'
	>
	Self-report with a remediation plan</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1355'
	>
	Self-report to the right authority with your remediation plan</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1361"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1357">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1358'
	>
	4</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1359'
	>
	Update your Accessibility Statement</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1360'
	>
	Reflect actual status, fixes in progress, and feedback channels</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1366"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1362">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1363'
	>
	5</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1364'
	>
	Track progress and update</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1365'
	>
	Report newly-found matters on time. and log new issues as they surface</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1369"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1367">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1368'
	>
	If you&#8217;re launching a new product</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1374"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1370">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1371'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1372'
	>
	Accessibility in the SDLC</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1373'
	>
	Include it from day one in requirements, designs, components, QA, and content</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1379"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1375">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1376'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1377'
	>
	WCAG 2.2 AA as your baseline</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1378'
	>
	Ship the productwith WCAG 2.2 AA as the baseline, aligned with EN 301 549</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1384"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1380">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1381'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1382'
	>
	Accessibility Statement</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1383'
	>
	Publish your Accessibility Statement at launch</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1389"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--black block-bullet__bullet" data-id="es-1385">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1386'
	>
	4</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1387'
	>
	Maintain documentation</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1388'
	>
	Document decisions, exceptions, and test results from the start; you’ll need the receipts later</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1392"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1390">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1391'
	>
	<br />
<br />
Need help getting started? We’ve published <a href="https://infinum.com/blog/european-accessibility-act/">foundational EAA resources</a> and a <a href="https://infinum.com/handbook/accessibility">practical accessibility handbook</a>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1395"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1393">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1394'
	>
	Start there, then go deeper with an <a href="https://infinum.com/accessibility/#:~:text=Request%20a%20comprehensive%20accessibility%20audit">audit and hands-on guidance</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1398"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1396">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1397'
	>
	Better late than passive</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1401"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1399">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1400'
	>
	Self-reporting is the future of EAA enforcement because it scales, creates evidence, and gets fixes where they matter most. It turns accessibility from a scramble into a steady rhythm, with clear owners and trackable dates.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1404"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1402">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1403'
	>
	If you lead product, now’s the time to set the cadence. Publish your current status, tackle the top blockers, and update on a schedule. Keep it simple, visible, and repeatable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1406"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1405'
	>
	If you want support, <a href="https://infinum.com/accessibility/">we can help you start this week</a>. Infinum can run the audit, shape the plan, prep the self-report, and keep it moving.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1409"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1407">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1408'
	>
	Let’s make accessibility something you can prove, and be proud of.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/self-reporting-accessibility-compliance/">Self-Reporting Is the Future of Accessibility Compliance</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19267151https://infinum.com/uploads/2025/07/img-apple-on-device-hero-1.webp</url>
				</image>
				<title>Apple’s Quiet AI Revolution: What On-Device AI Means for the Future of iOS Apps</title>
				<link>https://infinum.com/blog/apple-on-device-ai/</link>
				<pubDate>Mon, 30 Jun 2025 13:10:27 +0000</pubDate>
				<dc:creator>Filip Gulan</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19267151</guid>
				<description>
					<![CDATA[<p>Apple’s new On-device AI unlocks powerful, private, and cost-efficient features for iOS apps. Here’s what product teams need to know.</p>
<p>The post <a href="https://infinum.com/blog/apple-on-device-ai/">Apple’s Quiet AI Revolution: What On-Device AI Means for the Future of iOS Apps</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1580"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1412">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1415"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1413">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1414'
	>
	WWDC 2025 didn’t bring the loudest fireworks in AI. But make no mistake: <strong>Apple just pulled a strategic move that every product leader should pay attention to.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1418"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1416">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1417'
	>
	While headlines are locked on GPT-4o, Gemini 1.5, and the escalating cloud model race, Apple is taking a different route — one that’s deeply integrated, privacy-centric, and highly relevant for anyone building digital products inside its ecosystem.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1421"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1419">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1420'
	>
	The star of this shift? Apple’s new <strong>Foundation Models Framework.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1424"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1422">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1423'
	>
	<strong>Foundation Models 101</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1427"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1425">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1426'
	>
	At its core, Apple’s Foundation Models Framework gives third-party iOS developers access to Apple’s own generative AI models directly on-device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1430"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1428">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1429'
	>
	Here are some of the key specs:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1433"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1431">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1432'
	>
	<li>A language model with roughly 3 billion parameters, fine-tuned for Apple Silicon.</li><li>Fully local inference, which means no cloud dependency for most AI tasks.</li><li>Multimodal support, allowing for both text and image inputs, as well as tool invocation.</li><li>Privacy, safety guardrails, and structured output features built-in.</li><li>Deep native integration via Swift and Xcode, where developers can invoke AI features with just a few lines of code.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1436"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1434">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1435'
	>
	Apple isn’t competing directly with GPT-4 or Claude here. Instead, it&#8217;s delivering a highly optimized model specifically designed for real-world iPhone and iPad apps. The developer tooling is where things get especially interesting because Apple is making AI integration far more predictable and production-ready than many off-the-shelf open-source models.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1439"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1437">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1438'
	>
	<strong>Standout developer features</strong><br />
</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1443"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1440">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1441'
	>
	<strong>Guided Generation:</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1442'
	>
	Developers can generate structured outputs like objects, lists, or JSON using Swift annotations.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1447"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1444">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1445'
	>
	<strong>Tool Calling:</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1446'
	>
	Models can invoke app-defined functions during generation to pull real-time or app-specific data.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1451"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1448">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1449'
	>
	<strong><strong>Safety Guardrails</strong>:</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1450'
	>
	Apple includes built-in content filtering and responsible AI guidelines to ensure outputs remain safe and aligned.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1454"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1452">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1453'
	>
	Put simply: Apple isn&#8217;t just delivering a model — it&#8217;s delivering<strong> an entire AI operating layer baked into iOS.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1457"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1455">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1456'
	>
	For full technical details, Apple’s official <a href="https://developer.apple.com/wwdc25/">WWDC 2025 developer documentation</a> is a must-read.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1460"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1458">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1459'
	>
	<strong>Why this is a big deal (even if it’s not GPT-4)</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1463"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1461">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1462'
	>
	On-device AI isn’t exactly new as a concept. But Apple just made it radically easier to adopt.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1466"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1464">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1465'
	>
	<strong><strong>AI becomes a native OS capability</strong></strong><br />
</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1469"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1467">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1468'
	>
	Think back to when apps first got access to cameras, GPS, or push notifications. Foundation Models mark a similar inflection point. Developers now get direct access to <strong>powerful generative AI inside the iPhone’s operating system</strong>, without the need for complicated APIs, server costs, or compliance headaches.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1472"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1470">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1471'
	>
	In effect, Apple is turning every iPhone into a personal AI computer.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1475"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1473">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1474'
	>
	<strong>Privacy by design</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1478"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1476">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1477'
	>
	<strong>Data never leaves the device.</strong> For product teams building in highly regulated sectors like finance, healthcare, and enterprise SaaS, this is a major advantage. You can now build AI-powered features that analyze personal or sensitive data while keeping everything securely on-device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1481"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1479">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1480'
	>
	<strong>More predictable AI economics for product teams</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1484"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1482">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1483'
	>
	While many teams are willing to invest heavily in AI innovation, <strong>the long-term economics of AI operations can still influence product roadmaps.</strong> With Foundation Models running on-device, teams avoid paying ongoing fees for third-party APIs, cloud infrastructure, or dedicated inference servers. AI capabilities become part of the app itself, simplifying budgeting and allowing companies to scale features to larger user bases without costs ballooning unpredictably over time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1487"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1485">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1486'
	>
	<strong>On-device ML models make up for great UX</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1490"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1488">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1489'
	>
	Since models run directly on the device, <strong>AI features become instantly responsive.</strong> There are no network delays, no dependency on server round-trips, and full functionality even when users are offline. Whether someone is flying, commuting underground, or traveling through areas with poor connectivity, <strong>the experience remains smooth and fully available.</strong> For many apps, this level of instant responsiveness doesn’t just improve UX — it unlocks entirely new product possibilities where speed and privacy are non-negotiable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1493"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1491">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1492'
	>
	<strong>Use cases product leaders should explore</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1496"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1494">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1495'
	>
	There’s a couple of months before iOS 26 becomes publicly available, so the real-world applications for Apple&#8217;s Foundation Models are yet to materialize. In theory, these opportunities cut across multiple industries, each with their own relevant on-device AI use cases. Let&#8217;s break it down:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1501"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-1497">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1498'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1499'
	>
	<strong>Healthcare</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1500'
	>
	Summarizing patient notes or analyzing personal health data securely on-device</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1506"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-1502">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1503'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1504'
	>
	<strong>Fintech</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1505'
	>
	Parsing financial documents or generating reports with no cloud processing.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1511"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-1507">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1508'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1509'
	>
	<strong>SaaS &amp; productivity</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1510'
	>
	Auto-summarizing meeting notes, emails, or customer tickets offline.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1516"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-1512">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1513'
	>
	4</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1514'
	>
	<strong>Consumer apps</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1515'
	>
	Personalized chatbots that work offline (travel, fitness, shopping assistance).</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1521"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-1517">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-1518'
	>
	5</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1519'
	>
	<strong>Connected devices &amp; smart home</strong></p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-1520'
	>
	Voice-controlled assistants that manage schedules, automate routines, or optimize energy use directly on-device without sharing data externally.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1524"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1522">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1523'
	>
	For developers already experimenting, some early success stories have surfaced on <a href="https://www.reddit.com/r/iOSProgramming/">Reddit’s iOSProgramming forum</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1527"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1525">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1526'
	>
	<strong>Questions product leaders should be asking</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1530"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1528">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1529'
	>
	Apple’s approach comes with some trade-offs that product leaders need to navigate carefully.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1533"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1531">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1532'
	>
	<li>What AI-powered features could we build that benefit from privacy and offline functionality?</li><li>Where are we currently incurring cloud AI costs that could be reduced with on-device inference?</li><li>How do we get started? What is the right first feature or prototype to explore with Apple&#8217;s Foundation Models?</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1536"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1534">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1535'
	>
	<strong>Great all around, still not a silver bullet</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1539"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1537">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1538'
	>
	Apple’s approach comes with some trade-offs that product leaders need to navigate carefully.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1542"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1540">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1541'
	>
	<li><strong>The model’s size is limited.</strong> At ~3B parameters, it’s not built for open-ended reasoning or general knowledge.</li><li><strong>It’s not fully open or fine-tunable.</strong> Apple’s black-box approach limits deep customization.</li><li><strong>It’s Apple-exclusive.</strong> Equivalent Android capabilities simply aren’t widely available today.</li><li><strong>Hybrid models may still be necessary</strong> for some advanced use cases.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1545"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1543">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1544'
	>
	In short, this works brilliantly for many domain-specific or app-specific tasks but isn’t intended to replace cloud-based LLMs entirely.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1548"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1546">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1547'
	>
	<strong>Where we see opportunity</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1551"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1549">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1550'
	>
	At Infinum, we see this as one of the most important updates for mobile product development in recent years.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1554"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1552">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1553'
	>
	Why? Because this isn&#8217;t just about adding AI as a feature. <strong>It&#8217;s about creating differentiated experiences</strong> that competitors can’t easily replicate, building trust with privacy-conscious users and enterprise clients, and controlling costs while still delivering highly sophisticated features.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1557"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1555">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1556'
	>
	This levels the playing field: you don’t need to be an AI research lab to build intelligent apps. But you do need strategic product expertise, domain-specific prompt engineering, and deep knowledge of Apple&#8217;s AI stack.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1560"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1558">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1559'
	>
	<strong>What comes next?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1563"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1561">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1562'
	>
	Apple devices are becoming exponentially more powerful by the year. With each hardware leap, Apple’s AI capabilities are maturing as well. So you can safely expect this quiet revolution to accelerate.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1566"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1564">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1565'
	>
	Users will increasingly<strong> expect AI assistance as a standard part of their apps</strong>, much like they expect biometric logins or dark mode today<strong>.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1569"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1567">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1568'
	>
	For product leaders, the smartest move right now is to experiment early, build prototypes, and assess<strong> where on-device AI can create meaningful value.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1572"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1570">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1571'
	>
	If you&#8217;re thinking about how to bring AI features to your iOS product roadmap — while staying cost-efficient, privacy-compliant, and future-proof — this is exactly the right moment to start that conversation.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1575"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1573">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1574'
	>
	Interested in utilizing Apple’s new AI model but not sure where to start? This is where Infinum can add real value: <strong>advisory, rapid prototyping, and hands-on expertise across AI/ML &amp; mobile.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1578"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1576">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1577'
	>
	For those who want to dive even deeper, Apple&#8217;s own <a href="https://machinelearning.apple.com">Machine Learning Research blog</a> offers technical insights into how these models were designed.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/apple-on-device-ai/">Apple’s Quiet AI Revolution: What On-Device AI Means for the Future of iOS Apps</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19266836https://infinum.com/uploads/2025/06/An-accessibility-review-of-new-design-style-by-Apple-hero-1.webp</url>
				</image>
				<title>Apple&#8217;s iOS 26 Liquid Glass: Sleek, Shiny, and Questionably Accessible</title>
				<link>https://infinum.com/blog/apples-ios-26-liquid-glass-sleek-shiny-and-questionably-accessible/</link>
				<pubDate>Thu, 12 Jun 2025 11:01:30 +0000</pubDate>
				<dc:creator>Davor Naumoski</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19266836</guid>
				<description>
					<![CDATA[<p>The post <a href="https://infinum.com/blog/apples-ios-26-liquid-glass-sleek-shiny-and-questionably-accessible/">Apple&#8217;s iOS 26 Liquid Glass: Sleek, Shiny, and Questionably Accessible</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1595"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1581">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1584"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1582">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1583'
	>
	<strong>48 hours into Apple’s iOS 26 reveal, and accessibility experts are already speaking up. Is Liquid Glass a top-shelf design innovation, or a glass ceiling for inclusive design?</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1587"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1585">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1586'
	>
	Liquid Glass is Apple’s new digital material introduced with iOS 26: a reactive, translucent design that animates, morphs, and responds to your touch in real time. It’s visually striking, with glowing highlights and slick, glass-like effects that change depending on the content and context.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1590"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1588">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1589'
	>
	According to Apple:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1593"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1591">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1592'
	>
	“Controls have a refreshed look across platforms… the knob transforms into Liquid Glass during interaction, and buttons fluidly morph into menus and popovers.”</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1598"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1596"
	 data-media-type='video'>

	<div class="video__wrapper" data-id="es-1597">
		<video
		class="video block-media__video js-video js-block-media-video video--cursor-takeover-use"
		 loop autoplay playsinline muted preload='metadata'>
		<source  src='https://infinum.com/uploads/2025/06/ezgif.com-gif-to-mp4-converter-2.mp4' type='video/mp4' />	</video>
	</div></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1602"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1599"
	>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
					</div>

		<div class="intro-label card-simple__outro-label intro-label__line-type--outro" data-id="es-1600">
	<p	class='typography typography--size-14-text-roman js-typography intro-label__outro-label'
	data-id='es-1601'
	>
	LIQUID GLASS IS A NEW DIGITAL META-MATERIAL THAT DYNAMICALLY BENDS AND SHAPES LIGHT. &#8211; APPLE</p></div>	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1605"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-paragraph" data-id="es-1603">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1604'
	>
	Currently in beta and rolling out with iOS 26 later this year, Liquid Glass is already generating equal parts excitement and criticism.</p></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1620"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1609">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1608"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1606">
	</div>	</div>
</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1612"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1610">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1611'
	>
	<strong>The Apple doesn&#8217;t fall far from the previous design revolutions</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1615"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1613">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1614'
	>
	Apple has never shied away from shaking up UI design. Remember iOS 7? Some praised its minimalism. Others&#8230; well, one four-year-old famously <a href="https://www.youtube.com/watch?v=MnmYBB92vcY&amp;ab_channel=BloombergOriginals" target="_blank" rel="noreferrer noopener">burst into tears after updating.</a></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1618"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1616">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1617'
	>
	Liquid Glass may look futuristic, but it didn’t appear out of nowhere. A look back at the key design moments reveals how Apple got here.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1662"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div data-id="es-1657" class="block-horizontal-manual-carousel js-block-horizontal-manual-carousel block-horizontal-manual-carousel__align-items--bottom">
	<div class="block-horizontal-manual-carousel__container block-horizontal-manual-carousel__container--gutter-default js-block-horizontal-manual-carousel-container">
		<div class="cursor-takeover block-horizontal-manual-carousel__cursor-takeover" data-id="es-1658">
		<div class="cursor-takeover__cursor js-block-horizontal-manual-carousel-cursor-takeover block-horizontal-manual-carousel__cursor">
		<div class="cursor-takeover__wrap">
			<i
	class="icon cursor-takeover__drag-left icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-left-16' data-id='es-1659'>
	<svg height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g fill='none' fill-rule='evenodd' stroke='currentColor' stroke-width='2' transform='matrix(-1 0 0 1 17 0)'><g transform='translate(0 2)'><path d='m.5 5.99999 14 .00001'/><path d='m9.23352.7251 5.97848 5.97852'/><path d='m9.23352 11.2744 5.97848-5.9785'/></g></g></svg></i><i
	class="icon cursor-takeover__drag-right icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1660'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>
			<div class="cursor-takeover__circle js-block-horizontal-manual-carousel-cursor-takeover-circle" aria-hidden="true">
				<p	class='typography typography--size-12-text typography--uppercase js-typography cursor-takeover__label'
	data-id='es-1661'
	>
	drag</p>			</div>
		</div>
	</div>
	</div>		
<div class="block-carousel-item" data-id="es-1626">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1621"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1622"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1623">
	<picture class="image__picture card-simple__image-picture">
												<img
					src="https://infinum.com/uploads/2025/06/aqua.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="768"
															width="1024"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1624'
	>
	<strong>2001: Aqua (macOS X)</strong></h2>		</div>

		<p	class='typography typography--size-18-text-roman js-typography card-simple__paragraph'
	data-id='es-1625'
	 id='es-1621-paragraph'>
	Apple’s first big leap into using digital “materials” to create a rich, visual UX.</p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1632">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1627"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1628"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1629">
	<picture class="image__picture card-simple__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/ios7-1400x1050.webp				media='(max-width: 699px)'
				type=image/webp								height="1050"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/ios7.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="1200"
															width="1600"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1630'
	>
	<strong>2013: iOS 7</strong></h2>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1631'
	 id='es-1627-paragraph'>
	Apple ditched skeuomorphism for a colorful translucency, real-time blur and motion. </p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1638">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1633"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1634"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1635">
	<picture class="image__picture card-simple__image-picture">
												<img
					src="https://infinum.com/uploads/2025/06/iPhone-X-Plus-2018-5-2.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="1050"
															width="550"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1636'
	>
	<strong><strong>2017: iPhone X &amp; iOS 11</strong></strong></h2>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1637'
	 id='es-1633-paragraph'>
	With the Home button gone, Apple introduced a more tactile, fluid UI. </p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1644">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1639"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1640"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1641">
	<picture class="image__picture card-simple__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/big-sur-1400x786.webp				media='(max-width: 699px)'
				type=image/webp								height="786"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/big-sur.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="1291"
															width="2299"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1642'
	>
	<strong>2020: macOS Big Sur</strong></h2>		</div>

		<p	class='typography typography--size-18-text-roman js-typography card-simple__paragraph'
	data-id='es-1643'
	 id='es-1639-paragraph'>
	Big Sur brought back depth with soft shadows and glassy surfaces. </p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1650">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1645"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1646"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1647">
	<picture class="image__picture card-simple__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/visionos-home-screen-mt-hood-1400x788.webp				media='(max-width: 699px)'
				type=image/webp								height="788"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/visionos-home-screen-mt-hood.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="900"
															width="1600"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1648'
	>
	<strong>2023: visionOS</strong></h2>		</div>

		<p	class='typography typography--size-18-text-roman js-typography card-simple__paragraph'
	data-id='es-1649'
	 id='es-1645-paragraph'>
	Built for spatial computing, visionOS introduced floating, translucent interfaces that respond to light, movement, and your gaze. <br />
</p>	</div>
</div>
</div>

<div class="block-carousel-item" data-id="es-1656">
	
<div	class="card-simple js-card-simple block-card__card-simple card-simple__content-align--left"
	data-id="es-1651"
	>

	
	<div	class="media card-simple__media media__border--none media__align--center-left"
	data-id="es-1652"
	 data-media-type='image'>

	<figure class="image card-simple__image-figure image--overflow image--size-stretch" data-id="es-1653">
	<picture class="image__picture card-simple__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/liquidglassmain2-1400x933.webp				media='(max-width: 699px)'
				type=image/webp								height="933"
												width="1400"
				 />
								
			<source
				srcset=https://infinum.com/uploads/2025/06/liquidglassmain2-2400x1600.webp				media='(max-width: 1199px)'
				type=image/webp								height="1600"
												width="2400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/liquidglassmain2.webp"
					class="image__img card-simple__image-img"
					alt=""
										height="1760"
															width="2640"
										loading="lazy"
					 />
					</picture>

	</figure></div>
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1654'
	>
	<strong>2025: iOS 26 &amp; Liquid Glass</strong></h2>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1655'
	 id='es-1651-paragraph'>
	Apple’s boldest visual update yet: a dynamic, translucent material that bends light, reacts to touch, and brings apps to life.<br />
<br />
</p>	</div>
</div>
</div>
	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1680"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1666">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1665"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1663">
	</div>	</div>
</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1669"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1667">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1668'
	>
	<strong>Where Liquid Glass falls short</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1672"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1670">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1671'
	>
	Since the reveal, designers and accessibility experts on X (formerly Twitter) have been quick to weigh in. While some love the new aesthetic, others are raising valid concerns, especially around<strong> readability, contrast, and sensory overload.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1675"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1673">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1674'
	>
	Accessibility in digital design means making sure <em>everyone</em>, including people with disabilities,&nbsp; can use your app or website. It’s not an add-on. It’s fundamental. And for users with vision impairments, dyslexia, or neurological sensitivities, visual clarity and calm are non-negotiable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1678"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1676">
	<p	class='typography typography--size-24-text js-typography block-paragraph__paragraph'
	data-id='es-1677'
	>
	<strong>Our own early beta testing surfaced some real accessibility concerns:&nbsp;</strong></p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1684"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1681">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1682'
	>
	<strong>Some screens fall well below WCAG minimum contrast</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1683'
	>
	We clocked 1.5:1 in places, and the bar is 4.5:1. Low contrast makes it difficult or impossible for users with low vision, or even just a bright screen, to read text or recognize interface elements.</p>	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1688"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1685">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1686'
	>
	<strong><strong>Text occasionally fades into background layers</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1687'
	>
	This is especially true with complex imagery or bright surroundings. Without strong visual separation, users have to strain to read or guess what’s on screen.</p>	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1692"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1689">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1690'
	>
	<strong><strong><strong>Glassy effects amplify visual noise</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1691'
	>
	They add reflections, shine, and motion that can overwhelm the interface, making it harder to distinguish elements quickly, especially for users with cognitive or sensory sensitivities.</p>	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1696"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1693">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1694'
	>
	<strong><strong><strong><strong>Overuse of blurred backgrounds confuses users about what’s interactive and what’s not</strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1695'
	>
	When buttons and text blend into decorative layers, users can&#8217;t easily tell what to tap, which increases cognitive load and reduces usability.<br />
<br />
These issues aren’t edge cases, they affect millions of users who rely on visual clarity for a usable experience. Let’s take the most striking criticism: low contrast.</p>	</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1706"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-1705">
	
<div class="block-column" data-id="es-1700">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1699"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1697"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1698">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/Image-1-1400x1376.webp				media='(max-width: 699px)'
				type=image/webp								height="1376"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/Image-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1510"
															width="1536"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>

<div class="block-column" data-id="es-1704">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1703"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1701"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1702">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/Image-2-1400x1376.webp				media='(max-width: 699px)'
				type=image/webp								height="1376"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/Image-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1510"
															width="1536"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1716"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-1715">
	
<div class="block-column" data-id="es-1710">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1709"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1707"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1708">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/Image-3-1400x1376.webp				media='(max-width: 699px)'
				type=image/webp								height="1376"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/Image-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1510"
															width="1536"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>

<div class="block-column" data-id="es-1714">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1713"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1711"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1712">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2025/06/Image-4-1400x1376.webp				media='(max-width: 699px)'
				type=image/webp								height="1376"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2025/06/Image-4.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1510"
															width="1536"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-1724"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1720">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1719"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1717">
	</div>	</div>
</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1722"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1721'
	>
	<strong>Contrast isn’t some complex accessibility setting, it’s one of the simplest, most effective things designers can get right. And yet, it’s still too often sacrificed in the name of aesthetics.</strong></p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1727"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-paragraph" data-id="es-1725">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1726'
	>
	Good contrast isn’t a design preference, it’s a core accessibility requirement. It ensures that text and UI elements remain readable in all environments, for all users. Choosing low contrast for the sake of aesthetics might look elegant, but it excludes users with visual impairments and introduces unnecessary friction for everyone else.</p></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1730"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-paragraph" data-id="es-1728">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1729'
	>
	Yes, this is still beta, and yes, things may change. But what we’ve seen so far is enough to raise red flags, not just eyebrows.</p></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1735"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="blockquote block-blockquote__blockquote" data-id="es-1731">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1732'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1733'
	>
	Can a design be truly beautiful if it leaves people out? Initial impressions suggest that while the visual language is innovative, it currently misses key accessibility standards. Designers should proceed with caution.</p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1734'
	>
	<strong>ANA ŠEKERIJA,<br />
</strong>ACCESSIBILITY LEAD, INFINUM</div>		</div>
	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1738"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-paragraph" data-id="es-1736">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1737'
	>
	Not everyone is sounding the alarm just yet. Some accessibility experts remain optimistic, expecting Apple to refine Liquid Glass before the official release, or at the very least, offer alternative styles or settings that better support inclusive use.</p></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1743"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="blockquote block-blockquote__blockquote" data-id="es-1739">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1740'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1741'
	>
	If history is any guide, Apple will likely bake in accessibility overrides for Liquid Glass. But the real question isn’t whether users can disable it, but whether the default experience is inclusive enough to begin with.</p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1742'
	>
	<strong>KERRIN WHIPPLE,<br />
</strong>SENIOR UX DESIGNER AND WEB ACCESSIBILITY SPECIALIST, INFINUM</div>		</div>
	</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1802"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1747">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1746"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1744">
	</div>	</div>
</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1750"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1748">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1749'
	>
	<strong>Wait — Apple </strong><strong><em>Did</em></strong><strong> Think About Accessibility</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1753"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1751">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1752'
	>
	And to be fair, Kerrin was right. Apple <a href="https://youtu.be/IrGYUq1mklk?si=tsVLy9Py6tBZReTY&amp;t=633" target="_blank" rel="noreferrer noopener">hasn’t left accessibility completely out of the picture</a>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1756"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1754">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1755'
	>
	Liquid Glass responds to system-level accessibility settings, automatically adapting without extra developer input. Here’s what kicks in:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1759"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1757">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1758'
	>
	<li>Reduced transparency makes the glass effect frostier and more opaque, helping with legibility</li><li>Increased contrast highlights key elements in high-contrast black or white and adds borders for better visibility</li><li>Reduced motion dials down dramatic animations and disables elastic interactions that could trigger motion sickness</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1762"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1760">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1761'
	>
	It’s a solid baseline, but let’s not mistake it for full accessibility.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1765"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1763">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1764'
	>
	Sure, system settings like reduced motion or increased contrast do some heavy lifting. But they don’t close the gap. That’s where designers come in.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1768"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1766">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1767'
	>
	It’s on us to make sure your interface works for everyone, because even folks with perfect vision and steady hands benefit from accessible design. Think: bright sun, cracked screens, one-handed use on a crowded train. Accessibility isn’t just about permanent disabilities; it’s about making products usable in the real world.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1771"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1769">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1770'
	>
	Inclusive design helps all of us. And it takes all of us to build it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1774"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1772">
	<h2	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-1773'
	>
	<strong>Should you use Liquid Glass?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1777"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1775">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1776'
	>
	That depends.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1780"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1778">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1779'
	>
	Liquid Glass is still evolving, and so is Apple’s UI guidance. Historically, they tend to tweak visual systems post-launch, so don’t blow up your entire design system just yet.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1783"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1781">
	</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1788"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1784">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1785'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1786'
	>
	For existing projects, avoid rushing to redesign all custom components immediately. Apple allows opting out for a year, giving teams time to align designers and developers and establish clear guidelines. </p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1787'
	>
	<strong>HRVOJE HRVOIĆ,<br />
</strong>LEAD IOS ENGINEER, INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1791"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1789">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1790'
	>
	So: explore it. Prototype with it. But stress-test it with real users, especially those with accessibility needs. A sleek interface means nothing if it’s not usable by everyone.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1794"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1792">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1793'
	>
	For new projects aimed at iOS 26+, it makes sense to embrace Liquid Glass early. But do it with intention. That means building a design strategy that prioritizes clarity, consistency, and accessibility from the start.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1797"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1795">
	<p	class='typography typography--size-24-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1796'
	>
	Some key things to keep in mind:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1800"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1798">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1799'
	>
	<li><strong><strong>Build in high-contrast alternatives</strong></strong></li><li><strong><strong>Don’t place critical content (buttons, text, controls) on a blur</strong></strong></li><li><strong><strong>Test with accessibility settings turned on</strong></strong></li><li><strong><strong>Use tools like VoiceOver, Accessibility Inspector, and WCAG checkers</strong></strong></li><li><strong><strong>And above all: never sacrifice legibility for the sake of aesthetics</strong></strong></li></ul></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-1817"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1806">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1805"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1803">
	</div>	</div>
</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1809"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1807">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1808'
	>
	<strong>Final thought: Shine responsibly</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1812"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1810">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1811'
	>
	Liquid Glass is visually ambitious and could unlock exciting new UI possibilities, but inclusive design doesn’t come automatically, even from Apple. It’s on us, designers, developers, testers, to make sure the magic works for everyone. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1815"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1813">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1814'
	>
	Let’s stay curious, test everything, and push for a future where beauty and accessibility go hand in hand.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/apples-ios-26-liquid-glass-sleek-shiny-and-questionably-accessible/">Apple&#8217;s iOS 26 Liquid Glass: Sleek, Shiny, and Questionably Accessible</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19266443https://infinum.com/uploads/2025/10/Burazin-blog-hero.webp</url>
				</image>
				<title>Your Next Best Hire Might Be an AI Agent — Ivan Burazin on Delivered</title>
				<link>https://infinum.com/blog/ivan-burazin-delivered/</link>
				<pubDate>Tue, 10 Jun 2025 10:17:14 +0000</pubDate>
				<dc:creator>Sindy Vuković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19266443</guid>
				<description>
					<![CDATA[<p>Tech entrepreneur and AI agent whisperer Ivan Burazin appears in our event series Delivered to discuss the agentic AI revolution.</p>
<p>The post <a href="https://infinum.com/blog/ivan-burazin-delivered/">Your Next Best Hire Might Be an AI Agent — Ivan Burazin on Delivered</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1909"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1818">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1821"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1819">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1820'
	>
	<strong>Tech entrepreneur and AI agent whisperer, Ivan Burazin, appears in our event series Delivered to discuss how to prepare your business for the agentic AI revolution.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1824"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1822">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1823'
	>
	AI is no longer optional, it&#8217;s a baseline expectation. That was the message behind a now-famous <a href="https://www.forbes.com/sites/douglaslaney/2025/04/09/selling-ai-strategy-to-employees-shopify-ceos-manifesto/" target="_blank" rel="noreferrer noopener">leaked memo from Shopify’s CEO</a>, and it’s a sentiment echoing across industries. But just as businesses began adapting to generative AI, along came their smarter, more autonomous cousins: AI agents.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1827"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1825">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1826'
	>
	Some businesses are already seeing major productivity gains, while others are simply burning money. The difference lies in knowing where AI agents can add value.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1830"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1828">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1829'
	>
	Appearing as a guest on our show Delivered, tech entrepreneur and AI agent expert Ivan Burazin, broke down how AI agents work, where they truly add value, and how to avoid the hype.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1833"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1831">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1832'
	>
	<strong>From passive assistants to true teammates</strong><br />
</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1836"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1834">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1835'
	>
	For a while, generative AI felt like magic: tools that could summarize, translate, draft, and debug. But at its core, generative AI is reactive. You give it a prompt, and it responds accordingly. AI agents, on the other hand, don&#8217;t just respond to prompts; they act on behalf of the user.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1839"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1837">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1838'
	>
	The key distinction between generative and agentic AI lies in understanding the roles of models vs. agents. A large language model, like GPT-4, is the brain. It processes information and generates responses. But on its own, the model is inert. It doesn’t have an interface, memory, or the ability to interact with external tools. That’s where agents come in.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1842"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1840">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1841'
	>
	An agent is the piece of software that acts as the bridge between the user, the model, and any external tool. When you use ChatGPT in a browser or mobile app, that interface is the agent. It handles user input, sends prompts to the model hosted elsewhere, receives responses, and presents them back to you. But more advanced agents go further: they invoke external tools to enhance the model’s capabilities.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1845"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1843">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1844'
	>
	Take ChatGPT’s “Operator” mode, which can book a restaurant reservation on your behalf. That’s not just a model responding to a prompt. It’s the agent invoking a browser tool, navigating a site, and performing an action. Without tools, an agent is like an employee with no computer: technically capable, but unable to do much. With tools, it becomes useful. And with context and autonomy, it becomes powerful. This is where AI shifts from being just a passive assistant to something closer to a true digital teammate, explains Ivan.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1848"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1846">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1847'
	>
	<strong>Are AI agents ready to take over, or still in training?</strong><br />
</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1851"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1849">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1850'
	>
	With all the media headlines proclaiming the end of every profession as we know it, it’s easy to believe that AI agents are ready to replace humans. Remember those viral “Stop hiring humans” billboards? They came from a startup called Artisan, which claimed its <a href="https://www.rdworldonline.com/controversial-startup-artisan-appoints-ai-ceo-in-april-fools-announcement/">CEO was stepping down to let an AI agent take over. </a>A catchy PR stunt. But according to Ivan, we’re not quite there yet. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1854"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1852">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1853'
	>
	AI agents can be impressive, especially in demos where everything is perfectly controlled. When these agents are exposed to the unpredictable, messy real world, their limitations become apparent.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1857"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1855">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1856'
	>
	Right now, agents are great at simple, repetitive tasks with clear rules and predictable outcomes. But ask them to handle something vague or complex, and they’ll quickly get lost.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1860"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1858">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1859'
	>
	Ivan shares a simple example: asking an agent to organize a meetup in a foreign city without providing any specifics, like the date, venue, or number of guests, will likely lead to failure. But give it exact instructions, and it can execute flawlessly. For now, the narrower the task, the more effective the agent.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1863"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1861">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1862'
	>
	Another important limitation? Agents can’t create anything truly new. They can replicate, remix, and automate, but not invent. An AI can build you a clone of Airbnb, but only because Airbnb already exists, says Ivan.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1866"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1864">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1865'
	>
	Then there’s the human element. In a world where every competitor has an AI-powered sales rep spamming inboxes, the person who actually shows up, makes eye contact, and builds a real relationship? That’s the one who stands out. Whether it’s sales, therapy, or hospitality, human connection still matters, and always will.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1868"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1867'
	>
	<strong>Ultimately,</strong> <strong>the real value of agents lies in augmenting human teams, not replacing them. Let them handle the boring, repetitive stuff, so your people can focus on what humans do best: big-picture thinking, creativity, and decisions that actually move the needle.</strong><br />
</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1871"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1869">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1870'
	>
	The future of software is agent-native</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1874"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1872">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1873'
	>
	We’re currently in a transitional phase where most companies are adding AI to existing tools, hoping for smarter results. In reality, most of today’s AI integrations are just chatbots bolted onto SaaS products, explains Ivan. But the real opportunity lies in building agent-native products — software designed from the ground up to let AI agents take action on behalf of users.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1877"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1875">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1876'
	>
	Just like Uber and DoorDash only became possible once smartphones with GPS hit the mainstream, agent-native apps will thrive in a world where software can not only respond but act.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1880"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1878">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1879'
	>
	The timing is right. According to Y Combinator, 37% of startups in their latest cohort are building with agents. And since the winners in this space don’t exist yet, there’s a massive opportunity for companies to claim leadership in their domain by being early builders. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1885"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1881">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1882'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1883'
	>
	<strong>The fundamental thing that people overlook is that you can actually build an agent. There are tools, frameworks, and companies like Infinum that can help you do this.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1884'
	>
	<strong>IVAN BURAZIN</strong>,<br />
CEO &amp; CO-FOUNDER,<br />
DAYTONA</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1888"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1886">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1887'
	>
	<strong>Getting your organization AI-ready</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1891"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1889">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1890'
	>
	When it comes to preparing your business for AI agents, there’s no one-size-fits-all solution or universal blueprint, because the rules are still being written. As Ivan explains, the AI landscape is evolving too rapidly for any one vendor or consultant to have all the answers. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1894"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1892">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-1893'
	>
	Instead of waiting for a perfect product or roadmap, companies need to stay actively informed, experiment with AI tools, and pay close attention to how the field is progressing. In industries further removed from Silicon Valley, the impact of AI agents may not have reached day-to-day operations yet, but it will. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1897"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1895">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1896'
	>
	The key is to avoid the trap of dismissing immature tools too early, because what doesn’t work today might be a game-changer in three months. And if your competitors embrace that shift before you do, the productivity gap could widen fast, warns Ivan.</p></div>	</div>



<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1904"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-1898"
	 href='https://infinum.com/ai-readiness-assessment/#form'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<h2	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1899'
	>
	AI can transform your business, but the first step is evaluating where you currently stand. <strong><strong><strong>Fill out our survey and get a free personalized assessment of your business&#8217;s readiness for AI implementation.</strong></strong></strong></h2>		</div>

		<button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-1901"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-1902'
	>
	Learn more </div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1903'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1907"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1905">
	<p	class='typography typography--size-20-text-blog-roman js-typography block-typography__typography'
	data-id='es-1906'
	>
	For more insights on where we stand with AI agents and where we are heading, <a href="https://www.youtube.com/watch?v=JEeMzJZopus&amp;embeds_referring_euri=https%3A%2F%2Finfinum.com%2F&amp;embeds_referring_origin=https%3A%2F%2Finfinum.com" target="_blank" rel="noreferrer noopener">watch</a> or <a href="https://open.spotify.com/episode/34B0yQqHZqekBitvdysMHE?si=cusaUJJ_TmuweNXKXE2n5w" target="_blank" rel="noreferrer noopener">listen</a> to the full conversation with Ivan. And if you&#8217;re looking to build and AI product and need expert support, check out our<a href="https://infinum.com/ai-business-solutions/" target="_blank" rel="noreferrer noopener"> AI business solutions</a> page.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/ivan-burazin-delivered/">Your Next Best Hire Might Be an AI Agent — Ivan Burazin on Delivered</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19265166https://infinum.com/uploads/2025/10/Kameale-blog-hero.webp</url>
				</image>
				<title>Ending the EV Charger Chaos — Kameale C. Terry on Delivered</title>
				<link>https://infinum.com/blog/kameale-c-terry-delivered/</link>
				<pubDate>Thu, 03 Apr 2025 16:54:54 +0000</pubDate>
				<dc:creator>Sindy Vuković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19265166</guid>
				<description>
					<![CDATA[<p>Kameale C. Terry, CEO and co-founder of ChargerHelp!, discusses how she turned the problem of unreliable EV chargers into a successful startup.</p>
<p>The post <a href="https://infinum.com/blog/kameale-c-terry-delivered/">Ending the EV Charger Chaos — Kameale C. Terry on Delivered</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-2019"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1910">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1913"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1911">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-1912'
	>
	<strong>Kameale C. Terry, CEO and co-founder of ChargerHelp!, appears </strong><strong>in our event series Delivered to discuss how she turned the problem of unreliable EV chargers into a successful startup.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1916"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1914">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1915'
	>
	Every new technology hits a few speed bumps on the road to widespread adoption. But with more than a quarter of public electric vehicle chargers not working at any given time, drivers are left stranded, automakers are frustrated, and the planet is left waiting for an EV revolution that can’t happen without a reliable charging network.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1919"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1917">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1918'
	>
	In 2020, Kameale C. Terry took this problem head on and launched ChargerHelp!, a tech-driven EV charging station repair and maintenance company. Under her leadership, the company has raised $21M, expanded to 17 states, created a new job category, and helped shape the EV charging reliability policy.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1922"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1920">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1921'
	>
	Appearing on Delivered, Kameale discussed what’s really behind the unreliable charging infrastructure and how her company is transforming the industry with workforce training, advanced technology, and mission-driven leadership.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1925"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1923">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1924'
	>
	<strong>What’s the deal with unreliable EV chargers?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1928"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1926">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1927'
	>
	It’s easy to forget just how far we’ve come with electric vehicles. Not long ago, EVs were seen as quirky, niche, and not really built for the everyday driver. Today they’re stylish, fast, and packed with features that make the driving experience genuinely exciting, even for people who don’t consider themselves environmentally conscious. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1930"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1929'
	>
	EVs now make up one in four new car sales globally, and that number is only expected to grow. But while the vehicles have evolved, the charging infrastructure hasn’t kept pace.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1933"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1931">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1932'
	>
	As one <em>Delivered </em>viewer pointed out:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1936"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1934">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1935'
	>
	“Infrastructure is one of the biggest challenges. Many countries offer a wide range of EV models, but drivers often have almost nowhere to charge them outside their homes,” said <a href="https://www.linkedin.com/in/juandavidgmp/" target="_blank" rel="noreferrer noopener">Juan David Gómez</a>, Founder of <a href="http://autobusqueda.co/" target="_blank" rel="noreferrer noopener">Autobusqueda.co</a> and CEO of <a href="https://drivegear.com.co/" target="_blank" rel="noreferrer noopener">DriveGear</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1939"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1937">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1938'
	>
	Another viewer echoed this concern, highlighting how the lack of accessible charging fuels range anxiety for many drivers:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1942"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1940">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1941'
	>
	“Compared to gas cars, EVs require more pre-planning and research to locate charging stations, especially in rural areas. A smarter infrastructure should prioritize both convenience and accessibility, ensuring that charging stations are as widely available as gas stations,”<strong> </strong>said <a href="https://www.linkedin.com/in/rebecagperez/" target="_blank" rel="noreferrer noopener">Rebeca Perez</a>, Director of Business Development, <a href="https://graffiticontrol.com/" target="_blank" rel="noreferrer noopener">Woods Maintenance Services</a>, Inc.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1945"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1943">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1944'
	>
	As Juan and Rebeca pointed out, finding a charger is hard enough. Finding one that actually works is even harder. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1948"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1946">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1947'
	>
	In the U.S., about one in four public chargers is out of order at any given time. A big part of the issue is that EV charging relies on a patchwork of different hardware and software providers. These systems are supposed to work together, but often don’t due to a lack of shared data and standardized protocols. Tesla’s charging network is the only exception. As a vertically integrated system, its vehicles, chargers, and data come from one source, allowing the company to roll out remote fixes in hours.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1951"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1949">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1950'
	>
	But charging reliability isn’t just a problem of the fragmented industry. It’s also a workforce problem. EV charger repair requires a unique skill set: part electrician, part software troubleshooter, part tech support. Yet for years, the default industry response was to send electricians to fix what was in 90% of cases a software-related issue. A trained workforce simply wasn’t available.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1954"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1952">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1953'
	>
	<strong>Turning EV charging reliability into reality</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1957"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1955">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1956'
	>
	That gap in skilled labor is exactly what ChargerHelp! set out to close. The company created a specialized workforce and partnered with the Society of Automotive Engineers (SAE) to define official training and certification standards. As a result, the role of EVSE technician is now a recognized profession with clearly defined skills.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1960"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1958">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1959'
	>
	And workforce development was just the beginning. Technology and data have played an equally important role in the company’s success. ChargerHelp! developed a custom field service app that technicians use during every repair. Over time, this tool has helped build a database of more than 19 million data points across all major U.S. charging hardware and software platforms. This data gives a clear picture of why chargers fail and how to fix them quickly, bringing much-needed transparency to a fragmented industry.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1965"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1961">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1962'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1963'
	>
	<strong>We’re a business and we’re venture-backed, so of course we have to make money. But for me, it’s about more than just offering a service. It’s about showing up for the industry with real insights that help all of us succeed together.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1964'
	>
	<strong>KAMEALE C. TERRY</strong>, CEO &amp; FOUNDER, CHARGERHELP!</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1968"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1966">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1967'
	>
	That same data now powers the company’s next chapter. ChargerHelp! uses AI to remotely diagnose issues, predict failures before they happen, and optimize technician dispatch. This has helped them shape a unique “reliability-as-a-service” business model. Instead of just reacting to problems, ChargerHelp! offers station owners an ongoing service that keeps chargers running smoothly.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1971"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1969">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1970'
	>
	That same data now powers the company’s next chapter. ChargerHelp! uses AI to remotely diagnose issues, predict failures before they happen, and optimize technician dispatch. This has helped them shape a unique “reliability-as-a-service” business model. Instead of just reacting to problems, ChargerHelp! offers station owners an ongoing service that keeps chargers running smoothly.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1974"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1972">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1973'
	>
	<strong>From personal mission to real-world impact</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1977"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1975">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1976'
	>
	For Kameale, the mission behind ChargerHelp! is deeply personal. Growing up in South Central Los Angeles, surrounded by freeways, she witnessed firsthand how poor air quality affected her community. “Most of my family has asthma. My mom passed from cancer. My co-founder’s parents both died of lung-related illnesses,” she shares.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1980"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1978">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1979'
	>
	EVs aren’t a silver bullet, she’s quick to admit, but they’re a step toward a better future and healthier communities: “There’s a lot we still need to improve when it comes to EVs, but we deserve the chance to build something better. Breathing in air that harms us shouldn’t be normal.”</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1983"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1981">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1982'
	>
	Kameale’s lived experience with environmental injustice shaped her &#8220;why&#8221;, and that purpose continues to guide the company’s mission. While ChargerHelp! is a venture-backed tech startup, it’s built on values of fair wages, equity, and opening doors in cleantech for historically excluded communities. It’s proof that building a successful business doesn’t have to come at the cost of people.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1985"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1984'
	>
	ChargerHelp!’s impact goes beyond tech and workforce development. In California, they helped shape the EV Charging Reliability Act, which pushed regulators to track charger performance and hold operators accountable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1988"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1986">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1987'
	>
	“At ChargerHelp!, we&#8217;ve been fortunate enough to find that sweet spot where we can do good, make an impact, and create a profitable business,” concludes Kameale.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1991"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-1989">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-1990'
	>
	<strong>The road ahead</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1994"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-1992">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-1993'
	>
	Kameale’s long-term vision is about solving the bigger issue of bringing software into the built environment. EV charging is just the beginning, a glimpse of what the future looks like when digital systems and physical infrastructure must work seamlessly together. By addressing these complexities now, ChargerHelp! is laying the groundwork for a more reliable, connected world across industries.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1999"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1995">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1996'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1997'
	>
	“We’ve brought attention to a problem the industry wasn’t even talking about, and we brought in people who had never worked in EVs before. It excites me to see what new ideas and companies will grow from the people who’ve been a part of this journey.” </p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1998'
	>
	<strong>KAMEALE C. TERRY</strong>, CEO &amp; FOUNDER, CHARGERHELP!</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2002"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2000">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2001'
	>
	Kameale&#8217;s approach to leadership struck a chord with many Delivered viewers. In response, they shared their own reflections on what kind of leadership sparks real innovation in tech today:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2005"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2003">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2004'
	>
	“Inclusive leadership, beyond gender or race, means involving people in projects that support their growth and development. When employees have chances to learn, connect, and contribute meaningfully, it creates what we now call emotional salary,”<strong> </strong>said Juan David Gómez.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2008"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2006">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2007'
	>
	Rebeca Perez, on the other hand, pointed to the power of trust and openness as the fuel for innovation:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2011"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2009">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2010'
	>
	<em>“</em>Transformational leadership fosters trust, creativity, and continuous feedback. When leaders create an environment where employees feel valued and heard, they are more likely to share bold ideas and fearlessly push boundaries.“</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2014"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2012">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2013'
	>
	<em>For more leadership advice and a deep dive into the state of EV charging, <a href="https://infinum.com/events/delivered-ev-charger-startup/" target="_blank" rel="noreferrer noopener">watch</a> or </em><a href="https://www.buzzsprout.com/2368175/episodes/16849522" target="_blank" rel="noreferrer noopener"><em>listen</em></a><em> to the full conversation with Kameale.</em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2017"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2015">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2016'
	>
	<em>And if you’re looking for a technology partner who specializes in creating intuitive, seamless, and interconnected experiences, </em><a href="https://infinum.com/contact/" target="_blank" rel="noreferrer noopener"><em>let’s talk</em></a><em>.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/kameale-c-terry-delivered/">Ending the EV Charger Chaos — Kameale C. Terry on Delivered</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19264691https://infinum.com/uploads/2025/03/Charging-stations-and-EV-adoption-hero-min.webp</url>
				</image>
				<title>What&#8217;s Blocking the Road to Mass EV Adoption?</title>
				<link>https://infinum.com/blog/ev-adoption-roadblock/</link>
				<pubDate>Mon, 17 Mar 2025 11:57:29 +0000</pubDate>
				<dc:creator>Mia Maček</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19264691</guid>
				<description>
					<![CDATA[<p>Electric vehicles have come a long way, but unreliable charging stations are still a major roadblock on the path to full adoption.</p>
<p>The post <a href="https://infinum.com/blog/ev-adoption-roadblock/">What&#8217;s Blocking the Road to Mass EV Adoption?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-2079"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-2020">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2023"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2021">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-2022'
	>
	<strong>Electric vehicles have come a long way, but unreliable charging stations are still stalling widespread adoption. What’s behind this persistent roadblock, and what can we learn from it?</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2026"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2024">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2025'
	>
	You know that feeling of panic when your battery hits 5%, and your charger is nowhere to be found? It doesn’t matter if it’s phones, laptops, or earbuds – when they run out of juice, we run out of patience.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2029"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2027">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2028'
	>
	Now imagine it’s your car, and you can’t exactly stuff an EV charger in your backpack, no matter how cool or Kickstarter-worthy it is. Electric vehicles are great until finding a working charger feels like a game of roulette rather than a welcome coffee break.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2032"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2030">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2031'
	>
	Let’s unpack one of the biggest hurdles slowing mass EV adoption: charging infrastructure. Range anxiety is real, and nothing kills the dream of a road trip faster than an “Out of Order” sign on a charging station.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2035"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-2033">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-2034'
	>
	The bumpy road to mass EV adoption</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2038"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2036">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2037'
	>
	Every new technology is faced with early adoption challenges. When the automobile first entered the scene in the early 1900s, people (being people) quickly found reasons to dismiss it. Thin tires got stuck on horse-trodden dirt roads, and the muddy, manure-filled streets simply weren’t built for these contraptions.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2041"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2039">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2040'
	>
	Or, to use an example much closer to home (and the date currently on our calendars), think back to the early days of the internet. “Get off the phone, I need to go online!” was a nightly refrain in many households until we invented broadband and finally got the internet off telephone lines.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2044"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2042">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2043'
	>
	In both these cases, the technology itself showed promise, but <strong>the infrastructure </strong>lagged behind.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2047"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2045">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2046'
	>
	Today, we’re seeing the same scenario play out with electric vehicles. EVs have come a long way, with sleek designs and increasingly better battery ranges, but true mass adoption? We’re not quite there yet, and charging station reliability is a key factor holding us back.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2050"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-2048">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-2049'
	>
	What’s the deal with unreliable charging stations?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2053"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2051">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2052'
	>
	Recent data shows that between <strong>20% and 40%</strong> of public charging stations in North America may be nonoperational at any given time. Why the high failure rate? Because fixing a charging station is not just a matter of swapping out a broken cable.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2056"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2054">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2055'
	>
	Modern EV charging stations are less like oversized electrical outlets and more like small computers that must “talk” to your car’s software. A single glitch in that software handshake can bring the entire station offline.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2059"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2057">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2058'
	>
	The real curveball, though, is <strong>industry</strong> <strong>fragmentation</strong>. Tesla, as a vertically integrated system, is the exception here. Its vehicles, chargers, and data all come from one source, which allows the company to roll out remote fixes in hours. But for the rest of the EV world, dozens of hardware and software providers must communicate seamlessly, often without shared data or standardized troubleshooting protocols. It’s the equivalent of trying to run one operating system across 10 different computer brands, all speaking a slightly different language.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2062"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-2060">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-2061'
	>
	A job no one trained for</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2065"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2063">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2064'
	>
	Even when it’s clear something is wrong, who do you call to fix it? For years, the industry defaulted to sending out electricians to solve what was, in 90% of cases, a software issue. As expected, the results were similar to what you’d get by sending a cable installer to reprogram your router firmware – a number of costly site visits that often solved absolutely nothing.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2068"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2066">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2067'
	>
	Now, companies are waking up to the need for specialized skills, recognizing that fixing chargers isn’t just electrical engineering; it’s part tech support, part software troubleshooting, and entirely new territory.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2071"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-2069">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-2070'
	>
	The bigger picture</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2074"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2072">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2073'
	>
	Broken chargers aren’t just speed bumps on the road to sustainable mobility; they’re a sign of what happens when you bring <strong>complex software into public infrastructure</strong> for the first time. As we move toward smarter cities and even more IoT devices, EV charging is just the opening chapter. By solving these challenges now, we pave the way for smoother adoption of all kinds of connected systems.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2077"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-2075">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-2076'
	>
	People no longer complain about horseless carriages clogging unpaved roads, and our dial-up internet days are a nostalgic memory, which goes to show we can handle this, too. The question isn’t whether electric vehicles can replace gas-guzzlers; it’s whether we’ll build the infrastructure to make it happen – and learn to fix it fast when it’s blocking our road.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2106"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-2105">
	
<div class="block-column" data-id="es-2104">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2103"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-2102">
	
<div class="block-grid-item" data-id="es-2083">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2082"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-2080">
	<h2	class='typography typography--size-20-text js-typography block-heading__heading'
	data-id='es-2081'
	>
	This is an excerpt from the Delivered newsletter.<br />
If you would like to see a story like this in your inbox, subscribe here.</h2></div>	</div>
</div>

<div class="block-grid-item" data-id="es-2101">
	
<div class="block-group" data-id=es-2100>
	
<div
	class="wrapper"
	data-id="es-2099"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<style id='esFormsCssVariables-global'>:root {--global-custom-blocks-name: eightshift-block;--global-es-max-cols: 12;--global-esf-spacing-xs: 0.25rem;--global-esf-spacing-s: 0.5rem;--global-esf-spacing-m: 1rem;--global-esf-spacing-l: 1.5rem;--global-esf-spacing-xl: 2rem;--global-esf-ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);--global-esf-box-shadow: 0 0 0.5rem rgb(0 0 0 / 0.04);--global-esf-box-shadow-l: 0 0 0.125rem rgb(0 0 0 / 0.16), 0 0 0.5rem rgb(0 0 0 / 0.16);--global-esf-max-width: 36rem;--global-esf-input-height: 2.625rem;--global-breakpoints-mobile: 480;--global-breakpoints-tablet: 960;--global-breakpoints-desktop: 1920;--global-breakpoints-large: 1921;--global-colors-esf-admin-accent: #29A3A3;--global-colors-esf-admin-accent-values: 41 163 163;--global-colors-esf-admin-accent-50: #29A3A380;--global-colors-esf-admin-accent-50-values: 0 0 0;--global-colors-esf-admin-accent-30: #29a3a333;--global-colors-esf-admin-accent-30-values: 0 0 0;--global-colors-esf-admin-accent-10: #29A3A31A;--global-colors-esf-admin-accent-10-values: 0 0 0;--global-colors-esf-admin-accent-05: #29A3A30D;--global-colors-esf-admin-accent-05-values: 0 0 0;--global-colors-esf-admin-accent-dark: #218282;--global-colors-esf-admin-accent-dark-values: 33 130 130;--global-colors-esf-border: #DEDEDE;--global-colors-esf-border-values: 222 222 222;--global-colors-esf-black: #181818;--global-colors-esf-black-values: 24 24 24;--global-colors-esf-white: #FFFFFF;--global-colors-esf-white-values: 255 255 255;--global-colors-esf-gray: #484848;--global-colors-esf-gray-values: 72 72 72;--global-colors-esf-yellow-50: #FFFBEB;--global-colors-esf-yellow-50-values: 255 251 235;--global-colors-esf-yellow-100: #FEF3C7;--global-colors-esf-yellow-100-values: 254 243 199;--global-colors-esf-yellow-200: #FDE68A;--global-colors-esf-yellow-200-values: 253 230 138;--global-colors-esf-yellow-500: #EAB308;--global-colors-esf-yellow-500-values: 234 179 8;--global-colors-esf-yellow-950: #451A03;--global-colors-esf-yellow-950-values: 69 26 3;--global-colors-esf-sky-50: #F0F9FF;--global-colors-esf-sky-50-values: 240 249 255;--global-colors-esf-sky-100: #E0F2FE;--global-colors-esf-sky-100-values: 224 242 254;--global-colors-esf-sky-200: #BAE6FD;--global-colors-esf-sky-200-values: 186 230 253;--global-colors-esf-sky-500: #0EA5E9;--global-colors-esf-sky-500-values: 14 165 233;--global-colors-esf-sky-950: #082F49;--global-colors-esf-sky-950-values: 8 47 73;--global-colors-esf-gray-50: #F9FAFB;--global-colors-esf-gray-50-values: 249 250 251;--global-colors-esf-gray-100: #F3F4F6;--global-colors-esf-gray-100-values: 243 244 246;--global-colors-esf-gray-200: #E5E7EB;--global-colors-esf-gray-200-values: 229 231 235;--global-colors-esf-gray-300: #D1D5DB;--global-colors-esf-gray-300-values: 209 213 219;--global-colors-esf-gray-400: #9CA3AF;--global-colors-esf-gray-400-values: 156 163 175;--global-colors-esf-gray-500: #6B7280;--global-colors-esf-gray-500-values: 107 114 128;--global-colors-esf-gray-600: #4B5563;--global-colors-esf-gray-600-values: 75 85 99;--global-colors-esf-gray-950: #030712;--global-colors-esf-gray-950-values: 3 7 18;--global-colors-esf-red-50: #FEF2F2;--global-colors-esf-red-50-values: 254 242 242;--global-colors-esf-red-100: #FEE2E2;--global-colors-esf-red-100-values: 254 226 226;--global-colors-esf-red-200: #FECACA;--global-colors-esf-red-200-values: 254 202 202;--global-colors-esf-red-500: #EF4444;--global-colors-esf-red-500-values: 239 68 68;--global-colors-esf-red-400: #F87171;--global-colors-esf-red-400-values: 248 113 113;--global-colors-esf-red-600: #DC2626;--global-colors-esf-red-600-values: 220 38 38;--global-colors-esf-red-800: #991B1B;--global-colors-esf-red-800-values: 153 27 27;--global-colors-esf-red-950: #450A0A;--global-colors-esf-red-950-values: 69 10 10;--global-colors-esf-green-50: #F0FDF4;--global-colors-esf-green-50-values: 240 253 244;--global-colors-esf-green-100: #DCFCE7;--global-colors-esf-green-100-values: 220 252 231;--global-colors-esf-green-200: #BBF7D0;--global-colors-esf-green-200-values: 187 247 208;--global-colors-esf-green-500: #22C55E;--global-colors-esf-green-500-values: 34 197 94;--global-colors-esf-green-950: #052E16;--global-colors-esf-green-950-values: 5 46 22;}</style>
<div
	class="es-block-forms js-es-block-forms"
	>
	<form
	class="es-form js-es-block-form"
	 data-phone-disable-picker='1' data-form-fid='12993' data-form-id='3375409118' data-post-id='19264691' data-form-type='hubspot' data-conditional-tags='[]' method='post' data-block-ssr='false' data-disabled-default-styles='true'	novalidate
	onsubmit="event.preventDefault();">
	<div
	class="es-global-msg js-es-block-global-msg"
	>
	</div>
	<div class="es-form__fields">
		<div	class="es-field es-field--input es-field--is-required js-es-block-field"
	data-id="es-2085"
	 data-hubspot-type-id='0-1' data-field-name='email' data-field-type='input' data-type-custom='email' data-tracking='email'>

		<div class="es-field__inner">
					<label				class="es-field__label es-field__label--is-required"
				 for='email-es-2084'>
				<span class="es-field__label-inner">
					Your email
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="email"
		id="email-es-2084"
		type="email"
		
		
		 autocomplete='email' aria-required='true' aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="email-es-2084"></div>	</div>

	</div><fieldset	class="es-field es-field--checkboxes es-form-is-hidden js-es-block-field"
	data-id="es-2087"
	 data-hubspot-type-id='0-1' role='group' aria-labelledby='accepted_newsletter_subscription-es-2086' data-field-name='accepted_newsletter_subscription' data-field-type='checkbox' data-type-custom='checkbox'>

		<div class="es-field__inner">
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	
	<div
	class="es-checkbox"
	 data-field-name='on' data-field-type='checkbox' data-tracking='accepted_newsletter_subscription'>
	<div class="es-checkbox__content">
		<input
			class="es-checkbox__input"
			type="checkbox"
			name="accepted_newsletter_subscription"
			id="accepted_newsletter_subscription-es-2086[0]"
			 value='on'			 checked='checked'			 />
					<label
				for="accepted_newsletter_subscription-es-2086[0]"
				class="es-checkbox__label">
				
									<span class="es-checkbox__label-inner">
						Newsletter subscription					</span>
							</label>
			</div>
	</div>
	

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="accepted_newsletter_subscription-es-2086"></div>	</div>

	</fieldset><div	class="es-field es-field--input es-form-is-hidden js-es-block-field"
	data-id="es-2089"
	 data-hubspot-type-id='0-1' data-field-name='utm_campaign' data-field-type='input' data-type-custom='text' data-tracking='utm_campaign'>

		<div class="es-field__inner">
					<label				class="es-field__label"
				 for='utm_campaign-es-2088'>
				<span class="es-field__label-inner">
					utm_campaign
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="utm_campaign"
		id="utm_campaign-es-2088"
		type="text"
		
		
		 aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="utm_campaign-es-2088"></div>	</div>

	</div><div	class="es-field es-field--input es-form-is-hidden js-es-block-field"
	data-id="es-2091"
	 data-hubspot-type-id='0-1' data-field-name='utm_content' data-field-type='input' data-type-custom='text' data-tracking='utm_content'>

		<div class="es-field__inner">
					<label				class="es-field__label"
				 for='utm_content-es-2090'>
				<span class="es-field__label-inner">
					utm_content
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="utm_content"
		id="utm_content-es-2090"
		type="text"
		
		
		 aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="utm_content-es-2090"></div>	</div>

	</div><div	class="es-field es-field--input es-form-is-hidden js-es-block-field"
	data-id="es-2093"
	 data-hubspot-type-id='0-1' data-field-name='utm_medium' data-field-type='input' data-type-custom='text' data-tracking='utm_medium'>

		<div class="es-field__inner">
					<label				class="es-field__label"
				 for='utm_medium-es-2092'>
				<span class="es-field__label-inner">
					utm_medium
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="utm_medium"
		id="utm_medium-es-2092"
		type="text"
		
		
		 aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="utm_medium-es-2092"></div>	</div>

	</div><div	class="es-field es-field--input es-form-is-hidden js-es-block-field"
	data-id="es-2095"
	 data-hubspot-type-id='0-1' data-field-name='utm_source' data-field-type='input' data-type-custom='text' data-tracking='utm_source'>

		<div class="es-field__inner">
					<label				class="es-field__label"
				 for='utm_source-es-2094'>
				<span class="es-field__label-inner">
					utm_source
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="utm_source"
		id="utm_source-es-2094"
		type="text"
		
		
		 aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="utm_source-es-2094"></div>	</div>

	</div><div	class="es-field es-field--input es-form-is-hidden js-es-block-field"
	data-id="es-2097"
	 data-hubspot-type-id='0-1' data-field-name='utm_term' data-field-type='input' data-type-custom='text' data-tracking='utm_term'>

		<div class="es-field__inner">
					<label				class="es-field__label"
				 for='utm_term-es-2096'>
				<span class="es-field__label-inner">
					utm_term
									</span>
			</label>
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				
	<input
		class="es-input"
		name="utm_term"
		id="utm_term-es-2096"
		type="text"
		
		
		 aria-invalid='false'
	/>

							</div>
					</div>
				<div
	role="alert"
	class="es-error es-field__es-error js-es-block-error"
	data-id="utm_term-es-2096"></div>	</div>

	</div><div	class="es-field es-field--submit js-es-block-field"
	data-id="es-2098"
	 data-field-type='submit'>

		<div class="es-field__inner">
				<div class="es-field__content">
						<div class="es-field__content-wrap">
				<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right"
	data-id="63debef9"
	 type='submit'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='adc4687c'
	>
	Subscribe</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='67594ade'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
			<span class="btn__progress"></span>
	</button>
							</div>
					</div>
					</div>

	</div>
			</div>

	<div class="es-loader js-es-block-loader es-loader__form" role="none" aria-hidden="true" tabindex="-1">
	<div class="es-loader__spinner"></div>
	<div class="es-loader__overlay"></div>
	</div></form><div class="es-loader js-es-block-loader es-loader__geolocation" role="none" aria-hidden="true" tabindex="-1">
	<div class="es-loader__spinner"></div>
	<div class="es-loader__overlay"></div>
	</div></div>

<style id='esFormsCssVariables'>.es-field[data-id='es-2085']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2087']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2089']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2091']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2093']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2095']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2097']{--es-field-width: calc((12 / 12) * 100%);} .es-field[data-id='es-2098']{--es-field-width: calc((12 / 12) * 100%);}  </style>		</div>
	</div>
</div>
</div>
</div>	</div>
</div>
</div>	</div><p>The post <a href="https://infinum.com/blog/ev-adoption-roadblock/">What&#8217;s Blocking the Road to Mass EV Adoption?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>