[{"content":"","date":"22 November 2025","externalUrl":null,"permalink":"/","section":"AgamDevLabs","summary":"","title":"AgamDevLabs","type":"page"},{"content":"","date":"22 November 2025","externalUrl":null,"permalink":"/mira/","section":"Miras","summary":"","title":"Miras","type":"mira"},{"content":"Effective Date: December 25, 2025\nMira (“we”, “our”, “us”) is a private journaling application designed to help you reflect, write, and gain insights in a safe and respectful environment. Privacy is a core principle of Mira.\nThis Privacy Policy explains how your information is handled.\n1. How Your Data Is Stored # iCloud Storage \u0026amp; Sync # Your journal entries and personal data are stored locally on your device Optional syncing is handled entirely through Apple iCloud Data is associated with your Apple ID, not with Mira accounts We do not store your journal content on our servers Mira does not maintain its own backend database for journal content.\n2. Information You Create # Journal Content # Journal entries Moods, tags, categories AI companion selections App preferences Your journal content is:\nPrivate by default Not visible to other users Not accessible to Mira as readable content 3. Automatically Collected Information # To improve app stability and performance, Mira collects limited, non-personal technical data:\nDevice type and OS version App usage events (anonymized) Crash logs and performance diagnostics This data does not include journal content.\n4. Third-Party Services # Mira uses the following services:\nApple iCloud # Used for:\nSecure storage of journal data Syncing across your Apple devices Data is protected under Apple’s privacy and security policies.\nFirebase (Google LLC) # Used for:\nAnonymous analytics Crash reporting Performance monitoring Firebase does not store or access journal content.\nOpenAI # Used to generate AI-assisted insights and responses.\nPortions of journal text may be securely sent to OpenAI APIs only when AI insights are requested Content is used solely to generate responses Journal content is not used to train AI models AI processing is ephemeral and request-based RevenueCat # Used for:\nSubscription management Purchase validation Entitlement tracking RevenueCat does not access journal content.\n5. How We Use Information # We use limited information to:\nProvide journaling and AI features Sync data through iCloud Manage subscriptions Improve app reliability and performance We do not sell, share, or monetize your journal content.\n6. Data Retention \u0026amp; Deletion # Journal data remains on your device and iCloud You can delete entries at any time Deleting the app removes local data iCloud data removal follows Apple’s iCloud deletion policies 7. Your Rights # Depending on your region, you may have rights to:\nAccess your data Delete your data Control syncing via iCloud settings Most controls are available directly within the app or iOS settings.\n8. Children’s Privacy # Mira is not intended for children under 13. We do not knowingly collect data from children.\n9. Changes to This Policy # This Privacy Policy may be updated from time to time. Changes will be reflected with a revised effective date.\n10. Contact Us # If you have questions about this Privacy Policy, contact us at:\nEmail: support@agamdevlabs.com\n","date":"22 November 2025","externalUrl":null,"permalink":"/mira/privacy/","section":"Miras","summary":"","title":"Privacy Policy","type":"mira"},{"content":"We’re here to help.\nIf you have questions, feedback, or need assistance with Mira, feel free to reach out. We aim to keep support simple, respectful, and human.\n📧 Contact Support # For all support-related queries, please email:\nsupport@agamdevlabs.com\nThis includes help with:\nApp usage or features AI companions and insights Subscriptions and billing Bug reports or unexpected behavior Feedback or suggestions 🔒 Privacy \u0026amp; Data Questions # Mira is designed to be private by default.\nJournal data is stored locally and synced via Apple iCloud We do not store your journal content on our servers If you have any questions about privacy or data handling, you can contact us at the same email address.\n⏱ Response Time # We do our best to respond within 1–2 business days.\n🌱 Feedback Welcome # Mira is built with care and is constantly evolving.\nThoughtful feedback is always appreciated.\nThank you for using Mira.\n","date":"22 November 2025","externalUrl":null,"permalink":"/mira/support/","section":"Miras","summary":"","title":"Support","type":"mira"},{"content":" Terms and Conditions # Effective Date: December 25, 2025\nWelcome to Mira. By using the Mira application (“App”), you agree to these Terms and Conditions (“Terms”).\n1. Acceptance of Terms # By accessing or using Mira, you agree to these Terms. If you do not agree, please do not use the App.\n2. Description of Service # Mira provides a private journaling experience with optional AI-assisted insights.\nJournal data is stored locally and synced via Apple iCloud Mira does not host journal content on its own servers Some features require internet access (AI insights, subscriptions) 3. User Responsibilities # You agree to:\nUse Mira for personal, lawful purposes Not misuse or interfere with the App Be responsible for your journal content You retain full ownership of your content.\n4. AI-Generated Content Disclaimer # AI-generated insights are provided for reflection only.\nThey do not constitute medical, legal, or psychological advice Mira does not guarantee accuracy of AI responses You are responsible for how you use AI-generated content 5. Subscriptions \u0026amp; Payments # Mira Plus # Mira offers optional subscriptions via the Apple App Store and RevenueCat.\nMonthly and yearly plans Auto-renewing unless canceled Pricing varies by region You can manage subscriptions through your App Store account.\n6. Free Plan # The free version includes limited features, such as:\nUp to two AI companions Basic insights Feature availability may change.\n7. Intellectual Property # All rights to the App (excluding your content) are owned by Mira.\nYou may not copy, reverse-engineer, or redistribute the App.\n8. Termination # We may suspend access if these Terms are violated.\nYou may stop using Mira at any time.\n9. Limitation of Liability # To the fullest extent permitted by law:\nMira is provided “as is” We are not liable for indirect or consequential damages We are not responsible for data loss due to device or iCloud issues 10. Privacy # Your use of Mira is governed by the Privacy Policy.\n11. Changes to Terms # Terms may be updated. Continued use implies acceptance of updates.\n12. Contact Information # For questions regarding these Terms:\nEmail: support@agamdevlabs.com\n","date":"22 November 2025","externalUrl":null,"permalink":"/mira/terms/","section":"Miras","summary":"","title":"Terms and Conditions","type":"mira"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/posts/","section":"","summary":"","title":"","type":"posts"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/haircare/","section":"Tags","summary":"","title":"Haircare","type":"tags"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/hairwise/","section":"Tags","summary":"","title":"HairWise","type":"tags"},{"content":" We’re thrilled to announce that HairWise is now officially available on the App Store! 🎉\nHairWise empowers you to make informed, intelligent haircare decisions through AI-powered ingredient analysis — giving you instant, personalized insights into how every product works for your hair.\n🌿 What Is HairWise? # HairWise is an iOS-native app that uses OpenAI’s GPT-5 vision capabilities to analyze hair product ingredient lists from a simple photo.\nThe app reads and interprets complex cosmetic ingredients, then delivers an instant compatibility score and clear, science-based breakdown of how those ingredients interact with your hair type, texture, and scalp condition.\nWhether you’re choosing a new shampoo, comparing conditioners, or managing scalp sensitivity — HairWise helps you decode the label, understand the formula, and choose confidently.\nHairWise — AI Ingredient Scanner for Smarter Haircare # 🧠 How It Works # Build Your Hair Profile\nStart with a guided onboarding quiz that captures your hair type, texture, porosity, scalp condition, and main concerns.\nHairWise uses this data to create a personalized hair profile, ensuring every analysis is uniquely tailored to you.\nScan Any Product Instantly\nSnap a photo of a product’s ingredient list or upload one from your gallery.\nOur AI reads and analyzes ingredients with precision, identifying everything from nourishing oils to potential irritants.\nGet Your Compatibility Report\nReceive a detailed breakdown with:\nA compatibility score (0–100%) Highlighted best and risky ingredients Pro/con takeaways and usage tips AI explanations and product recommendations Save and Compare Scans\nView your past scans in your local library — searchable, filterable, and private.\nNo account required. No cloud storage. Your data stays on your device.\n🔬 Powered by AI, Built for Privacy # HairWise leverages advanced AI from OpenAI, app infrastructure from Firebase, and subscription management via RevenueCat — all under a privacy-first design.\nAll scans and profiles are stored locally on your device, ensuring that your personal hair data never leaves your phone.\nNo login. No data sharing. Just science, transparency, and better haircare.\n💎 Free and Premium Access # Free users: Get one detailed scan to try the AI analysis. Premium members: Unlock unlimited scans, personalized reports, saved favorites, and premium ingredient intelligence. Subscriptions are managed through the App Store with weekly and yearly plans, powered by RevenueCat.\n✨ Perfect For # Curious consumers who want to know what’s in their products People seeking sulfate-free or silicone-free haircare Those with scalp sensitivity or ingredient allergies Beauty enthusiasts who love transparency and science-backed insights 📲 Download HairWise # HairWise is now live on the App Store!\nScan smarter. Shop confidently. Care for your hair with clarity.\n👉 Download HairWise on the App Store\n💬 Join the HairWise Community # We’re just getting started.\nIf you have feedback, feature ideas, or product requests, reach out at support@agamdevlabs.com.\nFollow our journey as we continue to make beauty simpler, smarter, and powered by AI.\nHairWise — Smart Ingredient Analysis for Healthier Hair.\n","date":"6 November 2025","externalUrl":null,"permalink":"/posts/hairwise-app-launch/","section":"","summary":"","title":"Introducing HairWise — Your AI Hair Product Ingredient Scanner","type":"posts"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/ios-app/","section":"Tags","summary":"","title":"IOS App","type":"tags"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/product-launch/","section":"Tags","summary":"","title":"Product Launch","type":"tags"},{"content":"","date":"6 November 2025","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2 November 2025","externalUrl":null,"permalink":"/hairwise/","section":"Hairwises","summary":"","title":"Hairwises","type":"hairwise"},{"content":" Privacy Policy for HairWise # Effective Date: November 2, 2025\nLast Updated: November 2, 2025\nIntroduction # HairWise (\u0026ldquo;we,\u0026rdquo; \u0026ldquo;our,\u0026rdquo; or \u0026ldquo;us\u0026rdquo;) values your privacy. This Privacy Policy explains how we collect, use, and protect your information when you use the HairWise mobile application (the \u0026ldquo;App\u0026rdquo;).\nHairWise helps users analyze hair product ingredients and receive AI-powered insights about compatibility with their hair type.\nInformation We Collect # 1. Information You Provide # Ingredient Photos or Scans # When you use HairWise to scan hair product ingredient lists, the app may take or upload photos. These photos are securely sent to our AI service (OpenAI) for ingredient analysis. Photos are processed temporarily and are not stored permanently on our servers. The images remain stored locally on your device for your scan history. Hair Profile Data # During onboarding, you can create a personalized hair profile (e.g., hair type, texture, porosity, scalp condition, and concerns). This information is stored locally on your device and helps generate personalized recommendations. Account and Subscription Information # You may optionally create an account to sync or restore purchases. Subscriptions are managed through RevenueCat and the App Store. We do not collect or store your payment card information. 2. Information Automatically Collected # Device Information # Device type and model Operating system version App version Anonymous device identifier Usage Analytics # Features you use within the app Frequency of usage and app performance data Error logs and crash reports (via Firebase Crashlytics) HairWise does not collect personal identifiers like your name, email, or phone number.\nHow We Use Your Information # AI Ingredient Analysis # To process scanned photos or ingredient text and provide personalized compatibility insights. To suggest product recommendations based on your hair profile. App Improvement # To fix bugs and improve performance. To analyze feature usage (aggregated, anonymous). Subscription Management # To verify your subscription or free scan status through RevenueCat. Analytics and Diagnostics # To monitor app performance and crashes via Firebase. Third-Party Services # We use trusted third-party services that may collect limited technical data:\nService Purpose Data Collected Privacy Policy Firebase (Google LLC) Analytics \u0026amp; crash reporting Anonymous usage data, crash logs, device info https://firebase.google.com/support/privacy OpenAI Ingredient text/image analysis Photos or text you submit for processing (temporary) https://openai.com/privacy RevenueCat Subscription management Anonymous subscription status, device ID https://www.revenuecat.com/privacy Apple App Store Payment processing Payment details (handled by Apple) https://www.apple.com/legal/privacy/ Data Storage and Security # Local Storage # All your hair profile, scan history, and analysis results are stored locally on your device. We do not store personal data or images on our servers. Uninstalling the app permanently deletes all locally stored data. Data Security # All communication with external services (Firebase, OpenAI, RevenueCat) is encrypted via HTTPS. No personal identifiers are shared with these services. Your Rights and Choices # Data Deletion # Since HairWise does not store your personal data on our servers, uninstalling the app deletes all local data. Analytics and Permissions # You can disable analytics in device privacy settings. You can choose whether to allow camera and photo access for ingredient scanning. Subscription Cancellation # Subscriptions can be canceled anytime in your App Store settings. Children # HairWise is not intended for children under 13. We do not knowingly collect personal data from children.\nChanges to This Policy # We may update this Privacy Policy periodically. Updates will be published in the app and on our website, with a new \u0026ldquo;Last Updated\u0026rdquo; date.\nContact Us # If you have questions or concerns about this Privacy Policy or our data practices, please contact us:\nEmail: support@agamdevlabs.com App Support: https://agamdevlabs.com/hairwise/support/ Summary of Key Points # ✅ Local storage only – Your scans and hair profile stay on your device. ✅ No permanent photo storage – Images are processed temporarily via OpenAI. ✅ Anonymous analytics – Only technical data for crash and performance monitoring. ✅ Secure processing – All data sent through encrypted HTTPS. ✅ Optional account and subscription – Managed securely via RevenueCat and the App Store. ","date":"2 November 2025","externalUrl":null,"permalink":"/hairwise/privacy/","section":"Hairwises","summary":"","title":"Privacy Policy","type":"hairwise"},{"content":" HairWise — Support # Thanks for using HairWise! If you need help, have feedback, or want to request data deletion, you can reach us below.\nQuick Help # My scan didn’t work correctly # Ensure the ingredient list is well-lit, in focus, and fully visible. Try scanning again. Check that the app has permission to use the camera and photo library. Free and Premium Access # HairWise offers one free scan for new users. Subscribers get unlimited scans and deeper ingredient analysis. Subscriptions are managed through the App Store via RevenueCat. Data \u0026amp; Privacy # All your data (hair profile, scans, analysis) stays locally on your device. You can delete all data anytime by uninstalling the app. Contact Us # Email: support@agamdevlabs.com\n(Response typically within 48 hours.) Report an Issue or Suggest a Feature # We welcome feedback and bug reports! Please include:\nApp version (found in Settings → About HairWise) Short description of the issue or suggestion Screenshots if helpful Thank you for helping us make HairWise better 💚\n— The HairWise Team\n","date":"2 November 2025","externalUrl":null,"permalink":"/hairwise/support/","section":"Hairwises","summary":"","title":"Support","type":"hairwise"},{"content":" Terms and Conditions # Last updated: November 2, 2025\nWelcome to HairWise. These Terms and Conditions (\u0026ldquo;Terms\u0026rdquo;) govern your use of the HairWise mobile application and any related services (collectively, the \u0026ldquo;Service\u0026rdquo;) provided by HairWise (\u0026ldquo;we,\u0026rdquo; \u0026ldquo;us,\u0026rdquo; or \u0026ldquo;our\u0026rdquo;). By accessing or using the Service, you agree to be bound by these Terms and our Privacy Policy. If you do not agree, please do not use the Service.\n1. Eligibility # You must be at least 13 years old (or the minimum age of digital consent in your jurisdiction) to use the Service. By using the Service, you represent that you meet this requirement and have the legal capacity to enter into a binding agreement.\n2. Purpose of the Service # HairWise is designed to help you understand how hair product ingredients may affect your unique hair type and scalp condition using public ingredient databases, scientific sources, and artificial intelligence analysis. The Service is provided for educational and informational purposes only and is not a substitute for professional medical advice, diagnosis, or treatment.\n3. Medical Disclaimer # HairWise is not a medical application. We do not offer medical advice, diagnoses, or treatment recommendations. Always consult a licensed healthcare provider, dermatologist, or trichologist before making decisions about your hair care, skin care, or overall health. Never disregard professional advice or delay seeking it because of information obtained through the Service.\n4. No Guarantee of Accuracy # Ingredient evaluations, compatibility scores, and product match reports are generated using artificial intelligence and may incorporate third-party data. While we strive for accuracy and relevancy, the results may not reflect your personal sensitivities, allergies, medical history, or the most current clinical research. You assume full responsibility for any decisions you make based on the information provided by the Service.\n5. User Responsibilities # By using the Service, you agree to:\nProvide accurate information about your hair type, scalp condition, and product usage when prompted. Use the information from the Service at your own discretion and risk. Immediately discontinue use of any product that causes irritation, discomfort, or adverse reactions, and seek professional advice if necessary. 7. Subscription and Payments # HairWise offers both free and premium features. Subscription details, pricing, and billing terms are presented within the app prior to purchase. All fees are non-refundable except as required by applicable law or as stated in our refund policy. You can manage or cancel subscriptions through your platform\u0026rsquo;s billing settings.\n8. Acceptable Use # You agree not to:\nUse the Service for any unlawful, harmful, or misleading purpose. Reverse-engineer, decompile, or modify the Service. Interfere with the Service\u0026rsquo;s security or integrity, including attempting to gain unauthorized access to systems or networks. Upload or transmit any malicious code, viruses, or harmful scripts. We reserve the right to suspend or terminate access if you violate these Terms.\n9. Intellectual Property # HairWise, including its content, design, trademarks, logos, and software, is owned by Aldrin Thivyanathan or its licensors. You are granted a limited, non-exclusive, non-transferable license to use the Service for personal, non-commercial purposes. You may not reproduce, distribute, or create derivative works without our explicit written permission.\n10. Third-Party Services # The Service may reference or link to third-party products, databases, or websites. These references are provided for convenience and informational purposes. We do not endorse, control, or assume responsibility for third-party content or services, and your use of them is at your own risk.\n11. Disclaimer of Warranties # THE SERVICE IS PROVIDED \u0026ldquo;AS IS\u0026rdquo; AND \u0026ldquo;AS AVAILABLE\u0026rdquo; WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED. TO THE MAXIMUM EXTENT PERMITTED BY LAW, WE DISCLAIM ALL WARRANTIES, INCLUDING BUT NOT LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, AND NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SERVICE WILL BE UNINTERRUPTED, ERROR-FREE, OR FREE OF HARMFUL COMPONENTS.\n12. Limitation of Liability # TO THE MAXIMUM EXTENT PERMITTED BY LAW, AGAM DEV LABS AND ITS OFFICERS, DIRECTORS, EMPLOYEES, AND AFFILIATES SHALL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF PROFITS, DATA, OR GOODWILL, ARISING FROM YOUR USE OF OR RELIANCE ON THE SERVICE. YOUR SOLE REMEDY FOR DISSATISFACTION WITH THE SERVICE IS TO STOP USING IT.\n13. Indemnification # You agree to indemnify, defend, and hold harmless Agam Dev Labs and its affiliates from any claims, liabilities, damages, losses, or expenses (including reasonable attorneys\u0026rsquo; fees) arising from your violation of these Terms or misuse of the Service.\n14. Changes to the Service and Terms # We may modify, suspend, or discontinue the Service (or any part of it) at any time without prior notice. We may also update these Terms periodically. When we do, we will revise the \u0026ldquo;Last updated\u0026rdquo; date at the top of this page. Continued use of the Service after any changes constitutes your acceptance of the revised Terms.\n15. Termination # We reserve the right to terminate or suspend your access to the Service at our discretion, without notice, for conduct that we believe violates these Terms or is harmful to the Service, other users, or our business interests.\n16. Governing Law # These Terms are governed by and construed in accordance with the laws of the jurisdiction in which Agam Dev Labs is established, without regard to conflict of law principles. Any disputes will be resolved in the competent courts of that jurisdiction.\n17. Contact Us # If you have questions or concerns about these Terms or the Service, please contact us at:\nEmail: support@hagamdevlabs.com App Support: [https://agamdevlabs.com/hairwise/support/](https://agamdevlabs.com/hairwise/support/) By using HairWise, you acknowledge that you have read, understood, and agree to these Terms and Conditions.\n","date":"2 November 2025","externalUrl":null,"permalink":"/hairwise/terms/","section":"Hairwises","summary":"","title":"Terms and Conditions","type":"hairwise"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/app-launch/","section":"Tags","summary":"","title":"App Launch","type":"tags"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/hiking/","section":"Tags","summary":"","title":"Hiking","type":"tags"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/ios/","section":"Tags","summary":"","title":"IOS","type":"tags"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/mountains/","section":"Tags","summary":"","title":"Mountains","type":"tags"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/outdoor/","section":"Tags","summary":"","title":"Outdoor","type":"tags"},{"content":"","date":"17 October 2025","externalUrl":null,"permalink":"/tags/peakid/","section":"Tags","summary":"","title":"PeakID","type":"tags"},{"content":"There’s something magical about mountains.\nThey stand tall, mysterious, and timeless — each one with its own story. But how often have you looked at a distant peak and wondered: What mountain is that?\nThat question is exactly where PeakID began.\nPeakID — Shazam for Mountains The Idea Behind PeakID # While hiking in the Himalayas last year, I kept pulling out my phone, trying to find names of the peaks around me. Most apps needed manual searching, coordinates, or didn’t work offline. It felt like there should be a simpler way — something like Shazam, but for mountains.\nSo we built one.\nPeakID uses on-device AI to recognize mountains from your camera or photos in seconds — and then tells you everything about them: the name, range, elevation, geology, and even what makes each peak unique.\nExploring with AI # Using PeakID feels a bit like uncovering hidden stories in the landscape.\nJust open the app, point at a mountain, and let the AI do the rest. It identifies the peak and shares details — from height and prominence to rock type and local weather — all right on your screen.\nIt even works offline, using GPS data and cached elevation maps, so you can use it far from cell towers or Wi-Fi.\nYour Personal Mountain Journal # One of my favorite parts of PeakID is History. Every peak you identify is stored locally on your device — no accounts, no cloud sync, no data collection. It becomes a quiet, personal logbook of your mountain adventures.\nWhether it’s your first weekend hike or a major summit, you can revisit every identification later and relive the journey.\nBuilt for Curious Explorers # PeakID isn’t just for climbers — it’s for anyone who loves the outdoors.\nMaybe you’re photographing landscapes, teaching your kids about geography, or just curious during a road trip — the app gives context and wonder to what you see.\nIt’s part guidebook, part science teacher, and part travel companion.\nAvailable Now # PeakID is now live on the App Store.\nIf you’ve ever found yourself gazing at a distant peak and wondering about its name, its story, or its height — now you’ll have the answer, instantly.\nDownload PeakID and start exploring the world’s mountains — one summit at a time.\n→ Get PeakID on the App Store\n","date":"17 October 2025","externalUrl":null,"permalink":"/posts/peakid_launch_announcement/","section":"","summary":"","title":"PeakID — Shazam for Mountains","type":"posts"},{"content":"","date":"8 October 2025","externalUrl":null,"permalink":"/peakid/","section":"PeakIds","summary":"","title":"PeakIds","type":"peakid"},{"content":" Privacy Policy for PeakID # Effective Date: October 15, 2025\nLast Updated: October 15, 2025\nIntroduction # PeakID (\u0026ldquo;we,\u0026rdquo; \u0026ldquo;our,\u0026rdquo; or \u0026ldquo;us\u0026rdquo;) is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard your information when you use the PeakID mobile application (the \u0026ldquo;App\u0026rdquo;).\nInformation We Collect # 1. Information You Provide # Mountain Photos\nWhen you use PeakID to identify mountains, you may take or upload photos These photos are sent to our servers for AI-powered mountain identification Photos are processed temporarily and are not stored permanently on our servers Photos remain on your device in your local app storage Anonymous Usage\nPeakID does not require you to create an account or provide personal information You can use all core features of the app anonymously We do not collect your name, email address, phone number, or other personal identifiers 2. Information Automatically Collected # Device Information\nDevice type and model Operating system version App version Unique device identifier (anonymous) Usage Analytics\nFeatures you use within the app Frequency of app usage App performance data Error logs and crash reports Location Information (Optional)\nIf you grant permission, we may access GPS data embedded in your photos (EXIF data) This location data is used only to improve mountain identification accuracy Location data is sent to our AI service for processing and is not stored permanently You can use the app without providing location access 3. Payment Information # Payment transactions are processed through Apple\u0026rsquo;s App Store We use RevenueCat to manage subscriptions We do not collect or store your payment card information RevenueCat receives anonymous subscription status information to manage your access to premium features How We Use Your Information # We use the collected information for the following purposes:\nMountain Identification\nTo process your photos using AI technology and identify mountains To provide you with detailed information about identified peaks App Improvement\nTo analyze app performance and fix bugs To understand which features are most useful to our users To improve the accuracy of our mountain identification service Subscription Management\nTo verify your subscription status To provide access to premium features To process subscription renewals and cancellations Analytics and Diagnostics\nTo monitor app crashes and performance issues To gather anonymous usage statistics To improve user experience Third-Party Services # We use the following third-party services that may collect information:\nFirebase (Google LLC) # Purpose: Analytics and crash reporting Data Collected: Anonymous usage data, crash logs, device information Privacy Policy: https://firebase.google.com/support/privacy OpenAI # Purpose: AI-powered mountain identification Data Collected: Photos you submit for identification, optional location data Data Retention: Temporary processing only, not stored permanently Privacy Policy: https://openai.com/privacy RevenueCat # Purpose: Subscription management Data Collected: Anonymous subscription status, device identifier Privacy Policy: https://www.revenuecat.com/privacy Apple App Store # Purpose: Payment processing Data Collected: Payment information (handled entirely by Apple) Privacy Policy: https://www.apple.com/legal/privacy/ Data Storage and Security # Local Storage\nAll your identified peaks, collections, and personal notes are stored locally on your device This data is not uploaded to our servers or cloud storage If you delete the app, this local data will be permanently deleted Data Security\nWe use industry-standard security measures to protect data during transmission All communications between the app and our servers are encrypted using HTTPS We implement Firebase Authentication for secure API access Data Retention\nMountain photos are processed in real-time and are not stored on our servers Analytics and crash data are retained according to Firebase\u0026rsquo;s retention policies (typically 60 days) Subscription information is retained as long as you have an active subscription Your Rights and Choices # Location Permissions\nYou can choose whether to grant location access to improve identification accuracy You can modify location permissions at any time in your device settings The app functions fully without location access Analytics\nYou can opt out of analytics tracking through your device settings (Settings → Privacy → Analytics \u0026amp; Improvements) Data Deletion\nSince we don\u0026rsquo;t store your personal data on our servers, uninstalling the app removes all local data Subscription Cancellation\nYou can cancel your subscription at any time through the App Store Cancellation takes effect at the end of your current billing period Children PeakID is not intended for children under 13. We do not knowingly collect personal data from children.\nChanges to This Privacy Policy # We may update this Privacy Policy from time to time. We will notify you of any changes by:\nPosting the new Privacy Policy in the app Updating the \u0026ldquo;Last Updated\u0026rdquo; date at the top of this policy You are advised to review this Privacy Policy periodically for any changes.\nData Transfers # Your information may be transferred to and processed in countries other than your country of residence. These countries may have data protection laws that are different from the laws of your country. By using PeakID, you consent to such transfers.\nContact Us # If you have any questions or concerns about this Privacy Policy or our privacy practices, please contact us:\nEmail: support@agamdevlabs.com\nApp Support: https://agamdevlabs.com/peakId/support/\nSummary of Key Points # ✅ No account required - Use the app anonymously ✅ Local storage only - Your peaks and collections stay on your device ✅ Photos not stored - Images are processed temporarily and not saved on our servers ✅ Optional location - Location access improves accuracy but is not required ✅ Anonymous analytics - We collect usage data to improve the app, but it\u0026rsquo;s not linked to you personally ✅ Secure processing - All data transmission is encrypted ✅ Third-party services - We use Firebase, OpenAI, and RevenueCat as disclosed above By using PeakID, you agree to this Privacy Policy.\nPeakID\nMountain Identification Made Simple\n","date":"8 October 2025","externalUrl":null,"permalink":"/peakId/privacy/","section":"PeakIds","summary":"","title":"Privacy Policy","type":"peakid"},{"content":" PeakID — Support # Thanks for using PeakID! If you need help, have feedback, or want to request data deletion, use one of the options below.\nQuick help # My photo wasn’t recognized\nTry taking a photo from a different angle, ensure the mountain occupies most of the frame, and try again. Make sure the app has permission to access your Photos and (optionally) Location. Subscription \u0026amp; billing\nAll subscriptions are managed by the App Store via RevenueCat. For billing issues, contact Apple Support or check your App Store subscriptions. Contact us # Email: support@agamdevlabs.com (Expect a response within 48 hours.) Report an issue / Suggest a feature # We welcome bug reports and suggestions. Please include:\nApp version (Settings → About), A short description of the problem or suggestion, Screenshots if helpful. Thanks for helping make PeakID better!\n— The PeakID Team\n","date":"8 October 2025","externalUrl":null,"permalink":"/peakId/support/","section":"PeakIds","summary":"","title":"Support","type":"peakid"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/categories/announcements/","section":"Categories","summary":"","title":"“Announcements”","type":"categories"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/tags/fintech/","section":"Tags","summary":"","title":"“Fintech”","type":"tags"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/tags/indie/","section":"Tags","summary":"","title":"“Indie”","type":"tags"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/tags/mobile/","section":"Tags","summary":"","title":"“Mobile”","type":"tags"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/tags/parenting/","section":"Tags","summary":"","title":"“Parenting”","type":"tags"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/categories/personal/","section":"Categories","summary":"","title":"“Personal”","type":"categories"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/tags/product/","section":"Tags","summary":"","title":"“Product”","type":"tags"},{"content":"","date":"16 September 2025","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"I can\u0026rsquo;t believe I\u0026rsquo;m actually typing these words, but my app Kash just got approved by Apple and is live in the App Store! 🎉\nYou know that feeling when you\u0026rsquo;ve been working on something for months, refreshing your email way too often, and then suddenly there it is? That approval notification hit differently. All those late nights tweaking button colors and wondering if anyone would actually want this thing suddenly felt worth it.\nKash helps kids track their savings Why I even built this thing\nMoney was never really explained to me growing up. Like, at all. Fast forward to having kids of my own, and I kept thinking there had to be a better way to teach them about money without it being this huge, overwhelming thing. What if learning about saving and spending could actually be\u0026hellip; fun?\nThat\u0026rsquo;s where Kash came from. I wanted something simple enough that I wouldn\u0026rsquo;t dread using it as a parent, but engaging enough that my kids would actually care. Three things mattered most to me:\nKeep it simple. Nobody has time for complicated setup or confusing interfaces.\nMake it friendly. Enter Kash the Koala, who basically became the app\u0026rsquo;s cheerleader. Kids respond so much better when learning feels like play instead of a lecture.\nRespect privacy. Everything stays on your device. No ads popping up, no data getting sold. Just you and your family.\nWhat the app actually does\nThink of it as a digital allowance manager that doesn\u0026rsquo;t suck. You can set up allowance schedules, track when money comes in and goes out, and help kids work toward saving goals. The progress bars and Kash\u0026rsquo;s little encouragements make it feel more like a game than a chore.\nParents can add or subtract money based on real life situations, which honestly ends up being some of the best teaching moments.\nThe messy middle part\nBuilding this wasn\u0026rsquo;t just about code (though there was plenty of that). I spent way too much time picking colors, redesigning the dashboard about fifteen times, and figuring out how to make everything feel warm instead of sterile.\nThe Apple review process? Let\u0026rsquo;s just say I may have refreshed my email more times than I care to admit. But going through it taught me so much about building something that actually meets people where they are.\nWhat\u0026rsquo;s coming next\nThis is just version one. I\u0026rsquo;m already sketching out more poses for Kash (kids love when he celebrates their wins), thinking about achievement badges, and maybe even a watch app for older kids.\nThe real test is what happens when families actually start using it. I\u0026rsquo;m planning to iterate fast based on what works and what doesn\u0026rsquo;t in the real world.\nWant to try it?\nIf you\u0026rsquo;re curious or think this might help your family, you can check it out here: https://kash-app.netlify.app/\nAnd honestly? I\u0026rsquo;d love to know what you think. Whether it\u0026rsquo;s a bug you found, an idea for making it better, or just how your kids reacted to Kash the Koala, shoot me an email at kash@agamdevlabs.com. I read everything.\nGetting this thing approved feels like a small dream coming true, but also like the real work is just starting. Thanks to everyone who encouraged me when I wasn\u0026rsquo;t sure this would ever see the light of day. More experiments coming soon! 🚀\nAldrin ","date":"16 September 2025","externalUrl":null,"permalink":"/posts/allowance-tracker-kash-app-store-launch/","section":"","summary":"","title":"From late-night coding to App Store approval - Allowance Tracker - Kash is finally here.","type":"posts"},{"content":"Teaching kids about money doesn’t have to be complicated — in fact, it can be fun, interactive, and rewarding.\nWith Allowance Tracker: Kash, parents can simplify allowance tracking and teach kids the value of budgeting and saving from an early age.\nIn this guide, we’ll explore 5 fun and easy ways to help your kids learn money management while making the process enjoyable for the whole family.\n1. Start with a Piggy Bank # A piggy bank is one of the easiest and most fun ways to introduce kids to saving.\nLet them drop coins and watch their savings grow — this builds patience and a sense of ownership.\n💡 Pro Tip: With Allowance Tracker: Kash, kids can also track their savings digitally and see progress in real time.\nUnderstand your child\u0026#39;s spending habits at a glance. 2. Use a Digital Allowance System # Cash allowances are great, but kids today grow up in a digital-first world.\nUsing a digital allowance app like Allowance Tracker: Kash helps you:\nSchedule weekly or monthly allowances Automatically track balances Set clear savings goals Build healthy budgeting habits Digital allowances are a modern solution to teaching kids financial literacy.\nEasily schedule weekly or monthly allowances. 3. Teach Budgeting with Real-Life Scenarios # Turn shopping trips into learning opportunities.\nGive your child a budget and let them decide what to buy — this teaches them to compare prices, prioritize, and make better spending decisions.\n📊 With Allowance Tracker: Kash, you can log every purchase and categorize expenses so your kids see exactly where their money goes.\n4. Create a Wishlist for Savings Goals # Kids learn best when they have tangible goals.\nEncourage them to create a wishlist of the toys, gadgets, or games they want.\nInside Allowance Tracker: Kash:\nKids can set a savings goal Track how many more allowances they need Link purchases directly to wishlist items This turns saving money into a fun, motivating journey.\nHelp kids save for what they love. 5. Celebrate Small Wins 🏆 # Positive reinforcement goes a long way.\nWhenever your child saves enough for a goal or manages their allowance well, celebrate their achievement.\n🎉 Whether it’s a high-five, a special outing, or unlocking a new avatar in Allowance Tracker: Kash, recognition keeps them excited to learn and save more.\nWhy Use Allowance Tracker: Kash? 🚀 # ✅ Track unlimited children ✅ Set recurring allowances ✅ Manage purchases effortlessly ✅ Encourage savings with wishlists ✅ Visualize spending with charts \u0026amp; analytics ✅ Customizable avatars \u0026amp; themes make it fun for kids Allowance Tracker: Kash isn’t just an app — it’s a tool to help parents raise financially responsible kids.\nFinal Thoughts 💡 # Teaching kids about money early builds lifelong habits.\nBy combining real-world lessons with digital tools like Allowance Tracker: Kash, you can make money management fun, easy, and impactful.\n👉 Start today — download Allowance Tracker: Kash and help your kids become smart savers!\nDownload Allowance Tracker: Kash 🚀\n","date":"6 September 2025","externalUrl":null,"permalink":"/posts/teach-kids-about-money/","section":"","summary":"","title":"5 Fun and Easy Ways to Teach Kids About Money","type":"posts"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/tags/allowances/","section":"Tags","summary":"","title":"Allowances","type":"tags"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/categories/financial-literacy/","section":"Categories","summary":"","title":"Financial Literacy","type":"categories"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/tags/financial-literacy/","section":"Tags","summary":"","title":"Financial Literacy","type":"tags"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/tags/kids-finance/","section":"Tags","summary":"","title":"Kids Finance","type":"tags"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/tags/money-management/","section":"Tags","summary":"","title":"Money Management","type":"tags"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/categories/parenting/","section":"Categories","summary":"","title":"Parenting","type":"categories"},{"content":"","date":"6 September 2025","externalUrl":null,"permalink":"/tags/parenting/","section":"Tags","summary":"","title":"Parenting","type":"tags"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/ios-development/","section":"Tags","summary":"","title":"IOS Development","type":"tags"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/race-conditions/","section":"Tags","summary":"","title":"Race Conditions","type":"tags"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/state-management/","section":"Tags","summary":"","title":"State Management","type":"tags"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/swiftui/","section":"Tags","summary":"","title":"Swiftui","type":"tags"},{"content":" The Problem (Again!) # In my previous post, I covered how using .sheet(item:) solves the classic nil-value race condition in SwiftUI sheets. But recently, while working on the wishlist feature in my AllowanceIQ app, I discovered that even .sheet(item:) can have race conditions if you\u0026rsquo;re not careful.\nHere\u0026rsquo;s what my \u0026ldquo;improved\u0026rdquo; code looked like after applying the lessons from my first post:\n@State private var selectedWishlistItem: WishlistItemDomain? @State private var showingWishlistDetail = false @State private var showingEditWishlistItem = false // Button taps WishlistItemCard( onTap: { selectedWishlistItem = item showingWishlistDetail = true }, onEdit: { selectedWishlistItem = item showingEditWishlistItem = true } ) // Single sheet with conditional logic .sheet(item: $selectedWishlistItem) { item in if showingEditWishlistItem { EditWishlistItemView(wishlistItem: item) } else if showingWishlistDetail { WishlistDetailView(wishlistItem: item) } } Looks reasonable, right? I\u0026rsquo;m using .sheet(item:) as recommended, and the item is guaranteed to be non-nil. But users reported that tapping on wishlist items sometimes showed a blank sheet!\nThe Subtle Race Condition # Here\u0026rsquo;s what was happening:\nUser taps a wishlist item card selectedWishlistItem = item (triggers sheet presentation immediately) Sheet closure executes with current boolean state: showingWishlistDetail = false showingWishlistDetail = true (but it\u0026rsquo;s too late - sheet already rendered) Result: Neither condition is true, so the sheet shows nothing Even though we\u0026rsquo;re using .sheet(item:), the conditional logic inside the sheet closure is still subject to state timing issues.\nThe Solution: Multiple Dedicated Sheets # The fix is to abandon conditional logic inside sheets entirely and use dedicated sheets for each use case:\n@State private var selectedWishlistItemForDetail: WishlistItemDomain? @State private var selectedWishlistItemForEdit: WishlistItemDomain? // Simplified button callbacks WishlistItemCard( onTap: { selectedWishlistItemForDetail = item }, onEdit: { selectedWishlistItemForEdit = item } ) // Two dedicated sheets - no conditional logic! .sheet(item: $selectedWishlistItemForDetail) { item in WishlistDetailView(wishlistItem: item) } .sheet(item: $selectedWishlistItemForEdit) { item in EditWishlistItemView(wishlistItem: item) } What changed:\nEach sheet has its own dedicated state variable No boolean flags or conditional logic inside sheet closures Each callback sets exactly one state variable SwiftUI handles the rest automatically Why This Pattern is Superior # ✅ Reliability # No race conditions between multiple state updates Each sheet has a single, clear trigger condition State changes are atomic and predictable ✅ Clarity # Intent is obvious: \u0026ldquo;this state shows detail sheet, that state shows edit sheet\u0026rdquo; No complex conditional logic to debug Easy to reason about sheet presentation logic ✅ Maintainability # Adding new sheet types doesn\u0026rsquo;t complicate existing logic Each sheet\u0026rsquo;s state is independent Easier to test and debug individual flows ✅ Performance # SwiftUI can optimize sheet presentation more effectively No unnecessary condition evaluations on every state change Cleaner view invalidation patterns The Anti-Pattern to Avoid # // ❌ DON\u0026#39;T DO THIS - Conditional logic in sheet(item:) .sheet(item: $selectedItem) { item in if someBoolean { ViewA(item: item) } else if anotherBoolean { ViewB(item: item) } else { ViewC(item: item) } } // ✅ DO THIS - Dedicated sheets .sheet(item: $selectedItemForA) { item in ViewA(item: item) } .sheet(item: $selectedItemForB) { item in ViewB(item: item) } .sheet(item: $selectedItemForC) { item in ViewC(item: item) } Updated Best Practices # Building on my previous post, here\u0026rsquo;s the complete guidance:\nLevel 1: Basic Sheet with Data # // ✅ Use sheet(item:) instead of isPresented + separate state .sheet(item: $selectedItem) { item in DetailView(item: item) } Level 2: Multiple Sheet Types # // ✅ Use dedicated state variables, not conditional logic .sheet(item: $itemForDetail) { item in DetailView(item: item) } .sheet(item: $itemForEdit) { item in EditView(item: item) } .sheet(item: $itemForShare) { item in ShareView(item: item) } Level 3: Complex Flows # // ✅ Consider navigation or coordinator patterns for complex flows @State private var navigationPath = NavigationPath() NavigationStack(path: $navigationPath) { // Your main view } Updated Summary Table # Pattern Reliability Clarity When to Use .sheet(isPresented:) with data ❌ Race-prone ❌ Confusing Never for data passing .sheet(item:) with conditionals ⚠️ Race-prone ⚠️ Complex Never Multiple .sheet(item:) ✅ Reliable ✅ Clear Most cases NavigationStack ✅ Reliable ✅ Clear Complex flows TL;DR # Even with .sheet(item:), avoid conditional logic inside the sheet closure. Instead, use multiple dedicated state variables and separate .sheet(item:) modifiers. It\u0026rsquo;s more reliable, clearer, and follows SwiftUI\u0026rsquo;s intended patterns.\nThe rule is simple: One sheet type = One state variable = One .sheet() modifier\nPart of a series on SwiftUI state management pitfalls. See Part 1 for the basics of .sheet(item:) vs .sheet(isPresented:).\nHappy (race-condition-free) coding!\n","date":"1 August 2025","externalUrl":null,"permalink":"/posts/swiftui-sheet-state-pitfall-part2/","section":"","summary":"","title":"SwiftUI Sheet Pitfall Part 2: Why Conditional Logic Inside sheet(item:) Still Fails","type":"posts"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/swiftui-sheets/","section":"Tags","summary":"","title":"Swiftui Sheets","type":"tags"},{"content":" The Problem # Recently, while working on my AllowanceIQ app, I ran into a classic SwiftUI gotcha that I think a lot of folks will recognize. I had a view with a button that, when tapped, should open a sheet and pass in a value (in my case, a TransactionType). But sometimes, the value I passed in was nil—even though I’d just set it!\nHere’s what my code looked like:\n@State private var preselectedTransactionType: TransactionType? = nil @State private var showingTransactionEntry = false Button(\u0026#34;Record Purchase\u0026#34;) { preselectedTransactionType = .purchase showingTransactionEntry = true } .sheet(isPresented: $showingTransactionEntry) { TransactionEntryView(preselectedTransactionType: preselectedTransactionType) } Looks fine, right? But when I tapped the button, preselectedTransactionType was sometimes nil inside the sheet. What gives?\nThe SwiftUI State Update Race # The culprit is how SwiftUI batches state updates. When you set two state variables in a row, like this:\npreselectedTransactionType = .purchase showingTransactionEntry = true SwiftUI doesn’t guarantee the first update is visible to the rest of your view before the second one triggers the sheet. So, the sheet can open while preselectedTransactionType is still nil.\nThe Solution: .sheet(item:) to the Rescue # After some head-scratching (and a few “why is this nil?!” print statements), I remembered that SwiftUI has a better way: .sheet(item:).\nHere’s how you use it:\n@State private var preselectedTransactionType: TransactionType? Button(\u0026#34;Record Purchase\u0026#34;) { preselectedTransactionType = .purchase } .sheet(item: $preselectedTransactionType) { type in TransactionEntryView(preselectedTransactionType: type) } What’s happening here?\nThe sheet is only presented when preselectedTransactionType is not nil. The value is passed directly into the sheet’s content closure as type. When the sheet is dismissed, SwiftUI automatically sets preselectedTransactionType back to nil. No more race conditions. No more nils. Just clean, reliable state.\nWhy This Works # .sheet(item:) is designed for exactly this use case: presenting a sheet when you have a value, and passing that value in. It guarantees the value is always up-to-date when the sheet appears. It’s less error-prone and more readable than juggling multiple state variables. Summary Table # Approach Sheet Triggered By Value Passed to Sheet Risk of Outdated Value? .sheet(isPresented:) Boolean Must read from state Yes .sheet(item:) Optional value Passed as parameter No TL;DR # If you ever find yourself passing data into a SwiftUI sheet and sometimes getting nil, switch to .sheet(item:). It’s the idiomatic, bug-free way to present sheets with data in SwiftUI.\nHappy coding!\n","date":"11 March 2019","externalUrl":null,"permalink":"/posts/swiftui-sheet-state-pitfall/","section":"","summary":"","title":"SwiftUI Sheet State Pitfall: Why Is My State Nil? (And How to Fix It)","type":"posts"},{"content":"","externalUrl":null,"permalink":"/aboutme/","section":"AgamDevLabs","summary":"","title":"About Me","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]