<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Talo Engineering]]></title><description><![CDATA[Talo Engineering]]></description><link>https://talo-engineering.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 31 Oct 2026 22:15:40 GMT</lastBuildDate><atom:link href="https://talo-engineering.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I’m Building 25 Dating Apps with One PWA Codebase]]></title><description><![CDATA[How Talo builds 25 community dating apps with one Expo PWA: dynamic manifests, Instagram browser handoffs, and a network-only Service Worker.]]></description><link>https://talo-engineering.hashnode.dev/i-m-building-25-dating-apps-with-one-pwa-codebase</link><guid isPermaLink="true">https://talo-engineering.hashnode.dev/i-m-building-25-dating-apps-with-one-pwa-codebase</guid><category><![CDATA[PWA]]></category><category><![CDATA[Expo]]></category><dc:creator><![CDATA[Keiji Isogimi]]></dc:creator><pubDate>Sat, 24 Oct 2026 21:43:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6add229dc9290faf1409a496/1614567a-118d-496b-9627-9492fef1da0e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’m building 25 dating apps through Talo.</p>
<p>There’s Tamil Talo for the Tamil community, Punjabi Talo for the Punjabi community, and Shia Talo for the Shia Muslim community. Each has its own name, landing page, and application hostname. They share an Expo application, an API, and a database.</p>
<p>The product goal is simple: help someone meet a person from their community over a first Coffee Date. The engineering challenge is giving each service a recognizable identity while keeping registration, chat, notifications, and updates maintainable.</p>
<p>Here’s how the PWA implementation works—and the browser behavior that makes it more interesting than changing a logo.</p>
<h2>Why Build 25 Dating Apps?</h2>
<p>A person looking for a Tamil dating app may care about sharing a language, family context, or cultural background. Someone looking for an Ismaili dating app may start with a different requirement. Each person still needs room to explain what matters to them individually.</p>
<p>That is the reason for the community-specific entry points. Tamil Talo can explain who its service is for from the first page. Punjabi Talo can do the same for its audience. Neither name tells us everything about a person’s beliefs, preferences, or compatibility.</p>
<p>The shared experience is a reviewed introduction, a private choice to meet or pass, and—when both people agree—help arranging a roughly 60-minute date at a supported public cafe. Accepting that invitation means being willing to have a conversation. It does not commit either person to a relationship or another date.</p>
<h2>One Catalog Connects the Brand to the Application</h2>
<p>We keep community IDs, names, and hostnames in a maintained catalog. The web application resolves its brand from the hostname, and shared components use that result for their displayed name.</p>
<p>The route from discovery to the app looks like this:</p>
<pre><code class="language-text">Tamil Talo landing page       Punjabi Talo landing page
          |                              |
tamil.withtalo.com             punjabi.withtalo.com
          |                              |
          +------ shared Expo app -------+
                         |
                  shared API and DB
</code></pre>
<p>Our Expo application also shares code between Web and Native. Browser-specific installation and notification behavior lives in Web modules, so the common product logic does not need to implement every platform interaction itself.</p>
<h2>Make the PWA Identity Stable</h2>
<p>The brand needs to survive the move from a browser tab to the home screen.</p>
<p>When a browser requests <code>/manifest.webmanifest</code>, a Worker reads the base manifest, looks up the hostname, and overrides the identity fields. The core transformation is small:</p>
<pre><code class="language-js">const entry = entryByHostname(url.hostname);
const name = entryBrandName(entry?.id);

