<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: DevTECH</title>
    <description>The latest articles on Forem by DevTECH (@inoxx_protocol_0658f35b52).</description>
    <link>https://forem.com/inoxx_protocol_0658f35b52</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884689%2F70ce151f-4c02-442b-a10c-d9c141aaa293.png</url>
      <title>Forem: DevTECH</title>
      <link>https://forem.com/inoxx_protocol_0658f35b52</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/inoxx_protocol_0658f35b52"/>
    <language>en</language>
    <item>
      <title>I Built an AI Islamic Companion App. Here's What Actually Surprised Me</title>
      <dc:creator>DevTECH</dc:creator>
      <pubDate>Thu, 14 May 2026 09:12:11 +0000</pubDate>
      <link>https://forem.com/inoxx_protocol_0658f35b52/i-built-an-ai-islamic-companion-app-heres-what-actually-surprised-me-4glb</link>
      <guid>https://forem.com/inoxx_protocol_0658f35b52/i-built-an-ai-islamic-companion-app-heres-what-actually-surprised-me-4glb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n3o6wiirkmtxzzp9q8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n3o6wiirkmtxzzp9q8h.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mytazki.com/" rel="noopener noreferrer"&gt;https://mytazki.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building for a faith-based audience is the same as building for any other audience.&lt;br&gt;
Just ship fast, iterate, repeat.&lt;br&gt;
That's what I thought before I started &lt;strong&gt;MyTazki&lt;/strong&gt;  an AI-powered Islamic&lt;br&gt;
companion PWA with Quran audio, Duas, prayer times, a Qibla compass, AI dhikr&lt;br&gt;
sessions, and push notifications for Adhan. Six months and 35+ features later,&lt;br&gt;
here are the technical decisions that genuinely surprised me  for better&lt;/p&gt;

&lt;h2&gt;
  
  
  and worse.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Contract-First API Changed Everything (and I Almost Skipped It)
&lt;/h2&gt;

&lt;p&gt;The most impactful DX decision in the project wasn't the AI stack or the database&lt;br&gt;
choice. It was writing the OpenAPI spec &lt;em&gt;first&lt;/em&gt; and generating everything from it.&lt;br&gt;
Here's the flow:&lt;/p&gt;

&lt;p&gt;lib/api-spec/openapi.yaml&lt;br&gt;
↓ (pnpm --filter &lt;a class="mentioned-user" href="https://dev.to/workspace"&gt;@workspace&lt;/a&gt;/api-spec run codegen)&lt;br&gt;
lib/api-client-react/src/generated/api.ts ← React Query hooks&lt;br&gt;
lib/api-zod/src/generated/api.ts ← Zod validators&lt;/p&gt;

&lt;p&gt;Orval reads the spec and generates type-safe React Query hooks &lt;strong&gt;and&lt;/strong&gt; Zod schemas&lt;br&gt;
in one command. The server validates inputs with the generated Zod schemas. The&lt;br&gt;
frontend calls the generated hooks. If the contract changes, a single codegen run&lt;br&gt;
propagates it everywhere  TypeScript screams at every inconsistency before a&lt;br&gt;
single test runs.&lt;br&gt;
Before this, I was hand-writing &lt;code&gt;fetch()&lt;/code&gt; calls, manually keeping types in sync,&lt;br&gt;
and debugging a mismatch between what the server sent and what the client expected.&lt;br&gt;
After? I haven't written a raw &lt;code&gt;fetch()&lt;/code&gt; on the frontend in four months.&lt;br&gt;
The lesson: **the five hours you spend writing the OpenAPI spec saves you fifty&lt;/p&gt;

&lt;h2&gt;
  
  
  hours of type drift.**
&lt;/h2&gt;

&lt;h2&gt;
  
  
  2. I Used a Key-Value Store Instead of PostgreSQL — No Regrets
&lt;/h2&gt;

&lt;p&gt;MyTazki runs on &lt;code&gt;@replit/database&lt;/code&gt;, a simple key-value store. No schema migrations.&lt;br&gt;
No SQL. No connection pooling. Just &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;set&lt;/code&gt;, and &lt;code&gt;list&lt;/code&gt;.&lt;br&gt;
That sounds naive for a production app, but here's the reality: every entity that&lt;br&gt;
would live in a relational table maps cleanly to a key pattern:&lt;/p&gt;

&lt;p&gt;user:{userId} → profile object&lt;br&gt;
streak:{userId} → { currentStreak, totalDays, lastCheckin }&lt;br&gt;
push:{userId} → subscription object&lt;br&gt;
aiUsage:{userId}:{date} → number (daily AI call count)&lt;br&gt;
duas:{duaId} → dua object&lt;br&gt;
sessions:{sessionId} → session object&lt;/p&gt;

