<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[UnRead by Fam]]></title><description><![CDATA[Fam's blog page of unread, raw and inspiring stories 😎. Read our blogs designed for the 21st century generation, and follow us for our latest updates in the fintech space.]]></description><link>https://blog.famapp.in/blog/</link><image><url>https://blog.famapp.in/blog/favicon.png</url><title>UnRead by Fam</title><link>https://blog.famapp.in/blog/</link></image><generator>Ghost 5.89</generator><lastBuildDate>Wed, 08 Apr 2026 22:36:07 GMT</lastBuildDate><atom:link href="https://blog.famapp.in/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[The Story Behind Fam's Tech Stack🚀]]></title><description><![CDATA[Not only does a tech stack determine the kind of app the team builds in the end, it also directly impacts the efficiency with which the developers build it. ]]></description><link>https://blog.famapp.in/blog/the-story-behind-fampays-tech-stack/</link><guid isPermaLink="false">60b8ce5840a8e80001fba36a</guid><category><![CDATA[Tech]]></category><category><![CDATA[FamSays]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Sat, 29 Nov 2025 18:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2025/11/feature-image-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2025/11/feature-image-1.png" alt="The Story Behind Fam&apos;s Tech Stack&#x1F680;"><p></p><p>It would be an understatement to say that <em>your tech stack makes or breaks the project.</em> Not only does a tech stack determine the kind of app that the team will be able to build in the end, but it also directly impacts the efficiency with which the developers build it. Thus, it was imperative for the core team at Fam to curate an effective yet dynamic tech stack.</p><p>When we started building Fam, the core team had experience in developing backends with Django and Android apps. We chose what we were most comfortable with and knew it was a scalable framework having been used by Instagram (until ~2015), Pinterest, Disqus, and Creative Commons.</p><h1 id="languages"><strong>Languages</strong></h1><p><a href="https://golang.org/?ref=blog.famapp.in"><strong>GoLang</strong></a> - Most of our backend code is in Go. Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. We use <a href="https://gofiber.io/?ref=blog.famapp.in">Gofiber</a> and net/http as our Go web framework for HTTP server implementations. For micro-services communication, we leverage <a href="https://grpc.io/?ref=blog.famapp.in">gRPC</a> with Google&apos;s gRPC libraries for efficient, language-agnostic communication between services. Our Go projects follow a <a href="https://alistair.cockburn.us/hexagonal-architecture?ref=blog.famapp.in" rel="noreferrer"><strong>hexagonal architecture</strong></a>, enabling modular design and easy evolution of services over time.</p><p><a href="https://python.org/?ref=blog.famapp.in"><strong>Python</strong></a> - Python&apos;s design philosophy emphasises code readability with its notable use of significant indentation. Additionally, we use static code checking tools like <a href="https://pypi.org/project/flake8/?ref=blog.famapp.in">flake8</a>, <a href="https://pypi.org/project/black/?ref=blog.famapp.in">black</a>, <a href="https://pypi.org/project/isort/?ref=blog.famapp.in">isort</a> to have consistent patterns. Now you can even code in notepad and still, that won&#x2019;t break PEP8 guidelines xD.</p><p><strong>Java -</strong> Mostly used by Android App, Java is a High Level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.</p><p><a href="https://kotlinlang.org/?ref=blog.famapp.in"><strong>Kotlin</strong></a>- Kotlin is a cross-platform, statically typed, general-purpose programming language with type inference. Along with Java, most of our Android app is now written in Kotlin.</p><p><a href="https://swift.org/about/?ref=blog.famapp.in"><strong>Swift</strong></a> - Swift is a general-purpose, multi-paradigm, compiled programming language developed by Apple Inc. and the open-source community.</p><p><strong>Dart -</strong> Dart is a modern, client-optimized programming language developed by Google. Dart offers a familiar C-style syntax, sound type safety, and a rich standard library that makes development efficient and predictable. Its asynchronous programming model with <code>async</code>/<code>await</code> and support for isolates enables smooth concurrency handling, making it a versatile choice for both frontend and backend development using the Flutter framework.</p><p><a href="https://www.typescriptlang.org/?ref=blog.famapp.in"><strong>TypeScript</strong></a> - TypeScript is an open-source language developed by Microsoft that builds on JavaScript with static typing and modern ES features. It compiles to plain JavaScript, ensuring full compatibility across browsers and Node.js. We use TypeScript across both frontend (React, Next.js) and backend (Node.js) projects for its type safety, better tooling, and maintainable, predictable codebases.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/11/Programming-Languages.jpg" class="kg-image" alt="The Story Behind Fam&apos;s Tech Stack&#x1F680;" loading="lazy" width="2000" height="2000" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/11/Programming-Languages.jpg 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/11/Programming-Languages.jpg 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/11/Programming-Languages.jpg 1600w, https://blog.famapp.in/blog/content/images/2025/11/Programming-Languages.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><h1 id="frontend"><strong>Frontend</strong></h1><h3 id="%E2%9A%A1%EF%B8%8F-website"><strong>&#x26A1;&#xFE0F; Website</strong></h3><p>We use <a href="https://nextjs.org/?ref=blog.famapp.in">Next.js</a> to power our frontend applications. Next.js offers built-in server-side rendering (SSR), static site generation (SSG), and automatic code splitting, enabling fast, scalable, and SEO-friendly web experiences. Our frontend is deployed on <a href="https://pages.cloudflare.com/?ref=blog.famapp.in">Cloudflare Pages</a>, leveraging its globally distributed edge network, automatic builds, and seamless CI/CD integration for reliable and lightning-fast performance.</p><h3 id="%F0%9F%A4%96-android">&#x1F916; <strong>Android</strong></h3><p>Fam&#x2019;s Android app started as a native Android app in 2019 with majority of it built with Android specific frameworks using Java/Kotlin. The majority of views were written in XML, and there&#x2019;s been an active effort to shift towards Jetpack Compose and hybrid technologies.</p><p>The app is built using MVP/MVVM architecture relying on popular libraries like <a href="https://github.com/square/okhttp?ref=blog.famapp.in">OkHttp</a>, <a href="https://github.com/square/retrofit?ref=blog.famapp.in">Retrofit</a>, <a href="https://github.com/bumptech/glide?ref=blog.famapp.in">Glide</a>, <a href="https://github.com/greenrobot/EventBus?ref=blog.famapp.in">EventBus</a>, <a href="https://github.com/ChuckerTeam/chucker?ref=blog.famapp.in">Chucker</a>, <a href="https://github.com/ReactiveX/RxJava?ref=blog.famapp.in">RxJava</a>, &amp; Kotlin Coroutines for its functioning.</p><p>Overtime, as the requirements grew more complex, we wanted to explore modern day hybrid solutions like <strong>Flutter</strong>, <strong>Kotlin Multiplatform</strong> &amp; <strong>PWAs</strong> in order to deliver at a faster pace and maintain unified a codebase across our apps. Currently, our mobile apps utilize KMP for some of their core business logic handling and the plan is to further expand our dependence to KMP layer for more platform-level usecases.</p><p>Today our apps are structured in a way that we can deliver full-fledged features either in native Android or as a PWA or using Flutter. This architecture, today grants us the power of choice to deliver any feature using the framework of our choice.</p><h3 id="%F0%9F%8D%8E-ios">&#x1F34E;<strong> iOS</strong></h3><p>Fam&#x2019;s iOS app began its journey in 2019, built natively using <strong>Swift</strong> and <strong>SwiftUI</strong>. The app architecture primarily relies on the <strong>Reactor pattern</strong> to manage state and business logic, along with the <strong>Coordinator pattern</strong> to handle navigation and flow between screens.</p><p>As the product and its requirements evolved, our team started exploring cross-platform technologies to accelerate development and achieve greater code sharing across platforms. This led to the adoption of Flutter, which we integrated into our native iOS application using the Flutter Engine. This hybrid setup allows us to seamlessly embed Flutter-based views and features alongside our native SwiftUI components. Over time, we&#x2019;ve continued to enhance this integration, giving our iOS app the flexibility to deliver complete features either natively in SwiftUI or via Flutter &#x2014; depending on what best fits product requirements.</p><p>Today, this architecture empowers us with the same &#x201C;power of choice&#x201D; across iOS as on Android &#x2014; the ability to develop and deploy features using the most suitable framework for each use case, whether it&#x2019;s SwiftUI or Flutter.</p><p>Some of the libraries that we depend on include: <a href="https://github.com/vmanot/Reactor?ref=blog.famapp.in">Reactor</a>, <a href="https://github.com/SwiftUIX/SwiftUIX?ref=blog.famapp.in">SwiiftUIX</a>, <a href="https://github.com/vmanot/Merge?ref=blog.famapp.in">Merge</a> &amp; <a href="https://github.com/vmanot/Swallow?ref=blog.famapp.in">Swallow</a></p><h3 id="%F0%9F%A7%B6-web-apps-pwa"><br>&#x1F9F6;<strong> Web Apps / PWA</strong></h3><p>Our <strong>Progressive Web App (</strong><a href="https://web.dev/progressive-web-apps/?ref=blog.famapp.in"><strong>PWA</strong></a><strong>)</strong> &#x2014; is the primary web layer of Fam, built with <strong>React</strong>, <strong>TypeScript</strong>, <strong>HTML</strong>, and <strong>CSS</strong>. It powers multiple sections of the app organised through modular routes for rapid iteration.</p><p>Designed for <strong>fast development and deployment</strong>, the PWA runs seamlessly as a <strong>web view inside both Android and iOS apps</strong>, combining the agility of the web with the reach of native platforms. This flexibility allows us to <strong>roll out updates instantly</strong>, significantly accelerating gamified feature delivery across the Fam ecosystem.</p><p>Deployed on <strong>Cloudflare Pages</strong>, it benefits from <strong>global edge delivery</strong>, <strong>automatic builds</strong>, and <strong>reliable CI/CD pipelines</strong>, ensuring a smooth, scalable, and high-performance user experience.</p><h3 id="%F0%9F%A7%A9-kotlin-multiplatform">&#x1F9E9;<strong>&#xA0;Kotlin Multiplatform</strong></h3><p>As Fam evolved, maintaining shared logic between Android, iOS apps became critical. Kotlin Multiplatform was adopted to unify our core business logic and reduce redundancy across platforms. Its adoption began with a specific feature where it encapsulates critical operations such as <strong>data handling</strong>, <strong>networking</strong>, <strong>caching</strong>, and <strong>business domain logic</strong>, and integrated seamlessly between Android and iOS apps. It relies on libraries like <a href="https://github.com/ktorio/ktor?ref=blog.famapp.in">Ktor</a> for network operations, <a href="https://github.com/Kotlin/kotlinx.serialization?ref=blog.famapp.in">Kotlinx Serialization</a> for data parsing &amp; others.</p><p>Going forward, our goal is to expand the KMP layer to include more platform-level use cases, enabling even greater code reuse, consistency, and development velocity across the Fam ecosystem.</p><h3 id="%F0%9F%90%A6-flutter">&#x1F426; <strong>Flutter</strong></h3><p>Fam&#x2019;s Flutter journey began as part of our effort to accelerate feature delivery and maintain a consistent user experience across platforms. Flutter was introduced to power select modules within the app that required rapid iteration, pixel-perfect UI, and cross-platform parity. Currently it powers important flows like entire KYC flow, Home Screen Tabs &amp; others.</p><p>We currently maintain a single codebase for all Flutter flows with parts running inside our native Android and iOS apps using separate flutter engines. We are managing multiple flutter engines inside our apps using <strong>flutter engine cache</strong> and <a href="https://docs.flutter.dev/add-to-app/multiple-flutters?ref=blog.famapp.in"><strong>engine grouping</strong></a>.</p><p>Our flutter codebase leverages popular libraries and frameworks such as <a href="https://pub.dev/packages/get?ref=blog.famapp.in">get</a> for state management &amp; dependency injection, <a href="https://pub.dev/packages/dio?ref=blog.famapp.in">dio</a> for networking, <a href="https://pub.dev/packages/cached_network_image?ref=blog.famapp.in">cached network image</a> &amp; <a href="https://pub.dev/packages/flutter_svg?ref=blog.famapp.in">flutter svg</a> for image loading.</p><h1 id="backend"><strong>Backend</strong></h1><h2 id="frameworks">Frameworks</h2><h3 id="%F0%9F%A5%83-gofiber-nethttp-go">&#x1F943;<strong> GoFiber &amp; net/http (Go)</strong></h3><p>Our backend services use both GoFiber and net/http, depending on the service requirements. Some services use GoFiber for its fast routing, lightweight API, and built-in middleware support, while others use Go&#x2019;s standard net/http package for its simplicity, robustness, and direct integration with the Go ecosystem. This flexibility allows us to choose the right framework for each service&#x2019;s performance and architectural needs.</p><h3 id="%E2%9A%99%EF%B8%8F-asynq-go"><strong>&#x2699;&#xFE0F; Asynq (Go)</strong></h3><p><a href="https://github.com/hibiken/asynq?ref=blog.famapp.in"><strong>Asynq</strong></a> is a simple, reliable, and efficient background task queue library built in Go. It enables distributed processing of asynchronous jobs with support for both real-time execution and scheduled task management. Asynq uses Valkey as its message broker, offering low-latency task dispatching and strong reliability guarantees.</p><p>We use Asynq to offload long-running or non-critical workloads &#x2014; such as notifications, data syncs, and background processing &#x2014; from our core request path, improving response times and system scalability. We deploy these workers on Kubernetes and with appropriate horizontal pod autoscaler (HPA) configurations our workers scale horizontally based on the backlog of tasks pending</p><h3 id="%F0%9F%94%AE-grpc">&#x1F52E;&#xA0;<strong>gRPC</strong></h3><p>We use <a href="https://grpc.io/?ref=blog.famapp.in">gRPC</a> for high-performance, language-agnostic communication between microservices. Built on top of HTTP/2, gRPC enables efficient request multiplexing, bidirectional streaming, and strongly typed interfaces defined through Protocol Buffers. This allows our services to communicate with low latency and minimal overhead while maintaining clear contracts and backward compatibility across service boundaries.</p><h3 id="%F0%9F%9B%A0%EF%B8%8F-temporal">&#x1F6E0;&#xFE0F;&#xA0;<strong>Temporal</strong></h3><p>We use <a href="https://temporal.io/?ref=blog.famapp.in">Temporal</a> for reliable task orchestration across distributed systems. Temporal allows us to define workflows as code, providing built-in reliability, state management, and automatic retries. This ensures that multi-step and long-running operations execute exactly once, even in the face of failures. By leveraging Temporal, we achieve guaranteed execution, simplified error handling, and greater resilience across our services.</p><h3 id="%F0%9F%97%BF-django-django-rest-framework">&#x1F5FF; <strong>Django + Django Rest Framework</strong></h3><p>Our first monolithic services were built in <strong>Python</strong> using <strong>Django</strong> and <strong>Django REST Framework (DRF)</strong>. Django is a high-level web framework that promotes rapid development and clean, pragmatic design &#x2014; it handles much of the heavy lifting so developers can focus on business logic instead of boilerplate. DRF, on the other hand, made it easy to build and serve complex JSON-based REST APIs for our frontend applications.</p><p>Most of our early user-facing services were written in Django, but as our scale grew, we began transitioning toward a <strong>microservices architecture</strong> &#x2014; gradually decomposing the monolith into smaller, domain-focused services written in <strong>Go</strong>, each optimized for its specific responsibility.</p><p>We&#x2019;re continuing this migration journey and will soon share our learnings from moving out of the monolith &#x2014; stay tuned for that upcoming blog!</p><h3 id="%F0%9F%93%9C-celery"><strong>&#x1F4DC; Celery</strong></h3><p><a href="https://docs.celeryproject.org/en/stable/?ref=blog.famapp.in">Celery</a> is a simple, flexible, and reliable distributed system to process vast amounts of messages while providing operations with the tools required to maintain such a system. It&#x2019;s a task queue with a focus on real-time processing, while also supporting task scheduling. Celery workers are also deployed on Kubernetes and with appropriate horizontal pod autoscaler (HPA) configurations our workers scale horizontally based on the backlog of tasks pending.</p><h1 id="databases"><strong>Databases</strong></h1><h3 id="%F0%9F%A6%A3-postgresql">&#x1F9A3; <strong>PostgreSQL</strong></h3><p>We have highly relational data so choosing RDBMS was an obvious choice, Django has really good ORM support for Postgres as well. We heavily rely on its transactional properties. We are using <a href="https://www.postgresql.org/?ref=blog.famapp.in">PostgreSQL</a> to store most of the data. It&apos;s deployed via AWS RDS - Postgres managed service.</p><h3 id="%F0%9F%AB%80-valkey">&#x1FAC0; <strong>Valkey</strong></h3><p>You may have heard of it as the in-memory key-value store, but Valkey is truly the Swiss Army knife of NoSQL databases. <a href="https://valkey.io/?ref=blog.famapp.in">Valkey</a> provides a rich set of data structures &#x2014; including strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams &#x2014; making it highly versatile for a wide range of use cases. It supports built-in replication, Lua scripting, LRU eviction, transactions, and multiple levels of on-disk persistence, while offering high availability through Sentinel and automatic partitioning via Cluster mode. We run Valkey in cluster mode using AWS ElastiCache, ensuring scalability, fault tolerance, and low-latency access across services.</p><h3 id="%F0%9F%A4%96-dynamodb"><strong>&#x1F916;</strong>&#xA0;<strong>DynamoDB</strong></h3><p>We use <a href="https://aws.amazon.com/dynamodb/?ref=blog.famapp.in">Amazon DynamoDB</a> as our NoSQL database for applications that require single-digit millisecond latency at any scale. It&#x2019;s a key-value and document database that delivers high performance with seamless scalability. DynamoDB enables <strong>Z-axis scaling</strong>, allowing us to horizontally partition data across multiple shards to handle massive workloads efficiently while maintaining low latency and high availability.</p><h3 id="%F0%9F%92%A1clickhouse">&#x1F4A1;<strong>Clickhouse</strong></h3><p>We use <a href="https://clickhouse.com/?ref=blog.famapp.in"><strong>ClickHouse</strong></a> as our high-performance analytical database across multiple domains. It powers our <strong>data warehousing</strong> workloads, supports our <strong>fraud and risk management engine</strong> for near real-time analysis, and stores <strong>HTTP access logs</strong> for request-level analytics and observability. Being <strong>self-hosted</strong>, our ClickHouse deployments give us fine-grained control over performance tuning, data retention, and resource allocation, enabling efficient large-scale data processing while maintaining operational flexibility.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/11/Frameworks-and-Libraries.jpg" class="kg-image" alt="The Story Behind Fam&apos;s Tech Stack&#x1F680;" loading="lazy" width="2000" height="2000" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/11/Frameworks-and-Libraries.jpg 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/11/Frameworks-and-Libraries.jpg 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/11/Frameworks-and-Libraries.jpg 1600w, https://blog.famapp.in/blog/content/images/2025/11/Frameworks-and-Libraries.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><h1 id="queues-messaging"><strong>Queues &amp; Messaging</strong></h1><p><br>We use multiple queues and messaging platforms to support service decoupling, scalability, and real-time event processing:</p><p><strong>&#x1F6D6;&#xA0;MSK (Managed Kafka)</strong><br>A managed Kafka service that powers our distributed messaging and high-throughput event pipelines. We use MSK extensively for event-driven communication between microservices.</p><p><strong>&#x1F6A1; WAL Queues</strong><br>We use Write-Ahead Log (WAL) queues in Postgres to guarantee reliable and exactly-once message delivery between services. Our open-source project, <a href="https://github.com/fampay-inc/factlib?ref=blog.famapp.in">Factlib</a> , provides a structured and fault-tolerant framework for producing events to Kafka using WAL semantics. It ensures that messages are durably persisted before being dispatched, enabling recovery and replay in case of service or network failures, and maintaining end-to-end delivery guarantees across our event-driven systems.</p><p><strong>&#x1F9C0; SNS</strong><br>Used for push-based notifications and alerting. It integrates with CloudWatch to send alerts to our internal alerting service, which escalates issues to the on-call team for rapid response.</p><h1 id="analytics"><strong>Analytics</strong></h1><h3 id="%F0%9F%A5%B7-metabase"><br><strong>&#x1F977; Metabase</strong></h3><p><a href="https://www.metabase.com/?ref=blog.famapp.in">Metabase</a> is the fastest, easiest way to share data and analytics inside your company. We can connect many DB sources and it creates beautiful graphs for us. It makes it easy for non-technical users to ask questions about data. Using its alert feature we get notified if something is wrong with the data or application. Like successful transactions rate or any failure with external services.</p><h3 id="%F0%9F%A4%A0-mixpanel"><strong>&#x1F920; Mixpanel</strong></h3><p><a href="https://mixpanel.com/?ref=blog.famapp.in">MixPanel</a> is a great product analytics tool to understand user behaviors, Segment integration with Mixpanel pushes data there.</p><h3 id="%F0%9F%8E%AF-clevertap"><strong>&#x1F3AF; CleverTap</strong></h3><p><a href="https://clevertap.com/?ref=blog.famapp.in">CleverTap</a> helps us craft contextual and personalized campaigns to engage our users through Push Notifications, In-app Messages, SMS, Web Push, Emails, WhatsApp, Facebook. It provides comprehensive campaign management and user journey analytics.</p><h3 id="%F0%9F%8E%A9-data-warehouse"><strong>&#x1F3A9;&#xA0;Data Warehouse</strong></h3><p>We operate multiple microservices, each with its own independent database. To enable centralized analytics and reporting, we built a data pipeline that continuously ingests data from these individual databases into our ClickHouse-powered data warehouse. We use a self-hosted deployment of the open-source project <a href="https://peerdb.io/?ref=blog.famapp.in">PeerDB</a> to capture Change Data Capture (CDC) events from all databases and stream them into ClickHouse in near real time. Internally, PeerDB reads Write-Ahead Logs (WAL) from source databases, stores the data in Amazon S3, and then ingests it into ClickHouse. The entire architecture is orchestrated using Temporal, ensuring reliability and fault tolerance throughout the pipeline.</p><p>The entire system is <strong>self-hosted</strong>, giving us full control over performance, scalability, and data governance.</p><p>We&#x2019;ll be publishing a detailed blog soon on how our data pipeline has evolved &#x2014; from initial prototypes to a fully self-hosted, scalable architecture.</p><h1 id="automation"><strong>Automation</strong></h1><h3 id="%F0%9F%A4%96-n8n">&#x1F916; <strong>N8N</strong></h3><p><a href="https://n8n.io/?ref=blog.famapp.in">n8n</a> is a fair-code licensed extendable workflow automation tool, you can automate all kinds of the mundane processes using this as we live in API world you can connect pretty much anything. For example, we use it to <strong>automate push notifications</strong> to customers when they <strong>win rewards</strong> or when there&#x2019;s a <strong>special campaign</strong>, such as a <strong>Diwali sale</strong>.</p><h3 id="%F0%9F%9B%A0%EF%B8%8F-appsmith"><strong>&#x1F6E0;&#xFE0F; Appsmith</strong></h3><p><a href="https://www.appsmith.com/?ref=blog.famapp.in">Appsmith</a> is our open-source alternative for building internal tools and admin panels. We use this for specific features that are not available in Metabase. We can set up webhooks here which helps in automation. This is also used internally by the customer support teams to make changes to user data as per customer&#x2019;s request.</p><h1 id="observability">Observability</h1><h3 id="%F0%9F%8E%A9-sentry">&#x1F3A9; <strong>Sentry</strong></h3><p><a href="https://sentry.io/?ref=blog.famapp.in">Sentry</a> helps us catch and fix those elusive, once-in-a-blue-moon bugs. It&#x2019;s an application monitoring and error-tracking platform that enables developers to diagnose, fix, and optimize application performance with deep context. We use a self-hosted deployment of Sentry running on Kubernetes, giving us complete control over data and integrations, though their SaaS offering is also available. In addition to error tracking, we leverage Sentry for distributed tracing, allowing us to monitor request flows across services and identify performance bottlenecks in real time.</p><h3 id="%F0%9F%93%8A-grafana-victoriametrics"><strong>&#x1F4CA; Grafana &amp; VictoriaMetrics</strong></h3><p>For metrics and observability, <a href="https://victoriametrics.com/?ref=blog.famapp.in">VictoriaMetrics</a> as our high-performance, Prometheus compatible time series database, and <a href="https://grafana.com/?ref=blog.famapp.in">Grafana</a> as our visualization layer. This stack allows us to monitor infrastructure health, visualise trends, and set up alerts for critical events.</p><h3 id="%F0%9F%93%94-logs">&#x1F4D4;&#xA0;<strong>Logs</strong></h3><p>We use <a href="https://grafana.com/oss/loki/?ref=blog.famapp.in">Loki</a> and Amazon <a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html?ref=blog.famapp.in">CloudWatch</a> for centralised log collection, viewing, and filtering across our services.</p><p>In addition, we ingest HTTP access logs from Cloudflare and various other providers into ClickHouse for analytical querying and long-term storage. This allows us to efficiently analyse traffic patterns, identify anomalies, and derive insights from large volumes of request data while keeping operational logging lightweight and real-time. This Clickhouse is self-hosted on an EC2. Checkout <a href="https://github.com/fampay-inc/logverse?ref=blog.famapp.in">Logverse</a> which enables us to ingest these logs into Clickhouse in a reliable way.</p><h1 id="infrastructure-platform">Infrastructure &amp; Platform</h1><h3 id="%F0%9F%92%87%F0%9F%8F%BC%E2%80%8D%E2%99%80%EF%B8%8F-github-actions"><strong>&#x1F487;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;  Github Actions</strong></h3><p>We use GitHub Actions to automate our CI/CD workflows, including build, test, and deployment pipelines. It enables consistent and reproducible automation across projects, helping us maintain high development velocity. Our <a href="https://forgejo.org/?ref=blog.famapp.in">Forgejo</a> setup is fully compatible with GitHub Actions, allowing us to run self-hosted runners and leverage the same workflow syntax for seamless integration between code hosting and continuous delivery.</p><h3 id="%F0%9F%90%B3-docker"><strong>&#x1F433;  Docker</strong></h3><p><a href="https://www.docker.com/?ref=blog.famapp.in">Docker</a> takes away repetitive, mundane configuration tasks and is used throughout the development lifecycle for fast, easy, and portable application development. Most of our codebase is containerized, allowing it to run anywhere.</p><h3 id="%F0%9F%9A%9F-aws-ecr">&#x1F69F;  <strong>AWS ECR</strong></h3><p><a href="https://aws.amazon.com/ecr/?ref=blog.famapp.in" rel="noopener noreferrer">Amazon Elastic Container Registry</a> (ECR) is a fully managed container registry that makes it easy to store, manage, share, and deploy our container images and artifacts anywhere. Since we use Docker, we needed a place to store private images so what could be better than ECR which tightly integrates with other AWS services.</p><h3 id="%E2%98%B8%EF%B8%8F-kubernetes">&#x2638;&#xFE0F; <strong>Kubernetes</strong></h3><p><a href="https://kubernetes.io/?ref=blog.famapp.in">Kubernetes</a> is our choice for orchestrating containerized workloads and services. With its declarative configuration and automation capabilities, Kubernetes simplifies deployment, scaling, and management of our microservices architecture. We utilize features such as namespaces, config maps, secrets, and horizontal pod autoscaling to ensure resilience and operational efficiency. Our environments run on managed Kubernetes services for easier upgrades, monitoring, and integration with AWS resources.</p><h3 id="%F0%9F%AA%83-amazon-elastic-beanstalk">&#x1FA83;  <strong>Amazon Elastic Beanstalk</strong></h3><p><a href="https://aws.amazon.com/elasticbeanstalk/?ref=blog.famapp.in" rel="noopener noreferrer">AWS Elastic Beanstalk</a> is an easy-to-use service for deploying and scaling web applications and services developed with Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker on familiar servers such as Apache, Nginx, Passenger, and IIS. All of our core services are containerised and deployed using Beanstalk.</p><h3 id="%F0%9F%A6%89-nginx">&#x1F989; <strong> Nginx</strong></h3><p><a href="https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/?ref=blog.famapp.in" rel="noopener noreferrer">Nginx</a> is a high-performance web server that can also be used as a reverse proxy, load balancer, mail proxy, and HTTP cache. We mainly use it as a reverse proxy in front of open source projects, next server, python WSGI server. It handles SSL and sending responses to the clients.</p><h3 id="%F0%9F%AA%99-gunicorn">&#x1FA99; <strong>Gunicorn</strong></h3><p>Gunicorn &apos;Green Unicorn&apos; is a Python WSGI HTTP Server for UNIX. It&apos;s a pre-fork worker model. We observed that most of our traffic is IO bound so we changed its worker pool to gevent and monkey patched psycopg.</p><h3 id="%F0%9F%8C%90-envoy-gateway">&#x1F310; <strong>Envoy Gateway</strong></h3><p><a href="https://www.envoyproxy.io/?ref=blog.famapp.in"><strong>Envoy Gateway</strong></a> serves as our modern reverse proxy and load balancer, simplifying the deployment and management of microservices. It plays a key role in setting up isolated <strong>development environments</strong>, enabling each feature branch to be independently tested by developers and QA teams as part of our <strong>Git Flow</strong> process. Envoy also performs <strong>authentication and authorisation checks</strong> at the initial stage of the request lifecycle, ensuring only validated requests reach downstream services. We also are able to maintain route and user level rate limiting so that our APIs don&#x2019;t endure abuse from attackers.</p><h3 id="%E2%98%81%EF%B8%8F-cloudflare">&#x2601;&#xFE0F;&#xA0;<strong>Cloudflare</strong></h3><p>We use <strong>Cloudflare</strong> as our primary DNS management and security platform, leveraging its built-in <strong>WAF</strong> and <strong>DDoS protection</strong> to safeguard our infrastructure. Several Cloudflare products play a key role in our stack:</p><ul><li><strong>Cloudflare Pages:</strong> Hosts our React-based web applications and websites. It removes the overhead of managing deployments while providing built-in CI/CD pipelines for fast and reliable releases.</li><li><strong>Cloudflare R2:</strong> Serves as our CDN-backed object storage for media assets &#x2014; including button images, website visuals, and other static content.</li><li><strong>Cloudflare DNS:</strong> Handles all DNS management and routing for our domains.</li><li><strong>Cloudflare WAF &amp; DDoS Protection:</strong> Monitors traffic patterns, blocks malicious activity, and provides detailed security analytics and reports.</li></ul><h3 id="%F0%9F%8D%80-pulumi">&#x1F340; <strong>Pulumi</strong></h3><p><a href="https://www.pulumi.com/?ref=blog.famapp.in">Pulumi</a> helps adopt infrastructure as code automation, combined with tried and true software engineering practices. One of the projects we are working on is to create a data pipeline and data warehouse. We are leveraging this to create and destroy AWS infrastructure.</p><h3 id="%F0%9F%91%8B-k6">&#x1F44B;<strong> k6</strong></h3><p><a href="https://k6.io/?ref=blog.famapp.in">k6</a> is our modern load testing tool that sends load to web applications and provides comprehensive performance metrics and latency distribution summaries. It&apos;s developer-centric and provides excellent insights into application performance.</p><h1 id="deployment"><strong>Deployment</strong></h1><p>Our deployment workflow is built around a common foundation &#x2014; we build Docker images, push them to <strong>Amazon ECR</strong>, and then deploy them across environments using simple, automated scripts.</p><p>For AWS Elastic Beanstalk applications, deployments are executed via the AWS CLI, while for Kubernetes-based services, we trigger ArgoCD to handle the rollout and synchronization. Both processes are automated and abstracted behind a web interface powered by <a href="https://github.com/bugy/script-server?ref=blog.famapp.in">Script Server</a> , allowing developers to trigger deployments for their respective services with a single click.</p><p>This setup provides a unified, low-friction deployment experience across environments, while maintaining safety, consistency, and operational control.</p><h1 id="oss">OSS</h1><h3 id="%F0%9F%91%BB-ghost">&#x1F47B;<strong> Ghost</strong></h3><p><a href="https://ghost.org/?ref=blog.famapp.in">Ghost</a> is designed for ambitious, professional publishers who want to actively build a business around their content. We use it for publishing blogs and sending newsletters to subscribers. There are built-in XML sitemaps, Google AMP pages, canonical tags, optimised URLs, Facebook Open Graph tags, support for Twitter cards and clean semantic markup for better SEO. Ghost is really fast, you can get &gt;95% score on google page speed easily. We have self-hosted this on EC2.</p><h3 id="%F0%9F%91%BE-oauth2-proxy">&#x1F47E;<strong> OAuth2-Proxy</strong></h3><p>A reverse proxy and static file server that provides authentication using Providers (Google, GitHub, and others) to validate accounts by email, domain, or group. <a href="https://github.com/oauth2-proxy/oauth2-proxy?ref=blog.famapp.in">OAuth2</a> proxy adds an authentication layer in between for projects like ListMonk and N8N</p><h3 id="%F0%9F%93%AE-postal">&#x1F4EE;&#xA0;<strong>Postal</strong></h3><p>We use <a href="https://github.com/postalserver/postal?ref=blog.famapp.in">Postal</a> as our self-hosted mail server for sending and managing transactional and system emails. Postal provides full control over email delivery, routing, tracking, and bounce handling, allowing us to maintain high deliverability without relying on third-party email providers. By self-hosting Postal, we gain flexibility in configuration, better cost efficiency, and the ability to tightly integrate email workflows with our internal systems.</p><h3 id="%F0%9F%A6%85-netbird"><strong>&#x1F985;&#xA0;Netbird</strong></h3><p>We use <a href="https://netbird.io/?ref=blog.famapp.in">NetBird</a> as our self-hosted, zero-trust networking solution to securely connect infrastructure and services across environments. NetBird simplifies private network management by creating an encrypted peer-to-peer mesh overlay using WireGuard, enabling seamless and secure access between cloud resources, on-prem systems, and developer machines without relying on traditional VPN setups. This setup enhances security, reduces operational overhead, and provides fine-grained access control through identity-based policies.</p><h3 id="%F0%9F%A7%8A-sonarqube"><strong>&#x1F9CA;&#xA0;SonarQube</strong></h3><p>We use <a href="https://www.sonarqube.org/?ref=blog.famapp.in">SonarQube</a> as our self-hosted platform for continuous code quality and security analysis. It helps us maintain clean, reliable, and maintainable code by automatically scanning repositories for bugs, vulnerabilities, and code smells during the CI/CD process. SonarQube enforces consistent coding standards across teams, provides detailed quality metrics, and integrates seamlessly with our development workflow to ensure that code meets our quality gates before being deployed.</p><h3 id="%F0%9F%93%93-forgejo"><strong>&#x1F4D3;&#xA0;Forgejo</strong></h3><p>We use <a href="https://forgejo.org/?ref=blog.famapp.in">Forgejo</a> as our self-hosted Git service for managing source code, pull requests, and CI/CD pipelines. Forgejo provides a lightweight, reliable, and privacy-focused alternative to cloud-based Git platforms, giving us full control over our repositories and development workflows. It integrates seamlessly with our automation tools and internal systems, enabling secure collaboration, efficient code reviews, and streamlined deployment processes across teams.</p><h2 id="conclusion">Conclusion</h2><p>There are some key takeaways that the core team has realized through the journey:</p><ul><li>Choose a tech stack that you are most comfortable with.</li><li>Picking the right tool for the right job is equally important.</li><li>If you are facing a problem there is a good chance that an open-source solution exists for it.</li><li>Go with the solution that works now and easily modifiable when required. We like to keep things simple.</li><li>Automate business processes and repeating workflows.</li><li>Consult with an expert when in doubt.</li></ul><p>Keeping these things in mind will help you lay a solid and thoughtful foundation when you begin developing a project. It only makes things easier if critical thinking and decision-making have been done beforehand when choosing from the plethora of options available. However, in the end, experimentation and dynamism is key to arranging your tech stack.</p><p><em>Found this article interesting and want to share your insights? Drop in an email at </em><a href="mailto:tech@fampay.in"><em>tech@fampay.in</em></a><em>!</em></p>]]></content:encoded></item><item><title><![CDATA[Building a 50ms Home Feed — Part 2: Implementation]]></title><description><![CDATA[In this part, we explain how we built Homelander and turned our design into a production system—making the home feed fast, efficient, and consistently responsive.]]></description><link>https://blog.famapp.in/blog/rebuilding-the-home-feed-how-homelander-learned-to-respond-in-50ms-part-2/</link><guid isPermaLink="false">6952cfe2213fc30001c56848</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Raghav Sharma]]></dc:creator><pubDate>Fri, 02 Jan 2026 12:41:48 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2026/01/11.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2026/01/11.png" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation"><p><strong>From Design to Code: Building Homelander</strong></p><p>The plan was ready; now it was time to build. This part covers how we implemented Homelander&#x2014;rewriting core logic in Go, optimising database access, and rolling out the ETag and CDC systems that made the 50 ms home feed possible.</p><h2 id="target-implementation">Target Implementation</h2><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-4.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="2000" height="933" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-4.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/image-4.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/12/image-4.png 1600w, https://blog.famapp.in/blog/content/images/2025/12/image-4.png 2250w" sizes="(min-width: 720px) 720px"></figure><p>As our system continued to scale, we realised that our existing Django-based architecture was no longer meeting performance demands&#x2014;especially for the highly dynamic home screen rendering process. To address these challenges, we built a new Golang service called Homelander, which directly accesses the monolith&#x2019;s database while focusing only on the specific tables required to render Home.</p><p>Yes&#x2014;by traditional service boundary standards, this was a <strong>design violation</strong>. Homelander directly querying another service&#x2019;s database is generally discouraged, as it couples two systems at the data layer. However, in our context, this trade-off was <strong>intentional and pragmatic</strong>. The home feed&#x2019;s performance needs were extreme, and duplicating or syncing data through additional APIs or event pipelines would have added unacceptable latency and operational overhead. By carefully scoping Homelander&#x2019;s access to <strong>read-only queries</strong> on a <strong>well-defined subset of tables</strong>, we preserved data consistency while unlocking the performance required to meet our sub-50 ms goal.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2025/12/download--3-.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="700" height="449" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/download--3-.png 600w, https://blog.famapp.in/blog/content/images/2025/12/download--3-.png 700w"><figcaption><span style="white-space: pre-wrap;">Service boundaries are more like&#x2026;guidelines &#x1F937;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;</span></figcaption></figure><h3 id="rewriting-logic-from-django-to-go">Rewriting Logic from Django to Go</h3><p>We decided to migrate the core logic from Django to Golang for several reasons:</p><p><strong>Improved Concurrency Handling</strong>:</p><p>We utilized <a href="https://victoriametrics.com/blog/go-singleflight/?ref=blog.famapp.in" rel="noopener noreferrer">singleflight</a> to handle concurrent API requests that require the same database query. This significantly reduced the number of duplicate calls hitting our database.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/download--1-.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="544" height="500"></figure><p><strong>Controlled Database Access</strong>:</p><p>By using <a href="https://pkg.go.dev/github.com/jackc/pgx/v5?ref=blog.famapp.in" rel="noreferrer"><strong>pgx v5</strong></a> directly (instead of an ORM or generic <code>SELECT *</code> queries), we gained tight control over query execution. It also allowed us to map database rows <strong>directly into Go structs</strong>, avoiding redundant memory copies that occur in ORM layers.</p><p><strong>In-Memory Context Store</strong>:</p><p>We built an in-memory store that attaches both <strong>user</strong> and <strong>common</strong> data to the request context. Once a piece of data is fetched from the database, it&#x2019;s cached within the same request lifecycle to avoid redundant lookups &#x2014; for example, when multiple downstream calls require the same user record. This eliminates one class of <strong>N+1 query issues</strong>, particularly those caused by repeated access to identical objects. However, it doesn&#x2019;t replace the need for <strong>explicit prefetching or batched queries</strong> when fetching related entities (e.g., fetching all users linked to a set of payments).</p><p><strong>Performance Boost</strong>:</p><p>Golang&#x2019;s concurrency model and lower overhead (compared to Python/Django) naturally delivered faster response times.</p><h3 id="validating-the-new-service">Validating the New Service</h3><p>Before fully switching to Homelander, we ran extensive tests to ensure the service was functionally equivalent to the old system:</p><ul><li><strong>Limited Rollout</strong>: We initially released Homelander to a small percentage of users to verify its behavior in a production environment. We made use of cloudflare DNS which helped in rewriting the hostname to homelander&#x2019;s URL that way without any app update we were able to understand if the APIs were backward compatible and worked properly with the existing app builds.</li><li><strong>Parity Checks</strong>: Over the course of a day, we compared Homelander&#x2019;s responses to those from the Django service for 500,000 users. This helped us confirm that both systems produced identical results for real-world scenarios.</li></ul><p>After confirming business logic parity, we rolled out Homelander to all users at full scale. The results were immediately impressive:</p><ul><li><strong>p90 Server-Side Latency of ~49 ms</strong>: A major improvement over the previous 2&#x2013;4 second response times. This figure reflects <strong>backend processing time</strong>, not end-to-end user-perceived latency, which can vary based on network conditions and client-side rendering.</li><li><strong>Reduced Load</strong>: Singleflight and in-flight caching dramatically cut the volume of redundant database queries.</li><li>With this our monolith service (Westeros) also needed less EC2s to host the servers and the buffer of resource limits increased for redis and postgres both.</li></ul><h3 id="implementing-the-etag-system">Implementing the ETag System</h3><p>Following Homelander&#x2019;s successful launch, the final Etag logic has to be implemented:</p><ol><li><strong>ETag Generation</strong>:<ul><li>On each request if we do not get the ETag from the client, the server generates an ETag which is actually a ULID</li><li>We added a new header key: <code>Accept-Etag</code> if this is sent with true by the client then only homelander will attach an etag and return the tag as well. This helps us roll it out in a controlled manner and understand if system is working as intended.</li></ul></li><li><strong>Time-Based Invalidation</strong>:<ul><li>For any time-based invalidation vectors, if the remaining time is less than 24 hours, we reduce the overall ETag&#x2019;s TTL accordingly.</li><li>This ensures that time-sensitive data doesn&#x2019;t remain cached beyond its validity window.</li></ul></li><li><strong>Caching the ETag and Invalidation Vectors</strong>:<ul><li>At the end of request processing, we store the ETag with a list of its invalidation vectors.</li><li>Each invalidation vector is cached individually, initially set to a value of <strong>0</strong> (representing a &#x201C;valid&#x201D; state).</li></ul></li></ol><h3 id="implementation-of-wal-consumer">Implementation of WAL consumer</h3><p>To keep the ETag cache accurate, we rely on <strong>PostgreSQL&#x2019;s Write-Ahead Log (WAL)</strong> for Change Data Capture (CDC). A separate WAL consumer service processes these logs and updates invalidation vectors:</p><ol><li><strong>Detecting Changes</strong>:<ul><li>The WAL consumer listens for changes to tables that affect or represent invalidation vectors.</li><li>When it detects an update or insert that invalidates a particular vector (e.g., a user&#x2019;s KYC status changes), it sets the vector&#x2019;s cached value to the current timestamp.</li><li>We built our custom WAL consumer using the <a href="https://github.com/jackc/pglogrepl?ref=blog.famapp.in">pglogrepl</a> library, taking inspiration from <a href="https://github.com/PeerDB-io/peerdb?ref=blog.famapp.in">PeerDB</a> &#x2019;s approach to streaming data pipelines. Over time, we also developed our own lightweight library <a href="https://github.com/fampay-inc/wal-e?ref=blog.famapp.in">wal-e</a>, to simplify WAL consumption and make integration easier across services.</li></ul></li><li><strong>Checking ETag Validity</strong>:<ul><li>On subsequent requests, Homelander compares the timestamp in the ETag&#x2019;s ULID against the updated timestamp of the invalidation vector.</li><li>If the vector&#x2019;s timestamp is <strong>greater</strong> than the ETag&#x2019;s, it indicates the data is stale, and Homelander re-renders the response and issues a new ETag.</li><li>If it is <strong>not</strong> greater, the system returns <strong>304 Not Modified</strong>, allowing the client to use its cached content.</li></ul></li></ol><p>Lets take an example of how this logic would work in its entirety:</p><ul><li><strong>Request Initiation:</strong>A user with ID <code>1</code> sends a request to <strong>Homelander</strong> to render their home screen.</li><li><strong>Rendering and Vector Collection:</strong>Homelander begins rendering the home page, applying various filters and logic to decide which cards should be shown to the user. During this process, it collects all the <strong>invalidation vectors</strong> involved in those decisions (for example, user attributes, feature flags, or campaign configurations).</li><li><strong>Vector Registration in Redis:</strong>Once rendering is complete, Homelander registers each collected vector in <strong>Redis</strong> using <code>SETNX</code>.<ul><li>If a vector doesn&#x2019;t exist, it is created with an initial <strong>value of <code>0</code></strong> (indicating a valid state).</li></ul></li><li><strong>ETag Generation:</strong>Homelander then generates a unique <strong>ETag</strong> (a ULID) for this rendered response and stores it in Redis along with the list of associated vectors.<ul><li>The ETag&#x2019;s <strong>TTL</strong> is set to the <strong>minimum TTL</strong> among its vectors to ensure consistency.</li></ul></li><li><strong>Change Detection via WAL:</strong>When any relevant change occurs in the database (for example, a user&#x2019;s record or card configuration is updated), the <strong>WAL consumer</strong> detects it and updates the corresponding vector&#x2019;s value in Redis to the latest <code>date_modified</code> timestamp.</li><li><strong>Subsequent Request Handling:</strong>When a subsequent request arrives with an existing ETag:<ul><li>Homelander first checks if the ETag exists in the cache. If not, it re-renders the page and generates a new one.</li><li>If the ETag is found, it retrieves all associated vectors.</li><li>If <strong>any vector&#x2019;s timestamp is greater</strong> than the one associated with the ETag, the ETag is considered <strong>invalid</strong>, and the response is re-rendered. Otherwise, the cached version is returned with a <strong>304 Not Modified</strong> response.</li></ul></li></ul><p><strong>Visualisation:</strong></p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-5.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="986" height="1678" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-5.png 600w, https://blog.famapp.in/blog/content/images/2025/12/image-5.png 986w" sizes="(min-width: 720px) 720px"></figure><h3 id="%E2%9A%A1%EF%B8%8F-measuring-the-impact-from-optimised-200s-to-near-instant-304s"><strong>&#x26A1;&#xFE0F; Measuring the Impact: From Optimised 200s to Near-Instant 304s</strong></h3><p>These metrics represent <strong>200 OK responses</strong>, where the home feed is fully recomputed and rendered on the server. Despite executing the complete rendering pipeline, p95 latency consistently stays under ~50 ms, reflecting the efficiency gains from Homelander&#x2019;s architecture and query optimisations.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-6.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="2000" height="350" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-6.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/image-6.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/12/image-6.png 1600w, https://blog.famapp.in/blog/content/images/size/w2400/2025/12/image-6.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">200 HTTP status code metrics</span></figcaption></figure><p>These metrics show <strong>304 Not Modified</strong> responses, where the server validates the request using ETags and instructs the client to reuse its cached home feed. Since no re-rendering is required, this path avoids almost all computation, resulting in p95 latencies under ~5 ms. Additionally, because the client already has a cached response, the app can render the home feed almost instantly on startup. If any changes are detected, the feed is re-rendered making the overall experience feel significantly more responsive and snappy.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-7.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 2: Implementation" loading="lazy" width="2000" height="301" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-7.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/image-7.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/12/image-7.png 1600w, https://blog.famapp.in/blog/content/images/size/w2400/2025/12/image-7.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">304 HTTP status code metrics</span></figcaption></figure><h3 id="%F0%9F%9A%80-wrapping-up">&#x1F680; Wrapping Up</h3><p>With Homelander, we transformed one of the most performance-critical parts of our app&#x2014;its home feed&#x2014;into a lightning-fast, scalable, and resilient system. By combining architectural shifts, smart caching using ETags, and CDC-based invalidation via PostgreSQL WAL logs, we reduced load times from several seconds to under 50ms.</p><p>Our approach ensured that flexibility wasn&apos;t sacrificed for speed. Product teams can still iterate freely, while engineering benefits from a lean, efficient backend.</p><p>In the coming weeks, we&#x2019;ll be rolling out the ETag strategy to our clients and sharing performance insights from that launch&#x2014;stay tuned for those updates!</p><hr><h3 id="%F0%9F%94%AE-what%E2%80%99s-next">&#x1F52E; What&#x2019;s Next?</h3><p>The home screen is just the beginning. Rendering it involves fetching multiple pieces of data from the backend to display up-to-date information to users. Currently, many of these supporting APIs are outside the Homelander service.</p><p>Looking ahead, we plan to gradually migrate all such APIs to Homelander and power them with the ETag caching model. This will allow us to avoid repeated data fetches and further streamline our infrastructure&#x2014;pushing us closer to a consistently fast and efficient user experience across the board.</p><p>We also plan to <strong>evolve the ETag mechanism</strong> itself. Today, it operates in an &#x201C;all-or-nothing&#x201D; mode&#x2014;any change invalidates the entire response. Our next goal is to enable <strong>partial cache reuse</strong>, where unchanged sections of the response continue to be served from cache, and only modified components are re-rendered.</p><h3 id="%F0%9F%93%9D-acknowledgements"><strong>&#x1F4DD; Acknowledgements</strong></h3><p>This work wouldn&#x2019;t have been possible without the contributions of a few people who played a pivotal role in shaping Homelander.</p><p><a href="https://www.linkedin.com/in/rev01t/?ref=blog.famapp.in" rel="noreferrer"><strong>Amarender Singh</strong></a> laid the foundation for this project and helped take it from idea to reality. He set a high bar for how Go services should be designed and written within the company, and his emphasis on clean, elegant engineering motivated the rest of us to build the system the right way.</p><p><a href="https://www.linkedin.com/in/pratik-gajjar/?ref=blog.famapp.in" rel="noreferrer"><strong>Pratik Gajjar</strong></a> brought deep design clarity to the project. His fundamental thinking around caching and invalidation led to the ETag-based approach that became central to the system, and his ability to simplify complex problems was instrumental in making the architecture both robust and efficient.</p>]]></content:encoded></item><item><title><![CDATA[Building a 50ms Home Feed — Part 1: Design]]></title><description><![CDATA[As Famapp scaled to millions of users, our home feed became a major bottleneck, with p95 latencies hitting 2–4 seconds. In this post, we share how we redesigned the home feed architecture to balance deep personalisation with speed and set the foundation for sub-50ms responses.]]></description><link>https://blog.famapp.in/blog/building-a-50-ms-home-feed-part-1-design/</link><guid isPermaLink="false">6952cd08213fc30001c56823</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Raghav Sharma]]></dc:creator><pubDate>Fri, 02 Jan 2026 10:29:08 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2026/01/10--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2026/01/10--1-.png" alt="Building a 50ms Home Feed &#x2014; Part 1: Design"><p><strong>Designing the 50 ms Home Feed</strong></p><p>As Famapp&apos;s user base expanded to over 7 million monthly transacting users, we began to encounter significant performance bottlenecks in our infrastructure. These issues became particularly apparent during evening usage surges and UPI ecosystem degradations, when increased app reloads would cause traffic to spike uncontrollably.</p><p>The most resource-intensive component of our system was the home feed API&#x2014;the critical API responsible for loading the app&apos;s first screen. This API was designed with maximum flexibility in mind, dynamically rendering different UI elements based on user segments. iOS users might see Apple Store codes while Android users would receive Google Play recharge options. High-spending users could receive subscription nudges while others wouldn&apos;t.</p><p>Furthermore, our home screen was designed to be highly responsive to user behaviour, potentially refreshing its elements after each user action. For every app open, our system would:</p><ol><li>Check the user&apos;s current state</li><li>Fetch all possible UI elements</li><li>Determine which elements to display</li></ol><p>This approach served us well in Famapp&apos;s early stages, but as we scaled, our monolithic Django service began showing signs of strain. Most concerning was the home screen&apos;s loading time, which had reached an unacceptable p95 latency 2-4 seconds&#x2014;creating a poor first impression for users expecting a fluid transactional experience.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2025/12/0_ZjYSm_q36J4KChdn.jpg" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="1485" height="1047" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/0_ZjYSm_q36J4KChdn.jpg 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/0_ZjYSm_q36J4KChdn.jpg 1000w, https://blog.famapp.in/blog/content/images/2025/12/0_ZjYSm_q36J4KChdn.jpg 1485w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">When your home feed takes 4 seconds but users reload 10 times because of failures in UPI</span></figcaption></figure><p>The key reasons why these latencies were very high:</p><ul><li>Every request rebuilt the entire home page from scratch, repeating the same database queries and filtering logic even when nothing had changed.</li><li>Django&#x2019;s ORM, while convenient early on, introduced hidden <em>n+1</em> query patterns that inflated network latency.</li><li>And since our monolith also handled mission-critical flows like payments, these redundant rendering requests were eating into CPU time meant for golden paths.</li></ul><p>After analysing these challenges, we established two key objectives for our solution:</p><ul><li>Reduce home screen loading time from 2-4 seconds to under 50ms</li><li>Preserve our product team&apos;s ability to dynamically modify UI elements without technical constraints</li></ul><p>This is the story of how we redesigned our system to meet these ambitious goals while maintaining the flexibility our product team relied on.</p><h2 id="why-why-50ms">Why? Why 50ms?</h2><p>We set the 50 ms target based on established responsiveness benchmarks. Human perception studies show that interactions completing within 100 ms feel instantaneous, while delays beyond 300 ms start to feel sluggish, and anything over 1 second breaks the user&#x2019;s sense of flow. Since the home feed is the first screen users see, we aimed for sub-perceptual latency&#x2014;ensuring it loads faster than users can consciously notice.</p><h2 id="how">How?</h2><p>Working with our talented engineering team (yeah the same best minds who are working on it &#x1F605;), we conducted a thorough analysis of our existing system challenges:</p><ol><li><strong>Redundant Calculation Overhead</strong>: Our home screen rendering process recalculated display elements on every request, evaluating user cohorts, recent activities, wallet balances, and other parameters. We discovered that many of these calculations were unnecessary, as users frequently refreshed without any meaningful state changes occurring.</li><li><strong>Cascading Failure Patterns</strong>: During payment infrastructure degradations, we observed a problematic feedback loop: users would repeatedly reload the app when transactions appeared to stall, triggering a surge of redundant home screen calculations. This pattern created resource contention precisely when our system needed to prioritise processing critical payment flows.</li></ol><p>These findings highlighted how our rendering approach not only consumed excessive resources during normal operation but also exacerbated system strain during partial outages&#x2014;effectively creating an avalanche effect in the system</p><p>After thorough assessment, we determined that our customisable rendering system remained conceptually sound, but required significant efficiency improvements. We developed a comprehensive strategy targeting key performance bottlenecks:</p><ul><li><strong>Caching Card Configurations</strong>: Implemented caching on client side to eliminate repeated database calls to get the same data. If the client has the home feed and there is no change in the response then no extra database calls! Problem solved!</li><li><strong>Request Consolidation</strong>: Introduced a mechanism so that concurrent requests for identical card configurations would trigger only a single database operation with shared results.</li><li><strong>Eliminating N+1 Query Patterns</strong>: Refactored our code to prevent hidden database calls caused by Django&apos;s ORM in our object-oriented architecture. We implemented request-level caching to ensure any resource fetched once would be reused throughout the request lifecycle.</li><li><strong>Architectural Shift</strong>: Began migrating from our monolithic Django service to a lightweight Golang implementation with direct SQL queries instead of ORM, reducing overhead and improving response times. Independent <a href="https://www.techempower.com/benchmarks/?ref=blog.famapp.in#section=data-r23"><strong>TechEmpower benchmark</strong></a> results have shown that optimized Go services consistently outperform the fastest Django setups&#x2014;typically delivering <strong>5&#x2013;10&#xD7; higher request throughput</strong> and <strong>2&#x2013;4&#xD7; lower p95 latency</strong> under equivalent load. In our case, using Go&#x2019;s native <code>pgx</code> driver, strict type system, and efficient JSON serialisation reduced memory allocations and parsing overhead, resulting in a leaner and faster service.</li></ul><p>This multi-pronged approach allowed us to address performance bottlenecks at each layer of our stack while maintaining the flexibility our product team required.</p><h2 id="home-screen-architecture">Home Screen Architecture</h2><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="1734" height="1384" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/image.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/12/image.png 1600w, https://blog.famapp.in/blog/content/images/2025/12/image.png 1734w" sizes="(min-width: 720px) 720px"></figure><p>Our home screen follows a hierarchical structure designed for maximum flexibility and personalisation:</p><ol><li><strong>Primary Home Section</strong>: The main container that encompasses all interactive elements visible to the user upon app launch.</li><li><strong>Contextual Groups</strong>: Within the primary section, content is organised into logical groups based on functionality or user relevance (e.g., &quot;For you section&#x201D;, &#x201C;Quick actions&#x201D; etc.)</li><li><strong>Contextual Cards</strong>: Each group contains individual cards that serve as the atomic units of our interface. These cards dynamically display:<ul><li>Customised imagery tailored to user preferences</li><li>Personalised text reflecting the user&apos;s current state</li><li>Interactive elements that adapt based on usage patterns and eligibility</li></ul></li></ol><p>This nested structure allows our product team to precisely target content delivery at multiple levels, ensuring each user receives a home screen optimised for their specific context and needs.</p><h2 id="why-so-dynamic-why-a-backend-driven-architecture">Why so dynamic? Why a backend driven architecture?</h2><p>Our home feed is entirely <strong>backend-driven</strong>, allowing the product team to dynamically control what each user sees without requiring app releases. Every card&#x2019;s content, layout, and eligibility logic are generated on the server based on real-time user attributes&#x2014;such as transaction history, verification status, and feature access. This design enables us to experiment rapidly, run targeted campaigns, respond instantly to ecosystem changes and most importantly provide a personalised experience to our users.</p><h2 id="balancing-dynamism-and-performance">Balancing Dynamism and Performance</h2><p>Our challenge was clear &#x2014; we couldn&#x2019;t compromise on the flexibility that made the home feed valuable, yet we needed to bring its performance closer to that of a static page. A fully cached or precomputed home feed would have been extremely fast, but it would also strip away the personalisation that defines the product experience. On the other hand, fully dynamic rendering ensured contextual relevance but came with significant computational cost.</p><p>We needed an approach that could <strong>retain the home feed&#x2019;s dynamism while avoiding redundant recomputation</strong>.</p><p>The key insight was that not every user attribute changes frequently. If we could identify exactly <em>which variables</em> a home screen depends on &#x2014; and determine <em>when</em> those variables last changed &#x2014; we could safely reuse previously rendered results instead of recalculating everything from scratch.</p><p>We also realised that the home screen didn&#x2019;t need to be real-time to the millisecond. Allowing a <strong>small relaxation window of around one second</strong> would still feel instantaneous to users while drastically reducing backend load.</p><p>This thought process led us to design a <strong>conditional caching mechanism</strong>, where responses could be reused as long as none of their dependent variables had changed. That reasoning ultimately formed the foundation for our <strong>ETag-based caching system</strong> &#x2014; a way to preserve full dynamism while achieving near-static response times.</p><hr><hr><h2 id="implementing-etag-based-caching"><strong>Implementing ETag-Based Caching</strong></h2><p>We adopted an ETag-based caching strategy inspired by frontend systems and applied the principle of disaggregation&#x2014;keeping heavy home-feed computation out of the request path. With ETags, the server does minimal work unless data changes, because <em>the fastest operation is the one you don&#x2019;t do</em>.</p><h3 id="what-is-etag"><strong>What is Etag?</strong></h3><p>An <strong>ETag (Entity Tag)</strong> serves as a <strong>fingerprint</strong> for an API response, uniquely identifying its current version. When the underlying data changes, the ETag changes too, helping the client know whether it can safely reuse cached data or needs to fetch fresh content</p><h3 id="fundamental-working"><strong>Fundamental Working</strong></h3><ul><li><strong>Server generates an ETag</strong> for a response (usually a hash of the content).</li><li><strong>Client caches</strong> the response along with the ETag.</li><li>On the next request, the <strong>client sends the ETag</strong> in the <code>If-None-Match</code> header.</li><li>The <strong>server compares</strong> the client&apos;s ETag with the latest version:<ul><li>If <strong>unchanged</strong>, server replies with <strong>304 Not Modified</strong> (no data transfer needed).</li><li>If <strong>changed</strong>, server sends the new data with a new ETag.</li></ul></li></ul><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/download-1.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="424" height="475"></figure><p>This pattern significantly reduces server load by eliminating unnecessary rendering and data transfer when a user&apos;s state remains unchanged between requests. The approach is particularly effective during system degradations when users frequently reload the app, as it converts potentially resource-intensive rendering operations into lightweight validation checks.</p><p>After deciding on an ETag-based caching strategy, we faced a critical implementation question: <em>how could we efficiently determine when cached content should be invalidated?</em></p><h2 id="the-invalidation-vector-approach">The Invalidation Vector Approach</h2><p>We developed a system based on &quot;<strong>invalidation vectors</strong>&quot; - specialised data structures that represent specific conditions under which a cached response becomes invalid. The elegance of this approach lies in its precision:</p><p>A visual representation:</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-1.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="2000" height="1200" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-1.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2025/12/image-1.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2025/12/image-1.png 1600w, https://blog.famapp.in/blog/content/images/2025/12/image-1.png 2000w" sizes="(min-width: 720px) 720px"></figure><p><strong>What is a vector?</strong></p><p>A <strong>vector</strong> is a lightweight data structure that tracks the validity of a cached response. Each vector stores:</p><ul><li><strong>Key &#x2192;</strong> A unique identifier (e.g., user ID, home contextual card ID).</li><li><strong>Value &#x2192;</strong> A timestamp derived from the <code>date_modified</code> column in our database. If this timestamp is <strong>greater than</strong> the one associated with the cached response, the vector is considered <strong>invalid</strong>.</li><li><strong>TTL &#x2192;</strong> The duration for which the vector remains valid before it must be refreshed.</li></ul><p>Each vector represents a specific component or state that, if changed, would necessitate a fresh rendering of the responses that depend on this vector.</p><ol><li><strong>Composite Validation Logic</strong>: The entire response validity depends on AND logic across all invalidation vectors. If any single vector becomes invalid, the entire cached response must be regenerated.</li><li><strong>Hierarchical Dependency Mapping</strong>: We mapped dependencies between different vectors to understand cascading invalidation effects. For example:<ul><li>If a user&apos;s KYC status changes, it invalidates the user vector</li><li>If a home contextual card&apos;s image mapping changes, it invalidates the corresponding card vector</li></ul></li><li><strong>Targeted Invalidation</strong>: Each invalidation vector is associated with specific IDs (such as user IDs or card IDs), ensuring that changes only invalidate relevant cached responses.</li></ol><p>So we ended up making two kinds of vectors:</p><ul><li><strong>Primary Invalidation Vectors</strong>: Directly linked to a specific response and determine its validity</li><li><strong>Secondary Vectors</strong>: Can trigger invalidation of primary vectors through defined dependency relationships. Example: KYC table linked to user, Card image map table which invalidates the card itself.</li></ul><p>This two-tier approach creates a invalidation cascade system, where changes propagate through our dependency graph, ensuring we only regenerate responses when truly necessary.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/new-2.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="682" height="879" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/new-2.png 600w, https://blog.famapp.in/blog/content/images/2025/12/new-2.png 682w"></figure><ul><li>Red: Primary Invalidation Vectors</li><li>Green: Secondary Vectors</li></ul><p>As we can see above, any change in the User group map table for example will invalidate the user vector (the primary invalidation vector)</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/download--4-.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="888" height="499" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/download--4-.png 600w, https://blog.famapp.in/blog/content/images/2025/12/download--4-.png 888w" sizes="(min-width: 720px) 720px"></figure><p>Once the invalidation vectors were in place, the next challenge was determining how to effectively track the changes that should trigger a cache invalidation. We evaluated two approaches:</p><h3 id="option-1-manual-event-emission">Option 1: Manual Event Emission</h3><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-2.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="990" height="298" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-2.png 600w, https://blog.famapp.in/blog/content/images/2025/12/image-2.png 990w" sizes="(min-width: 720px) 720px"></figure><p>In this method, specific sections of our monolithic service would be modified to emit change events to a message broker (such as Kafka). Consumers would then process these events in line with our dependency graph to invalidate the appropriate vectors. While this method offers direct control over which events trigger an invalidation, it comes with significant downsides:</p><ul><li><strong>Increased Code Complexity</strong>: Embedding event emissions into the existing codebase adds extra lines of code, making the monolith more cumbersome to maintain.</li><li><strong>Consistency challenges:</strong> Ensuring event emissions perfectly match database state changes introduces a <strong>consistency nightmare</strong>, especially when failures, retries, or partial rollbacks occur. Even minor mismatches can lead to stale or prematurely invalidated cache entries.</li><li><strong>Scalability Concerns</strong>: Every new feature would need to incorporate this mechanism, raising the risk of inconsistencies and oversight as the system evolves.</li></ul><h3 id="option-2-change-data-capture-cdc-from-postgresql-preferred">Option 2: Change Data Capture (CDC) from PostgreSQL (Preferred)</h3><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2025/12/image-3.png" class="kg-image" alt="Building a 50ms Home Feed &#x2014; Part 1: Design" loading="lazy" width="871" height="285" srcset="https://blog.famapp.in/blog/content/images/size/w600/2025/12/image-3.png 600w, https://blog.famapp.in/blog/content/images/2025/12/image-3.png 871w" sizes="(min-width: 720px) 720px"></figure><p>Our preferred solution leverages PostgreSQL&apos;s Change Data Capture (CDC) capabilities. Here&#x2019;s how it works:</p><ul><li><strong>Automatic Change Detection</strong>: PostgreSQL logs every transaction in its Write-Ahead Log (WAL). By consuming these WAL logs, we can automatically capture all changes made to tables that either contain or affect invalidation vectors.</li><li><strong>Minimal Code Modification</strong>: This approach operates independently of the application logic. It requires little to no modifications to the existing codebase, ensuring that new features integrate seamlessly without additional overhead.</li><li><strong>Dynamic Decision Making</strong>: Based on the type of operation (such as UPDATE or INSERT) and the specific table affected, our CDC system evaluates which invalidation vectors need to be refreshed. This ensures that the caching system remains accurate and up-to-date with minimal manual intervention.</li></ul><p>The CDC-based system thus provides a robust and scalable solution, significantly reducing the need for manual code changes and allowing us to operate entirely outside the core application code. This not only simplifies maintenance but also ensures that our caching mechanism stays aligned with the dynamic nature of our data.</p><p><strong>From planning to execution</strong></p><p>Part 1 brought us to a clear, battle-tested plan: reduce redundant computation, eliminate N+1 patterns, introduce ETag-based conditional caching, and track data changes precisely using invalidation vectors and CDC. With the design in place, the next challenge was turning this blueprint into a real, production-ready system. </p><p>In <a href="https://blog.famapp.in/blog/rebuilding-the-home-feed-how-homelander-learned-to-respond-in-50ms-part-2/" rel="noreferrer">Part 2</a>, we dive into how we built Homelander&#x2014;the service that made sub-50 ms home feed responses possible.</p>]]></content:encoded></item><item><title><![CDATA[Study habits that are simple and highly effective 📚]]></title><description><![CDATA[Student life is definitely not easy, and having to study literally all the time for exam or the other can be super frustrating. Exam season is here and we know you need some study advice to keep your head in the game.
]]></description><link>https://blog.famapp.in/blog/study-habits-that-are-simple-and-highly-effective/</link><guid isPermaLink="false">6180b9dabfcb2400016e979a</guid><category><![CDATA[Lifestyle]]></category><category><![CDATA[Teens]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Tue, 02 Nov 2021 05:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2021/11/Blog-template--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2021/11/Blog-template--1-.png" alt="Study habits that are simple and highly effective &#x1F4DA;"><p>Student life is definitely not easy, and having to study literally all the time for exam or the other can be super frustrating. But as they say, there is a method to every madness - Let&apos;s talk about the method. Exam season is here and we know you need some study advice to keep your head in the game.</p><ol><li><strong>(Don&apos;t) stop cramming &#x1F647;&#x200D;&#x2642;&#xFE0F;</strong></li></ol><p>Cramming is the worst way to understand anything, especially when you try to cram all your syllabus in one night. The trick is to read the same chapter, same syllabus every week - such that your brain naturally remembers what you read. Remember when Jeetu Bhaiya said - &quot;21 din mein koi bhi aadat ban jaati hai&quot;, yes exactly that!</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="551" height="380"></figure><p><strong>2. Make sure you have a set time to study &#x23F3;</strong></p><p>You know when we were young and moms used to say - &apos;Roz bas ek ghanta padh le!&apos; Well that&apos;s true my friend. Studying just 1 hours everyday, on a set time will save you from those all nighters right before exam. Don&apos;t just try to be consistent with your study, study at the same hour everyday.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-1.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="433" height="512"></figure><p><strong>3. Understand and try to love what you study &#x1F496;&#x1F4DA;</strong></p><p>While it&apos;s true that a formula or an equation will not really help you in life 10 years later, it&apos;s still knowledge that makes us more curious, and open to learning. Learning new concepts of any new subject is super fun and interesting! If you really try to love what you&apos;re studying, you are surely going to ace it!</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-2.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="397" height="416"></figure><p><strong>4. Don&apos;t study without a goal &#x1F945;</strong></p><p>Why do your textbooks have separate chapters and questions after each on of them? It&apos;s because each chapter addresses a different part of the subject and needs to be studied separately. Always study one chapter at a time, and finish the entire chapter fully before moving on to the next one.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-4.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="516" height="537"></figure><p><strong>5. Start with the difficult subjects or topics &#x1F646;&#x200D;&#x2642;&#xFE0F;</strong></p><p>How many times have you started a study session and asked yourself - &quot;Shuru kaha se karu?&quot; We have a simple solution to this huge problem - start with the most difficult. It will take the most time and will give the most confidence when you successfully complete it.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-5.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="640" height="480" srcset="https://blog.famapp.in/blog/content/images/size/w600/2021/11/image-5.png 600w, https://blog.famapp.in/blog/content/images/2021/11/image-5.png 640w"></figure><p><strong>6. Don&apos;t study (too much) &#x1F645;&#x200D;&#x2640;&#xFE0F;</strong></p><p>This is definitely the most important point. Studying the entire syllabus in one hour is just as effective and not studying at all. Space your studying time out over shorter periods of time, with breaks in between.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-8.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="584" height="442"></figure><p><strong>7. Always study in a quite setting &#x1F3E1;</strong></p><p>Distraction is easy. Distraction will also mean understanding less. Studying needs a flow. Remember that one really good study session you had. How each word that you read was so easy to understand, you could relate to each and every question and understand most concepts. Now look at the larger picture and see how quiet and peaceful that environment was. That&apos;s what you need every time.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/11/image-7.png" class="kg-image" alt="Study habits that are simple and highly effective &#x1F4DA;" loading="lazy" width="474" height="266"></figure>]]></content:encoded></item><item><title><![CDATA[Everything you need to know about our Numberless Card! 💳]]></title><description><![CDATA[FamCard is the first of its kind numberless card that teenagers can now use to make payments online/offline independently, relieving parents of the trouble of giving them cash or their credit/debit card.]]></description><link>https://blog.famapp.in/blog/everything-you-need-to-know-about-our-numberless-card/</link><guid isPermaLink="false">5f114d7713040f000155ad23</guid><category><![CDATA[Product]]></category><category><![CDATA[Teens]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Wed, 22 Jul 2020 10:23:09 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2023/10/image--66-.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2023/10/image--66-.png" alt="Everything you need to know about our Numberless Card! &#x1F4B3;"><p>Ever wondered why your debit/credit card carries the 16-digit number? Its a unique identifier that you use when you are making online transactions. You pull out the card from your wallet, enter the 16-digit and voila! - the Shopping site now knows its your card from where they should debit the money!&#x1F603;</p><p>But what if there was a simpler solution, that will avoid the walk from your comfort zone till your wallet? What if while you are browsing the shopping site on your phone, you can copy the 16 digit pin easily and paste it to continue the transaction? &#x1F44C;&#x1F911;</p><p>Simple innovations begin by asking the question&quot;why&quot;! We started in 2019 by asking the question &quot;Why should digital payments be for people of age <strong>18 and above</strong>?&quot; Less than a year later, we ask again &quot;Why should cards have numbers?&quot; Turns out, they don&apos;t need to!</p><p>In our efforts to push the boundaries of innovation by constantly challenging the norms, we have launched India&apos;s first numberless card, and unlike the rest of the cards, this is <strong>not for 18 and above</strong>, its for teenagers! &#x1F934;&#x1F478;&#x2728;</p><p><strong>FamCard is the f</strong><a href="https://blog.famapp.in/blog/fampay-announces-launch-of-indias-first-numberless-card/"><strong>irst of its kind numberless card</strong></a><strong> that teenagers can now use to make payments online/offline independently, relieving parents of the trouble of giving them cash or their credit/debit card.</strong></p><h3 id="ok-i-get-it-you-have-launched-a-card-for-teenagers-but-whats-the-big-deal-about-numberless">Ok, I get it, you have launched a card for teenagers, but what&apos;s the big deal about Numberless?!</h3><p>We&apos;re glad you asked! FamPay is for teenagers and their families. And teenagers haven&apos;t been using digital payments until now. So they are kinda new to the whole world of digital payments, UPI, Cards, and we have to make sure their payments are safe and secure. </p><h2 id="its-a-1-level-secure">Its a 1+ level secure!</h2><p>FamCard has no numbers on the physical card which makes it very secure. The card number and other details (expiry date, CVV) are stored securely within the FamPay app instead of being printed on the physical card. So, if a teen loses the card, there&#x2019;s no fear of card information getting disclosed. Plus, the card can be paused, blocked and managed at fingertips on the app. Additionally, all the card details within the app can be accessed only with device lock like fingerprint, face ID, pattern lock or PIN. </p><p>We don&apos;t stop here! We have added an extra feature we have to save you from spending too much money! You can keep a check on the maximum limit you want to spend every transaction. This feature is available for both online and offline transactions. Ain&apos;t that handy?</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/07/security.gif" class="kg-image" alt="Everything you need to know about our Numberless Card! &#x1F4B3;" loading="lazy" width="480" height="270"></figure><h2 id="contactless-in-the-age-of-corona">Contactless in the age of Corona</h2><p>FamCard has a special feature of &#x201C;Flash PIN&#x201D;, which is dynamic and is generated for every transaction. Teens can just flash this PIN to the cashier for offline payments, without the need of entering the PIN by themselves on the POS machines, allowing for true contactless payments amidst COVID-19.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/07/contactless.gif" class="kg-image" alt="Everything you need to know about our Numberless Card! &#x1F4B3;" loading="lazy" width="480" height="368"></figure><h2 id="no-frills-for-the-no-nonsense-generation">No frills for the no-nonsense generation</h2><p>When the number is not required for either online or offline transactions, then why have it in the first place? EXACTLY! Cards carrying the 16 digit number have been used for years now, but this number is not really required on the card when transacting offline. As FamCard has no numbers, all the card details are saved on the FamPay app and there is no need to refer to the physical card to fill in details during online transactions. FamCard is an innovative product in the sense of utility, <a href="https://techcrunch.com/2019/08/20/apple-card-launches-for-all-u-s-customers-today-adds-3-cash-back-for-uber-and-uber-eats/?ref=blog.famapp.in">one in a few</a> <a href="https://newsroom.mastercard.com/asia-pacific/press-releases/grab-launches-asias-first-numberless-card/?ref=blog.famapp.in">across the world</a> and the first in India - a perfect no frills product for the no-nonsense generation, Gen-Z!</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/07/nofrills.gif" class="kg-image" alt="Everything you need to know about our Numberless Card! &#x1F4B3;" loading="lazy" width="480" height="480"></figure><h2 id="designed-for-the-best">Designed for the best</h2><p>Did you know that Gen-Z teens are the coolest generation of all times? Don&apos;t believe us? Well, just look them up! They are tech savvy, empaths and woke! Any product that addresses their needs will have to resonate with their vibe. FamCard&#x2019;s design is minimalist with only relevant information displayed on it. It is a sleek and vertical card that matches their aesthetic style. The unconventional vertical card design is already a hit with the GenZ, who are excited as the card can be personalized. Numberless design will last longer because there are no numbers to fade with the passage of time.</p><h3 id="hmmm-so-anybody-could-have-created-a-numberless-card-no-biggie-right">Hmmm, so anybody could have created a numberless card, no biggie, right? </h3><p>NOPE! Anybody could have, but didn&apos;t. <strong>And it is a big deal</strong>. Making a numberless card was not an easy option for anyone until now, because there were plenty of processes and systems already that manufacture a card a certain way. And don&apos;t get us started on the backend systems. There was a lot of unlearning and re-learning that we executed with the card manufacturers, approvers and issuers. After months of hard work and perseverance from the <strong>FamPay team</strong>, and with the support of <strong>National Payments Corporation of India (NPCI), </strong>the numberless card in India has become a reality, which can be achieved by anyone now. But we&apos;d like to believe the first time&apos;s the charm &#x1F917;</p><h3 id="interesting-can-i-use-this-card-everywhere">Interesting, can I use this card everywhere? </h3><p>Yes! You can use it everywhere - Online/ Offline! Famcard works just like any other bank&apos;s Debit card!</p><p><strong>Offline: </strong>Buying groceries for mom at your kirana store? Need quick stationery from the shop downstairs? Wanna surprise dad by paying for petrol/diesel while he is getting it filled? FamCard can do all of this for you. It works at all merchant outlets accepting <strong>RuPay</strong> cards. Don&apos;t forget to be safe and use contactless payment option - the Flash PIN! &#x26A1;</p><p><strong>Online:</strong> You can book an Ola/Uber and pay for it using FamCard. You can order food online on Swiggy and pay for it using FamCard. You want to buy something for mom on Amazon - yes, you guessed it right! You can use FamCard. The 16-digit number that Famcard does not carry is stored on your app. So just copy it from your app and paste it on the payments page, along with validity (mm/yyyy) and CVV which is also available on the app. Voila, there you go!</p><h3 id="wow-this-is-great-how-does-it-look-when-it-arrives">Wow, this is great. How does it look when it arrives?</h3><p>Haha! We won&apos;t answer this one for you, we will show you how our GenZs have unboxed their FamCard!!</p><figure class="kg-card kg-embed-card"><iframe width="356" height="200" src="https://www.youtube.com/embed/Gcs-W_5fduQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p></p><h3 id="im-convinced-how-can-i-get-one-%F0%9F%98%8D">I&apos;m convinced, how can I get one? &#x1F60D;</h3><p>If you are a teen, download our app, get the KYCs done and apply for the card! If you are a parent of a teen, get your teen their <strong>first card</strong>!</p><p>If you are neither a teen nor a parent of a teen, fret not, just download our app with your family, and enjoy the world of digital payments. Though our numberless card is exclusively available to teenagers only, we&apos;ll soon launch it for you too. &#x1F680;</p><figure class="kg-card kg-embed-card kg-card-hascaption"><blockquote class="twitter-tweet" data-width="550"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/StartupStreet?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">#StartupStreet</a> | India&apos;s first neo bank for teenagers, <a href="https://twitter.com/fampayindia?ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">@fampayindia</a>, recently launched India&apos;s first numberless card - Famcard. <a href="https://twitter.com/ShrutiMishra_?ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">@ShrutiMishra_</a> speaks to the cos co-founder <a href="https://twitter.com/iamkushtaneja?ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">@iamkushtaneja</a> to know more. <a href="https://twitter.com/UPI_NPCI?ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">@UPI_NPCI</a> <a href="https://twitter.com/hashtag/HotSeat?src=hash&amp;ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">#HotSeat</a> <a href="https://t.co/n8YkNuMnFi?ref=blog.famapp.in">pic.twitter.com/n8YkNuMnFi</a></p>&#x2014; CNBC-TV18 (@CNBCTV18News) <a href="https://twitter.com/CNBCTV18News/status/1285218242361880576?ref_src=twsrc%5Etfw&amp;ref=blog.famapp.in">July 20, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<figcaption><p><span style="white-space: pre-wrap;">Catch </span><a href="https://www.linkedin.com/in/iamkushtaneja/?ref=blog.famapp.in" rel="noreferrer"><span style="white-space: pre-wrap;">Kush Taneja</span></a><span style="white-space: pre-wrap;">, our Co-Founder talk about the numberless card, Flash PIN and other features on Startup Street at </span><a href="https://twitter.com/CNBCTV18News/status/1285218242361880576?ref=blog.famapp.in"><span style="white-space: pre-wrap;">CNBC live</span></a><span style="white-space: pre-wrap;">!</span></p></figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Mindful Spending: Slashing $500K from Our AWS Bill]]></title><description><![CDATA[<p>Since the economic downturn of 2022, startups must prioritise profitability and sustainable growth and operate more like traditional businesses, focusing on increasing earnings and reducing costs. For a FinTech startup, Cloud spending, a significant recurring expense, grows with scale, making cost-saving crucial in this area</p><blockquote>$1 saved monthly will lead</blockquote>]]></description><link>https://blog.famapp.in/blog/mindful-spending-slashing-500k-from-our-aws-bill/</link><guid isPermaLink="false">66dfeee445db540001a27f43</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Pratik Gajjar]]></dc:creator><pubDate>Tue, 10 Sep 2024 08:16:31 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1635840420670-5470266ffa39?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxhd3MlMjBjb3N0fGVufDB8fHx8MTcyNTk1NjEwNXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1635840420670-5470266ffa39?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxhd3MlMjBjb3N0fGVufDB8fHx8MTcyNTk1NjEwNXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Mindful Spending: Slashing $500K from Our AWS Bill"><p>Since the economic downturn of 2022, startups must prioritise profitability and sustainable growth and operate more like traditional businesses, focusing on increasing earnings and reducing costs. For a FinTech startup, Cloud spending, a significant recurring expense, grows with scale, making cost-saving crucial in this area</p><blockquote>$1 saved monthly will lead to $12 savings annually</blockquote><p>FamApp is a fin-tech application enabling seamless UPI &amp; Card payments for the next generation. AWS forms the backbone of our tech stack empowering our application to run at scale for millions of users.</p><p>Being a fintech startup with increasing scale and cost, last year we set out to define goals for cloud spending to keep it in check. We started utilising AWS services for spend analytics and taking measures to reduce the ever increasing cost and root out inefficiencies. </p><p>In this blog, we will mainly focus on AWS cloud cost, as that&#x2019;s the biggest recurring tech cost for us. Here majority of the cost comes from Databases, Cache and EC2 servers running stateless backend applications.</p><h1 id="how">How?</h1><blockquote><strong>What is measured, can be improved</strong> &#x2014; <em>Peter Drucker</em></blockquote><p>With a team of talented engineers, the best way is to define ambitious goals that are objectively measurable.</p><h3 id="non-goal">Non Goal</h3><ul><li>Reducing platform reliability by not having redundancy.</li><li>Increasing latency via using cheaper hardware.</li></ul><h2 id="defining-goal">Defining Goal</h2><p>The first question that comes to our mind before we start defining the goal is:</p><ul><li>Where does our revenue come from?</li><li>What makes our revenue scale?</li></ul><p>For example, if our user base increases, this will lead to more potential customers entering the top of the funnel, which is likely to result in higher revenue from the goods and services provided on the platform.</p><p>Following this approach, we had three ways to link revenue numbers with the scale:</p><ol><li>MAU &#x2192; Monthly Active Users <ol><li>Count of users who opened the app at least once in a month</li></ol></li><li>MTU &#x2192; Monthly Transacting Users <ol><li>Count of users who did at least one payment in a month</li></ol></li><li>MT &#x2192; Monthly Transaction Count <ol><li>Total number of successful payments in a month</li></ol></li></ol><p>Here we agreed on &#x2192; How many users make payment in a month ie. Monthly Transacting Users (<strong>MTU</strong>) as a factor.</p><h3 id="why-mtu">Why MTU ?</h3><p>How do we create value for the user? When user uses our platform to make payments</p><p>If we were to choose MAU as a factor, this would mean there would users using our platform but value creation is not guaranteed there. For the 3rd factor, ie. total transactions, this would result in value creation but cannot guarantee the scale of per user value creation as implied in the Pareto Principle.</p><blockquote>The Pareto principle states that for many outcomes, roughly 80% of consequences come from 20% of causes.</blockquote><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-text">$ x = (Cloud Spends / MTU) </div></div><h3 id="example"><strong>Example</strong></h3><p>Let&#x2019;s say our AWS cost is $80,000 per month and have 1M MTU. With $1 = 83.9 INR, AWS spends per transacting user would be</p><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-text">$ x = (80,000 * 83.9)/1,000,000 = 6.712 INR / MTU </div></div><p>Based on unit economics, to have sustainable business, how much can you afford to spend on cloud ? We decided to pursue <strong>1 INR / MTU</strong> as our north star metric for cloud cost. </p><p>Thus, we need to reduce cost ~85%.  Engineers are now looking into business metrics, as the target is directly related to it, enforcing <a href="https://blog.pragmaticengineer.com/the-product-minded-engineer/?ref=blog.famapp.in">product-minded engineering</a>.</p><h2 id="dissect-spends">Dissect spends</h2><p>Strategy - Always start from $0 - what can we do to spend nothing ? Pick up low hanging fruits. </p><h3 id="by-engineering-team">By Engineering Team</h3><ol><li>Frontend: ~7% - AWS</li><li>Mobile (Android &amp; iOS: 3% - Firebase</li><li>Backend: 90% - AWS</li></ol><p><em>Note: these are not exact numbers.</em></p><p>Since we&#x2019;re a Y Combinator funded start up, we tried to utilise investor credits wherever we could.</p><p><strong>Making frontend spend come down to $0</strong></p><ol><li>Via migrating to <a href="https://pages.cloudflare.com/?ref=blog.famapp.in">cloudflare pages</a>. Here, technically, we needed to serve only pre-built js, css, html static files.</li><li>Convert Server-Side-Rendering (SSR - Next.js app) &#x2192; CSR.<ol><li>We wanted to skip running node.js server. Moving to static apps made it easy and efficient to deploy.</li><li>We utilised cloudflare workers where server side logic was needed.</li></ol></li></ol><p><strong>Making Mobile spend &lt;1%</strong></p><p>Most of the cost came from <a href="https://firebase.google.com/docs/database?ref=blog.famapp.in">firebase realtime database</a>, so we opted for a different strategy to serve the same use case. We used this for only basic static config, so it was relatively strait-forward.</p><p><strong>Backend</strong></p><p>Backend isn&#x2019;t just backend application cost, it includes security and data analytics cost as well. We consider everything as backend cost. Since this was the biggest pie, we divided this further.</p><h3 id="by-product-feature">By product feature</h3><ol><li>Chat</li><li>Feed</li><li>Transaction</li></ol><p>Based on <strong>backend API</strong> requests per month to serve specific features.</p><p><em>What value are we providing to the user via having this specific feature? How many users would come back asking for the specific feature if it gets removed?</em></p><p>Based on the above, we decided to sunset features that didn&#x2019;t provide value to the user. This was one of the biggest levers for us and helped us reduce cost by roughly ~30%.</p><p>Being a startup, we iterate heavily and over the course of 4 years we accumulated several features that were already sunset. However, from backend, computation required for those was still being done.</p><p>We may call this as tech debt. Having feature sunset process would help here, so that when the product team decides to discontinue, the backend team would be aware about changes as it gets added to backlog.</p><p>So far we didn&#x2019;t need to have specific instrumentation in place to be able to reduce spends as these metrics were already available.</p><h3 id="by-business-unit">By Business unit</h3><p>We needed a deeper understanding on what exactly we&#x2019;re spending on, and how much. For this, AWS provides a feature called <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html?ref=blog.famapp.in">user defined cost-allocation tags</a>.</p><p><strong>What is a tag?</strong></p><p>We can assign Key - Value pair to AWS resource.</p><pre><code class="language-json">Name: &quot;backend_api&quot;
// Key = Name
// Value = &quot;backend_api&quot;
</code></pre><p>Using <a href="https://aws.amazon.com/aws-cost-management/aws-cost-explorer/?ref=blog.famapp.in">AWS cost explorer</a>, we can plot graph that shows you cost ($) by <code>Tag_Key</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2024/09/cost-explorer.png" class="kg-image" alt="Mindful Spending: Slashing $500K from Our AWS Bill" loading="lazy" width="2000" height="935" srcset="https://blog.famapp.in/blog/content/images/size/w600/2024/09/cost-explorer.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2024/09/cost-explorer.png 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2024/09/cost-explorer.png 1600w, https://blog.famapp.in/blog/content/images/2024/09/cost-explorer.png 2260w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AWS cost explorer</span></figcaption></figure><p>As you may recall from <a href="https://blog.famapp.in/blog/the-story-behind-fampays-tech-stack/">the story behind our tech stack</a>, from the start we bet on infrastructure automation by using <a href="https://www.pulumi.com/?ref=blog.famapp.in">pulumi</a> to define cloud infrastructure as code.</p><p>This allowed us to instrument existing and new infrastructure with ease. We also concluded to have <code>cost-center</code> and <code>business-unit</code> tag on each resource.</p><pre><code class="language-tsx">const commonTags = {
	&quot;Name&quot;: &quot;msk-cluster&quot;,
	&quot;Environment&quot;: curEnvironment,
	&quot;cost-center&quot;: &quot;CoreEng&quot;,
	&quot;business-unit&quot;: &quot;Engineering&quot;
};

