PageSourceSearch

https://touchlab.co/

html touchlab.co collected 2026-10-02 04:52:56 UTC 63,501 bytes, 185 lines download raw bytes

1<!DOCTYPE html>
1<script type="module" src="/_astro/PageLayout.astro_astro_type_script_index_0_lang.Dty91SEz.js"></script>
1 <html lang="en" dir="ltr" class="dark"> <head><link href="/css/prism-darcula.css" rel="stylesheet"><link rel="sitemap" href="/sitemap-index.xml">
vendor: 60 bytes, line 1
1<script src="https://www.google.com/recaptcha/api.js?render=
16LfMVyAsAAAAAHLVTAF4skwXf2OgipJgGt8H5H9L
vendor: 11 bytes, line 1
1"></script>
1<link rel="me" href="https://mastodon.social/@touchlab"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Touchlab - Kotlin Multiplatform Experts — Touchlab</title>
2<meta name="description" content="Native mobile app development experts specializing in Kotlin Multiplatform. We help startups launch fast and enterprises scale cleanly.">
3<meta name="robots" content="index,follow">
4<link rel="canonical" href="https://touchlab.co">
5<meta property="og:title" content="Touchlab - Kotlin Multiplatform Experts">
6<meta property="og:description" content="Native mobile app development experts specializing in Kotlin Multiplatform. We help startups launch fast and enterprises scale cleanly.">
7<meta property="og:url" content="https://touchlab.co">
8<meta property="og:type" content="page">
9<meta property="og:image" content="https://touchlab.co/">
10<meta property="og:image:alt" content="Touchlab - Kotlin Multiplatform Experts">
11
12<meta name="twitter:card" content="summary_large_image"><!-- Google Site Verification --><meta name="google-site-verification" content="orcPxI47GSa-cRvY11tUe6iGg2IO_RPvnA1q95iEM3M"><!-- Google Tag Manager -->
12<script>
13            window.dataLayer = window.dataLayer || [];
14            window.gtag = window.gtag || function gtag() {
15                dataLayer.push(arguments);
16            };
17            window.gtag('consent', 'default', {
18                'ad_storage': 'denied',
19                'analytics_storage': 'denied',
20                'ad_user_data': 'denied',
21                'ad_personalization': 'denied'
22            });
23        </script>
23<script>(function(){const id = "GTM-PKNNTRT";
24
25            (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
26                new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
27                j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
28                'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
29            })(window,document,'script','dataLayer',id);
30        })();</script>
30<link rel="shortcut icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB70lEQVQ4jaWTz0tUURzFP/feN83om6eoVylJorDSsIKKICgI+i/a9AeUi1bRov+gtRS1iaJVUq0CIaiNkFDrFu3KSFMb35tx1DfvnhZP03CnBy7cH5wD58vnGu/9PJCwP2URMLxPM0BigewAAVn037EoQCr31pYLCIJQbN0bQ+R2LGWAc9BqQbMJgABhsb4faw3OiIWV8C+8O3YkdUtRiAhjYHUVqlXs1BQMDmGSGPvqJRtPn9Oo9HHlUhfvpj3ZeiBdKLg1ucifRofeHgfe+9SDBifv6LCkwbSlkSLT+NJnDY2dVA0U1wf0/ct5SdckXdXDB6OCHg14nxpvbcqFi4l78xZt5NhsmXqY59DpE6zPzJLdnOR323L8WJ25D0cZGHYYwfUbP/g4286isrGBTi/kOeQF2F9gwq7pGvIisNZYI646gjVIYDC7Kty+V1ZYkEba0vjynIbGRtW1VeHT+1OSzkk6q/t3RwS98t6n5RBrNfTiEeHMBMYfYbOnm8b0Ezpfv5FX+rk8UWFzU8y8XmNxKfD4WZtq1WEMGO99inMJrSY0W2BBAYTD+j6MNVgjllcCnbwsFMeGet1QFNsgFQXUuqBSgSAMYFxJi4LIA8Tddpsjoqi07IC0LReBY492Qbn3jf3/RIAkAn4eICT7C8VR0B1ceUkzAAAAAElFTkSuQmCC">
30<script type="module" src="/_astro/BaseLayout.astro_astro_type_script_index_0_lang.WwAsUjVC.js"></script>
30<link rel="stylesheet" href="/_astro/BaseLayout.DvB2Xm2x.css"><link rel="stylesheet" href="/_astro/BaseLayout.C2d6VjOz.css"><style>.portable-text[data-astro-cid-lz3j2op6] p{margin-bottom:1rem}.portable-text[data-astro-cid-lz3j2op6] h1{font-size:2em;line-height:1.3333333;font-weight:700;letter-spacing:-.05em;margin-bottom:2rem;text-align:center;color:#fff}.portable-text[data-astro-cid-lz3j2op6] h2{font-size:1.5rem;font-weight:700;margin-bottom:1rem;margin-top:2rem}.portable-text[data-astro-cid-lz3j2op6] h3{font-size:1.25rem;font-weight:700;margin-bottom:.75rem;margin-top:1.5rem}.portable-text[data-astro-cid-lz3j2op6] ul{list-style-type:disc;margin-left:1.5rem;margin-bottom:1rem}.portable-text[data-astro-cid-lz3j2op6] ol{list-style-type:decimal;margin-left:1.5rem;margin-bottom:1rem}.portable-text[data-astro-cid-lz3j2op6] li{margin-bottom:.5rem}.portable-text[data-astro-cid-lz3j2op6] a{color:var(--color-link);text-decoration:underline}.portable-text[data-astro-cid-lz3j2op6] a:hover{text-decoration:none}.portable-text[data-astro-cid-lz3j2op6] blockquote{border-left:4px solid #e2e8f0;padding-left:1rem;font-style:italic;margin:1.5rem 0}.detail-section-body[data-astro-cid-qizm7dld] p{margin-bottom:1rem}.detail-section-body[data-astro-cid-qizm7dld] p:last-child{margin-bottom:0}.detail-section-body[data-astro-cid-qizm7dld] a{text-decoration:underline}.faq-answer-body[data-astro-cid-iluq4m6z] p{margin-bottom:1rem}.faq-answer-body[data-astro-cid-iluq4m6z] p:last-child{margin-bottom:0}.faq-answer-body[data-astro-cid-iluq4m6z] a{text-decoration:underline}
31</style>
31<script type="module" src="/_astro/page.CoM0dnMU.js"></script>
31</head> <body class="font-inter antialiased text-white tracking-tight bg-base"> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PKNNTRT" height="0" width="0" aria-hidden="true" style="display:none;visibility:hidden"></iframe></noscript>  <div class="flex flex-col h-full"> <div>  <header class="fixed  top-0  z-40 flex-none mx-auto w-full topscroll noscroll"> <div class="flex justify-center page-padding"> <div class="max-w-6xl grow centering-section-inner-margins"> <div class="flex h-20"> <!-- Desktop navigation --> <nav class="hidden lg:flex md:grow items-center relative"> <!-- Site branding --> <div class="flex-1"> <!-- Logo --> <a href="/" class="block h-8 rounded-lg"> <svg id="Layer_1" x="0px" y="0px" viewBox="88 79 218 34" shape-rendering="auto" xml:space="preserve" width="205" height="32" class="h-8 fill-current">
32<style type="text/css">
33	.st0{fill:#00BBC9;}
34	.st1{fill:#00B1DB;}
35	.st2{fill:#4DBEA9;}
36	.st3{fill:#6EC288;}
37	.st4{fill:#88C773;}
38	.st5{fill:#A9CF52;}
39	.st6{fill:#C8DA33;}
40	.st7{fill:#E2E31B;}
41</style>
42<g>
43	<g>
44		<g>
45			<path class="st0" d="M141.26,95.91c0,9.39-6.65,16.82-15.75,16.82c-9.16,0-15.8-7.44-15.8-16.82c0-9.34,6.65-16.78,15.8-16.78
46				C134.61,79.13,141.26,86.56,141.26,95.91z M135.08,95.91c0-6-4.27-10.97-9.57-10.97c-5.34,0-9.62,4.97-9.62,10.97
47				c0,6.04,4.28,11.01,9.62,11.01C130.8,106.92,135.08,101.95,135.08,95.91z" />
48		</g>
49	</g>
50	<g>
51		<g>
52			<path class="st1" d="M102.95,85.87v26.54h-6.13V85.87h-8.65v-5.72h23.42v5.72H102.95z" />
53		</g>
54	</g>
55	<g>
56		<g>
57			<path class="st2" d="M167.53,99.62c0,8.23-4.32,13.34-12.45,13.34c-8.13,0-12.41-5.11-12.41-13.34V80.15h6.13v19.66
58				c0,4.79,2.09,7.2,6.28,7.2c4.18,0,6.27-2.42,6.27-7.2V80.15h6.18V99.62z" />
59		</g>
60	</g>
61	<g>
62		<g>
63			<path class="st3" d="M184.49,112.96c-8.78,0-15.62-7.39-15.62-16.82s6.83-16.82,15.62-16.82c7.3,0,12.69,4.14,14.68,10.74h-6.65
64				c-1.44-2.93-4.32-5.11-8.04-5.11c-5.3,0-9.48,5.11-9.48,11.2c0,6.13,4.18,11.25,9.48,11.25c3.67,0,6.6-2.28,8.04-5.2h6.6
65				C197.08,108.73,191.64,112.96,184.49,112.96z" />
66		</g>
67	</g>
68	<g>
69		<g>
70			<path class="st4" d="M226.51,112.4h-6.14V98.79h-13.76v13.62h-6.18V80.15h6.18v12.92h13.76V80.15h6.14V112.4z" />
71		</g>
72	</g>
73	<g>
74		<g>
75			<path class="st5" d="M235.61,106.69h16.03v5.72h-22.22V80.15h6.18V106.69z" />
76		</g>
77	</g>
78	<g>
79		<g>
80			<path class="st6" d="M258.49,105.94l-2.18,6.46h-6.51l11.25-32.25h7.76l11.25,32.25h-6.51l-2.18-6.46H258.49z M264.9,86.98
81				l-4.51,13.24h9.02L264.9,86.98z" />
82		</g>
83	</g>
84	<g>
85		<path class="st7" d="M295.7,112.4h-15.71V80.15h14.87c6.46,0,9.71,3.35,9.71,8.74c0,2.69-1.16,4.88-3.16,6.32
86			c2.74,1.44,4.42,4.04,4.42,7.71C305.83,108.69,301.92,112.4,295.7,112.4z M286.12,85.73v7.11h8.74c2.09,0,3.76-1.44,3.76-3.58
87			c0-2.14-1.44-3.53-3.76-3.53H286.12z M294.72,98.46h-8.6v8.32h8.74c2.37,0,4.69-0.93,4.69-4.09
88			C299.55,99.99,297.84,98.46,294.72,98.46z" />
89	</g>
90</g>
91</svg> </a> </div> <!-- Desktop menu links --> <div class="text-neutral-300"> <ul class="flex justify-center flex-wrap items-center list-none m-0 p-0"> <li class="dropdown relative inline-block">  <button class="font-bold px-2 py-2 flex items-center transition duration-150 ease-in-out hover:text-neutral-100"> What We Do <svg class="icon icon-tabler icon-tabler-chevron-down" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="#cccccc" fill="none" stroke-linecap="round" stroke-linejoin="round">
92  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
93  <path d="M6 9l6 6l6 -6"></path>
94</svg> </button> <ul class="dropdown-menu md:backdrop-blur-md md:bg-neutral-800/90 rounded md:absolute -ml-3 pl-4 md:pl-0 font-medium md:min-w-[200px] drop-shadow-[0_5px_10px_rgba(0,0,0,0.5)]"> <li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/acceleratekmp" target> Development Services </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/prodserv" target> Advisory Services </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/kmpproductionsupport" target> DevEx Services </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/tlpro" target> KMP Support </a> </li> </ul>  </li><li class="dropdown relative inline-block">  <button class="font-bold px-2 py-2 flex items-center transition duration-150 ease-in-out hover:text-neutral-100"> KMP Resources <svg class="icon icon-tabler icon-tabler-chevron-down" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="#cccccc" fill="none" stroke-linecap="round" stroke-linejoin="round">
95  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
96  <path d="M6 9l6 6l6 -6"></path>
97</svg> </button> <ul class="dropdown-menu md:backdrop-blur-md md:bg-neutral-800/90 rounded md:absolute -ml-3 pl-4 md:pl-0 font-medium md:min-w-[200px] drop-shadow-[0_5px_10px_rgba(0,0,0,0.5)]"> <li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/guide" target>
97 KMP Essential Guide </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/iosdevex" target> iOS Resources </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/kmp-teams-intro" target> KMP For Native Mobile Teams </a> </li><li> <a class="first:rounded-t last:rounded-b md:hover:bg-neutral-700 hover:text-neutral-100 py-2 px-5 block whitespace-nowrap" href="/oss" target> Open Source Directory </a> </li> </ul>  </li><li class> <a class="font-bold px-2 py-2 flex items-center transition duration-150 ease-in-out hover:text-neutral-100" href="/blog"> Blog </a> </li><li class> <a class="font-bold px-2 py-2 flex items-center transition duration-150 ease-in-out hover:text-neutral-100" href="/about"> About </a> </li> </ul> </div> <div class="flex-1"> <div class="flex justify-end"> <div class="flex"></div> <a href="/contact-us?ue=header-work-desktop" class="super-header text-xl opacity-100 px-12 py-0.5">
98Work With Us
99</a> </div> </div> </nav> <!-- Mobile menu --> <div class="flex justify-between grow items-center lg:hidden"> <!-- Site branding --> <div class="flex-1"> <!-- Logo --> <a href="/" class="block h-8"> <svg id="Layer_1" x="0px" y="0px" viewBox="88 79 218 34" shape-rendering="auto" xml:space="preserve" width="205" height="32" class="h-8 fill-current">
100<style type="text/css">
101	.st0{fill:#00BBC9;}
102	.st1{fill:#00B1DB;}
103	.st2{fill:#4DBEA9;}
104	.st3{fill:#6EC288;}
105	.st4{fill:#88C773;}
106	.st5{fill:#A9CF52;}
107	.st6{fill:#C8DA33;}
108	.st7{fill:#E2E31B;}
109</style>
110<g>
111	<g>
112		<g>
113			<path class="st0" d="M141.26,95.91c0,9.39-6.65,16.82-15.75,16.82c-9.16,0-15.8-7.44-15.8-16.82c0-9.34,6.65-16.78,15.8-16.78
114				C134.61,79.13,141.26,86.56,141.26,95.91z M135.08,95.91c0-6-4.27-10.97-9.57-10.97c-5.34,0-9.62,4.97-9.62,10.97
115				c0,6.04,4.28,11.01,9.62,11.01C130.8,106.92,135.08,101.95,135.08,95.91z" />
116		</g>
117	</g>
118	<g>
119		<g>
120			<path class="st1" d="M102.95,85.87v26.54h-6.13V85.87h-8.65v-5.72h23.42v5.72H102.95z" />
121		</g>
122	</g>
123	<g>
124		<g>
125			<path class="st2" d="M167.53,99.62c0,8.23-4.32,13.34-12.45,13.34c-8.13,0-12.41-5.11-12.41-13.34V80.15h6.13v19.66
126				c0,4.79,2.09,7.2,6.28,7.2c4.18,0,6.27-2.42,6.27-7.2V80.15h6.18V99.62z" />
127		</g>
128	</g>
129	<g>
130		<g>
131			<path class="st3" d="M184.49,112.96c-8.78,0-15.62-7.39-15.62-16.82s6.83-16.82,15.62-16.82c7.3,0,12.69,4.14,14.68,10.74h-6.65
132				c-1.44-2.93-4.32-5.11-8.04-5.11c-5.3,0-9.48,5.11-9.48,11.2c0,6.13,4.18,11.25,9.48,11.25c3.67,0,6.6-2.28,8.04-5.2h6.6
133				C197.08,108.73,191.64,112.96,184.49,112.96z" />
134		</g>
135	</g>
136	<g>
137		<g>
138			<path class="st4" d="M226.51,112.4h-6.14V98.79h-13.76v13.62h-6.18V80.15h6.18v12.92h13.76V80.15h6.14V112.4z" />
139		</g>
140	</g>
141	<g>
142		<g>
143			<path class="st5" d="M235.61,106.69h16.03v5.72h-22.22V80.15h6.18V106.69z" />
144		</g>
145	</g>
146	<g>
147		<g>
148			<path class="st6" d="M258.49,105.94l-2.18,6.46h-6.51l11.25-32.25h7.76l11.25,32.25h-6.51l-2.18-6.46H258.49z M264.9,86.98
149				l-4.51,13.24h9.02L264.9,86.98z" />
150		</g>
151	</g>
152	<g>
153		<path class="st7" d="M295.7,112.4h-15.71V80.15h14.87c6.46,0,9.71,3.35,9.71,8.74c0,2.69-1.16,4.88-3.16,6.32
154			c2.74,1.44,4.42,4.04,4.42,7.71C305.83,108.69,301.92,112.4,295.7,112.4z M286.12,85.73v7.11h8.74c2.09,0,3.76-1.44,3.76-3.58
155			c0-2.14-1.44-3.53-3.76-3.53H286.12z M294.72,98.46h-8.6v8.32h8.74c2.37,0,4.69-0.93,4.69-4.09
156			C299.55,99.99,297.84,98.46,294.72,98.46z" />
157	</g>
158</g>
159</svg> </a> </div> <!-- Hamburger button --> <button id="mobile-menu-button" class="ml-2 bg-transparent border-0 cursor-pointer flex items-center" aria-controls="mobile-nav" aria-expanded="false"> <span class="sr-only">Menu</span> <svg class="w-6 h-6 fill-neutral-300 hover:fill-neutral-400 transition duration-150 ease-in-out" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <rect y="4" width="24" height="2" rx="1"></rect> <rect y="11" width="24" height="2" rx="1"></rect> <rect y="18" width="24" height="2" rx="1"></rect> </svg> </button> <!-- Mobile navigation --> <nav id="mobile-nav" class="absolute top-full z-20 left-0 w-full overflow-hidden transition-all duration-300 ease-in-out drop-shadow-[0_5px_10px_rgba(0,0,0,0.3)]" style="max-height: 0; opacity: 0.8;"> <ul class="bg-neutral-800 px-4 py-2 divide-y divide-neutral-600 divide-solid">  <li class="list-none m-0 p-0 border-0"> <div class="flex text-neutral-300 hover:text-neutral-200 py-2 hover:no-underline"> What We Do <svg class="icon icon-tabler icon-tabler-chevron-down" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="#cccccc" fill="none" stroke-linecap="round" stroke-linejoin="round">
160  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
161  <path d="M6 9l6 6l6 -6"></path>
162</svg> </div> </li> <li class="list-none m-0 p-0 ml-4 border-0">
162 <a href="/acceleratekmp" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> Development Services </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/prodserv" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> Advisory Services </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/kmpproductionsupport" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> DevEx Services </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/tlpro" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> KMP Support </a> </li> <li class="list-none m-0 p-0 border-0"> <div class="flex text-neutral-300 hover:text-neutral-200 py-2 hover:no-underline"> KMP Resources <svg class="icon icon-tabler icon-tabler-chevron-down" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="#cccccc" fill="none" stroke-linecap="round" stroke-linejoin="round">
163  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
164  <path d="M6 9l6 6l6 -6"></path>
165</svg> </div> </li> <li class="list-none m-0 p-0 ml-4 border-0"> <a href="/guide" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> KMP Essential Guide </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/iosdevex" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline">
165 iOS Resources </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/kmp-teams-intro" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> KMP For Native Mobile Teams </a> </li><li class="list-none m-0 p-0 ml-4 border-0"> <a href="/oss" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> Open Source Directory </a> </li><li class="list-none m-0 p-0 border-0"> <a href="/blog" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> Blog </a> </li><li class="list-none m-0 p-0 border-0"> <a href="/about" class="mobile-nav-link flex text-neutral-300 hover:text-neutral-200 py-2 no-underline"> About </a> </li> <li class="list-none m-0 p-0 border-0"> <a href="/contact-us?ue=header-work-mobile" class="mobile-nav-link flex text-yellow-300 hover:text-yellow-200 font-bold py-2 no-underline">
166Work With Us
167</a> </li> </ul> </nav> </div> </div> </div> </div> </header> 
167<script type="module">(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};t.SENTRY_RELEASE={id:"2d3197b0e4ea9a1191777049861063ea08ae5e01"};var e=new t.Error().stack;e&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[e]="82d3e0b1-e31e-402f-8323-d3068ebd48d2",t._sentryDebugIdIdentifier="sentry-dbid-82d3e0b1-e31e-402f-8323-d3068ebd48d2")}catch{}})();document.addEventListener("DOMContentLoaded",function(){const t=document.getElementById("mobile-menu-button"),e=document.getElementById("mobile-nav");let n=!1;t&&e&&(t.addEventListener("click",()=>{n=!n,n?(t.setAttribute("aria-expanded","true"),e.style.maxHeight=`${e.scrollHeight}px`,e.style.opacity="1"):(t.setAttribute("aria-expanded","false"),e.style.maxHeight="0",e.style.opacity="0.8")}),document.querySelectorAll(".mobile-nav-link").forEach(a=>{a.addEventListener("click",()=>{n=!1,t.setAttribute("aria-expanded","false"),e.style.maxHeight="0",e.style.opacity="0.8"})}),document.addEventListener("click",a=>{const i=a.target;!e.contains(i)&&!t.contains(i)&&n&&(n=!1,t.setAttribute("aria-expanded","false"),e.style.maxHeight="0",e.style.opacity="0.8")}),document.addEventListener("keydown",a=>{a.key==="Escape"&&n&&(n=!1,t.setAttribute("aria-expanded","false"),e.style.maxHeight="0",e.style.opacity="0.8")}))});</script>
167  </div> <div class="flex-1 pt-0 scheme-dark"> <main> <div id class="w-full "> <div class="  "> <div class="relative w-full overflow-hidden">  <div class=" absolute top-0 left-0 w-full h-full"> <img src="/_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_Z1WBCEJ.webp" srcset="/_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_13ev1V.webp 480w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_tDMEX.webp 768w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_ZN34X3.webp 1024w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_Z1tgQwl.webp 1440w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_JhG1e.webp 1700w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_AUcQL.webp 1920w, /_astro/5e41c4e255a52db861a35defc972cccd3c0ecfb6-2064x1201_9TGYc.webp 2560w" alt="We build fully native apps at cross-platform speed." sizes="100vw" loading="eager" decoding="async" width="2064" height="1201" class="w-full h-full object-cover object-center ">  </div>  <div class="absolute top-0 left-0 w-full h-full bg-neutral-900 opacity-75"></div>  <div class="relative z-10 page-padding pt-32 pb-16 pl-0 pr-0"> <div class="max-w-3xl mx-auto text-center px-4"> <h1 class="text-5xl md:text-5xl font-bold mb-6 text-white"> <span class> We build fully native apps at cross-platform speed. </span> </h1>  <div> <section class="mt-8 mb-16    max-w-6xl mx-auto text-center"> <div class="text-2xl text-neutral-200"> <p>13+ years at the forefront — Android before it was cool, Kotlin Multiplatform before anyone else, and AI‑enhanced cross‑platform tooling without the hype — Touchlab builds smarter, scalable apps faster. Global experts. Zero fluff. Just results.</p> </div> </section><div class="mt-8 mb-0 ml-0 mr-0 mx-auto   text-center"> <a href="/contact-us?ue=contact-us-home" class="btn outline   text-black pt-0 pb-0 pl-4 pr-4 text-2xl bg-yellow-300 hover:bg-yellow-200 w-full md:w-72 no-underline"> <span>Build your app fast</span> <svg width="1em" height="1em" class="w-8 h-8 text-black icon-light mx-2 md:mx-0 md:ml-2 " data-icon="tabler:arrow-big-right">   <symbol id="ai:tabler:arrow-big-right" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 9h8V5.414a1 1 0 0 1 1.707-.707l6.586 6.586a1 1 0 0 1 0 1.414l-6.586 6.586A1 1 0 0 1 12 18.586V15H4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1"/></symbol><use href="#ai:tabler:arrow-big-right"></use>  </svg> </a> </div>  </div> </div> </div> </div> </div> </div><div id class="w-full bg-neutral-900"> <div class="page-padding pt-0 pb-8"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <div class="grid grid-cols-1 md:grid-cols-3 gap-4"> <div> <div class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-cyan-400"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:arrow-autofit-width">   <symbol id="ai:tabler:arrow-autofit-width" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 12V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v6m-10 6H3m18 0h-7m-8-3l-3 3l3 3m12-6l3 3l-3 3"/></symbol><use href="#ai:tabler:arrow-autofit-width"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Native Where It Matters</h4></div><p class="text-lg text-gray-400 text-center">Full-performance, fully-native apps — not simulations. Your users won’t know you used KMP, and that’s the point.</p></div></div> </div><div> <div class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-lime-400"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:globe">   <symbol id="ai:tabler:globe" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M7 9a4 4 0 1 0 8 0a4 4 0 0 0-8 0"/><path d="M5.75 15A8.015 8.015 0 1 0 15 2m-4 15v4m-4 0h8"/></g></symbol><use href="#ai:tabler:globe"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Cross-Platform Speed</h4></div><p class="text-lg text-gray-400 text-center">Accelerated delivery through smart code sharing, AI‑assisted tooling workflows, and over a decade of multiplatform expertise.</p></div></div> </div><div> <div class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-yellow-300"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:layers-intersect-2">   <symbol id="ai:tabler:layers-intersect-2" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8 6a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-8a2 2 0 0 1-2-2z"/><path d="M4 10a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm5 5l6-6"/></g></symbol><use href="#ai:tabler:layers-intersect-2"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Future-Proof Foundation</h4></div><p class="text-lg text-gray-400 text-center">Architecture decisions made early so your v1 doesn’t hold back your v10. Less tech debt, fewer rewrites, smarter scaling.</p></div></div> </div> </div>  </section> </div> </div><div id class="w-full "> <div class="page-padding pt-8 pb-8"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center"> <div class="text-center mb-4"> <h2 class="h2">Trusted by Industry Leaders</h2> </div><div class="flex flex-wrap justify-center gap-4"> <div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/638303815aa9f185c2156eb9412bf9cf76757247-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="NBC" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/beb4089d528d32267a9f9a7aa6269a3128778647-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Google" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/e4541d73f2c149542356b95503d8767adf5a35ca-1600x1600.png?w=300&amp;fm=webp&amp;q=60" alt="Cash App" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/237128f5f82b97b81abdf094cd4a52ec221bff71-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Square" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/e5cc52ae8da5dd23def7da83764aaa11dba541a5-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Mirror" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/584f8e8dea2b797cbb8
16769135003361b904349948-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="LINK NYC" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/f99105c064fb51dc810f35ff259eee7344459d04-300x200.png?w=300&amp;fm=webp&amp;q=60" alt="Jane Goodall" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/7ceb2cdcd319fc5febd2abb5f08de0ccf99e671e-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="ESPN" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/9d77e0a0fe3f79af2dbbd349498e13638459a1ad-300x200.png?w=300&amp;fm=webp&amp;q=60" alt="Classpass" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/274dc4ff533739a03317519a1ab3126a70200183-5335x577.png?w=300&amp;fm=webp&amp;q=60" alt="Betterment" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/605abd0c724daef4b4b6da3572576b97a5a6055f-597x460.png?w=300&amp;fm=webp&amp;q=60" alt="One Drop" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/d3c667be7b46db3aa3799739b89c781d6fd657de-300x150.png?w=300&amp;fm=webp&amp;q=60" alt="Peloton" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/3e406e49e1af26e28ea95a2ac07aec93405cf5aa-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Quartz" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/123fca245d3df9df0f34668416dc32b84b2f9c05-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Quovo" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/2d3bbb745d2db6479226b56d0b89d23b09eca47c-300x200.png?w=300&amp;fm=webp&amp;q=60" alt="Samsung" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div><div class="w-[calc(50%-0.5rem)] md:w-[calc(25%-0.75rem)]"> <div class="flex items-center justify-center border p-2 border-neutral-600 rounded"><img src="https://cdn.sanity.io/images/pj4095sy/testdata/e01733169a38a758b663d4b6c4eab9ebd5ec6e8c-300x300.png?w=300&amp;fm=webp&amp;q=60" alt="Thrive" class="max-w-full fill-current opacity-80 object-contain invert-0 h-24 md:h-32 w-auto" loading="lazy" width="160" height="80"></div> </div> </div>  </section> </div> </div><div id class="w-full bg-neutral-800"> <div class="page-padding pt-8 pb-8">
167 <section class="title-icon-details pt-8 pb-8 mt-0 mb-0 bg-neutral-800"> <div class="container mx-auto max-w-6xl">  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 justify-items-center"> <div class="flex flex-col items-center p-6 rounded-lg text-center w-full max-w-sm bg-neutral-700">  <p class="text-base text-white">&quot;Touchlab was friendly, time efficient, super smart and competent in the domain, and they were good listeners - what we got was what we asked for. I would absolutely recommend Touchlab to a startup.&quot;
168— PowerSync</p> </div><div class="flex flex-col items-center p-6 rounded-lg text-center w-full max-w-sm bg-neutral-700">  <p class="text-base text-white">&quot;SKIE by Touchlab has been invaluable for Kotlin Multiplatform development at Mapbox. It provided a perfect solution for seamlessly integrating Kotlin into Swift-based projects. 
169— Mapbox</p> </div><div class="flex flex-col items-center p-6 rounded-lg text-center w-full max-w-sm bg-neutral-700">  <p class="text-base text-white">&quot;Touchlab’s developers are very knowledgeable, work fast, and communicate frequently, ensuring we kept aligned on priorities and solution details. They treat clients as partners, not just revenue in a spreadsheet.&quot;
170— Aloft.ai</p> </div> </div> </div> </section> </div> </div><div id class="w-full bg-neutral-900"> <div class="page-padding pt-16 pb-8"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <div class="grid grid-cols-1 md:grid-cols-2 gap-8 items-center"> <div class> <img src="/_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_PhemY.webp" srcset="/_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Z9hibK.webp 640w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Zg0AzI.webp 750w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Z2rxBYB.webp 828w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_ZKbCP5.webp 1080w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Z1gqvoj.webp 1280w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_PhemY.webp 1500w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Z193nmB.webp 1668w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_8NVt3.webp 2048w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_qEAyC.webp 2560w, /_astro/f3f9e8bdf2dc06ac09c6907910b5c7d03c187e9b-2397x1565_Z2w8v1V.webp 3000w" sizes="(max-width: 768px) calc(100vw - 2rem), (max-width: 1280px) 45vw, 560px" alt="Content image" loading="lazy" decoding="async" data-astro-image="constrained" data-astro-image-fit="cover" data-astro-image-pos="center" width="1500" height="1125" class="w-full h-auto object-cover rounded-lg shadow-md aspect-[4/3]">  </div> <div class="space-y-6">  <p class="text-lg text-start text-neutral-200">Optimize Your KMP Investment </p> <div class="space-y-4 mt-6 flex flex-col items-start">  <section class="mt-0 mb-0   text-left max-w-6xl mx-auto text-center"> <h2 class="h2 mb-2">KMP is the right move. But at scale, it gets messy</h2><div class="text-2xl text-neutral-200"> <p>Touchlab’s been putting KMP in production since 2018. From build-time bloat to Swift interop nightmares, we’ve seen it all — and we’ve solved it all. 
171
172Our SMEs uncover inefficiencies, reduce friction, and save you time and money.</p> </div> </section> </div> </div> </div>  </section> </div><div class="page-padding pt-16 pb-8"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <div class="grid grid-cols-1 md:grid-cols-3 gap-4"> <div> <a href="/contact-us?ue=contact-us-home" target class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 box-link py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-cyan-400"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:activity">   <symbol id="ai:tabler:activity" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12h4l3 8l4-16l3 8h4"/></symbol><use href="#ai:tabler:activity"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Quick Assessment	</h4><div class="inline-block ml-2"><svg width="1em" height="1em" class="size-6 text-white" data-icon="tabler:external-link">
172   <symbol id="ai:tabler:external-link" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-6m-7 1l9-9m-5 0h5v5"/></symbol><use href="#ai:tabler:external-link"></use>  </svg></div></div><p class="text-lg text-gray-400 text-center">Fast snapshot of your KMP codebase and team setup. Ideal for new adopters or early scaling.</p></div></a> </div><div> <a href="/contact-us?ue=contact-us-home" target class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 box-link py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-lime-400"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:access-point">   <symbol id="ai:tabler:access-point" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 12v.01m2.828-2.838a4 4 0 0 1 0 5.656m2.829-8.485a8 8 0 0 1 0 11.314m-8.489-2.829a4 4 0 0 1 0-5.656m-2.831 8.485a8 8 0 0 1 0-11.314"/></symbol><use href="#ai:tabler:access-point"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Best Practices Code Review</h4><div class="inline-block ml-2"><svg width="1em" height="1em" viewBox="0 0 24 24" class="size-6 text-white" data-icon="tabler:external-link">   <use href="#ai:tabler:external-link"></use>  </svg></div></div><p class="text-lg text-gray-400 text-center">Deep-dive into architecture, performance, and team workflows. Get prioritized, actionable recommendations.</p></div></a> </div><div> <a href="/contact-us?ue=contact-us-home" target class="relative mb-4 md:mb-0 flex items-center ml-0 mr-0 flex-1 box-link py-4 px-2"><div class="flex flex-col items-center"><div class="text-black rounded-full mb-4 p-3 bg-yellow-300"> <svg width="1em" height="1em" class="size-6 text-black" data-icon="tabler:ad-2">   <symbol id="ai:tabler:ad-2" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M11.933 5H5v16h13v-8m-4 4H9"/><path d="M9 13h5V9H9zm6-8V3m3 3l2-2m-1 5h2"/></g></symbol><use href="#ai:tabler:ad-2"></use>  </svg> </div><div class="flex flex-row"><h4 class="h4 mb-2 mt-0 text-center">Strategic Roadmap &amp; PoC</h4><div class="inline-block ml-2"><svg width="1em" height="1em" viewBox="0 0 24 24" class="size-6 text-white" data-icon="tabler:external-link">   <use href="#ai:tabler:external-link"></use>  </svg></div></div><p class="text-lg text-gray-400 text-center">High-touch engagement with architecture strategy, PoC implementation, and milestone-based planning.</p></div></a> </div> </div>  </section> </div> </div><div id class="w-full "> <div class="page-padding pt-8 pb-8"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <section class=" max-w-6xl mx-auto -mt-2"> <div class="max-w-6xl mx-auto px-4 mb-4"> <div class="max-w-4xl mx-auto text-center"> <h2 class="h2">Featured posts from our blog</h2> </div> </div> <div class="grid gap-4 gap-y-8 md:grid-cols-2 lg:grid-cols-4"> <article> <a href="/kmp-modern-mobile" class="standard-link"> <div class="blog-image md:h-36  md:pb-0 mb-4 "> <img src="/_astro/header.jpg.h.C06aLJFv_Zjb57x.webp" srcset="/_astro/header.jpg.h.C06aLJFv_xaGNC.webp 254w, /_astro/header.jpg.h.C06aLJFv_1VPfaT.webp 768w" alt="KMP's Role In Modern Native Mobile" sizes="(max-width: 768px) calc(100vw - 2rem), 254px" loading="lazy" decoding="async" width="1600" height="900"> </div> </a> <a href="/kmp-modern-mobile" class="standard-link"> <h3 class="h3 line-clamp-3">  KMP&#39;s Role In Modern Native Mobile </h3> </a> </article><article> <a href="/gradle-transitive-dependency-resolution" class="standard-link"> <div class="blog-image md:h-36  md:pb-0 mb-4 "> <img src="/_astro/header.jpg.h.BSw_RSGW_27VGMh.webp" srcset="/_astro/header.jpg.h.BSw_RSGW_Z1P6IvL.webp 254w, /_astro/header.jpg.h.BSw_RSGW_Zqrb9u.webp 768w" alt="Runtime crashes hiding in your Gradle files" sizes="(max-width: 768px) calc(100vw - 2rem), 254px" loading="lazy" decoding="async" width="1600" height="900"> </div> </a> <a href="/gradle-transitive-dependency-resolution" class="standard-link"> <h3 class="h3 line-clamp-3">  Runtime crashes hiding in your Gradle files </h3> </a> </article><article> <a href="/skie-swiftui" class="standard-link">
172 <div class="blog-image md:h-36  md:pb-0 mb-4 "> <img src="/_astro/header.jpg.h.DOq-APjn_Z2azz45.webp" srcset="/_astro/header.jpg.h.DOq-APjn_1MyG9u.webp 254w, /_astro/header.jpg.h.DOq-APjn_Z1RWTia.webp 768w" alt="Consuming SKIE Flows in SwiftUI" sizes="(max-width: 768px) calc(100vw - 2rem), 254px" loading="lazy" decoding="async" width="1600" height="900"> </div> </a> <a href="/skie-swiftui" class="standard-link"> <h3 class="h3 line-clamp-3">  Consuming SKIE Flows in SwiftUI </h3> </a> </article><article> <a href="/kjwt-intro" class="standard-link"> <div class="blog-image md:h-36  md:pb-0 mb-4 "> <img src="/_astro/header.jpg.h.DOcd9hVw_Z2wcMoH.webp" srcset="/_astro/header.jpg.h.DOcd9hVw_Zbcyub.webp 254w, /_astro/header.jpg.h.DOcd9hVw_1drXR6.webp 768w" alt="Why have we written a new JWT Library?" sizes="(max-width: 768px) calc(100vw - 2rem), 254px" loading="lazy" decoding="async" width="1600" height="900"> </div> </a> <a href="/kjwt-intro" class="standard-link"> <h3 class="h3 line-clamp-3">  Why have we written a new JWT Library? </h3> </a> </article> </div> <div class="max-w-6xl mx-auto"> <div class="grid gap-4 md:grid-cols-2 lg:grid-cols-4 mt-4"> <a class="btn nav-button block md:col-start-2 lg:col-start-4" href="/blog"> View all posts »
173</a> </div> </div> </section>  </section> </div> </div><div id class="w-full "> <div class="page-padding  pb-16"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
173<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script>
173<script>(()=>{var g=Object.defineProperty;var w=(c,s,d)=>s in c?g(c,s,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[s]=d;var l=(c,s,d)=>w(c,typeof s!="symbol"?s+"":s,d);var E=new Set(["__proto__","constructor","prototype"]);{let c={0:t=>y(t),1:t=>d(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(d(t)),5:t=>new Set(d(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in c?c[p](e):void 0},d=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},i=this.querySelectorAll("template[data-astro-template]");for(let o of i){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let a=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(a+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${a}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let n=new URL(e,document.baseURI),r=`astro-retry=${Date.now()}`,i=n.hash.replace(/^#/,"");return n.hash=i?`${i}&${r}`:r,n.toString()}async importWithRetry(e){try{return await import(e)}catch(n){return await new Promise(r=>setTimeout(r,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let n=this.getAttribute("component-url"),r=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:n}});this.dispatchEvent(r)&&console.error(`[astro-island] Error hydrating ${n}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(`astro:${n}`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url");try{let[i,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),r?this.importWithRetry(r):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=i;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=i[h]}return this.hydrator=u,this.hydrate}catch(i){return this.handleHydrationError(i),()=>{}}},e,this)}catch(r){this.handleHydrationError(r)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script>
173<astro-island uid="UlQxA" component-url="/_astro/NewsletterSignup.QVDyPVvR.js" component-export="default" renderer-url="/_astro/client.D-OYWkQU.js" props="{}" ssr client="only" opts="{&quot;name&quot;:&quot;NewsletterSignupComponent&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>  </section> </div> </div><div id class="w-full bg-neutral-900"> <div class="page-padding pt-16 pb-32"> <section class="mt-0 mb-0    max-w-6xl mx-auto text-center">  <div class="grid grid-cols-1 md:grid-cols-2 gap-8 items-center"> <div class> <img src="/_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_29aeiQ.webp" srcset="/_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_Z2eMc3j.webp 640w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_Z2lvurh.webp 750w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_x8BWL.webp 828w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_xGm5M.webp 1080w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_2rtwy.webp 1280w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_29aeiQ.webp 1500w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_9OByg.webp 1668w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_1rGVoU.webp 2048w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_1JxAuu.webp 2560w, /_astro/113758c7f5d6c12e40a85d11c10069517aeae6f8-2218x1333_Z1dfv64.webp 3000w" sizes="(max-width: 768px) calc(100vw - 2rem), (max-width: 1280px) 45vw, 560px" alt="Build smarter and faster!" loading="lazy" decoding="async" data-astro-image="constrained" data-astro-image-fit="cover" data-astro-image-pos="center" width="1500" height="1125" class="w-full h-auto object-cover rounded-lg shadow-md aspect-[4/3]">  </div> <div class="space-y-6"> <h2 class="text-3xl md:text-4xl font-semibold text-start text-white">Build smarter and faster!</h2> <p class="text-lg text-start text-neutral-200">From helping Mirror launch to solving KMP build issues for Block, we’ve helped teams at every stage deliver native-quality apps with modern cross-platform tech and our internal AI tooling. Whether you&#39;re building from scratch or fixing what&#39;s slowing you down — Touchlab gets you there faster.</p> <div class="space-y-4 mt-6 flex flex-col items-start">  <div class="mt-4 mb-0 ml-0 mr-0 mx-auto   text-center"> <a href="/contact-us?ue=contact-us-home" class="btn outline   text-black pt-0 pb-0 pl-4 pr-4 text-2xl bg-yellow-300 hover:bg-yellow-200 w-full md:w-72 no-underline"> <span>Build your app</span> <svg width="1em" height="1em" class="w-8 h-8 text-black icon-light mx-2 md:mx-0 md:ml-2 " data-icon="tabler:device-mobile">   <symbol id="ai:tabler:device-mobile" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2zm5-1h2m-1 13v.01"/></symbol><use href="#ai:tabler:device-mobile"></use>  </svg> </a> </div> <div class="mt-4 mb-0 ml-0 mr-0 mx-auto   text-center"> <a href="/contact-us?ue=contact-us-home" class="btn outline   text-black pt-0 pb-0 pl-4 pr-4 text-2xl bg-yellow-300 hover:bg-yellow-200 w-full md:w-72 no-underline"> <span>Get expert KMP help</span> <svg width="1em" height="1em" class="w-8 h-8 text-black icon-light mx-2 md:mx-0 md:ml-2 " data-icon="tabler:keyboard-show">   <symbol id="ai:tabler:keyboard-show" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2 5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2zm4 2v.01M10 7v.01M14 7v.01M18 7v.01M6 11v.01M18 11v.01M10 11h4m-4 8l2 2l2-2"/></symbol><use href="#ai:tabler:keyboard-show"></use>  </svg> </a> </div>  </div> </div> </div>  </section> </div> </div> </main> </div> <div class="">  
173<script type="module" src="/_astro/Footer.astro_astro_type_script_index_0_lang.Cx_qsW5e.js"></script>
173 <div id="modalEl" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full"> <div class="relative w-full max-w-2xl max-h-full"> <!-- Modal content --> <div class="relative bg-neutral-700 rounded-lg shadow"> <!-- Modal header --> <div class="flex items-start justify-between p-5 border-b rounded-t border-neutral-600"> <h3 class="text-xl font-semibold text-white lg:text-2xl">
174Touchlab Newsletter Signup
175</h3> <button type="button" class="closeModalButton text-neutral-400 bg-transparent hover:bg-neutral-600 hover:text-white rounded-lg text-sm w-8 h-8 ml-auto inline-flex justify-center items-center"> <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14"> <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"></path> </svg> <span class="sr-only">Close modal</span> </button> </div> <!-- Modal body --> <div class="p-6 space-y-6"> <astro-island uid="bm7Mb" component-url="/_astro/AllQuestions.CegkmJa5.js" component-export="default" renderer-url="/_astro/client.D-OYWkQU.js" props="{&quot;formType&quot;:[0,&quot;newsletter&quot;],&quot;questions&quot;:[1,[[0,&quot;contactEmail&quot;],[0,&quot;contactName&quot;]]],&quot;updateExisting&quot;:[0,true],&quot;successMessage&quot;:[0,&quot;Thank you!&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;AllQuestions&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island> </div> </div> </div> </div> <div id="modalElContact" tabindex="-1" aria-hidden="true" class="fixed top-0 left-0 right-0 z-50 hidden w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full"> <div class="relative w-full max-w-2xl max-h-full"> <!-- Modal content --> <div class="relative bg-neutral-700 rounded-lg shadow"> <!-- Modal header --> <div class="flex items-start justify-between p-5 border-b rounded-t border-neutral-600"> <h3 class="text-xl font-semibold text-white lg:text-2xl">
176Contact Us
177</h3> <button type="button" class="closeModalButton text-neutral-400 bg-transparent hover:bg-neutral-600 hover:text-white rounded-lg text-sm w-8 h-8 ml-auto inline-flex justify-center items-center"> <svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14"> <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"></path> </svg> <span class="sr-only">Close modal</span> </button> </div> <!-- Modal body --> <div class="p-6 space-y-6"> <astro-island uid="29vfFb" component-url="/_astro/AllQuestions.CegkmJa5.js" component-export="default" renderer-url="/_astro/client.D-OYWkQU.js" props="{&quot;formType&quot;:[0,&quot;contactUs&quot;],&quot;questions&quot;:[1,[[0,&quot;contactName&quot;],[0,&quot;contactEmail&quot;],[0,&quot;contactCompany&quot;],[0,&quot;contactPhone&quot;],[0,&quot;contactYourProject&quot;]]],&quot;updateExisting&quot;:[0,false],&quot;successMessage&quot;:[0,&quot;Thank you! Check your email for confirmation.&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;AllQuestions&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island> </div> </div> </div> </div> <footer class="relative border-t border-neutral-800 page-padding"> <div class="bg-neutral-700 absolute inset-0 pointer-events-none" aria-hidden="true"></div> <div class="relative max-w-6xl mx-auto text-neutral-300"> <div class="grid grid-cols-2 md:grid-cols-4 gap-4 py-4"> <div class="col-span-2"> <div> <div class="text-muted">Member</div> <a href="https://kotlinfoundation.org/" target="_blank"> <div class="flex flex-row items-center -mt-2"> <div class="logo-module--image--6c5d7"> <svg width="30" height="30" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill="none"> <path d="M20 20H0V0H20L9.79292 9.85527L20 20Z" fill="url(#paint0_radial_6229_9903)"></path> <defs> <radialGradient id="paint0_radial_6229_9903" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19.3354 0.822178) scale(22.9097)"> <stop offset="0.00343514" stop-color="#EF4857"></stop> <stop offset="0.4689" stop-color="#D211EC"></stop> <stop offset="1" stop-color="#7F52FF"></stop> </radialGradient> </defs> </svg> </div> <div class="foundation-font text-3xl ml-1">Kotlin Foundation</div> </div> </a> </div> </div> <div class=""> <ul class="text-sm space-y-2"> <li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/prodserv" target> Products & Services </a> </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/guide" target>
177 KMP Essential Guide </a> </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/blog" target> Blog </a> </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/careers" target> Careers </a> </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/about" target> About </a> </li> </ul> </div><div class=""> <ul class="text-sm space-y-2"> <li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="/contact-us?ue=contact-footer" target> Contact Us </a> </li><li> <div class="newsletterModalOpen cursor-pointer text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out"> Newsletter Signup </div>  </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="https://docs.google.com/document/d/e/2PACX-1vQ8678ogvFVuGVNlsZsOyY5RWehCq4Ttuzy5Bvvd90rHL4D1d2p-DVQWSJlksg1NQ7VAXrYuokHAabl/pub" target="_blank"> Privacy Policy </a> </li><li>  <a class="text-muted hover:underline text-neutral-300 transition duration-150 ease-in-out" href="https://docs.google.com/document/d/e/2PACX-1vTUOsX3hPGm7kbxmoiaoBxm06iGTI9lzgyWng2TuN9AzveuSUfQZTPbphmoPEUHfVUuB4kpXNmgxe9T/pub" target="_blank"> Terms and Conditions </a> </li> </ul> </div> <div class="flex col-span-2 lg:col-span-1 md:order-1 flex-row justify-start md:justify-end lg:justify-between"> <a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="Youtube" href="https://www.youtube.com/touchlab" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-youtube">   <symbol id="ai:tabler:brand-youtube" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M2 8a4 4 0 0 1 4-4h12a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4z"/><path d="m10 9l5 3l-5 3z"/></g></symbol><use href="#ai:tabler:brand-youtube"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="LinkedIn" href="https://www.linkedin.com/company/touch-lab" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-linkedin">   <symbol id="ai:tabler:brand-linkedin" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8 11v5m0-8v.01M12 16v-5m4 5v-3a2 2 0 1 0-4 0"/><path d="M3 7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4v10a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4z"/></g></symbol><use href="#ai:tabler:brand-linkedin"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="Twitter" href="https://twitter.com/touchlabhq" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-twitter">   <symbol id="ai:tabler:brand-twitter" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M22 4.01c-1 .49-1.98.689-3 .99c-1.121-1.265-2.783-1.335-4.38-.737S11.977 6.323 12 8v1c-3.245.083-6.135-1.395-8-4c0 0-4.182 7.433 4 11c-1.872 1.247-3.739 2.088-6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58-1.04 6.522-3.723 7.651-7.742a13.8 13.8 0 0 0 .497-3.753c0-.249 1.51-2.772 1.818-4.013z"/></symbol><use href="#ai:tabler:brand-twitter"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="Bluesky" href="https://bsky.app/profile/touchlab.co" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-bluesky">   <symbol id="ai:tabler:brand-bluesky" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.335 5.144C4.681 3.945 2 3.017 2 5.97c0 .59.35 4.953.556 5.661C3.269 14.094 5.686 14.381 8 14c-4.045.665-4.889 3.208-2.667 5.41C6.363 20.428 7.246 21 8 21c2 0 3.134-2.769 3.5-3.5q.5-1 .5-1.5q0 .5.5 1.5c.366.731 1.5 3.5 3.5 3.5c.754 0 1.637-.571 2.667-1.59C20.889 17.207 20.045 14.664 16 14c2.314.38 4.73.094 5.444-2.369c.206-.708.556-5.072.556-5.661c0-2.953-2.68-2.025-4.335-.826C15.372 6.806 12.905 10.192 12 12c-.905-1.808-3.372-5.194-5.665-6.856"/></symbol><use href="#ai:tabler:brand-bluesky"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="Mastodon" href="https://mastodon.social/@touchlab" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-mastodon">
177   <symbol id="ai:tabler:brand-mastodon" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M18.648 15.254C16.832 17.017 12 16.88 12 16.88a18.3 18.3 0 0 1-3.288-.256q1.69 2.977 8.982 2.475c-1.945 2.013-13.598 5.257-13.668-7.636L4 10.309c0-3.036.023-4.115 1.352-5.633C7.023 2.766 12 3.01 12 3.01s4.977-.243 6.648 1.667C19.977 6.195 20 7.274 20 10.31s-.456 4.074-1.352 4.944"/><path d="M12 11.204V8.278C12 7.02 11.105 6 10 6S8 7.02 8 8.278V13m4-4.722C12 7.02 12.895 6 14 6s2 1.02 2 2.278V13"/></g></symbol><use href="#ai:tabler:brand-mastodon"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="Github" href="https://github.com/touchlab" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:brand-github">   <symbol id="ai:tabler:brand-github" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2c2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2a4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6c-.6.6-.6 1.2-.5 2V21"/></symbol><use href="#ai:tabler:brand-github"></use>  </svg>  </a><a class="text-muted text-neutral-400 rounded-lg text-sm inline-flex items-center mr-4 md:mr-0 md:ml-4 lg:ml-0" aria-label="RSS" href="/rss.xml" target="_blank"> <svg width="1em" height="1em" class="w-9 h-9 text-neutral-400 hover:text-cyan-400" data-icon="tabler:rss">   <symbol id="ai:tabler:rss" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0-2 0M4 4a16 16 0 0 1 16 16M4 11a9 9 0 0 1 9 9"/></symbol><use href="#ai:tabler:rss"></use>  </svg>  </a> </div> <div class="text-sm text-neutral-500 font-bold col-span-2 lg:col-span-3"> 
178    <div class="dark:text-neutral-300 text-sm font-normal leading-snug">©2011-2026 All Rights Reserved.</div><div class="dark:text-neutral-300 text-sm font-normal leading-snug">Touchlab® is a registered trademark of Touch Lab Inc.</div>
179   </div> </div> </div> </footer>  </div> </div> <div id="cookiesMessage" class="z-10 hidden fixed right-0 bottom-24 sm:bottom-0 bg-neutral-800 p-2 w-full sm:max-w-lg mx-auto sm:m-12 shadow-[0_0_8px_4px_rgba(255,255,255,0.2)]"> <div class="border border-dashed border-neutral-300 p-4">
180Touchlab may use cookies and your IP address to collect stats and in some cases provide specific content. We do not share this data with outside entities. See the <a href="https://docs.google.com/document/d/e/2PACX-1vQ8678ogvFVuGVNlsZsOyY5RWehCq4Ttuzy5Bvvd90rHL4D1d2p-DVQWSJlksg1NQ7VAXrYuokHAabl/pub" class="underline" target="_blank">Privacy Policy</a> for more information.
181<div class="flex flex-row mt-4"> <div class="btn cursor-pointer text-lg text-black bg-cyan-400 hover:bg-cyan-300 w-full mr-2" id="cookiesMessageAccept">
182Accept
183</div> <div class="btn cursor-pointer text-lg text-neutral-400 bg-neutral-800 hover:bg-neutral-700 w-full ml-2" id="cookiesMessageDecline">
184Decline
185</div> </div> </div> </div>  </body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.