&lt;p&gt;The gotcha is the return type. &lt;code&gt;db.get()&lt;/code&gt; returns &lt;code&gt;OkResult | ErrResult&lt;/code&gt; — not the&lt;br&gt;
value directly. Every single read needs:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
const result = await db.get(`user:${userId}`);
const user = result.ok ? result.value : null;

Forget that check and you're silently working with an error object that looks truthy.
I forgot it exactly twice. Both times were memorable.

The real limitation is joins. When you need "all duas favorited by user X," you
either store an index (favs:{userId} → [duaId, duaId, ...]) or do a full scan.
For a prayer app at this scale, that trade-off is acceptable. For anything with
complex relational queries, it's a pain.

3. The iOS Safari Audio Hack No One Writes About
The Quran reader plays 114 surahs with per-ayah audio from everyayah.com. Each
ayah is a separate .mp3 file in the format SSSAAA.mp3 (surah + ayah, zero-padded).

On desktop Chrome: trivial. Create an Audio element, update src on each ayah,
call play(). Works perfectly.

On iOS Safari: the moment you update audio.src and call play(), Safari
treats it as a new user-initiated play event — and blocks it, because iOS requires
audio to be triggered directly by a user gesture. Autoplay restrictions apply to
every new src assignment.

The fix: one persistent Audio element, never replaced — only src swapped.

// Created once, at component mount  never recreated
const audioRef = useRef(new Audio());
function playAyah(surah: number, ayah: number) {
  const src = `https://everyayah.com/data/Alafasy_128kbps/
    ${String(surah).padStart(3,'0')}
    ${String(ayah).padStart(3,'0')}.mp3`;
  audioRef.current.src = src;
  void audioRef.current.play(); // Works — iOS sees this as continuation
}

The first play() call must happen inside a user gesture handler (a tap). After
that, swapping src and calling play() on the same element inherits that
gesture permission for the session. Destroying and recreating the Audio element
resets the permission.

This took me a day and a half to figure out. Saving you the half.

4. AI Rate Limiting in a KV Store  Simpler Than You Think
The AI companion routes through Anthropic's Claude. Without rate limiting, one
motivated user could burn through significant API credits in an afternoon. The
solution is 20 AI requests per user per day, tracked with a single KV key:

const dateKey = new Date().toISOString().split('T')[0]; // "2026-05-14"
const usageKey = `aiUsage:${userId}:${dateKey}`;
const result = await db.get(usageKey);
const count = result.ok ? Number(result.value) : 0;
if (count &amp;gt;= 20) {
  return res.status(429).json({ error: "Daily AI limit reached. Resets at midnight." });
}
await db.set(usageKey, count + 1);
// ... call Claude

Keys naturally expire with the date — no cron job needed to clean up. Today's key
is aiUsage:user123:2026-05-14. Tomorrow it's aiUsage:user123:2026-05-15. The
old key just sits there taking up negligible space until you decide to clean it.

5. Qibla Compass: Web APIs Are Wilder Than I Expected
The Qibla page shows a compass needle pointing toward Mecca. The math is
straightforward — a great-circle bearing from the user's coordinates to
(21.4225° N, 39.8262° E). The Web part is where it gets interesting.

The Web Magnetometer API (DeviceOrientationEvent + webkitCompassHeading on
iOS) gives you the device's heading relative to magnetic north. Android exposes
DeviceOrientationEvent.alpha (rotation around Z-axis). But:

iOS requires HTTPS and explicit permission (DeviceOrientationEvent.requestPermission())
only available in a user gesture handler.
Android Chrome exposes the API but many mid-range devices have poor magnetometer
calibration  the needle drifts.
Desktop browsers mostly return null for magnetometer data.
The fallback chain I settled on:

GPS bearing (always available) → show Qibla direction on map
+ Magnetometer (when available) → animate live compass needle
+ Calibration prompt when accuracy is low → "Wave your phone in a figure-8"

The figure-8 calibration prompt was the most-commented feature in user feedback.
Turns out most people have never calibrated their phone compass and find it
genuinely surprising that this is a thing.

6. Push Notification Scheduling Is a Scheduler Problem
Prayer times differ by location. Fajr in London in January is 7:14 AM. In Karachi
in June, it's 4:02 AM. You can't pre-schedule notifications — you have to compute
them fresh for each user, each day, from their stored coordinates.

The approach: a scheduler loop running every 60 seconds on the API server, checking
whether any prayer time falls within the next minute for any subscribed user:

setInterval(async () =&amp;gt; {
  const subscribers = await getAllPushSubscribers(); // list prefix scan
  for (const { userId, subscription, preferences } of subscribers) {
    const user = await getUser(userId);
    const times = await getPrayerTimes(user.lat, user.lon);
    for (const prayer of PRAYERS) {
      if (!preferences[prayer]) continue;
      const prayerTime = times[prayer]; // e.g. "05:23"
      if (isWithinOneMinute(prayerTime)) {
        await sendPushNotification(subscription, {
          title: `${prayer} time`,
          body: `It's ${prayerTime} — time for ${prayer} prayer`,
        });
      }
    }
  }
}, 60_000);