/*
Name =&gt; resource name
Environemnt =&gt; PROD | STAG 
business-unit =&gt; Product | FinOps | Support | Risk | Recon | CoreEng
cost-center =&gt; 
*/
</code></pre><p><strong>Define Cost-Center</strong></p><ul><li>For product, services required for <em>given use case</em> to work. Since for <em>given use case</em> we need to touch multiple services, we opted to use <code>cost-center</code> value as <code>service-name</code></li><li>For common infra where it was not possible to assign direct product function, we use <code>CoreEng</code> as business unit and use case = <code>logging</code> as cost center.</li></ul><p><strong>Bulk tagging of resources</strong></p><p>We built in-house tooling to attach tags in bulk for services that were created directly using console.</p><pre><code class="language-sql">-- Store AWS resources
CREATE TABLE IF NOT EXISTS resources (
  resource_arn TEXT PRIMARY KEY,
  tags_json TEXT,
  account_id TEXT,
  business_unit TEXT,
  cost_center TEXT,
  service TEXT,
  created_at DATETIME
)

INSERT OR REPLACE INTO resources (
	resource_arn, tags_json, account_id, created_at, business_unit, cost_center, service
) VALUES (?, ?, ?, ?, ?, ?, ?)

-- Store rules
SELECT
  &quot;rules&quot;.&quot;resource_arn&quot; AS &quot;resource_arn&quot;,
  &quot;rules&quot;.&quot;pattern&quot; AS &quot;pattern&quot;,
  &quot;rules&quot;.&quot;business_unit&quot; AS &quot;business_unit&quot;,
  &quot;rules&quot;.&quot;cost_center&quot; AS &quot;cost_center&quot;,
  &quot;rules&quot;.&quot;is_active&quot; AS &quot;is_active&quot;