const brandedManifest = {
  ...manifest,
  id: entry ? `/talo/${entry.id}` : "/talo",
  name,
  short_name: name,
  start_url: "/activate?source=pwa",
  scope: "/",
};
</code></pre>
<p>Tamil’s host gets the name <code>Tamil Talo</code> and manifest ID <code>/talo/tamil</code>. Punjabi’s host gets <code>Punjabi Talo</code> and <code>/talo/punjabi</code>.</p>
<p>We derive that identity from the host rather than a member’s current selection. Otherwise, installation behavior could depend on account state or the last community link someone visited. A fixed host identity stays predictable before and after login.</p>
<p>The relative <code>start_url</code> opens the activation route on that same community host. That route reads the saved application state and chooses the next screen.</p>
<p>Our current PWA icons and base theme colors are shared. The community-specific pieces include the hostname, name, manifest ID, and in-app brand presentation.</p>
<p>For a concrete example, explore <a href="https://withtalo.com/tamil/">Tamil Talo’s Tamil dating app</a> and its community-specific landing page.</p>
<p>Here are the actual public landing pages, captured on October 24, 2026. Their shared layout keeps the community name and explanation specific to each service.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6add229dc9290faf1409a496/e7e6996f-d2ff-49df-b305-b97ecd233ba3.png" alt="Tamil Talo public landing page with its Tamil dating app heading, service description, and cafe image." /></p>
<p><em>Tamil Talo’s public brand page.</em></p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6add229dc9290faf1409a496/ed93b050-6ce8-4447-b512-ac3a92004ee3.png" alt="Punjabi Talo public landing page with its Punjabi dating app heading, service description, and cafe image." /></p>
<p><em>Punjabi Talo’s public brand page.</em></p>
<h2>Instagram Changes the Installation Problem</h2>
<p>The happy path starts in a normal browser. A real discovery path can start inside Instagram or Facebook.</p>
<p>Our installation flow checks user-agent indicators for those apps and Android WebViews. It treats that detection as a heuristic and retains manual guidance.</p>
<p>On iPhone and iPad, eligible pages opened outside Safari attempt a Safari handoff using <code>x-safari-https</code>. The redirect is limited to recognized origins and permitted routes. It skips Safari and installed PWAs, excludes credential-bearing URLs, and does not forward unknown query parameters.</p>
<p>The OS or host app can block the attempt, so we keep a copyable link and instructions for opening it in Safari. On Android, the in-app-browser flow guides the person to copy the link and open it in Chrome; it does not automatically launch Chrome.</p>
<p>The handoff link preserves the community destination and a return path to installation. Authentication happens in the destination browser. That can mean signing in again, but it avoids putting a signed-in session into a URL.</p>
<p>Once in a supported browser, iPhone and iPad users get illustrated home-screen instructions. Android uses <code>beforeinstallprompt</code> when available, with a manual fallback when it is unavailable or dismissed.</p>
<h2>Our Service Worker Does Not Precache the App Shell</h2>
<p>This is a deliberate tradeoff in Talo’s PWA implementation.</p>
<p>For same-origin page navigations, the worker fetches from the network with <code>cache: "no-store"</code>. If that request fails, it returns a reconnect-and-retry screen. It does not serve a cached application shell.</p>
<p>We give up offline use of the application, while avoiding a Service Worker that keeps returning an old app shell. This describes the worker’s policy; it does not disable every browser or CDN cache.</p>
<p>Worker activation also does not force a page reload. Someone filling out a profile, uploading a photo, or completing a payment should not lose their current interaction because a worker updated.</p>
<p>The same policy applies across the community hosts, so it can be maintained as one implementation.</p>
<h2>Four States We Keep Separate</h2>
<p>A successful installation prompt is an incomplete picture of whether someone can return to the app. Our implementation distinguishes:</p>
<ol>
<li><strong>Standalone launch:</strong> the authenticated member actually opens the PWA in standalone mode.</li>
<li><strong>Notification permission:</strong> the browser reports that notifications are allowed.</li>
<li><strong>Subscription registration:</strong> the Push subscription is successfully registered with our server.</li>
<li><strong>Remote delivery:</strong> a notification actually reaches the device, which needs separate verification.</li>
</ol>
<p>Permission can succeed while subscription registration fails. An installation event does not prove a standalone launch. Keeping those facts separate makes failures easier to locate without inventing successful earlier steps.</p>
<p>Sharing infrastructure also does not merge the services’ membership rules. A hostname determines presentation; it does not establish a person’s identity, eligibility, or permission for an introduction.</p>
<h2>The 25 Community Dating Apps</h2>
<p>These are Talo’s current community brands as of October 24, 2026. Each link goes to the service’s brand overview, where readers can check its audience and supported locations.</p>
<p>The current regional offer is in Canada. Country-neutral names and URLs do not imply worldwide availability; check the relevant service page before joining.</p>
<ul>
<li><strong>Tamil dating app:</strong> <a href="https://withtalo.com/tamil/">Tamil Talo</a></li>
<li><strong>Telugu dating app:</strong> <a href="https://withtalo.com/telugu/">Telugu Talo</a></li>
<li><strong>Punjabi dating app:</strong> <a href="https://withtalo.com/punjabi/">Punjabi Talo</a></li>
<li><strong>Gujarati dating app:</strong> <a href="https://withtalo.com/gujarati/">Gujju Talo</a></li>
<li><strong>Armenian dating app:</strong> <a href="https://withtalo.com/armenian/">Hye Talo</a></li>
<li><strong>Malayali dating app:</strong> <a href="https://withtalo.com/malayali/">Mallu Talo</a></li>
<li><strong>Shia Muslim dating app:</strong> <a href="https://withtalo.com/shia/">Shia Talo</a></li>
<li><strong>Jehovah’s Witness dating app:</strong> <a href="https://withtalo.com/jehovah-witness/">JW Talo</a></li>
<li><strong>Adventist dating app:</strong> <a href="https://withtalo.com/adventist/">SDA Talo</a></li>
<li><strong>Ismaili dating app:</strong> <a href="https://withtalo.com/ismaili/">Ismaili Talo</a></li>
<li><strong>Iranian dating app:</strong> <a href="https://withtalo.com/persian/">Irani Talo</a></li>
<li><strong>Somali dating app:</strong> <a href="https://withtalo.com/somali/">Somali Talo</a></li>
<li><strong>Marathi dating app:</strong> <a href="https://withtalo.com/marathi/">Marathi Talo</a></li>
<li><strong>Turkish dating app:</strong> <a href="https://withtalo.com/turkish/">Turk Talo</a></li>
<li><strong>Ethiopian dating app:</strong> <a href="https://withtalo.com/ethiopian/">Ethio Talo</a></li>
<li><strong>Pakistani dating app:</strong> <a href="https://withtalo.com/pakistani/">Pak Talo</a></li>
<li><strong>Afghan dating app:</strong> <a href="https://withtalo.com/afghan/">Afghan Talo</a></li>
<li><strong>Coptic dating app:</strong> <a href="https://withtalo.com/coptic/">Coptic Talo</a></li>
<li><strong>Albanian dating app:</strong> <a href="https://withtalo.com/albanian/">Albanian Talo</a></li>
<li><strong>Bangladeshi dating app:</strong> <a href="https://withtalo.com/bangladeshi/">Bangla Talo</a></li>
<li><strong>Nigerian dating app:</strong> <a href="https://withtalo.com/nigerian/">Naija Talo</a></li>
<li><strong>Ghanaian dating app:</strong> <a href="https://withtalo.com/ghanaian/">Ghana Talo</a></li>
<li><strong>Egyptian dating app:</strong> <a href="https://withtalo.com/egyptian/">Egypt Talo</a></li>
<li><strong>Lebanese dating app:</strong> <a href="https://withtalo.com/lebanese/">Lebanese Talo</a></li>
<li><strong>Sri Lankan dating app:</strong> <a href="https://withtalo.com/sri-lankan/">Lankan Talo</a></li>
</ul>
<p>The engineering work is to keep one core reliable while preserving the identity and service boundaries of each app. The product question is whether that experience helps people move from discovering their community’s service to a Coffee Date. Both deserve their own evidence.</p>
]]></content:encoded></item></channel></rss>