The cold-start problem: if the server restarts at 5:22 and Fajr is at 5:23, the
first tick runs at 5:22:00 and sends the notification. If the restart takes more
than 60 seconds, you miss the window. For a prayer app, missing Fajr is bad UX.
The mitigation: start the interval with an immediate first tick (setImmediate +
setInterval), and log all misses for monitoring.

7. The Cultural UX Layer Is a Real Engineering Problem
Every technical decision in an Islamic app has a cultural dimension that isn't
obvious until you're building it.

Arabic RTL: React renders fine with dir="rtl", but flexbox reverses
direction in unintuitive ways. Every flex container near Arabic text needs explicit
direction management. I standardized on Amiri (font-family: "Amiri, serif") for
all Arabic text — it renders Quranic Arabic with correct diacritics and ligatures.
Using a generic serif font for Quranic text is visually wrong in a way that users
notice immediately.

Hijri calendar: The Hijri date doesn't map 1:1 to Gregorian — it's a lunar
calendar that shifts by ~11 days per year. I use aladhan.com for both prayer
times and Hijri date conversion. Trying to calculate this locally is a rabbit hole
I'm glad I didn't go down.

Tasbih counter: A simple counter with a haptic feedback tap. Sounds trivial.
The UX constraint: it must work with one hand while sitting in prayer. No accidental
resets. Every interaction must be deliberate. The reset button is hidden behind a
long-press, not a tap. Users asked for this explicitly.

Gender-neutral Duas: Some duas in classical Arabic are grammatically gendered.
For a library of 110+ duas, deciding which to include, how to present gender
variants, and whether to show transliteration by default required real product
thinking — not just copy-paste from an API.