FROM
  &quot;rules&quot;
WHERE
  &quot;rules&quot;.&quot;is_active&quot; = 1
  and (&quot;rules&quot;.&quot;account_id&quot; = ? OR account_id is null)

-- Fetch resource 
SELECT
  &quot;resources&quot;.&quot;resource_arn&quot; AS &quot;resource_arn&quot;,
  &quot;resources&quot;.&quot;tags_json&quot; AS &quot;tags_json&quot;,
  &quot;resources&quot;.&quot;created_at&quot; AS &quot;created_at&quot;
FROM
  &quot;resources&quot;
WHERE
  &quot;resources&quot;.&quot;business_unit&quot; = &apos;&apos;
  AND (LOWER(&quot;resources&quot;.&quot;tags_json&quot;) LIKE ? OR &quot;resources&quot;.&quot;resource_arn&quot; LIKE ?)
  AND &quot;resources&quot;.&quot;account_id&quot; = ?
</code></pre><p>Steps:</p><ol><li>Fetch &amp; store all AWS resources in SQLite</li><li>Define rules table which can have regex or specific resource id and value for <code>cost-center</code> and <code>business_unit</code></li></ol><p>Go through active rules and apply tags.</p><pre><code class="language-go">	for _, r := range rules {
		if r.arn != nil {
			applyTags(ctx, *r.arn, *r, svc)
		} else if r.pattern != nil {
			processPattern(db, r, svc)
		} else {
			log.Warn(&quot;rule does not have pattern or arn&quot;, &quot;rule&quot;, *r)
		}
</code></pre><h1 id="common-optimisation-areas">Common Optimisation Areas</h1><ol><li>Optimising Cloudfront and Load Balancers<ol><li>We saw a 99% reduction in cost by utilising cloudflare edge caching with cache hit ratio of 99.5%</li><li>Utilised Cloudflare R2 for common public assets. Here, add aggressive edge caching policy and make resources immutable.</li></ol></li><li>Instance Volume Type and AMD Instances<ol><li>Use <code>c6a</code>, <code>m6a</code> - AMD instances</li><li>Use <code>gp3</code> volume for all instances and RDS storage type, instead of provisioned IOPS (<code>io2</code>)</li><li>Use spot instances when you can, if not commit minimum compute spends to get discount. Use reservation and saving plan tab in cost explorer for suggestions.</li></ol></li><li>Inter-AZ Communication<ol><li>Understanding of data transfer costs between Availability Zones. You can utilise cost-explorer here.</li><li>Keeping majority of the instances in the same zone as primary db and cache nodes</li></ol></li><li>Hibernation of Development Servers: We were able to reduce spend by 80%. We plan to write about this in detail in the future, stay tuned!<ol><li>In micro service environment for testing, we launch all the dependant services for each feature<ol><li>Automatically stopping servers when unused via using request logs did wonders. The learning here is to automate when you can.</li><li>Here hibernated servers become live within 5 mins when someone tries to use the endpoint.</li></ol></li><li>Utilise postgres logical database to have one server for all micro-services in development environment.</li></ol></li><li>RDS Snapshots and EC2 Volumes<ol><li>Remove unattached unused volumes in EC2.</li><li>Archive older snapshots - RDS snapshot cost is ~100$ per TB</li></ol></li><li>S3 Objects<ol><li>Setup data archiving policy </li><li>In case you have versioning enabled and deleted objects, they&#x2019;ll use storage space.<ol><li>Setup deletion policy for older transient data</li></ol></li></ol></li><li><strong>Effective Use of </strong><a href="https://aws.amazon.com/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/?ref=blog.famapp.in"><strong>Karpenter</strong></a><ol><li>For EKS cluster, we strongly recommend to use karpenter and utilise spot instances and compact pod packing</li><li>When pods have <a href="https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html?ref=blog.famapp.in">CNI attached</a> to use AWS IAM roles for pods, there is a limit on instance, how many CNI can be attached which would cause node to stay underutilised.<ol><li>Increase pod cpu / ram requests to use bigger pod which would handle more requests. Eg. running 10 smaller pod would cost more than 3 big pods with equivalent compute capacity due to limit of CNI - container network interface</li></ol></li></ol></li><li>Rightsizing Container Resources &amp; Ec2 Instances<ol><li>Use opensource tooling like kubecost to analyse effectiveness</li><li>Compare workload wrt instance type. Eg. using c6a.large vs t3a.medium, by calculating count of instance * instance_type to run same workload.</li></ol></li></ol><h1 id="process">Process</h1><ol><li>Bi-weekly calls to analyse spend data and impact of optimisation</li><li>Monthly update with INR cost per MTU with team</li><li>Cost analysis as part of technical review document when building new features</li></ol><h2 id="future-plans">Future plans</h2><ol><li>Make tagging mandatory / 100% cost allocation tag coverage</li><li>Automatic detection on cost anomaly and alerting</li></ol><h3 id="conclusion">Conclusion</h3><ul><li>Define goals based on business metrics, instrument resources, and regularly look at spendings.</li><li>Experiment with various options, keep iterating and analyse impact.</li><li>Automate, automate, automate.</li></ul>]]></content:encoded></item><item><title><![CDATA[Change App Icon Dynamically in Android (without closing app)]]></title><description><![CDATA[<p></p><p>You&apos;ve probably seen apps like Twitter, Snapchat, Zomato etc., which allow users to choose app icon of their choice, or they change it in background on special occasions. It adds a personalised touch to the customer experience and acts as a delight feature for users. At Fam, we</p>]]></description><link>https://blog.famapp.in/blog/change-app-icon-dynamically-in-android/</link><guid isPermaLink="false">668d7b782f5b1700011f42b7</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Faizan Haider]]></dc:creator><pubDate>Wed, 10 Jul 2024 02:36:09 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1480694313141-fce5e697ee25?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGFuZHJvaWR8ZW58MHx8fHwxNzIwNTI2MjI0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1480694313141-fce5e697ee25?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGFuZHJvaWR8ZW58MHx8fHwxNzIwNTI2MjI0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Change App Icon Dynamically in Android (without closing app)"><p></p><p>You&apos;ve probably seen apps like Twitter, Snapchat, Zomato etc., which allow users to choose app icon of their choice, or they change it in background on special occasions. It adds a personalised touch to the customer experience and acts as a delight feature for users. At Fam, we were also eager to build this for our users and here&#x2019;s how we went about it.</p><p>I started searching on internet about the same and went through many articles &amp; stackoverflow buzz but the provided implementation everywhere causes the app to close on each app icon change. While the apps of Twitter, Snapchat, etc., only close once when changing the icon for the first time.</p><p>I eventually discovered the technique to accomplish the desired functionality. In this article, we&#x2019;ll first see the basic implementation which talks about the engineering behind it that will close the app every time. Then, we&#x2019;ll see how to achieve the desired behaviour, which will only close the app once, the very first time.</p><p></p>
<!--kg-card-begin: html-->
<div style="position: relative; padding-top: 58.25%;">
  <iframe src="https://customer-osgeh4h5ge31ny4f.cloudflarestream.com/dd929c804e38d5094e6c4a17b4294c32/iframe?poster=https%3A%2F%2Fcustomer-osgeh4h5ge31ny4f.cloudflarestream.com%2Fdd929c804e38d5094e6c4a17b4294c32%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600" loading="lazy" style="border: none; position: absolute; top: 0; left: 0; height: 100%; width: 100%;" allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe>
</div>
<!--kg-card-end: html-->
<p></p><p></p><h1 id="overview">Overview </h1><p>Unlike iOS, changing the app icon programmatically in Android is not very straightforward. Android doesn&#x2019;t provide any official way of doing this. However, with the help of <a href="https://developer.android.com/guide/topics/manifest/activity-alias-element?ref=blog.famapp.in">activity-alias</a> we can achieve this.</p><blockquote><em>Activity&#x2019;s alias is like having a different identity of target activity. By creating an alias for our desired activity, we can assign it a different icon and even a different app name.</em></blockquote><p><strong>TL;DR -</strong> So basically, to change the icon at runtime, we&#x2019;ll need to enable the alias representing an icon that we want to switch to and we&#x2019;ll need to disable the currently enabled alias (i.e. SplashActivity in above example). Sounds easy-peasy, right?</p><p>Let&#x2019;s have a look at Manifest file:</p><pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;&lt;http://schemas.android.com/apk/res/android&gt;&quot;&gt;

    &lt;application
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:label=&quot;@string/app_name&quot;
        android:theme=&quot;@style/Theme.Example&quot;&gt;
        
        &lt;!-- SplashActivity (Your Launcher activity) --&gt;
         &lt;activity
            android:name=&quot;.SplashActivity&quot;
            android:exported=&quot;true&quot;
            android:theme=&quot;@style/Theme.Example&quot;&gt;
            &lt;intent-filter&gt;
		            &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
        
				&lt;!-- Alias for SplashActivity with different icon --&gt;
        &lt;activity-alias
            android:name=&quot;.NewYearIconAlias&quot;
            android:targetActivity=&quot;.SplashActivity&quot;
            android:icon=&quot;@mipmap/ic_new_year&quot;
            android:exported=&quot;true&quot;
            android:enabled=&quot;false&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity-alias&gt;
        
    &lt;/application&gt;

&lt;/manifest&gt;
</code></pre><p>Here, <code>SplashActivity</code> is our launcher activity and we&#x2019;ve declared an <em>activity-alias</em> for it with a different icon which is disabled <strong>(</strong><code>enabled=&quot;false&quot;</code><strong>)</strong> by default. When the app is installed, the icon associated with the SplashActivity (i.e. application&#x2019;s default icon) will be set automatically. And upon enabling the activity alias, the icon associated with it will be set.</p><p>Now let&#x2019;s see the code to enable/disable the activity alias in runtime. We&#x2019;ll use <em>PackageManager</em> class &amp; it&#x2019;s <a href="https://developer.android.com/reference/android/content/pm/PackageManager?ref=blog.famapp.in#setComponentEnabledSetting(android.content.ComponentName,%20int,%20int)">setComponentEnabledSetting(...</a>) method</p><pre><code class="language-kotlin">fun changeIcon() {
				// Enabling NewYearIconAlias, that represents new year icon - for example
        packageManager.setComponentEnabledSetting(
            ComponentName(
                this,
                &quot;$packageName.NewYearIconAlias&quot;
            ),
            PackageManager.COMPONENT_ENABLED_**STATE_ENABLED**,
            PackageManager.DONT_KILL_APP
        )

				// Disabling the SplashActivity (we can also have alias to disable if we&apos;re playing with multiple aliases)
        packageManager.setComponentEnabledSetting(
            ComponentName(
                this,
                &quot;$packageName.SplashActivity&quot;
            ),
            PackageManager.COMPONENT_ENABLED_**STATE_DISABLED**,
            PackageManager.DONT_KILL_APP
        )
        
        // Note: DONT_KILL_APP flag doesn&apos;t work if we disable the 
        // currently enabled alias at runtime.
}
</code></pre><p>Here in <code>setComponentEnabledSetting(&#x2026;)</code> method, we are passing the component name of activity-alias and splash activity. And we&#x2019;re changing activity-alias state to enabled i.e. <a href="https://developer.android.com/reference/android/content/pm/PackageManager?ref=blog.famapp.in#COMPONENT_ENABLED_STATE_ENABLED"><em>COMPONENT_ENABLED_STATE_ENABLED</em></a> and splash activity state to disabled i.e. <a href="https://developer.android.com/reference/android/content/pm/PackageManager?ref=blog.famapp.in#COMPONENT_ENABLED_STATE_DISABLED"><em>COMPONENT_ENABLED_STATE_DISABLED</em></a>.</p><p>This will enable our activity-alias representing a different icon and disable the SplashActivity which represents default app icon in our case. Yes! That&#x2019;s pretty much it, our app icon has been changed.</p><p><strong>BUT as mentioned before, this straightforward approach comes with a pain&#x2014;it&#x2019;ll close the app every time we change the icon :/</strong>  In contrast, apps like Twitter &amp; Snapchat only close once, the very first time the icon gets changed.</p><p></p><p></p><p></p><h1 id="solution-to-prevent-the-app-from-closing-every-time"><strong>Solution to prevent the app from closing every time</strong></h1><p>Activity/alias component have multiple states like:</p><ul><li><em>PackageManager.<strong>COMPONENT_ENABLED_STATE_ENABLED</strong> &#x2192; This enables a component</em></li><li><em>PackageManager.<strong>COMPONENT_ENABLED_STATE_DISABLED</strong> &#x2192; This disables a component</em></li><li><em>PackageManager.<strong>COMPONENT_ENABLED_STATE_DEFAULT</strong> &#x2192; This takes component to it&#x2019;s default declared state in Manifest (for ex: Enabled or Disabled)</em></li></ul><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Android system only kills the app when we change the currently enabled alias/component&#x2019;s state to its <b><strong style="white-space: pre-wrap;">disabled</strong></b> state in runtime. <b><strong style="white-space: pre-wrap;">However, Android doesn&#x2019;t kill the app if we change the state to either Enabled or Default.</strong></b><i><em class="italic" style="white-space: pre-wrap;">[In the manifest, we can set both Enabled (</em></i><i><code spellcheck="false" style="white-space: pre-wrap;"><em class="italic">enabled=&quot;true&quot;</em></code></i><i><em class="italic" style="white-space: pre-wrap;">) and Disabled (</em></i><i><code spellcheck="false" style="white-space: pre-wrap;"><em class="italic">enabled=&quot;false&quot;</em></code></i><i><em class="italic" style="white-space: pre-wrap;">) as the default state]</em></i>Therefore, if we set the currently enabled alias to its default state, whose default declared state in the manifest is <b><strong style="white-space: pre-wrap;">Disabled</strong></b> then Android system won&#x2019;t terminate the app, and the component/alias will also be disabled.</div></div><p>By leveraging this behaviour of the Android system, we can simply enable the new alias and set the currently enabled alias to its Default state (which was declared as Disabled in the manifest). This won&apos;t result in the app being terminated. &#x1F60E;</p><p></p><h2 id="implementation">Implementation</h2><p>We&#x2019;ll create 3 types of aliases:</p><ul><li><strong>DefaultIconAlias: I</strong>t&#x2019;ll represent the default icon of our app. It&#x2019;ll be enabled (<code>enabled=&quot;true&quot;</code>) by default in manifest</li><li><strong>CloneDefaultIconAlias:</strong> This will ****act like a clone of <strong>DefaultIconAlias</strong> (you will see its uses later). It&#x2019;ll be disabled (<code>enabled=&quot;false&quot;</code>) by default</li></ul><p><em>Both <strong>DefaultIconAlias</strong> &amp; <strong>CloneDefaultIconAlias</strong> will represent the app&#x2019;s default icon</em></p><ul><li><strong>Rest of the other aliases:</strong> These will represent different icons and these must be disabled by default, you can declare these as many as you want!</li></ul><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">So, only <b><strong style="white-space: pre-wrap;">DefaultIconAlias</strong></b> will be enabled by default &amp; the rest will be disabled. All the aliases should target your launcher activity (SplashActivity in our case)</div></div><p>Let&#x2019;s have a glimpse of Manifest</p><pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;&lt;http://schemas.android.com/apk/res/android&gt;&quot;&gt;

    &lt;application
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:label=&quot;@string/app_name&quot;
        android:theme=&quot;@style/Theme.Example&quot;&gt;
        
        &lt;!-- Your Launcher Activity (SplashActivity in our example) --&gt;
				&lt;activity
            android:name=&quot;.SplashActivity&quot;
            android:screenOrientation=&quot;portrait&quot;
            android:theme=&quot;@style/OnboardingTheme&quot;
            android:exported=&quot;true&quot;&gt;
            &lt;intent-filter&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
        
        &lt;!-- This is enabled by default --&gt;
        &lt;activity-alias
            android:name=&quot;.app_icon_alias.AppIconsAlias.DefaultIconAlias&quot;
            android:enabled=&quot;true&quot;
            android:icon=&quot;@mipmap/ic_launcher&quot;
            android:targetActivity=&quot;.SplashActivity&quot;
            android:exported=&quot;true&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity-alias&gt;

				&lt;!-- This is disabled by default --&gt;
        &lt;activity-alias
            android:name=&quot;.app_icon_alias.AppIconsAlias.CloneDefaultIconAlias&quot;
            android:enabled=&quot;false&quot;
            android:icon=&quot;@mipmap/ic_launcher&quot;
            android:targetActivity=&quot;.SplashActivity&quot;
            android:exported=&quot;true&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity-alias&gt;

				&lt;!-- This is disabled by default --&gt;
        &lt;activity-alias
            android:name=&quot;.app_icon_alias.AppIconsAlias.NewYearIconAlias&quot;
            android:enabled=&quot;false&quot;
            android:icon=&quot;@mipmap/app_icon_beach&quot;
            android:targetActivity=&quot;.SplashActivity&quot;
            android:exported=&quot;true&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity-alias&gt;

				&lt;!-- This is disabled by default --&gt;
        &lt;activity-alias
            android:name=&quot;.app_icon_alias.AppIconsAlias.MembershipIconAlias&quot;
            android:enabled=&quot;false&quot;
            android:icon=&quot;@mipmap/app_icon_basket_ball&quot;
            android:targetActivity=&quot;.SplashActivity&quot;
            android:exported=&quot;true&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity-alias&gt;
        
				&lt;!-- You can keep declaring as many alias as requried... --&gt;
        
    &lt;/application&gt;

&lt;/manifest&gt;
</code></pre><p><strong>Now to change the icon for the first time</strong> we&#x2019;ll disable the <strong>DefaultIconAlias</strong> (which will terminate the app) and enable a new alias that represents a different icon. This will result in an app icon change but as mentioned app will be closed for the first time since we&#x2019;re changing the alias state from enabled to disabled in runtime.</p><p><strong>Now to change the icon next time</strong> we&#x2019;ll set the currently enabled alias to its default state (i.e. disabled (<code>enabled=&quot;false&quot;</code>) and as discussed earlier, this transition won&#x2019;t terminate the app). And now we&#x2019;ll simply enable the new alias. This will result in an app icon change without the app getting terminated. We&#x2019;ll keep doing the same for all the consequent icon changes&#x2014;your app won&#x2019;t get closed! &#x1F389;</p><p><strong>Now, to reset to the default icon</strong>, we will set the currently enabled alias state to default (i.e. disabled) and we&#x2019;ll enable <strong>CloneDefaultIconAlias</strong> which represents the default app icon too. We&#x2019;ll always enable CloneDefaultIconAlias in such cases (not DefaultIconAlias) as it&#x2019;s default state in manifest was disabled. Hence we can always set it to it&#x2019;s default state in order to change the icon again without terminating the app. We can&#x2019;t do this with DefaultIconAlias as it&#x2019;s default state was set as enabled in manifest.</p><p>Yay! We&#x2019;re done, this was it. Now you know the trick behind the apps of Zomato, Twitter, Snapchat and so on. Happy Coding!!</p><h2 id="please-note-%F0%9F%9A%A8">Please note &#x1F6A8;</h2><ul><li>You need to have all the different icons that you want to switch between included in your app&apos;s resources beforehand. Each icon needs to be specified in the manifest file and associated with an activity alias. Therefore, this method isn&#x2019;t practical if you want to change the app icon to something that wasn&apos;t included in the app at the time of installation. </li><li>You can also change the icon in the background. This way, even on the first change, app will be killed when user puts it in the background and if he reopens it from the background, then it will be started over from the beginning. Depending on your use case, this might still look better (Zomato also does similarly). On the other hand, we show an app termination warning when user changes the icon for the first time and then we change it right away.</li></ul>]]></content:encoded></item><item><title><![CDATA[It's time for teens to open shop on Instagram! 🛍️]]></title><description><![CDATA[Instagram is a gold mine of opportunities for a business. 🌟 and we want to help teens to start mining! Here is a quick guide to opening shop on Instagram for teens. ]]></description><link>https://blog.famapp.in/blog/how-can-teens-open-shops-on-instagram/</link><guid isPermaLink="false">60781a8940a8e80001fb78a0</guid><category><![CDATA[Lifestyle]]></category><category><![CDATA[Teens]]></category><category><![CDATA[FamSays]]></category><dc:creator><![CDATA[Chirag Maheshwari]]></dc:creator><pubDate>Mon, 26 Apr 2021 05:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2021/04/Arohi---blog-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2021/04/Arohi---blog-1.png" alt="It&apos;s time for teens to open shop on Instagram! &#x1F6CD;&#xFE0F;"><p>It is safe to say that the COVID-19 pandemic has introduced a mixed bag of pop-culture into everybody&apos;s lives, including GenZs. From frothy dalgona coffee, sleeping through online classes, late-night &apos;among us&apos; sessions to continually existing in PJs, the whole experience hasn&apos;t been anything short of a roller-coaster ride. &#x1F937;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;</p><p>FamPay, being engrossed in all-things-GenZ, has noted an exciting endeavor that the teen community is taking up with fervor, now that distance-learning and flexible hours have given them the opportunity to explore their interests and opportunities. As always, <strong>being the most tech-savvy, ambitious and experimental group, the GenZ are starting young to become business-owners on Instagram.</strong> &#x1F929;</p><blockquote>An iconic character once said, <em>&quot;If you are good at something, never do it for free&quot;.</em> Although this piece of advice, coming from a legendary &apos;villain&apos;, should be taken with a pinch of salt, he&apos;s not entirely wrong. </blockquote><p>It&apos;s &#x1F525; LIT &#x1F525;that teens are discovering things that they enjoy doing, and monetizing their talents, while churning out drool-worthy products and services. &#x1F924;</p><p>If you&apos;re a fellow teen who&apos;s looking for a know-how of your peers getting the &apos;<em>bijnes class&apos;</em> experience on Instagram, you&apos;re at the right place!</p><p></p><p><strong>What is on the virtual shelves of GenZ Instagram Shops?</strong> &#x1F50D;</p><p>Well, you can monetize almost anything that you are skilled in, and teens are proving just that! &#x1F9D9;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;</p><p>There are so many categories to choose from! Want to know what the possibilities are? Leggo! &#x1F3C3;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;</p><ol><li><strong>Accessories:</strong> Do you have an eye for intricate designs and the latest fashion trends? Well, owning an accessory business is the thing for you! Be it polymer clay jewelry, beaded necklaces, or even cute scrunchies, teens are doing it all! &#x1F525; <em>Fam tip: Offer customized pieces to amp up customers&apos; shopping experience.</em></li><li><strong>Apparel:</strong> GenZs are the ones who wear absolutely fire fits, so...unsurprisingly, many teens are using their artistic talent to sell apparel! &#x1F455; Be it tie-dying, embroidery, or using their customizing abilities to beautify clothes, Instagram businesses have it all! &#x1F525; <em>Fam tip: With sustainable fashion in the limelight, opening an online thrift store is a great idea.</em></li><li><strong>Food:</strong> Does your cooking leave your fam licking their fingers? Well, an Instagram business is the most exciting opportunity for a young aspiring chef or baker enhance your skills. Another treat? You get to roll the dough to roll in &apos;dough&apos;! &#x1F609; &#x1F4B8; From brownies and cakes to savory treats like pizzas, you can sell it all. &#x1F525; Fam tip: <em>Don&apos;t forget to register your business with <a href="https://www.fssaifoodlicense.com/food-license-for-homemade-food/?ref=blog.famapp.in">FSSAI.</a></em></li></ol><p>Remember, if your interest doesn&apos;t fit in these categories, it&apos;s okay! There are so many niche products that would be adored on the IG market.</p><p></p><p><strong>Why choose Instagram as your marketplace? &#x1F937;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;</strong></p><p>Now that you have a fair idea of what our young businesspersons are selling on Instagram, you might wonder why you should set up shop at Instagram. &#x1F440;</p><p>Well, long story short: <a href="https://www.facebook.com/help/instagram/1554245014870700/?helpref=hc_fnav&amp;bc%5B0%5D=Instagram%20Help&amp;bc%5B1%5D=Instagram%20for%20Businesses"><em>Instagram is a gold mine of opportunities for a business.</em></a> &#x1F31F; We&apos;ll tell you why.</p><ol><li><strong>Ease of usage</strong>: If you&apos;re not a big IG fanatic, you don&apos;t have to worry about a steep learning curve. <strong>Setting up your business page on Instagram is easy</strong>, and makes your social media handling accessible! Business pages can link their accounts from other social platforms to Instagram, and publish content for all of them at the same time. &#x1F44C;&#x1F3FC;</li><li><strong>Great features</strong>: With Instagram, GenZs have been able to <strong>channel their creative abilities to create a beautiful catalog-like experience for customers.</strong> Use stories and highlights to shed light on great topics such as your business story, customer reviews, customization and teasers for new releases, and get on top of the your business game! &#x1F929;</li><li><strong>Analytics tools:</strong> <a href="https://www.facebook.com/help/instagram/788388387972460">Instagram Insights</a> is a truly commendable feature. Decided to post something and can&apos;t gauge how fire your post is? <strong>Analytics will give you easy and cohesive stats to look at</strong>, which makes it so easy to understand which posts are pushing your business forward. &#x1F50E;</li><li><strong>Creative Freedom:</strong> <em>Instagram lets young business owners paint their business canvas however they like.</em> <strong>There are pages with different themes, making them look intriguing and fun.</strong> If you&apos;re inclined towards a particular theme, you can incorporate a cohesive feed, definite color scheme and tone of your page! This is your chance to be unique and experimental: do what you enjoy and have fun doing it! &#xA0;&#x1F308;</li></ol><p>&#x1F525; <em>Fam tip: Instagram has been a big supporter of businesses during the pandemic, even showing solidarity and introducing a sticker called &quot;Support Small Business&quot;. Instagram Users can share their favorite small brand, improving the brand&apos;s visibility!</em></p><p></p><p><strong>Is there a blueprint you can follow?</strong> &#x1F4D8;</p><p>While we strongly believe in being unique and doing things your way, there are some baselines that will help you establish your Instagram Business smoothly. &#x1F4CA; Let&apos;s throw light on the things that ensure a prepared entry of your business in the IG marketplace. &#x1F4AA;&#x1F3FD;</p><ol><li><strong>Find your niche:</strong> The most important step would be to find what you&apos;d like to monetize. It can be <strong>products, services</strong> or a mix of both. Out of the box ideas are always great, but even if your product is simple, it can turn out to be simply amazing! &#x2728;</li><li><strong>Market Research:</strong> We know, heavy word alert! &#x1F613; Don&apos;t worry, it&apos;s not as tricky as it sounds. Doing some <strong>basic market research</strong> would involve looking at other businesses that might sell similar products, noting their prices and customer demographic. &#x1F4DD;</li><li><strong>Making samples</strong>: To launch your business, it would be a great idea to make some samples beforehand. This will give you an idea about the<strong> time, material, and cost involved in making your product</strong>. You can get even get feedback from family or squad and decide on the prices and range that you&apos;d like to offer. &#x1F911;</li><li><strong>Shoot creatives:</strong> Channel your photography and editing skills to <strong>create online content around your products!</strong> If you have a theme in mind, follow it. If you&apos;re experiencing some creative block, draw inspiration from other pages and sync it with your uniqueness. &#x1F4F8;</li><li><strong>Build a following:</strong> Once you&apos;ve made your Instagram Business Account and posted some introductory posts, it&apos;s time to get a customers! Woohoo! Use that market research to follow relevant people, and engage with them. 					 &#x1F525; <em>Fam tip: What if we told you there&apos;s a <strong><a href="https://blog.famapp.in/blog/when-building-for-genzs-build-it-on-discord/">community of 7K+ teens</a>, </strong>waiting to hear about your business? Well, join <strong>FamPay&apos;s discord community: &apos;Friends of Fam&apos;,</strong> promote your business on the self-promotions channel, and see your followers grow!</em> &#x1F4C8;</li><li><strong>Manage your Money:</strong> Setting up a robust Payments System is essential for a business. As a business-owner, you&apos;ll not only receive money through sales, but also expend it on things like courier services, packaging and material. &#x1F4B8;&#x1F504; Using your parent&apos;s account is a no-go, since you need 24x7 access to keep track of your finances, initiate refunds or check a customer&apos;s payment status. &#x1F645;&#x1F3FB;&#x200D;&#x2640;&#xFE0F; <strong>Fret not, FamPay is here to help! </strong>You can set your own FamPay account and handle your finances smoothly, be it earning or spending. The best part? You don&apos;t need a bank account, and you get so many rewards for simply using the app. All this while being a business-owner? Now THAT&apos;S the life! &#x1F60E;</li></ol><p>&#x1F525; <em>Fam Tip: You are the biggest asset to your business. Add a personal touch to the brand and packaging, share your story, customer feedback and BTS shenanigans! Don&apos;t forget to be proud of owning a business.</em></p><p></p><p><strong>Who&apos;s thriving on the Instagram Marketplace? &#x1F331;</strong></p><p>To end things on an inspiring note, here are some wonderful Instagram based Small Businesses that will prove to you that the journey is going to be equal parts adventurous, informative and rewarding! &#x1F929;</p><ol><li><strong>Smitten unicorn:</strong> <a href="http://instagram.com/smitten.unicorn?igshid=regbj8s2tcl8&amp;ref=blog.famapp.in">instagram.com/smitten.unicorn</a>/</li><li><strong>Shahrlifestyle:</strong> <a href="http://instagram.com/shahrlifestyle?igshid=1sj3nx15k6ri6&amp;ref=blog.famapp.in">instagram.com/shahrlifestyle</a>/</li><li><strong>The Minervy:</strong> <a href="http://instagram.com/theminervy?igshid=v1swh8aj0w2y&amp;ref=blog.famapp.in">instagram.com/theminervy</a>/</li><li><strong>Artsiify:</strong> <a href="http://instagram.com/artsiify?igshid=1iy4zmdwa43z4&amp;ref=blog.famapp.in">instagram.com/artsiify</a>/</li><li><strong>Nish Hoops:</strong> <a href="http://instagram.com/nish.hoops?igshid=1noilud9a9lz1&amp;ref=blog.famapp.in">instagram.com/nish.hoops</a>/</li></ol><p><em>Have further questions, suggestions or feedback? Write to me on </em><a href="mailto:arohi.kaushal@fampay.in"><em>arohi.kaushal@fampay.in</em></a><em>! &#x1F308;</em></p>]]></content:encoded></item><item><title><![CDATA[Why is OTP not secure?]]></title><description><![CDATA[<p>Hello Fam,</p><p>In today&apos;s digital landscape, when all your spending needs are driven online, safeguarding your money is crucial. At Fam, we always consider protecting your money as a non-negotiable and the most important to us over all other responsibilities you have trusted us for!</p><p>Until today, you</p>]]></description><link>https://blog.famapp.in/blog/strengthening-security-understanding-the-importance-of-2fa-on-famapp/</link><guid isPermaLink="false">65defbec2f5b1700011f41ef</guid><dc:creator><![CDATA[Lisha]]></dc:creator><pubDate>Wed, 28 Feb 2024 09:40:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2024/02/Header-from-1Password-Blog.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2024/02/Header-from-1Password-Blog.png" alt="Why is OTP not secure?"><p>Hello Fam,</p><p>In today&apos;s digital landscape, when all your spending needs are driven online, safeguarding your money is crucial. At Fam, we always consider protecting your money as a non-negotiable and the most important to us over all other responsibilities you have trusted us for!</p><p>Until today, you could login to your FamX account with One Time Password (OTP) which we agree is quite easy but allow us to tell you how it compromises with the safety of your money.</p><p>The previous OTP method left users vulnerable to social engineering tactics. We have seen many cases where FamApp users receive a message on WhatsApp from an attacker claiming to be an employee at FamApp, offering a reward of Rs. 10K or GPRC give away. The &quot;representative&quot; requests personal details, including an their mobile number &amp; the OTP sent to their phone. They assumed it&apos;s legitimate and got tricked. Next thing you know, the attacker enters their account, accessed their FamX account and took out all their money.</p><p><strong>Understanding Social Engineering:</strong></p><p>Social engineering is a psychological manipulation technique used by cybercriminals to trick individuals into divulging confidential information. It preys on human vulnerabilities, such as trust and curiosity, to gain unauthorized access to accounts or sensitive data.</p><p><strong>To prevent this to happen to any of our FamApp users</strong>, and <strong>to make sure your money is completely safe</strong>, we&apos;re rolling out Two-Factor Authentication (2FA) on FamApp, because protecting your hard-earned money is non-negotiable. Let&apos;s delve into why this step is crucial and how it works.</p><p><strong>Understanding 2FA:</strong></p><p>2FA or Two Factor Authentication is a security process that requires two authentication methods to gain access to an account. It adds an extra layer of protection beyond just a password. Think of it as having both a key and a combination lock on your vault.</p><p><strong>How It Works on FamApp:</strong></p><ol><li><strong>SIM and Device Binding:</strong> This involves uniquely binding your device to registered phone number. This involves sending an SMS from your registered phone number to us to verify your identity.</li><li><strong>Email Verification:</strong> As part of additional security step we verify your email id too.</li></ol><p><strong>Why 2FA Is Your Shield:</strong></p><ol><li><strong>Enhanced Security:</strong> By requiring multiple forms of authentication, 2FA significantly reduces the risk of unauthorized access. Even if a hacker obtains your phone number, they&apos;ll still need access to your SIM card and email to breach your account.</li><li><strong>Protecting Your Assets:</strong> Your FamApp account houses your financial resources. Implementing 2FA ensures that your funds remain secure and inaccessible to malicious actors.</li><li><strong>Combatting Social Engineering:</strong> 2FA acts as a barrier against social engineering attacks. Even if you&apos;re tempted by enticing offers or urgent requests for information, the additional authentication step provides an extra layer of defense.</li></ol><h2 id="faqs"><strong>FAQs</strong></h2><p><strong>What happens if I don&apos;t have access to my SIM card or email during login?</strong><br>In such cases, you will encounter difficulties accessing your account. It&apos;s essential to ensure that you have access to both your SIM card and email for seamless authentication. Even during the OTP login system, you would still need access to your sim card to enable UPI payments on FamApp, so that hasn&apos;t changed. We have just introduced this step during the entry-point to keep your funds safe.</p><p><strong>Can I disable 2FA if I find it inconvenient?</strong><br>At FamApp, we prioritize the security of your account. Disabling 2FA is not an option, as it significantly enhances the protection of your funds and personal information and is just a one-time action.</p><p><strong>I&apos;m having trouble receiving the silent SMS. What should I do?</strong><br>If you&apos;re experiencing issues with receiving the silent SMS on iOS, ensure that your device has an active internet connection and try sending the SMS again. If the problem persists, reach out to our support team for assistance.</p><p><strong>Is 2FA mandatory for all users?</strong><br>Yes, 2FA is mandatory for all users on FamApp. We&apos;re committed to ensuring the highest level of security for our users, and 2FA is a crucial component of our security measures.</p><p><strong>Can I use the same email address and mobile number for multiple FamApp accounts?</strong><br>No, each FamApp account must be associated with a unique phone number &amp; email address. You can only use one account on your device and the same person cannot have more than one account.</p><p><strong>What should I do if I suspect unauthorized access to my account despite having 2FA enabled?</strong><br>If you suspect unauthorized access to your account, immediately change your password, revoke access to any connected devices, and contact our support team for further assistance. We take security incidents seriously and will investigate the matter promptly.</p><p><strong>I&apos;ve lost my phone with the SIM card linked to my FamApp account. What should I do?</strong><br>If you&apos;ve lost your phone with the linked SIM card, contact your mobile service provider to deactivate the SIM card. Additionally, reach out to our support team to assist you in securing your account and updating your authentication methods.</p><p>Remember, if you have any further questions or concerns regarding 2FA or any other aspect of FamApp, don&apos;t hesitate to reach out to our dedicated support team at support@famapp.in. We&apos;re here to help ensure a secure and seamless experience for all our users.</p><p>Until next time. Till then, Stay Vigilant, Stay Secure.</p>]]></content:encoded></item><item><title><![CDATA[Understanding How Digital Gold Works: A Simple Guide]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2024/02/D.png" class="kg-image" alt loading="lazy" width="400" height="200"></figure><p><strong>For starters</strong></p><p>Before diving into investing in any commodity, it&apos;s crucial to understand the dynamics of &apos;buy&apos; and &apos;sell&apos; prices, price spreads, and the rationale behind them.<br></p><p>Whether you have prior experience in investment or not, when engaging in precious metals investment or commodity</p>]]></description><link>https://blog.famapp.in/blog/understanding-how-digital-gold-works-a-simple-guide/</link><guid isPermaLink="false">65d8a0d92f5b1700011f416f</guid><dc:creator><![CDATA[Lisha]]></dc:creator><pubDate>Fri, 23 Feb 2024 13:49:17 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1624365169364-0640dd10e180?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxnb2xkfGVufDB8fHx8MTcwODY5NDUxOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2024/02/D.png" class="kg-image" alt="Understanding How Digital Gold Works: A Simple Guide" loading="lazy" width="400" height="200"></figure><img src="https://images.unsplash.com/photo-1624365169364-0640dd10e180?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxnb2xkfGVufDB8fHx8MTcwODY5NDUxOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Understanding How Digital Gold Works: A Simple Guide"><p><strong>For starters</strong></p><p>Before diving into investing in any commodity, it&apos;s crucial to understand the dynamics of &apos;buy&apos; and &apos;sell&apos; prices, price spreads, and the rationale behind them.<br></p><p>Whether you have prior experience in investment or not, when engaging in precious metals investment or commodity trading such as DigiGold, you&apos;ll encounter two key parameters: the &apos;sell&apos; and &apos;buy&apos; prices.<br></p><p>What do these prices signify, and why is the &apos;sell&apos; price consistently lower than the &apos;buy&apos; price across all commodities? Let&apos;s delve into it.<br></p><p><strong>Understanding &apos;Buy&apos; and &apos;Sell&apos; Prices</strong></p><p>The &apos;buy&apos; or &apos;bid&apos; price is what you pay to acquire a share or any commodity, while the &apos;sell&apos; or &apos;ask&apos; price is what you receive upon selling that share or commodity.<br></p><p>The &apos;buy&apos; price is what you&apos;ll pay when you wish to buy some gold. It&apos;s like the price tag on that PS5 you&apos;ve been eyeing.<br></p><p>Now, the &apos;sell&apos; price is what you&apos;ll get when you decide to part ways with your digital gold. It&apos;s like selling your old pokemon cards to make some extra cash.<br></p><p><strong>Price Spread</strong></p><p>The difference between the &apos;buy&apos; and &apos;sell&apos; prices of DigiGold represents the commission paid to brokers or intermediary entities facilitating your trades, known as the &apos;spread&apos;. You know, like when you order food delivery and there&apos;s a small extra charge? Same idea here.<br></p><p>Despite electronic connectivity between buyers and sellers, human involvement in this trade invokes compensation. The spread typically centres around the market price, which falls between the buy and sell prices.<br></p><p>The &apos;buy&apos; price of your DigiGold will always exceed its &apos;sell&apos; price, with the price you pay or receive fluctuating slightly from the market price due to this spread.<br></p><p><strong>Illustrating the Spread with an example</strong></p><p>Imagine you&apos;re at your school fair where all the students are trading snacks. You have a delicious chocolate bar you want to sell, and your friend is interested in buying it.<br></p><p>The &apos;buy&apos; price is what your friend is willing to pay you for the chocolate bar. Let&apos;s say they offer you 20 rupees.<br></p><p>Now, if you decide to sell the chocolate bar to your friend, you&apos;ll agree on a &apos;sell&apos; price, which might be a bit lower than what they&apos;re willing to pay. So, let&apos;s say you agree to sell it for 15 rupees.<br></p><p>The difference between what your friend is willing to pay (20 rupees) and what you agree to sell it for (15 rupees) is the &apos;spread&apos;. In this case, it&apos;s 5 rupees. <br></p><p>Now, why is the &apos;sell&apos; price lower than the &apos;buy&apos; price? Well, think of it this way: when you&apos;re selling something, you want to make it attractive to buyers, so you might offer a slightly lower price to encourage them to buy it. On the other hand, when you&apos;re buying something, you&apos;re willing to pay a bit more to get what you want.<br></p><p>So, in the end, the &apos;spread&apos; helps to balance the interests of both the buyer and the seller in a trade.<br></p><p>Just like at the school fair, in the financial world, there are similar &apos;buy&apos; and &apos;sell&apos; prices for different things like stocks, gold, or even digital items in online games. Understanding these prices and the spread between them can help you make smart decisions when buying or selling things in the future!<br></p><p>But if the sell price is always lower than the buy price, how is it a beneficial commodity to invest in? This is not always the case. The buying and selling prices for digital gold are carefully regulated to make sure everything&apos;s fair and square.<br></p><p>Let&#x2019;s understand this using an example -</p><p>Imagine you&apos;re trading Pok&#xE9;mon cards with your friends. You&apos;ve got your Charizard, and someone else has a Pikachu. You both agree to trade, but maybe you throw in a couple of extra cards to sweeten the deal. That&apos;s kinda how buying and selling digital gold works &#x2013; it&apos;s all about finding that fair exchange.<br></p><p>And just like in the Pok&#xE9;mon world, prices can go up and down depending on all sorts of things. Maybe there&apos;s a new game coming out that everyone is hyped about, or maybe there&apos;s a limited edition card that everyone is scrambling to get. Same deal with digital gold &#x2013; supply, demand, and other market factors can all influence the prices. Note that the demand grows when buyers outnumber sellers, and prices rise as a result. When the number of sellers outnumber the number of buyers, supply rises while demand and price fall.<br></p><p><strong>Factors Affecting Price Spread in Gold</strong></p><p>Gold, like any traded commodity, experiences a buy-sell spread influenced by factors such as price volatility, supply, external market conditions, and additional expenses like GST and handling fees in digital gold transactions.<br></p><p><strong>Closing Thoughts</strong></p><p>Understanding the dynamics of buy and sell prices, price spreads, and their implications across various commodities is crucial for informed investing and trading decisions. </p><p>Hope you found this useful, Happy trading!</p>]]></content:encoded></item><item><title><![CDATA[Curious about FamCard?💳 Here’s everything to know: FAQs by teens on FamCard]]></title><description><![CDATA[Curious about FamCard?💳 Here’s everything to know: FAQs by teens on FamCard]]></description><link>https://blog.famapp.in/blog/curious-about-famcard-heres-everything-to-know/</link><guid isPermaLink="false">5fe9deb411e54b00016d21a6</guid><category><![CDATA[Product]]></category><category><![CDATA[Teens]]></category><category><![CDATA[FamSays]]></category><dc:creator><![CDATA[Shifa Kareem]]></dc:creator><pubDate>Mon, 25 Jan 2021 06:53:06 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2020/12/Shifa--blog1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2020/12/Shifa--blog1.png" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard"><p>Hi, my name is Shifa and I work in the Customer Success team at FamPay. A typical day for our team involves resolving user queries, answering product related questions and using the user feedback to improve the product. BTW, we have recently delivered our 50,000th FamCard. Woohoo! </p><p>Most of you teens want to know more about our star product- <a href="https://blog.famapp.in/blog/famcard-your-first-debit-card/">FamCard</a>, and I have decided to answer some of the top questions on FamCard we receive on our customer chat, here goes! <br></p><h3 id="-what-is-famcard">&#x1F4B3; What is FamCard?</h3><p>FamCard is a prepaid card specially designed for FamPay users. As soon as you create an account with us, you&apos;ll be able to access your card in the app for all your online purchases. To swipe the card at offline merchants, you need to place an order for the physical card.</p><p>Watch my <a href="https://www.youtube.com/watch?v=IW20vNCuV5E&amp;ref=blog.famapp.in">debut video</a> here:</p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="356" height="200" src="https://www.youtube.com/embed/IW20vNCuV5E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><figcaption>FamCard&apos;s debut video</figcaption></figure><h3 id="-how-is-it-different-from-a-debit-credit-card">&#x2B50; How is it different from a debit/ credit card?</h3><p>FamCard is just like a debit card. It is prepaid, so you have to add money into your FamPay account (or you can get your parents to add it for you) and then you can use the card to spend that money online/offline. You can even track your expenses on the app! </p><p>It is not a credit card, that means you won&#x2019;t be able to use it if the payment amount exceeds your account balance. But there are some credit card features that we have enabled &#x1F929;. We have introduced something so rewarding just for you - FamCoins &#xA0;- so every payment you do from the FamCard will get you a chance to earn FamCoins! (pretty much the rewards of a credit card, right?!)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2021/01/image-7.png" class="kg-image" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard" loading="lazy" width="426" height="335"><figcaption><strong>First swipe down</strong> on your home screen reveals your card&#xA0;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2021/01/image-8.png" class="kg-image" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard" loading="lazy" width="410" height="420"><figcaption><strong>Second swipe down</strong> reveals your card information (CVV and 16 digit number)</figcaption></figure><p>What&apos;s more? Unlike other debit/credit cards, this is <a href="https://blog.famapp.in/blog/everything-you-need-to-know-about-our-numberless-card/">Numberless</a> - meaning, 16 digit card number and CVV is not printed on the physical card. Instead, they are available only on the app, making it safe from misuse just in case you lose the card! Extra secure, right? You can block/pause your card on the app if lost/stolen. </p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="267" height="200" src="https://www.youtube.com/embed/tqBiHY6Cvyw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><figcaption>FamCard - Numberless and Secure</figcaption></figure><h3 id="-can-i-customize-my-famcard">&#x1F929; Can I customize my FamCard?</h3><p>Of course, you can! Go crazy on the personalization. Before you place the card order, personalize your card and if you wanna be named Batman, then you get a card with that name!</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2023/10/image--66--1.png" class="kg-image" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard" loading="lazy" width="1414" height="1414" srcset="https://blog.famapp.in/blog/content/images/size/w600/2023/10/image--66--1.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2023/10/image--66--1.png 1000w, https://blog.famapp.in/blog/content/images/2023/10/image--66--1.png 1414w" sizes="(min-width: 720px) 720px"></figure><h3 id="-how-can-i-order-a-famcard">&#x1F69B; How can I order a FamCard</h3><p>Easy-peasy! You can order the card from the app. Just go on the card screen, click on order card, fill in your details and we&apos;ll deliver it at your doorstep.</p><h3 id="-how-much-time-does-it-take-to-deliver-a-famcard">&#x23F2; How much time does it take to deliver a FamCard?</h3><p>We try to ensure your FamCard reaches you in 10-14 working days. But sometimes, the courier team might take extra time, because they really work hard and have a lot of deliveries to do!</p><h3 id="-how-can-i-track-my-famcard">&#x1F5B2; How can I track my FamCard?</h3><p>You can do that on the app! You will be able to track your FamCard on the card screen. Just click on Track order on that screen and you can track your FamCard until it reaches your doorstep.</p><h3 id="-where-can-i-use-the-famcard">&#x1F4C7; Where can I use the FamCard?</h3><p>All our cards are registered on the RuPay network. FamCard can be used everywhere in India where RuPay cards are accepted online and offline (<a href="https://en.wikipedia.org/wiki/RuPay?ref=blog.famapp.in#:~:text=The%20cards%20are%20accepted%20by,card%20on%2022%20July%202019.">across 40+ million merchants</a>)</p><blockquote><strong>For those who were waiting for FamCard to be swiped at non-RuPay terminals, here&apos;s a good news coming soon for you!</strong></blockquote><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/01/image.png" class="kg-image" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard" loading="lazy" width="1503" height="1507" srcset="https://blog.famapp.in/blog/content/images/size/w600/2021/01/image.png 600w, https://blog.famapp.in/blog/content/images/size/w1000/2021/01/image.png 1000w, https://blog.famapp.in/blog/content/images/2021/01/image.png 1503w" sizes="(min-width: 720px) 720px"></figure><p>You can swipe your FamCard in person or transfer money digitally on all your favourite sites, such as Amazon, Zomato, Swiggy, Uber, etc.</p><p>Book your movie tickets, get a cab, buy a gift, grab a snack! Wherever there&apos;s a fun-way, there&apos;s FamPay!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.famapp.in/blog/content/images/2020/12/image-14.png" class="kg-image" alt="Curious about FamCard?&#x1F4B3; Here&#x2019;s everything to know: FAQs by teens on FamCard" loading="lazy" width="300" height="613"><figcaption>A range of stores available on the FamPay app to swipe your FamCard!</figcaption></figure><h3 id="-where-can-i-view-the-card-number-and-cvv">&#x26A1; Where can I view the Card Number and CVV?</h3><p>Every card has a unique 16-digit number called the card number and a 3 digit CVV code. Your FamCard&apos;s number and CVV is stored in your app and can be found in the virtual card section of the app. Just click on the eye symbol and enter your phone passcode and you can view the CVV.</p><h3 id="-once-i-get-a-famcard-how-do-i-generate-a-pin">&#x1F522; Once I get a FamCard, How do I generate a pin?</h3><p>Every FamCard comes with an instruction leaflet with steps to activate it. You would ideally set the PIN for your FamCard while activating the card itself.. Don&#x2019;t worry, if you forgot the PIN, you can go to card settings and click on &#x2018;Change PIN&#x2019; to set a new one.</p><h3 id="-can-i-withdraw-cash-using-a-famcard">&#x1F3E7; Can I withdraw cash using a FamCard?</h3><p>Nope, you cannot! You can always transfer the money in your FamPay account to any other bank account to withdraw money. But we strongly advocate avoiding cash to stay safe and contactless and also to promote the growth of India&apos;s digital payments! &#x1F64C;</p><hr><p>If you already have a FamCard hope these questions help you navigate through the next steps. If you don&#x2019;t have a FamCard yet, what are you waiting for?!!</p><p><em>Got some more questions on FamCard? Drop us an email at </em><a href="mailto:support@fampay.in"><em>support@fampay.in</em></a></p>]]></content:encoded></item><item><title><![CDATA[One-stop solution for all your KYC concerns]]></title><description><![CDATA[Hello there, new to KYC? We have compiled a list of Frequently Asked Questions and answered them to help guide your seamless onboarding process. ]]></description><link>https://blog.famapp.in/blog/one-stop-solution-for-all-your-kyc-concerns/</link><guid isPermaLink="false">5f2a8e9713040f000155ae9a</guid><category><![CDATA[Product]]></category><category><![CDATA[Teens]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Tue, 11 Aug 2020 05:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2020/08/neonbrand-mgYAR7BzBk4-unsplash-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2020/08/neonbrand-mgYAR7BzBk4-unsplash-1.jpg" alt="One-stop solution for all your KYC concerns"><p>Hello there, new to KYC? We have compiled a list of Frequently Asked Questions and answered them to help guide your seamless onboarding process. Here it goes!</p><h2 id="why-do-you-need-to-verify-aadhar-kyc-on-fampay">Why do you need to verify Aadhar KYC on FamPay?</h2><p>It is simple &amp; quick and allows you to get the best features with the best security. As we verify your identity, and also of everyone else who uses FamPay, it makes it all super secure! &#x1F512;</p><p>That&apos;s not all of it!</p><p>On completing your KYC, you are entitled to all the premium features on the FamPay app, such as:</p><ol><li>Payments via your FamCard &#x1F4B3;</li><li>Instant sharing of money with friends and family &#xA0;&#x1F4B0;</li><li>Shop at your favourite stores &#x1F6CD;</li><li>Access to rewards, exciting challenges and discounts on the app! &#x1F911;</li></ol><p>Learn more about the benefits in our <a href="https://blog.famapp.in/blog/fampay-the-solution-to-your-cash-problems/">blog!</a></p><p>Additionally, KYC is also a legal and regulatory requirement to prevent fraud, identity theft, etc.</p><p>To make the process fully secure, FamPay does not store any information that you provide us to verify yourself. Hence, you can be at ease while enjoying all the cool features on the app!</p><p>Since you&apos;ve got all the necessary details on Aadhar KYC now, let&apos;s try to solve some of the issues surrounding it &#x1F4AA;&#x1F3FC;</p><h2 id="i-m-not-sure-which-mobile-number-is-linked-to-my-aadhaar"><strong>I&apos;m not sure which mobile number&#x1F4F1; is linked to my Aadhaar</strong></h2><p>Follow the steps below to clear the confusion!</p><p>Step 1: Visit the <a href="https://resident.uidai.gov.in/verify?ref=blog.famapp.in">Aadhaar Website</a> &#x1F4F2;</p><p>Step 2: Enter your Aadhaar number &#x1F933;&#x1F3FD;</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/08/PicsArt_08-10-02.58.14__01-2.jpg" class="kg-image" alt="One-stop solution for all your KYC concerns" loading="lazy"></figure><p> &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; </p><p>Step 3: The page will show &apos;Verification Complete!&apos;, and the last 3 digits of the number linked to your Aadhaar. &#x1F4AF;</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/08/PicsArt_08-10-03.13.07--1-.jpg" class="kg-image" alt="One-stop solution for all your KYC concerns" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/08/PicsArt_08-10-03.48.13.jpg" class="kg-image" alt="One-stop solution for all your KYC concerns" loading="lazy"></figure><p></p><h2 id="my-aadhaar-is-linked-to-a-mobile-number-which-is-no-longer-in-use"><strong>My Aadhaar is linked to a mobile number which is no longer in use</strong></h2><p>No worries! Here is what you can do:</p><p>Step 1: Visit your nearest <a href="https://appointments.uidai.gov.in/easearch.aspx?ref=blog.famapp.in">Aadhaar Centre</a> &#x1F6FA;<br>( Tip: Use the search by &apos;<strong>State</strong>&apos; option to get a list of all centres in your city)</p><p>Step 2: Ask for Update or Correction form &#x1F516; &#xA0;(or download from <a href="https://uidai.gov.in/images/aadhaar_enrolment_correction_form_version_2.1.pdf?ref=blog.famapp.in">here</a>)</p><p>Step 3: Carry your original Aadhaar Card for verification. Yes, no other documents required!</p><p>Step 4: Submit the form and verify your biometric details. (Yes, the thumb impression!) &#x1F44D;</p><p>Step 5: Collect the acknowledgment slip and wait for 10 days for it to get updated</p><p>Step 6: Treat yourself to an ice-cream &#x1F366; You deserve it &#x1F609;</p><p><strong>Tip:</strong> You can also visit your nearest telecom operator store &#x1F3EA; &#xA0;. Please check with your nearest store if they have the facility to get this done :)</p><h2 id="my-aadhaar-is-not-linked-to-a-mobile-number-yet"><strong>My Aadhaar is not linked to a mobile number yet</strong></h2><p>This process is exactly the same as updating your linked number. Here&apos;s what you need to do:</p><p>Step 1: Visit your nearest <a href="https://appointments.uidai.gov.in/easearch.aspx?ref=blog.famapp.in">Aadhaar Centre</a> &#x1F6FA;<br>( Tip: Use the search by &apos;<strong>State</strong>&apos; option to get a list of all centres in your city)</p><p>Step 2: Ask for Update or Correction form &#x1F516; &#xA0;(or download from <a href="https://uidai.gov.in/images/aadhaar_enrolment_correction_form_version_2.1.pdf?ref=blog.famapp.in">here</a>)</p><p>Step 3: Carry your original Aadhaar Card for verification. Yes, no other documents required!</p><p>Step 4: Submit the form and verify your biometric details. (Yes, the thumb impression!) &#x1F44D;</p><p>Step 5: Collect the acknowledgment slip and wait for 10 days for it get updated</p><p>Step 6: Treat yourself to an ice-cream &#x1F366; You deserve it &#x1F609;</p><p><strong>Tip:</strong> You can also visit your nearest telecom operator store &#x1F3EA; &#xA0;. Please check with your nearest store if they have the facility to get this done</p><h3 id="umm-i-m-still-not-clear-">Umm, I&apos;m still not clear &#x1F615;</h3><p>Not an issue. Our support will come to your rescue! Say <a href="mailto:support@fampay.in">hello@fampay.in</a> &#xA0;&#x1F913;</p><p>You can also dial &#x260E;&#xFE0F; &#xA0;1947 for any kind of Aadhaar Help, or visit their <a href="https://uidai.gov.in/?ref=blog.famapp.in">website</a> &#x1F4F2; &#xA0; for more details</p>]]></content:encoded></item><item><title><![CDATA[FamPay partners with Visa to launch India’s first Doodle Card for GenZ]]></title><description><![CDATA[FamPay has launched India’s first Visa Prepaid Card for teenagers with personalized doodles on it.  Teens will be able to design their own card to reflect their personality, playing with names, fonts and doodles.]]></description><link>https://blog.famapp.in/blog/fampay-partners-with-visa-to-launch-indias-first-doodle-card-for-genz/</link><guid isPermaLink="false">6101241dffcd4300012f60c7</guid><category><![CDATA[Press Release]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Thu, 29 Jul 2021 02:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2021/07/Press-Release-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2021/07/Press-Release-1.png" alt="FamPay partners with Visa to launch India&#x2019;s first Doodle Card for GenZ"><p></p><p><strong>Bengaluru, India, Jul 29th, 2021- </strong>After the successful launch of their numberless FamCard, FamPay has launched India&#x2019;s first Visa Prepaid Card for teenagers with personalized doodles on it. The card will allow teens to make NFC-enabled contactless payments on the Visa network in India. The card will be available in two different designs - the FamCard and FamCard Me. Teens will be able to design their own card to reflect their personality, playing with names, fonts and doodles.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/07/FamPay_FamCard-ME-launch-video-thumbnail_doodles_1920x1080_1-1.jpg" class="kg-image" alt="FamPay partners with Visa to launch India&#x2019;s first Doodle Card for GenZ" loading="lazy" width="1920" height="1080" srcset="https://blog.famapp.in/blog/content/images/size/w600/2021/07/FamPay_FamCard-ME-launch-video-thumbnail_doodles_1920x1080_1-1.jpg 600w, https://blog.famapp.in/blog/content/images/size/w1000/2021/07/FamPay_FamCard-ME-launch-video-thumbnail_doodles_1920x1080_1-1.jpg 1000w, https://blog.famapp.in/blog/content/images/size/w1600/2021/07/FamPay_FamCard-ME-launch-video-thumbnail_doodles_1920x1080_1-1.jpg 1600w, https://blog.famapp.in/blog/content/images/2021/07/FamPay_FamCard-ME-launch-video-thumbnail_doodles_1920x1080_1-1.jpg 1920w" sizes="(min-width: 720px) 720px"></figure><p>With FamPay, teens can make online and offline payments using the FamCard and the FamPay App. The launch of FamCard Me marks yet another innovation in the fintech &#xA0;and card industry, being the first ever doodle card in India. FamPay crossed 2 million registered users within 8 months of its launch and recently raised a Series A funding of $38 Million with Elevation Capital and Sequoia Capital as lead investors.</p><p>&#x201C;If there&apos;s trustworthiness and style in a product, it&apos;s very hard for GenZ to resist it. After launching India&apos;s first numberless card, we decided to up our game in terms of innovation and personalization. Our new series of FamCards powered by Visa would be the most rewarding, sleek, and secure cards in the market for teens&#x201D;, says <strong>Kush Taneja, Co-founder, FamPay.</strong><br></p><p>The FamCard Me will be the first doodle card in India. It will also be the first time Visa forays into numberless cards. Teens can select from a range of 200+ doodles and signature fonts to create unique designs on their FamCard Me. They can also choose to put any name on the card, making it their own card, their own design. Added benefits of the card include 4x rewards on every spend, complimentary subscriptions of teen popular brands and exclusive Visa specific offers. <br></p><p><strong>TR Ramachandran, Group Country Manager, India and South Asia, Visa </strong>said,<strong> </strong>&#x201C;We are delighted to partner with FamPay as they seek to innovatively solve for digital payments for young adults and teenagers who are digital natives, adept at using novel payment methods with ease. These youngsters today are seeking user experiences that are unique and personalized, with card products they can identify with. FamCard Me caters to this growing segment of discerning consumers and we see strong potential in the Indian market. These innovative, numberless payment cards with personalized doodles will appeal to a generation that is seeking the best of innovation and convenience for its payment experience.&#x201D;</p><p>Explaining why FamPay chose doodles for their new FamCard Me,<strong> FamPay Co-founder, Sambav Jain</strong> says, &#x201C;We&#x2019;ve had a user-first approach since day one. Our team is closely connected with our teen community to understand their lifestyle and what they love the most. As GenZs are super unique and quirky - we wanted them to express their story through their card and hence chose doodles. We are calling it the FamCard &quot;Me&quot; as it&apos;s not just personalised, it is their personality.&#x201D; </p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2021/07/WhatsApp-Image-2021-07-28-at-22.47.58.jpeg" class="kg-image" alt="FamPay partners with Visa to launch India&#x2019;s first Doodle Card for GenZ" loading="lazy" width="1280" height="1002" srcset="https://blog.famapp.in/blog/content/images/size/w600/2021/07/WhatsApp-Image-2021-07-28-at-22.47.58.jpeg 600w, https://blog.famapp.in/blog/content/images/size/w1000/2021/07/WhatsApp-Image-2021-07-28-at-22.47.58.jpeg 1000w, https://blog.famapp.in/blog/content/images/2021/07/WhatsApp-Image-2021-07-28-at-22.47.58.jpeg 1280w" sizes="(min-width: 720px) 720px"></figure><p>FamPay rolled out their virtual Visa Cards in May 2021, and more than 2,00,000 users have adopted it in just the first few weeks. Starting today, teens can order the FamCard once their account is set up on the FamPay app. In addition to being doodled and personalized, the FamCard Me also gives exclusive offers and subscriptions to its teen users, the details of which can be found on famcard.me. They can immediately start using their virtual FamCard for online payments, while they wait for their physical cards to arrive. &#xA0;For every card sale, FamPay has &#xA0;pledged a meal for a child in partnership with Feeding India by Zomato. They have also tied up with Give India Foundation to contribute towards Covid-19 relief initiatives, for every card purchased.</p><p>FamPay invests heavily in research and product design to ensure a teen&#x2019;s personal finance journey is smooth sailing. With a number of in-app elements, their goal is to gamify and make the process interactive and fun. Like all other FamPay offerings, the FamCard and the FamCard Me are designed with style while keeping in mind the security of teens. <br></p><p><strong>About Visa</strong></p><p>Visa Inc. (NYSE: V) is the world&#x2019;s leader in digital payments. Our mission is to connect the world through the most innovative, reliable and secure payment network - enabling individuals, businesses and economies to thrive. Our advanced global processing network, VisaNet, provides secure and reliable payments around the world, and is capable of handling more than 65,000 transaction messages a second. The company&#x2019;s relentless focus on innovation is a catalyst for the rapid growth of digital commerce on any device for everyone, everywhere. As the world moves from analog to digital, Visa is applying our brand, products, people, network and scale to reshape the future of commerce. For more information, visit <a href="https://usa.visa.com/about-visa/our_business.html?ref=blog.famapp.in">About Visa</a>,<a href="https://usa.visa.com/visa-everywhere/blog.html?ref=blog.famapp.in"> visa.com/blog</a> and<a href="http://cts.businesswire.com/ct/CT?id=smartlink&amp;url=https%3A%2F%2Ftwitter.com%2FVisaNews&amp;esheet=51583133&amp;newsitemid=20170705005058&amp;lan=en-US&amp;anchor=%40VisaNews&amp;index=4&amp;md5=b694d8213fe5168247dba0ed29ec5da2&amp;ref=blog.famapp.in"> @VisaNews</a>.</p><p><strong>About FamPay</strong><br>FamPay is India&apos;s first online and offline card payments for teenagers. With FamPay and its numberless prepaid card, minors can successfully make online and offline payments without the need to set up a bank account. We aim to raise a new, financially aware generation of Indians who understand the fundamentals of personal finance and are capable of making decisions in their best long term interest.</p><p>FamPay was founded in 2019 by Indian Institute of Technology (IIT) Roorkee Graduates, Kush Taneja and Sambhav Jain while still in college, which makes them the youngest fintech entrepreneurs in India today. They have also been featured on the Forbes 30 under 30 Asia 2021 list. In June 2021, FamPay raised one of India&#x2019;s biggest Series A funding round of $38 Million with Elevation Capital and Sequoia Capital as lead investors. In March 2020, FamPay raised seed funding of US $4.7Mn from Y Combinator, Venture Highway, Sequoia India and Global Founders Capital (GFC). Neeraj Arora, ex-WhatsApp, Twitch cofounder Kevin Lin, Robinhood cofounder Vladimir Tenev, CRED founder Kunal Shah, Pine Labs CEO Amrish Rau also participated in the round.<br></p><p>For more information, visit<a href="http://www.fampay.in/?ref=blog.famapp.in"> www.fampay.in</a></p><p>To know more about FamCard Me, visit <a href="https://famcard.me/?ref=blog.famapp.in">famcard.me</a></p>]]></content:encoded></item><item><title><![CDATA[FamPay amongst LinkedIn’s Top Startups List 2021]]></title><description><![CDATA[FamPay, India’s first payments app for teenages, has been featured in LinkedIn’s Top Startups List of 2021. ]]></description><link>https://blog.famapp.in/blog/fampay-amongst-linkedins-top-startups-list-2021/</link><guid isPermaLink="false">614d4de7ffcd4300012fc712</guid><category><![CDATA[Press Release]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Fri, 24 Sep 2021 05:30:00 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2021/09/Untitled-design--1-.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2021/09/Untitled-design--1-.jpg" alt="FamPay amongst LinkedIn&#x2019;s Top Startups List 2021"><p><strong>Bengaluru, September 24th, 2021: </strong>FamPay, India&#x2019;s first payments app for teenages, has been featured in LinkedIn&#x2019;s Top Startups List of 2021. The annual LinkedIn&#x2019;s Top Startups List covers the most sought after companies of the year, in terms of their work culture, customer experience, employee engagement and investor relations. Being India&#x2019;s first payments App and Card exclusively for teens, &#xA0;FamPay strives to provide financial freedom to GenZ, &#xA0;opening the Fintech industry to a target audience that&#x2019;s never been tapped before.</p><p>FamPay was launched in 2020 by Indian Institute of Technology (IIT) Roorkee Graduates, Kush Taneja and Sambhav Jain while still in college, making them one of the youngest fintech entrepreneurs in India today. A startup that was born in the pandemic, it&#x2019;s seen a staggering growth since its inception with more than 3 &#xA0;million registered users, swiftly gaining the confidence and trust of Indian teens. The company recently completed one of India&#x2019;s biggest Series A fundraise of US$38 million, led by Elevation Capital and major participation from existing investor Sequoia Capital India.</p><p>Commenting on their achievement, <strong>Kush Taneja, Co-Founder, FamPay, </strong>said, &#x201C;We are immensely honoured to be on this list and truly believe that it wouldn&apos;t have been possible without our outstanding team, their constant strive for excellence and the culture they&#x2019;ve created. These factors deeply encourage collective growth, capitalise on curiosity and are entirely led by customer-centricity.&#x201D;</p><p>This prestigious feature is testimonial to all the innovation brewing at FamPay in recent times. In 2021, FamPay partnered with the Visa Network to launch the Visa FamCard - India&#x2019;s first numberless Visa Card exclusively for teens. FamPay followed this successful launch by a set of cards that took personalization to a whole new level with the FamCard Me - India first and only doodle card for teens. To lead this product innovation and strategy, FamPay is looking to hire for multiple roles across various verticals.</p><p><strong>Sambhav Jain, Co-Founder,</strong> said,<strong> </strong>&#x201C;Kush and I have been following this prestigious list and the startups it has featured in the past since its inception. It is tremendously humbling for our entire Fam to be featured here. Over the past few months, we have welcomed some phenomenal leaders and passionate folks onto the team who have made this possible.&#x201D;</p><p>Growing 10x from a 6 member team to today a 60+ members team, the common goal of enabling financial independence for teens is etched in the team&#x2019;s work ethic. This recognition reaffirms FamPay&#x2019;s belief in the mission and vision that drives the people and the culture of the company.</p><p><strong>About LinkedIn Top Startup List:</strong></p><p>The LinkedIn Top Startups list is derived from a blended score looking at factors including employment growth, engagement with the company and its employees, job interest, and the ability to attract top talent, and is informed by the billions of actions taken by more than 645+ million members on LinkedIn.</p><p>The Top Startups list is a part of the LinkedIn List franchise, an ongoing editorial series that celebrates professionals and companies making an impact in the professional world. To see the full list of the LinkedIn Top Startups, click here:</p><p><strong>About FamPay:</strong></p><p>FamPay is building India&#x2019;s first neo-bank for teens. With FamPay and its numberless prepaid card, minors can successfully make online and offline payments without the need to set up a bank account. With our app and our numberless card, minors can safely and successfully make online and offline payments without the need to set up a bank account. We aim to raise a new, financially aware generation of Indians who understand the fundamentals of personal finance and are capable of making decisions in their best long term interest.</p><p>FamPay was launched in 2020 by Indian Institute of Technology (IIT) Roorkee Graduates, Kush Taneja and Sambhav Jain while still in college, which makes them one of the youngest fintech entrepreneurs in India today. They have also been featured on the Forbes 30 under 30 Asia 2021 list.<br><br></p><p><strong>Media Contacts:</strong></p><p>Priya Bellani, e: priyaa@80-db.com, + 91 9818151107</p><p>Anika Sahni, e: anika@80-db.com, +91 9810648763</p><p>For more information<strong>, </strong>visit<a href="http://www.fampay.in/?ref=blog.famapp.in"> www.fampay.in</a></p><p><strong>Important Links:</strong></p><p><strong>App - get.fampay.in</strong></p><p><strong>Website - fampay.in</strong></p><p><strong>Hiring - join.fampay.in</strong><br></p>]]></content:encoded></item><item><title><![CDATA[What makes FamPay secure? 🔐]]></title><description><![CDATA[Read this blog to know why and how FamPay is the most safe and secure neo-bank for teens!]]></description><link>https://blog.famapp.in/blog/what-makes-fampay-secure/</link><guid isPermaLink="false">5fe9e1ea11e54b00016d21eb</guid><category><![CDATA[Product]]></category><category><![CDATA[Teens]]></category><dc:creator><![CDATA[FamApp Tech Team]]></dc:creator><pubDate>Wed, 13 Jan 2021 10:30:10 GMT</pubDate><media:content url="https://blog.famapp.in/blog/content/images/2020/12/Flash-PIN.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.famapp.in/blog/content/images/2020/12/Flash-PIN.jpg" alt="What makes FamPay secure? &#x1F510;"><p><em>A card app? For teens?! </em></p><p>We don&apos;t blame you (or your parents) for thinking twice about how much trust they can put in FamPay. &#x1F914; We all know just how important security is, especially when it comes to trusting someone, or <em>something</em> with your money. That&apos;s why we&apos;ve written this blog.</p><p>Allow us to explain exactly why and how FamPay is <strong>the most safe and secure neo-bank for teens!</strong></p><h3 id="we-are-partnered-with-an-rbi-regulated-entity-ppi-issuer-">We are partnered with an RBI regulated entity PPI issuer &#x1F3E6;</h3><p>By partnering with a bank, we are allowing the best of the best payments and financial services to be provided through our app and prepaid card. As the bank takes care of important backend processes, we work on allowing our users to have the best experience with us.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/12/partner2.gif" class="kg-image" alt="What makes FamPay secure? &#x1F510;" loading="lazy" width="266" height="157"></figure><h3></h3><h3 id="fampay-doesn-t-require-linking-of-bank-account-">FamPay doesn&apos;t require linking of bank account &#x1F6AB;&#x1F517;</h3><p>The FamPay account is reloadable and requires you to load money into your account before you can spend it. It is not linked with any bank account, meaning until you have loaded money into the FamPay app, you will not be able to spend it. The FamCard also works in the same way. This way, you can always be assured that extra money can never be deducted from your bank account, and that you have the liberty to set spending limits for yourself.</p><figure class="kg-card kg-image-card"><img src="https://blog.famapp.in/blog/content/images/2020/12/wowww2.gif" class="kg-image" alt="What makes FamPay secure? &#x1F510;" loading="lazy" width="500" height="207"></figure><p></p><h3 id="there-are-no-hidden-charges-and-no-minimum-balance-">There are no hidden charges, and no minimum balance &#x1F911;</h3><p>With FamPay, you can have the assurance that your money won&apos;t magically disappear in the form of hidden charges! There is also no minimum balance that you are required to maintain in your FamPay account, which makes it all the more convenient. </p><h3 id="the-famcard-is-numberless-">The FamCard is numberless &#x1F4B3;</h3><p>The FamCard has no numbers on the physical card, which makes it very secure. The card number and other details (expiry date, CVV) are stored securely within the FamPay app instead of being printed on the physical card. There&#x2019;s no fear of card information getting misused in case it gets stolen or lost and the card can be paused, blocked and managed at your fingertips on the app. Additionally, the card details within the app can be accessed only with device lock such as fingerprint, face ID, pattern lock or PIN.</p><p>You can<a href="https://blog.famapp.in/blog/everything-you-need-to-know-about-our-numberless-card/"> click here</a> to know more about our numberless FamCard!</p><figure class="kg-card kg-embed-card"><iframe width="267" height="200" src="https://www.youtube.com/embed/tqBiHY6Cvyw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p></p><h3 id="built-by-iit-grads-believed-by-the-best-">Built by IIT grads, believed by the best &#x1F468;&#x200D;&#x1F4BB;&#x1F468;&#x200D;&#x1F4BB;</h3><p>With an itch to inculcate the value of money in the youth of India, and lead them towards financial literacy, Sambhav Jain and Kush Taneja founded FamPay immediately after graduating from IIT Roorkee. The founding team started with 6 IITians, and has now encompassed over 50 members from across the country. FamPay is also backed and trusted by Sequoia, Y Combinator, and several noteworthy investors such as Kunal Shah (Founder of Cred), Kevin Lin (Co-founder of Twitch), Neeraj Arora (Ex-WhatsApp), and more!</p><p>Read more about our founders&apos; journey <a href="https://blog.famapp.in/blog/fampay-raises-4-7m-from-y-combinator-sequoia-venture-highway-others/">here</a>. &#xA0; </p><h3 id="our-team-is-constantly-working-on-handling-errors-">Our team is constantly working on handling errors &#x1F9B9;&#x200D;&#x2640;</h3><p>The reconciliation team works tirelessly to take care of any transactions that get stuck. We are aware of how frustrating such a situation can be, which is why we&apos;ve got our best minds solving such issues. In case of any payment issues, our team takes care of the payment manually, so you can be assured that your money is still safe. This includes refunding any failed transactions within 5-7 working days.</p><p><a href="https://blog.famapp.in/blog/why-do-online-payments-get-stuck-and-what-can-you-do/">Click here</a> to know more about payment issues and how our team works on fixing them.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.famapp.in/blog/why-do-online-payments-get-stuck-and-what-can-you-do/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Why do online payments get stuck and what can you do? &#x1F914;</div><div class="kg-bookmark-description">Why do online payments get stuck and what can you do? Tiara from Finance at FamPay is here to help you understand this.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.famapp.in/blog/favicon.png" alt="What makes FamPay secure? &#x1F510;"><span class="kg-bookmark-author">UnRead by FamPay</span><span class="kg-bookmark-publisher">Tiara D&#x2019;Souza</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.famapp.in/blog/content/images/2020/12/Tiara--Blog-3.png" alt="What makes FamPay secure? &#x1F510;"></div></a></figure><h3 id="our-customer-support-is-here-to-help-">Our Customer Support is here to help &#x1F9B8;&#x200D;&#x2640;&#xFE0F;</h3><p>If you ever face any issues, do not worry as our customer support is always available and ready to assist you.</p><p>For basic queries, you can refer to the FAQs section found in the app, as well as on our<a href="https://fampay.in/?ref=blog.famapp.in"> website</a>. In case you are stuck and your query is still not solved, you can reach out to us on email (<a href="https://blog.famapp.in/blog/p/a463cb7a-e989-41f1-8e8f-2bac780d50fd/support@fampay.in">support@fampay.in</a>), or talk to us through chat support available on the app.</p><hr><p>And that&apos;s it! Now you can take comfort in the fact that your money and information will always be safe with FamPay. &#x2764;&#xFE0F; Go ahead and share this piece with your friends and family to help ease any anxiety they may have in relation to making payments on our app. You&apos;d be doing them a favour. &#x1F917;</p>]]></content:encoded></item></channel></rss>