What I'd Do Differently
Start with SSR or a static shell. The SPA approach means search crawlers that
don't execute JavaScript see an empty &amp;lt;div id="root"&amp;gt;. I added a pre-render
trick (H1 inside #root that React replaces on mount) but proper SSR or
prerendering would have been cleaner from day one.

Use Postgres earlier. The KV store got me to v1 fast, but the index management
complexity starts compounding around feature #15. A lightweight Postgres setup
from the start would have been worth the initial overhead.

Design the push notification UX before the infrastructure. The scheduler was
fun to build. Designing the permission request flow — when to ask, what to say,
how to handle denial gracefully — took longer than the scheduler itself.

The Stack, For Reference
Frontend: React + Vite, TypeScript 5.9, Tailwind CSS, pnpm workspaces
Backend: Express 5, @replit/database (KV), JWT auth, bcryptjs
AI: Anthropic Claude via API proxy
Push: web-push, VAPID, 60s scheduler loop
API Design: OpenAPI spec → Orval → React Query hooks + Zod schemas
Build: esbuild (CJS bundle for the server)
MyTazki is live at mytazki.com — free, no credit card,
works on any device as a PWA. If you're building for underrepresented communities
or faith-based audiences, I'm happy to answer questions in the comments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How I Built an AI-Native Islamic Growth Platform Optimized for SEO, GEO &amp; AI Search</title>
      <dc:creator>DevTECH</dc:creator>
      <pubDate>Tue, 12 May 2026 10:48:09 +0000</pubDate>
      <link>https://forem.com/inoxx_protocol_0658f35b52/how-i-built-an-ai-native-islamic-growth-platform-optimized-for-seo-geo-ai-search-1k3m</link>
      <guid>https://forem.com/inoxx_protocol_0658f35b52/how-i-built-an-ai-native-islamic-growth-platform-optimized-for-seo-geo-ai-search-1k3m</guid>
      <description>&lt;p&gt;The Problem&lt;/p&gt;

&lt;p&gt;Most Islamic apps today still look and behave like utility tools from 2018.&lt;/p&gt;

&lt;p&gt;They focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prayer times&lt;/li&gt;
&lt;li&gt;Quran reading&lt;/li&gt;
&lt;li&gt;Qibla direction&lt;/li&gt;
&lt;li&gt;static dua collections&lt;/li&gt;
&lt;li&gt;donation-driven experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But almost nobody is building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-native Islamic experiences&lt;/li&gt;
&lt;li&gt;emotional wellness systems&lt;/li&gt;
&lt;li&gt;guided Islamic growth journeys&lt;/li&gt;
&lt;li&gt;semantic SEO ecosystems&lt;/li&gt;
&lt;li&gt;AI-search optimized platforms&lt;/li&gt;
&lt;li&gt;retention-focused Muslim lifestyle products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gap is exactly why I started building &lt;strong&gt;MyTazki&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is MyTazki?
&lt;/h1&gt;

&lt;p&gt;MyTazki is an AI-first Muslim lifestyle platform focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quran reflections&lt;/li&gt;
&lt;li&gt;guided Islamic journeys&lt;/li&gt;
&lt;li&gt;Azkar and duas&lt;/li&gt;
&lt;li&gt;emotional wellness&lt;/li&gt;
&lt;li&gt;Islamic habits&lt;/li&gt;
&lt;li&gt;AI-powered spiritual growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was not to build another Islamic utility app.&lt;/p&gt;

&lt;p&gt;The goal was to build:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Calm + Duolingo for Muslim spiritual growth."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  The Biggest Shift: GEO Instead of Traditional SEO
&lt;/h1&gt;

&lt;p&gt;Most websites still optimize only for Google search rankings.&lt;/p&gt;

&lt;p&gt;I decided to optimize MyTazki for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google AI Overviews&lt;/li&gt;
&lt;li&gt;ChatGPT retrieval&lt;/li&gt;
&lt;li&gt;Perplexity citations&lt;/li&gt;
&lt;li&gt;conversational AI systems&lt;/li&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;voice search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where GEO (Generative Engine Optimization) becomes important.&lt;/p&gt;

&lt;p&gt;Instead of writing pages only for humans or keywords, the site architecture is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI retrievability&lt;/li&gt;
&lt;li&gt;semantic clustering&lt;/li&gt;
&lt;li&gt;topical authority&lt;/li&gt;
&lt;li&gt;conversational intent&lt;/li&gt;
&lt;li&gt;structured knowledge graphs&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Semantic SEO Architecture
&lt;/h1&gt;

&lt;p&gt;Instead of random blog posts, the platform uses semantic SEO silos.&lt;/p&gt;

&lt;p&gt;Main clusters include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emotional Wellness&lt;/li&gt;
&lt;li&gt;Salah &amp;amp; Prayer&lt;/li&gt;
&lt;li&gt;Quran Reflections&lt;/li&gt;
&lt;li&gt;Islamic Habits&lt;/li&gt;
&lt;li&gt;AI Islamic Companion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each cluster contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hub pages&lt;/li&gt;
&lt;li&gt;supporting articles&lt;/li&gt;
&lt;li&gt;journey funnels&lt;/li&gt;
&lt;li&gt;related content graphs&lt;/li&gt;
&lt;li&gt;FAQ schema&lt;/li&gt;
&lt;li&gt;speakable schema&lt;/li&gt;
&lt;li&gt;conversational search formatting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;p&gt;A deeply connected Islamic semantic knowledge graph.&lt;/p&gt;




&lt;h1&gt;
  
  
  GEO Optimization Strategy
&lt;/h1&gt;

&lt;p&gt;Every page contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI summary blocks&lt;/li&gt;
&lt;li&gt;conversational questions&lt;/li&gt;
&lt;li&gt;FAQ sections&lt;/li&gt;
&lt;li&gt;structured schema&lt;/li&gt;
&lt;li&gt;semantic relationships&lt;/li&gt;
&lt;li&gt;short-answer formatting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example queries targeted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Can Islam help anxiety?"&lt;/li&gt;
&lt;li&gt;"How do I reconnect with Allah?"&lt;/li&gt;
&lt;li&gt;"What dua helps overthinking?"&lt;/li&gt;
&lt;li&gt;"How can I build Islamic habits?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dramatically improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI citations&lt;/li&gt;
&lt;li&gt;retrieval quality&lt;/li&gt;
&lt;li&gt;semantic relevance&lt;/li&gt;
&lt;li&gt;long-tail visibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Internal Linking Became the Real SEO Moat
&lt;/h1&gt;

&lt;p&gt;One of the biggest realizations:&lt;/p&gt;

&lt;p&gt;Modern SEO is no longer about isolated pages.&lt;/p&gt;

&lt;p&gt;It is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semantic relationships&lt;/li&gt;
&lt;li&gt;crawl architecture&lt;/li&gt;
&lt;li&gt;entity understanding&lt;/li&gt;
&lt;li&gt;contextual linking&lt;/li&gt;
&lt;li&gt;topical depth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So every page inside MyTazki links contextually into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emotional wellness pages&lt;/li&gt;
&lt;li&gt;Quran reflections&lt;/li&gt;
&lt;li&gt;guided journeys&lt;/li&gt;
&lt;li&gt;routines&lt;/li&gt;
&lt;li&gt;AI experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a semantic web instead of a content library.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI-Native User Experience
&lt;/h1&gt;

&lt;p&gt;Another major focus was emotional UX.&lt;/p&gt;

&lt;p&gt;Most Islamic apps overload users with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cluttered dashboards&lt;/li&gt;
&lt;li&gt;generic gold Islamic UI&lt;/li&gt;
&lt;li&gt;too many features&lt;/li&gt;
&lt;li&gt;weak onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted MyTazki to feel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calm&lt;/li&gt;
&lt;li&gt;minimal&lt;/li&gt;
&lt;li&gt;emotionally safe&lt;/li&gt;
&lt;li&gt;modern&lt;/li&gt;
&lt;li&gt;reflective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calm&lt;/li&gt;
&lt;li&gt;Headspace&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;than traditional religious utility apps.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building a Freemium Islamic Product
&lt;/h1&gt;

&lt;p&gt;One difficult challenge:&lt;/p&gt;

&lt;p&gt;How do you monetize respectfully?&lt;/p&gt;

&lt;p&gt;The solution was:&lt;/p&gt;

&lt;p&gt;Free = Islamic knowledge remains accessible&lt;br&gt;
Premium = personalization, AI guidance, routines, and deeper experiences&lt;/p&gt;

&lt;p&gt;Premium features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Islamic companion&lt;/li&gt;
&lt;li&gt;guided journeys&lt;/li&gt;
&lt;li&gt;habit tracking&lt;/li&gt;
&lt;li&gt;emotional wellness systems&lt;/li&gt;
&lt;li&gt;journaling&lt;/li&gt;
&lt;li&gt;AI reflections&lt;/li&gt;
&lt;li&gt;personalized routines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The subscription layer is designed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retention&lt;/li&gt;
&lt;li&gt;emotional consistency&lt;/li&gt;
&lt;li&gt;guided growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;not aggressive SaaS upsells.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;p&gt;Current stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Razorpay subscriptions&lt;/li&gt;
&lt;li&gt;Semantic JSON-LD schema&lt;/li&gt;
&lt;li&gt;GEO-focused rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built entirely with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replit&lt;/li&gt;
&lt;li&gt;AI-assisted workflows&lt;/li&gt;
&lt;li&gt;iterative semantic architecture&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Biggest Lessons Learned
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. AI Search Is Real
&lt;/h2&gt;

&lt;p&gt;Traffic is increasingly coming from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI summaries&lt;/li&gt;
&lt;li&gt;conversational search&lt;/li&gt;
&lt;li&gt;semantic retrieval&lt;/li&gt;
&lt;li&gt;recommendation systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building for AI retrieval early creates a major advantage.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Emotional Intent Beats Generic Keywords
&lt;/h2&gt;

&lt;p&gt;These keywords are brutal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Islamic app&lt;/li&gt;
&lt;li&gt;Quran app&lt;/li&gt;
&lt;li&gt;Muslim app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But emotional long-tail intent is massively under-served.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to reconnect with Allah&lt;/li&gt;
&lt;li&gt;best dua for anxiety&lt;/li&gt;
&lt;li&gt;Islamic routine for peace&lt;/li&gt;
&lt;li&gt;how to stop missing salah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are much stronger acquisition channels.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Internal Linking Is Everything
&lt;/h2&gt;

&lt;p&gt;A semantic content graph outperforms disconnected blog spam.&lt;/p&gt;

&lt;p&gt;Especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI search&lt;/li&gt;
&lt;li&gt;topical authority&lt;/li&gt;
&lt;li&gt;GEO&lt;/li&gt;
&lt;li&gt;crawl depth&lt;/li&gt;
&lt;li&gt;engagement&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  What’s Next
&lt;/h1&gt;

&lt;p&gt;Current focus areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subscription system&lt;/li&gt;
&lt;li&gt;AI personalization&lt;/li&gt;
&lt;li&gt;emotional journey infrastructure&lt;/li&gt;
&lt;li&gt;retention systems&lt;/li&gt;
&lt;li&gt;backlinks&lt;/li&gt;
&lt;li&gt;social SEO loops&lt;/li&gt;
&lt;li&gt;AI citation optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term goal is to build:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the default AI-native Muslim growth platform.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;I think the next generation of successful products will not just be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO optimized&lt;/li&gt;
&lt;li&gt;visually polished&lt;/li&gt;
&lt;li&gt;feature rich&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emotionally intelligent&lt;/li&gt;
&lt;li&gt;AI retrievable&lt;/li&gt;
&lt;li&gt;semantically structured&lt;/li&gt;
&lt;li&gt;retention focused&lt;/li&gt;
&lt;li&gt;deeply personalized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the direction I’m trying to push with MyTazki.COM&lt;/p&gt;

&lt;p&gt;Would love feedback from other builders working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI products&lt;/li&gt;
&lt;li&gt;semantic SEO&lt;/li&gt;
&lt;li&gt;GEO optimization&lt;/li&gt;
&lt;li&gt;wellness apps&lt;/li&gt;
&lt;li&gt;faith-tech&lt;/li&gt;
&lt;li&gt;retention systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>My co-founder got PCOS. So I quit my job and built a meal planning app for 100 million Indian women.</title>
      <dc:creator>DevTECH</dc:creator>
      <pubDate>Wed, 22 Apr 2026 08:27:32 +0000</pubDate>
      <link>https://forem.com/inoxx_protocol_0658f35b52/how-i-built-an-ai-meal-planner-for-1-billion-indians-from-zero-to-pwa-with-gpt-4-push-2nda</link>
      <guid>https://forem.com/inoxx_protocol_0658f35b52/how-i-built-an-ai-meal-planner-for-1-billion-indians-from-zero-to-pwa-with-gpt-4-push-2nda</guid>
      <description>&lt;p&gt;So this is a bit of a long one. Grab chai.&lt;/p&gt;

&lt;p&gt;About two years ago, Priya — my co-founder and the person who basically stress-tests everything I build — got diagnosed with PCOS. Not shocking on its own, 1 in 5 Indian women has it. What was shocking was what happened next.&lt;/p&gt;

&lt;p&gt;Her doctor handed her a printed sheet. A diet plan. It said things like "avoid refined carbs" and "eat low-GI foods." That's it. No context. No recipes. No mention of the fact that she grew up eating idli and sambar every morning, that her mum cooks with coconut oil, that she doesn't have 90 minutes to make something from a wellness blog written by someone in California.&lt;/p&gt;

&lt;p&gt;She googled "PCOS diet plan India." Got 40 tabs of conflicting advice. Some said no rice. Some said brown rice is fine. One said drink fenugreek water at 6am. She tried three different apps. None of them knew what Ragi Dosa was.&lt;/p&gt;

&lt;p&gt;She asked me — the one who supposedly knows about software — "why doesn't something like this exist?"&lt;/p&gt;

&lt;p&gt;I didn't have a good answer. So I started building.&lt;/p&gt;




&lt;h2&gt;
  
  
  The thing I got wrong first
&lt;/h2&gt;

&lt;p&gt;My first instinct was to build a calorie tracker. That was stupid. Nobody wants to log every meal. That's not a product, that's homework.&lt;/p&gt;

&lt;p&gt;What Priya actually needed was someone to just... tell her what to cook. Specifically. For her body. With food she already knows how to make.&lt;/p&gt;

&lt;p&gt;That reframe changed everything. This wasn't a tracking app. It was a &lt;em&gt;decision&lt;/em&gt; app. Every morning it answers one question: "Aaj kya banau?" — What should I cook today?&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mealcoreai.com" rel="noopener noreferrer"&gt;MealCoreAI&lt;/a&gt; is a progressive web app that generates a full 7-day Indian meal plan — breakfast, lunch, snack, dinner — tailored to your health condition. Not "Indian food" in a vague sense. Ragi dosa. Bajra roti. Moong dal. Palak paneer. Real food that real Indian families cook.&lt;/p&gt;

&lt;p&gt;We cover 7 health tracks: PCOS, Diabetes, Thyroid, Pregnancy, Kids, Fitness, and General. Each one has completely different dietary rules baked in.&lt;/p&gt;

&lt;p&gt;For PCOS, that means low-GI, high-protein, no deep-fried stuff — because insulin resistance is the core driver of most PCOS symptoms and you can genuinely move the needle through food.&lt;/p&gt;

&lt;p&gt;For Thyroid, it means being careful about cruciferous vegetables — most people don't know that eating too much gobi (cauliflower) can interfere with thyroid medication. The app just... handles that. You don't need to know the science.&lt;/p&gt;

&lt;p&gt;For Pregnancy, we strip out anything that's risky — papaya, raw eggs, certain high-mercury fish — while making sure every day hits iron, folate and calcium targets. Because that stuff matters more than macros when you're 20 weeks in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The technical part (skip if you just want the story)
&lt;/h2&gt;

&lt;p&gt;The hardest thing wasn't the AI. It was the dish database.&lt;/p&gt;

&lt;p&gt;I spent two weeks just building a database of 55 Indian dishes with full nutritional data and health flags. Every dish has columns like &lt;code&gt;pcos_safe&lt;/code&gt;, &lt;code&gt;diabetes_safe&lt;/code&gt;, &lt;code&gt;thyroid_safe&lt;/code&gt;, &lt;code&gt;pregnancy_safe&lt;/code&gt;. These aren't guesses — I worked through them with a nutritionist.&lt;/p&gt;

&lt;p&gt;The reason this matters: when you ask GPT-4 to "generate a PCOS meal plan," it will confidently give you dishes that have no nutritional backing, make up calorie counts, and occasionally recommend something that's actively bad for the condition. I've seen it recommend bhatura for a diabetic. Bhatura!&lt;/p&gt;

&lt;p&gt;My fix was to constrain the AI to only choose from our validated dish IDs. It doesn't generate meal names — it picks dish IDs from a numbered list. The AI becomes a smart selector, not a free-form generator. Hallucinations dropped to basically zero.&lt;/p&gt;

&lt;p&gt;The stack is React 19 + Vite on the front, Express 5 on the back, PostgreSQL with Drizzle ORM, and OpenAPI 3.1 as the single source of truth for the API. Orval auto-generates the React Query hooks from the spec, which means I never manually write API client code. When the spec changes, one command regenerates everything.&lt;/p&gt;

&lt;p&gt;The whole thing is open source: &lt;a href="https://github.com/InoxxAIsource/mealmate" rel="noopener noreferrer"&gt;github.com/InoxxAIsource/mealmate&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Push notifications — the thing that took three restarts
&lt;/h2&gt;

&lt;p&gt;I wanted the app to actually remind you to cook at meal time. Not "Hey, don't forget to log your meal!" — I hate those. I wanted it to say "Lunch time! Today you're making Moong Dal + Bajra Roti." Your actual meal. By name.&lt;/p&gt;

&lt;p&gt;Web Push on Android is fine. iOS nearly broke me.&lt;/p&gt;

&lt;p&gt;On iOS, push notifications only work in Safari 16.4 or higher, and only when the app is added to the Home Screen. Not when it's open in a browser tab. Not when it's running as a bookmark. Actually installed to the Home Screen.&lt;/p&gt;

&lt;p&gt;Getting users to do that is a UX problem. So I built a custom bottom sheet that detects whether you're on iOS, whether you've already installed it, and shows you step-by-step instructions with the actual Safari share button icon. It only appears once — if you dismiss it, it doesn't come back for 30 days. Because if there's one thing worse than a bad feature it's a naggy one.&lt;/p&gt;

&lt;p&gt;When the scheduler fires (it runs every 30 seconds and checks the time), it pulls the user's active meal plan, finds today's dish for that meal slot, and sends a notification with the actual dish name. That specificity is what makes people leave notifications on.&lt;/p&gt;




&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;The feature people use most isn't the AI generation. It's the &lt;strong&gt;Swap button&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nobody follows a meal plan perfectly. You open the fridge on a Tuesday morning and the one thing the plan calls for isn't there. So you tap Swap, and the AI instantly replaces just that one meal while leaving the rest of the week untouched.&lt;/p&gt;

&lt;p&gt;That single interaction — swap one meal, keep everything else — made the product feel alive instead of rigid. It went from "a plan you're supposed to follow" to "a plan that adapts to you." Which is what it should be.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it's at today
&lt;/h2&gt;

&lt;p&gt;The app is live at &lt;a href="https://mealcoreai.com" rel="noopener noreferrer"&gt;mealcoreai.com&lt;/a&gt;. Free tier gives you a 7-day plan, grocery list, nutrition tracking and AI chat. Pro is ₹499/month or ₹2,999/year.&lt;/p&gt;

&lt;p&gt;The sitemap has 282 pages. Lighthouse is 97/96/100/100. It's been indexed by Google for about 48 hours.&lt;/p&gt;

&lt;p&gt;We're pre-revenue but post-product. If you have PCOS, diabetes, are pregnant, or are raising kids in India and want to try it — genuinely free, no credit card, no email sequences from me.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you're building for India (or any market that isn't SF)
&lt;/h2&gt;

&lt;p&gt;The generic advice is always "build for the user you know." But most of us building software are building for users who look like us — people with fast internet, English as a first language, and food habits from a Western diet.&lt;/p&gt;

&lt;p&gt;1.4 billion people don't fit that profile.&lt;/p&gt;

&lt;p&gt;The opportunity isn't to copy Noom and translate it to Hindi. It's to start from scratch with the actual constraints of real Indian life: shared family meals, regional cuisines that differ wildly, health conditions that are dramatically more prevalent than in the West, and real people who just want to know what to cook for dinner without a 45-minute deep dive into nutrition science.&lt;/p&gt;

&lt;p&gt;That's what I'm trying to build. Slowly. One swap button at a time.&lt;/p&gt;




&lt;p&gt;Code is at &lt;a href="https://github.com/InoxxAIsource/mealmate" rel="noopener noreferrer"&gt;github.com/InoxxAIsource/mealmate&lt;/a&gt; — React 19, Express 5, Drizzle ORM, OpenAPI codegen, VAPID push, the works. Proper README with setup instructions. MIT licensed.&lt;/p&gt;

&lt;p&gt;Ask me anything in the comments. Happy to go into the AI prompt architecture, the iOS push hell, or why I chose Drizzle over Prisma.&lt;/p&gt;

</description>
      <category>webdevaishowdevopensource</category>
    </item>
    <item>
      <title>How to Calculate Cricket Arbitrage: The Maths Behind Guaranteed Profits</title>
      <dc:creator>DevTECH</dc:creator>
      <pubDate>Fri, 17 Apr 2026 14:44:16 +0000</pubDate>
      <link>https://forem.com/inoxx_protocol_0658f35b52/how-to-calculate-cricket-arbitrage-the-maths-behind-guaranteed-profits-3m7m</link>
      <guid>https://forem.com/inoxx_protocol_0658f35b52/how-to-calculate-cricket-arbitrage-the-maths-behind-guaranteed-profits-3m7m</guid>
      <description>&lt;p&gt;Most people who discover cricket arbitrage betting make the same mistake — they understand the concept immediately but then reach for a spreadsheet to do the stake calculations. By the time they've typed in the odds and formulas, the window has closed.&lt;/p&gt;

&lt;p&gt;I've been building &lt;a href="https://cricketarb.com" rel="noopener noreferrer"&gt;CricketArb&lt;/a&gt; for the past few months, and one of the most common questions I get is: how do I actually calculate what to stake on each side?&lt;/p&gt;

&lt;p&gt;Let me break down the exact maths, then point you to the free tool that does it live as you type.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Formula
&lt;/h2&gt;

&lt;p&gt;For a two-outcome match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arb% = (1 / Odds_A) + (1 / Odds_B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Arb% is below 1.00 (100%), you have an arbitrage opportunity. Profit margin = 1 - Arb%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real IPL 2026 example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bet365: CSK to win @ 2.10&lt;/li&gt;
&lt;li&gt;Betfair: MI to win @ 2.05
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arb% = (1/2.10) + (1/2.05) = 0.4762 + 0.4878 = 0.9640
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's &lt;strong&gt;3.6% guaranteed profit&lt;/strong&gt; regardless of result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stake Allocation
&lt;/h2&gt;

&lt;p&gt;You don't split 50/50. You allocate proportionally so both outcomes return the same amount.&lt;/p&gt;

&lt;p&gt;With ₹10,000 total stake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stake_A = 10000 × (1/2.10) / 0.9640 = ₹4,940
Stake_B = 10000 - 4940 = ₹5,060
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verification:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bet365: ₹4,940 × 2.10 = ₹10,374&lt;/li&gt;
&lt;li&gt;Betfair: ₹5,060 × 2.05 = ₹10,373&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both return ₹10,373 → guaranteed ₹373 profit on ₹10,000 stake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Manual Calculation Fails in Practice
&lt;/h2&gt;

&lt;p&gt;During live IPL, odds move every few seconds. By the time you've opened a spreadsheet, one of three things has happened: the window closed, you made an error under pressure, or you staked the wrong amount on one side.&lt;/p&gt;

&lt;p&gt;This is why I built the &lt;a href="https://cricketarb.com/calculator" rel="noopener noreferrer"&gt;cricket arbitrage calculator&lt;/a&gt; — it recalculates on every keystroke, shows you the arb percentage live, and generates a Telegram-ready summary you can paste instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  3-Way Arbs (Test Cricket / Draw Markets)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arb% = (1/Odds_A) + (1/Odds_Draw) + (1/Odds_B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same rule: below 100% = sure bet. The calculator handles 3-way arbs with a single toggle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Polymarket Edge
&lt;/h2&gt;

&lt;p&gt;Pure bookmaker vs bookmaker arbs are increasingly rare. The real edge is &lt;strong&gt;cross-platform arbs between traditional bookmakers and prediction markets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Polymarket prices cricket outcomes in cents (52¢ = 52% implied probability). Their trader base is crypto-native, not cricket-native. When a wicket falls during an IPL powerplay, Bet365 reprices in under 5 seconds. Polymarket can take 30-60 seconds. That lag is where the best windows open.&lt;/p&gt;

&lt;p&gt;More detail in the full &lt;a href="https://cricketarb.com/blog/cricket-arbitrage-calculator-guide" rel="noopener noreferrer"&gt;cricket arbitrage calculator guide&lt;/a&gt; — includes worked IPL 2026 examples and a walkthrough of every calculator output metric.&lt;/p&gt;

&lt;p&gt;If "sure bet" is the terminology you know, that guide is also covered at &lt;a href="https://cricketarb.com/blog/sure-bet-calculator-cricket" rel="noopener noreferrer"&gt;sure bet calculator for cricket&lt;/a&gt; — same maths, additional PSL examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Free calculator (live recalculation): &lt;a href="https://cricketarb.com/calculator" rel="noopener noreferrer"&gt;https://cricketarb.com/calculator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live scanner terminal: &lt;a href="https://cricketarb.com/terminal" rel="noopener noreferrer"&gt;https://cricketarb.com/terminal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Telegram signals: t.me/cricedge&lt;/li&gt;
&lt;li&gt;GitHub: github.com/InoxxAIsource/cricedge-arb-scanner&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cricket</category>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
