video content http://feed.informer.com/digests/IXOCOEVQJK/feeder video content Respective post owners and feed distributors Thu, 26 May 2016 12:57:40 +0000 Feed Informer http://feed.informer.com/ #WeArePlay: Meet the founder making breast cancer awareness simple and accessible http://android-developers.googleblog.com/2025/10/weareplay-meet-founder-making-breast.html Android Developers Blog urn:uuid:c495743d-9859-7789-45aa-ab450943217d Thu, 16 Oct 2025 17:24:20 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em><div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="display: block; margin: auto;" /></a> In our latest <a href="https://play.google.com/console/about/weareplay/">#WeArePlay</a> film, which celebrates the people behind apps and games on Google Play, we meet Corrine, the founder of <a href="https://play.google.com/store/apps/details?id=com.knowyourlemons.app&amp;hl=en_GB&amp;gl=US">Know Your Lemons</a>. After losing family and friends to breast cancer, she used her skills as a designer to create a simple, visual, and accessible way to educate people about breast cancer. Discover how her award-winning app is changing the conversation around breast cancer and saving lives worldwide.<span><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="403" src="https://www.youtube.com/embed/pGMUe3_Xn2g" width="100%" youtube-src-id="pGMUe3_Xn2g"></iframe></div></span><h2 style="text-align: left;">Your mission is deeply personal. What inspired you to create the app and use lemons?</h2>In my early 20s, I lost both my grandmothers and a close friend to breast cancer, which made me look for information about the disease. As a graphic designer, I knew I could improve the educational materials available by creating something more effective.<br /><br />That’s where the lemons come in. I was searching for a universal symbol and discovered that lemons have features like nipples and pores, like a breast. The idea was perfected when a radiologist explained that a cancerous lump is usually hard, like a lemon seed. It gave us a simple, friendly, and visually clear way to talk about a scary topic and explain the 12 signs of breast cancer so that everyone can understand.<span><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="&quot;Google Sans&quot;, sans-serif" style="background-color: #ffd966; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="2160" data-original-width="3840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik44Y2BRnkkbe-9IfXms3LRt49por7GWj-qjsE3OvGCRqxq3l6PC8o2hqe-Cs6PtdtelPGfvelOL2yW4i1dhUsLlpOL7H9BDxl-X88Ly3iRH-5wJv3_zosVcOwTIFb33uNS8i7pktJUOg6E-NCIsa4JkttaQBlRPgdtHfbQc9eRFVikcr7ye3p_hot5hk/s16000/IMAGE%201%20-%2011_US_KNOW%20YOUR%20LEMONS_APP.jpg" /></div><br /></span><p></p><h2 style="text-align: left;">How has Know Your Lemons helped cultural conversations around breast cancer?</h2>Our mission is to start conversations. We found that it’s easier to say, "Hey, have you seen these lemons?" than, "Do you know the symptoms of breast cancer?" Our app opens the door to these crucial, life-saving discussions.<br /><br />For example, a woman in an African village with breast cancer had been ostracized because her community thought she was cursed. One day, she saw one of our volunteers giving a talk using our visuals and recognized her own condition. Not only did we help get her into treatment, but our team returned to her village to teach everyone that cancer is a disease, not a curse.<br /><br />We also heard of a boyfriend who found our visual of the 12 signs of breast cancer on social media and showed it to his girlfriend. Weeks later, she noticed a lump and, remembering the visual, pushed her doctors for a check-up. She was diagnosed with breast cancer and started treatment—all because her boyfriend found our posts.<p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="&quot;Google Sans&quot;, sans-serif" style="background-color: #ffd966; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"></span></p><img border="0" data-original-height="4553" data-original-width="6830" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiuVyrMmX46DMMxhXhZkQRnJijhzy9GOniokmy43AwtqEF0vTAq3Bh0WCBS-tqMysg5SkEaqS8uM8yosXTb-A7abckvd71NS3rCF13YT45LoD9FlplbYgyO29mp1p0VQinomdHYtYVEAtgr9QtfH6V-VyNWT6BXGsgXVxkAfhWj19kbGpvm1WJdYZaqA/s16000/07_US_KNOW%20YOUR%20LEMONS_FOUNDER_CORRINE%20ELLSWORTH-BEAUMONT.jpg" /><br /><br /><p></p><h2 style="text-align: left;">How does your app and the ‘Lemonistas’ work together to spread awareness?</h2>To spread our mission, we use a two-part approach that combines powerful technology with a human touch.<br /><br />First, the Know Your Lemons app acts as a complete guide in your pocket. It has our visual self-exam guide that makes finding a lump easier. To bring that education to life, we have over 1,200 trained volunteers called “Lemonistas”. They go into their communities to teach hands-on classes using digital presentations and physical props, like a model of a lemon with a lump inside. Our partners in Tanzania, for example, have seen women come to their clinic at stage one or two instead of stage four. They estimate that 12 lives were saved in 18 months, which shows how our tools in the hands of passionate volunteers can make a life-saving difference.<h2 style="margin-top: 24px; text-align: left;">How has being on Google Play helped your mission?</h2>It’s really about making this accessible to people. One of the best reviews we ever got started as a one-star review. A user couldn't sign in because of a bug. We fixed it and replied to her comment on the Play Store. A couple of months later, she changed her review to five stars because our app had helped her find her breast cancer. She said the way we explained the self-exam made all the difference. That ability to connect directly with users on the Play Store is so important; without it, she might not have found it until it was too late.<p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="&quot;Google Sans&quot;, sans-serif" style="background-color: #ffd966; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="2160" data-original-width="3840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimvZ_AwRq72h9Dkyid4AlBuj8OfZt4Mg4uM5CF4UUBXRonJ2aG48XBdWnxeDk0VOovFS5oq_p4flKqfG3yh6BzA3naNrkNYXN5XK2mCxMbM5GCLKTgevzcaNsSasNXvNnr7hpeyrsk3gkF7C9Yz9w5HiI9KCzGwcGfbvOX7zTBUWl_pgmrjZ1bM3UirKs/s16000/IMAGE%203%20-%2009_US_KNOW%20YOUR%20LEMONS_APP.jpg" /></div><br /><p></p><h2 style="text-align: left;">The app is always evolving. What is next for Know Your Lemons?</h2>We recently added a feature for companies to offer a breast health benefit to their employees, which helps them get on the right screening plan and connects them to resources like genetic counseling. The next big feature we’re adding is an AI-powered matchmaking tool for newly diagnosed patients. It will connect them with patient advocacy organizations that are specific to their needs—whether it’s a certain type of breast cancer or support for parents with young children. Most patients don't know these resources exist, so we bring the help directly to them.<span face="&quot;Google Sans&quot;, sans-serif" style="color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> Discover other inspiring app and game founders featured in </span><a href="https://play.google.com/console/about/weareplay/" style="text-decoration-line: none;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">#WeArePlay</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></div><br /><br /> Android Developers Beyond Single Features: Guaranteeing Feature Combinations With CameraX 1.5 http://android-developers.googleblog.com/2025/10/beyond-single-features-guaranteeing.html Android Developers Blog urn:uuid:14271442-f1b0-98d0-4ba6-5274c85d2690 Wed, 15 Oct 2025 16:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdKZJWeAG1NLt_drizPTpby3qK3h6_-yZs8dQuPD6_Ccl2v9TO7k0QlnMJmJfCu0Zdd4CWxa_ejoDBReEQ2QPQ2WL5VpJV0f-Ebno_LAlG6AfAUU-npUBUa0PeddoF6nSUfv7-w48Nt66aPh9-ARZyoSz5IPaVKCaGQc5mStTOMM55gulDdxPXIpnwHNQ/s1600/%5B25%5D-Android-CameraX-Feature--Meta%20%281%29.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdKZJWeAG1NLt_drizPTpby3qK3h6_-yZs8dQuPD6_Ccl2v9TO7k0QlnMJmJfCu0Zdd4CWxa_ejoDBReEQ2QPQ2WL5VpJV0f-Ebno_LAlG6AfAUU-npUBUa0PeddoF6nSUfv7-w48Nt66aPh9-ARZyoSz5IPaVKCaGQc5mStTOMM55gulDdxPXIpnwHNQ/s1600/%5B25%5D-Android-CameraX-Feature--Meta%20%281%29.png" style="display: none;" /> <em>Posted by Tahsin Masrur - Software Engineer </em> <div style="overflow-x: hidden;"> <img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWIR-L1Z8sSvqMLiBULRr0BDQ6A7jBHKgFZxE3bsJATPHSW5WtaH2qfG8lF4V-cu-M6C9Nhv-fMTUXjQTdzyqmg-1rP6ZFd1Twnij_-2UOQ4JtkaE5RS6FpLnWMxxOUjXzwGHQNJvSk7HklH93Uz-f8iyNmBlratv5FoN9iRn-KMWGST668JBKg7B9RLg/s1600/%5B25%5D-Android-CameraX-Feature_blog%20%281%29.png" style="display: block; margin: auto;" />&nbsp; &nbsp;&nbsp;<span id="docs-internal-guid-2d4523d6-7fff-d76a-cea6-c46da80130dc"><div><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "></span> </div></span> <span id="docs-internal-guid-cda997d3-7fff-d202-d0fd-10482c9f4fad"><p dir="ltr" style="margin-bottom: 10pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">Modern camera apps are defined by powerful, overlapping features. Users expect to record video with stunning HDR, capture fluid motion at 60 FPS, and get buttery-smooth footage with Preview Stabilization—often all at the same time.</span></p><p dir="ltr" style="margin-bottom: 10pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">As developers, we know the reality is more complicated. How can you guarantee that a specific device actually supports a given combination? Until now, enabling multiple features was often a gamble. You could check for individual feature support, but combining them could lead to undefined behavior or, worse, a failed camera session.&nbsp; This uncertainty forces developers to be conservative, which prevents users on capable devices from accessing the best possible experience.</span></p><p dir="ltr" style="margin-bottom: 10pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">For instance, very few premium devices reliably support HDR and 60 FPS video simultaneously. Consequently, most apps avoid enabling both at once to prevent a poor user experience on the majority of phones.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">To address this, we're introducing </span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; ">Feature Group in CameraX</span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "> - a new API designed to eliminate this guesswork. You can now query whether a specific combination of features is supported </span><span face="&quot;Google Sans&quot;, sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">before</span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "> configuring the camera, or simply tell CameraX your priorities and let it enable the best-supported combination for you.</span></p><h2 style="margin-bottom: 6pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1a73e8; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 500; vertical-align: baseline; ">For Those New to CameraX</span></h2><p dir="ltr" style="margin-bottom: 6pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">Before we dive into the new Feature Group API, let's quickly recap what CameraX is. CameraX is a Jetpack support library, built to help you make camera app development easier. It provides a consistent and easy-to-use API surface that works across most Android devices, with backward-compatibility to Android 6.0 (API level 23). If you are new to CameraX, we recommend checking out the </span><a href="https://developer.android.com/media/camera/camerax" style="text-decoration-line: none;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; ">official documentation</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "> and trying the </span><a href="https://developer.android.com/codelabs/camerax-getting-started#0" style="text-decoration-line: none;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; ">codelab</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "> to get started.</span></p><h2 style="margin-bottom: 12pt; margin-top: 12pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1a73e8; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 500; vertical-align: baseline; ">What You Can Build with the Feature Group API</span></h2><p dir="ltr" style="margin-bottom: 10pt; margin-top: 12pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">You no longer need to gamble on feature combinations and can confidently deliver the best possible camera experiences – like simultaneous HDR and 60 FPS video on capable hardware (e.g. a Pixel 10 Pro) – while gracefully avoiding errors on devices that can't support the combination.</span></p><p dir="ltr" style="margin-bottom: 10pt; margin-top: 12pt;"><br /></p> <div style="display: flex; gap: 4px;"><div style="width: 50%;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEgdG7DknVOXdEX56tqQ_eaCzAFbhcYVhGbR-kwB-u4F2Zp7PQgDR8S_LWWxbEWkxQi5x2ASg0DoS6rR4ZrO4B0YF1EP79UNFAzoNgTusZtA02lM96QmwG_AmyY7EWaEWl4tUYWEyWXZbsH5K-cKQyHEHbF225jg0Kw3JaGQzTNKoG18TrpNR8zd6BHs6bQ" /><center><em>Pixel 10 Pro enabling both HDR and 60 FPS simultaneously</em></center></div><div style="width: 49.5%;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEia3VC6X6f3zH6d1PknR0FAoYZ5FwUj2FxpBjrURLzaVyw0swtHktRjBCliZMa5dx5wRvKeWPLfkgIJVGfPGTqdxNHESHnH5tWys6BQny7XfMJiOfJV-KeebJG51WcY37d4sAoaz-fsMb1Qq0m0abjrp15m_yK4xyKQV047KNI1M8HhpsCTVo3pKGTi3Qg" /><center><em>On an older device where HDR and 60 FPS can't run simultaneously, only HDR is enabled while the 60 FPS option is disabled.</em></center></div></div> <div align="center" dir="ltr" style="margin-left: 0pt;"><br /></div><p dir="ltr" style="margin-bottom: 10pt; margin-top: 12pt;"><span style="text-align: left; ">With the Feature Group API, you can:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: &quot;Google Sans&quot;, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; "><p dir="ltr" role="presentation" style="margin-bottom: 10pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Build smarter, dynamic UIs:</span><span> Intelligently enable or disable settings in your UI based on real-time hardware support. For example, if a user enables HDR, you can instantly gray out and disable the 60 FPS option if the combination isn't supported on that device.&nbsp;</span></p></li></ul><p dir="ltr" style="margin-bottom: 10pt; margin-top: 12pt; text-align: center;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgPVdkqej7WWha6xukDWd-w7-3qrRF4-nvVJb6BU3YtzV_9v2vOKonV6TSUObcZBfumKpTFw9Ol3FEotO_ANTAMXg-8TqurS4LYvqAdlCKcj_M4njj64XrWWbuuWFgufRKSuIEVJcWnos9OZjMhoVED7PggQ2scPfhaPMhG4iYPHxT_N_JG9BrO6lUowUc" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="129" data-original-width="540" src="https://blogger.googleusercontent.com/img/a/AVvXsEgPVdkqej7WWha6xukDWd-w7-3qrRF4-nvVJb6BU3YtzV_9v2vOKonV6TSUObcZBfumKpTFw9Ol3FEotO_ANTAMXg-8TqurS4LYvqAdlCKcj_M4njj64XrWWbuuWFgufRKSuIEVJcWnos9OZjMhoVED7PggQ2scPfhaPMhG4iYPHxT_N_JG9BrO6lUowUc=s16000" /></a></div><p></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: &quot;Google Sans&quot;, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; "><p dir="ltr" role="presentation" style="margin-bottom: 10pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Deliver a reliable "High-Quality" mode: </span><span>Configure the camera with a prioritized list of desired features. CameraX automatically finds and enables the best-supported combination for any given device, ensuring a great result without complex, device-specific logic.</span></p></li><li aria-level="1" dir="ltr" style="font-family: &quot;Google Sans&quot;, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; "><p dir="ltr" role="presentation" style="margin-bottom: 10pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Prevent camera session failures:</span><span> By verifying support beforehand, you prevent the camera from attempting to configure an unsupported combination, eliminating a common source of crashes and offering a smooth user experience.</span></p></li></ul><h2 style="margin-bottom: 6pt; margin-top: 10pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1a73e8; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 500; vertical-align: baseline; ">How It Works: The Core Components</span></h2><p dir="ltr" style="margin-bottom: 6pt; margin-top: 0pt;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">The new API is centered around key additions to </span><a href="https://developer.android.com/reference/androidx/camera/core/SessionConfig" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; ">SessionConfig</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; "> and </span><a href="https://developer.android.com/reference/androidx/camera/core/CameraInfo" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; ">CameraInfo</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; ">.</span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -12pt; vertical-align: baseline; "><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/reference/androidx/camera/core/featuregroup/GroupableFeature" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">GroupableFeature</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: This API introduces a set of predefined groupable features, such as </span><a href="https://developer.android.com/reference/androidx/camera/core/featuregroup/GroupableFeature#HDR_HLG10()" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">HDR_HLG10</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, </span><a href="https://developer.android.com/reference/androidx/camera/core/featuregroup/GroupableFeature#FPS_60()" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">FPS_60</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, </span><a href="https://developer.android.com/reference/androidx/camera/core/featuregroup/GroupableFeature#PREVIEW_STABILIZATION()" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">PREVIEW_STABILIZATION</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, and </span><a href="https://developer.android.com/reference/androidx/camera/core/featuregroup/GroupableFeature#IMAGE_ULTRA_HDR()" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">IMAGE_ULTRA_HDR</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. Due to computational limitations, only a specific set of features can be grouped with the high degree of reliability this API provides. </span><span face="&quot;Google Sans&quot;, sans-serif" style="background-color: white; color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We are actively working to expand this list and will introduce support for more features in future releases.</span><span><br /><br /></span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; margin-left: -12pt; vertical-align: baseline; "><p dir="ltr" role="presentation" style="margin-bottom: 10pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">New </span><a href="https://developer.android.com/reference/androidx/camera/core/SessionConfig" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">SessionConfig</span></a><span face="&quot;Google 60 FPS Android Camera Camera2 CameraX Feature Combination Feature Group HDR High Speed Recording Preview Stabilization SessionConfig Birna A Look Into Customizable HTML Select Elements https://www.hongkiat.com/blog/customizing-html-select-elements-guide/ hongkiat.com urn:uuid:d7502434-aa6f-1170-40ca-4277ce63c97c Wed, 15 Oct 2025 13:00:56 +0000 <p>The &#60;select&#62; element is one of the most common form controls on the web, but it has always been one of the hardest to style. That’s because browsers just let the OS decide how it looks, especially for the dropdown list and arrow icon. While this approach keeps the design consistent with native apps, it&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/customizing-html-select-elements-guide/">A Look Into Customizable HTML Select Elements</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>The <code>&lt;select&gt;</code> element is one of the most common form controls on the web, but it has always been one of the hardest to style. That’s because browsers just let the OS decide how it looks, especially for the dropdown list and arrow icon.</p> <p>While this approach keeps the design consistent with native apps, it also means the appearance can vary a lot across devices and browsers. If you wanted a custom design, you often had to rebuild the whole thing from scratch using JavaScript libraries like <a href="https://react-spectrum.adobe.com/react-aria/components.html" target="_blank" rel="noopener noreferrer">React Aria</a> or <a href="https://ui.shadcn.com" target="_blank" rel="noopener noreferrer">Shadcn UI</a>. This added more code to maintain, and often could lead to accessibility issues and slower performance.</p> <p>Now, thanks to a new HTML standard, there are better ways to style the <code>&lt;select&gt;</code> element without the trade-offs. Let’s take a look at how it works.</p> <hr> <h2>What’s in the new standard?</h2> <p>This new standard introduces a new <code>&lt;selectedcontent&gt;</code> element which allows you to define custom content for the selected option in a <code>&lt;select&gt;</code> dropdown, including adding some HTML instead of just text.</p> <p>The standard also specifies a new CSS property value, <code>appearance: base-select;</code>. This <code>base-select</code> value tells the browser to remove all its default operating system styling and use a very minimal base styles instead.</p> <p>Along with this CSS property, it also introduces a new pseudo-element, <code>::picker(select)</code> and the <code>::picker-icon</code>, which allows you to select and style the dropdown list.</p> <hr> <h2>Usage</h2> <p>To use these new standards, we can simply add the <code>appearance: base-select;</code> property to your <code>&lt;select&gt;</code> element itself and its <code>::picker(select) </code>pseudo-element, like below.</p> <pre> .custom-select { appearance: base-select; } .custom-select::picker(select) { appearance: base-select; } </pre> <p>As we can see below, this CSS would remove the default OS-styles.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/customizing-html-select-elements-guide/base-styles-before-and-after.jpg" alt="Select element before after comparison" width="1000" height="300"><figcaption>Before and after applying <code>appearance: base-select;</code></figcaption></figure> <p>On the HTML side, we can now add rich content. For example, we can add an icon with an emoji within each of the options.</p> <pre> &lt;select name="country" id="custom-select"&gt; &lt;button&gt; &lt;selectedcontent&gt;&lt;/selectedcontent&gt; &lt;/button&gt; &lt;option value="ID"&gt; &lt;span class="flag"&gt; Coding HTML Hongkiat Lim Boost user engagement with AI Image Generation http://android-developers.googleblog.com/2025/10/boost-user-engagement-with-ai-image.html Android Developers Blog urn:uuid:f9ac9e60-5ba4-1e4b-d620-6c5da73876db Mon, 13 Oct 2025 19:21:44 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_A1-KPXtQhZ9PeBw2NTiMAhnLTnK64S9gm2T0nx1618Vh1FkayI9atuhW-J0UgyVI0v9IOVHG7rNYg0HooQO5RB_fw2WUDDQZYgfg2_J1J7AxiGMM7o_iMZcL_q6RleuOnXZYnvOB8paNxVe-Zgyo_PYgGlYamwVhoQWKFbLzCMN8qu-ibT1aOO7aEsk/s1600/Android-Blog-banners-Meta.jpg" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_A1-KPXtQhZ9PeBw2NTiMAhnLTnK64S9gm2T0nx1618Vh1FkayI9atuhW-J0UgyVI0v9IOVHG7rNYg0HooQO5RB_fw2WUDDQZYgfg2_J1J7AxiGMM7o_iMZcL_q6RleuOnXZYnvOB8paNxVe-Zgyo_PYgGlYamwVhoQWKFbLzCMN8qu-ibT1aOO7aEsk/s1600/Android-Blog-banners-Meta.jpg" style="display: none;" /> <em>Posted by Thomas Ezan, Senior Developer Relations Engineer and Mozart Louis, Developer Relations Engineer</em> <div style="overflow-x: hidden;"> <img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq1ibdKVuq7Lmqy44VK9jsCKXpVgePtpfkWYVEg0sOpM8d0xWqNorAmi9_t9TI_IvpqB7cnCL5UQzcK8x5YrWOcx-RYnmTj_Ck6AZbGHJOq0huxI-B8UTuVjiTPhchEDrPoddEhcYb7-ypimuuDnDlrXPIieTpu4KYKbic6dWxd6hk9pi2lgMk6Xzzvpo/s1600/Android-Blog-banners.jpg" style="display: block; margin: auto;" /> &nbsp;&nbsp; <span id="docs-internal-guid-44fe28d9-7fff-c5ad-1742-f45417c5b9aa"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Adding custom images to your app can significantly improve and personalize user experience and boost user engagement. This post explores two new capabilities for image generation with Firebase AI Logic: the specialized Imagen editing features, currently in preview, and the general availability of Gemini 2.5 Flash Image (a.k.a "Nano Banana"), designed for contextual or conversational image generation.</span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span> &nbsp;&nbsp; <span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span> &nbsp;&nbsp; </p><p dir="ltr"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Boost user engagement with images generated via Firebase AI Logic</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Image generation models can be used to create custom user profile avatars or to integrate personalized visual assets directly into key screen flows.</span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p> &nbsp;&nbsp; <p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For example, Imagen offers new editing features (in developer preview). You can now draw a mask and utilize inpainting to generate pixels within the masked area. Additionally, outpainting is available to generate pixels outside the mask.</span> &nbsp;&nbsp;</p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">&nbsp; <span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p>&nbsp;&nbsp; <p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"></p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="392" data-original-width="812" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGBa8URoYia_AQG-61mMDoYzlYZ25XP7piafy012cce27HBfF4scuB-tlA3oMzWbro9NMzp6-eX7RNn8uCSmYBfEZueETKJ9hHCed7-mQCsKLd3h2rRlQQU3x3X3RGQUyF5fl9r6i-zvj4l8jbIbPMC7fI530SXOj0IA3x5yd0KqUZgMM_zTxQr1rHilU/s16000/Imagen%20inpainting.png" /></div><em face="&quot;Google Sans&quot;, sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><div style="text-align: center;"><em face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Imagen supports inpainting, letting generate only a part of an image.&nbsp;</em></div></em><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><div style="text-align: center;">&nbsp;&nbsp;</div><p dir="ltr"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Alternatively, Gemini 2.5 Flash Image (a.k.a Nano Banana), can use extended world knowledge and the reasoning capabilities of the Gemini models to generate contextually relevant images, which is ideal for creating dynamic illustrations that align with a user's current in-app experience.</span>&nbsp; &nbsp;</p><p dir="ltr">&nbsp;&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="625" data-original-width="833" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzAelZyshzvZy8uk6RzHQhyGyPdl02OqwYL2cKEFi5BhIvkU6MiVjGDFrQ7_Mzc24lRiwZ7pe_a3ALTc14TbCPhnmv4qSdKdo2rNKR7KJvOQuwsp7zWYiB279l4JbS_4VIBMJqOSSbqI35MCfp5lwBpSdjKDrzuRYvlhjRVJxyv105dI_Ei50hJCqX78/s16000/In-context%20nano%20banana%20illustration.png" />&nbsp;<em face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Use Gemini 2.5 Flash Image to create dynamic illustrations contextually relevant to your app.</em><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">&nbsp;</span></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p> &nbsp;&nbsp; <p dir="ltr"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Finally, the ability to conversationally and iteratively edit images allow users to edit a photo using natural language.</span></p> &nbsp;&nbsp; <div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="438" data-original-width="860" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY-iPTO0OZWbB8Mdi1BrUmC0j-oNiEMu595Wd_6-SVfZjxmCVEJ4mjcL7ARLh34AlLZw6frIE1TErDsFwg8jFqgtAzRjLJrYhX9qVbqyemjigpEAzFvhr-GtTDc9VDWDP0F6X5m2IEiFo01XGGZaNow-MiRcjpGyu3lpeHzj_TByMFDDum0su1HByUm6w/s16000/photo%20edit%20natural%20language.png" /></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><em face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Use Gemini 2.5 Flash Image to edit a picture using natural language.</em></p> &nbsp;&nbsp; <p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When starting to integrate AI to your application, it is important to learn about </span><a href="https://cloud.google.com/vertex-ai/generative-ai/docs/image/responsible-ai-imagen" style="text-decoration-line: none;" target="_blank"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">AI safety</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. It is particularly key to assess your application's security risks, consider adjustments to mitigate safety risks, perform safety testing appropriate to your use case and solicit user feedback and monitor content.</span></p> &nbsp;&nbsp; <p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Imagen or Gemini: The choice is yours</span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">&nbsp;</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The difference between </span><a href="https://ai.google.dev/gemini-api/docs/image-generation" style="text-decoration-line: none;" target="_blank"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini 2.5 Flash Image</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> ("Nano Banana") and </span><a href="https://ai.google.dev/gemini-api/docs/imagen" style="text-decoration-line: none;" target="_blank"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Imagen</span></a><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> lies in their primary focus and advanced capabilities. Gemini 2.5 Flash Image, as an image model within the larger Gemini family, excels in conversational image editing, maintaining context and subject consistency across multiple iterations, and leveraging "world knowledge and reasoning" to create contextually relevant visuals or embed accurate visuals within long text sequences.&nbsp;</span></p> &nbsp;&nbsp; <p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Imagen is Google’s specialized image generation model, designed for greater creative control, specializing in highly photorealistic outputs, artistic detail, specific styles, and providing explicit controls for specifying the aspect ratio or format of the generated image.</span></p> &nbsp;&nbsp; <div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; max-width: 468pt; table-layout: fixed;"><colgroup><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Gemini 2.5 Flash Images </span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span> &nbsp;&nbsp; <span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">(Nano Banana </span><span face="&quot;Google Sans&quot;, sans-serif" style="background-color: white; color: #222222; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"> Gemini GenAI Imagen Birna Android Studio Narwhal 4 Feature Drop: watch face support and improved stability http://android-developers.googleblog.com/2025/09/android-studio-narwhal-4-feature-drop.html Android Developers Blog urn:uuid:fe678f65-3a66-125c-df4a-4496404894cd Fri, 10 Oct 2025 22:03:43 +0000 <p></p><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiKZ6UErOGPMynqz6GYnjOpPvT1vajAHdcpCkCtRur_aEfh3N0NfktVgA2eS46hPP2JmijWNAv0brV7aWhioaYn-n0P_kYxUPLdbWr3gmwQz-i10scYlX_A7ZTGWCbj7hVtimsBWm70T6WVZqB6gQpjYeuCJGydH7yYj4uthJdFcxUK09CZWeLhLBrfXpk" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="450" data-original-width="708" src="https://blogger.googleusercontent.com/img/a/AVvXsEiKZ6UErOGPMynqz6GYnjOpPvT1vajAHdcpCkCtRur_aEfh3N0NfktVgA2eS46hPP2JmijWNAv0brV7aWhioaYn-n0P_kYxUPLdbWr3gmwQz-i10scYlX_A7ZTGWCbj7hVtimsBWm70T6WVZqB6gQpjYeuCJGydH7yYj4uthJdFcxUK09CZWeLhLBrfXpk=s16000" /></a></div><p></p><span>&nbsp;<span><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1e88e5; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><em style="color: black; white-space-collapse: collapse;">Posted by Paris Hsu, Product Manager, Android Studio</em></span><div><span><i><br /></i><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android Studio Narwhal 4 Feature Drop</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is now stable and ready for you to use! This release brings targeted support for declarative Wear OS watch faces, a new customization option for your Project view, and continues our focus on quality by fixing 550+ numbers of bugs to improve stability and performance. You told us Agent Mode has been really helpful for your productivity, and we've now graduated it from being in preview to being stable.</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This is also the final feature drop for the Android Studio Narwhal releases. With the </span><a href="https://android-developers.googleblog.com/2025/08/accelerating-development-with-monthly-releases-android-studio-2x-more-than-before.html" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">new monthly release cadence</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, we've been delivering new features and bug fixes every month. The last three Narwhal releases have been packed with features, including the launch of Agent Mode and Compose previews. We'd like to not only share what's new in this release, but also recap some key features from the Narwhal releases.</span><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"></p><hr /><p></p><h1 dir="ltr" style="line-height: 1.44; margin-bottom: 10pt; margin-top: 16pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #434343; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">What’s New in Android Studio Narwhal 4 Feature Drop</span></h1><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Here are the new features shipping with this release:</span></p><h3 dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Declarative Wear OS watch faces support in Android Studio ⌚</span></h3><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Android Studio Narwhal 4 Feature Drop improves the workflow for creating Wear OS </span><a href="https://developer.android.com/training/wearables/watch-faces" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">watch faces</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> by introducing editor support for the </span><a href="https://developer.android.com/training/wearables/wff" style="text-decoration-line: none;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Watch Face XML Format</span></a><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to write, debug, and fine-tune your watch face designs directly within the IDE. This helps you work faster by bringing the Android development process into the IDE instead of having to change context and work with multiple programs when developing watch faces.&nbsp;</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="&quot;Google Sans Text&quot;, sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCViurwyl4vHxcnZrMhvoYjB95vDeUQ2B_G9us00vXywZDGSyM-kyfUI2Lmkc3_KUYoU6imSD6p54Lu09zgPxjtqv-EPf-rwVndJvv5F6cqN5yBHqKTnFrNy8BSVAGXMWBc417whYOnk89c9xY1LH3TOoQXwNKkyePdpgFJjPs3rmHtnZD6l8qRWl5nW0/s1594/Declarative-watchfaces.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1002" data-original-width="1594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCViurwyl4vHxcnZrMhvoYjB95vDeUQ2B_G9us00vXywZDGSyM-kyfUI2Lmkc3_KUYoU6imSD6p54Lu09zgPxjtqv-EPf-rwVndJvv5F6cqN5yBHqKTnFrNy8BSVAGXMWBc417whYOnk89c9xY1LH3TOoQXwNKkyePdpgFJjPs3rmHtnZD6l8qRWl5nW0/s16000/Declarative-watchfaces.gif" /></a></div><p></p><div class="separator" style="clear: both; text-align: center;"><span style="color: #434343; font-size: 14.6667px; text-align: left; white-space-collapse: preserve;"><i>Declarative watch faces support in Android Studio</i></span></div></span></div><div><span><div style="line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt; text-align: left;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #434343; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Android Studio lets you directly edit the XML files used in the Watch Face Format. It now provides code completion for tags and attributes based on the official Watch Face Format schemas and live error validation that helps identify issues like missing required attributes. Android Studio also includes resource linking to quickly navigate to drawable resources and other referenced XML elements along with advanced syntax support for handling arithmetic expressions and data source references embedded in the XML. Finally, you can deploy watch faces directly to a Wear OS emulator or physical device from Android Studio.</span></div><h3 dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Option to make Project view your default Android Developers How to Add Animation with TailwindCSS https://www.hongkiat.com/blog/tailwindcss-animation-tutorial/ hongkiat.com urn:uuid:ea877074-5547-fc61-ee6c-1aaad44eb712 Fri, 10 Oct 2025 13:00:36 +0000 <p>Adding animations can be a great way to make your website feel more alive and enjoyable. They can be used to provide helpful feedback, guide users’ attention to important elements, and make your interface feel more intuitive and responsive. If you use Tailwind CSS to build your websites, you don’t need to start from scratch&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/tailwindcss-animation-tutorial/">How to Add Animation with TailwindCSS</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>Adding animations can be a great way to make your website feel more alive and enjoyable. They can be used to provide helpful feedback, guide users’ attention to important elements, and make your interface feel more intuitive and responsive.</p> <p>If you use <a href="https://tailwindcss.com/" target="_blank" rel="noopener noreferrer">Tailwind CSS</a> to build your websites, you don’t need to start from scratch as it already comes with built-in utilities and tools that make creating and customizing animations as easy as adding a few classes to your HTML.</p> <p>In this article, we’ll walk through several ways how you can add animations to your project with TailwindCSS.</p> <p>Without further ado, let’s get started!</p> <hr> <h2>Built-in Utilities</h2> <p>Tailwind CSS includes a variety of pre-configured utilities out of the box that you can use right away on elements of your website.</p> <table> <thead> <tr> <th>Utility</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>animate-bounce</code></td> <td>Bounces an element up and down</td> </tr> <tr> <td><code>animate-pulse</code></td> <td>Makes an element fade in and out subtly</td> </tr> <tr> <td><code>animate-spin</code></td> <td>Spins an element continuously</td> </tr> <tr> <td><code>animate-ping</code></td> <td>Scaling an element up and down</td> </tr> </tbody> </table> <p>For example, to make an element bounce up and down, you can simply add the <code>animate-bounce</code> class to it:</p> <p> <iframe src="https://codesandbox.io/embed/pkmrnv?view=preview&module=%2Findex.html" style="width:100%; height: 300px; border:0; border-radius: 4px; overflow:hidden;" title="tailwindcss-animations-builtin" allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"></iframe></p> <p>In this case, the class will move our element up and down infinitely, with the specified duration and easing function.</p> <p>As mentioned, these animations are pre-configured. If you want more control over the animations, you should consider creating your own custom utilities.</p> <p>Let’s see how to do it!</p> <hr> <h2>Creating Custom Animations</h2> <p>There are several ways to add your own custom animations.</p> <p>First, we can specify keyframes, durations, and easing functions to create unique effects using the <code>animate-</code> property, as follows.</p> <pre> animate-[&lt;animation&gt;_&lt;duration&gt;_&lt;easing&gt;_&lt;delay&gt;_&lt;iteration&gt;] </pre> <p>To do this, we need to add the animation keyframes to our stylesheet. For example, below, I have a keyframe named <code>tada</code>, which will scale an element up and down while also rotating it slightly to the right and left, as if making a surprise gesture.</p> <pre> @keyframes tada { from { transform: scale3d(1, 1, 1); } 10%, 20% { transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); } 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); } 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); } to { transform: scale3d(1, 1, 1); } } </pre> <p>To apply this keyframe, you could add the following class to your element:</p> <pre> &lt;div class="animate-[tada_1s_ease-in-out_1s] ..."&gt; ... &lt;/div&gt; </pre> <p>Although this works well, adding a custom animation like this can be a bit cumbersome, especially if you will add it across multiple elements. Fortunately, TailwindCSS provides a more convenient way to handle this.</p> <p>So, alternatively, we can define the animation as a custom property. For example, let’s call it <code>--animate-tada</code>, and set its value to include the animation name, duration, easing function, and delay.</p> <pre> :root { --animate-tada: tada 1s ease-in-out 1s; } @keyframes tada { ... } </pre> <p>Now we can apply it with the shorthand <code>animate-[--animate-tada]</code> instead of writing all the values directly:</p> <pre> &lt;div class="animate-[--animate-tada] ..."&gt; ... &lt;/div&gt; </pre> <p>I think this is now much more manageable than adding the animation values directly to the element. It allows you to easily reuse the same animation across multiple elements without repeating the same values.</p> <p>Here’s how it looks in action:</p> <p> <iframe src="https://codesandbox.io/embed/7cd9ld?view=preview&module=%2Findex.html" style="width:100%; height: 300px; border:0; border-radius: 4px; overflow:hidden;" title="tailwindcss-animations-builtin-customized-2" allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"></iframe></p> <p>But, let’s make it simpler with a custom utility class for our animation. Instead of adding the custom property, what if we could simply add a class <code>animate-tada</code>?</p> <p>To create one, we can wrap the keyframes and the custom property definition within <code>@theme</code> in our main stylesheet.</p> <pre> @theme { --animate-tada: tada 1s ease-in-out 1s; @keyframes tada { ... } } </pre> <p>Use the Tailwind CLI to build the main CSS.</p> <pre> npx @tailwindcss/cli -i ./main.css -o ./build.css </pre> <p>It will generate the necessary classes for you that you can simply add the <code>animate-tada</code> class to your element:</p> <pre> &lt;div class="animate-tada ..."&gt; ... &lt;/div&gt; </pre> <hr> <h2>More Animations</h2> <p>One of the great things about TailwindCSS is its ecosystem of extensions or addons. So instead of creating every animation from scratch, you can install plugins that provide additional animations out of the box. This will save you time and effort in implementing complex animations.</p> <p>Here are a few popular ones that you might find useful:</p> <h3><a href="https://www.npmjs.com/package/tailwindcss-motion" target="_blank" rel="noopener noreferrer nofollow">tailwindcss-motion</a></h3> <p><strong>tailwindcss-motion</strong> is a Tailwind CSS plugin that makes adding complex animations simpler. It gives you an easy syntax for defining the motion effects and comes with built-in presets you can use right away.</p> <p>It also provides an easy-to-use GUI where you can tweak how animations look and feel, so you get smooth, polished effects, and then simply copy and paste the classes.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/tailwindcss-animation-tutorial/tailwindcss-motion.jpg" alt="TailwindCSS Motion GUI Animation Interface" width="1000" height="600"> </figure> <h3><a href="https://github.com/midudev/tailwind-animations" target="_blank" rel="noopener noreferrer">@midudev/tailwind-animations</a></h3> <p>This library is a Tailwind CSS plugin that provides a set of pre-configured common animations including fade-in, fade-out, slide-in, zoom, rotate, bounce, shake, swing, and many more. Check out the demo <a href="https://tailwindcss-animations.vercel.app" target="_blank" rel="noopener noreferrer">here</a>.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/tailwindcss-animation-tutorial/midudev-tailwind-animations.jpg" alt="Midudev Tailwind Animation Demo Examples" width="1000" height="600"> </figure> <h3><a href="https://www.npmjs.com/package/tw-animate-css" target="_blank" rel="noopener noreferrer nofollow">tw-animate-css</a></h3> <p><strong>tw-animate-css</strong> is <strong>for Tailwind CSS 4</strong>, and one of the most popular and downloaded.</p> <p>It makes adding animations to your Tailwind CSS projects easy. It gives you ready-to-use utilities for smooth effects like fade-ins, zooms, and slides. You can also fine-tune the details, like animation duration, delay, and other properties.</p> <h3><a href="https://www.npmjs.com/package/tailwindcss-animated" target="_blank" rel="noopener noreferrer nofollow">tailwind-animated</a></h3> <p>Another Tailwind CSS plugin that you could consider is <strong>tailwindcss-animated</strong>. It provides various utility classes and several ready-to-use CSS animations that extend the basic animation capabilities of Tailwind CSS. <strong>It’s compatible with Tailwind CSS 3 and 4</strong>.</p> <hr> <h2>Wrapping up</h2> <p>Animations are a great way to make your site feel more lively and engaging. With Tailwind CSS and the plugins, adding smooth motion can be as easy as dropping in a few classes.</p> <p>Whether you prefer creating your own utilities or taking advantage of ready-made plugins, Tailwind gives you the flexibility to add polished, professional-looking animations that bring your site to life, and hopefully, this article can help you get started.</p><p>The post <a href="https://www.hongkiat.com/blog/tailwindcss-animation-tutorial/">How to Add Animation with TailwindCSS</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Coding Animation UI CSS Animation Thoriq Firdaus Jetpack WindowManager 1.5 is stable http://android-developers.googleblog.com/2025/10/jetpack-windowmanager-15-is-stable.html Android Developers Blog urn:uuid:13bb5fec-670c-f31c-4f92-a5a0d95de6fe Fri, 10 Oct 2025 13:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_FrVV-g1Ut1H6BozzHJJkU5SIboQTVUDeKJrq0KaogdlpApY9LOPYAfvtKngdY1l9aQOQTZuxIPX7pTy5ak1hfHrFYp4LEM8v1vkpN3LookDXxYdNTOKF6EUzO1geOrSq33yKXzq2o_iCzC2bm_S1n8HHols65rSwQDr0rjegsxYVkVFVHsDAe0tlf5s/s1600/Jetpack%20Adaptive%20Compose%20Metadata%20%281%29.png" name="twitter:image" /> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_FrVV-g1Ut1H6BozzHJJkU5SIboQTVUDeKJrq0KaogdlpApY9LOPYAfvtKngdY1l9aQOQTZuxIPX7pTy5ak1hfHrFYp4LEM8v1vkpN3LookDXxYdNTOKF6EUzO1geOrSq33yKXzq2o_iCzC2bm_S1n8HHols65rSwQDr0rjegsxYVkVFVHsDAe0tlf5s/s1600/Jetpack%20Adaptive%20Compose%20Metadata%20%281%29.png" style="display: none;" /> <span id="docs-internal-guid-2d4523d6-7fff-d76a-cea6-c46da80130dc"> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><img style="margin: auto; display: block;" alt="Jetpack WindowManager 1.5 is stable" border="0" data-original-height="720" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZrgnBG0KV2teWChunR5YAzgY5a_Y6WYhOl200Dg08TwENxTCgbLevmyYxAm_MPtSRa_7h-eTGMTvrFkhaGrfVEoqydfjRszJzdZtsuPvpc0siYJm6o6VEJOsNLCfN688S1ScJKrw3gSDZsMKdBIBVVPLmWp79HhlZKU6WkQ4UGZKqVbgZ-lIuB0vQbQ8/s1600/Jetpack%20Adaptive%20Compose%20%281%29.png"/></div></div></image> <p><span>We're excited to announce that</span><a href="https://developer.android.com/jetpack/androidx/releases/window#version_15_2"><span> Jetpack WindowManager 1.5.0</span></a><span> is now stable!</span></p><p><span>This release builds on the strong foundation of adaptability in WindowManager, making it even easier to create polished, adaptive UIs that look great on </span><span>all</span><span> screen sizes. As the Android ecosystem continues to grow, users are engaging with apps on a wider variety of devices than ever before: from phones and foldables to tablets, connected displays, Chromebooks, and even car displays in parked mode.</span></p><p><span>WindowManager 1.5 focuses on providing better tools for this diverse device environment.</span></p> <h1 style="margin-block: 0; line-height: 1em !important;"><span face="Arial, sans-serif" style="font-weight: 700; font-size: 28px; color: #434343; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">What's new in WindowManager 1.5</span></h1><p><span>This stable release introduces new breakpoints for very large screens, enhances the activity embedding API, and provides more flexibility for calculating window metrics.</span></p><h2 style="margin-block: 0; line-height: 1em !important;"><span face="Arial, sans-serif" style="font-size: 24px; color: #434343; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">New window size classes: Large and Extra-large</span></h2><p><span>The biggest update in 1.5 is the addition of two new width window size classes: Large and Extra-large.</span></p><p><span>Window size classes are our official, opinionated set of viewport breakpoints that help you design and develop adaptive layouts.</span><span><span style="vertical-align: super;"> </span></span><span>With 1.5, we're extending this guidance for screens that go beyond typical tablets.</span></p><p dir="ltr" style="margin-bottom: 6pt; margin-top: 0pt;"><span>Here are the new width breakpoints:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Large:</span><span style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> For widths between 1200dp and 1600dp</span></p></li><li aria-level="1" dir="ltr"><p dir="ltr" role="presentation" style="margin-bottom: 6pt; margin-top: 0pt;"><span style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Extra-large:</span><span style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> For widths ≥1600dp</span></p></li></ul> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><img style="margin: auto; display: block;" alt="Jetpack WindowManager 1.5 is stable" border="0" data-original-height="720" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEu8s198DPEkWwZZJKwdd7Cvum7DqDfBjEnXKY85974qafEb89quT0mbGx69s19PxINja03TmGZ1E5oQI54yORxpjhHsdiYfJmQ8UnTQEiHlvP7gP-tWzhL5aQUcV77WW7a11GKjlFJb_VBneZkvQ0tc-36O6uGGJshqhe_024p3kr0OC6hch_BoX0DNI/s1600/window_size_classes_width.png"/></div></div></image> <p><span face="Arial, sans-serif"><em></em></span></p><center><span face="Arial, sans-serif"><em>The different window size classes based on display width.&nbsp;</em></span></center><p></p> <h3 style="margin-block: 0; line-height: 1em !important;"><span face="Arial, sans-serif" style="font-size: 22px; color: #434343; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Why are these important?</span></h3> <p><span>Starting with Android 16 QPR1 Beta 2, Android supports </span><a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/support-connected-displays" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">connected displays</span></a><span>, enabling users to attach an external display to their device and transform it into a desktop-like tool with a large screen.</span></p> <div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='100' height='405' src='https://www.blogger.com/video.g?token=AD6v5dzU0SAT5xHWYRGBe7RXIUC3NE0ZNaIZcTmD0LPM4Sp_AuXskrvaf-1SkUdcUYuWEAGlbYFhnlqUQSwhCifq0Q' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div> <p><span face="Arial, sans-serif"><em></em></span></p><center><span face="Arial, sans-serif"><em>Phone connected to an external display, with a desktop session on the external display.&nbsp;</em></span></center><p></p> <p><span>With this new feature available, opinionated guidance to include bigger displays is crucial.&nbsp;</span></p> <p><span>On these very large surfaces, simply scaling up a tablet's </span><span face="Arial, sans-serif">Expanded</span><span> layout isn't always the best user experience. An email client, for example, might comfortably show two panes (a mailbox and a message) in the Expanded window size class. But on an </span><span face="Arial, sans-serif">Extra-large</span><span> desktop monitor, the email client could elegantly display </span><span face="Arial, sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">three or even four panes</span><span>—perhaps a mailbox, a message list, the full message content, and a calendar/tasks panel, all at once.</span></p> <p><span>By providing official breakpoints for very large display sizes, WindowManager 1.5 gives you a clear signal to introduce layouts specifically designed for a productive, information-dense desktop experience.</span></p> <p><span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span>The window size classes can be calculated using </span><a href="https://developer.android.com/reference/kotlin/androidx/window/core/layout/package-summary#(kotlin.collections.Set).computeWindowSizeClass(kotlin.Float,kotlin.Float)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: 'Courier New',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">computeWindowSizeClass()</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, which is an </span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: transparent; color: black; font-family: 'Courier New',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">androidx.window.core.layout</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap !important;"> library extension function that extends the </span><span style="background-color: transparent; color: black; font-family: 'Courier New',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Set&lt;WindowSizeClass&gt;</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> type.</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;</span></p> <p dir="ltr" style="margin-bottom: 12pt; margin-top: 0pt;"><span>To include the new window size classes in your project, simply call the function from the </span><a href="https://developer.android.com/reference/androidx/window/core/layout/WindowSizeClass#BREAKPOINTS_V2()" style="text-decoration: none;"><span style="white-space: pre-wrap !important; word-break: break-all; -webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">WindowSizeClass.BREAKPOINTS_V2</span></a><span face="Arial,sans-serif" style="white-space: pre-wrap !important; word-break: break-all; background-color: transparent; color: #1b1c1d; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> set instead of </span><a href="https://developer.android.com/reference/androidx/window/core/layout/WindowSizeClass#BREAKPOINTS_V1()" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap !important; word-break: break-all;">WindowSizeClass.BREAKPOINTS_V1</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">:</span></p> <div style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; padding: 4px; border-radius: 4px;"><p dir="ltr" style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; margin-bottom: 0pt; margin-top: 0pt; height: 100%;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1967d2; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">val</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #eceff1; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">currentWindowMetrics</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #eceff1; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> </span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">=</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #eceff1; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">WindowMetricsCalculator.getOrCreate()</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #eceff1; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.computeCurrentWindowMetrics(LocalContext.current)</span></p><p><span><b id="docs-internal-guid-09ea2c05-7fff-8fa4-c02a-796877460b9a" style="font-weight: normal;"></b></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">val sizeClass = WindowSizeClass.BREAKPOINTS_V2</span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #eceff1; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">.computeWindowSizeClass(currentWindowMetrics)</span></p></div> <p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1b1c1d; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><span>Then apply the correct layout when you’re sure your app has at least that much space:</span></p> <div style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; padding: 4px; border-radius: 4px;"><p dir="ltr" style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1967d2; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">if</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">(sizeClass.isWidthAtLeastBreakpoint(</span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1967d2; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">WindowSizeClass.WIDTH_DP_LARGE_LOWER_BOUND)){</span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1967d2; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">...</span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #1967d2; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #b80672; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">// window is at least 1200 dp wide</span></p><p><span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span style="white-space: pre-wrap !important; word-break: break-all; background-color: #f1f5f9; color: #37474f; font-family: 'Roboto Mono',monospace; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">}</span></p></div> <h1 style="margin-block: 16px 0; line-height: 1em !important;"><span face="Arial, sans-serif" style="font-size: 28px; color: #434343; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Adaptive librar Connected displays foldables Large Screens Window Manager Window Size Classes Birna #WeArePlay: Meet the people building apps and games that are making finance simple for everyone, everywhere. http://android-developers.googleblog.com/2025/10/weareplay-meet-people-building-apps-and.html Android Developers Blog urn:uuid:c56f10ba-6f1e-52d9-47c1-e79ca531572b Thu, 09 Oct 2025 13:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" name="twitter:image" /> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em><div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" imageanchor="1"><img style="margin: auto; display: block;" border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> stories, we meet the founders building apps and games that are making finance simple for everyone, everywhere. From providing first-time loans in Myanmar to digitizing piggy banks for young savers in Nigeria, these founders are breaking down traditional financial barriers.</p><p>Here are a few of our favorites:</p> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Yağmur, Yusuf D, Yusuf E, and Tolgahan's game Ticarium Business Tycoon teaches real-world finance and entrepreneurial skills in a virtual world." border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqST4pK0fiHHzaEw4PyfHQix4fK0M72btNq0rPMqK8-cyHtKTL-eBuEQwLSi8QmvsNNkmMzE-2qhEaskYOmNHr4jV0wGdasAwYVH_gpn8ZzObwgleob7rAJA05s5S2KytNQD5C064l9obI3hKwrDzC7NB_J9sTznCSzYFZ07BtXfeQdpFbiTnp-ELrSFA/s1600/01_TR_YuyutoGames_Co-foundersYusufEfe_Yagmur_Tolgahan_YusufDemir_edited.png"/></a></div></div><imgcaption><center><center><center><i>Yusuf E, Yağmur, Tolgahan and Yusuf D, co-founders of Yuyuto Games Technology&nbsp;</i></center><center><i>Istanbul, Türkiye</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Yağmur, Yusuf D, Yusuf E, and Tolgahan's game Ticarium Business Tycoon teaches real-world finance and entrepreneurial skills in a virtual world.</span></h4> <p>University friends Yağmur, Yusuf D, Yusuf E, and Tolgahan turned a passion project for an old simulation game into <a href="https://play.google.com/store/apps/details?id=com.ticarium&hl=en-US&gl=tr" target="_blank">Ticarium Business Tycoon</a>. The game lets players run companies, trade goods, and learn about finance in a fun, risk-free environment, encouraging entrepreneurial thinking. Now live in over 30 countries, the founders plan to scale globally and launch new titles to reach even more future entrepreneurs.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Theta's AI-powered app Mother Finance provides microloans and financial education to people in Myanmar." border="0" data-original-height="720" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitxYrYBqJDbTHyY2KEb1a324wT0hAwqvQilWvnDH2k0qk42ygOFiY7E5OGAFaupd1YXgFtnmH-RTn-QM9M8qGf-S1Wxd0SYJvO8_bIOi_UMwf4SV3GUocKkhe3Zgp6Pb9nE6RX029c5S_b9IgKn-yqCBccdJ1QSchAoNkXOZkLyKBzdPISGTIGfT5Q-Zs/s1600/01_MM_MOTHER%20FINANCE_FOUNDER_THETA%20AYE_edited.png"/></a></div></div><imgcaption><center><center><center><i>Theta, founder of Mother Finance&nbsp;</i></center><center><i>Yagon, Myanmar</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Theta's AI-powered app Mother Finance provides microloans and financial education to people in Myanmar.</span></h4> <p>While working at a bank in Myanmar, Oxford and MIT graduate Theta saw that many citizens couldn't access credit without traditional collateral. She created <a href="https://play.google.com/store/apps/details?id=mm.com.motherfinance.borrower&gl=mm" target="_blank">Mother Finance</a> to provide microloans, financial literacy content, and a localized digital credit score, supporting over 300,000 people so far. Looking ahead, the team is developing loan products for overseas Burmese workers with the goal of becoming Myanmar’s leading digital lender.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Somtochukwu, and Joshua's app PiggyVest lets anyone get started with micro-savings and investments." border="0" data-original-height="1500" data-original-width="2000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEici98OJNq_8By9ROE9gihTeRpBUf88wKqaZsNPMWWPYsjEH9a4hykVpjBb8tPOb1kZ1ddf7tOPw0xDDhXsV5VHWivGbjyFiMXqE5C4K9BB5tMHXgpS6CZcAzlawyCNbgzLHXrw38nejemu5ZwVO-MvnrTQYpLu-fMzzo3B-XmxBEK53GU4yxkX_MWEP4w/s1600/01_NG_PIGGYVEST_FOUNDERS_JOSHUA%20CHIBUEZE_ODUNAYO%20EWENIYI__SOMTOCHUKWU%20IFEZUE_edited.JPG"/></a></div></div><imgcaption><center><center><i>Odunayo, Somtochukwu, and Joshua co-founders of Piggytech Global&nbsp;</i></center><center><i>Lagos, Nigeria&nbsp;</i></center></center></imgcaption></image> <h4><span style="font-size: large;">Somtochukwu, and Joshua's app PiggyVest lets anyone get started with micro-savings and investments.</span></h4> <p>University friends Odunayo, Somtochukwu, and Joshua knew that high banking fees in Nigeria kept young people from saving. Inspired by a social media post, they decided to digitize the traditional piggy bank. They launched <a href="https://play.google.com/store/apps/details?id=com.piggybankng.piggy&hl=en-US&gl=ng" target="_blank">PiggyVest</a>, a micro-savings and investment app that lets anyone get started with as little as 100 Naira, helping many build better financial habits. Now, the team is aiming for 10 million downloads to make finance more accessible for the next generation.</p><p><br /></p> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> </div> Birna #WeArePlay: Meet the founders of Geocaching, the digital treasure hunt game with 3.4 million caches http://android-developers.googleblog.com/2025/10/weareplay-meet-founders-of-geocaching.html Android Developers Blog urn:uuid:3d64f928-4d0d-59d8-dd87-e61c2bf74502 Tue, 07 Oct 2025 17:19:44 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em><div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="display: block; margin: auto;" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> film, which celebrates the people behind apps and games on Google Play, we meet Bryan, Jeremy and Elias, the co-founders of <a href="https://play.google.com/store/apps/details?id=com.groundspeak.geocaching.intro&amp;hl=en_GB" target="_blank">Geocaching</a>. For nearly 25 years, their app has been turning the world into a real-life treasure hunt by using technology to inspire outdoor adventure and connect a global community. Discover the origin story of this unique app and the incredible impact it's had in the past 25 years.</p> <iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/eJ8tb4t9bZA" width="100%" youtube-src-id="eJ8tb4t9bZA"></iframe> <center><span id="docs-internal-guid-905b73e6-7fff-bfed-1a7e-7a06d0a7cb0e" style="text-align: left;"><p><span style="font-weight: bold;">What was the spark that led to Geocaching?</span></p><p><span style="font-weight: bold;">Bryan</span><span>: It all started almost 25 years ago. We were just three friends working at a dot-com, all passionate about technology and the outdoors. One day, Jeremy brought a new GPS unit into the office, and we were fascinated.</span></p><p><span style="font-weight: bold;">Jeremy</span><span>: I also found this early online game called the </span><span>"Great American GPS stash hunt"</span><span >. I came back to the office completely hooked and told the guys we could build a website to make it easier for everyone to play. We all recognized the potential in that idea.</span></p><span><div><span style="font-weight: bold;">Bryan</span><span>: We decided to combine our different skills in web development, IT infrastructure, and my business background to support what was then just a tiny hobby.</span></div></span></span></center> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="For those who haven't played, how does Geocaching work?" border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4kJaamrcxslHoyUtMP7A1Cp7LuahMFrvnchzrfmmBwFn0C4JP-49NzmPxROGm3wl2XK6xQZ53HSAx6TJTCR-77ioRfmes5Sp-eWnhB1e49g13t48xla-yo5Zu8N_ue6u3CdBKvFgJn8vnomF0GA1eyekQuIq7ds6W4Q0PebYHFVmQy4FjIh_A75xBD4k/s1600/05_USA_GEOCACHING_FOUNDERS__BRYAN%20ROTH_JEREMY%20IRISH_ELIAS%20ALVORD.jpg" style="display: block; margin: auto;" /></a></div></div><imgcaption><center><center><center><i> Jeremy, Elias and Bryan when they first started Geocaching</i></center></center></center></imgcaption></image> <center><span id="docs-internal-guid-905b73e6-7fff-bfed-1a7e-7a06d0a7cb0e" style="text-align: left;"><p><span style="font-weight: bold;">For those who haven't played, how does Geocaching work?</span></p><p><span style="font-weight: bold;">Jeremy</span><span>: The basic idea is a real-world treasure hunt. When you find a cache, the rules are simple: if there are items inside, you can take one, but you have to replace it with something of similar value. Then, you sign the physical logbook and put the container back exactly where you found it for the next person.</span></p><span><div><span style="font-weight: bold;">Bryan</span><span>: The geocaching community has now hidden over 3.4 million geocaches worldwide. They're placed everywhere. You've probably walked past dozens without ever knowing it. Caches are hidden everywhere all over the world, from the middle of a city to a mountain trail. You will find them in unexpected places.</span></div></span></span></center><br> <center><span id="docs-internal-guid-905b73e6-7fff-bfed-1a7e-7a06d0a7cb0e" style="text-align: left;"><p><span style="font-weight: bold;">Bryan, we heard Geocaching has had a huge personal impact on your own life. Can you tell us about that?</span></p><p><span>Back in 2001, I went to my first-ever Geocaching event. It was a simple potluck in a park, but that’s where I met my wife, Heidi, who was there with her son Dylan. Our first date was even a hike to find a special, hard-to-find geocache! Now, almost 25 years later, we’re a geocaching family through and through. It’s amazing because my story isn't unique; we hear all the time from people who have found lifelong friends, partners, and a whole community through this game.</span></p></span></center> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Geocaching started before smartphones. How has technology, and Google Play specifically, changed the game?" border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKexcqQKts8rbNFtPfGkRYxMGXUM7YBOuFEEnASoTExN3r9KdVYx-NdX6S8oSwfOtileA8vtqsGdd4e4AQmgfNITYlaloSW7m-eBMtryd_sPrtJiFS7yhawCu7azGjjq5KZ4JqBVN1zlvyyOpWx9fBzl1tiWAhHp8oxCT2uusfhKXdEqEkxDYp8aF_fs/s1600/12_USA_GEOCACHING_APP..jpg" style="display: block; margin: auto;" /></a></div></div></image> <center><span id="docs-internal-guid-905b73e6-7fff-bfed-1a7e-7a06d0a7cb0e" style="text-align: left;"><p><span style="font-weight: bold;">Geocaching started before smartphones. How has technology, and Google Play specifically, changed the game?</span></p><p><span style="font-weight: bold;">Bryan</span><span>: In the early days, you had to buy a dedicated GPS device that could cost hundreds of dollars. As a bootstrapped business, having our app on Google Play was legitimately game-changing for us. It put a powerful GPS device into everyone's pocket and gave us access to a global audience. It has really enabled the growth of this game worldwide. From a developer standpoint, we build our app on Google's technology; Google Maps is the foundation of the entire experience.</span></p></span></center> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="What's next for Geocaching?" border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyObyJ1BHTL9I-v9fIVSbGUW9IeNi4rFoVJ8dn7lZzx4punkyWxIezyMurRMjNZqv1pKESUQgfdmqymLjuqrttHGNAP_alTTr9jnYb4cRBgyn1IJNaf3yDbbMLxQu4E7lejj1kih_9u65l1b-aVffzma6RXvPxU8bFQB0f4WG1r2RGV88NKOnenPP_Nlg/s1600/07_USA_GEOCACHING_FOUNDERS_BRYAN%20ROTH_ELIAS%20ALVORD_edited.png" style="display: block; margin: auto;" /></a></div></div></image> <center><span id="docs-internal-guid-905b73e6-7fff-bfed-1a7e-7a06d0a7cb0e" style="text-align: left;"><p><span style="font-weight: bold;">What's next for Geocaching?</span></p><p><span style="font-weight: bold;">Bryan</span><span>: We’re celebrating our 25th anniversary with community events all over the world and by releasing Treasures, a brand-new feature in the app. Looking ahead, our mission remains the same: to inspire outdoor adventure, exploration, and community. We want to continue using technology to get more people outside, away from their couches, and having real-world experiences. </span></p></span></center> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> </div> Birna How to Style React Aria Components with TailwindCSS https://www.hongkiat.com/blog/react-aria-tailwindcss-styling/ hongkiat.com urn:uuid:985bc8a4-2a53-c6d4-c4a7-845c14c051b4 Tue, 07 Oct 2025 13:00:45 +0000 <p>React Aria Components (RAC) is a library from Adobe that gives you fully accessible, production-ready React components—but without any default styling. This makes RAC perfect for pairing with a styling framework like TailwindCSS, since you can design everything exactly the way you want without fighting against preset styles. I’ve been using RAC in various projects,&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/react-aria-tailwindcss-styling/">How to Style React Aria Components with TailwindCSS</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p><a href="https://react-spectrum.adobe.com/react-aria/components.html" target="_blank" rel="noopener noreferrer">React Aria Components</a> (RAC) is a library from Adobe that gives you fully accessible, production-ready React components—but without any default styling. This makes RAC perfect for pairing with a styling framework like TailwindCSS, since you can design everything exactly the way you want without fighting against preset styles.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/react-aria-tailwindcss-styling/react-aria-tailwind.jpg" alt="React Aria TailwindCSS styling guide"> </figure> <p>I’ve been using RAC in various projects, and one thing that I like about RAC is how it handles the component states. Instead of just using CSS pseudo-classes like <code>:hover</code> or <code>:active</code> which don’t always behave consistently on touch devices or with keyboards, it uses <code>data-</code> attributes like <code>data-hovered</code>, <code>data-pressed</code>, and <code>data-selected</code>.</p> <h2>Using with TailwindCSS</h2> <p>TailwindCSS is one of my favourite ways to style components. While React Aria Components work just well with TailwindCSS, there’s a catch when it comes to styling component states. Because RAC uses data attributes, you can’t just use Tailwind’s usual <code>hover:</code> or <code>focus:</code> variants. Instead, you need to write out the full attribute using Tailwind’s arbitrary variant syntax, for example:</p> <pre> &lt;Button className="data-[focused-visible]:bg-blue-400 data-[disabled]:bg-gray-100" /&gt; </pre> <p>This works fine but it can be redundant. The class names can quickly get long and messy, which makes our code harder to read and scan. We also lose out on Tailwind’s handy editor autocompletion, so typos become more likely.</p> <p>This is exactly the problem that the <a href="https://www.npmjs.com/package/tailwindcss-react-aria-components" target="_blank" rel="noopener noreferrer nofollow">tailwindcss-react-aria-components</a> plugin is built to solve. Let’s see how it works.</p> <h2>Installation</h2> <p>Installing the plugin is simple. We can add it with NPM with this command below:</p> <pre> npm install tailwindcss-react-aria-components </pre> <p>Configuring the plugin will depend on the Tailwind version you’re using on the project.</p> <p><strong>On Tailwind v3</strong>, add it to your <code>tailwind.config.js</code>:</p> <pre> /** @type {import('tailwindcss').Config} */ module.exports = { //... plugins: [ require('tailwindcss-react-aria-components') ], } </pre> <p><strong>On Tailwind v4</strong>, use the new <code>@plugin</code> directive in your main CSS file:</p> <pre> @import "tailwindcss"; @plugin "tailwindcss-react-aria-components"; </pre> <p>Once installed, styling the component is more simplified. Verbose data attributes like <code>data-[pressed]:</code> turn into clean variants such as <code>pressed:</code>, and <code>data-[selected]:</code> becomes <code>selected:</code>. Even non-boolean states are shorter, for example <code>data-orientation="vertical"</code> now becomes <code>orientation-vertical:</code>.</p> <p>Here’s a quick comparison of the two approaches for some of the states in RAC:</p> <table> <thead> <tr> <th> RAC State </th> <th> Tailwind Attribute Selector </th> <th> Simplified Class Selector </th> </tr> </thead> <tbody> <tr> <td> <code>isHovered</code> </td> <td> <code>data-[hovered]</code> </td> <td> <code>hovered:</code> </td> </tr> <tr> <td> <code>isPressed</code> </td> <td> <code>data-[pressed]</code> </td> <td> <code>pressed:</code> </td> </tr> <tr> <td> <code>isSelected</code> </td> <td> <code>data-[selected]</code> </td> <td> <code>selected:</code> </td> </tr> <tr> <td> <code>isDisabled</code> </td> <td> <code>data-[disabled]</code> </td> <td> <code>disabled:</code> </td> </tr> <tr> <td> <code>isFocusVisible</code> </td> <td> <code>data-[focus-visible]</code> </td> <td> <code>focus-visible:</code> </td> </tr> <tr> <td> <code>isPending</code> </td> <td> <code>data-[pending]</code> </td> <td> <code>pending:</code> </td> </tr> </tbody> </table> <h2>Prefixing</h2> <p>By default, the plugin’s modifiers are unprefixed, so you can use variants like <code>disabled:</code> right away, for example:</p> <pre> import { Button } from 'react-aria-components'; function App() { return ( &lt;Button className="disabled:opacity-50" isDisabled&gt; Submit &lt;/Button&gt; ); } </pre> <p>But if you prefer a clearer naming convention, you can set a prefix in the config. This can be especially handy in larger projects where you want to avoid clashes with other plugins or custom utilities. </p> <p>Again, the setup will depend on the Tailwind version you’re using.</p> <p><strong>On Tailwind v3</strong>, you can add the prefix option when requiring the plugin in <code>tailwind.config.js</code>:</p> <pre> // tailwind.config.js /** @type {import('tailwindcss').Config} */ module.exports = { //... plugins: [ require('tailwindcss-react-aria-components')({ prefix: 'rac' }) ], } </pre> <p><strong>On Tailwind v4</strong>, you can pass the prefix option in the <code>@plugin</code> directive in your main CSS file, like below:</p> <pre> @import "tailwindcss"; @plugin "tailwindcss-react-aria-components" { prefix: hk }; </pre> <p>Now, all the variants will be prefixed with <code>rac-</code>, so <code>disabled:</code> becomes <code>rac-disabled:</code>, and <code>selected:</code> becomes <code>rac-selected:</code>.</p> <p>Here’s the same example as before, but with the prefix applied:</p> <pre> import { Button } from 'react-aria-components'; function App() { return ( &lt;Button className="hk-disabled:opacity-50" isDisabled&gt; Submit &lt;/Button&gt; ); } </pre> <p>Here is a quick demo of the plugin in action.</p> <p> <iframe src="https://stackblitz.com/edit/vitejs-vite-t19j3qdy?ctl=1&embed=1&file=src%2FApp.jsx" height="500" width="100%" style="border: 1px solid #ccc;"></iframe></p> <h2>Wrapping Up</h2> <p>Styling React Aria Components with TailwindCSS doesn’t have to be complicated. With the <a href="https://www.npmjs.com/package/tailwindcss-react-aria-components" target="_blank" rel="noopener noreferrer nofollow">tailwindcss-react-aria-components</a> plugin, you can skip the verbose syntax and work with clean, intuitive variants that feel just like native Tailwind utilities. This makes it much easier to keep your code readable, your workflow smooth, and your components accessible by default.</p> <p>In this article, we focused on styling. But that’s just the beginning. In the next one, we’ll take things a step further and explore how to animate React Aria Components with TailwindCSS, adding smooth motion to make your UI feel even more polished and engaging.</p> <p>Stay tuned!</p><p>The post <a href="https://www.hongkiat.com/blog/react-aria-tailwindcss-styling/">How to Style React Aria Components with TailwindCSS</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Coding Thoriq Firdaus Optimize your app battery using Android vitals wake lock metric http://android-developers.googleblog.com/2025/09/guide-to-excessive-wake-lock-usage.html Android Developers Blog urn:uuid:188488a0-7e71-4328-a3ba-7230d2562794 Thu, 02 Oct 2025 16:00:00 +0000 <p><i>Written by Alice Yuan, Senior Developer Relations Engineer</i></p><div><i><br /></i><div><span><span><div class="separator" style="clear: both; font-size: 14.6667px; text-align: center; white-space-collapse: preserve;"><iframe allowfullscreen="" class="BLOG_video_class" height="289" src="https://www.youtube.com/embed/-6mEvkLOlno" width="482" youtube-src-id="-6mEvkLOlno"></iframe></div></span></span><div class="separator" style="clear: both;"><div style="text-align: left;"><i>Most of the content of this post is also available in video format, go give it a watch!</i></div><div style="text-align: left;"><br /></div>Battery life is a crucial aspect of user experience and wake locks play a major role. Are you using them excessively? In this blog post we’ll explore what wake locks are, what are some best practices for using them and how you can better understand your own app’s behavior with the Play Console metric.</div><h2 style="text-align: left;">Excessive partial wake lock usage in Android Vitals</h2><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Play Console now monitors battery drain, with a focus on </span><a href="https://play.google.com/console/developers/app/vitals/metrics/details?metric=EXCESSIVE_BACKGROUND_WAKELOCKS&amp;days=28" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">excessive partial wake lock usage</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, as a key performance indicator.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This feature elevates the importance of battery efficiency alongside existing core metric stability indicators: excessive user-perceived crashes and ANRs. </span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Currently, an app exceeding the threshold will not be less discoverable on Google Play.</span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCqbeMHN5AZv4R7ZmV5d1H9T7SSVS22ZnLhEvy8sSXc9V9w2divLZD_4sNLP9-HIch0UCQL9uNYytc_16ryVkmSwbX3cm88JJ1lKpR64WQbWAYhtsGmCWi5AVxQ-AG2cFy53QPOhpzECD3uoRDRVeVBr_1lXuAVT-e0guAsYD6l6mW9oGw76KQZgT_a0g/s1134/asset1-android-vitals.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1101" data-original-width="1134" height="621" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCqbeMHN5AZv4R7ZmV5d1H9T7SSVS22ZnLhEvy8sSXc9V9w2divLZD_4sNLP9-HIch0UCQL9uNYytc_16ryVkmSwbX3cm88JJ1lKpR64WQbWAYhtsGmCWi5AVxQ-AG2cFy53QPOhpzECD3uoRDRVeVBr_1lXuAVT-e0guAsYD6l6mW9oGw76KQZgT_a0g/w640-h621/asset1-android-vitals.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><i style="font-family: inherit; text-align: left;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The excessive wake lock warning in the </span><a href="https://play.google.com/console/developers/app/vitals/metrics/overview" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android vitals overview</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></i></div><div class="separator" style="clear: both; text-align: center;"><i style="font-family: inherit; text-align: left;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></i></div></span><div style="text-align: left;">For mobile devices, the Android vitals metric applies to non-exempted wake locks acquired while the screen is off and the app is in the background or running a foreground service. Android vitals considers partial wake lock usage excessive if:</div><span><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Wake locks are held for at least two hours within a 24-hour period.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">It affects more than 5% of your app's sessions, averaged over 28 days.</span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Wake locks created by </span><a href="https://developer.android.com/develop/background-work/background-tasks/awake/wakelock/identify-wls#media" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">audio</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://developer.android.com/develop/background-work/background-tasks/awake/wakelock/identify-wls#location" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">location</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and </span><a href="https://developer.android.com/develop/background-work/background-tasks/awake/wakelock/identify-wls#jobs" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">JobScheduler</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> user initiated APIs are exempted from the wake lock calculation.</span></span></p></span><h2 style="text-align: left;">Understanding wake locks</h2><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">A wake lock is a mechanism that allows an app to keep a device's CPU running even when the user isn't actively interacting with it.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">A partial wake lock keeps the CPU running even if the screen is off, preventing the CPU from entering a low-power "suspend" state. A full wake lock keeps both the screen and the CPU running.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">There are 2 methods partial wake locks are acquired:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">The app manually acquires and releases the wake lock using </span><a href="https://developer.android.com/reference/android/os/PowerManager" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">PowerManager</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> APIs for a specific use case, often this is acquired in conjunction with a </span><a href="https://developer.android.com/develop/background-work/services/fgs" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Foreground Service</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> - a platform lifecycle API intended for user-perceptible operation.</span></span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Alternatively, the wake lock is acquired by another API, and attributed to the app due to usage of the API, more on this in the best practices section.</span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">While wake locks are necessary for tasks like completing a user-initiated download of a large file, their </span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">excessive or improper use can lead to significant battery drain</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. We've seen cases where apps hold wake locks for hours or fail to release them properly, leading to user complaints about significant battery drain even when they're not interacting with the app.</span></span></p></span><h2 style="text-align: left;">Best Practices for Wake Lock Usage</h2><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Before we go over how to debug excessive wake lock usage, ensure you’re following wake lock best practices.&nbsp;</span></p></span>Consider these four critical questions.</div><div><br /><b>1. Have you considered alternative wake lock options?</b><br /><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Before considering acquiring a manual partial wake lock, follow this decision-making flowchart:</span></p></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEj7IKuxWy034W7kFNcgIgPV7WylVsLTjLks79fIF3kKvGf6E6mg-Je640xmKMxPvMcXha-NPA-Tp9rIX5rUP4-SQws3HfcqQYi90RsLYvji9nNQSCsOQXOYyl4_YT3SG1yNYt1WxHj4MU8Rwjr6eV4mgVs8-ArJIEDBZK9NKfEUB3ouwWJU7zTVi37Dhds=s16000" /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><i>Flowchart to decide when to manually acquire a wake lock</i></p><span><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Does the screen need to stay on?</span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Yes: Reference the </span><a href="https://developer.android.com/develop/background-work/background-tasks/awake/screen-on" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Keep Screen On</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> documentation instead</span></span></p></li></ul><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Is the application running a foreground service?&nbsp;</span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">No: You don't need to manually acquire a wake lock.</span></p></li></ul><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Is it detrimental to the user experience if the device suspends?&nbsp;</span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir Android battery Kotlin Performance Wakelocks Android Developers Advanced Search Replace in Visual Studio Code with RegEx https://www.hongkiat.com/blog/advanced-search-replace-vscode-regex-guide/ hongkiat.com urn:uuid:ca7c9dfe-1d45-0d44-2f5e-ab5f8e23249c Wed, 01 Oct 2025 13:01:21 +0000 <p>One of the most useful features in Visual Studio Code (VS Code) is its search and replace tool. It allows you to quickly find and update text in your files. For even more control, the search tool also supports Regular Expressions (RegEx) to search using patterns instead of plain words. This can help you make&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/advanced-search-replace-vscode-regex-guide/">Advanced Search Replace in Visual Studio Code with RegEx</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>One of the most useful features in Visual Studio Code (VS Code) is its search and replace tool. It allows you to quickly find and update text in your files. For even more control, the search tool also supports <a href="https://www.hongkiat.com/blog/getting-started-with-regex/">Regular Expressions (RegEx)</a> to search using patterns instead of plain words. This can help you make big changes faster and more accurately.</p> <p>Let’s see how it works.</p> <hr> <h2>Enabling RegEx</h2> <p>To begin, open the “Search” view in VS Code by pressing <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd> (Windows/Linux) or <kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd> (macOS). Alternatively, you can access it via the left sidebar.</p> <p>Within the “Search” view, you’ll see a search input field and a replace input field. To enable RegEx, click the <code>.*</code> icon (the “Use Regular Expression” button) to the right of the search input field. This icon will highlight, indicating that RegEx is now active.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/advanced-search-replace-vscode-regex-guide/enable-regex.jpg" alt="Enable RegEx in VSCode Search" width="1000" height="600"> </figure> <p>Now you’re ready to start using RegEx. Let’s see some examples.</p> <hr> <h2>Uppercase to Lowercase</h2> <p>One common scenario is needing to change the case of characters.</p> <p>Let’s say you have quite a number of JSON files where one of the property values is in uppercase letters, for example: <code>"trip_flight_airline": "SQ"</code>. Since you have multiple files, changing them one by one wouldn’t be practical. This is where search and replace with RegEx comes in handy.</p> <p>However, if the requirement changes and the value needs to be in lowercase, for example: <code>"trip_flight_airline": "sq"</code>, you could do:</p> <p><strong>Search:</strong> <code>([A-Z]+)</code></p> <p>This will match any sequence of uppercase letters from A to Z.</p> <p><strong>Replace:</strong> <code>\L$1</code></p> <p>This will replace the entire matched string, and using the special pattern <code>\L</code>, it will replace the matched string with its corresponding lowercase characters.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/advanced-search-replace-vscode-regex-guide/uppercase-to-lowercase.jpg" alt="Converting Text to Lowercase VSCode" width="1000" height="600"> </figure> <hr> <h2>Lowercase to Uppercase</h2> <p>Similarly, if you need to change the case from lowercase to uppercase, you can do the following:</p> <p><strong>Search:</strong> <code>([a-z]+)</code></p> <p>This will match any single lowercase letter from a to z.</p> <p><strong>Replace:</strong> <code>\U$1</code></p> <p>This will replace the entire matched string and replace it with its corresponding uppercase characters.</p> <p>Changing the character case can be useful in many scenarios, such as when you need to standardize the case of property names or values in your code.</p> <hr> <h2>Capturing Groups and Reordering Text</h2> <p>RegEx can become really powerful when you use capturing groups which allow you to grab parts of the matched text and then rearrange them however you like.</p> <p>For example, let’s say you have dates written like this: <strong>07-15-2025</strong> (month-day-year), and you want to change them to this format: <strong>2025/07/15</strong> (year/month/day).</p> <p>You can do this in VS Code’s search and replace using the following pattern:</p> <p><strong>Search:</strong> <code>(\d{2})-(\d{2})-(\d{4})</code></p> <p>This will match any date in the format of two digits for the month, two digits for the day, and four digits for the year, separated by hyphens.</p> <p><strong>Replace:</strong> <code>$3/$1/$2</code></p> <p>This will rearrange the matched groups so that the year comes first, followed by the month and day, separated by slashes.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/advanced-search-replace-vscode-regex-guide/date-reordering.jpg" alt="Date Format Conversion Using RegEx" width="1000" height="600"> </figure> <hr> <h2>Transforming <code>snake_case</code> to <code>camelCase</code></h2> <p>Converting from snake_case, like <code>my_variable_name</code>, to camelCase, like <code>myVariableName</code>, is a common task when cleaning up or refactoring code.</p> <p>If your variable names start with a dollar sign (<code>$</code>), you can use RegEx in VS Code to do the search replace more efficiently.</p> <p><strong>Search:</strong> <code>(\$[^_\s\$\-\[]*?)_([a-z])</code></p> <p>This will match any variable that starts with a dollar sign, followed by any characters except underscores, spaces, dollar signs, or square brackets, and then an underscore followed by a lowercase letter.</p> <p><strong>Replace:</strong> <code>$1\U$2</code></p> <p>Here we combine the matched variable name with the second part of the match, which is the lowercase letter after the underscore, and convert it to uppercase using <code>\U</code>.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/advanced-search-replace-vscode-regex-guide/snakecase-to-camelcase.jpg" alt="Snake Case to Camel Case" width="1000" height="600"> </figure> <p>This will effectively transform <code>$my_variable</code> into <code>$myVariable</code>. However, since VS Code doesn’t support variable-length lookbehind, it won’t match variables that have more than one underscore, like <code>$my_variable_name</code>. In such cases, you’ll need to run the search and replace multiple times to handle each underscore separately.</p> <hr> <h2>Wrapping up</h2> <p>In this article, we’ve explored how to use RegEx in Visual Studio Code’s search and replace feature to perform advanced text transformations, from changing character cases to reordering text and converting variable naming conventions.</p> <p>Using RegEx in Visual Studio Code’s search and replace feature can significantly speed up your workflow, especially when dealing with large codebases or repetitive tasks.</p> <p>By mastering RegEx, you can quickly make complex changes across multiple files without the need for manual edits.</p><p>The post <a href="https://www.hongkiat.com/blog/advanced-search-replace-vscode-regex-guide/">Advanced Search Replace in Visual Studio Code with RegEx</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Coding regex visual studio code Thoriq Firdaus Let's talk security: Answering your top questions about Android developer verification http://android-developers.googleblog.com/2025/09/lets-talk-security-answering-your-top.html Android Developers Blog urn:uuid:10e29ce1-8a14-b9b5-c3da-24585a96ea36 Tue, 30 Sep 2025 17:44:22 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3UqI0C6qPC10GlSHWne-6cC1ZQcGKEsWZVJjJTzR2x0V3Jsvr3Mbtc0rpCtYppeDfKCYju41ZpK9GxNb5auQYVJdePc9LDN3mZ6EmUsAwTeclZsBHFCdDtztxdST4XdePENQN8nnq1v36MzqfVm3OdqN7LiHLVN4g7VvX1-LiqDihF1qpyWPhMGkrV40/s1600/%5B25%5D-Android-ADI-and-Android-Studio-Meta.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3UqI0C6qPC10GlSHWne-6cC1ZQcGKEsWZVJjJTzR2x0V3Jsvr3Mbtc0rpCtYppeDfKCYju41ZpK9GxNb5auQYVJdePc9LDN3mZ6EmUsAwTeclZsBHFCdDtztxdST4XdePENQN8nnq1v36MzqfVm3OdqN7LiHLVN4g7VvX1-LiqDihF1qpyWPhMGkrV40/s1600/%5B25%5D-Android-ADI-and-Android-Studio-Meta.png" style="display: none;" /> <img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1YS8SXWpEv8tAFD8BzL5j7tVmw-0F7hI2QzoaY_sbHUufJ5MpI03Rn4uP4Jkcx9kyY9nQvye2ICyWGCQhj_KhR9S6WOfgIYfwJGc_yzTC9yf-5ROO8c7gbMXNDNk9xT8PATQV8TuJZXVv_o5-qH7cS3OjkDeq46QjGUFi0XJ-siYfyLZg20ubG2EhUso/s1600/%5B25%5D-Android-ADI-and-Android-Studio-Blog.png" /> <em>Posted by&nbsp;</em><i>Matthew Forsythe, Director, Product Management, Android App Safety</i><div><em><br /></em><span id="docs-internal-guid-6bdcb585-7fff-bf52-77e1-9c8acd2bec12"><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Android recently </span><a href="https://android-developers.googleblog.com/2025/08/elevating-android-security.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">announced</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><a href="https://developer.android.com/developer-verification" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">developer verification</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, an extra layer of security that deters bad actors and makes it harder for them to spread harm.&nbsp;</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><b id="docs-internal-guid-194f7ca1-7fff-41ac-ed77-2b0056e9b7b0" style="font-weight: normal;"><br /></b></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Developer feedback is essential as we build this process. One of the most important themes we hear from the developer community is the need for more lead time to adapt to changes, which is why we announced this requirement more than a year before it takes effect. This extended timeline allows you to ask questions, provide feedback that will help shape the final process, and prepare for the new requirement, ensuring a smooth transition for your workflow.&nbsp;</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><br /><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We're committed to answering your top questions, which you can find regularly updated in our </span><a href="https://developer.android.com/developer-verification/guides" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">guides</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><a href="https://support.google.com/android-developer-console/answer/16561738" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">FAQ</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and we've compiled the most frequent answers below. </span><span style="font-family: inherit;"><span><span face="&quot;Google Sans&quot;, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For a deeper discussion </span></span></span><span style="font-family: inherit; white-space-collapse: preserve;">on developer identification</span><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, check out our conversation on </span><a href="https://www.youtube.com/watch?v=A7DEhW-mjdc&amp;feature=youtu.be" style="font-family: inherit; text-decoration-line: none;"><span face="&quot;Google Sans&quot;, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android Developer Backstage</span></a><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.&nbsp;</span></p></span></span><span><span><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="314" src="https://www.youtube.com/embed/A7DEhW-mjdc" width="563" youtube-src-id="A7DEhW-mjdc"></iframe></div></span></span><h2 style="text-align: left;">Does this mean sideloading is going away on Android?</h2>Absolutely not. Sideloading is fundamental to Android and it is not going away. Our new developer identity requirements are designed to protect users and developers from bad actors, not to limit choice. We want to make sure that if you download an app, it’s truly from the developer it claims to be published from, regardless of where you get the app. Verified developers will have the same freedom to distribute their apps directly to users through sideloading or through any app store they prefer.</div><div><h2 style="text-align: left;">How does developer verification impact my use of Android Studio?</h2><p><span id="docs-internal-guid-3c6d324f-7fff-b1dc-062c-8a3031487cc6"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are working to ensure these changes don’t have an impact on your day-to-day workflow so you can continue building your apps as smoothly as possible. Participating in developer verification </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">will not affect your experience in </span><a href="https://developer.android.com/studio" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android Studio</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">, the official IDE for Android app development.</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> You will continue to be able to build and run an app even if your identity is not verified. Android Studio is unaffected&nbsp; because deployments performed with </span><a href="https://developer.android.com/tools/adb" style="text-decoration-line: none;"><span style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">adb</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which Android Studio uses behind the scenes to push builds to devices, is unaffected. You can continue to develop, debug, and test your app locally by deploying to both emulators and physical devices, just as you do now.</span></span></span></p><span><p><span></span></p><h4 style="text-align: left;"><span id="docs-internal-guid-eaf460e8-7fff-929a-a1b5-837a76f31ea8"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">Making APKs available to your test team</span></span></span></h4><p><span>If your team’s current test process relies on distributing APKs to testers for installation using methods other than <a href="https://developer.android.com/tools/adb" style="text-decoration-line: none;" target="_blank"><span face="'Google Sans Text', sans-serif" style="background-color: #f1f3f4; border-radius: 4px; border: 1px solid rgb(218, 220, 224); color: #3c4043; font-size: 11pt; padding: 1px 5px; vertical-align: baseline;">adb</span></a>, you will need to verify your identity and register the package. This also applies if you make APKs available to your test teams through </span><a href="https://play.google.com/console/about/internal-testing/" style="text-decoration-line: none;" target="_blank"><span>Google Play Internal Testing</span></a><span>, </span><a href="https://firebase.google.com/docs/app-distribution" style="text-decoration-line: none;" target="_blank"><span>Firebase App Distribution</span></a><span>, or similar solutions through other distribution partners.</span></p></span><h2 style="text-align: left;">Do I still need to register my apps if I’m only distributing to a limited number of users?</h2></div>We recommend you register. It's a simple, one-time process that will allow anyone to download and install your app. However, if you prefer not to, we are also introducing a free developer account type that will allow teachers, students, and hobbyists to distribute apps to a limited number of devices without needing to provide a government ID.<div><br /><span><div style="text-align: left;"><span><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If you’re interested in a limited distribution account, we want to </span><a href="https://goo.gle/verification-feedback-survey" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">hear from you</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to shape the experience.</span></span></span></div><p></p><p><span></span></p><h2><span>What can I do to prepare for developer verification?</span></h2><p><span>The best way to get ready and stay updated is to sign up for </span><a href="https://goo.gle/android-verification-early-access" style="text-decoration-line: none;" target="_blank"><span>early access</span></a><span>. We’ll start sending invitations in October.</span></p><p><span>We recommend you participate in developer verification because, even though verification is not required to develop apps with Android Studio, you will need it to distribute apps to certified Android devices. Apps installed through enterprise management tools on managed devices will also be installable without being registered.</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span>Please let us know if you have any </span><a href="https://goo.gle/Android-verification-feedback" style="text-decoration-line: none;" target="_blank"><span>feedback or questions</span></a><span> about the verification requirements.</span></p><div><br /></div></span> </div> Birna Fresh Resources for Web Designers and Developers (September 2025) https://www.hongkiat.com/blog/designers-developers-monthly-09-2025/ hongkiat.com urn:uuid:a0e51220-45a0-fe11-24e3-3ff549e5e169 Tue, 30 Sep 2025 13:00:10 +0000 <p>We’re back with another round of fresh tools and resources for developers and designers. This month’s collection features a handy mix of AI-powered tools, UI kits, some cool WordPress projects, and more. Whether you’re looking to boost productivity, streamline your workflow, or just try something new, there’s plenty here worth checking out. Without further ado,&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-09-2025/">Fresh Resources for Web Designers and Developers (September 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>We’re back with another round of fresh tools and resources for developers and designers.</p> <p>This month’s collection features a handy mix of <a href="https://www.hongkiat.com/blog/ai-writing-tools/">AI-powered tools</a>, UI kits, some cool WordPress projects, and more. Whether you’re looking to <a href="https://www.hongkiat.com/blog/how-to-boost-productivity/">boost productivity</a>, streamline your workflow, or just try something new, there’s plenty here worth checking out.</p> <p>Without further ado, let’s dive in!</p> <div class="ref-block ref-block--tax noLinks" id="ref-block-tax-74168-1"> <a href="https://www.hongkiat.com/blog/tag/fresh-resources-developers/" target="_blank" class="ref-block__link" title="Read More: Click Here for More Resources" rel="bookmark"><span class="screen-reader-text">Click Here for More Resources</span></a> <div class="ref-block__thumbnail img-thumb img-thumb--jumbo" data-img='{ "src" : "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" }'> <noscript> <style>.no-js #ref-block-tax-74168-1 .ref-block__thumbnail { background-image: url( "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" ); }</style> <p> </p></noscript> </div> <div class="ref-block__summary"> <h4 class="ref-title">Click Here for More Resources</h4> <div class="ref-description"> <p>Check out our complete collection of hand-picked tools for designers and developers.</p> </div></div> </div> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://basecoatui.com">BaseCoatUI</a></h2> <p><strong>BaseCoatUI</strong> is a <a href="https://www.hongkiat.com/blog/tailwind-css/">Tailwind CSS</a> UI library that brings <a rel="nofollow noopener" target="_blank" href="https://ui.shadcn.com">shadcn/ui</a> design to plain HTML, without React.js. It works with any stack, needs little JavaScript, supports dark mode, and offers simple, accessible, theme-compatible components.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/basecoat.jpg" alt="BasecoatUI <a href=" https:>Tailwind CSS components” width=”1000″ height=”600″> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/MotiaDev/motia">Motia</a></h2> <p><strong>Motia.dev</strong> is a backend framework that unifies APIs, jobs, workflows, events, and AI agents. It supports multiple languages including JavaScript, TypeScript, and Python, requires no setup, and comes with built-in tools for debugging and monitoring.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/motia.jpg" alt="Motia unified backend framework" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/mxrch/GHunt">Ghunt</a></h2> <p><strong>GHunt</strong> is an Open Source Intelligence (OSINT) tool that collects publicly available data from Google accounts using a Gmail address, revealing linked services like YouTube, Maps, Drive, and more. It runs locally, exports results to JSON, and is widely used by investigators and security researchers.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/ghunt.jpg" alt="GHunt OSINT Google tool" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://omarchy.org">Omarchy</a></h2> <p><strong>Omarchy</strong> from <a rel="nofollow noopener" target="_blank" href="https://x.com/dhh">DHH</a> is an Arch-based Linux distro with the Hyprland window manager. It provides a preconfigured, polished system for developers with popular apps like Neovim, Spotify, and <a rel="nofollow noopener" target="_blank" href="https://www.chromium.org/getting-involved/download-chromium/">Chromium</a>, full-disk encryption, and a productivity-focused UI.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/omarchy.jpg" alt="Omarchy Linux developer distro" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://hypr.land">Hypr.land</a></h2> <p><strong>Hyprland</strong> is a lightweight, independent <a rel="nofollow noopener" target="_blank" href="https://wiki.archlinux.org/title/Wayland">Wayland compositor</a> and dynamic tiling window manager written in C++. It offers advanced customization, plugins, and visual effects like animations, blur, and gradient borders, while supporting features such as dynamic workspaces, instant config reloads, and global keybinds.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/hyprland.jpg" alt="Hyprland Wayland window manager" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/iyaja/llama-fs">LlamaFS</a></h2> <p><strong>LlamaFS</strong> is an open-source AI file manager that uses Llama 3 to automatically analyze, rename, and organize files by content. It’s a very helpful tool for managing your messy folders.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/llama-fs.jpg" alt="LlamaFS AI file manager" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/zyedidia/micro">Micro</a></h2> <p><strong>Micro</strong> is a lightweight, user-friendly terminal text editor designed as a modern successor to nano. It’s a single binary with no dependencies, offering syntax highlighting for 130+ languages, multiple cursors, mouse support, splits, tabs, clipboard integration, and Lua plugins. A great choice for devs looking for a simple yet powerful terminal editor.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/micro.jpg" alt="Micro terminal text editor" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/thomiceli/opengist">OpenGist</a></h2> <p><strong>Opengist</strong> is a self-hosted, Git-powered pastebin that works like <a rel="nofollow noopener" target="_blank" href="https://gist.github.com">GitHub Gist</a>. It supports versioned code snippets, public or private sharing, syntax highlighting, markdown, search, and OAuth2 login. A great application if you’re looking for collaborative snippet management that you can host yourself.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/opengist.jpg" alt="OpenGist self-hosted code sharing" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://csswizardry.com/Obs.js/demo/">Obs.js</a></h2> <p><strong>Obs.js</strong> is a <a href="https://www.hongkiat.com/blog/responsive-lightbox-library/">JavaScript library</a> that improves web performance by detecting a user’s device, network, and battery status through browser APIs, then adapting the site or app to optimize speed and resource usage. If you’re building a web app that needs to run well on a variety of devices and conditions, Obs.js can help you deliver a better user experience.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/obsjf.jpg" alt="Obs.js performance optimization library" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/shadcn-ui/alpine-registry">Alpine Registry</a></h2> <p>The <strong>Alpine Registry</strong> is an MCP-compatible example registry for distributing code with the shadcn/ui components. It works with the shadcn CLI to help automate setting up and managing React component libraries or design systems. A great tool if you’re using shadcn/ui and want to streamline your component workflow.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/alpine-registry.jpg" alt="Alpine Registry shadcn components" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/kagehq/port-kill">PortKill</a></h2> <p><strong>Port Kill</strong> is a lightweight macOS status bar app that helps developers monitor and manage processes running on specific ports. It scans ports every 5 seconds, shows active processes, and allows you to kill them individually or all at once with a click. A very handy tool for freeing up ports quickly during development.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/killport.jpg" alt="PortKill macOS port manager" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/postalsys/emailengine">EmailEngine</a></h2> <p><strong>EmailEngine</strong> is a headless email client with a unified REST API for IMAP, SMTP, Gmail, and Microsoft Graph. It allows you to sync, send, and monitor emails, integrate accounts, and get real-time notifications via webhooks, without dealing with IMAP or MIME details.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/emailengine.jpg" alt="EmailEngine unified email API" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/dockur/windows">Dockur Windows</a></h2> <p><strong>Dockur Windows</strong> allows you to spin up full Windows desktops and servers, from XP all the way to 11, with Docker containers. Instead of messing with heavy VM software, it leans on Docker with KVM acceleration. This provides a simpler and lighter way to test or play with Windows environments.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/docker-windows.jpg" alt="Dockur Windows in containers" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/ibelick/motion-primitives">Motion Primitives</a></h2> <p><strong>Motion Primitives</strong> is an open-source UI kit packed with ready-to-use motion components for React, Next.js, and <a href="https://www.hongkiat.com/blog/tailwind-css/">Tailwind CSS</a>. It makes adding smooth, polished animations to your app a breeze. A great resource if you want to enhance your UI with motion without building everything from scratch.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/motion-primitives.jpg" alt="Motion Primitives React animations" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/cohere-ai/cohere-toolkit">Cohere Toolkit</a></h2> <p><strong>Cohere Toolkit</strong> is an open-source kit of pre-built components that makes spinning up <abbr title="Retrieval-augmented generation">RAG</abbr> apps significantly faster. With this toolkit, you can reduce development time from months to weeks, or even minutes, getting from idea to deployment quickly.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/cohere.jpg" alt="Cohere RAG development toolkit" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/kasparsd/wp-docs-md">WP Docs MD</a></h2> <p><strong>WP Docs MD</strong>, built by <a rel="nofollow noopener" target="_blank" href="https://kaspars.net">Kaspars Dambis</a>, turns WordPress docs into Markdown, pulled straight from the REST API with custom PHP scripts. Handy for offline use, AI prompting, or if you just prefer working in plain text.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/wp-docs-md.jpg" alt="WordPress docs to Markdown" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://telex.automattic.ai">Telex</a></h2> <p><strong>Telex</strong> is a new experimental AI tool from <a rel="nofollow noopener" target="_blank" href="https://automattic.com">Automattic</a> that allows you to “vibe code” Gutenberg blocks for WordPress. Just type what you want – like a block with text, images, or columns – and Telex will generate a ready-to-install zip file that you can drop into your site or test in WordPress Playground. First demoed at WordCamp US 2025 by <a rel="nofollow noopener" target="_blank" href="https://ma.tt">Matt Mullenweg</a>, it’s still early days, but it could make block development way more accessible.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/telex.jpg" alt="Telex AI WordPress blocks" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/Jameswlepage/rsl-wp">WordPress RSL</a></h2> <p><strong>Really Simple Licensing (RSL)</strong> is a WordPress plugin that makes your site’s licensing terms machine-readable. It adds clear signals so AI tools, crawlers, and other automated systems actually know how your content can be used. A handy way to keep licensing of your content simple.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/rsl.jpg" alt="WordPress RSL licensing plugin" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/charmbracelet/vhs">VHS</a></h2> <p><strong>VHS</strong> is a CLI tool for turning your terminal sessions into slick GIFs or videos. You write a “tape” file that describes your commands and keystrokes, and VHS renders it into shareable demos (GIF, MP4, etc.). Perfect for showing off your CLI tools without messy screen recordings.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/vhs.jpg" alt="VHS terminal recording tool" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/cachix/devenv">Devenv.sh</a></h2> <p><strong>Devenv.sh</strong> makes spinning up dev environments painless. You define configurations with Nix in simple config files. Just run devenv shell and you’ll get packages, services, git hooks, tests, scripts, and containers – all wired up automatically. It’s a great way to standardize and automate your development setups.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-09-2025/devenv.jpg" alt="Devenv.sh development environments" width="1000" height="600"> </figure><p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-09-2025/">Fresh Resources for Web Designers and Developers (September 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Web Design Tools for Designers & Developers Hongkiat Lim #WeArePlay: Meet the people building vibrant communities with their apps and games http://android-developers.googleblog.com/2025/09/weareplay-meet-the-people-building-vibrant-communities-with-their-apps-and-games.html Android Developers Blog urn:uuid:514df629-5568-cbb5-0d04-f23df1308db0 Wed, 24 Sep 2025 16:45:49 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em><div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" imageanchor="1"><img style="margin: auto; display: block;" border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> stories, we meet the founders who turned their interests into vibrant communities through their apps and games on Google Play - from democratizing music production for artists in Brazil to building a global network for Black professionals.</p><p>Here are a few of our favorites:</p> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Erik and Kelvin’s app Murb connects and enables indie artists in Brazil to create and distribute music from their phones." border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Ux4E4BpQ4Ojs3ifq6bcYEyfx2Ehb8TGYSXt0ELGoN4ztjwxFOx3i0z5R22U08MM_225-8j395cT840zcn7313BbWFXEOxpHA4gnX2PUQPiDBeMptoOlF9dBDGVSzAm7ULXfnrBVCFzRxWQ0yAIKv1XpSfnrTuBxgUiZBe0vPalqzKkl14h5DcMisHR4/s1600/01_BRAZIL_MURB_FOUNDER_ERICK%20MACEDO_KELVIN%20MACEDO_edited.jpg"/></a></div></div><imgcaption><center><center><center><i>Erick and Kelvin, co-founders of Murb &nbsp;</i></center><center><i>São Bernardo do Campo, Brazil</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Erik and Kelvin’s app Murb connects and enables indie artists in Brazil to create and distribute music from their phones.</span></h4> <p>Brothers Erick and Kelvin combined their passion for Brazil's urban culture from skateboarding to graffiti with their professional experience in tech to create <a href="https://play.google.com/store/apps/details?id=com.batalhafunk.app&hl=en_CA&gl=br" target="_blank">Murb</a>. Their app empowers young, independent artists in the rap, trap, and funk communities to produce music directly on their phones, providing a vital platform for those who lack access to studios. With recent features like producer profiles to help musicians sell their work and plans to integrate with major streaming platforms, Murb is on a mission to democratize music production.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Channing’s app BlackListed empowers Black professionals with a dedicated platform to build community, share career milestones, and directly support Black-owned businesses." border="0" data-original-height="720" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQlN6k0o31rn0fMl4Zu0SdiWtsPehB-X6Od1B1IjvF1peAr6HQrrMEQJkACntEpN4wcqmJshbv4KqGYGDnkwdNT3wXPknx7-NXrv1MQSu2atKkWFF7u9_7hKERah6-Wsm4NwBwFZZCWYbeONfj51MEmNxlRoorBO9doRUiXu2uhBfxwIj8tzGzPdiEAJE/s1600/01_USA_BLACKLISTED_FOUNDER_CHANNING%20BELL_edited.png"/></a></div></div><imgcaption><center><center><center><i>Channing, founder of BlackListed&nbsp;</i></center><center><i>Texas, U.S.</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Channing’s app BlackListed empowers Black professionals with a dedicated platform to build community, share career milestones, and directly support Black-owned businesses.</span></h4> <p>After working as a product manager in the energy sector, Channing saw the need for a dedicated space where Black professionals could connect, celebrate achievements, and support each other. She created <a href="https://play.google.com/store/apps/details?id=com.blacklisted.app&hl=en-US&gl=us" target="_blank">BlackListed</a>, a social networking app for users to share career milestones and job updates. Channing is now preparing to launch a new shopping feature to support Black-owned businesses directly through the app, with plans to expand the platform to Canada and Africa.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Zeyang, Kan and Susheng built a global community with their popular game Soul Knight." border="0" data-original-height="1500" data-original-width="2000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwEUAHW2rv5f_ipGl7h8O97HOUsBlXKR3D-b2fm0UV1qYNtNTpEYKqG3zXPrkWChFJ6SdIw7BcLDfPgtRLDN5JGdGwB1MfU_Jle64ZZ1FkjEkAR-w8p8JHSO1qHB_ZiFuVavAJk0WxDCx0PWMFWxFJJuF5xyayCdSYPCIjPWk98bBmJfmQ0BDwT4s1neE/s1600/01_CHINA_CHILLYROOM_FOUNDERS_Xie%20Shusheng_Zeyang%20Li_Cao%20Kan_edited.png"/></a></div></div><imgcaption><center><center><i>Zeyang, Kan, and Susheng, co-founders of ChillyRoom &nbsp;</i></center><center><i>Shenzhen, China&nbsp;</i></center></center></imgcaption></image> <h4><span style="font-size: large;">Zeyang, Kan and Susheng built a global community with their popular game Soul Knight.</span></h4> <p>After meeting in the U.S. while studying computer science, Zeyang, Kan, and Susheng united over a shared passion for gaming to launch ChillyRoom. Their hit title, <a href="https://play.google.com/store/apps/details?id=com.ChillyRoom.DungeonShooter&hl=en&gl=cn" target="_blank">Soul Knight</a>, is a rogue-like pixel shooter built purely for fun, intentionally avoiding pay-to-win mechanics. The game’s co-op and local multiplayer modes helped it spread rapidly through word-of-mouth in schools and dorms, building a dedicated global community. Today, the team is developing new projects while staying true to their mission of providing opportunities for the next generation of game developers.</p><p><br /></p> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> </div> Birna Introducing the Google Play Games Level Up program http://android-developers.googleblog.com/2025/09/introducing-google-play-games-level-up.html Android Developers Blog urn:uuid:a9121af5-1c51-090d-6f5c-d02c026efcf0 Tue, 23 Sep 2025 17:21:26 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN7zln6qhWTgIHzgExMfUqKwmSz8zXMPRq9EIGMpceDRLpXWc1htcMTcdisiIIgg5Cvpro1M-AlqFBgEsMyUbO7SEu150CGsezUlwVPr78hhEayAao06oudIrvzi2V_oIHgkbOovlBE9TFMacpRAp5mQY-jRGg3MdIjFC2C542rAVtjsBaXAlrUz1AhIo/s1600/Blog%20Assets_Hero%20thumbnail.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN7zln6qhWTgIHzgExMfUqKwmSz8zXMPRq9EIGMpceDRLpXWc1htcMTcdisiIIgg5Cvpro1M-AlqFBgEsMyUbO7SEu150CGsezUlwVPr78hhEayAao06oudIrvzi2V_oIHgkbOovlBE9TFMacpRAp5mQY-jRGg3MdIjFC2C542rAVtjsBaXAlrUz1AhIo/s1600/Blog%20Assets_Hero%20thumbnail.png" style="display: none;" /> <em>Posted by&nbsp;</em><i>Aurash Mahbod&nbsp;</i><em>–</em><i>&nbsp;VP and GM, Games on Google Play</i><div><i><br /></i><div><div><div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMM5Ff-2mq6PJQ1DX4Lv42zOxuwWuYeD_rKwDmuotva4bY6ZDLSSUNU2Y8WcR6vnF7mqwEzESUpmT0cPYXWvmnJ94HVBXHGusQoWMglkkUgl4OmQiJj-Ou8gxKqBfoq8U3FkVKloszqqzz-RHmMO0LeSPvFAilAd64NY8xjmSylakeGUuGCyGDNpxP_H8/s4209/Blog%20Assets_Hero%20banner.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMM5Ff-2mq6PJQ1DX4Lv42zOxuwWuYeD_rKwDmuotva4bY6ZDLSSUNU2Y8WcR6vnF7mqwEzESUpmT0cPYXWvmnJ94HVBXHGusQoWMglkkUgl4OmQiJj-Ou8gxKqBfoq8U3FkVKloszqqzz-RHmMO0LeSPvFAilAd64NY8xjmSylakeGUuGCyGDNpxP_H8/s16000/Blog%20Assets_Hero%20banner.png" /></a></div><br /></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>We’re evolving Google Play Games into an integrated experience centered on the player journey. Today, players have to jump between different platforms to discover, play, and socialize. Our goal is to connect these journeys to create the <a href="https://blog.google/products/google-play/curation-update-september-2025" rel="nofollow" target="_blank">best gaming experience for players</a> and grow your business. Games that offer seamless and rewarding experiences achieve higher engagement and growth on Play. That’s why we’re introducing <b>Google Play Games Level Up</b>, a new way we’re leveling up the player experience and unlocking greater success for your business.</div><p>The <a href="https://play.google.com/console/about/levelup" rel="nofollow" target="_blank">Level Up program</a> is open to all games¹, including access to powerful tools and promotional opportunities. Games can stay enrolled in the program and maximize benefits by meeting the user experience guidelines by each <a href="https://play.google.com/console/about/levelup/#program-milestones" target="_blank">program milestone</a>, the first milestone date being July 2026. Let’s take a closer look at the benefits and guidelines of Google Play Games Level Up.</p> <iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/xy9wq-hreNE" width="100%" youtube-src-id="xy9wq-hreNE"></iframe> <h2><span style="font-size: x-large;">Program benefits to accelerate your growth</span></h2> <p>Games that are part of the Level Up program can access a suite of benefits to accelerate business growth. This includes a new space to engage with players, access to content tools in Play Console, and enhanced discovery opportunities through editorial surfaces on the Play Store.</p> <ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px; text-align: left;"> <li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline;"> <p><b>Re-engage players on You tab.</b> You tab² is a new personalized destination on the Play Store where players can view content and rewards from games they’ve recently played, all in one dedicated place. It’s designed to help you re-engage and retain players by showcasing your latest events, offers, and updates.<br /><br />Games can feature their content on You tab using <a href="http://play.google.com/console/about/engagement" rel="nofollow" target="_blank">engagement tools</a> in Play Console. You can drive player engagement through a rich store presence using promotional content, Play Points coupons, YouTube videos, and <a href="https://developer.android.com/games/pgs/achievements" rel="nofollow" target="_blank">achievements</a>, which all show up on your game detail page and You tab.</p><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifa0uuSGh-cxqCuYEufRWwPjERyPJVj8qh59D-uzMt1C_1TpmSpGnmlGIJL-bOYd5tVUqDerfYLfKCNwoG9u2v2m9LMdGG4uFraz2tybkjtUQAQCOW3Oykgq6XgAyNd3VJz7-3Z2gBf6CBtK9WMjcO6KAwRgZc4uAimZNjsiij5UvJIBidAaLlqOUWGOo/s1920/Blog_Level_Up_Benefit_Section_You_Tab_16x9_v01.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Re-engage players on You tab." border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifa0uuSGh-cxqCuYEufRWwPjERyPJVj8qh59D-uzMt1C_1TpmSpGnmlGIJL-bOYd5tVUqDerfYLfKCNwoG9u2v2m9LMdGG4uFraz2tybkjtUQAQCOW3Oykgq6XgAyNd3VJz7-3Z2gBf6CBtK9WMjcO6KAwRgZc4uAimZNjsiij5UvJIBidAaLlqOUWGOo/s16000/Blog_Level_Up_Benefit_Section_You_Tab_16x9_v01.gif" /></a></div><br /><imgcaption><center><em>Clash of Clans is re-engaging players through You tab</em></center></imgcaption><p></p><br /></li> <li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline;"><p><b>Maximize your game’s reach.</b> To make it easier for players to discover great games, we’re incorporating the user experience guidelines into our editorial criteria. Games that are part of the program will have the opportunity for prominent boosts across the store including featuring opportunities and Play Points boosters and quests. Titles that are part of the program will have more opportunities to be recommended through editorial surfaces across the store including the Games home and Play Points home.&nbsp;&nbsp; <image></image></p><div style="text-align: center;"><img alt="Maximize your game's reach." border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnibykB1HL6812eFnnEYJg14a3UBVzdAKKW5I2KvYBofWQuJ9W9r2XtcO1_7erT2MalnUzqkB5QWFcV7-T86xrhaqb2YQeSIV9bfIm73UdwwuLqJByH6iEH7dP6QemfFbUClvMcX_jEnliLWPtU50eAmouhTvt4JYVuecuBdhEE0jD5ARaGGU7x2S-76o/s1600/Blog_asset_program%20benefits.png" style="display: block; margin: auto; width: 100%;" /></div><br /><imgcaption><center><em>Get more opportunities to be featured on editorial surfaces</em></center></imgcaption><p></p><br /></li> <li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline;"><p><b>Unlock deeper performance insights. </b>Making the right decisions to grow your game requires a clear picture of your entire business. Next year, we're introducing more advanced reporting in Play Console. You'll be able to connect the dots from player acquisition to long-term engagement and monetization, giving you the holistic insights needed to optimize your growth strategy with confidence.</p></li></ol><h2 style="text-align: left;"> <span style="font-size: x-large;">Guidelines built on great user experience</span></h2></div><div style="text-align: left;"><span><p style="font-size: medium;">Games can stay enrolled in the program and access benefits by meeting the user experience guidelines. These guidelines are based on what players want: a seamless, rewarding experience everywhere they play. To deliver on this, we've established three core user experience guidelines:</p></span><ol style="text-align: left;"> <li><b>Player continuity:</b> Today’s players enjoy their games across multiple devices. They want to continue playing without missing a beat. Cloud save makes this possible, Cloud save makes this possible, while Play Games Services automatically syncs their sign-in credentials for a seamless experience.<br /><br />We're making this experience even better with Play Games Sidekick. The new in-game overlay gives players instant access to their rewards, offers, and achievements, driving higher engagement for your game. With AI-driven tips and advice, Sidekick helps players stay immersed in the games they love. Starting early next year, you can enable this experience by using a simple toggle in Play Console with a streamlined testing process.</li> <ul><li><a href="https://developer.android.com/games/guidelines#play-games-sidekick" target="_blank">Play Games Sidekick</a> <i>July, 2026</i></li><li><a href="https://developer.android.com/games/pgs/savedgames" target="_blank">Cloud save</a> <i>November, 2026</i></li><li><a href="https://developer.android.com/games/pgs/account-linking" target="_blank">Seamless restore</a><i> November, 2026</i></li></ul><image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidLqmKvwhjQ2bfT4YCuQEvEKjdD-7_oVEIKSpJjmvAk5YIp7_rF5yNy4JXj1TE_lqd1K4IF0vocQQGyqFQSaXvhwx0NBYFKLgXzDpRZTCE8tWLJ-iGQOITd3_SpmHmTCTL9swInadnUc0amJ94ib35fPD5LpwBRxDOYDzPjgjEtD7h3df1cek-kgXA3Dk/s1920/Blog_Level_Up_Guideline_Section_Gameplay_Continuity_16x9_v01.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidLqmKvwhjQ2bfT4YCuQEvEKjdD-7_oVEIKSpJjmvAk5YIp7_rF5yNy4JXj1TE_lqd1K4IF0vocQQGyqFQSaXvhwx0NBYFKLgXzDpRZTCE8tWLJ-iGQOITd3_SpmHmTCTL9swInadnUc0amJ94ib35fPD5LpwBRxDOYDzPjgjEtD7h3df1cek-kgXA3Dk/s16000/Blog_Level_Up_Guideline_Section_Gameplay_Continuity_16x9_v01.gif" /></a></div></div><br /><imgcaption><center><em>Play Games Sidekick keeps players immersed in your game</em></center></imgcaption></image><br /><br /> <li><b>Rewarding player journeys: </b>Players love seeing the time and effort they invest in games be recognized and rewarded. By designing achievements that span the lifetime of the game—celebrating progression to discovering hidden surprises or even acknowledging failed attempts—you can make a player's entire experience feel more engaging and valued. By implementing high quality achievements, you’ll become eligible for Play Points quests that reward players for completing each achievement and increase retention for your game.</li><ul><li><a href="https://developer.android.com/games/pgs/achievements" target="_blank">Achievements</a> <i>July, 2026</i></li></ul> <image><div style="text-align: center;"><img alt="Cross device gameplay:" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLwBgXoLJthGwC6QfwjDYbD-FCYuy1AgVQN3whVLLDw-3p8BqU3O6tv6F2bA6zkliWOtr8bCXj6L2F_s4c3Onb2ltbXWCOGbDbEy6Q24CpErH0jGD1kD1c0GE8u5Vbyv9tdpl27XTJUalksu6b9vVSrrZYk3WnkVfErX1y7K2HiVqFVie2-tlCPN21a-k/s1920/Blog_Level_Up_Benefit_Section_Rewarding_Player_16x9_v01.gif" style="display: block; margin: auto; width: 100%;" /></div><br /><imgcaption><center><em>DREDGE rewards player progression through achievements</em></center></imgcaption></image><br /> <li><span><b>Cross device gameplay: </b>Players want the flexibility to enjoy their favorite games on any device. We’ve seen games optimized for multiple device types—from mobile to tablet to PC—drive higher player engagement and spend.&nbsp; To make these games even easier for players to find, we are launching new in-store discovery features later this year to prominently showcase titles with great cross device and input support. <br /><br />You can give your players the flexibility to play how they want by adding keyboard and mouse support, as well as controller support—which also unlocks better gaming with attachable mobile controllers and Android XR. Google Play Games on PC makes it easier to bring your mobile game to a new audience with a streamlined distribution using Play Console.<br /></span></li><ul><li> <a href="https://developer.android.com/games/guidelines#cross-device-gameplay" target="_blank">Controller and mouse / keyboard support</a>&nbsp;<i>Recommended</i></li><li><a href="https://developer.android.com/games/playgames/overview" target="_blank">Play on PC</a>&nbsp;<i>Recommended</i></li></ul> <image><div style="text-align: center;"><img alt="Start exploring Google Play Games Level Up today" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9CSHPh_OcSgpePSkMnL38R02SaFB2y_5gOzJj8gX2mvT1jtjiXvnFKLUQgHmy4I72mzJOTE04FMD1EnqbTyL3wYhvUSr0y7WS7Vf3m9-XZlr3-7wHRMAaNDpd_12_XtYrisP_2UV7JrYq5yryOl2qHJJT6sQz8wPdIGH7L3gCjcix5ghX_Yks7aum4MY/s1600/Blog_Timeline.png" style="display: block; margin: auto; width: 100%;" /></div><imgcaption><center><em>User experience guidelines by each program milestone</em></center></imgcaption></image></ol> <h2 style="text-align: left;"><span style="font-size: x-large;">Start exploring Google Play Games Level Up today</span></h2><p>The <a href="https://play.google.com/console/about/levelup" rel="nofollow" target="_blank">Level Up program</a> is rolling out in Play Console starting today. Player expectations and developer needs are always evolving. The Level Up program is designed to evolve with them which is why user experience guidelines and benefits may be updated over time. We’re committed to providing updates early so you can make informed decisions about the program.&nbsp;</p><p>Google Play Games Level Up is how we’re investing in your success and creating the best experience for players. We believe that by partnering to build amazing experiences, we can build a stronger ecosystem for everyone.</p><span><a name='more'></a></span><br /><i><span style="font-size: x-small;">¹ Games in the Casino category, including social casino and real-money wagering titles, may have limited access to certain program benefits.<br />² You tab is available in countries where Google Play Points is offered. See the <a href="https://support.google.com/googleplay/answer/9077312" target="_blank">Play Points Help Center</a> for details. </span></i><ul><ul> </ul></ul></div></div> Android Developer Google Play Android Developers Elevating media playback: Introducing preloading with Media3 - Part 1 http://android-developers.googleblog.com/2025/09/introducing-preloading-with-media3.html Android Developers Blog urn:uuid:cc2fd3d4-7f80-ea7c-bc7d-0287b7d39960 Tue, 23 Sep 2025 15:47:21 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xfaeSVwhItxPTRdI2vEUu6t8ZSJWKMYB6xWkb9inI8ab1GltWuCExl29Z8SAQ1Fo2A4moEQLykBdkjIZ_IqikrD-QrmkwWKCOaKALh5fMiV5SRRUM7JRmjavEZ64horigEBxNK5RtW_NI88_LjbqTa69Os3a-ADQbrNp7R5e78dXmkc7rsYyx3cRYdo/s1600/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Card%20%281%29.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xfaeSVwhItxPTRdI2vEUu6t8ZSJWKMYB6xWkb9inI8ab1GltWuCExl29Z8SAQ1Fo2A4moEQLykBdkjIZ_IqikrD-QrmkwWKCOaKALh5fMiV5SRRUM7JRmjavEZ64horigEBxNK5RtW_NI88_LjbqTa69Os3a-ADQbrNp7R5e78dXmkc7rsYyx3cRYdo/s1600/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Card%20%281%29.png" style="display: none;" /> <em>Posted by Mayuri Khinvasara Khabya - Developer Relations Engineer (<a href="https://www.linkedin.com/in/mayurikhinvasara" target="_blank">LinkedIn</a> and <a href="https://x.com/mayuri_k" target="_blank">X</a>)</em> <div><br /></div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1PmhSCIphw3wGW7dJ9Yr7LLgG_6rqNwklO04UO6iZAsh6HjosgOn_SovJ8sEJvNYdeU08nMgnHQ3_L8F3pNU0Z72viRxqg8Ir0ceP-XVx45lkfImCbLnKywl7lho5CWJt0hBqt5dehuzLLpkrmkHdpTXRCzokmV4m3lswrsxAHWRHCstygUnK5PKCrO4/s1600/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Banner.png"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1PmhSCIphw3wGW7dJ9Yr7LLgG_6rqNwklO04UO6iZAsh6HjosgOn_SovJ8sEJvNYdeU08nMgnHQ3_L8F3pNU0Z72viRxqg8Ir0ceP-XVx45lkfImCbLnKywl7lho5CWJt0hBqt5dehuzLLpkrmkHdpTXRCzokmV4m3lswrsxAHWRHCstygUnK5PKCrO4/s1600/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Banner.png" /></a> <p align="justify">In today's media-centric apps, delivering a smooth, uninterrupted playback experience is key to a delightful user experience. Users expect their videos to start instantly and play seamlessly without pauses.</p> <p align="justify">The core challenge is latency. Traditionally, a video player only starts its work—connecting, downloading, parsing, buffering—after the user has chosen an item for playback. This reactive approach is slow for today's short form video context. The solution is to be proactive. We need to anticipate what the user will watch next and get the content ready ahead of time. This is the essence of preloading.</p> <p>The key benefits of preloading include:</p> <ul><ul> <li align="justify"><b> ExoPlayer Media media3 Performance Preloading Android Developers Elevating media playback : A deep dive into Media3’s PreloadManager - Part 2 http://android-developers.googleblog.com/2025/09/a-deep-dive-into-media3-preloadmanager.html Android Developers Blog urn:uuid:8361df4b-5b60-ce28-cee3-f786a548126d Mon, 22 Sep 2025 16:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/a/AVvXsEjkl9sAhxSCcWE33zVLX6avsWvdGX-ApAiEjpfAeKBNebF1UJcOLKSfKa5qvFHqx_-jB8eDq_mhJlArBBukx1ddlZwniD1nnIR1GVRPngnns4kouJJfUf6wES3YsJfhB5lvgv5xEd3kHY3EnC9OP-ADRn91wdK1Hbk6iBuSv5prJtQEddVZLjwNUqTPIXA" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/a/AVvXsEjkl9sAhxSCcWE33zVLX6avsWvdGX-ApAiEjpfAeKBNebF1UJcOLKSfKa5qvFHqx_-jB8eDq_mhJlArBBukx1ddlZwniD1nnIR1GVRPngnns4kouJJfUf6wES3YsJfhB5lvgv5xEd3kHY3EnC9OP-ADRn91wdK1Hbk6iBuSv5prJtQEddVZLjwNUqTPIXA" style="display: none;" /> <em>Posted by Mayuri Khinvasara Khabya - Developer Relations Engineer (<a href="https://www.linkedin.com/in/mayurikhinvasara" target="_blank">LinkedIn</a> and <a href="https://x.com/mayuri_k" target="_blank">X</a>)</em><br /><br /> <a href="IMG"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/a/AVvXsEjkl9sAhxSCcWE33zVLX6avsWvdGX-ApAiEjpfAeKBNebF1UJcOLKSfKa5qvFHqx_-jB8eDq_mhJlArBBukx1ddlZwniD1nnIR1GVRPngnns4kouJJfUf6wES3YsJfhB5lvgv5xEd3kHY3EnC9OP-ADRn91wdK1Hbk6iBuSv5prJtQEddVZLjwNUqTPIXA" /></a> <p>Welcome to the second installment of our three-part series on media preloading with Media3. This series is designed to guide you through the process of building highly responsive, low-latency media experiences in your Android apps.</p> <ul><ul> <li><a href="https://android-developers.googleblog.com/2025/09/introducing-preloading-with-media3.html" target="_blank">Part 1: Introducing Preloading with Media3</a> covered the fundamentals. We explored the distinction between <a href="https://developers.google.com/admob/android/reference/com/google/android/gms/ads/preload/PreloadConfiguration" target="_blank">PreloadConfiguration</a> for simple playlists and the more powerful <a href="https://developer.android.com/reference/androidx/media3/exoplayer/source/preload/DefaultPreloadManager" target="_blank">DefaultPreloadManager</a> for dynamic user interfaces. You learned how to implement the basic API lifecycle: adding media with add(), retrieving a prepared MediaSource with getMediaSource(), managing priorities with setCurrentPlayingIndex() and invalidate(), and releasing resources with remove() and release().</li> <li>Part 2 (This post): In this blog, we explore the advanced capabilities of the DefaultPreloadManager. We cover how to gain insights with <a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadManagerListener" target="_blank">PreloadManagerListener</a>, implement production-ready best practices like sharing core components with ExoPlayer, and master the sliding window pattern to effectively manage memory.</li> <li>Part 3: The final part of this series will dive into integrating PreloadManager with a persistent disk cache, enabling you to reduce data consumption with resource management and provide a seamless experience.</li> </ul></ul> <p>If you are new to preloading in Media3, we highly recommend reading <a href="https://android-developers.googleblog.com/2025/09/introducing-preloading-with-media3.html" target="_blank">Part 1</a> before proceeding. For those ready to move beyond the basics, let's explore how to elevate your media playback implementation.</p> <h2><span style="font-size: x-large;">Listening in: Fetch analytics with PreloadManagerListener</span></h2> <p>When you want to launch a feature in production, as an app developer you also want to understand and capture the analytics behind it. How can you be certain that your <b>preloading strategy is effective in a real-world environment?</b> Answering this requires data on success rates, failures, and performance. The <a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadManagerListener" target="_blank">PreloadManagerListener</a> interface is the primary mechanism for gathering this data.</p> <p>The PreloadManagerListener provides two essential callbacks that offer critical insights into the preloading process and status.</p> <ul><ul> <li><em><a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadManagerListener#onCompleted(androidx.media3.common.MediaItem)" target="_blank">onCompleted</a>(MediaItem mediaItem)</em>: This callback is invoked upon the successful completion of a preload request, as defined by your TargetPreloadStatusControl.</li> <li><em><a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadManagerListener#onError(androidx.media3.exoplayer.source.preload.PreloadException)" target="_blank">onError</a>(PreloadException error)</em>: This callback could be useful for debugging and monitoring. It is invoked when a preload fails, providing the associated exception.</li> </ul></ul> <p>You can register a listener with a single method call as shown in the following example code:</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">preloadManagerListener</span><span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">object</span><span style="color: #BBB"> </span>:<span style="color: #BBB"> </span><span style="color: #00F; font-weight: bold">PreloadManagerListener</span><span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">override</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">fun</span><span style="color: #BBB"> </span><span style="color: #00F">onCompleted</span>(mediaItem:<span style="color: #BBB"> </span>MediaItem)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Log success for analytics. </span> <span style="color: #BBB"> </span>Log.<span style="color: #687822">d</span>(<span style="color: #BA2121">&quot;PreloadAnalytics&quot;</span>,<span style="color: #BBB"> </span><span style="color: #BA2121">&quot;Preload completed for </span><span style="color: #A45A77; font-weight: bold">$</span>mediaItem<span style="color: #BA2121">&quot;</span>) <span style="color: #BBB"> </span>} <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">override</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">fun</span><span style="color: #BBB"> </span><span style="color: #00F">onError</span>(<span style="color: #BBB"> </span>preloadError:<span style="color: #BBB"> </span>PreloadException)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Log the specific error for debugging and monitoring.</span> <span style="color: #BBB"> </span>Log.<span style="color: #687822">e</span>(<span style="color: #BA2121">&quot;PreloadAnalytics&quot;</span>,<span style="color: #BBB"> </span><span style="color: #BA2121">&quot;Preload error &quot;</span>,<span style="color: #BBB"> </span>preloadError) <span style="color: #BBB"> </span>} } preloadManager.<span style="color: #687822">addListener</span>(preloadManagerListener) </pre></div> <h3><span style="font-size: large;">Extracting insights from the listener&nbsp;</span></h3> <p>These listener callbacks can be hooked to your analytics pipeline. By forwarding these events to your analytics engine, you can answer key questions like:</p> <ul><ul><em> <li>What is our preload success rate? (ratio of onCompleted events to total preload attempts)</li> <li>Which CDNs or video formats exhibit the highest error rates? (By parsing the exceptions from onError)</li> <li>What is our preload error rate? (ratio of onError events to total preload attempts)</li> </em></ul></ul> <p>This data could give you quantitative feedback on your preloading strategy, enabling A/B testing and data-driven improvements to your user experience. This data can further help you to <b><u>intelligently finetune your preload</u></b> durations and number of videos you want to preload as well as the buffers you allocate.</p> <h3><span style="font-size: large;">Beyond debugging: Using onError for graceful UI fallback</span></h3> <p>A failed preload is a strong indicator of an upcoming buffering event for the user. The onError callback allows you to respond reactively. Instead of merely logging the error, you can adapt the UI. For instance, if the upcoming video fails to preload, your application could disable autoplay for the next swipe, requiring a user tap to begin playback.</p> <p>Additionally, by inspecting the <a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/preload/PreloadException" target="_blank">PreloadException</a> type you can define a more intelligent retry strategy. An app can choose to immediately remove a failing source from the manager based on the error message or HTTP status code. The item would need to be removed from the UI stream accordingly to not make loading issues leak into the user experience. You could also get more granular data from PreloadException like the <a href="https://developer.android.com/reference/kotlin/androidx/media3/datasource/HttpDataSource.HttpDataSourceException" target="_blank">HttpDataSourceException</a> to probe further into the errors. Read more about <a href="https://developer.android.com/media/media3/exoplayer/troubleshooting" target="_blank">ExoPlayer troubleshooting</a>.</p> <h2><span style="font-size: x-large;">The buddy system: Why is sharing components with ExoPlayer necessary?</span></h2> <p>The DefaultPreloadManager and ExoPlayer are designed to work together. To ensure stability and efficiency, they must share several core <a href="https://developer.android.com/media/media3/exoplayer/customization" target="_blank">components</a>. If they operate with separate, uncoordinated components, it could impact thread safety and usability of preloaded tracks on the player since we need to ensure that preloaded tracks should be played on the correct player. The separate components could also compete for limited resources like network bandwidth and memory, which could lead to performance degradation. An important part of the lifecycle is handling appropriate disposal, the recommended order of disposal is to release the PreloadManager first, followed by the ExoPlayer.</p> <p>The DefaultPreloadManager.Builder is designed to facilitate this sharing and has APIs to <a href="https://developer.android.com/media/media3/exoplayer/preloading-media/preloadmanager/create#create-dpm" target="_blank">instantiate</a> both your PreloadManager and a linked player instance. Let's see why components like BandwidthMeter, LoadControl, TrackSelector, Looper must be shared. Check the <a href="https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/ExoPlayer#threading-model" target="_blank">visual representation</a> of how these components interact with ExoPlayer Playback.</p> <image><div style="text-align: center;"><img alt="PreloadManager components diagram" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/a/AVvXsEj2aix1TT5jNmTrmnbS1OZNKY0G9KY9eSK99Di2pA9SK92RiWy5Z4VvhAItUUkHghqFEy6JIAfRdojw0A75Mm3nMD808rUYd0txHY3UuoHeaj2m4qy-DywbqIaSktMYAnv1fRadOeleOgVHwVZLqre0OexyhcdW4XC5a1iINSx9981O5PJJ-6G2EcrcooY" width="100%" /></div></image><br/> <h3><span style="font-size: large;">Preventing bandwidth conflicts with a shared BandwidthMeter</span></h3> <p>The <a href="https://developer.android.com/reference/androidx/media3/exoplayer/upstream/BandwidthMeter" target="_blank">BandwidthMeter</a> provides an estimate of available network bandwidth based on historical transfer rates. If the PreloadManager and the player use separate instances, they are unaware of each other's network activity, which can lead to failure scenarios. For example, consider the scenario where a user is watching a video, their network connection degrades, and the preloading MediaSource simultaneously initiates an aggressive download for a future video. The preloading MediaSource’s activity would consume bandwidth needed by the active player, causing the current video to stall. A stall during playback is a significant user experience failure.</p> <p>By sharing a single BandwidthMeter, the TrackSelector is able to select tracks of highest quality given the current network conditions and the state of the buffer, during preloading or playback. It can then make intelligent decisions to protect the active playback session and ensure a smooth experience.</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>preloadManagerBuilder.<span style="color: #687822">setBandwidthMeter</span>(customBandwidthMeter) </pre></div> <h3><span style="font-size: large;">Ensuring consistency with shared LoadControl, TrackSelector, Renderer components of ExoPlayer</span></h3> <ul><ul> <li><a href="https://developer.android.com/reference/androidx/media3/exoplayer/LoadControl" target="_blank">LoadControl</a>: This component dictates buffering policy, such as how much data to buffer before starting playback and when to start or stop loading more data. Sharing LoadControl ensures that the memory consumption of player and PreloadManager is guided by a single, coordinated buffering strategy across both preloaded and actively playing media, preventing resource contention. You will have to smartly allocate buffer size coordinating with how many items you are preloading and with what duration, to ensure consistency. In times of contention, the player will prioritize playback of the current item displayed on the screen. With a shared LoadControl, the preload manager will continue preloading as long as the target buffer bytes allocated for preloading hasn't reached the upper limit, it doesn't wait until the loading for playback is done.</li> </ul></ul> <p><em>Note : The sharing of LoadControl in the latest version of <a href="https://github.com/androidx/media/tree/1.8.0" target="_blank">Media3 (1.8)</a> ensures that its Allocator can be shared correctly with PreloadManager and player. Using the LoadControl to effectively control the preloading is a feature that will be available in the upcoming Media3 1.9 release.</em></p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>preloadManagerBuilder.<span style="color: #687822">setLoadControl</span>(customLoadControl) </pre></div><br /> <ul><ul> <li><a href="https://developer.android.com/reference/androidx/media3/exoplayer/trackselection/TrackSelector" target="_blank">TrackSelector</a>: This component is responsible for selecting which tracks (for example, video of a certain resolution, audio in a specific language) to load and play. Sharing ensures that the tracks selected during preloading are the same ones the player will use. This avoids a wasteful scenario where a 480p video track is preloaded, only for the player to immediately discard it and fetch a 720p track upon playback.< br /> The preload manager should NOT share the <b>same instance</b> of TrackSelector with the player. Instead, they should use the different TrackSelector <b>instance but of the same implementation</b>. That's why we set the TrackSelectorFactory rather than a TrackSelector in the DefaultPreloadManager.Builder.</li> </ul></ul><br /> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>preloadManagerBuilder.<span style="color: #687822">setTrackSelectorFactory</span>(customTrackSelectorFactory) </pre></div><br /> <ul><ul> <li><a href="https://developer.android.com/reference/androidx/media3/exoplayer/Renderer" target="_blank">Renderer</a>: This component is responsible for understanding the player's capabilities without creating the full renderers. It checks this blueprint to see which video, audio, and text formats the final player will support. This allows it to intelligently select and download only the compatible media track and prevents wasting bandwidth on content the player can't actually play. </li> </ul></ul><br /> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>preloadManagerBuilder.<span style="color: #687822">setRenderersFactory</span>(customRenderersFactory) </pre></div> <p>Read about more <a href="https://developer.android.com/media/media3/exoplayer/customization" target="_blank">Exoplayer components</a>.</p> <h3><span style="font-size: large;">The golden rule: A common <a href="https://developer.android.com/media/media3/exoplayer/hello-world#a-note-on-threading" target="_blank">Playback Looper</a> to rule them all</span></h3> <p>The thread on which an ExoPlayer instance can be accessed can be explicitly specified by passing a Looper when creating the player. The Looper of the thread from which the player must be accessed can be queried using <a href="https://developer.android.com/reference/kotlin/androidx/media3/common/Player#getApplicationLooper()" target="_blank">Player.getApplicationLooper</a>. By maintaining a shared Looper between the player and PreloadManager, it is guaranteed that all operations on these shared media objects are serialized onto a single thread's message queue. This can reduce the concurrency bugs.</p> <p>All interactions between the PreloadManager and the player with media sources to be loaded or preloaded need to happen on the same playback thread. Sharing the <a href="https://developer.android.com/reference/android/os/Looper" target="_blank">Looper</a> is a must for thread safety and hence we must share the PlaybackLooper between the PreloadManager and player.</p> <p>The PreloadManager prepares a stateful MediaSource object in the background. When your UI code calls player.setMediaSource(mediaSource), you are performing a handoff of this complex, stateful object from the preloading MediaSource to the player. In this scenario, the entire PreloadMediaSource is moved from the manager to the player. All these interactions and handoffs should occur on the same PlaybackLooper.</p> <p>If the PreloadManager and ExoPlayer were operating on different threads, a race condition could occur. The PreloadManager’s thread could be modifying the MediaSource's internal state (e.g, writing new data into a buffer) at the exact moment the player's thread is attempting to read from it. This leads to unpredictable behavior, IllegalStateException that is difficult to debug.</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>preloadManagerBuilder.<span style="color: #687822">setPreloadLooper</span>(playbackLooper) </pre></div> <p>Lets see how you can share all the above components between ExoPlayer and DefaultPreloadManager in the setup itself.</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">preloadManagerBuilder</span><span style="color: #BBB"> </span><span style="color: #666">=</span> DefaultPreloadManager.<span style="color: #687822">Builder</span>(context,<span style="color: #BBB"> </span>targetPreloadStatusControl) <span style="color: #3D7B7B; font-style: italic">// Optional - Share components between ExoPlayer and DefaultPreloadManager</span> preloadManagerBuilder <span style="color: #BBB"> </span>.<span style="color: #687822">setBandwidthMeter</span>(customBandwidthMeter) <span style="color: #BBB"> </span>.<span style="color: #687822">setLoadControl</span>(customLoadControl) <span style="color: #BBB"> </span>.<span style="color: #687822">setMediaSourceFactory</span>(customMediaSourceFactory) <span style="color: #BBB"> </span>.<span style="color: #687822">setTrackSelectorFactory</span>(customTrackSelectorFactory) <span style="color: #BBB"> </span>.<span style="color: #687822">setRenderersFactory</span>(customRenderersFactory) <span style="color: #BBB"> </span>.<span style="color: #687822">setPreloadLooper</span>(playbackLooper) <span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">preloadManager</span><span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">preloadManagerBuilder</span>.<span style="color: #687822">build</span>() </pre></div> <p><em>Tip: If you use the Default components in ExoPlayer like the <a href="https://developer.android.com/reference/androidx/media3/exoplayer/DefaultLoadControl" target="_blank">DefaultLoadControl</a>, etc, you don't need to explicitly share them with DefaultPreloadManager. When you build your ExoPlayer instance via the <a href="https://developer.android.com/reference/androidx/media3/exoplayer/source/preload/DefaultPreloadManager.Builder#buildExoPlayer()" target="_blank">buildExoPlayer</a> of the DefaultPreloadManager.Builder these components are automatically referenced with each other, if you use the default implementations with default configurations. But if you use custom compon analytics PreloadManagerListener Shared Components Sliding Window Pattern TargetPreloadStatusControl Android Developers Gratitude's developers released 2X the amount of innovative experiments with the help of Gemini in Android Studio http://android-developers.googleblog.com/2025/09/gratitudes-developers-released-2x.html Android Developers Blog urn:uuid:8c3e1873-c5c0-125f-ba29-70cab6d79867 Thu, 18 Sep 2025 21:00:03 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1HtXbRPllEm9wtKMXiXj5Ud6ue-chIAGoAF7qYiJ9Hwg75YLYwMobWszkD1Lp0zCE2YqL1TZshgKH3iEqsRFkIVXEGHG6oxBSrgVmfDRZWKF6Y0INq-SwHQr-QuXqW-jCu7oZLG3D3KQ-EHOlNo8LFln-Y98T-YnCoUPIDerJ-eBCDTlDOzc_hgu85rk/s1600/gratitude-header.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1HtXbRPllEm9wtKMXiXj5Ud6ue-chIAGoAF7qYiJ9Hwg75YLYwMobWszkD1Lp0zCE2YqL1TZshgKH3iEqsRFkIVXEGHG6oxBSrgVmfDRZWKF6Y0INq-SwHQr-QuXqW-jCu7oZLG3D3KQ-EHOlNo8LFln-Y98T-YnCoUPIDerJ-eBCDTlDOzc_hgu85rk/s1600/gratitude-header.png" style="display: none;" /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1HtXbRPllEm9wtKMXiXj5Ud6ue-chIAGoAF7qYiJ9Hwg75YLYwMobWszkD1Lp0zCE2YqL1TZshgKH3iEqsRFkIVXEGHG6oxBSrgVmfDRZWKF6Y0INq-SwHQr-QuXqW-jCu7oZLG3D3KQ-EHOlNo8LFln-Y98T-YnCoUPIDerJ-eBCDTlDOzc_hgu85rk/s1600/gratitude-header.png" imageanchor="1"><img style="margin: auto; display: block;" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1HtXbRPllEm9wtKMXiXj5Ud6ue-chIAGoAF7qYiJ9Hwg75YLYwMobWszkD1Lp0zCE2YqL1TZshgKH3iEqsRFkIVXEGHG6oxBSrgVmfDRZWKF6Y0INq-SwHQr-QuXqW-jCu7oZLG3D3KQ-EHOlNo8LFln-Y98T-YnCoUPIDerJ-eBCDTlDOzc_hgu85rk/s1600/gratitude-header.png" data-original-width="100%" data-original-height="800" /></a> <span id="docs-internal-guid-c9728405-7fff-3b59-a8d9-54a396e0e744"> <em><p><span style="background-color: white; color: #202124; font-family: Arial, sans-serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Posted by Sandhya Mohan, Product Manager</span></p></em> <a href="https://play.google.com/store/apps/details?id=com.northstar.gratitude&amp;hl=en_US&amp;pli=1" target="_blank" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gratitude</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is a mental wellness Android app that encourages self-care and positivity with techniques like in-app journaling, affirmations, and vision boards. These mindfulness exercises need to be free from performance bottlenecks, bugs, and errors for the app to be truly immersive and helpful—but researching solutions and debugging code took away valuable time from the team experimenting on new features. To find a better balance, Gratitude used </span><a href="https://d.android.com/gemini-in-android" target="_blank" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini in Android Studio</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to help improve the app’s code and streamline the development process, enabling the team to implement those exciting new features faster.</span></span><div><span style="font-family: Arial, sans-serif;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span><div> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><img style="margin: auto; display: block;" alt="Unlocking new efficiencies with Gemini in Android Studio" border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Dhyz71uq6ulADKOCif_O460ZEspl4aRcZOlzqTWp1glgY8ahisVdAaHaq3kwW-vxqrvQeqSGs4dzroFuNXir6o-rExA2hIUImlay9gjV-Zrh1yg6RVZBterhMBlYUoIjR88M3g1R3HQr4BPR8503da7D6218IKcfcRYh66xeMO1UO5VLAWvJAiQ0F98/s1600/Gratitude_Inline_01.gif" /></div></div><imgcaption><center><center><center><span id="docs-internal-guid-05e941fd-7fff-adad-e5e1-be057d52096a"><p><span style="font-family: Arial, sans-serif; font-size: 10pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Gratitude’s AI image generation feature, built in record time with the help of Gemini in Android Studio</span></p></span></center></center></center></imgcaption></image> <p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Unlocking new efficiencies with Gemini in Android Studio</span></p><div style="text-align: left;"></div><p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Gratitude team decided to try Gemini in Android Studio, an AI assistant that supports developers throughout all stages of development, helping them be more productive. Developers can ask Gemini questions and receive context-aware solutions based on their code. Divij Gupta, senior Android developer at Gratitude, shared that the Gratitude team needed to know if it was possible to inject any object into a Kotlin object class using Hilt. Gemini suggested using an EntryPoint to access dependencies in classes where standard injection isn’t possible, which helped solve their “tricky problem,” according to Divij.</span></p><div style="text-align: left;"></div><p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Gemini eliminated the need to search for Android documentation as well, enabling the Gratitude team to learn and apply their knowledge without having to leave Android Studio. “Gemini showed me how to use Android Studio's CPU and memory profilers more effectively,” recalled Divij. “I also learned how to set up baseline profiles to speed up cold starts.”</span></p><div style="text-align: left;"></div><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><div style="text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;">Identifying performance bottlenecks became easier too. When analyzing the Gratitude team’s code, Gemini suggested using </span><span style="color: #137333; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;">collectAsStateWithLifecycle</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> instead of </span><span style="color: #137333; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;">collectAsState</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> to collect flows in composables, which helps the app handle lifecycle events more effectively and improves overall performance. Gemini also analyzes the app’s crash reports in the </span><a href="https://developer.android.com/studio/debug/app-quality-insights" target="_blank" style="text-align: left; text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">App Quality Insights</span></a><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> panel and provides guidance on how to address each issue, which enabled the Gratitude team to “identify root causes faster, catch edge cases we might have missed, and improve overall app stability,” according to Divij.</span></div><div style="text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"><br /></span></div></span> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: left;"><img style="margin: auto; display: block;" alt="Experimenting with new features using Gemini in Android Studio" border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXgrAbEeUJKQyQNoM2ekPiZ9LfLrnWZSzRkf-XMaRxEhPGIOAeeCz-hsctbV31lfGFrKTOZH_AGSHXikceHfRRhlNVIacN_ulC1CLxC5-5ugeqhn0DlduUDLHunClUM5RM6rU-Vll3OcZHnRJln6qeA1VI6946T90wkqLXYedl-2Zt2BMp9I5ugyFtnuA/s1600/AANDDM_Gratitude_Quote_01.png" /></div></div></image> <p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Experimenting with new features using Gemini in Android Studio</span></p><div style="text-align: left;"></div><p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Gemini in Android studio helped the Gratitude team significantly improve their development speed and morale. “This faster cycle has made the team feel more productive, motivated, and excited to keep innovating,” said Divij. Developers are able to spend more time ideating and experimenting on new features, leading to innovative new experiences.</span></p><div style="text-align: left;"></div><p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">One feature the developers built with their new found time is an image generation function for the app’s vision boards feature. Users can now upload a photo with a prompt, and then receive an AI-generated image that they can instantly pin to their board. The team was able to build the UI using Gemini in Android Studio’s </span><a href="https://developer.android.com/studio/gemini/generate-compose-previews" target="_blank" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Compose Preview Generation</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> — allowing them to quickly visualize their Jetpack Compose code and craft the pixel-perfect UI their designers intended.</span></p><div style="text-align: left;"></div><p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Going forward, the Gratitude team is looking forward to using Gemini to implement more improvements to its code, including correcting glitches, memory leaks, and improving performance based on more insights from Gemini, which will further improve user experience.</span></p><div style="text-align: left;"><br /></div> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><img style="margin: auto; display: block;" alt="Build with Gemini in Android Studio" border="0" data-original-height="721" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG2bleHI5meayGSybbg2enel22R-JqVGVydek58n14aQM_qSTvnlVDwC8vnblWEe4PrFmfMN3lpzH2LC3j8VB9K_PsE3omK26jP4kKOi9k69IIJAx6NDCxxnfRwFoMItzzK3Wh2Os6Ed3YGyE0QHegg0GgF0R_M7aBCjGL6UCEMPtAzsbqrnjo0fYaNG0/s1600/AANDDM_Gratitude_Quote_02.png" /></div></div></image> <p><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Build with Gemini in Android Studio</span></p><div style="text-align: left;"></div><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><div style="text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;">Discover all of the </span><a href="https://developer.android.com/studio/preview/gemini/features" target="_blank" style="text-align: left; text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">features available</span></a><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> as part of </span><a href="http://d.android.com/gemini-in-android" target="_blank" style="text-align: left; text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Gemini in Android Studio</span></a><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> that can accelerate your development such as </span><a href="https://developer.android.com/studio/preview/gemini/ai-code-completion" target="_blank" style="text-align: left; text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">code completion</span></a><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;">, code explanation, <span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"> that can accelerate your development such as </span><a href="https://developer.android.com/studio/gemini/agent-mode" target="_blank" style="text-align: left; text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Agent Mode</a></span>, document generation, and more. </span></div></span> </div></div> AI assisted coding Android Studio developer story Gemini Gemini in Android Studio Birna #WeArePlay: Meet the people whose personal challenges inspired their apps and games. http://android-developers.googleblog.com/2025/09/weareplay-meet-people-whose-personal.html Android Developers Blog urn:uuid:80233b56-ffab-be3f-a039-2c496d2d3dd9 Thu, 18 Sep 2025 17:40:17 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em><div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" imageanchor="1"><img style="margin: auto; display: block;" border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> stories, we meet the people who turned personal challenges into successful apps and games on Google Play - from a new puppy inspiring a digital pet care assistant, to losing contact with family during an earthquake leading to an app that delivers real-time disaster alerts to millions.</p><p>Here are a few of our favorites:</p> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Daiki's app, NERV Disaster Prevention, delivers real-time, location-based disaster warnings." border="0" data-original-height="1518" data-original-width="2281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGHF8abyNNem43ptl3qR7NuGkNAAHWJywhn7xnYWTlfExwlrhjLpgZkpxxJXK4f9Ufrh5ZPgWO5VXd4ulaECeOvV4vdj-YV4NJfuadIfI_980u_GaIoIo9ipooUUgdtGb2ZMmZsss53BzvT1PhUM3Rr1LmwnCPbxJuSjtMMotg8MAGzH65sq5L7pHj1rI/s1600/daiki-ishimori.png"/></a></div></div><imgcaption><center><center><center><i>Daiki Ishimori, founder of Gehirn&nbsp;</i></center><center><i>Tokyo, Japan</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Daiki's app, NERV Disaster Prevention, delivers real-time, location-based disaster warnings.</span></h4> <p>A self-taught programmer from a young age, Daiki Ishimori was inspired by his popular social media posts sharing earthquake alerts to create the NERV Disaster Prevention app. Now a trusted daily safety tool, the app provides real-time, location-based warnings and recently launched a Crisis Mapping tool for multilingual, crowd-sourced relief information. Daiki is now gearing up to roll out new community features to keep people connected and protected during emergencies.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Jaimes, Rafael, and Rodrigo's AI-powered app, Budz, helps dog and cat owners with training, health, and nutrition." border="0" data-original-height="720" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8nJoViIu-uTb4PGIcZqbv9oHRHbnN-Z1pj-HqbaRKtmmWdVJ2TBLxXY-RlGuRL6twfaT8n3kj6p2sDP6d_2zo9k4tbdIljofAVo5bgF1PM4uJwZfwf0nR-QRdPr6s48A0ZKB0sgSq3rGVyvvymRP1UWIGtXaJMEM4OaQbII7jRQki8woCqfgGZs54fro/s1600/budz.jpg"/></a></div></div><imgcaption><center><center><center><i>Jaimes Almeida Neto, Rafael Rojas and Rodrigo Gomes, co-founders of Budz&nbsp;</i></center><center><i>São Paulo, Brazil</i></center></center></center></imgcaption></image> <h4><span style="font-size: large;">Jaimes, Rafael, and Rodrigo's AI-powered app, Budz, helps dog and cat owners with training, health, and nutrition.</span></h4> <p>Inspired by a co-founder's new puppy, Jaimes, Rafael, and Rodrigo created Budz to support fellow animal lovers. The app assists with pet training, health, and nutrition through features like vaccine reminders, 24/7 teleconsultations, and an AI tutor that answers real-time questions. By helping people in Brazil better care for their pets, Budz aims to reduce pet abandonment and is now preparing to expand across Latin America.</p><br /> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img style="margin: auto; display: block;" alt="Khaldon, Perrine and Victor's app, Ochy, analyzes running form to prevent injuries." border="0" data-original-height="1500" data-original-width="2000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii1aO4qwgKXZm1-W72TctaOpNWbeVeoFEe5Qa0PKwYIdpXrU2wjUg7Xyxii2iAKOSbaDp5q6FlO7Sc0diGnCKAXqHaGfg5LCYYCyg_OJjJdyHr5pEdPbEn2W4WUw3A2FKav3XKsPVN3IxlyJlHH6OuAPRFEqMgK7n_PaDWY0PCQtjXYV0P7RJO1H2pjGc/s1600/ochy.png"/></a></div></div><imgcaption><center><center><i>Khaldon Evans, Perrine Chapot and Victor Dequid, co-founders of Ochy &nbsp;</i></center><center><i>Rennes, France &nbsp;</i></center></center></imgcaption></image> <h4><span style="font-size: large;">Khaldon, Perrine and Victor's app, Ochy, analyzes running form to prevent injuries.</span></h4> <p>After injuries sidelined his sprinting career, Khaldon Evans was inspired by his own recovery to make lab-grade movement analysis accessible. He teamed up with biomechanics expert Perrine Chapot and developer Victor Dequid to create Ochy. Using just a smartphone camera, the app analyzes a user's running form to help runners, coaches, and doctors prevent injuries, and recently added a new back-view analysis feature. Next, the team plans to introduce personalized shoe recommendations and expand into new sports.</p><p><br /></p> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> </div> Android Developers Android 16 QPR2 Beta 2 is Here http://android-developers.googleblog.com/2025/09/android-16-qpr2-beta-2-is-here.html Android Developers Blog urn:uuid:a51eee3b-5afa-f900-714e-bdafdd89f4c6 Wed, 17 Sep 2025 20:14:38 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS4ubVQL0hsVmbuMRCMgCsA64s6F0Wig_D5T3m3AS0DHuvr7A9BwniaktsYZpZ7LCU4NxdZNKSYvCM_lIjFav4DQxB-gDQo_hmz871Od0QQ3lsyoAgnLtiMTXkPdv80cubXkIsUBlkjU7f1Tmk-zErZ3ztQGsuxUgOs7y4e4HBVjr66m7W9MuUq5Sc9FE/s1600/A16-wordmark.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS4ubVQL0hsVmbuMRCMgCsA64s6F0Wig_D5T3m3AS0DHuvr7A9BwniaktsYZpZ7LCU4NxdZNKSYvCM_lIjFav4DQxB-gDQo_hmz871Od0QQ3lsyoAgnLtiMTXkPdv80cubXkIsUBlkjU7f1Tmk-zErZ3ztQGsuxUgOs7y4e4HBVjr66m7W9MuUq5Sc9FE/s1600/A16-wordmark.png" style="display: none;" /> <em>Posted by Matthew McCullough, VP of Product Management, Android Developer</em><div><i><br /></i> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5iA7jVSAp0NGA9fum6jWcAmOif-8nWor1sFfpv_am-1qytjP41RzvEzxYt8TN7bCsFIkI1fHLHnq-d-XKUSiklBiwsJL4uM6LtjJ_teV_vAVfAxj2UgqYUtpCRSABS797VLdFq8O9j-1mB7LzVoMvtYPuFSx-CCjTDfZiiAz1mCq5jOG1uabc4bbMVEU/s1600/Banner%201600x476.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5iA7jVSAp0NGA9fum6jWcAmOif-8nWor1sFfpv_am-1qytjP41RzvEzxYt8TN7bCsFIkI1fHLHnq-d-XKUSiklBiwsJL4uM6LtjJ_teV_vAVfAxj2UgqYUtpCRSABS797VLdFq8O9j-1mB7LzVoMvtYPuFSx-CCjTDfZiiAz1mCq5jOG1uabc4bbMVEU/s16000/Banner%201600x476.png" /></a></div> <p>Android 16 QPR2 has released Platform Stability today with Beta 2! That means that the API surface is locked, and the app-facing behaviors are final, so you can incorporate them into your apps and take advantage of our latest platform innovations.</p><h2 style="font-size: x-large; text-align: left;">New in the QPR2 Beta</h2><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI9Yw09rM2z-8QHmsJYC7mGplLSljbrss8rO1iMkgaSJRAJkjEUCeliShyphenhyphenyBlXUO_B89mbES3VAoRJIqFxnisH_TcVBjMZz3pMFRX6aj0dWu1nMne8kroAHucy6uEWokZz_4gcu_KsTulm4_6AXu5JKtvV6o-PRlLZd5z14Fk88h_ZhrWYandW-odwoW0/s960/image2.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="214" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI9Yw09rM2z-8QHmsJYC7mGplLSljbrss8rO1iMkgaSJRAJkjEUCeliShyphenhyphenyBlXUO_B89mbES3VAoRJIqFxnisH_TcVBjMZz3pMFRX6aj0dWu1nMne8kroAHucy6uEWokZz_4gcu_KsTulm4_6AXu5JKtvV6o-PRlLZd5z14Fk88h_ZhrWYandW-odwoW0/s16000/image2.png" /></a></div><br /><div><br /></div>At this later stage in the development cycle, we're focused on the critical work of readying the platform for release. Here are the few impactful changes we want to highlight:<h3 style="text-align: left;"><span style="font-size: large;">Testing developer verification</span></h3><p>To better protect Android users from repeat offenders, Android is introducing <a href="https://developer.android.com/developer-verification" rel="nofollow" target="_blank">developer verification</a>, a new requirement to make app installation safer by preventing the spread of malware and scams. Starting in September 2026 and in specific regions, Android will require apps to be registered by verified developers to be installed on certified Android devices, with an exception made for installs made through the Android Debug Bridge (ADB).</p><p><b>As a developer, you are free to install apps without verification by using ADB, so you can continue to test apps that are not intended or not yet ready to distribute to the wider consumer population.</b></p><p>For apps that <a href="https://support.google.com/googleplay/android-developer/answer/12085295" rel="nofollow" target="_blank">enable user-initiated installation of app packages</a>, Android 16 QPR2 Beta 2 contains new <a href="https://developer.android.com/reference/android/content/pm/PackageInstaller#EXTRA_DEVELOPER_VERIFICATION_FAILURE_REASON" rel="nofollow" target="_blank">APIs</a> that support developer verification during installation, along with a new adb command to let you force a verification outcome for testing purposes.</p><pre style="line-height: 125%; margin: 0px;"><span style="background-color: white; font-family: courier;">adb shell pm set-developer-verification-result</span> </pre><p>By using this command, (see <span style="color: #0d904f; font-family: courier;">adb shell</span><span style="color: #0d904f; font-family: courier;"> pm</span> help for full details)&nbsp; you can now simulate verification failures. This allows you to understand the end-to-end user experience for both successful and unsuccessful verification, so you can prepare accordingly before enforcement begins.</p><p>We encourage all developers who distribute apps on certified Android devices to <a href="https://developer.android.com/developer-verification#sign-up-for-early-access" rel="nofollow" target="_blank">sign up for early access</a> to get ready and stay updated.</p><h3>SMS OTP Protection</h3><div style="text-align: left;"><p>The delivery of messages containing an <a href="https://developers.google.com/identity/sms-retriever/verify" rel="nofollow" target="_blank">SMS retriever hash</a> will be delayed for most apps for three hours to help prevent OTP hijacking. The <a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_SMS" rel="nofollow" target="_blank">RECEIVE_SMS</a> broadcast will be withheld and <a href="https://developer.android.com/reference/android/provider/Telephony.Sms.html" rel="nofollow" target="_blank">sms provider</a> database queries will be filtered. The SMS will be available to these apps after the three hour delay.</p><p>Certain apps such as the default SMS, assistant, and dialer apps, along with connected device companion, system apps, etc will be exempt from this delay, and apps can continue to use the <a href="https://developers.google.com/identity/sms-retriever/overview" rel="nofollow" target="_blank">SMS retriever API</a> to access messages intended for them in a timely manner.</p></div><div style="text-align: left;"><h3>Custom app icon shapes</h3></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dwhhu6knm2n1BDhXC_5JQQ0PHC0Dt5W-qqXyHNXZq9SXQTHQ0kjIFFlzObU7fpD1d9kl7KwHFPt2SrsH06vwi9l8YtX9HYXtwnBX56oSR8iv-lKaYL6Fyy5CLYYNeLdAsz5EsyZ5ye16xx8eEV-qJVI-S8FTUWKgr69nnJpAvK3qr8qSlDej7RYg1J8/s1999/image3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1999" data-original-width="923" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dwhhu6knm2n1BDhXC_5JQQ0PHC0Dt5W-qqXyHNXZq9SXQTHQ0kjIFFlzObU7fpD1d9kl7KwHFPt2SrsH06vwi9l8YtX9HYXtwnBX56oSR8iv-lKaYL6Fyy5CLYYNeLdAsz5EsyZ5ye16xx8eEV-qJVI-S8FTUWKgr69nnJpAvK3qr8qSlDej7RYg1J8/s320/image3.png" width="148" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QVsk0bYzM2AcLGRMLbMtEz5LhZuDcMkLJ08D8eAEjOdZRrn5Gb1Y_9J78RLW7uJ_abBe85TpQD89NzrSs9M6W57hug124SU2bKmSU4jA5qY9xu8Vr9-s0-IpyRVS68ZkLWudx1N1h3gMp_lofCRHfGSCDQh389s7hj-Ow11CFcfStSxKPyxELutALMI/s1999/image4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1999" data-original-width="923" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QVsk0bYzM2AcLGRMLbMtEz5LhZuDcMkLJ08D8eAEjOdZRrn5Gb1Y_9J78RLW7uJ_abBe85TpQD89NzrSs9M6W57hug124SU2bKmSU4jA5qY9xu8Vr9-s0-IpyRVS68ZkLWudx1N1h3gMp_lofCRHfGSCDQh389s7hj-Ow11CFcfStSxKPyxELutALMI/s320/image4.png" width="148" /></a></div> <div>Android 16 QPR2 allows users to select from a list of icon shapes that apply to all app icons and folder previews. Check to make sure that your adaptive icon works well with any shape the user selects.</div><div><h3>More efficient garbage collection</h3></div><p style="text-align: left;">The Android Runtime (ART) now includes a Generational Concurrent Mark-Compact (CMC) Garbage Collector in Android 16 QPR2 that focuses collection efforts on newly allocated objects, which are more likely to be garbage. You can expect reduced CPU usage from garbage collection, a smoother user experience with less jank, and improved battery efficiency.</p><div><h3>Native step tracking and expanded exercise data in Health Connect</h3></div><div><p style="text-align: left;">Health Connect now automatically tracks steps using the device's sensors. If your app has the&nbsp;<span style="font-family: courier;"><span style="color: #0d904f;">READ_STEPS</span></span>&nbsp;permission, this data will be available from the "android" package. Not only does this simplify the code needed to do step tracking, it's more power efficient as well.</p><p style="text-align: left;">Also, the&nbsp;<span style="color: #0d904f; font-family: courier;">ExerciseSegment</span>&nbsp;and <span style="color: #0d904f; font-family: courier;">ExerciseSession</span>&nbsp;data types have been updated. You can now record and read weight, set index, and Rate of Perceived Exertion (RPE) for exercise segments. Since Health Connect is updated independently of the platform, checking for feature availability before writing the data will ensure compatibility with the current local version of Health Connect.</p><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"> <pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #3d7b7b; font-style: italic;">// Check if the expanded exercise features are available</span> <span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">newFieldsAvailable</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>healthConnectClient.<span style="color: #687822;">features</span>.<span style="color: #687822;">getFeatureStatus</span>( <span style="color: #bbbbbb;"> </span>HealthConnectFeatures.<span style="color: #687822;">FEATURE_EXPANDED_EXERCISE_RECORD</span> )<span style="color: #bbbbbb;"> </span><span style="color: #666666;">==</span><span style="color: #bbbbbb;"> </span>HealthConnectFeatures.<span style="color: #687822;">FEATURE_STATUS_AVAILABLE</span> <span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">segment</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>ExerciseSegment( <span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">//...</span> <span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Conditionally add the new data fields</span> <span style="color: #bbbbbb;"> </span>weight<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span>Mass.<span style="color: #687822;">fromKilograms</span>(<span style="color: #666666;">50.0</span>)<span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span>, <span style="color: #bbbbbb;"> </span>setIndex<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span><span style="color: #666666;">1</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span>, <span style="color: #bbbbbb;"> </span>rateOfPerceivedExertion<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span><span style="color: #666666;">7.0f</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span> ) </pre></div> <h2><span style="font-size: x-large;">A minor SDK version</span></h2> <p>QPR2 marks the first Android release with a minor SDK version allowing us to more rapidly innovate with new platform APIs provided outside of our usual once-yearly timeline. Unlike the major platform release (Android 16) in 2025-Q2 that included behavior changes that impact app compatibility, the changes in this release are largely additive and designed to minimize the need for additional app testing.</p> <image><div style="text-align: center;"><img alt="Android 16 SDK release cadence" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi08BSp5rhpK_ux7TCYUW02KjKqjLXCsla9VGZ7V0nicsX9S6ySNwD2dmjaQbPJJ0EWdeAbUe77WUitxemEzDuP33SgIynUppkthk47yaM6TCq4vdb4l1bOPS-vvo8c57HOOyrpnYw8emeze-h49FwQ-X0xl7vGgDimFE9ggKTLXjwBfUFr_t3zBLkYyyU/s16000/Android-16-SDK-releases-2025-timeline.png" width="100%" /></div></image> <p>Your app can safely call the new APIs on devices where they are available by using <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION#SDK_INT_FULL" target="_blank">SDK_INT_FULL</a></span> and the respective value from the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION_CODES_FULL" target="_blank">VERSION_CODES_FULL</a></span> enumeration.</p> <!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(Build.<span style="color: #687822;">VERSION</span>.<span style="color: #687822;">SDK_INT_FULL</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">&gt;=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">VERSION_CODES_FULL</span>.<span style="color: #687822;">BAKLAVA_1</span>)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Call new APIs from the Android 16 QPR2 release</span> } </pre></div> <p>You can also use the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build#getMinorSdkVersion%28int%29" target="_blank">Build.getMinorSdkVersion()</a></span> method to get just the minor SDK version number.</p> <!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">minorSdkVersion</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">getMinorSdkVersion</span>(VERSION_CODES_FULL.<span style="color: #687822;">BAKLAVA</span>) </pre></div> <p>The original <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION_CODES" target="_blank">VERSION_CODES</a></span> enumeration can still be used to compare against the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION#SDK_INT" target="_blank">SDK_INT</a></span> enumeration for APIs declared in non minor releases.</p> <!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(Build.<span style="color: #687822;">VERSION</span>.<span style="color: #687822;">SDK_INT</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">&gt;=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">VERSION_CODES</span>.<span style="color: #687822;">BAKLAVA</span>)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Call new APIs from the Android 16 release</span> } </pre></div> <p>Since minor releases aren't intended to have breaking behavior changes, they cannot be used in the <span style="font-family: courier;"><a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element" target="_blank">uses-sdk manifest attributes</a></span>.</p><ul><ul> </ul></ul> <h2>Get started with the Android 16 QPR2 beta</h2> <p>You can <a href="https://www.google.com/android/beta" rel="nofollow" target="_blank">enroll any supported Pixel device</a> to get this and future Android Beta updates over-the-air. If you don’t have a Pixel device, you can <a href="https://developer.android.com/about/versions/16/qpr2/get#on_emulator" rel="nofollow" target="_blank">use the 64-bit system images with the Android Emulator</a> in Android Studio.&nbsp; If you are already in the Android Beta program, you will be offered an over-the-air update to Beta 2. We’ll update the <a href="https://developer.android.com/about/versions/16/qpr2/download" rel="nofollow" target="_blank">system images</a> and SDK regularly throughout the Android 16 QPR2 release cycle.</p> <p><b>If you are in the Canary program and would like to enter the Beta program, you will need to wipe your device and manually flash it to the beta release.</b></p> <p>For the best development experience with Android 16 QPR2, we recommend that you use the latest Canary version of <a href="https://developer.android.com/studio/preview" target="_blank">Android Studio Narwhal Feature Drop</a>.</p> <p>We're looking for your feedback so please <a href="https://developer.android.com/about/versions/16/qpr2/feedback" target="_blank">report issues and submit feature requests</a> on the <a href="https://developer.android.com/about/versions/16/qpr2/feedback" target="_blank">feedback page</a>. The earlier we get your feedback, the more we can include in our work on the final release. Thank you for helping to shape the future of the Android platform.</p></div></div> Android Android16QPR2 Featured latest release Android Developers Simplifying advanced networking with DHCPv6 Prefix Delegation http://android-developers.googleblog.com/2025/09/simplifying-advanced-networking-with.html Android Developers Blog urn:uuid:6a5ad69d-9906-5a33-8315-32ea499d34ec Mon, 15 Sep 2025 23:24:55 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYN6kyOb2tTU_5XunRUOlSlt3jl1GiTfPbs9LQBmkfeKoIa-A-Zvg-MNBsN3PG51TRICBuHmRiy6aKCiF6-_iI47576nzK9QGAwSwHy08QH8EvYfSB9ZOri3vBmandwAW63WUDidGR1Hbk2fu1kSTqQAmlGF2POgRRYcBLRxe0AIGtMusbBu_oSHZOqko/s1536/Android-13-Desktop-AVD-Social.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYN6kyOb2tTU_5XunRUOlSlt3jl1GiTfPbs9LQBmkfeKoIa-A-Zvg-MNBsN3PG51TRICBuHmRiy6aKCiF6-_iI47576nzK9QGAwSwHy08QH8EvYfSB9ZOri3vBmandwAW63WUDidGR1Hbk2fu1kSTqQAmlGF2POgRRYcBLRxe0AIGtMusbBu_oSHZOqko/s1536/Android-13-Desktop-AVD-Social.png" style="display: none;" /> <em>Posted by Lorenzo Colitti&nbsp;-&nbsp;</em><i>TL, Android Core Networking and&nbsp;Patrick Rohr - Software Engineer, Android Core Networking</i><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlgRnzsZ8XZRx0eoz207X2yjDLqWB0NuQjW0qU69FqPg5UUf2jt2oAoV3Nz9N81ZYRd95KICIH2ZYPRt7Yw5kK6xwZYvGDrNRVGw2rych26McYq6qg-ddG27qZIV43Fcg84rigvfjbJQsgcU3U2IRj0qPz0KQ0IwjrVk4xYVM3Iz7iVpPZROOEhDyPzN8/s6315/Android-13-Desktop-AVD-Header.png" style="clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1880" data-original-width="6315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlgRnzsZ8XZRx0eoz207X2yjDLqWB0NuQjW0qU69FqPg5UUf2jt2oAoV3Nz9N81ZYRd95KICIH2ZYPRt7Yw5kK6xwZYvGDrNRVGw2rych26McYq6qg-ddG27qZIV43Fcg84rigvfjbJQsgcU3U2IRj0qPz0KQ0IwjrVk4xYVM3Iz7iVpPZROOEhDyPzN8/s16000/Android-13-Desktop-AVD-Header.png" /></a></p><p></p><div><h2 style="text-align: left;">IPv4 complicates app code and causes battery impact</h2><p>Most of today’s Internet traffic still uses IPv4, which cannot provide transparent end-to-end connectivity to apps. IPv4 only provides 2<sup>32</sup> addresses - much less than the number of devices on today’s Internet - so it’s not possible to assign a public IPv4 address to every Android device, let alone to individual apps or functions within a device. So most Internet users have private IPv4 addresses, and share a public IPv4 address with other users of the same network using <a href="https://en.wikipedia.org/wiki/Network_address_translation" rel="nofollow" target="_blank">Network Address Translation (NAT)</a>. NAT makes it difficult to build advanced networking apps such as video calling apps or VPNs, because these sorts of apps need to periodically send packets to keep NAT sessions alive (which hurts battery) and implement complex protocols such as <a href="https://www.rfc-editor.org/rfc/rfc5389.html" rel="nofollow" target="_blank">STUN</a> to allow devices to connect to each other through NAT.</p><h2 style="text-align: left;">Why IPv6 hasn’t solved this problem yet</h2><p>The new version of the Internet protocol, IPv6 - now used by <a href="https://www.google.com/intl/en/ipv6/statistics.html" rel="nofollow" target="_blank">about half of all Google users</a> - provides virtually unlimited address space and the ability for devices to use multiple addresses. When every device can get global IPv6 addresses, there is no need to use NAT for address sharing! But although the address space itself is no longer limited, the current IPv6 address assignment methods used on Wi-Fi, such as <a href="https://www.rfc-editor.org/rfc/rfc4862" rel="nofollow" target="_blank">SLAAC</a> and <a href="https://datatracker.ietf.org/doc/html/rfc8415#section-12.1" rel="nofollow" target="_blank">DHCPv6 IA_NA</a>, still have limitations.</p><p>For one thing, both SLAAC and DHCPv6 IA_NA require the network to maintain state for each individual address, so assigning more than a few IPv6 addresses to every Android device can cause scaling issues on the network. This means it’s often not possible to assign IPv6 addresses to VMs or containers within the device, or to wearable devices and other tethered devices connected to it. For example, if your app is running on a wearable device connected to an Android phone,&nbsp; or on a tablet tethered to an Android phone that’s connected to Wi-Fi, it likely won’t have IPv6 connectivity and will need to deal with the complexities and battery impact of NAT.</p><p>Additionally, we’ve heard feedback from some users and network operators that they desire more control over the IPv6 addresses used by Android devices. Until now, Android only supported SLAAC, which does not allow networks to assign predictable IPv6 addresses, and makes it more difficult to track the mapping between IPv6 addresses and the devices using them. This has limited the availability of IPv6 on Android devices on some networks.</p><h2 style="text-align: left;">The solution: dedicated IPv6 address blocks with DHCPv6 PD</h2><p>To overcome these drawbacks, we have added support for DHCPv6 Prefix Delegation (PD) as defined in <a href="https://www.rfc-editor.org/rfc/rfc8415.html" rel="nofollow" target="_blank">RFC 8415</a> and <a href="https://www.rfc-editor.org/rfc/rfc9762.html" rel="nofollow" target="_blank">RFC 9762</a>. The Android network stack can now request a dedicated prefix from the network, and if it obtains a prefix, it will use it to obtain IPv6 connectivity. In future releases, the device will be able to share the prefix with wearable devices, tethered devices, virtual machines, and stub networks such as Thread, providing all these devices with global IPv6 connectivity. This truly realizes the potential of IPv6 to allow end-to-end, scalable connectivity to an unlimited number of devices and functions, without requiring NAT. And because the prefix is assigned by the network, network operators can use existing DHCPv6 logging infrastructure to track which device is using which prefix (see <a href="https://www.rfc-editor.org/rfc/rfc9663.html" rel="nofollow" target="_blank">RFC 9663</a> for guidance to network operators on deploying DHCPv6 PD).</p><p>This allows networks to fully realize the potential of IPv6: devices maintain the flexibility of SLAAC, such as the ability to use a nearly unlimited number of addresses, and the network maintains the manageability and accountability of a traditional DHCPv6 setup. We hope that this will allow more networks to transition to IPv6, providing apps with end-to-end IPv6 connectivity and reducing the need for NAT traversal and keepalives.</p><div><h2 style="text-align: left;">What this means for app developers</h2><div>DHCPv6 PD support is expected to roll out to most devices running Android 11 and above before the end of the year via a <a href="https://support.google.com/product-documentation/answer/11462338" rel="nofollow" target="_blank">Google Play System Update</a>. No action is needed to take advantage of it - it will just transparently provide IPv6 connectivity on networks that support it. We hope this change encourages more networks to adopt IPv6, leading to improved battery life, reliability, and code simplicity in these complex networking scenarios. And if you have a complex networking app, and your app or server doesn’t support IPv6, now might be a good time to leverage it to improve reliability and battery life.<br /></div></div></div><p></p><p></p> Android Developers HDR and User Interfaces http://android-developers.googleblog.com/2025/09/hdr-and-user-interfaces.html Android Developers Blog urn:uuid:4b371895-56dd-e3be-bd13-1920dadc338a Wed, 10 Sep 2025 16:57:56 +0000 <meta name="twitter:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpZI5YY5Oj833Cvxt21-E54SjcylXmmumqvkQ9FIPWn3LqeiAjkaZyhsSRmOz_FWnKyRmD7xyPwf_Qg9hD8n_89VvgATa5vsTLzSVEPyc78XX8MkA3eeBKPbTt7jnIJSybCrscAppOTKGvP9wC_qnKf_4EOTZI2L4tY6VtUmz3yNyb66_6QQQr1sHU924/s1600/HDR-user-interfaces.png"> <img style="display:none" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpZI5YY5Oj833Cvxt21-E54SjcylXmmumqvkQ9FIPWn3LqeiAjkaZyhsSRmOz_FWnKyRmD7xyPwf_Qg9hD8n_89VvgATa5vsTLzSVEPyc78XX8MkA3eeBKPbTt7jnIJSybCrscAppOTKGvP9wC_qnKf_4EOTZI2L4tY6VtUmz3yNyb66_6QQQr1sHU924/s1600/HDR-user-interfaces.png"> <em>Posted by Alec Mouri - Software Engineer</em> <div><br /></div> <a href="IMG" imageanchor="1" ><img style="100%" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8yzoBsDjctmg59xu56At8rF-hngncE92f6Dsk-9_3-wXZVtyO5XrCMvZ5VfchsDjY0n0SqJqgRWBXB355jgjQM8cNBet07JQYPmcFq4WtvllfjdyflCJD5vGp_oB1sSk6QKATzPnUW8GZ_ai3vfDlnUzwAa7_NlzFqX8VY_reaunuLOPnZypDWwFkWTs/s1600/Android_Evergreen_Hero_Banner_Cloud_Development.png" data-original-width="100%" data-original-height="800" /></a> <p>As explained in <a href="https://android-developers.googleblog.com/2025/08/what-is-hdr.html" target="_blank">What is HDR?</a>, we can think of HDR as only referring to a luminance range brighter than SDR. When integrating HDR content into a user interface, you must be careful when your user interface is primarily SDR colors and assets. The human visual system adapts to perceived color based on the surrounding environment, which can lead to surprising results. We’ll look at one pertinent example.</p> <h2><span style="font-size: x-large;">Simultaneous Contrast</span></h2> <p>Consider the following image:</p> <image><div style="text-align: center;"><img alt="contrast example 1" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsBqZ0NFKfWOfSGBeNQM1a1XljGEub9c2Vau2RtSqBeKkvv6FzwAxhnuR7PbI18zHyZBlxqjPOzU_OMMzH-noaCbiXFUjrWmMqwuSJexS216-UNdk3ZMkDF3iZ53-xSWEMJlYBNzT3XRL0Xpbw9JbIGxpsDLBbm2SZT_C0ZpcfijA-eF2XXrkSZARxV70/s1600/image3.png" width="50%" /></div><imgcaption><center><em>Source: <a href="https://en.wikipedia.org/wiki/Contrast_effect#/media/File:Simultaneous_Contrast.svg" target="_blank">Wikipedia</a></em></center></imgcaption></image><br/> <p>This image shows two gray rectangles with different background colors. For most people viewing this image, the two gray rectangles appear to be different shades of gray: the topmost rectangle with a darker background appears to be a lighter shade than the bottommost rectangle with a lighter background.</p> <p>But these are the same shades of gray! You can prove this to yourself by using your favorite color picking tool or by looking at the below image:</p> <image><div style="text-align: center;"><img alt="contrast example 2" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4Ipl6C_6jl7FU-jxKN7eGsAp3oF3ek9Mc-9VX8BxmPWyMEOO14xb_Q7pQ4V7nTmP6ryfaNt5s5LVPifHLPXVL5r8QFs8kXLGJ720znKPzD7rFS7-kSvAwq81H-MRcoKBOu4_9lW9Y039VHFtlOepv3m2BWw41OCP5_jCE32A3XS3MVDFa4_sodj6u_HM/s1600/image4.png" width="50%" /></div></image><br/> <p>This illustrates a visual phenomenon called simultaneous contrast. Readers who are interested in the biological explanation may learn more <a href="https://www.cns.nyu.edu/~david/courses/perception/lecturenotes/brightness-contrast/brightness-contrast.html" target="_blank">here</a>.</p> <p>Nearby differences in color are therefore “emphasized”: colors appear darker when immediately next to brighter colors. That same color would appear lighter when immediately next to darker colors.</p> <h2><span style="font-size: x-large;">Implications on Mixing HDR and SDR</span></h2> <p>The effect of simultaneous contrast affects the appearance of user interfaces that need to present a mixture of HDR and SDR content. The peak luminance allowed by HDR will create an effect of simultaneous contrast: the eye will adapt<b>*</b> to a higher peak luminance (and oftentimes a higher average luminance in practice), which will perceptually cause SDR content to appear dimmer although technically the SDR content luminance has not changed at all. For users, this can be expressed as: my phone screen became “grey” or “washed out”.</p> <p>We can see this phenomenon in the below image. The device on the right simulates how photos may appear with an SDR UI, if those photos were rendered as HDR. Note that the August photos look identical when compared side-by-side, but the quality of the SDR UI is visually degraded.</p> <image><div style="text-align: center;"><img alt="contrast example on Google Photos" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjA2y-wJh6SAM6flTRk9mgko61OXHQB3hz9n-uGipPyUBywQzKK7XN774vkVXk7GC4YDrkSHl3K27CXqXO6mYiZlBKEsNkoMFWPimx917WimZ5cnCHl60_oa0JyztloyV4az9k6Eb__n3Ggr9ocSlZEtEPjhgHN0b_9GbC_MaQrdVk7PGm30ngazHbFMs/s1600/HDR-user-interfaces.png" width="80%" /></div></image><br/> <p>Applications, when designing for HDR, need to consider how “much” SDR is shown at any given time in their screens when controlling how bright HDR is “allowed” to be. A UI that is dominated by SDR, such as a gallery view where small amounts of HDR content are displayed, can suddenly appear to be darker than expected.</p> <p>When building your UI, consider the impact of HDR on text legibility or the appearance of nearby SDR assets, and use the appropriate APIs provided by your platform to constrain HDR brightness, or even disable HDR. For example, a 2x headroom for HDR brightness may be acceptable to balance the quality of your HDR scene with your SDR elements. In contrast, a UI that is dominated by HDR, such as full-screen video without other UI elements on-top, does not need to consider this as strongly, as the focus of the UI is on the HDR content itself. In those situations, a 5x headroom (or higher, depending on content metadata such as <a href="https://developer.android.com/media/platform/hdr-image-format" target="_blank">UltraHDR</a>'s max_content_boost) may be more appropriate.</p> <p>It might be tempting to “brighten” SDR content instead. Resist this temptation! This will cause your application to be <b>too</b> bright, especially if there are other applications or system UI elements on-screen. </p> <h2><span style="font-size: x-large;">How to control HDR headroom</span></h2> <p>Android 15 introduced a control for <a href="https://developer.android.com/about/versions/15/features#hdr-headroom" target="_blank">desired HDR headroom</a>. You can have your application request that the system uses a particular HDR headroom based on the context around your desired UI:</p> <ul><ul> <li>If you only want to show SDR content, simply request no headroom.</li> <li>If you only want to show HDR content, then request a high HDR headroom up to and according to the demands of the content.</li> <li>If you want to show a mixture of HDR and SDR content, then can request an intermediate headroom value accordingly. Typical headroom amounts would be around 2x for a mixed scene and 5-8x for a fully-HDR scene.</li> </ul></ul> <p>Here is some example usage:</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// Required for the window to respect the desired HDR headroom.</span> <span style="color: #3D7B7B; font-style: italic">// Note that the equivalent api on SurfaceView does NOT require</span> <span style="color: #3D7B7B; font-style: italic">// COLOR_MODE_HDR to constraint headroom, if there is HDR content displayed</span> <span style="color: #3D7B7B; font-style: italic">// on the SurfaceView.</span> window.<span style="color: #687822">colorMode</span><span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>ActivityInfo.<span style="color: #687822">COLOR_MODE_HDR</span> <span style="color: #3D7B7B; font-style: italic">// Illustrative values: different headroom values may be used depending on</span> <span style="color: #3D7B7B; font-style: italic">// the desired headroom of the content AND particularities of apps&#39;s UI</span> <span style="color: #3D7B7B; font-style: italic">// design.</span> window.<span style="color: #687822">desiredHdrHeadroom</span><span style="color: #BBB"> </span><span style="color: #666">=</span> <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span>(<span style="color: #3D7B7B; font-style: italic">/* SDR only */</span>)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #666">0f</span> <span style="color: #BBB"> </span>}<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">else</span><span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #3D7B7B; font-style: italic">/* Mixed, mostly SDR */</span>)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #666">1.5f</span> <span style="color: #BBB"> </span>}<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">else</span><span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">if</span><span style="color: #BBB"> </span>(<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">/* Mixed, mostly HDR */</span>)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #666">3f</span> <span style="color: #BBB"> </span>}<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">else</span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span> <span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">/* HDR only */</span> <span style="color: #BBB"> </span><span style="color: #666">5f</span> <span style="color: #BBB"> </span>} <span style="color: #BBB"> </span>} <span style="color: #BBB"> </span>} </pre></div> <p>Other platforms also have APIs that allow for developers to have some control over constraining HDR content in their application.</p> <p>Web platforms have a more coarse concept: The First Public Working Draft of the CSS Color HDR Module adds a <a href="https://www.w3.org/TR/css-color-hdr-1/#the-dynamic-range-limit-property" target="_blank">constrained-high</a> option to constrain the headroom for mixed HDR and SDR scenes. Within the Apple ecosystem, <a href="https://developer.apple.com/documentation/swiftui/image/dynamicrange/constrainedhigh" target="_blank">constrainedHigh</a> is similarly coarse, reckoning with the challenges of displaying mixed HDR and SDR scenes on consumer displays.</p> <p>If you are a developer who is considering supporting HDR, be thoughtful about how HDR interacts with your UI and use HDR headroom controls appropriately.</p> <hr> <p>*<em>There are other mechanisms the eye employs for light adaptation, like pupillary light reflex, which amplifies this visual phenomenon (brighter peak HDR light means the pupil constricts, which causes less light to hit the retina).</em></p> HDR HDR Headroom SDR Simultaneous Contrast User Interface Android Developers #WeArePlay: Meet the people using Google AI to solve problems in agriculture, education, and pet care http://android-developers.googleblog.com/2025/09/weareplay-meet-people-using-google-ai.html Android Developers Blog urn:uuid:293d914b-891b-2946-f7ff-d8a0e386c169 Wed, 10 Sep 2025 09:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png" style="display: none;" /> <em>Posted by Robbie McLachlan - Developer Marketing</em> <a href="IMG"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> stories, we meet the people using Google AI to drive positive change with their apps and games on Google Play - from diagnosing crop diseases with a single photo to reuniting lost pets with a simple nose print.</p> <p>Here are a few of our favorites:</p> <h4><span style="font-size: large;">Jesse and Ken’s app Petnow uses AI-powered nose print recognition to identify individual dogs and cats, helping to reunite lost pets with their owners.&nbsp;</span></h4> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Jesse and Ken’s app Petnow uses AI-powered nose print recognition to identify individual dogs and cats, helping to reunite lost pets with their owners." border="0" data-original-height="652" data-original-width="431" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6sypdptqCu3lvQbF0ea8OGWJyxeKYiQ1J0U8AJLFgMrkwmzjmdjUjgW_uje9rr1B8yAmlZjihqpk3Xq3mTKhLeGIl7Om2K7cTQ0xgRmdNg9zDI-zmLGTz4it1SzS7N9SHm32g2LYl0LG7malJI3lUd3Ntm-6cOQSK3q4CHqpYiAW6ykOJtTSkWU5oCGc/w265-h400/01_KOREA_PETNOW_COFOUNDER_Joonho%20Lim_edited.png" width="265" /></a></div></div><imgcaption><center><center><i>Dr. Jesse Joonho Lim, co-founder of Petnow&nbsp;</i></center><center><i>Seoul, South Korea&nbsp;</i></center></center></imgcaption></image><br /> <p>Inspired by his lifelong love of dogs, Jesse teamed up with Vision AI expert Ken to create <a href="https://play.google.com/store/apps/details?id=io.petnow.petnow&amp;gl=kr" rel="nofollow" target="_blank">Petnow</a>.&nbsp; Boosted by Gemini, their app uses nose print recognition to identify individual dogs and cats, helping to reunite lost pets with their owners. Recent AI updates, enhanced by Google Gemini, now let people search by breed, color, and size simply by taking a photo with their device. Next, the team plans to expand globally, aiming to help owners everywhere stay connected with their furry companions.</p> <h4><span style="font-size: large;">Simone and Rob's app, Plantix, uses AI to identify crop diseases from photos and suggests remedies.</span></h4> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Simone and Rob's app, Plantix, uses AI to identify crop diseases from photos and suggests remedies." border="0" data-original-height="3264" data-original-width="1705" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKMhfXWon0grQ3kFLR-u2yYXVDv7_UAQ8ImTvdXPbPhxRECTZo1yUFNztXiew9VKing7V3CKiIHYBAAI7Th7_Xyurhr5TnMOAXX6VB3PUEIo1lZ3FbvxwHddPxyJWO-sIuhw6GGBabvS-02MFYDFpbFHb6NOM4FqQHy-2M6R-y_dh1DTC2y9yQBuotus/w209-h400/01_GERMANY_PLANTIX_FOUNDERS_SIMONESTREY_ROBSTREY.jpg" width="209" /></a></div></div><imgcaption><center><center><i>Simone Strey and Rob Strey, co-founders of Plantix&nbsp;</i></center><center><i>Berlin, Germany&nbsp;</i></center></center></imgcaption></image><br /> <p>While testing soil in the Amazon, PhD students Simone and Rob were asked by farmers for help diagnosing crop diseases. The couple quickly realized that local names for plant illnesses didn’t match research terms, making solutions hard to find. So they created <a href="https://play.google.com/store/apps/details?id=com.peat.GartenBank" rel="nofollow" target="_blank">Plantix</a>, an AI app that uses Google Vision Transformer (ViT), identifying crop problems from photos and suggests remedies in multiple languages.Their mission continues to grow; now based in India, they are building a new startup to help farmers source eco-friendly products. With global expansion in mind, the team aims to add a speech-based assistant to give farmers real-time, personalized advice.</p> <h4><span style="font-size: large;">Gabriel&nbsp; and Isaac’s game, Afrilearn uses AI powered by Google Cloud to make education fun and accessible for children across West Africa.</span></h4> <image><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="http://g.co/play/weareplay" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Gabriel and Isaac’s game, Afrilearn uses AI powered by Google Cloud to make education fun and accessible for children across West Africa." border="0" data-original-height="3264" data-original-width="4928" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvjyTaZhZd3fzleI-9UTVF58BmnQ098yjr9-1unEB7gEzf00Zmza_5GdXQE_glwj0TiM1QvQm0RiZdbqF2adsicRCSh29sxGUi1-k4n4aCGUyY3auJMFAHsx22hwFO_sKqnfjtosysiFZCjMS6pu9RyqaFSLY9g9gM0udHvmYXP-rs58Ioy0DCku13CRU/w400-h265/01_NG_AFRILEARN_FOUNDERS_Gabriel%20Olatunji-Legend%20and%20Isaac%20Oladipupo_edited.jpg" width="400" /></a></div></div><imgcaption><center><center><i>Gabriel Olatunji-Legend and Isaac Oladipupo, co-founders of Afrilearn&nbsp;</i></center><center><i>Lagos, Nigeria&nbsp;</i></center></center></imgcaption></image><br /> <p>Inspired by their own upbringing in Lagos, friends Gabriel and Isaac believe every child deserves a chance to succeed through education. They built <a href="https://play.google.com/store/apps/details?id=com.afrilearn&amp;hl=en&amp;gl=ng" rel="nofollow" target="_blank">Afrilearn</a>, a gamified learning app that uses animation, storytelling, and AI to make lessons aligned with local curriculums engaging and accessible. Already helping thousands of learners, they are now expanding into school management tools to continue their mission of unlocking every child's potential.</p><p><br /></p> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> Android Developers Improve app performance with optimized resource shrinking http://android-developers.googleblog.com/2025/09/improve-app-performance-with-optimized-resource-shrinking.html Android Developers Blog urn:uuid:c89d2511-fd61-5472-db4f-323dd1421a62 Tue, 09 Sep 2025 16:00:00 +0000 <meta name="twitter:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsXMrpw2l5qGMdqAp9fhyeO73UrWI3PdkMKUC3cizvDV08iCWahG4bVSyaCT3S3fL7M3UGv6_q_raMSEyE2UUTrFi4XpiSGE2eqigQmkVbsqP5nd0Pk83A3q-wvQXEXqBtmu9niXqcMcN0xgjRsM-6B-fL3E0FSuh4c0rMVYbDIJgQzY0xqsd9RvwS98k/s1600/optimized-resource-shrinking.png"> <img style="display:none" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsXMrpw2l5qGMdqAp9fhyeO73UrWI3PdkMKUC3cizvDV08iCWahG4bVSyaCT3S3fL7M3UGv6_q_raMSEyE2UUTrFi4XpiSGE2eqigQmkVbsqP5nd0Pk83A3q-wvQXEXqBtmu9niXqcMcN0xgjRsM-6B-fL3E0FSuh4c0rMVYbDIJgQzY0xqsd9RvwS98k/s1600/optimized-resource-shrinking.png"> <p><em>Posted by Johan Bay - Software Engineer</em><p> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil6NQPOhsw7q7rhWToNDP74Mye1Ymabsc9qmkwIjWR_oPcnl4GJ3gFL4T5C9KgEFKL7geI40TkAwxaGFCKjtZlnqAfN-yxP64KuafdGy6i1CH08WYWKThTjxZq59LFRSFAj9P8RVhMrRqzmdbJI_sP1YJ2JsnBCRMD-qRIOrosVe4rvZMv7mAt_u5noBs/s1600/optimized-resource-shrinking-banner.png" imageanchor="1" ><img style=”100%” border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil6NQPOhsw7q7rhWToNDP74Mye1Ymabsc9qmkwIjWR_oPcnl4GJ3gFL4T5C9KgEFKL7geI40TkAwxaGFCKjtZlnqAfN-yxP64KuafdGy6i1CH08WYWKThTjxZq59LFRSFAj9P8RVhMrRqzmdbJI_sP1YJ2JsnBCRMD-qRIOrosVe4rvZMv7mAt_u5noBs/s1600/optimized-resource-shrinking-banner.png" data-original-width="1058" data-original-height="800" /></a> <p>A small and fast app is key to a fantastic user experience. That's why we built <a href="https://developer.android.com/topic/performance/app-optimization/enable-app-optimization" target="_blank">R8</a>, our app optimizer, which streamlines your app by removing unused code and resources, rewriting code to optimize runtime performance, and more.</p> <p>With the release of version 8.12.0 of the Android Gradle Plugin (AGP), we're introducing optimized resource shrinking, an even better way to shrink your app with R8. By opting in, you can make your app smaller, which means smaller downloads, faster installations, and less memory used on your users' devices. The result is a faster startup, improved rendering, and fewer ANRs.</p> <h2><span style="font-size: x-large;">How it works</span></h2> <p>Resource shrinking for Android apps has been around for a long time, with several improvements made along the way– for instance, shrinking the resource table (<span style="color: #0d904f ;font-family: courier;">resources.arsc</span>) is now a default optimization. </p> <p>The new approach improves resource shrinking by fully integrating it with the existing code optimization pipeline. In the new approach, R8 optimizes both code and resource references at the same time ensuring that all resources referenced exclusively from unused code are identified as unused and then removed. This completely eliminates the need for the unconditional keep rules generated by AAPT2 (the resource packaging tool for Android) and provides much more fine-grained and precise information for discarding unused code and resources</p> <p>This is an improvement over the existing pipeline where code and resource optimization are separate. In the existing pipeline, AAPT2 generates keep rules to unconditionally keep classes referenced from resources. Then, R8 optimization runs with these keep rules. After R8 is done optimizing and shrinking the code, it scans the remaining code to build a graph of all the resources referenced directly or indirectly. However, the unconditional AAPT2 rules often keep code that is otherwise unused, which in turn causes R8 to keep both the unused code and the unused resources referenced by it.</p> <h2><span style="font-size: x-large;">How to use it</span></h2> <p>First, turn on R8 optimization with resource shrinking, by using the following in your <span style="color: #0d904f ;font-family: courier;">build.gradle.kts</span> file:</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>android<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span>buildTypes<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span>release<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span>isMinifyEnabled<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span> <span style="color: #BBB"> </span>isShrinkResources<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span> <span style="color: #BBB"> </span>… <span style="color: #BBB"> </span>} <span style="color: #BBB"> </span>} } </pre></div> <p>Turn on the new optimized resource shrinking pipeline by adding the following to your <span style="color: #0d904f ;font-family: courier;">gradle.properties</span> file:</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span>android.<span style="color: #687822">r8</span>.<span style="color: #687822">optimizedResourceShrinking</span><span style="color: #666">=</span><span style="color: #008000; font-weight: bold">true</span> </pre></div> <h2><span style="font-size: x-large;">Benefits</span></h2> <p>The optimized resource shrinking pipeline has shown significant improvements over the existing implementation. For apps that share significant resources and code across different form factor verticals, we measured improvements of over 50% in app size. Smaller apps see improvements as well – for example, in <a href="https://github.com/android/androidify" target="_blank">Androidify</a> we see the following gains:</p> <image><div style="text-align: center;"><img alt="table showing the progressive improvements in size as additional optimizations are enabled" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN3EUGORBGYA7UZHsHq-8qCB7-45VyjZIX4gRYM_lb-QZUxm0hLxWWWyAGKzb0jf8W5alRzZyHxch1sUhyI0YZh1GqBUXwOrk8zMnBU3DaIxGpvlh6P96-vQQuH_rnKMqWw7EKhD5fszabkmP9rXnupvdPjBxbcjWybzr2Vf7ZFhPehURZY5kx-9UAl3E/s1600/image1.png" width="90%" /></div><imgcaption><center><em></em></center></imgcaption></image><br/> <p>The table shows the progressive improvements in size as additional optimizations are enabled, from no shrinking to optimized resource shrinking. The cells marked with an asterisk (*) indicate improved numbers compared to the previous row. Enabling R8 trims the size of your DEX, while enabling resource shrinking removes unused resources in both the <span style="color: #0d904f ;font-family: courier;">res</span> folder and in the resource table, but does not change the DEX size further, and finally, optimized resource shrinking further reduces the size by removing both resources and DEX code since it can trace references across the DEX and resource boundary.</p> <h2><span style="font-size: x-large;">Next steps</span></h2> <p>Starting with AGP 9.0.0, optimized resource shrinking becomes the standard behavior for any project that has the resource shrinker turned on.</p> <p>Check out the <a href="https://developer.android.com/topic/performance/app-optimization/enable-app-optimization" target="_blank">newly updated documentation</a> to try optimized resource shrinking and let us know if you encounter any problems on the <a href="https://developer.android.com/topic/performance/app-optimization/enable-app-optimization" target="_blank">issue tracker</a>.</p> Android Gradle Plugin app performance app size optimized resource shrinking R8 Android Developers Best practices for migrating users to passkeys with Credential Manager http://android-developers.googleblog.com/2025/09/best-practices-migrating-users-passkeys-credential-manager.html Android Developers Blog urn:uuid:7785c34d-5b27-3b0f-0458-4dafed7a401d Thu, 04 Sep 2025 19:00:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggAgZpSGE0_9eSno9KgAMEfUr5rOevzNtP_iHFQ1cl83SruPKIv0j1mNgvmphzUZrXftZ7KKMTgJmBiRfjp5wSWEnDLgtCen10WUvuU4hT1pC-an3QIppvtCSbJR2zouDk2j7CVEhMYF1SvNjnVHaWwVUTUD0qk_-wloQFLgZLwYNnOVeNvs2dAROTPBA/s1600/credential-manager-meta%20%281%29.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggAgZpSGE0_9eSno9KgAMEfUr5rOevzNtP_iHFQ1cl83SruPKIv0j1mNgvmphzUZrXftZ7KKMTgJmBiRfjp5wSWEnDLgtCen10WUvuU4hT1pC-an3QIppvtCSbJR2zouDk2j7CVEhMYF1SvNjnVHaWwVUTUD0qk_-wloQFLgZLwYNnOVeNvs2dAROTPBA/s1600/credential-manager-meta%20%281%29.png" style="display: none;" /> <em>Posted by Niharika Arora (<a href="https://x.com/theDroidLady" target="_blank">X</a> and <a href="https://www.linkedin.com/in/thedroidlady/" target="_blank">LinkedIn</a>) – Senior Developer Relations Engineer and Vinisha Athwani - Technical Writer (<a href="https://in.linkedin.com/in/vinisha-athwani" target="_blank">LinkedIn</a>)</em> <div><br /></div> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrvOeAJc1y1bh78bUAk20alDyAvhMrpkuJ0MDKBHdv5kSbXGpvLhyphenhyphenae-b-s7Ao287HooSPVNtHovtYT4VhMhZjthJLC7qcwZirUna0QAXQvZSMO1b6ZzgfyCcsQRW-K7hMNLQKBSxbQvJMGFBUHAIhKIcR7i3_Cua2BNd-NYwkXF81nCSFyvGvxAC8Z_A/s1600/Android_Evergreen_Hero_Banner_Safety_and_Security_OptionB.png"><img border="0" data-original-height="800" data-original-width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrvOeAJc1y1bh78bUAk20alDyAvhMrpkuJ0MDKBHdv5kSbXGpvLhyphenhyphenae-b-s7Ao287HooSPVNtHovtYT4VhMhZjthJLC7qcwZirUna0QAXQvZSMO1b6ZzgfyCcsQRW-K7hMNLQKBSxbQvJMGFBUHAIhKIcR7i3_Cua2BNd-NYwkXF81nCSFyvGvxAC8Z_A/s1600/Android_Evergreen_Hero_Banner_Safety_and_Security_OptionB.png" /></a> <p>In a world where digital security is becoming increasingly critical, passwords have become a notorious weak link – they're cumbersome, often insecure, and a source of frustration for users and developers. But there's good news: <a href="https://safety.google/authentication/passkey/" target="_blank">passkeys</a> are gaining popularity as the most user-friendly, phishing-resistant, and secure authentication mechanism available. For Android developers, the <a href="https://developer.android.com/identity/sign-in/credential-manager" target="_blank">Credential Manager API</a> helps you guide your users towards using passkeys while ensuring continued support for traditional sign-in mechanisms, such as passwords.</p> <p>In this blog, we discuss some of the best practices you should follow while encouraging users to transition to passkeys.</p> <h2><span style="font-size: x-large;">Understand authentication with passkeys</span></h2> <p>Before diving into the recommendations for encouraging the transition to passkeys, here’s an overview of the fundamentals of authentication with passkeys:</p> <ul><ul> <li><b><a href="http://google.com/search?q=passkeys+fido+alliance&amp;oq=passkeys+fido+alliance&amp;gs_lcrp=EgZjaHJvbWUqBwgAEAAYgAQyBwgAEAAYgAQyCAgBEAAYFhgeMggIAhAAGBYYHjIICAMQABgWGB4yDQgEEAAYhgMYgAQYigUyDQgFEAAYhgMYgAQYigUyBggGEEUYQDIGCAcQRRhA0gEIMzAyNmowajeoAgCwAgA&amp;sourceid=chrome&amp;ie=UTF-8" target="_blank">Passkeys</a>:</b> These are cryptographic credentials that replace passwords. Passkeys are associated with device unlocking mechanisms, and are the recommended method of authentication for apps and sites. </li><li><b><a href="https://developer.android.com/training/sign-in/passkeys" target="_blank">Credential Manager</a>:</b> A Jetpack API that provides a unified API interface for interacting with different types of authentication, including passkeys, passwords, and federated sign-in mechanisms like Sign in with Google. </li></ul></ul> <h2><span style="font-size: x-large;">How do passkeys help your users?</span></h2> <p>There are several tangible benefits that users experience in apps that allow them to use passkeys to sign in. The highlights of using passkey for users are as follows:</p> <ul><ul> <li><b>Improved sign-in experience:</b> Users get the same UI whether they use passwords, passkeys or federated sign-in mechanisms like Sign in with Google.</li> <li><b>Reduced sign-in time:</b> Instead of typing out passwords, users use their phone unlock mechanisms, such as biometrics, resulting in a smooth sign-in experience.</li> <li><b>Improved security:</b> Passkeys use public-key cryptography so that data breaches of service providers don't result in a compromise of passkey-protected accounts, and are based on industry standard APIs and protocols to ensure they are not subject to phishing attacks. (Read more about syncing and security <a href="https://security.googleblog.com/2022/10/SecurityofPasskeysintheGooglePasswordManager.html" target="_blank">here</a>).</li> <li><b>Unified experience across devices:</b> With the ability to sync passkeys across devices, users benefit from simplified authentication regardless of the device they’re using.</li> <li><b>No friction due to forgotten passwords!</b></li> </ul></ul> <p>Underscoring the improved experience with passkeys, we heard from several prominent apps. <b>X</b> observed that login rates improved <a href="https://android-developers.googleblog.com/2024/11/x-improved-login-success-rate-after-adopting-passkeys.html" target="_blank">2x after adding passkeys to their authentication flows</a>. <b>KAYAK</b>, a travel search engine, observed that the average time it takes their users to sign up and sign in <a href="https://developers.googleblog.com/en/how-kayak-reduced-sign-in-time-by-50-and-improved-security-with-passkeys/" target="_blank">reduced by 50%</a> after they incorporated passkeys into their authentication flows. <b>Zoho</b>, a comprehensive cloud-based software suite focused on security and seamless experiences, <a href="https://android-developers.googleblog.com/2025/05/zoho-achieves-faster-logins-passkey-credential-manager-integration.html" target="_blank">achieved 6x faster logins by adopting passkeys</a> in their OneAuth Android app.</p> <h2><span style="font-size: x-large;">What’s in it for you?</span></h2> <p>When you migrate your app to use passkeys, you’ll be leveraging the Credential Manager API which is the <b>recommended</b> standard for identity and authentication on Android.</p> <p>Apart from passkeys, the Credential Manager API supports traditional sign-in mechanisms, simplifying the development and maintenance of your authentication flows!</p> <p>For all of these sign-in mechanisms, Credential Manager offers an integrated bottom-sheet UI, saving you development efforts while offering users a consistent experience.</p> <h2><span style="font-size: x-large;">When should you prompt users to use passkeys?</span></h2> <p>Now that we’ve established the benefits of passkeys, let’s discuss how you should encourage your users to migrate to passkeys.</p> <p>The following are a list of UX flows in which you can promote passkeys:</p> <ul><ul> <li><b>User account registration:</b> Introduce passkey <a href="https://developer.android.com/identity/sign-in/credential-manager#create-passkey" target="_blank">creation</a> prompts at key moments, such as when your users create their accounts:</li> <image><div style="text-align: center;"><img alt="introduce passkey creation prompts at key moments, such as when your users create their accounts" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB1lH9ebLJklYFJMaqxIplDxo5UfqtJpS9Ep79_3yLu78c58Zcp7BkdbK25r8gp5vUYRxEg-7HRaoOcMlWMEJCQs_nk3fYg7Tsj51yIDjqIV9lCDtA1rfy2Lof5X0Ou1rkedhy132535CZUDxMk4lDIHY0obMryYNdAvvO2pWj_Gb_MQMUwqChWJkyxYs/s1600/image7.png" width="100%" /></div><imgcaption><center><em>Contextual Prompts during account creation</em></center></imgcaption></image><br /> <li><b>Sign in:</b> We recommend you encourage users to prompt passkeys in the moment after a user <a href="https://developer.android.com/identity/sign-in/credential-manager#sign-in" target="_blank">signs</a> in with an OTP, password, or other-sign in mechanisms.</li> <image><div style="text-align: center;"><img alt="encourage users to create a passkey to sign in the moment after they sign in via OTP or password" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIvjXfXC6szIN6Jmr0sPpESqJk_9qHcAQpkNX6lRai1Bhswuuiw9AzoTyJO3jsovQNbuHqtTgnhztejj-F5ueL0Bx2rfNsQKL8bRF7WGSwvr1qeq0cucEbWLmC5c1IHnzK7inx_Tl0mw-bbw46Y7bPzP7PBEr3Sr0Wb0Cw32JIrXsJx4vQCL_R7cuRx5I/s1600/passkeys-credential-manager-sign-in.png" width="100%" /></div><imgcaption><center><em>Prompt passkey creation during sign-in</em></center></imgcaption></image><br /> <li><b>Account recovery:</b> The critical user journey (CUJ) for account recovery is one that historically presents friction to users. Prompting users to adopt passkeys during account recovery is a recommended path. Users who adopt passkeys experience a familiar account recovery experience as during sign-in.</li> <image><div style="text-align: center;"><img alt="encourage users to create a passkey to sign in during account recovery" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC9eSDTKb9sccO-gL1RCE0xoPtHODgO5AbztB8LvWv8_mkqn8YcH-z2kk5aHqcq7khEykdwobTEoatc47v1xJRlvBaz76NIezuyR0ZDOv8Rc-h7GzXbd9VzkeRTCPlSI2MiqXHT35NW_frSJmLTHW4bLkPfcuB3ubZ242fB002fduc844T6Va5-_QtFtg/s1600/passkeys-account-recovery.png" width="100%" /></div><imgcaption><center><em>Account Recovery flow</em></center></imgcaption></image><br /> <li><b>Password resets:</b> This is the perfect moment to prompt users to create a passkey; after the frustration of a password reset, users are typically more receptive to the convenience and security passkeys offer. </li> <image><div style="text-align: center;"><img alt="encourage users to create a passkey to sign in when a new password is created" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_m-y4kSmiYYno3uYNB46UeQruiwWxyyp3qczN9k3stbqXYFDqbI8aoFzbxEzonQ3mUezjavccJZnQmQNZ9ahiUJLR4fDmiR0VWu36xBDuFTUmubapjZyN3mO_qMslXdDl1XG2oXKU_oj2_nP0SJseFAfgdkVv22LMKW4CyrZ-9H0_x10GgclObQpjZD4/s1600/passkeys-new-password-created.png" width="100%" /></div><imgcaption><center><em>Create a passkey for faster sign-in next time</em></center></imgcaption></image><br /></ul></ul> <h2><span style="font-size: x-large;">How should you encourage the transition to passkeys?</span></h2> <p>Encouraging users to transition from passwords to passkeys requires a clear strategy. A few recommended best practices are as follows:</p> <ul style="text-align: left;"><ul> <li><b>Clear value proposition:</b> Use simple, user-centric prompts to explain the benefits of passkeys. Use messaging that highlights the benefits for users. Emphasize the following benefits:</li> <ul><ul> <li>Improved security benefits, such as safety from phishing.</li> <li>No need to type out a password.</li> <li>Ability to use the same passkey across devices/platforms.</li> <li>A consistent authentication experience.</li> <image><div style="text-align: center;"><img alt="example of clear value proposition encouraging app users to create a passkey to sign in" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJQPTAgLEAdw5ioahG68v6MEboHese-Z_6aseVfsVRHUfJKj4W7kk0Dk7DFg9gspOJidH3wrNermDJRwWWQCiJwFmJ1ugQK8J2GOCAlEgcoBsWkKEFwzPiWqwr3vC3g7GS2WiKOuGsBVGcnUfWs-XLp75QzT8px1WiNYwWvMpEeRQOXLSwPLleLdJxVpA/s1600/create-passkeys-clear-value-proposition.png" width="100%" /></div><imgcaption><center><em>Passkey prompt with clear value proposition</em></center></imgcaption></image><br /></ul></ul> <li><b>Provide a seamless user experience:</b></li> <ul><ul> <li>Use the <a href="https://developer.android.com/design/ui/mobile/guides/patterns/passkeys#unified_sign-in" target="_blank">unified UI</a> provided by Credential Manager to show all available <a href="https://developer.android.com/identity/sign-in/credential-manager#sign-in" target="_blank">sign-in options</a>, allowing the user to choose their preferred method without having to remember which one they used last. </li> <li>Use the official <a href="https://developer.android.com/design/ui/mobile/guides/patterns/passkeys" target="_blank">passkey icon</a> to build user familiarity and create a consistent experience.</li> <li>Make sure that users can fall back to their traditional sign-in methods or a recovery method, such as a username and password, if a passkey is not available or if they are using a different device.</li></ul></ul></ul></ul><br /> <ul><ul> <li><b>Provide users with clarity about credentials within your app’s Settings UI:</b> Make sure your users understand their authentications options by displaying helpful information about each passkey within your app’s settings. To learn more about adding credentials metadata, see the <a href="https://developer.android.com/identity/sign-in/credential-manager#show-info" target="_blank">Credential Manager documentation</a>.</li> <image><div style="text-align: center;"><img alt="example of passkeys authentication settings ui" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrkV43fKI6FBxDPBTwdLIrRabLfhuHbzjr9BSlAQEHwWaPiYSY2mHHoOufx3SxRU2WuOrJc0uphB16DQ-KL-A-myqvUbebhLr1t2ZVCS0p-TUh01w8TMUXMJf0ZEk21M0WW5KT8-4JK0BGuBFkahk9emCoL1ojA_ERqwoEqe0UeHZRdnBvDmbDXa7emXw/s1600/passkeys-authentication-settings-ui.png" width="100%" /></div><imgcaption><center><em>Passkey Metadata on App’s Settings screen</em></center></imgcaption></image></ul></ul> <ul><ul> <li><b>Educate users:</b> Supplement the messaging to adopt passkeys with in-app educational resources or links that explain <a href="https://developers.google.com/identity/passkeys" target="_blank">passkeys</a> in detail.</li></ul><ul> <li><b>Progressive rollout:</b> Consider a phased rollout to introduce passkeys to a subset of your user base to gather feedback and refine the user experience before a broader launch.</li> </ul></ul> <h2><span style="font-size: x-large;">Developer Case Studies</span></h2> <p>Real-world developer experiences often highlight how small design choices—like when and where to surface a passkey prompt—can significantly influence adoption and user trust. To see this in action, let’s explore how top apps have strategically surfaced passkey prompts at key moments in their apps to drive stronger adoption :</p> <h3><span style="font-size: large;">Uber</span></h3> <p>To accelerate passkeys adoption, <a href="https://play.google.com/store/apps/details?id=com.ubercab&hl=en_IN" target="_blank">Uber</a> is proactively promoting passkeys in various user journeys, alongside marketing strategies.</p> <p><em>Uber has shared : "<b>90+% of passkey enrollments come from promoting passkey creation at key moments inside the app as compared to onboarding and authentication CUJs</b>", underscoring the effectiveness of their proactive strategy.</em></p> <h4><span style="font-size: medium;"><b>Key learnings and strategies from their implementation:</b></span></h4> <ul><ul> <li><b>Offer passkeys without disrupting the core user experience:</b> Uber added a new account checkup experience in their account settings to highlight passkey benefits, resulting in high passkey adoption rates.</li> <image><div style="text-align: center;"><img alt="example of Uber's new account checkup with recommended action to create a passkey, highlighting a clear value proposition to the user" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrkV43fKI6FBxDPBTwdLIrRabLfhuHbzjr9BSlAQEHwWaPiYSY2mHHoOufx3SxRU2WuOrJc0uphB16DQ-KL-A-myqvUbebhLr1t2ZVCS0p-TUh01w8TMUXMJf0ZEk21M0WW5KT8-4JK0BGuBFkahk9emCoL1ojA_ERqwoEqe0UeHZRdnBvDmbDXa7emXw/s1600/passkeys-authentication-settings-ui.png" width="100%" /></div><imgcaption><center><em>User Account checkup flow </em></center></imgcaption></image></ul></ul> <ul><ul> <li><b>Proactively bring passkeys to users:</b> They learned not to wait for users to discover passkeys organically because relying on organic adoption would have been slower despite observed benefits like faster sign-ins and increased login success rates for passkey users.</li></ul><ul> <li><b>Use additional mediums to promote passkeys:</b> Uber is also experimenting to promote passkeys through <b>email campaigns or banners</b> on a user's account screen to highlight the new sign-in method, making their next sign-in easier and more secure.</li></ul><ul> <li><b>Respect your user’s choice:</b> Recognizing that not all users are ready for passkeys, Uber implemented <b>backoff logic</b> in critical flows as sign in, signup screens and, in some contexts, offers passkeys alongside other familiar authentication methods.</li> </ul></ul> <p><b>Here’s what Uber has to say:</b></p> <blockquote><center><i>At Uber, we’ve seen users who adopt passkeys enjoy a faster, more seamless, and more secure login experience. To help more users benefit from passkeys, we’ve added nudges to create a passkey at key moments in the user experience: account settings, signup, and login. These proactive outreaches have significantly accelerated our passkey adoption.&nbsp;</i></center> <div><center><i><b>Ryan O’Laughlin</b></i></center></div> <div><center><i><b>Senior Software Engineer, Uber</b></i></center></div></blockquote> <h3><span style="font-size: large;">Economic Times</span></h3> <p><a href="https://play.google.com/store/apps/details?id=com.et.reader.activities&hl=en_IN&pli=1" target="_blank">Economic Times</a>, part of the Times Internet ecosystem, used a <b>seamless user experience as the primary motivation for users to transition to passkeys</b>.</p> <p><em>After introducing targeted nudges, Economic Times observed <b>~10%</b> improvements in passkey creation completion rate within the initial rollout period. </em></p> <p><b>Key learnings and strategies from their implementation:</b></p> <ul><ul> <li><b>Strategic passkey generation prompts:</b> Initially, Economic Times was aggressively prompting passkey creation in multiple user flows, but it was observed that this approach <b>disrupted business-critical journeys</b> such as subscription purchases or unlocking premium features and was leading to abandoned carts.</li> <li><b>Refined approach:</b> Economic Times made a deliberate decision to remove passkey generation prompts from sensitive flows (such as the subscription checkout flow) to prioritize immediate action completion.</li> <li><b>Targeted prompts:</b> They strategically maintained passkey generation in areas where user intent to sign-in or manage authentication is high, such as initial sign-up flows, explicit sign in pages, or account management sections.</li> <li><b>Positive outcome:</b> This refined deployment resulted in improved passkey generation numbers, indicating strong user adoption, without compromising user experience in critical business flows.</li> <image><div style="text-align: center;"><img alt="example of Economic Times' signup flow with recommended action to create a passkey, highlighting a clear value proposition to the user" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7uf9-hr66rVxrQaf_U4fz9sL2JMcKcq2cXjSk3mIHN48v1d5mFKXTPpIIXuxoBL6chEPvPvz0BCjDgp_FdqFK6uBYOoBkFjfEXmPlWNUpkwiVpZ-1qAZIoOhTSNRFg6VVyA7bDiHLH5sTp3gKxGaCj52VEPIdqg0Vbf1umEG2cqzsb5hsrg0LOXg3LcI/s1600/econiomic-times-passkeys-workflow.png" width="100%" /></div><imgcaption><center><em>Passkeys Management Screen</em></center></imgcaption></image></ul></ul> <h2><span style="font-size: x-large;">Conclusion</span></h2> <p>Integrating passkeys with Android's Credential Manager isn't just about adopting new technology; it's about building a fundamentally more secure, convenient, and delightful experience for your users. By focusing on intelligent passkey introduction, you're not just securing accounts–you're building trust and future-proofing your application's authentication strategy.</p> <p>To provide your users the best, optimized and seamless experience, follow the <a href="https://developer.android.com/design/ui/mobile/guides/patterns/passkeys" target="_blank">UX guidelines</a> while implementing passkeys authentication with <a href="https://developer.android.com/identity/sign-in/credential-manager" target="_blank">Credential Manager</a>. Check out the docs today!</p> <ul><ul> <li><a href="https://github.com/android/identity-samples" target="_blank">Sample with UX best practices</a></li> <li><a href="https://developer.android.com/identity/sign-in/credential-manager%20" target="_blank">Sign in your user with Credential Manager</a></li> <li><a href="https://developer.android.com/jetpack/androidx/releases/credentials" target="_blank">API Reference – androidx.credentials</a></li> <li><a href="https://developer.android.com/design/ui/mobile/guides/patterns/passkeys%20" target="_blank">User authentication with passkeys</a></li> <li><a href="https://safety.google/authentication/passkey/%20" target="_blank">Google Safety Center - Passkey</a></li> <li><a href="https://security.googleblog.com/2022/10/SecurityofPasskeysintheGooglePasswordManager.html" target="_blank">Google Security Blog: Security of Passkeys in the Google Password Manager</a></li> </ul></ul> #credential-manager #passkeys Authentication Identity Android Developers #WeArePlay: Meet the people behind apps & games powering businesses around the world http://android-developers.googleblog.com/2025/09/weareplay-meet-people-behind-apps-games.html Android Developers Blog urn:uuid:5a57ef6e-33ac-3e17-4e3b-9f27361653b1 Thu, 04 Sep 2025 16:00:00 +0000 <meta name="twitter:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png"> <img style="display:none" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6eYuk_dQaC_5TaoqPXKSvkDt1tEzNSzneOc28sMAb_0sMpRD8OSa6itJ4kUCJO_xo0EHLZGqLq-JgY6BWcqjhUbFAAcN4P3IgoHB3Z3K0o4_qARximmonV09ixtU-V0mkCECOQ3l8BAX8kScUo1MJi65WwxILE0w4FjSAeA8bHpMQyyosJ_oufC_JHI/s1600/WeArePlay_GlobalGrid_2024%20%281%29.png"> <em>Posted by Robbie McLachlan - Developer Marketing</em> <a href="IMG" imageanchor="1" ><img style="100%" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXHK03KiFLi-Ej2Pewi30s2R58kkiiIkl7mzZx9PNC28ac7zbsIvkTqsQZJoKh3QeogtqCwP2vF2iwBaWqE7H770IUfFyZlZX41ZvdqN-3Cvd1hsBowXGOaMR2w0IB4vyBLzX6xfbT7qGbuIeEXZOZzMShMLs9QrTbJeaNkSeImX9GCiqdTOEiJD8kycc/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" data-original-width="100%" data-original-height="800" /></a> <p>In our latest <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a> stories, we meet the founders building apps and games that power entrepreneurs and business owners around the world. From digitizing finances for micro-merchants in Bogotá to modernizing barbershops in New York, they are solving real-world challenges with intuitive apps.</p> <p>Here are a few of our favorites:</p> <h4><span style="font-size: large ;"><b>Lluís and Man Hei’s app Treinta saves microbusiness owners 30 minutes a day by digitizing their sales, inventory, and cash flow.</b></span></h4> <image><div style="text-align: center;"><a href="http://g.co/play/weareplay" target="_blank"><img alt="Lluís Cañadell and Man Hei Lou, co-founders of Treinta Bogotá, Colombia" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieesi1-jmwZt7CrUv5hWmvCZ-1AmxOsfgGUwssu4PapB7XNwcWGPVKWFpAqiUFPpXxF4rX7aIn09_rTLxYU15Od30ff0LLDTIgrCWalpPgV0ZhL3zPSRHnBmP4uOQCT6WOoxJ6thFSfsIFG2tGytIqMfwOGRBiDw_oy6d-9wHrDxzyaA7rqtLa3x2Tc4Y/s1600/lluis-canadell-man-hei-lou-trienta-bogota-colombia.png" width="100%" /></a></div><imgcaption><center><em>Lluís Cañadell and Man Hei Lou, co-founders of Treinta<br/>Bogotá, Colombia</em></center></imgcaption></image><br/> <p>After meeting at university, Lluís and Man Hei reunited to launch <a href="https://play.google.com/store/apps/details?id=com.treintaapp&gl=co" target="_blank">Treinta</a>, an app inspired by Lluís’ experience with small businesses across Latin America. Named after the Spanish word for '30,' it helps microbusiness owners save at least 30 minutes a day by digitizing tasks like inventory, sales tracking, and cash flow management. With a recent expansion into the U.S. and upcoming AI tools, they are on track to reach their goal of 100,000 premium members by 2026.</p> <h4><span style="font-size: large ;"><b>Ying, Yong, Steve, and Oswald’s app Glints uses AI-powered recommendations to make hiring talent quick and easy.</b></span></h4> <image><div style="text-align: center;"><a href="http://g.co/play/weareplay" target="_blank"><img alt="Seah, Yong, Steve, and Oswald, co-founders of Glints Singapore, Singapore" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4D0rUy33U1AVhKL3G49NUcypTA9NJB0SxSerpktl57DfcZcktuHqLKMaR3JDWqBcq1P-i72Q_sRz9qK93wrSYrcHLHfpWsKq7T0GecEjiQwh-FxjUM6KpJdtC5cpMyEwj0KMkSnOfN1C_X9fT6AUg6iYEwJUSm92ovQpgDqw6sz37NSfLXrDqiPYVYeg/s1600/seah-yong-steve-oswaled-glints-singapore.png" width="100%" /></a></div><imgcaption><center><em>Seah, Yong, Steve, and Oswald, co-founders of Glints<br/>Singapore, Singapore</em></center></imgcaption></image><br/> <p>High school friends Ying, Yong, Steve, and Oswald bonded over a shared vision to use technology for good, which led them to create <a href="https://play.google.com/store/apps/details?id=com.glints.candidate&hl=en-US&gl=sg" target="_blank">Glints</a>. What began as an internship portal in Singapore evolved into a dynamic hiring app after they saw an opportunity to tackle underemployment among young people in Indonesia. The app streamlines the job search with AI-powered recommendations and direct chat features, creating new career opportunities and helping companies find top talent. Their goal is to expand into more cities and become Indonesia's leading career app.</p> <h4><span style="font-size: large ;"><b>Dave and Songe’s app SQUIRE helps barbers manage and grow their business with an all-in-one platform.</b></span></h4> <image><div style="text-align: center;"><a href="http://g.co/play/weareplay" target="_blank"><img alt="Dave and Songe, co-founders of SQUIRE New York, USA" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbQttR35qytBoD-5N_CdUMUDNUvVG6FVwaBE-SESgpiogmnbKHlHUnuCKNF4AmpU4LfHWWXhxc6pwgWAaR-Sqz9tGRPj3WR3mh-_MHi-VnXbMf6N1MtV8wx1xdCeLGxGvsYhzADinq9BL01PYaC_TiiQVdK7r65auhXSFnRTueLm-9n-h6gMl-1tMWoao/s1600/dave-songe-squire-nyc.png" width="100%" /></a></div><imgcaption><center><em>Dave and Songe, co-founders of SQUIRE<br/>New York, USA</em></center></imgcaption></image><br/> <p>Former lawyer Songe and finance expert Dave saw an opportunity to modernize the cash-reliant barbershop industry. With no prior experience, they took over a struggling Manhattan barbershop while developing <a href="https://play.google.com/store/apps/details?id=com.getsquire.flagship&hl=en-US&gl=us" target="_blank">SQUIRE</a>. The app, which initially focused on appointment scheduling and digital payments, has since evolved into a complete management platform with Point of Sale, inventory tracking, and analytics — helping barbers run their businesses more efficiently. Now, they're adding more customization options and plan to expand SQUIRE's capabilities to continue elevating the modern barbershop experience.</p><br /> <p>Discover other inspiring app and game founders featured in <a href="https://play.google.com/console/about/weareplay/" target="_blank">#WeArePlay</a>.</p> <div><br /><br /></div> <image><div style="text-align: center;"><img alt="Google Play logo" border="0" height="41" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxnvf5XzyebGljqgi8J7by9XsvaL5WWLNamSyTg4w_c0kPHjY1B1no1FQsdSfUHUwNw0UuYfXuo6i7K6VpdyV2-K8ms4VFmZA438ujm6qwtZMt5rJfMGymhQ_iCX2Z8h0MuJo7gXUQ4Hb-hjKYK1isibMZZxCyX_vo3kGoP5tieK2PI2ZhYdGh4gsqhwA/w200-h41/lockup_ic_Google_Play_H_260x53px_clr.png" width="200" /></div></image> #WeArePlay android developers app development developer stories Featured Google Play google play developers success stories Android Developers The latest for devs from Made by Google, updates to Gemini in Android Studio, plus a new Androidify: our summer episode of The Android Show http://android-developers.googleblog.com/2025/09/the-android-show-summer-edition.html Android Developers Blog urn:uuid:1989a0dc-6db0-d258-b039-c13540c6bd8d Wed, 03 Sep 2025 18:17:44 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJMX_7Zv1fLkW3owXCRM0kLzDEN_kiDo_uHBN29LCk4SNgCy3bey3c2TKV7oX7fxOQn2eecilvQMPeVhB235z6SbAZY3Lckwn5q7Yla-uk0lYzdiJ04Z5LwLvixJde-zRTyvciHBmTXrhqAHqLAp_fahvV-LIroy2u4Tb9qrQ4SJ5g6vYaAGfgTZFpz3M/s1600/androidify-promo.gif" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJMX_7Zv1fLkW3owXCRM0kLzDEN_kiDo_uHBN29LCk4SNgCy3bey3c2TKV7oX7fxOQn2eecilvQMPeVhB235z6SbAZY3Lckwn5q7Yla-uk0lYzdiJ04Z5LwLvixJde-zRTyvciHBmTXrhqAHqLAp_fahvV-LIroy2u4Tb9qrQ4SJ5g6vYaAGfgTZFpz3M/s1600/androidify-promo.gif" style="display: none;" /> <p><em>Posted by Matthew McCullough – VP of Product Management, Android Developer</em><p> <p>In this dynamic and complex ecosystem, our commitment is to your success. That's why in our <a href="https://www.youtube.com/live/zdpSePeuB5E" target="_blank">summer episode of The Android Show</a>, we're making it easier for you to build amazing apps by unpacking the latest tools and opportunities. In this episode, we’ll cover how you can get building for Wear OS 6, boost your productivity with the latest Gemini in Android Studio updates, create for the new Pixel 10 Pro Fold, and even have some fun with the new AI-powered Androidify. (And for Android users, we also just dropped a bunch of new feature updates today; <a href="https://blog.google/products/android/new-android-features-september-2025/" target="_blank">you can read more about those here</a>). Let’s dive in!</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="zdpSePeuB5E" width="100%" height="438" src="https://www.youtube.com/embed/zdpSePeuB5E"></iframe></div> <h2><span style="font-size: x-large;">Get the most out of Agent Mode in Android Studio with MCP</span></h2> <p>We're focused on making you more productive by integrating AI directly into your workflow. Gemini in Android Studio is at the center of this, helping teams like Entri who was able to <a href="https://android-developers.googleblog.com/2025/09/entri-cut-ui-development-time-gemini-android-studio.html" target="_blank">reduce UI development time by 40%</a>. You can now <a href="https://developer.android.com/studio/gemini/add-mcp-server" target="_blank">connect Model Context Protocol servers</a> to Android Studio, which expands the tools, knowledge, and capabilities of the AI Agent. We also just launched the <a href="https://android-developers.googleblog.com/2025/09/android-studio-narwhal-3-smarter-ai-backup-restore-compose-preview.html" target="_blank">Android Studio Narwhal 3 feature drop</a>, which brings more productivity boosters like Resizable Compose Preview and Play Policy Insights.</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="B-wzYo7pXaA" width="100%" height="438" src="https://www.youtube.com/embed/B-wzYo7pXaA"></iframe></div> <h2><span style="font-size: x-large;">Build for every screen with Compose Adaptive Layouts 1.2 beta</span></h2> <p>The new <a href="https://android-developers.googleblog.com/2025/08/build-your-app-to-meet-users-on-newest-pixel-devices.html" target="_blank">Pixel 10 Pro Fold</a> creates an incredible canvas for your app, and we're simplifying development so you can take full advantage of it. The <a href="https://developer.android.com/jetpack/androidx/releases/compose-material3-adaptive#1.2.0-beta01" target="_blank">Compose Adaptive Layouts 1.2</a> library, now officially in beta, makes it easier than ever to build for large screens and to embrace <a href="https://developer.android.com/adaptive-apps" target="_blank">adaptive app development</a>. This library is packed with tools to help you create sophisticated, adaptive UIs with less code. We're focused on helping you build intuitive and engaging experiences for every screen. This foundational library is packed with powerful tools to help you create sophisticated, adaptive UIs with less code. Build dynamic, multi-pane experiences using new layout strategies like <a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.Reflow" target="_blank">Reflow</a> and <a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/adaptive/layout/AdaptStrategy.Levitate" target="_blank">Levitate</a>, and use the new Large and Extra-Large <a href="https://developer.android.com/reference/androidx/window/core/layout/WindowSizeClass" target="_blank">window size classes</a> to make your app more intuitive and engaging than ever. Read more about these new tools <a href="https://android-developers.googleblog.com/2025/09/unfold-new-possibilities-with-compose-adaptive-layouts-1-2-beta.html" target="_blank">here</a>.</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="-9zVrVmnbO4" width="100%" height="438" src="https://www.youtube.com/embed/-9zVrVmnbO4"></iframe></div> <h2><span style="font-size: x-large;">Bring your most expressive apps to the wrist with Wear OS 6</span></h2> <p>We want to help you build amazing experiences for the wrist, and the new <a href="https://android-developers.googleblog.com/2025/08/build-your-app-to-meet-users-on-newest-pixel-devices.html" target="_blank">Pixel Watch 4</a> with <a href="https://developer.android.com/training/wearables/versions/6" target="_blank">Wear OS 6</a> provides a powerful new stage for your apps. We're giving you the tools to make your apps more expressive and personal, with <a href="https://android-developers.googleblog.com/2025/08/introducing-material-3-expressive-for-wear-os.html" target="_blank">Material 3 Expressive</a> to create stunning UIs. You can also engage users in new ways by building your own marketplace with the <a href="https://developer.android.com/training/wearables/watch-face-push" target="_blank">Watch Face Push API</a>. All of this is built on a more reliable foundation, with watches updating to Wear OS 6 seeing up to 10% better battery life and faster app launches.</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="plON4SsFXGo" width="100%" height="438" src="https://www.youtube.com/embed/plON4SsFXGo"></iframe></div> <h2><span style="font-size: x-large;">Androidify yourself, with a selfie + AI!</span></h2> <p>Our journey to reimagine Android with Gemini at its center extends to everything we do—including our mascot. That's why we rebuilt Androidify with AI at its core. With the new <a href="https://blog.google/feed/androidify/" target="_blank">Androidify</a>, available <a href="http://androidify.com" target="_blank">on the web</a> or on <a href="https://play.google.com/store/apps/details?id=com.android.developers.androidify" target="_blank">Google Play</a>, you can use a selfie or a prompt to create your own unique Android bot, powered by Gemini 2.5 Flash and Imagen. This is a fun example of how we're building better user experiences powered by AI... Try it out for yourself—we can’t wait to see what you build.</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="IL6M7L4reSQ" width="100%" height="438" src="https://www.youtube.com/embed/IL6M7L4reSQ"></iframe></div> <p>Under the hood, we’re using <a href="https://deepmind.google/models/gemini/image/" target="_blank">Gemini 2.5 Flash</a> to validate the prompt and <a href="https://deepmind.google/models/imagen/" target="_blank">Imagen</a> to create your Android bot. And on Friday’s this month, you’ll be able to animate your Android bot into an 8-second video; this feature is powered by <a href="https://deepmind.google/models/veo/" target="_blank">Veo</a> and available to a limited number of creations. You can read more about <a href="https://android-developers.googleblog.com/2025/08/androidify-ai-gemini-android-jetpack-compose-firebase-camerax.html" target="_blank">the technical building of the Androidify app here</a>. Try it out for yourself - we can’t wait to see your inner Android!</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="5r712vuHSEA" width="100%" height="438" src="https://www.youtube.com/embed/5r712vuHSEA"></iframe></div> <h2><span style="font-size: x-large;">Watch the Summer episode of The Android Show</span></h2> <p>Thank you for tuning into <a href="http://developer.android.com/events/show" target="_blank">this quarter's episode</a>. We're excited to continue building great things together, and this show is an important part of our conversation with you. We'd love to hear your ideas for our next episode, so please reach out on <a href="https://twitter.com/AndroidDev" target="_blank">X</a> or <a href="https://www.linkedin.com/showcase/androiddev/" target="_blank">LinkedIn</a>. A special thanks to my co-hosts, <a href="https://annycedavis.com/about-me" target="_blank">Annyce Davis</a> and <a href="https://www.linkedin.com/in/johnzoeller/" target="_blank">John Zoeller</a>, for helping us share the latest updates.</p> #TheAndroidShow Android Developers Entri cut UI development time by 40% with Gemini in Android Studio http://android-developers.googleblog.com/2025/09/entri-cut-ui-development-time-gemini-android-studio.html Android Developers Blog urn:uuid:ecad7c52-1e9c-4b73-c247-764f84e8e194 Wed, 03 Sep 2025 18:07:00 +0000 <meta name="twitter:image" content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6VvRFcalaraziI7OzD_qT9LfPhWSZR2wklIrAmmHZV0yWYWP7tGQCGnYjbANnRVu0Y5CYh34zmALz84hb6JsuRercuNVaLj5_4ZyTTAaz0N-GrHIBSrAEe3xrafrmUlyYZOuggAaqnuF6goSMUXOWm8Z__aRDP5hqvNtO9UXVQ8rAZGsYmWWCECnhyys/s1600/image2.png"> <img style="display:none" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6VvRFcalaraziI7OzD_qT9LfPhWSZR2wklIrAmmHZV0yWYWP7tGQCGnYjbANnRVu0Y5CYh34zmALz84hb6JsuRercuNVaLj5_4ZyTTAaz0N-GrHIBSrAEe3xrafrmUlyYZOuggAaqnuF6goSMUXOWm8Z__aRDP5hqvNtO9UXVQ8rAZGsYmWWCECnhyys/s1600/image2.png"> <em>Posted by Paris Hsu - Product Manager</em><br /> <image><div style="text-align: center;"><img style="100%" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6VvRFcalaraziI7OzD_qT9LfPhWSZR2wklIrAmmHZV0yWYWP7tGQCGnYjbANnRVu0Y5CYh34zmALz84hb6JsuRercuNVaLj5_4ZyTTAaz0N-GrHIBSrAEe3xrafrmUlyYZOuggAaqnuF6goSMUXOWm8Z__aRDP5hqvNtO9UXVQ8rAZGsYmWWCECnhyys/s1600/image2.png" data-original-width="100%" data-original-height="800" /></div></image> <p><a href="https://play.google.com/store/apps/details?id=me.entri.entrime&hl=en_US" target="_blank">Entri</a> delivers online learning experiences across local languages to over 15 million people in India, empowering them to secure jobs and advance in their careers. To seize on the latest advancements in AI, the Entri team explored a variety of tools to help their developers create better experiences for users.</p> <p>Their latest experiment? Adopting <a href="https://developer.android.com/gemini-in-android" target="_blank">Gemini in Android Studio</a> to enable them to move faster. Not only did Gemini speed up the teams’ work, trim tedious tasks, and foster ongoing learning, it streamlined collaboration between design and development and became an enjoyable, go-to resource that boosted the team’s productivity overall.</p> <div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="zpAy91KUkfg" width="100%" height="438" src="https://www.youtube.com/embed/zpAy91KUkfg"></iframe></div> <h2><span style="font-size: x-large;">Turning screenshots to code—fast</span></h2> <p>To tighten build time, developers at Entri used Gemini in Android Studio to generate Compose UI code directly from mockups. By uploading screenshots of Figma designs, Gemini produced the UI structures they needed to build entire screens in minutes. Gemini played a key role in revamping the platform’s Sign-Up flow, for example, <b>fast-tracking a process that typically takes hours to just under 45 minutes.</b></p> <p>By streamlining the creation of Compose UIs—often from just a screenshot and a few prompts—Gemini also made it significantly easier to quickly prototype new ideas and create MVPs. This allowed their team to test concepts and validate business needs without getting bogged down by repetitive UI tweaks up front.</p> <p>Entri developers found that the ability to generate code by attaching images in Gemini in Android Studio drastically reduced boilerplate work and improved alignment between design and engineering. Over time, this approach became a standard part of their prototyping process, with the team reporting 40% reduction in average UI build time per screen.</p> <image><div style="text-align: center;"><img alt="quote from Jackson E J, Technical Lead, Mobile @ Entri" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYprWGqqtBidDt8VWmqAuK5CCCeuZ8zM6C50RXw9mMAdIg194W91XZFTV4d9pwYPb52X1jjcbDYld3Jd_cETnHLHpWiVMDEwXf8MNWB5BOGZM4iy2ps-l8hw9lHbWhOwFm8xbkDlfYWRRErviOmhHn73mVUE_cF7u1EKnX1C_lcgm1Ivm2TVgib8MAaTM/s1600/image5.png" data-original-height="720" data-original-width="1280" /></div><imgcaption><center><em></em></center></imgcaption></image> <h2><span style="font-size: x-large;">Faster experimentation to create a better app experience</span></h2> <p>The Entri team has a strong culture of experimentation, and often has multiple user-facing experiments running at once. The team found Gemini in Android Studio particularly valuable in speeding up their experimentation processes. The tool quickly produced code for A/B testing, including UI changes and feature toggles, allowing the team to conduct experiments faster and iterate in more informed ways. It also made it faster for them to get user feedback and apply it. By simplifying the early build phase and allowing for sharper testing, Gemini boosted their speed and confidence, freeing them up to create more, test faster, and refine smarter.</p> <p>When it came to launching new AI learning features, Entri wanted to be first to market. With Gemini in Android Studio’s help, the Entri team rolled out their AI Teaching Assistant and Interview Coach to production much faster than they normally could. “What used to take weeks, now takes days,” said Jackson. “And what used to take hours, now takes minutes.”</p> <image><div style="text-align: center;"><img alt="quote from Sanjay Krishna, Head of Product @ Entri" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfxIHmkIVdm7neNfXa2LrrJvwxAXr3ZUQYOmWQM9uQp2UIcAOMOj9cl0Aob7AtWfzZ0mMwD5BSVonL-DfGsfgnmSN4OuqAtLcPVWc0KiSBgeQbqJExnFQPdUo_-cseWxVBSGcAKC-yrpBuQMHscnpk4xdbB825U5fU_0rg9fcHXtrVYzX8d8-4z9SRtjE/s1600/image3.png" data-original-height="720" data-original-width="1280" /></div></image> <h2><span style="font-size: x-large;">Tool integration reduces context switching</span></h2> <p>Gemini in Android Studio has changed the game for Entri’s developers, removing the need to break focus to switch between tools or hunt through external documentation. Now the team receives instant answers to common questions about Android APIs and Kotlin syntax without leaving the application.</p> <p>For debugging crashes, Gemini was especially useful when paired with <a href="https://developer.android.com/studio/debug/app-quality-insights" target="_blank">App Quality Insights in Android Studio</a>. By sharing stack traces directly with Gemini, developers received targeted suggestions for possible root causes and quick fixes directly in the IDE. This guidance allowed them to resolve crashes reported by Firebase and Google Play more efficiently and with less context switching. Gemini surfaced overlooked edge cases and offered alternative solutions to improve app stability, too.</p> <image><div style="text-align: center;"><img alt="quote from Jackson E J, Technical Lead, Mobile @ Entri" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7Xu5qnDZD31f8JeCwC3_eUz0rC-w758RnDDRu1qN1q3VjUJndR-fW_gWsssFCeTjUAB4zqMIUY3jWyTFHtwk9GjkrNM_vdAaFxVrqnoPSiDpam0o-imW77qxWanjqGqFZgSStcglnZQlXHPjkYhLj_kDDSu0CNb12ASC-uGkBWs8kMC14ze6-J4cH03I/s1600/image1.png" data-original-height="720" data-original-width="1280" /></div></image> <h2><span style="font-size: x-large;">Shifting focus from routine tasks to innovation</span></h2> <p>Entri developers also wanted to test the efficiency of Gemini in Android Studio on personal projects as well. They leaned on the tool to create a weather tracker, password manager, and POS billing system—all on top of their core project work at Entri. They enjoyed trying it out in their personal projects and experimenting with different use cases.</p> <p>By offloading repetitive tasks and expediting initial UI and screen generation, Gemini has allowed developers to focus more on innovation, exploration, and creativity—things that often get sidelined when dealing with routine coding work. Now the team is able to spend their time refining final products, designing smarter UX, and strategizing, making their day-to-day work more efficient, collaborative, and motivating.</p> <h2><span style="font-size: x-large;">Get started</span></h2> <p>Ramp up your development processes with <a href="https://developer.android.com/gemini-in-android" target="_blank">Gemini in Android Studio</a>.</p> case study Gemini Gemini in Android Studio UI Development Android Developers How Dashlane Brought Credential Manager to Wear OS with Only 78 New Lines of Code http://android-developers.googleblog.com/2025/09/dashlane-credential-security-wear-os-app.html Android Developers Blog urn:uuid:f977840b-9047-e9a2-3d23-89153359d077 Wed, 03 Sep 2025 18:06:00 +0000 <meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7PL6eMADSYrcItaaKQcBWyf_PhGAm1IKtZzHh-YFx-juqBqLcw31CrnxLzSjJJvoPeIfQypH-7FLITwQF-rda1KCZtbklHQRIh19RK17005Pzyj5sWuTnGGNRRZJ_DpUg5fVpOb9YCcuZR3b15_DVjcFABr7DR0v-7wwiYCVRBKmstuclRo2ZA2cnO2Y/s1600/image4.png" name="twitter:image"></meta> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7PL6eMADSYrcItaaKQcBWyf_PhGAm1IKtZzHh-YFx-juqBqLcw31CrnxLzSjJJvoPeIfQypH-7FLITwQF-rda1KCZtbklHQRIh19RK17005Pzyj5sWuTnGGNRRZJ_DpUg5fVpOb9YCcuZR3b15_DVjcFABr7DR0v-7wwiYCVRBKmstuclRo2ZA2cnO2Y/s1600/image4.png" style="display: none;" /> <em>Posted by John Zoeller - Developer Relations Engineer, Loyrn Hairston - Product Marketing Manager, and Jonathan Salamon - Dashlane Staff Software Engineer</em> <div><br /></div> <iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="lgo5hRLVUow" width="100%" height="398" src="https://www.youtube.com/embed/lgo5hRLVUow"></iframe><br/> <p><a href="https://play.google.com/store/apps/details?id=com.dashlane&hl=en_US" target="_blank">Dashlane</a> is a password management and provision tool that provides a secure way to manage user credentials, access control, and authentication across multiple systems and applications.</p> <p>Dashlane has over 18 million users and 20,000 businesses in 180 countries. It’s available on Android, Wear OS, iOS, macOS, Windows, and as a web app with an extension for Chrome, Firefox, Edge, and Safari.</p> <p>Recently, they expanded their offerings by creating a Wear OS app with a <a href="https://developer.android.com/identity/sign-in/credential-provider" target="_blank">Credential Provider</a> integration from the <a href="https://developer.android.com/reference/androidx/credentials/CredentialManager" target="_blank">Credential Manager API</a>, bringing passkeys to their clients and users on smartwatches.</p> <h2><span style="font-size: x-large;">Streamlining Authentication on Wear OS</span></h2> <p>Dashlane users have frequently requested a Wear OS solution that provides standalone authentication for their favorite apps. In the past, Wear OS lacked the key APIs necessary for this request, which kept Dashlane from being able to provide the functionality. In their words:</p> <blockquote><center><i>“Our biggest challenge was the lack of a standard credentials API on Wear OS, which meant that it was impossible to bring our core features to this platform.”</i></center></blockquote> <p>This has changed with the introduction of the new <a href="https://android-developers.googleblog.com/2025/08/the-evolution-of-wear-os-authentication.html" target="_blank">Credential Manager API on Wear OS</a>.</p> <p><a href="https://developer.android.com/training/wearables/apps/auth-wear#auth-methods" target="_blank">Credential Manager</a> provides a simplified, standardized user sign-in experience with built-in authentication options for <a href="https://fidoalliance.org/passkeys/" target="_blank">passkeys</a>, passwords, and federated identities like Sign in with Google. Conveniently, it can be implemented with minimal effort by reusing the same code as the mobile version.</p> <p>The Dashlane team was thrilled to learn about this, as it meant they could save a lot of time and effort: <em>“[The] CredentialManager API provides the same API on phones and Wear OS; you write the code only once to support multiple form factors.”</em></p> <image><div style="text-align: center;"><img alt="Credential selection Screenshot" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWOOLrEcC8tlzFXYqfYxC8c6AC8y5mIL0FzmFrMwsSaLELQXzJcqJb2tGYBd6cGHvTEipzDSmwrB8viUHfFq-XJT3oT8cqeWk9oBcZYQmgInJCv3Jarbgv2lnYeLXCmm32hcmwQIDUtSbum-YlHPc8LF8V49kPi9tU6ourM2YpMNkXR-tVUwl7fIV49QE/s1600/image5.png" width="50%" /></div><imgcaption><center><em>Selecting Dashlane-provided credentials is simple for users</em></center></imgcaption></image><br/> <p>After Dashlane had planned out their roadmap, they were able execute their vision for the new app with only a small engineering investment, reusing 92% of the Credential Manager code from their mobile app. And because the developers built Dashlane’s app UI with <a href="https://developer.android.com/training/wearables/compose?version=3" target="_blank">Jetpack Compose for Wear OS</a>, 60% of their UI code was also reused.</p> <image><div style="text-align: center;"><img alt="Quote from Sebastien Eggenspieler, Senior engineer at Dashlane" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiYQiILCL2ajv33zy47x7CA8VYrHflvzrDyDUcdNVOWmmcFR5yYSQnmxaeS9wHDMFEBCBwu30K4KVYm8O2-jQwHVlzT6O2Ox2pZwLPgGLX6eYHL21SCcE1fFQJLiSezZLvRgLVAz7wkD8wUV01SsMisIKhMvKyTJB9IJnKOiL2jGp9GWcWsFtQucPSoM8/s1600/image1.png" width="100%" /></div></image><br /> <h2><span style="font-size: x-large;">Developing for Wear OS</span></h2> <p>To provide credentials to other apps with Credential Manager, Dashlane needed to <a href="https://developer.android.com/identity/sign-in/credential-provider" target="_blank">implement the Credential Provider interface</a> on Wear OS. This proved to be a simple exercise in calling their existing mobile code, where Dashlane had already implemented behavior for credential querying and credential selection.</p> <p>For example, Dashlane was able to reuse their logic to handle client invocations of <a href="https://developer.android.com/reference/androidx/credentials/CredentialManager#getCredential(android.content.Context,androidx.credentials.PrepareGetCredentialResponse.PendingGetCredentialHandle)" target="_blank">CredentialManager.getCredential</a>. When a client invokes this, the Android framework propagates the client’s <span style="color: #0d904f ;font-family: courier;">getCredentialRequest</span> to Dashlane’s <a href="https://developer.android.com/reference/kotlin/androidx/credentials/provider/CredentialProviderService#onBeginGetCredentialRequest(androidx.credentials.provider.BeginGetCredentialRequest,android.os.CancellationSignal,android.os.OutcomeReceiver)" target="_blank">CredentialProviderService.onBeginGetCredentialRequest</a> implementation to retrieve the credentials specified in the request.</p> <p>Dashlane delegates the logic for <span style="color: #0d904f ;font-family: courier;">onBeginGetCredentialRequest</span> to their <a href="https://github.com/Dashlane/android-apps/blob/018f827f2a01b174ebdb721832e0c8463a02ed22/dashlane-project/modules/features/credentialmanager/src/main/java/com/dashlane/credentialmanager/CredentialManagerHandler.kt#L90" target="_blank">handleGetCredentials</a> function, below, which is shared between their mobile and Wear OS implementations.</p> <!--Kotlin--><div style="background: #f8f8f8; overflow:auto;width:auto;border:0;"><pre style="margin: 0; line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// When a Credential Manager client calls &#39;getCredential&#39;, the Android</span> <span style="color: #3D7B7B; font-style: italic">// framework invokes `onBeginGetCredentialRequest`. Dashlane</span> <span style="color: #3D7B7B; font-style: italic">// implemented this `handleGetCredentials` function to handle some of</span> <span style="color: #3D7B7B; font-style: italic">// the logic needed for `onBeginGetCredentialRequest`</span> <span style="color: #008000; font-weight: bold">override</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">fun</span><span style="color: #BBB"> </span><span style="color: #00F">handleGetCredentials</span>( <span style="color: #BBB"> </span>context:<span style="color: #BBB"> </span>Context, <span style="color: #BBB"> </span>request:<span style="color: #BBB"> </span>BeginGetCredentialRequest): List<span style="color: #666">&lt;</span>CredentialEntry<span style="color: #666">&gt;</span><span style="color: #BBB"> </span><span style="color: #666">=</span> <span style="color: #BBB"> </span>request.<span style="color: #687822">beginGetCredentialOptions</span>.<span style="color: #687822">flatMap</span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>option<span style="color: #BBB"> </span><span style="color: #666">-&gt;</span> <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">when</span><span style="color: #BBB"> </span>(option)<span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Handle passkey credential</span> <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">is</span><span style="color: #BBB"> </span>BeginGetPublicKeyCredentialOption<span style="color: #BBB"> </span><span style="color: #666">-&gt;</span><span style="color: #BBB"> </span>{ <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">passkeyRequestOptions</span><span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Gson().<span style="color: #687822">fromJson</span>( <span style="color: #BBB"> </span>option.<span style="color: #687822">requestJson</span>,<span style="color: #BBB"> </span>PasskeyRequestOptions<span style="color: #666">::</span>class.<span style="color: #687822">java</span>) <span style="color: #BBB"> </span>credentialLoader.<span style="color: #687822">loadPasskeyCredentials</span>( <span style="color: #BBB"> </span>passkeyRequestOptions.<span style="color: #687822">rpId</span>, <span style="color: #BBB"> </span>passkeyRequestOptions.<span style="color: #687822">allowCredentials</span><span style="color: #BBB"> </span><span style="color: #666">?:</span><span style="color: #BBB"> </span>listOf() <span style="color: #BBB"> </span>).<span style="color: #687822">map</span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>passkey<span style="color: #BBB"> </span><span style="color: #666">-&gt;</span> <span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">val</span><span style="color: #BBB"> </span><span style="color: #19177C">passkeyDisplayName</span><span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>getSuggestionTitle(passkey,<span style="color: #BBB"> </span>context) <span style="color: #BBB"> </span>PublicKeyCredentialEntry.<span style="color: #687822">Builder</span>( <span style="color: #BBB"> </span>context, <span style="color: #BBB"> </span>passkeyDisplayName, <span style="color: #BBB"> </span>pendingIntentForGet(context,<span style="color: #BBB"> </span>passkey.<span style="color: #687822">id</span>), <span style="color: #BBB"> </span>option <span style="color: #BBB"> </span>) <span style="color: #BBB"> </span>.<span style="color: #687822">setLastUsedTime</span>(passkey.<span style="color: #687822">locallyViewedDate</span>) <span style="color: #BBB"> </span>.<span style="color: #687822">setIcon</span>(buildMicroLogomarkIcon(context<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>context)) <span style="color: #BBB"> </span>.<span style="color: #687822">setDisplayName</span>(passkeyDisplayName) <span style="color: #BBB"> </span>.<span style="color: #687822">build</span>() <span style="color: #3D7B7B; font-style: italic">// Handle other credential types</span> </pre></div> <p>Reusing precise logic flows like this made it a breeze for Dashlane to implement their Wear OS app.</p> <p><em>“The Credential Manager API is unified across phones and Wear OS, which was a huge advantage. It meant <b>we only had to write our code once</b>.”</em></p> <h2><span style="font-size: x-large;">Impact and Improved Growth</span></h2> <p>The team is excited to be among the first credential providers on wearables: <em>“Being one of the first on Wear OS was a key differentiator for us. It reinforces our brand as an innovator, focusing on the user experience, better meeting and serving our users where they are.”</em></p> <p>As an early adopter of this new technology, Dashlanes Wear OS app has already shown early promise, as described by Dashlane software engineer, Sebastien Eggenspieler: <em>“In the first 3 months, our Wear OS app organically grew to represent 1% of our active device install base.”</em></p> <p>With their new experience launched, Wear OS apps can now rely on Dashlane as a trusted credential provider for their own Credential Manager integrations, using Dashlane to allow users to log in with a single tap; and users can view details about their credentials right from their wrist.</p> <image><div style="text-align: center;"><img alt="app homescreen screenshot" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwsCkFimgtmhOvlJDLHxrk9Lm3jieV4VXks_YgfW1RFtiE8zrdLLoZnbF7BEuwW7vM_adw15WnYd0ww87JQ9VDbSZjywaLe6g_86MoTW1sLFo7tFa1mixmI5J5AK6P-ZHklYPnNZpnPmZWFZHUo8bN8ijp7qsevrbil3_ocpFNyvHBdxbbahV9Y9GzdUM/s1600/image1.png" width="50%" /></div><imgcaption><center><em>Dashlane’s innovative design helps users manage their credentials</em></center></imgcaption></image><br/> <h2><span style="font-size: x-large;">Dashlane’s Recommendations to Wear OS Developers</span></h2> <p>With their implementation complete, the Dashlane team can offer some advice for other developers who are considering the Credential Manager API. Their message is clear: <em>“the future is passwordless… and passkeys are leading the way, [so] provide a passkey option.”</em></p> <p>As a true innovator in their field, and the preferred credential provider for so many users, we are thrilled to have Dashlane support Credential Manager. They truly inspired us with their commitment to providing Wear OS users with the best experience possible:</p> <p><em>“We hope that in the future every app developer will migrate their existing users to the Credential Manager API.”</em></p> <h2><span style="font-size: x-large;">Get Started with Credential Manager</span></h2> <p>With its elegant simplicity and built-in secure authentication methods, the Credential Manager API provides a simple, straightforward authentication experience for users that changes the game in Wear OS.</p> <p>Want to find out more about how Dashlane is driving the future of end-user authentication? Check out our <a href="http://youtube.com/watch?v=lgo5hRLVUow&feature=youtu.be" target="_blank">video blog with their team in Paris</a>, and read about how they found a <a href="http://youtube.com/watch?v=lgo5hRLVUow&feature=youtu.be" target="_blank">70% in sign-in conversion rates with passkeys</a>.</p> <p>To learn more about how you can implement Credential Manager, read our official <a href="https://developer.android.com/training/wearables/apps/auth-wear" target="_blank">developer</a> and <a href="https://developer.android.com/design/ui/wear/guides/m2-5/behaviors-and-patterns/sign-in" target="_blank">UX</a> guides, and be sure to check out our brand <a href="https://android-developers.googleblog.com/2025/08/the-evolution-of-wear-os-authentication.html" target="_blank">new blog post</a> and <a href="https://www.youtube.com/watch?v=SfkxK-rFeNM" target="_blank">video blog</a> as part of Wear OS Spotlight week!</p> <p>We’ve also expanded our existing <a href="https://github.com/android/identity-samples/tree/credman-compose/Shrine/" target="_blank">Credential Manager sample</a> to support Wear OS, to help guide you along the way, and if you'd like to provide credentials like Dashlane, you can use our <a href="https://github.com/android/identity-samples/tree/main/CredentialProvider/MyVault" target="_blank">Credential Provider sample</a>.</p> <p>Finally, explore how you can start developing additional experiences for Wear OS today with our <a href="https://developer.android.com/wear" target="_blank">documentation</a> and <a href="https://github.com/android/wear-os-samples" target="_blank">samples</a>.</p> credential manager Jetpack Compose passkeys Wear OS Wear OS 6 Android Developers Fresh Resources for Web Designers and Developers (August 2025) https://www.hongkiat.com/blog/designers-developers-monthly-08-2025/ hongkiat.com urn:uuid:eb86c3fd-da5a-4211-9f05-f8116c8e2df1 Sun, 31 Aug 2025 13:00:37 +0000 <p>We are back with our monthly roundup of fresh resources for web developers. This month, we have a collection of tools, libraries, and frameworks that can help you in your web development projects. This month’s list includes many tools focusing on AI-based development, automation, and productivity. As always, we encourage you to explore these resources&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-08-2025/">Fresh Resources for Web Designers and Developers (August 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>We are back with our monthly roundup of fresh resources for web developers.</p> <p>This month, we have a collection of tools, libraries, and frameworks that can help you in your web development projects. This month’s list includes many tools focusing on <a href="https://www.hongkiat.com/blog/integrating-ai-design-dev/">AI-based development</a>, automation, and productivity.</p> <p>As always, we encourage you to explore these resources and see how they can fit into your workflow. So without further ado, here is the full list:</p> <div class="ref-block ref-block--tax noLinks" id="ref-block-tax-74165-1"> <a href="https://www.hongkiat.com/blog/tag/fresh-resources-developers/" target="_blank" class="ref-block__link" title="Read More: Click Here for More Resources" rel="bookmark"><span class="screen-reader-text">Click Here for More Resources</span></a> <div class="ref-block__thumbnail img-thumb img-thumb--jumbo" data-img='{ "src" : "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" }'> <noscript> <style>.no-js #ref-block-tax-74165-1 .ref-block__thumbnail { background-image: url( "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" ); }</style> <p> </p></noscript> </div> <div class="ref-block__summary"> <h4 class="ref-title">Click Here for More Resources</h4> <div class="ref-description"> <p>Check out our complete collection of hand-picked tools for designers and developers.</p> </div></div> </div> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/authorizerdev/authorizer">Authorizer</a></h2> <p><strong>Authorizer.dev</strong> is an open-source tool that allows you to add login and user access control to your app without relying on third-party services. It supports email, social logins, magic links, and works with databases like PostgreSQL and MySQL. You can host it yourself, keep full control of user data, and integrate it easily with frontend apps using GraphQL or the JavaScript SDKs.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/authorizer.jpg" alt="Authorizer authentication system dashboard interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/sigoden/dufs">Dufs</a></h2> <p><strong>Dufs</strong> is a fast and easy-to-use file server written in Rust. It lets you share files through a web browser or the <a href="https://www.hongkiat.com/blog/tag/command-line/">command line</a>, with features like drag-and-drop uploads, folder downloads as zip, file search, partial downloads, HTTPS, authentication, and WebDAV support. It works on macOS, Linux, and Windows, and can be installed via <a rel="nofollow noopener" target="_blank" href="https://github.com/rust-lang/cargo">Cargo</a>, Docker, or prebuilt binaries.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/dufs.jpg" alt="Dufs file server web interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/offen/docker-volume-backup">Docker Volume Backup</a></h2> <p><strong>Docker Volume Backup</strong>, as the name implies, is a tool that can help you back up Docker volumes on a schedule. It supports saving backups to local folders or <a href="https://www.hongkiat.com/blog/best-free-cloud-storage-services/">cloud storage</a> like <a rel="nofollow noopener" target="_blank" href="https://aws.amazon.com/s3/">S3</a>, Dropbox, or SSH servers. It works with both named volumes and bind mounts, and is easy to add to your docker compose setup.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/docker-volume-backup.jpg" alt="Docker volume backup configuration interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/sergi0g/cup">Cup</a></h2> <p><strong>Cup</strong> is a fast, lightweight tool that helps you check for and manage Docker container image updates with ease. It supports many registries including <a rel="nofollow noopener" target="_blank" href="https://hub.docker.com/">Docker Hub</a>, <a rel="nofollow noopener" target="_blank" href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry">GitHub Container Registry</a>, and <a rel="nofollow noopener" target="_blank" href="https://quay.io">Quay</a>, and runs even on low-powered devices like a Raspberry Pi. A handy tool to keep your Docker images up-to-date.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/cup.jpg" alt="Cup Docker image update dashboard" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/vercel/v0-sdk">v0 SDK</a></h2> <p><strong>v0 SDK</strong> is a TypeScript library for working with <a rel="nofollow noopener" target="_blank" href="https://v0.dev">Vercel’s v0</a> Platform API. It supports code generation, <a href="https://www.hongkiat.com/blog/project-task-management-tools/">project management</a>, and deployments, with features like prompt-to-code, context injection, and seamless integration with frameworks like React and <a rel="nofollow noopener" target="_blank" href="https://nextjs.org">Next.js</a>. Super useful if you’re using Vercel’s platform to build and deploy applications.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/v0-sdk.jpg" alt="Vercel v0 SDK code example" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/superdesigndev/superdesign">Superdesign</a></h2> <p><strong>SuperDesign</strong> is an open-source AI design agent that runs in your IDE, like <a rel="nofollow noopener" target="_blank" href="https://code.visualstudio.com">VS Code</a> or <a rel="nofollow noopener" target="_blank" href="https://cursor.com">Cursor</a>, that allows you to generate UI mockups, wireframes, and components from text prompts all without leaving your <a href="https://www.hongkiat.com/blog/best-ai-powered-code-editors/">code editor</a>. A great tool for designers and developers who want to quickly prototype and iterate on UI designs.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/superdesign.jpg" alt="Superdesign AI UI generator interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/langwatch/scenario">Scenario</a></h2> <p><strong>Langwatch Scenario</strong> is a tool that helps you test AI agents by simulating real conversations with users. Instead of checking things by hand, you can set up full chat scenarios, define what should or shouldn’t happen, and run tests automatically. It works with any AI model and helps you catch mistakes before they reach users. A great way to ensure your AI agents are working as expected and providing a good user experience.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/scenario.jpg" alt="Langwatch Scenario testing dashboard view" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/director-run/director">Director</a></h2> <p><strong>Director</strong> is a free and open tool that makes it much easier to connect your <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">MCP servers</a> to AI tools like Claude, Cursor, or VSCode. It’s specifically designed to handle multiple <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">MCP servers</a>, so you don’t need to deal with complex JSON files. A useful tool for developers who want to streamline their workflow and connect their <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">MCP servers</a> to AI tools.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/director.jpg" alt="Director MCP server management interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/appdotbuild/agent">App.build</a></h2> <p><strong>App.build</strong> is an AI tool that helps you create full apps, from frontend to backend, including the database, with just a simple prompt.</p> <p>It supports modern stacks like tRPC applications with Bun and React, Laravel with <a rel="nofollow noopener" target="_blank" href="https://inertiajs.com">Inertia</a>, and Python apps. It handles validation, testing, deployment, and even writes models, controllers, and UI code for you.</p> <p>A great way to quickly prototype and build applications without having to write all the code yourself.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/app-build.jpg" alt="App.build AI code generation platform" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/iannuttall/mcp-boilerplate">MCP Boilerplate</a></h2> <p><strong>MCP Boilerplate</strong> is a free, open-source starter kit for building remote <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">MCP servers</a> on Cloudflare. It includes built-in Google/GitHub login, Stripe integration for selling paid tools, and uses <a rel="nofollow noopener" target="_blank" href="https://developers.cloudflare.com/kv/">Cloudflare KV</a> for storage. A great way to quickly set up a new MCP server without having to start from scratch, and especially useful if you’re looking to monetize your MCP server with paid tools.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/mcp-boilerplate.jpg" alt="MCP Boilerplate server setup interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/rustfs/rustfs">RustFS</a></h2> <p><strong>RustFS</strong> is a fast, distributed object storage system written in Rust, designed for modern cloud and big data needs. It supports S3-compatible storage, strong access control, and is capable of handling large-scale data storage and retrieval efficiently. A great choice if you’re looking for a robust and high-performance storage solution for your applications.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/rustfs.jpg" alt="RustFS storage system architecture diagram" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/crumbyte/noxdir">Noxdir</a></h2> <p><strong>NoxDir</strong> is a fast, cross-platform terminal tool that can help you explore and manage disk space on Windows, macOS, and Linux. It shows real-time disk usage such as the used, free, total, and percentage in an interactive, keyboard-driven interface. A great tool if you need to quickly analyze disk space usage and manage files efficiently.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/noxdir.jpg" alt="Noxdir disk space analyzer interface" width="1000" height="510"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/lirantal/npq">NPQ</a></h2> <p><strong>NPQ</strong> is a command-line tool that checks NPM packages for security issues before you install them. It looks for known vulnerabilities, suspicious install scripts, missing metadata, deprecated or risky packages, and signs of typosquatting. This tool helps you stay safe when adding new dependencies.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/npq.jpg" alt="NPQ package security checker interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/charmbracelet/crush">Crush</a></h2> <p><strong>Crush</strong> is a stylish, open-source AI coding agent that runs in your terminal and connects your tools, code, and workflows to LLMs like OpenAI and Claude.</p> <p>It supports <a rel="nofollow noopener" target="_blank" href="https://learn.microsoft.com/en-us/visualstudio/extensibility/language-server-protocol">Language Server Protocol (LSP)</a>, session management, and extensions via MCP, and works on macOS, Linux, Windows, BSDs, and more, with easy installation across platforms.</p> <p>A great tool if you want to enhance their coding experience with AI-powered features right in your terminal.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/crush.jpg" alt="Crush AI coding terminal interface" width="1000" height="562"> </figure> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/syntatis/version-cli-php">Version CLI</a></h2> <p><strong>Version CLI</strong> is a simple PHP tool for the <a href="https://www.hongkiat.com/blog/tag/command-line/">command line</a> that allows you to check, compare, and manage <a rel="nofollow noopener" target="_blank" href="https://semver.org">Semantic Versioning</a> strings. A useful tool if you need to, for example, bump version, check if a version is valid, and compare versions easily.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/version-cli.jpg" alt="Version CLI semver tool demo" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/peter-evans/create-pull-request">Create Pull Request</a></h2> <p><strong>Create Pull Request</strong> is a popular GitHub Action that helps you automatically make pull requests when files are changed during a workflow.</p> <p>It can create or update a branch, commit the changes, and open a pull request to the main branch. You can customize things like the commit message, pull request title, labels, and more.</p> <p>It’s useful for automating tasks like code formatting, syncing files, or updating data on a schedule.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/create-pull-requests.jpg" alt="GitHub Action pull request workflow" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/MightyMoud/sidekick">Sidekick</a></h2> <p><strong>Sidekick</strong> is a tool designed to make deploying and managing apps on your own VPS easier. With just one command, it sets up Docker, <a rel="nofollow noopener" target="_blank" href="https://traefik.io">Traefik</a>, SSL, and secrets management. You can deploy any app using a Dockerfile, zero downtime, and connect your own domain. A great choice if you want to self-host your applications without the hassle of managing all the infrastructure yourself.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/sidekick.jpg" alt="Sidekick VPS deployment dashboard interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/remeda/remeda">Remeda</a></h2> <p><strong>Remeda</strong> is a modern utility library for JavaScript and TypeScript, built entirely in TypeScript for better type safety and IDE support. It offers both data-first and data-last functional styles, and supports lazy evaluation for efficient data processing. A great choice if you’re looking for a lightweight and type-safe utility library to use in your JavaScript or TypeScript projects.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/remeda.jpg" alt="Remeda TypeScript utility library demo" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/louislam/dockge">Dockge</a></h2> <p><strong>Dockge</strong> is a self-hosted Docker stack manager focused on docker-compose.yaml files. Instead of managing individual containers, it allows you manage entire stacks with a clean and reactive web UI. Features include progress display, terminal access, and full directory-based stack management. A simpler alternative to tools like <a rel="nofollow noopener" target="_blank" href="https://www.portainer.io/">Portainer</a>.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/dockge.jpg" alt="Dockge Docker stack management UI" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/nanostores/nanostores">Nanostores</a></h2> <p><strong>Nanostores</strong> is a small and fast state management library for JavaScript. It works with any framework like <a rel="nofollow noopener" target="_blank" href="https://react.dev">React</a>, <a rel="nofollow noopener" target="_blank" href="https://vuejs.org">Vue</a>, or <a rel="nofollow noopener" target="_blank" href="https://svelte.dev">Svelte</a>, and is just under 1 KB.</p> <p>It supports reactive state, TypeScript, and even has built-in tools for saving state to <strong>localStorage</strong>.</p> <p>A simple and efficient way to manage state in your web applications without the overhead of larger libraries.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-08-2025/nanostores.jpg" alt="Nanostores state management library demo" width="1000" height="600"> </figure><p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-08-2025/">Fresh Resources for Web Designers and Developers (August 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Web Design Tools for Designers & Developers Hongkiat Lim Fresh Resources for Web Designers and Developers (July 2025) https://www.hongkiat.com/blog/designers-developers-monthly-07-2025/ hongkiat.com urn:uuid:82774991-e027-98d7-b1a3-72ee82d6021f Thu, 31 Jul 2025 15:00:38 +0000 <p>As always, we’re keeping an eye on the latest tools making life easier for our fellow developers. In this post, we’ve picked some handy open-source tools made for developers like you, whether you’re working with AI, PHP, JavaScript, TypeScript, or Node.js. These tools are simple to try, fun to explore, and can make your coding&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-07-2025/">Fresh Resources for Web Designers and Developers (July 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>As always, we’re keeping an eye on the latest tools making life easier for our fellow developers. In this post, we’ve picked some handy open-source tools made for developers like you, whether you’re working with AI, PHP, JavaScript, TypeScript, or Node.js.</p> <p>These tools are simple to try, fun to explore, and can make your coding <a href="https://www.hongkiat.com/blog/basic-programming-principals/">life a lot easier</a>.</p> <p>Without further ado, let’s explore the full list.</p> <div class="ref-block ref-block--tax noLinks" id="ref-block-tax-74163-1"> <a href="https://www.hongkiat.com/blog/tag/fresh-resources-developers/" target="_blank" class="ref-block__link" title="Read More: Click Here for More Resources" rel="bookmark"><span class="screen-reader-text">Click Here for More Resources</span></a> <div class="ref-block__thumbnail img-thumb img-thumb--jumbo" data-img='{ "src" : "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" }'> <noscript> <style>.no-js #ref-block-tax-74163-1 .ref-block__thumbnail { background-image: url( "https://assets.hongkiat.com/uploads/thumbs/related/tag-fresh-resources-developers.jpg" ); }</style> <p> </p></noscript> </div> <div class="ref-block__summary"> <h4 class="ref-title">Click Here for More Resources</h4> <div class="ref-description"> <p>Check out our complete collection of hand-picked tools for designers and developers.</p> </div></div> </div> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://opencode.ai">OpenCodeAI</a></h2> <p><strong>OpenCodeAI</strong> is a terminal-based <a href="https://www.hongkiat.com/blog/create-chatbot-with-openai/">AI coding assistant</a> that works with over <strong>75 AI models</strong>. It can understand your code through Language Server Protocol (LSP), helps with refactoring and suggestions, and runs commands directly in your terminal. It’s fast, customizable, and designed to fit naturally into your coding workflow.</p> <figure> <img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/opencodeai.jpg" alt="OpenCodeAI terminal-based coding assistant interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://models.dev">Models.dev</a></h2> <p><strong>Models.dev</strong> is an open-source, community-driven directory of AI models that helps you compare specs, features, and pricing across providers like OpenAI, Anthropic, Amazon, and Google. It lists key details like token limits, context size, and costs which makes it a handy resource for developers, researchers, and teams choosing the right model for their needs.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/models.jpg" alt="Models.dev AI model comparison dashboard" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/php-mcp/server">PHP MCP</a></h2> <p><strong>PHP MCP Server</strong> is a modern PHP SDK for building MCP servers to allow AI tools like ChatGPT to interact with your PHP app. It uses PHP 8 Attributes, supports multiple transports such as HTTP, SSE, stdio, and runs efficiently with ReactPHP. Designed for PHP 8.1+, it’s fast, flexible, and production-ready.</p> <figure> <img decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/php-mcp.jpg" alt="PHP MCP Server code implementation example" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/kyantech/Palmr">Palmr</a></h2> <p><strong>Palmr</strong> is a secure, open-source <a href="https://www.hongkiat.com/blog/desktop-file-image-sharing-tools-best-of/">file-sharing app</a> that allows you to upload and share files with password protection, custom links, and access control. It has no tracking, no limits, and built with modern tech and actively developed. A perfect solution for those who want to share files privately and securely.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/palmr.jpg" alt="Palmr secure file sharing interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/pinojs/pino">Pino</a></h2> <p><strong>Pino</strong> is a fast and lightweight logging library for Node.js that outputs structured JSON logs. It’s built for performance and is great for production use, making logs easy to parse and integrate with monitoring tools.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/pino.jpg" alt="Pino Node.js logging library demo" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://code.visualstudio.com/mcp">VSCode MCP</a></h2> <p>This page is a hub for discovering Model Context Protocol (MCP) servers you can use with Visual Studio Code. These MCP allows <a href="https://www.hongkiat.com/blog/best-ai-tools-browser-automation/">AI agents in VS Code</a> connect to external tools like GitHub, Figma, Playwright, and Sentry as well as enabling actions such as testing apps, fetching data, or editing files. It’s a great resource for developers looking to enhance their coding experience with AI.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/vscode-mcp.jpg" alt="VSCode MCP integration features overview" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://doppar.com">Doppar</a></h2> <p><strong>Doppar</strong> is a fast, modern <a href="https://www.hongkiat.com/blog/best-php-frameworks/">PHP framework</a> inspired by Laravel, focused on simplicity and performance. It offers routing, ORM, caching, and other essentials, and supports PHP 8.3. A great alternative framework for building clean, scalable web apps.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/doppar.jpg" alt="Doppar PHP framework features showcase" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/openai/openai-cookbook">OpenAI Cookbook</a></h2> <p><strong>OpenAI Cookbook</strong> is an official GitHub repo from OpenAI that provides practical examples and guides for using the OpenAI API. A helpful resource for developers looking to integrate and make the most of OpenAI models with ready-to-use code and tutorials.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/openai-cookbook.jpg" alt="OpenAI Cookbook code examples preview" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/balzack/databag">Databag</a></h2> <p><strong>Databag</strong> is a fast, lightweight, self-hosted messenger built for privacy and low-resource environments like the Raspberry Pi Zero. It offers a responsive UI, unlimited user accounts per node, and is open-source with active development on GitHub. An ideal alternative platform for personal or small-group messaging with full control over your data.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/databag.jpg" alt="Databag messenger app user interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/alexjustesen/speedtest-tracker">Speedtest Tracker</a></h2> <p><strong>Speedtest Tracker</strong> is a self-hosted app that <a href="https://www.hongkiat.com/blog/monitor-internet-usage/">monitors your internet speed</a> and uptime using Ookla’s Speedtest CLI. It runs in Docker, logs download/upload speeds, ping, and packet loss, and shows trends with graphs.</p> <p>You can set alerts via email, Discord, or other channels when performance drops. A great tool for keeping tabs on your internet connection’s health and performance.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/speedtest-tracker.jpg" alt="Speedtest Tracker dashboard with graphs" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://www.youtube.com/watch?v=PsXar3GD8YM">What’s new in DevTools 136-138</a></h2> <p><strong>“What’s new in DevTools 136-138”</strong> by Chrome for Developers highlights the latest DevTools updates in Chrome. New features include faster workspace setup and better CSS debugging like support for <code>corner-shape</code>, <code>calc()</code>, and <code>var()</code>.</p> <p>The update brings improved AI assistance that can now keep styling changes, use screenshots in prompts, and help explain performance traces. Chrome 138 also adds helpful visual indicators for DOM issues right in the Elements panel.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/devtools-136-138.jpg" alt="Chrome DevTools new features showcase" width="1000" height="562"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a></h2> <p><strong>Gemini CLI</strong> is a command-line tool from Google that brings Gemini AI models right into your terminal. It can help you speed up your work by automating tasks system, generating codes as well as content using plain language, or simply chatting with the AI.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/gemini-cli.jpg" alt="Google Gemini CLI tool demo" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/inovector/mixpost">Mixpost</a></h2> <p><strong>Mixpost</strong> is a self-hosted, open-source tool for scheduling and managing social media posts across platforms like Facebook, X, Instagram, and TikTok. It supports team collaboration, post customization, video content. I think it’s a great solution for businesses and individuals looking to streamline their social media presence while keeping everything in-house.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/mixpost.jpg" alt="Mixpost social media management dashboard" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/Effect-TS/effect">Effect</a></h2> <p><strong>Effect</strong> is a TypeScript library for building reliable, high-performance apps with strong type safety. It handles async tasks, errors, and side effects using a functional approach, with built-in support for tracing, metrics, HTTP, SQL, and more. A powerful tool for developers looking to create complex applications.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/effect.jpg" alt="Effect TypeScript library code example" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://opensaas.sh/">OpenSaas</a></h2> <p><strong>OpenSaaS</strong> is a free, open-source starter template for building full-featured SaaS apps fast. Built with React, Node.js, Prisma and includes the essentials like auth, payments, and analytics out of the box. A great stack for developers who want to launch modern, scalable SaaS products quickly without starting from scratch.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/opensaas.jpg" alt="OpenSaaS starter template features preview" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/chatdoc-com/OCRFlux">OCRFlux</a></h2> <p><strong>OCRFlux</strong> is a fast, open-source tool that converts complex PDFs and images into clean <strong>Markdown</strong>. It handles multi-column layouts, tables, and equations with high accuracy, supports English and Chinese, and runs locally on consumer GPUs or via Docker. A great tool for processing reports, receipts, and structured documents.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/ocrflux.jpg" alt="OCRFlux PDF to Markdown conversion" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/pqina/filepond">Filepond</a></h2> <p><strong>FilePond</strong> is a flexible JavaScript library for building sleek, accessible file upload components. It supports drag-and-drop, image previews, async uploads, and handles files from various sources. It’s easy to customize and integrate into any web app with adapters for React, Vue, Angular, and more.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/filepond.jpg" alt="FilePond file upload component demo" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/HichemTab-tech/pomposer">Pomposer</a></h2> <p><strong>Pomposer</strong> is an experimental tool that acts as a smarter wrapper around Composer. Inspired by PNPM, it aims to avoid repeated downloads of the same dependencies, speeding up installations and saving disk space. While it’s still in beta development, Pomposer shows promise for streamlining PHP dependency workflows.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/pomposer.jpg" alt="Pomposer PHP dependency manager interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://redis.io/insight/">Redis Insight</a></h2> <p><strong>Redis Insight</strong> is a free, official GUI for Redis that helps you explore, debug, and optimize your databases. It supports all Redis deployments and offers features like visual data browsing, an advanced CLI with auto-complete, AI-powered query assistance, performance insights, and real-time stream monitoring. It’s a powerful tool for both new and experienced Redis users.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/redis-insights.jpg" alt="Redis Insight database management interface" width="1000" height="600"> </figure> <hr> <h2><a rel="nofollow noopener" target="_blank" href="https://github.com/dockur/macos">Docker macOS</a></h2> <p>This project allows you to run macOS inside a Docker container using KVM virtualization. You can access the macOS instance via a web browser, customize CPU, RAM, and disk settings, and even pass through USB devices.</p> <p>It supports macOS versions 11 to 15 and can be run via Docker Compose, CLI, or Kubernetes. It’s an ideal tool for testing macOS apps on non-Apple hardware like Linux or Windows.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/designers-developers-monthly-07-2025/docker-macos.jpg" alt="Docker macOS virtual machine interface" width="1000" height="600"> </figure><p>The post <a href="https://www.hongkiat.com/blog/designers-developers-monthly-07-2025/">Fresh Resources for Web Designers and Developers (July 2025)</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Web Design Tools for Designers & Developers Thoriq Firdaus Google Graveyard Revisited: Shutdowns Since 2015 https://www.hongkiat.com/blog/google-graveyard-2015/ hongkiat.com urn:uuid:e0fa050c-ccd6-2c5c-856b-af70a4d80b62 Tue, 29 Jul 2025 10:00:55 +0000 <p>We know them for Search, Gmail, Android… the giants. But Google’s also famous for something else: trying out tons of ideas. Seriously, hundreds of them! This ‘throw it at the wall and see what sticks’ approach means innovation, but it also means… well, a lot doesn’t stick. Over the years, Google has become notorious for&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/google-graveyard-2015/">Google Graveyard Revisited: Shutdowns Since 2015</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>We know them for Search, Gmail, Android… the giants. But Google’s also famous for something else: trying out <em>tons</em> of ideas. Seriously, hundreds of them! This ‘throw it at the wall and see what sticks’ approach means innovation, but it also means… well, a lot doesn’t stick.</p> <p>Over the years, Google has become notorious for shutting down services, sometimes leaving us users scrambling for alternatives, other times making us go, ‘Wait, that was a thing?’. This post is a trip down memory lane, revisiting the Google ‘graveyard’ starting from 2015.</p> <div class="ref-block ref-block--post" id="ref-post-1"> <a href="https://www.hongkiat.com/blog/google-services-tools/" class="ref-block__link" title="Read More: 100+ Must-Know Google Services and Tools to Boost Your Productivity" rel="bookmark"><span class="screen-reader-text">100+ Must-Know Google Services and Tools to Boost Your Productivity</span></a> <div class="ref-block__thumbnail img-thumb img-thumb--jumbo" data-img='{ "src" : "https://assets.hongkiat.com/uploads/thumbs/250x160/google-services-tools.jpg" }'> <noscript> <style>.no-js #ref-block-post-25395 .ref-block__thumbnail { background-image: url("https://assets.hongkiat.com/uploads/thumbs/250x160/google-services-tools.jpg"); }</style> </noscript> </div> <div class="ref-block__summary"> <h4 class="ref-title">100+ Must-Know Google Services and Tools to Boost Your Productivity</h4> <p class="ref-description"> Mention Google products and you'd probably think of Google Search, Gmail, Chrome, YouTube or Android but there are... <span>Read more</span></p> </div> </div> <hr> <h2>Google TV</h2> <p><em>(Discontinued on: Jan 6, 2015)</em></p> <p>Announced in May of 2010, <a rel="nofollow noopener" target="_blank" href="https://googlepress.blogspot.com/2010/05/industry-leaders-announce-open-platform.html">Google Video</a> seemed like a smart idea for giving viewers an enhanced TV experience with an interactive overlay over online video sites.</p> <p>The problem, despite various Android updates, was that it was <strong>more about computerizing your television</strong> than offering an awesome viewing experience.</p> <p>With the launch of Android Lollipop and Android TV, the company planned to phase Google TV out and switch to Android TV.</p> <p>“<em>By extending Android to the TV form factor, living room developers get the benefits, features and the same APIs available for Android phone and tablet development,</em>” said the Google and Android TV teams in a shared Google+ post.</p> <p>Nonetheless, only some Google TV devices will be updated to Android TV since <strong>certain devices can’t work with the new system</strong>.</p> <hr> <h2>Google Code</h2> <p><em>(Discontinued on: Jan 25, 2015)</em></p> <figure><img fetchpriority="high" decoding="async" height="245" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/google-code.jpg" width="546" alt="Google Code project hosting platform"></figure> <p>Announced in March 2005, <a rel="nofollow noopener" target="_blank" href="https://googlecode.blogspot.com/2005/03/welcome-to-codegooglecom.html">Google Code</a> is a service (which started a year after, in 2006) to host scalable, open source projects reliably.</p> <p>Google Code went <a rel="nofollow noopener" target="_blank" href="https://code.google.com/p/support/wiki/ReadOnlyTransition">read-only</a> in August 2015, and will <strong>shut down on January 25 2016 for version control clients</strong>. Public project data will get archived and be accessible via <a rel="nofollow noopener" target="_blank" href="https://code.google.com/archive/">Google Code Archive</a> for years to come.</p> <p>“<em>…we’ve seen a wide variety of better project hosting services such as GitHub and Bitbucket bloom. Many projects moved away from Google Code to those. … After profiling non-abusive activity on Google Code, it has become clear to us that <strong>the service simply isn’t needed anymore</strong></em>“, stated Chris DiBona (Director of Open Source) on Google’s Open Source <a rel="nofollow noopener" target="_blank" href="https://opensource.googleblog.com/2015/03/farewell-to-google-code.html">Blog</a> on March 12, 2015.</p> <hr> <h2>Google Talk</h2> <p><em>(Discontinued on: Feb 23, 2015)</em></p> <figure><img decoding="async" height="337" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/google-talk.jpg" width="700" alt="Google Talk chat interface"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://googleblog.blogspot.in/2005/08/google-gets-to-talking.html">Google Talk app for Windows</a> was officially launched on August 24, 2005 – “<em>a small program that lets you <strong>call and IM other Google Talk friends</strong> over the Internet for free.</em>“</p> <p>It was based on the XMPP protocol, and so various XMPP clients such as GAIM, Trillian, etc. were supported.</p> <p>Mayur Kamat, Product Manager at Google Voice and Hangouts, posted on February 14, 2015 that “… <em>Google Talk app for Windows will be <a rel="nofollow noopener" target="_blank" href="https://support.google.com/talk/?p=deprecated">deprecated</a> on February 23, 2015. This will allow us to focus on bringing you the most robust and expressive communications experience with Google Hangouts.</em>“</p> <hr> <h2>ClientLogin protocol</h2> <p><em>(Discontinued on: Apr 20, 2015)</em></p> <p>A password-only authentication protocol, ClientLogin, offered API for <strong>third-party applications to access one’s Google account</strong> data through validation of the account’s username and password.</p> <p>It was widely used by various apps and websites for getting authorized, but this API was less secure then <a href="https://www.hongkiat.com/blog/oauth-connect/">OAuth 2.0</a>.</p> <p>Officially <a rel="nofollow noopener" target="_blank" href="https://developers.googleblog.com/2012/04/changes-to-deprecation-policies-and-api.html">deprecated</a> since April 20, 2012, Google finally shut ClientLogin API down 3 years later on April 20, 2015.</p> <p>“<em>Password-only authentication has several well known shortcomings </em><em>and we are actively working to move away from it,</em>” wrote Ryan Troll (Technical Lead, Identity and Authentication) on the Google Developers <a rel="nofollow noopener" target="_blank" href="https://developers.googleblog.com/2015/02/reminder-clientlogin-shutdown-scheduled.html">blog</a> as a reason for its shutdown.</p> <hr> <h2>Google Helpouts</h2> <p><em>(Discontinued on: Apr 20, 2015)</em></p> <figure><img decoding="async" height="290" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/google-helpouts.jpg" width="705" alt="Google Helpouts video tutorial platform"></figure> <p>The online collaboration and tutorial service, <a rel="nofollow noopener" target="_blank" href="https://blog.google/products/google-plus/introducing-helpouts-help-when-you-need/">Google Helpouts</a>, was launched in November 2013.</p> <p>A kind of freelance market, its main objective was to help people find <strong>real-time assistance through live, streaming videos</strong> with the aim of bringing together solution experts and learners or help seekers.</p> <p>It lets users talk face-to-face online and avail expert collaboration to sort out problems.</p> <p>Although considered helpful for masses, yet Google <a rel="nofollow noopener" target="_blank" href="https://support.google.com/helpouts/?visit_id=638011807091009794-4205890262&rd=2">shut</a> Helpouts down on April 20, 2015.</p> <p><a rel="nofollow noopener" target="_blank" href="https://www.forbes.com/sites/amitchowdhry/2015/02/16/google-helpouts-is-shutting-down-on-april-20th/">Slow growth</a> was given as the reason behind its termination: “<em>… unfortunately, it hasn’t grown at the pace we had expected. Sadly, we’ve made the tough decision to shut down the product.</em>“</p> <hr> <h2>Google+ Photos</h2> <p><em>(Discontinued on: Aug 1, 2015)</em></p> <p>A photo hosting and management solution integrated in Google+, Google+ Photos lets you create, edit, and manage your own private albums online.</p> <p>It also had cool features like Stories, which would automatically repackage your pictures into a fun timeline or scrapbook.</p> <p>Google+ announced to start shutting Google+ Photos down beginning<strong> August 1, 2015</strong>, beginning with the Android version of the app, and then the Web and iOS versions.</p> <p>To clarify few doubts, <strong>Google+ still supports photo and video sharing</strong>.</p> <p>As for why they folded on it, Anil Sabarwal (Lead Product Manager at Google Photos) said, “<em>… it is confusing to users why we have two offerings that virtually do the same thing, and it means our team needs to divide its focus rather than working on building a single, great user experience.</em>“</p> <hr> <h2>PageSpeed Service</h2> <p><em>(Discontinued on: Aug 3, 2015)</em></p> <figure><img loading="lazy" decoding="async" height="213" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/google-page-speed-service.jpg" width="700" alt="Google PageSpeed performance dashboard"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://webmasters.googleblog.com/2011/07/page-speed-service-web-performance.html">Launched</a> on July 28, 2011, Page Speed was an online service, which automatically sped up web page loading and gave <strong>25% to 60% speed improvements </strong>on several websites.</p> <p>It was a free CDN service that fetches content from the site’s servers, applies web performance best practices to the pages, and serves them to the users from Google’s worldwide servers.</p> <p>Google announced that the PageSpeed service will <a rel="nofollow noopener" target="_blank" href="https://developers.google.com/speedservice/Deprecation">cease</a> on August 3, 2015.</p> <hr> <h2>Google Catalogs</h2> <p><em>(Discontinued on: Aug 4, 2015)</em></p> <p>Launched on August 16, 2011, <a rel="nofollow noopener" target="_blank" href="https://googleblog.blogspot.in/2011/08/shop-your-favorite-catalogs-with-google.html">Google Catalogs</a> app, originally available on Android tablets, offered people the chance to discover trending products from digital catalogs.</p> <p>Catalogs lets you <strong>access and share information about products</strong> and their availability and create collages using the favorite catalogs.</p> <p>Having alerted registered Catalogs users through an email, Google announced that it was going to break off support and services for Catalogs, and the company would <strong>trash the Catalogs app on August 4, 2015</strong>.</p> <p>The Google Catalogs team didn’t provide any reason for its shutdown with the alert.</p> <hr> <h2>Autocomplete API</h2> <p><em>(Discontinued on: Aug 10, 2015)</em></p> <p>The popular Autocomplete API was a text prediction service that used integrated resources to predict a query before a user finished typing search keywords.</p> <p>Before the unauthorized access to non-published API was <strong>shut down on August 10, 2015</strong>, this was a widely available unofficial, non-published tool, which could be incorporated into applications without any restrictions, working independently of Google Search.</p> <p>Google blocked unauthorized access and various online tools (for example, keyword tools) using this service need to re-invent themselves.</p> <p>Peter Chiu (on behalf of Autocomplete team) wrote on Google’s Webmaster Central <a rel="nofollow noopener" target="_blank" href="https://webmasters.googleblog.com/2015/07/update-on-autocomplete-api.html">blog</a>, <em>“… uses for an autocomplete data … outside of the context of a web search don’t provide a meaningful user benefit. We want to ensure that <strong>users experience autocomplete as it was designed to be used</strong> – as a service closely tied to Search.</em>“</p> <hr> <h2>Google Moderator</h2> <p><em>(Discontinued on: Aug 15, 2015)</em></p> <p>On September 24, 2008, <a rel="nofollow noopener" target="_blank" href="https://googleappengine.blogspot.com/2008/09/introducing-google-moderator-on-app.html">Google Moderator</a> was released for public use by its developer Taliver Heath, a Platform Engineer at Google.</p> <p>The Moderator tool allowed crowd-sourcing questions within limited time using Google’s groups by <strong>using consensus to elevate questions that were pertinent</strong> or useful.</p> <p>Before making it freely available, it was used inside Google at tech talks to vote if a question should be asked.</p> <p>Google announced that August 15, 2015 is Moderator’s <a rel="nofollow noopener" target="_blank" href="https://docs.google.com/document/d/1sPmkuVqoHKue7SlL3tSLrDsyufB8owMeR8AHx4LG8FA/pub">last day</a>, after which the site will be taken down.</p> <p>Its data was made available via Takeout so that people can download their Moderator’s data starting from 30<sup>th</sup> March 2015.</p> <p>To explain why the decision was made to close down the project, it was posted, “<em>… <strong>has not had the usage we had hoped</strong>, so we’ve made the difficult decision to close down the product.</em>“</p> <hr> <h2>Google Flu Trends</h2> <p><em>(Discontinued on: Aug 20, 2015)</em></p> <p>Announced in November 2008, <a rel="nofollow noopener" target="_blank" href="https://googleblog.blogspot.co.il/2008/11/tracking-flu-trends.html">Flu Trends</a> was a service by Google.org as a way to track Influenza outbreaks by sourcing and analyzing search trends.</p> <p>It was a <strong>search prediction model</strong> used for “nowcasting” estimates of Flu and Dengue fevers based on search trends.</p> <p>Google stopped posting public data about these estimates on <a rel="nofollow noopener" target="_blank" href="https://www.google.org/">its website</a> (starting from August 2015), and has decided to provide signal data to its partner health organizations.</p> <p>“<em>Instead of maintaining our own website going forward, we’re now going to <strong>empower institutions who specialize in infectious disease research</strong> to use the data to build their own models,</em>” says The Flu Trends Team on <a rel="nofollow noopener" target="_blank" href="https://ai.googleblog.com/2015/08/the-next-chapter-for-flu-trends.html">Google Research blog</a>.</p> <hr> <h2>Google Hotel Finder</h2> <p><em>(Discontinued on: Sep 22, 2015)</em></p> <figure><img loading="lazy" decoding="async" height="357" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/google-hotel-finder.jpg" width="700" alt="Google Hotel Finder search interface"></figure> <p>Launched on July 28, 2011 as an experimental <strong>hotel search and inventory tool</strong>, <a rel="nofollow noopener" target="_blank" href="https://search.googleblog.com/2011/07/find-perfect-hotel-with-hotel-finder.html">Hotel Finder</a> lets travellers find hotel information and book accommodations.</p> <p>Its features include tourist spotlights for any neighborhood, and short-list results to keep track of them.</p> <p>At the <strong>end of September 2015</strong>, Hotel Finder got replaced by Hotel Ads<strong>,</strong> an advertising service that allows direct bookings from Google Search results.</p> <p>According to the official announcement on Google’s Inside Adwords <a rel="nofollow noopener" target="_blank" href="https://adwords.googleblog.com/2015/09/google-hotel-ads-makes-it-easier-for.html">blog</a>, Google retired the dedicated Hotel Finder website because “… <em>users are now able to access the hotel information they need right from Google search.</em>“</p> <hr> <h2>ADT for Eclipse</h2> <p><em>(Discontinued on: Dec 31, 2015)</em></p> <p>ADT, Android Developer Tools, a plugin for Eclipse provided an Android application development environment for Eclipse users.</p> <p>Its 0.9.4 version released in October 2009, ADT was a part of Android’s SDK and <strong>helped people develop Android applications</strong> easily.</p> <p>After releasing Android Studio as the official IDE for Android app development, <a rel="nofollow noopener" target="_blank" href="https://android-developers.googleblog.com/2015/06/an-update-on-eclipse-android-developer.html">Google announced in June 2015</a> that support for ADT plugin for Eclipse would end by December 2015.</p> <p>“<em>To that end and <strong>to focus all of our efforts on making Android Studio better and faster</strong>, we are ending development and official support for the Android Developer Tools (ADT) in Eclipse,</em>” said Jama Eason, Product Manager at Android.</p> <hr> <h2>Google Allo</h2> <p><em>(Discontinued on: Mar 12, 2019)</em></p> <figure><img loading="lazy" decoding="async" height="450" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/Google-Allo.jpg" width="800" alt="Google Allo messaging app"></figure> <p>Launched in September 2016, <a rel="nofollow noopener" target="_blank" href="https://blog.google/products/allo-duo/introducing-google-allo-and-duo/">Google Allo</a> was a smart messaging app that integrated Google Assistant directly into conversations. It offered features like smart replies, stickers, and the ability to whisper or shout messages by adjusting text size.</p> <p>Despite its innovative features, Google announced in December 2018 that Allo would be discontinued in March 2019. The company encouraged users to switch to <a rel="nofollow noopener" target="_blank" href="https://messages.google.com/">Messages</a> for SMS and <a rel="nofollow noopener" target="_blank" href="https://duo.google.com/">Duo</a> for video calls.</p> <p>“<em>We’ve learned a lot from Allo, particularly what’s possible when you incorporate machine learning features, like the Google Assistant, into messaging. We’re bringing the best of Allo into Messages, including Smart Reply, GIFs and desktop support,</em>” said Google in their <a rel="nofollow noopener" target="_blank" href="https://blog.google/products/allo-duo/allo-say-hello-to-messages-and-duo/">announcement</a>.</p> <hr> <h2>Google+</h2> <p><em>(Discontinued on: Apr 2, 2019)</em></p> <figure><img loading="lazy" decoding="async" height="450" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/Google+.jpg" width="800" alt="Google+ social network"></figure> <p>Launched in June 2011 as Google’s answer to Facebook, <a rel="nofollow noopener" target="_blank" href="https://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html">Google+</a> was the company’s fourth attempt at creating a social network. It introduced innovative features like Circles for organizing contacts and Hangouts for video chat.</p> <p>After a data breach affecting 52.5 million users was discovered in December 2018, Google announced it would shut down Google+ for consumers in April 2019. The enterprise version, Google+ for G Suite, continued until April 2020.</p> <p>“<em>While our engineering teams have put a lot of effort and dedication into building Google+ over the years, it has not achieved broad consumer or developer adoption, and has seen limited user interaction with apps,</em>” stated Google in their <a rel="nofollow noopener" target="_blank" href="https://blog.google/technology/safety-security/project-strobe/">blog post</a>.</p> <hr> <h2>Google Inbox</h2> <p><em>(Discontinued on: Apr 2, 2019)</em></p> <figure><img loading="lazy" decoding="async" height="450" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/Google-Inbox.jpg" width="800" alt="Google Inbox email client"></figure> <p>Introduced in October 2014, <a rel="nofollow noopener" target="_blank" href="https://gmail.googleblog.com/2014/10/an-inbox-that-works-for-you.html">Google Inbox</a> was an experimental email client that aimed to revolutionize email management. It featured smart grouping of emails, reminders, and a clean, modern interface.</p> <p>Google announced in September 2018 that Inbox would be discontinued in March 2019 (later extended to April 2019). Many of its features were integrated into the main Gmail app.</p> <p>“<em>We’ve taken popular Inbox features and added them into Gmail to help more people benefit from them,</em>” said Google in their <a rel="nofollow noopener" target="_blank" href="https://www.blog.google/products/gmail/inbox-signing-find-your-favorite-features-gmail/">announcement</a>.</p> <hr> <h2>Google Daydream</h2> <p><em>(Discontinued on: Oct 15, 2019)</em></p> <figure><img loading="lazy" decoding="async" height="450" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/Google-Daydream.jpg" width="800" alt="Google Daydream VR platform"></figure> <p>Announced in May 2016, <a rel="nofollow noopener" target="_blank" href="https://blog.google/products/google-vr/daydream-google-vr-platform/">Google Daydream</a> was Google’s mobile virtual reality platform. It included a VR headset and controller, along with a platform for VR apps and games.</p> <p>Google announced in October 2019 that it would discontinue Daydream, citing limited adoption and the challenges of mobile VR. The Daydream View headset was discontinued, and the Daydream app was removed from the Google Play Store.</p> <p>“<em>We saw that the smartphone-based VR experience wasn’t as compelling as we had hoped, and that there were limitations to the technology that made it difficult to develop high-quality VR experiences,</em>” explained Google in their <a rel="nofollow noopener" target="_blank" href="https://blog.google/products/google-vr/daydream-view/">statement</a>.</p> <hr> <h2>Google Play Music</h2> <p><em>(Discontinued on: Dec 2020)</em></p> <figure><img loading="lazy" decoding="async" height="450" src="https://assets.hongkiat.com/uploads/google-graveyard-2015/Google-Play-Music.jpg" width="800" alt="Google Play Music streaming service"></figure> <p>Launched in November 2011, <a rel="nofollow noopener" target="_blank" href= Internet Google Ashutosh KS Getting Started with Gemini CLI https://www.hongkiat.com/blog/getting-started-with-gemini-cli-guide/ hongkiat.com urn:uuid:d98a76ca-bbc2-ca82-c4e3-7dcc8c157a1b Mon, 28 Jul 2025 13:00:49 +0000 <p>Gemini CLI is a free, open-source tool that brings Googles Gemini AI right into your Terminal. If you’re a developer, it can help you work faster as it allows you to talk to your system and code in plain English. Aside of dealing with code, you can use it for, writing, research, and more. It’s&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/getting-started-with-gemini-cli-guide/">Getting Started with Gemini CLI</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p><a href="https://github.com/google-gemini/gemini-cli" target="_blank" rel="noopener noreferrer">Gemini CLI</a> is a free, open-source tool that brings Googles Gemini AI right into your Terminal.</p> <p>If you’re a developer, it can help you work faster as it allows you to talk to your system and code in plain English. Aside of dealing with code, you can use it for, writing, research, and more. It’s lightweight, supports long prompts, works with tools like VS Code, and is easy to customize.</p> <p>But, before you can start using its powerful features, you’ll need to install it on your machine. Let’s see how to install it and how to get everything set up.</p> <h2>Installation</h2> <p>First, install Node.js version 18 or higher on your machine. You can download it from the official Node.js website: <a href="https://nodejs.org/en/download/" target="_blank" rel="noopener noreferrer">Node.js Downloads</a>.</p> <p>You will also need <strong>a personal Google Account</strong> or <strong>a Gemini API key</strong>, which you can get from <strong><a href="https://aistudio.google.com/app/apikey" target="_blank" rel="noopener noreferrer">Google AI Studio</a></strong>, to authenticate your access to Gemini AI.</p> <p>Once you get either of those, you can either run Gemini CLI instantly using <code>npx</code>:</p> <pre> npx https://github.com/google-gemini/gemini-cli </pre> <p>Or, I would recommend to install it globally with npm, so you can use it from anywhere in your terminal. To do this, run the following command:</p> <pre> npm install -g @google/gemini-cli </pre> <p>After the installation is complete, you can verify whether Gemini CLI is installed correctly by running:</p> <pre> gemini --version </pre> <h3>Authentication</h3> <p>When you run Gemini for the first time…</p> <pre> gemini </pre> <p>…you will be asked to select the color theme that it will use to render the codes generated. You can select any of the available themes that suit your preference.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-cli-init.jpg" alt="Gemini CLI initial setup showing theme selection interface" width="1000" height="600"> </figure> <p>Then, you will also need to authenticate your access to Gemini AI by providing your <strong>Google Account</strong>. Or, If you need higher quotas, beyond the free tier, I’d suggest to provide a Gemini API key from Google AI Studio.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-auth.jpg" alt="Gemini CLI authentication screen showing Google Account and API key options" width="1000" height="600"> </figure> <h2>Examples and Use Cases</h2> <p>The Gemini CLI can be used for various tasks including for coding assistant, file management, content generation, research, task automation, and even system troubleshooting. Let’s see some of these examples:</p> <h3>Coding Assitant</h3> <p>Gemini CLI can help you write code, debug, and even explain code snippets. For example, you can ask it to write a function in Node.js that calculates the factorial of a number. To do this, you can simply run <code>gemini</code>. This will bring the interactive mode, as we can see below:</p> <p>By default, it will be using the <code>gemini-2.5-pro</code>. But, if you do not need all the power of the <code>gemini-2.5-pro</code> model, you can switch it to other Gemini models, such as <code>gemini-2.0-flash-lite</code>, which is a lightweight model that is faster and cheaper to use.</p> <pre> gemini --m gemini-2.0-flash-lite </pre> <p>Now, we can ask it to write our function. In this case, I will prompt it to: <q><strong>Generate a function in Node.js that calculates the factorial of a number.</strong></q></p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-cmd-code-generation.jpg" alt="Gemini CLI generating Node.js factorial function code example" width="1000" height="600"> </figure> <p>It generated the code for us. But we can also ask it even further to save it in a file, such as <code>factorial.js</code>. To do this, we can simply prompt it to: <q><strong>Save this code in a file named factorial.js</strong></q>.</p> <p>You will be asked permission to save the file, and you can either allow it once or always. If you choose to allow it always, it will save the file without asking you again in the future.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-cmd-save-file.jpg" alt="Gemini CLI saving generated code to factorial.js with permission prompt" width="1000" height="600"> </figure> <p>Now, we should find the file in the current working directory.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/file-ls.jpg" alt="Terminal showing ls command output with newly created factorial.js file" width="1000" height="300"> </figure> <h3>File and Project</h3> <p>As mentioned earlier, Gemini CLI can also help you with file management. For example, you can ask it to create a new directory for your project, and then create a new file inside that directory.</p> <p>In this example, I’d like to ask Gemini to scaffold a new Go project for me. To do this I will ask it a bit more detail about what needs to be created inside the initial project, for example:</p> <pre> I want to scaffold a new Go project with the following details: * Module name: github.com/tfirdaus/go-project * Language: Go * Purpose: A simple CLI application * Go version: 1.20+ * Dependency management: Go modules Please generate: 1. A standard directory structure 2. Initial go.mod file 3. A minimal main.go file (if applicable) 4. Sample README.md 5. Optional: .gitignore for Go projects 6. Test file example Use idiomatic Go practices and organize the code to be easy to extend later. </pre> <p>After sending this prompt, Gemini will ask you some permissions to make some changes on the file system such as for changing directory, creating directory, creating and writing files.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-cmd-scaffold-permissions.jpg" alt="Gemini CLI requesting permissions for scaffolding a new Go project" width="1000" height="600"> </figure> <p>After you allow it, it will start creating the project structure for you, and you can check the result by running <code>ls</code> command:</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/getting-started-with-gemini-cli-guide/gemini-cmd-scaffold.jpg" alt="Terminal showing the generated Go project structure with ls command" width="1000" height="400"> </figure> <h2>Wrapping up</h2> <p>Gemini CLI is a powerful and flexible tool that can help you with all kinds of tasks, from coding and managing files to generating content and answering questions. It’s easy to install, simple to set up, and works right from your terminal using plain language commands.</p> <p>In this article, we walked through how to install Gemini CLI, setting it up, and explored a few practical examples, like using it to help with code and generate an initial project structure.</p> <p>But there’s much more to explore. In upcoming articles, we’ll dive deeper into Gemini CLI’s advanced features, like integrating with <strong>Model Context Protocol (MCP)</strong>, customizing context and behavior, and using some of its built-in tools.</p> <p>Stay tuned for more tips to help you get the most out of Gemini CLI!</p><p>The post <a href="https://www.hongkiat.com/blog/getting-started-with-gemini-cli-guide/">Getting Started with Gemini CLI</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Internet Artificial Intelligence Thoriq Firdaus 40 Streamlined WordPress Themes for Simplicity https://www.hongkiat.com/blog/wordpress-minimalistic-themes/ hongkiat.com urn:uuid:0f7f57a9-6d0e-b69a-b971-4a2dee253823 Sat, 26 Jul 2025 10:00:06 +0000 <p>Not everyone appreciates complexity in design. Extravagant banners, sliders, and various elements can detract from your content. A minimalistic, uncluttered site design lets your work take center stage, unencumbered by unnecessary embellishments. These streamlined themes are ideal for presenting your work neatly and clearly. That’s precisely why this compilation highlights 40 sleek and minimalistic WordPress&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/wordpress-minimalistic-themes/">40 Streamlined WordPress Themes for Simplicity</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>Not everyone appreciates complexity in design. Extravagant banners, <a href="https://www.hongkiat.com/blog/jquery-image-galleries-sliders-best-of/">sliders</a>, and various elements can detract from your content. A minimalistic, uncluttered site design <strong>lets your work take center stage, unencumbered by unnecessary embellishments</strong>. These streamlined themes are ideal for presenting your work neatly and clearly.</p> <p>That’s precisely why this compilation highlights 40 sleek and minimalistic <a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/elegant">WordPress Themes</a> suitable for a range of purposes including <strong>blogging, portfolios, photography sites, magazines, corporate sites</strong>, and more, catering to diverse preferences. This selection includes:</p> <ul> <li><a href="#premium" rel="nofollow">20 Premium Minimalist Themes</a></li> <li><a href="#free" rel="nofollow">20 Free Minimalist Themes</a></li> </ul> <p>These ensure a clean, minimalistic site that loads quickly and is favored by search engines like Google.</p> <hr> <h2 id="premium">Premium Minimalist Themes</h2> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Facerola-ultra-minimalist-agency-wordpress-theme-W9PRATH">Acerola</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Facerola-ultra-minimalist-agency-wordpress-theme-W9PRATH"><img fetchpriority="high" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Acerola.jpg" alt="Acerola Agency Theme" width="1600" height="1058"></a></figure> <p>Acerola offers a fully responsive design that adapts to various website needs, such as agency, creative studio, and business sites. Its professional appearance is enhanced by clean aesthetics and engaging parallax effects. Users can easily tailor the theme to their requirements, thanks to its extensive customization options. Key features include a drag-and-drop page builder, a slider for eye-catching images, and WooCommerce support for e-commerce functionality. </p> <p>The theme also provides one-click data import, live customization, and sharp retina-ready displays. Additionally, it is ready for translation and supports WPML for creating multilingual sites. Responsive customer support is available to assist users.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Facerola-ultra-minimalist-agency-wordpress-theme-W9PRATH">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fcafariva-minimalist-cafe-coffee-elementor-template-BLKNSHX">Cafariva</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fcafariva-minimalist-cafe-coffee-elementor-template-BLKNSHX"><img decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Cafariva.jpg" alt="Cafariva Cafe Theme" width="1600" height="667"></a></figure> <p>Designed for coffee shop businesses, Cafariva is a minimalist theme that simplifies website creation when used with the Elementor Page Builder for WordPress. It works best with the Hello Elementor theme but fits well with any Elementor-compatible theme. </p> <p>Cafariva enables a no-code customization process through a drag-and-drop interface, giving you control over fonts, colors, and design elements. Its professional design is not only sleek but also optimized for quick loading, providing a seamless user experience.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fcafariva-minimalist-cafe-coffee-elementor-template-BLKNSHX">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fdashbag-fashion-store-elementor-template-kit-2MKXREL">DashBag</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fdashbag-fashion-store-elementor-template-kit-2MKXREL"><img decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/DashBag.jpg" alt="DashBag Fashion Theme" width="1600" height="1607"></a></figure> <p>With DashBag, you can effortlessly build a fashion store website using WordPress and Elementor. This theme features a modern, responsive, and retina-ready design that simplifies the creation process without the need for coding. It includes 10 customizable templates alongside 18 section templates, all embracing a sleek and minimalist aesthetic. </p> <p>DashBag works seamlessly with Elementor’s free version and incorporates Google Fonts. The designs are crafted to display beautifully across desktops, laptops, and mobile devices. Plus, users benefit from responsive support provided by a committed team, making website customization and usage straightforward.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fdashbag-fashion-store-elementor-template-kit-2MKXREL">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Ffamita-minimalist-woocommerce-wordpress-theme-HNV5UKB">Famita</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Ffamita-minimalist-woocommerce-wordpress-theme-HNV5UKB"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Famita.jpg" alt="Famita eCommerce Theme" width="1600" height="1115"></a></figure> <p>Famita offers a clean and simple design suitable for eCommerce stores, including those selling furniture, clothes, tech, and accessories. It enhances the user experience with straightforward Theme Options for customization, such as changing Google fonts without any coding. The theme ensures your site looks great on all devices with its responsive design. </p> <p>It’s compatible with WooCommerce and features multiple homepage options, AJAX for a smoother shopping experience, quick product views, and a wishlist. Famita also supports multiple languages through WPML, provides different blog layouts, and comes with a selection of color schemes. Social media integration, a custom 404 error page, and demo content are included to help you get your store up and running quickly.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Ffamita-minimalist-woocommerce-wordpress-theme-HNV5UKB">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fgute-minimalist-blog-elementor-template-kit-XYT839Y">Gute</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fgute-minimalist-blog-elementor-template-kit-XYT839Y"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Gute.jpg" alt="Gute Blog Theme" width="1600" height="1051"></a></figure> <p>Designed for Elementor, Gute is a WordPress theme that suits a range of publishing websites, including news portals, magazines, personal blogs, and editorial platforms. It’s built to work seamlessly with Elementor Pro, which is required for its full range of features. Customization is straightforward, allowing you to tailor your site to your needs. </p> <p>The responsive design ensures optimal viewing on different devices and browsers. However, before you can take advantage of Gute’s capabilities, you’ll need to install a few plugins: Elementor, Themesflat Addons for Elementor, ElementsKit Lite, and WooCommerce.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fgute-minimalist-blog-elementor-template-kit-XYT839Y">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Finez-clean-portfolio-agency-theme-WMFGZD8">Inez</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Finez-clean-portfolio-agency-theme-WMFGZD8"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Inez.jpg" alt="Inez Portfolio Theme" width="1600" height="1071"></a></figure> <p>Designed for creatives, Inez is ideal for showcasing work through a multi-page portfolio. Photographers, designers, and artists can choose from several portfolio layouts and project templates, including grid and masonry styles. The theme smartly adjusts grid item sizes to display images perfectly. It works with WordPress 4.4+, is fully responsive, and integrates seamlessly with Bootstrap 3. </p> <p>Inez simplifies the setup process with one-click demo installation and offers customizable grid spacing and video project features. It’s SEO-friendly, boasts a clean interface, and provides access to over 700 Google Fonts. The theme is also translation-ready with WPML, includes a custom CSS field, over 2000 premium icons, and supports threaded comments. Users benefit from regular updates and comprehensive support documentation.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Finez-clean-portfolio-agency-theme-WMFGZD8">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Flixer-creative-portfolio-wordpress-theme-MGRUACT">Lixer</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Flixer-creative-portfolio-wordpress-theme-MGRUACT"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Lixer.jpg" alt="Lixer Portfolio Theme" width="1600" height="1179"></a></figure> <p>Designed for creative portfolios, Lixer offers a modern, clean, and minimalist look that captures the audience’s attention. It’s fully responsive, ensuring a seamless display across all devices. </p> <p>With the Elementor Page Builder, creating pages is a breeze thanks to its drag-and-drop functionality, streamlining content management. Built on the Bootstrap 4.x Framework, Lixer guarantees a mobile-friendly experience. The one-click demo importer simplifies the setup process, allowing for fast and effortless customization of your website.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Flixer-creative-portfolio-wordpress-theme-MGRUACT">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fmunfarid-a-wordpress-theme-for-blog-shop-WJKFSZD">Munfarid</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fmunfarid-a-wordpress-theme-for-blog-shop-WJKFSZD"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Munfarid.jpg" alt="Munfarid WordPress Theme" width="1600" height="1145"></a></figure> <p>With a modern, minimalist design, the Munfarid Blog theme is perfect for bloggers and online retailers using WooCommerce. It’s crafted to meet the latest standards, ensuring your website looks sleek and professional. Munfarid supports the Gutenberg editor, streamlining the site-building process and preparing you for WordPress 5.0. This theme is responsive, easy to customize, and doesn’t require any coding. </p> <p>It comes packed with features including a robust admin interface, multiple header styles, and customizable title areas. Engage visitors with video and call-to-action elements. The one-click demo import, various blog layouts, and different logo options for headers enhance your site’s flexibility. </p> <p>Plus, it offers a full-screen menu, a side menu area, and built-in search functionality.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fmunfarid-a-wordpress-theme-for-blog-shop-WJKFSZD">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpekko-minimal-dark-wordpress-theme-S29USKC">Pekko</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpekko-minimal-dark-wordpress-theme-S29USKC"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Pekko.jpg" alt="Pekko WordPress Theme" width="1600" height="1198"></a></figure> <p>Designed for dark portfolio websites, Pekko offers a sleek and minimalistic look that pairs well with the Elementor page builder for easy customization. Enjoy quick loading times thanks to its lightweight design, and captivate your audience with smooth animations and standout typography. </p> <p>This theme comes with drag-and-drop functionality, a responsive design, and Ajax content loading for a seamless user experience. It’s ready for translation, supports multiple languages, and is easy to customize. Comprehensive documentation and cross-browser compatibility make Pekko a reliable choice for your website project.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpekko-minimal-dark-wordpress-theme-S29USKC">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpioneer-multi-concept-corporate-wordpress-theme-WGJDSL6">Pioneer</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpioneer-multi-concept-corporate-wordpress-theme-WGJDSL6"><img decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Pioneer.jpg" alt="Pioneer WordPress Theme"></a></figure> <p>Designed with a minimalist approach, Pioneer caters to developers, designers, bloggers, and creatives looking for a user-friendly WordPress theme. It simplifies the process of creating both business and personal websites with over 65 pre-made demos and more than 15 homepage styles that work for multi-page and one-page sites. </p> <p>The theme ensures your content is easy to read and looks great on any device, thanks to its responsive design. With Pioneer, you get a modern portfolio, various e-commerce shop layouts, and the advantage of SEO-friendly clean code.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fpioneer-multi-concept-corporate-wordpress-theme-WGJDSL6">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsaara-minimal-blog-wordpress-theme-8EM5U9M">Saara</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsaara-minimal-blog-wordpress-theme-8EM5U9M"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Saara.jpg" alt="Saara WordPress Theme" width="1600" height="1349"></a></figure> <p>Designed with bloggers in mind, the Saara Minimalist WordPress Blog theme offers a sleek, artistically crafted interface that adapts beautifully across devices. Choose from six distinct home page demos to find the perfect style for your content. The gallery page comes alive with a variety of layouts, including video posts and diverse image information placements, ensuring an engaging visual experience for your audience.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsaara-minimal-blog-wordpress-theme-8EM5U9M">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsassoft-mobile-app-fintech-startup-elementor-templ-GVHBPFB">Sassoft</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsassoft-mobile-app-fintech-startup-elementor-templ-GVHBPFB"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Sassoft.jpg" alt="Sassoft WordPress Theme" width="1600" height="1400"></a></figure> <p>Sassoft offers a sleek, responsive design that’s ready for high-resolution displays and easy to tailor using Elementor’s intuitive drag-and-drop interface – no coding needed. This template kit includes 10 versatile templates and 18 sections, all editable with Elementor, even with its free version. It incorporates Google Fonts at no extra cost, ensuring a stylish and minimalist look that adapts flawlessly to different devices. </p> <p>With Sassoft, you get a smooth design process and dedicated support to help you build a polished business website effortlessly.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsassoft-mobile-app-fintech-startup-elementor-templ-GVHBPFB">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsigny-a-personal-blog-wordpress-theme-R7ZXQLH">Signy</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsigny-a-personal-blog-wordpress-theme-R7ZXQLH"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Signy.jpg" alt="Signy WordPress Theme" width="1600" height="1088"></a></figure> <p>SIGNY combines functionality with ease of use to improve the reader’s experience. Its unique layouts and clean, minimalist aesthetic are enhanced by a selection of widgets. For bloggers looking to sell products, SIGNY includes tailored shopping layouts. </p> <p>The theme is optimized for speed, ensuring quick loading times, and offers a range of post styles to clearly communicate your message. It’s also fully responsive, making your content easily readable on any device.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Fsigny-a-personal-blog-wordpress-theme-R7ZXQLH">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Funero-minimalist-woocommerce-wordpress-theme-9WNFKH6">Unero</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Funero-minimalist-woocommerce-wordpress-theme-9WNFKH6"><img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/wordpress-minimalistic-themes/Unero.jpg" alt="Unero WordPress Theme" width="1600" height="1059"></a></figure> <p>Unero offers a minimalist AJAX WooCommerce theme tailored for online shopping experiences. With a focus on a clean aesthetic and highlighting products, it aims to boost the appeal of e-commerce sites and increase sales. </p> <p>This theme is ideal for a range of online stores, including fashion, furniture, and home decor. It includes WooCommerce integration, a variety of plugins, customizable settings, a mini cart, and multiple widgets for enhanced functionality. Unero ensures a mobile-friendly layout, advanced product filtering, and an integrated order tracking system.</p> <p> It also provides comprehensive tax and shipping settings, a coupon system, and detailed store reports to effectively manage your online business. SEO-friendly features and tools for customer engagement, such as product ratings and reviews, are also part of the package.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://1.envato.market/c/2257137/275988/4415?u=https%3A%2F%2Felements.envato.com%2Funero-minimalist-woocommerce-wordpress-theme-9WNFKH6">Preview theme</a> </div> <hr> <h3><a rel="nofollow noopener" target="_bla WordPress ad-divi WordPress Themes Nancy Young Best Accessories for MacBook Air 15″ https://www.hongkiat.com/blog/macbook-air-2023-accessories/ hongkiat.com urn:uuid:6e0da89e-3d83-5054-51fb-53ffc4e2fd2b Fri, 25 Jul 2025 10:00:30 +0000 <p>Get the most out of your new MacBook Air 15" 2023 with essential accessories for protection and enhanced functionality.</p> <p>The post <a href="https://www.hongkiat.com/blog/macbook-air-2023-accessories/">Best Accessories for MacBook Air 15&#8243;</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>The MacBook Air 15 inch is a great laptop. To make the most of it and keep it in good condition, the right accessories can make a difference.</p> <p>This guide presents a selection of helpful MacBook Air 15 inch accessories. We cover items for MacBook Air protection, such as screen protectors and cases, as well as peripherals like stands and USB hubs designed to enhance productivity.</p> <figure><img loading="lazy" decoding="async" alt="MacBook Air 15 accessories collection" height="900" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-air-15-accessories.jpg" width="1600"></figure> <p>Explore these options to see how they can improve your daily workflow, protect your device, and help you utilize your MacBook Air 15″ effectively.</p> <h2>1. Screen Protector</h2> <p>In my view, screen protectors are crucial. They are not just needed for mobile phones, but also for laptops. Each time you shut the laptop, the keys can gradually leave a mark on the screen. So, it’s better to use a screen protector to prevent these marks from becoming permanent.</p> <p>Even though the 15-inch MacBook Air 2023 is a recent model, there are already plenty of screen protectors available for it. Here are a few options you can consider.</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/dp/B0C81J4Q3/">Mosiso</a> ($23.99)</h4> <p>These folks sell them in a set, with the screen protector for macbook air 15 inch 2023, also comes the plastic hard shell and the keyboard cover.</p> <p>This company sells a set for the 2023 MacBook Air 15 inch that includes a screen protector, a plastic hard shell, and a keyboard cover.</p> <figure><img loading="lazy" decoding="async" alt="Mosiso screen protector set" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/screen-protector-mosiso.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/MacBook-Air-Compatible-15-3-M2/dp/B0C77TQVCJ/">PYS</a> ($31.49)</h4> <p>This product by PYS is a screen projector that also works as a privacy screen protector. You can easily remove it whenever you want. It restricts the viewing angle to +/- 30 degrees, which means only the person sitting directly in front of the monitor can see the data.</p> <figure><img loading="lazy" decoding="async" alt="PYS privacy screen protector" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/screen-protector-psy.jpg" width="1500"></figure> <h2>2. Cleaning Cloth</h2> <p>If you don’t want to use a screen protector on your new MacBook Air, a cleaning cloth can be a good substitute. You can use it to wipe off smudges or dirt from the screen. Additionally, you can place it over the keyboard before closing the laptop to prevent the keys from leaving marks on the screen.</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/CLEAN-SCREEN-WIZARD-Protection-MacBooks-14/dp/B07CRXFQDL/">Clean Screen Wizard</a> ($19.99)</h4> <p>This is a dark-colored microfiber cloth that is 14 inches in size. It’s perfect for use with a 15-inch MacBook Air.</p> <figure><img loading="lazy" decoding="async" alt="MacBook cleaning microfiber cloth" height="843" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/cleaning-cloth.jpg" width="1500"></figure> <h2>3. Keyboard Protector</h2> <p>Another simple way to prevent marks on your MacBook’s screen from the keyboard is to use a keyboard cover. These are usually made of silicone and fit perfectly over your keyboard. They not only reduce the noise when you type, but also protect your keyboard from spills or food crumbs.</p> <p>Here are a few you can consider:</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/MasiBloom-Silicone-Keyboard-Protector-Accessory/dp/B09KZBRHQK/">Silicone Keyboard Cover by MasiBloom</a> ($5.99)</h4> <figure><img decoding="async" alt="MasiBloom silicone keyboard cover" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/Silicone-Keyboard-Cover-by-MasiBloom.jpg"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/Keyboard-Released-Transparent-Protector-Accessories/dp/B0C77X4PR4/">Ultra thin Keyboard Cover by MasiBloom</a> ($6.95)</h4> <figure><img loading="lazy" decoding="async" alt="MasiBloom ultra thin keyboard cover" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/Ultra-thin-Keyboard-Cover-by-MasiBloom.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/Silicone-Shortcuts-Keyboard-MacBook-Released/dp/">Keyboard Cover with Shortcuts by LEZE</a> ($9.99)</h4> <figure><img loading="lazy" decoding="async" alt="LEZE keyboard cover with shortcuts" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/Keyboard-Cover-with-Shortcuts-by-LEZE.jpg" width="1500"></figure> <h2>4. Macbook Sleeve / Bag</h2> <p>If you travel frequently, it’s a good idea to get a MacBook sleeve. Carrying your MacBook without any protection can lead to scratches. So, it’s better to keep it safe in a thin laptop bag.</p> <p>Here are some businesses where you can buy 15-inch MacBook Air sleeves.</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.sfbags.com/collections/sleeves-and-cases-for-apples-15-inch-macbook-air">Waterfield</a></h4> <figure><img loading="lazy" decoding="async" alt="Waterfield MacBook sleeve" height="843" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-sleeve-waterfield.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/tomtoc-Protective-Chromebook-Shockproof-Accessory/dp/B01N0TOQEO">Tomtoc</a></h4> <figure><img loading="lazy" decoding="async" alt="Tomtoc MacBook sleeve" height="843" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-sleeve-tomtoc.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/suitcase-for-macbook">TwelveSouth</a></h4> <figure><img loading="lazy" decoding="async" alt="TwelveSouth MacBook sleeve" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-sleeve-twelve-south.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.nativeunion.com/collections/macbook-sleeves">Native Union</a></h4> <figure><img loading="lazy" decoding="async" alt="Native Union MacBook sleeve" height="725" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-sleeve-native-union.jpg" width="1500"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://nomadgoods.com/collections/laptop-sleeves">Nomad </a></h4> <figure><img loading="lazy" decoding="async" alt="Nomad MacBook sleeve" height="614" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-sleeve-nomad.jpg" width="1500"></figure> <h2>5. Macbook Air Case</h2> <p>In our continued discussion about protecting your MacBook, consider getting a case that you can attach to your MacBook’s exterior to prevent scratches and dents. Here are some MacBook Air cases you might want to think about.</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/MOSISO-Compatible-Keyboard-Protector-Translucent/dp/B0C81HKWDR/">Mosiso</a> ($23.99)</h4> <p>We previously discussed MOSISO when we talked about the MacBook Air 15″ 2023 screen protector. To summarize, it includes a hard plastic case for the MacBook, a screen protector, and a keyboard cover.</p> <figure><img decoding="async" alt="Mosiso MacBook Air case" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-air-case-mosiso.jpg"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/dp/B0C7HCKR9G/">SanMuFly</a> ($17.99)</h4> <p>This affordable hard case by SanMuFly is available in different colors. It also includes a cloth for cleaning, a cover for your keyboard, and a cover for your camera to protect your privacy.</p> <figure><img decoding="async" alt="SanMuFly MacBook Air case" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-air-case-samufly.jpg"></figure> <h2>6. Macbook Stands</h2> <p>A MacBook stand is a useful item to own, especially if you use a desktop computer as well. It gives you a stylish way to keep your MacBook, or helps you to neatly put it away without making your desktop messy. Here are some companies that sell high-quality MacBook stands, which are also compatible with the new 2023 15-inch MacBook Air.</p> <h4>TwelveSouth</h4> <p><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/hirise-pro-for-macbook"><strong>HiRise Pro for Macbook</strong></a></p> <figure><img decoding="async" alt="TwelveSouth HiRise Pro stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-hirise-pro.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/hirise-for-macbook"><strong>HiRise for Macbook</strong></a></p> <figure><img loading="lazy" decoding="async" alt="TwelveSouth HiRise stand" height="844" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-hirise.jpg" width="1500"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/curve-flex-for-macbook"><strong>Curve Flex</strong></a></p> <figure><img decoding="async" alt="TwelveSouth Curve Flex stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-curve-flex.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/curve-for-macbook"><strong>Curve</strong></a></p> <figure><img decoding="async" alt="TwelveSouth Curve stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-curve.jpg"></figure> <h4>Native Union</h4> <p><a rel="nofollow noopener" target="_blank" href="https://www.nativeunion.com/products/fold-laptop-stand"><strong>Fold Laptop Stand</strong></a></p> <figure><img decoding="async" alt="Native Union Fold stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-fold.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://www.nativeunion.com/products/rise-laptop-stand"><strong>Rise Laptop Stand</strong></a></p> <figure><img decoding="async" alt="Native Union Rise stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-rise.jpg"></figure> <h4>Satechi</h4> <p><a rel="nofollow noopener" target="_blank" href="https://satechi.net/products/satechi-dual-vertical-laptop-stand/Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zOTg5NDIyODQ2NzgwMA==?queryID=47e63749d0a05bd1b543510da4e58b89"><strong>Aluminum Laptop Stand</strong></a></p> <figure><img decoding="async" alt="Satechi aluminum laptop stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-aluminum.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://satechi.net/products/satechi-dual-vertical-laptop-stand?variant=39894228467800"><strong>Dual Vertical Laptop Stand</strong></a></p> <figure><img decoding="async" alt="Satechi dual vertical stand" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/macbook-stand-dual-vertical.jpg"></figure> <h2>7. USB Hubs</h2> <p>The 2023 15-inch MacBook Air has two Thunderbolt or USB 4 (USB-C) ports and a 3.5mm headphone jack. If you want to connect more devices, you’ll need a USB hub. Here are some top-notch ones I suggest.</p> <h4>Satechi</h4> <p><a rel="nofollow noopener" target="_blank" href="https://satechi.net/products/type-c-pro-hub-adapter?variant=34900214729"><strong>Type-C Pro Hub Adapter</strong></a><strong> ($99.99)</strong></p> <ul> <li>1x HDMI port – up to 4K 60Hz</li> <li>1x USB-C PD port – up to 40 Gbps data transfer, PD charging up to 87W, 4K 60Hz video output.</li> <li>2x USB-A ports – up to 5 Gbps</li> <li>1x USB-C data port – up to 5 Gbps (no charging/video)</li> <li> x micro/SD card readers</li> </ul> <figure><img decoding="async" alt="Satechi Type-C Pro hub" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/usb-hub-satechi-type-c-pro.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://satechi.net/products/4-port-usb-c-hub?variant=39527859781720"><strong>4-Port USB-C Hub </strong></a><strong>($39.99)</strong></p> <ul> <li>4x USB-C ports – up to 5 Gbps</li> </ul> <figure><img decoding="async" alt="Satechi 4-port USB-C hub" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/usb-hub-satechi-4-port.jpg"></figure> <h4>TwelveSouth</h4> <p><a rel="nofollow noopener" target="_blank" href="https://www.twelvesouth.com/products/staygo-mini"><strong>StayGo mini USB-C Hub</strong></a><strong> ($39.99)</strong></p> <ul> <li>1x USB-C power | pass-thru 85W USB-C PD charging</li> <li>1x 4K HDMI | Crystal clear 4K x 2k @ 30Hz HDMI / Full 1080p</li> <li>1x USB-A 2.0 / BC 1.2 Charging Port | SuperSpeed up to 5 Gbps with BC 1.2 7.5W Fast Charge</li> <li>1x Headphone/Audio out</li> </ul> <figure><img decoding="async" alt="TwelveSouth StayGo mini hub" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/usb-hub-twelvesouth-staygo-mini.jpg"></figure> <h4>Belkin</h4> <p><a rel="nofollow noopener" target="_blank" href="https://www.apple.com/shop/product/HL9B2VC/A/belkin-usb-30-4-port-hub-usb-c-cable"><strong>Belkin USB 3.0 4-Port Hub + USB-C Cable</strong></a><strong> ($69.95)</strong></p> <ul> <li>4x USB 3.0 ports</li> </ul> <figure><img decoding="async" alt="Belkin 4-port USB hub" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/usb-hub-belkin-4-port.jpg"></figure> <p><a rel="nofollow noopener" target="_blank" href="https://www.apple.com/shop/product/HP9H2VC/A/belkin-thunderbolt-3-dock-pro"><strong>Belkin Thunderbolt 3 Dock Pro</strong></a><strong> ($299.95)</strong></p> <ul> <li>2x Thunderbolt 3 (USB-C) ports</li> <li>1x DisplayPort video port</li> <li>1x UHS-II SD card slot</li> <li>4x USB-A 3.0 ports</li> <li>1x USB-C power delivery port</li> </ul> <figure><img decoding="async" alt="Belkin Thunderbolt 3 dock" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/usb-hub-belkin-thunderbolt.jpg"></figure> <h2>8. iPhone Mount</h2> <p>These mounts let you attach your iPhone to the top (or on the side) of your MacBook. This setup allows you to use the Continuity Camera feature for FaceTime and video conferencing.</p> <h4><a rel="nofollow noopener" target="_blank" href="https://www.apple.com/shop/product/HQ642ZM/A/belkin-iphone-mount-with-magsafe-for-mac-notebooks">Belkin iPhone Mount with MagSafe for Mac Notebooks</a> ($29.95)</h4> <figure><img decoding="async" alt="Belkin MagSafe iPhone mount" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/iphone-mount-belkin.jpg"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/CloudValley-Magnetic-Adjustable-Portable-Expansion/dp/B08ZNDNMD3/">CloudValley Magnetic Phone Holder</a> ($15.99)</h4> <figure><img decoding="async" alt="CloudValley magnetic phone holder" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/iphone-mount-cloudvalley.jpg"></figure> <h4><a rel="nofollow noopener" target="_blank" href="https://www.amazon.com/MOFT-Magnetic-Continuity-Foldaway-Dual-Screen/dp/B0BLRS7JDV/">MOFT Magnetic Laptop iPhone Mount</a> ($29.99)</h4> <figure><img decoding="async" alt="MOFT magnetic laptop mount" src="https://assets.hongkiat.com/uploads/macbook-air-2023-accessories/iphone-mount-moft.jpg"></figure> <h2>Final Thoughts</h2> <p>Buying a laptop, especially a high-end one like the MacBook Air 15-inch, is not an everyday occurrence. So, it’s important to ensure it’s protected from accidental damage while also using it effectively for your needs. I hope you find these recommendations helpful.</p><p>The post <a href="https://www.hongkiat.com/blog/macbook-air-2023-accessories/">Best Accessories for MacBook Air 15&#8243;</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Gadgets Laptop Accessories MacBook Hongkiat Lim 20+ Alternative Web Browsers for Smart Phones https://www.hongkiat.com/blog/mobile-phone-browsers/ hongkiat.com urn:uuid:56d7343f-6b75-5686-7c14-43887e780175 Wed, 23 Jul 2025 10:00:38 +0000 <p>Smartphones, we depend on them for everything, from staying on top of emails and browsing through social media to online shopping and handling our finances. And one app that we constantly find ourselves utilizing is undoubtedly the web browser. Whether you’re an iOS user with Safari or an Android user with Chrome, these are often&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/mobile-phone-browsers/">20+ Alternative Web Browsers for Smart Phones</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>Smartphones, we depend on them for everything, from staying on top of emails and browsing through social media to online shopping and handling our finances. And one app that we constantly find ourselves utilizing is undoubtedly the web browser. </p> <p>Whether you’re an iOS user with Safari or an Android user with Chrome, these are often our first choices. However, did you know that there’s an entire universe of alternative web browsers out there that are just as capable and filled with features? </p> <p>These browsers often aim to enhance specific aspects such as speed, privacy, readability, and some even offer their own VPN-like <a href="https://www.hongkiat.com/blog/free-virtual-private-networks/">proxy services</a>. To assist you in exploring these options, we’ve put together a thorough list of over 20 web browsers specifically designed for smartphones. So go ahead, download them, and give them a test run. Who knows, you might even discover your new favorite browser! </p> <hr> <h2>1. Dolphin</h2> <figure><img fetchpriority="high" decoding="async" alt="Dolphin" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Dolphin.jpg" width="1500"></figure> <p>Dolphin Browser is available for both Android and iOS. It’s designed to enhance your online experience with its speed and customization options. Dolphin makes browsing efficient with features like multi-tab management, Android Flash support, and user-defined gestures for quick navigation. It integrates seamlessly with social networks and cloud storage services like Facebook, Evernote, and Box, making sharing and syncing effortless. </p> <p>Additionally, it offers third-party add-ons for a personalized browsing experience, voice search capabilities through Sonar (a feature), and convenient sidebars for quick access to bookmarks and settings.</p> <h5>Features:</h5> <ul> <li>Enjoy all-in-one browsing with multiple tabs.</li> <li>Navigate quickly with customizable gestures.</li> <li>Share and sync with popular social platforms.</li> <li>Personalize with third-party add-ons.</li> <li>Access bookmarks and options swiftly with side bars.</li> </ul> <p><strong>Download Dolphin for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/dolphin-browser/id1440710469">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=mobi.mgeek.TunnyBrowser">Android</a> </div> <hr> <h2>2. Opera</h2> <figure><img decoding="async" alt="Opera" height="1135" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Opera.jpg" width="1500"></figure> <p>Opera is a swift and secure web browser that comes with an integrated VPN and ad-blocker for smooth, private browsing. It’s enhanced with AI to deliver personalized content and a distinctive browsing experience. Opera’s data-saving mode optimizes internet speeds while saving data and battery life. Fully adaptable, you can tweak settings to suit your needs, including a night mode to protect your eyes during late hours.</p> <h5>Features:</h5> <ul> <li>Secure browsing with free VPNs.</li> <li>Ad-free and tracker-free experience.</li> <li>AI-powered personalized browsing.</li> <li>Customizable reading and search settings.</li> <li>Sync files across devices with Flow.</li> <li>Protect privacy with anonymous browsing.</li> </ul> <p><strong>Download Opera for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/opera-browser-with-vpn-and-ai/id1411869974">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.opera.browser">Android</a> </div> <hr> <h2>3. Firefox Mobile</h2> <figure><img decoding="async" alt="Firefox Mobile" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Firefox-Mobile.jpg" width="1500"></figure> <p>Firefox Mobile from Mozilla is a secure iOS browser that syncs your devices, allowing easy access to bookmarks, passwords, and history on the go. Its Enhanced Tracking Protection automatically blocks trackers and scripts, keeping your online activities private. </p> <p>The browser features a <a href="https://www.hongkiat.com/blog/browser-private-mode-by-default/">private mode</a> that wipes your history and cookies when you’re done. Firefox’s intuitive browsing tools help you quickly navigate to favorite sites and search efficiently. By setting it as your default browser, you support an independent tech company and ensure seamless browsing between your mobile and desktop.</p> <h5>Features:</h5> <ul> <li>Enjoy fast browsing with optimal speed.</li> <li>Browse privately with erasable history mode.</li> <li>Sync your data across all devices.</li> </ul> <p><strong>Download Firefox Mobile for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/firefox-private-safe-browser/id989804926">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=org.mozilla.firefox&hl=en">Android</a> </div> <hr> <h2>4. Firefox Focus</h2> <figure><img loading="lazy" decoding="async" alt="Firefox Focus" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Firefox-Focus.jpg" width="1500"></figure> <p>Firefox Focus, by Mozilla, is a mobile browser designed for quick, private searches without any complications. Ideal for quick look-ups you want to keep private, it features a clean, distraction-free interface for speedy searches. It doesn’t store history, previous sites, or tabs, ensuring your sessions remain confidential. With a single tap, you can erase your browsing history, passwords, and cookies. By blocking numerous ads and trackers, Firefox Focus not only enhances your privacy but also accelerates page loading for a faster browsing experience.</p> <h5>Features:</h5> <ul> <li>Design promotes quick, distraction-free searches.</li> <li>History, passwords, cookies can be erased with one tap.</li> <li>Pin shortcuts on home screen for favorite sites.</li> <li>Ad and tracker blocking ensures faster browsing.</li> <li>Privacy enhanced with superior tracking protection.</li> </ul> <p><strong>Download Firefox Focus for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/firefox-focus-privacy-browser/id1055677337">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=org.mozilla.focus">Android</a> </div> <hr> <h2>5. Microsoft Edge</h2> <figure><img loading="lazy" decoding="async" alt="Microsoft Edge" height="844" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Microsoft-Edge.jpg" width="1500"></figure> <p>Microsoft Edge, enhanced with AI and Copilot powered by <a href="https://www.hongkiat.com/blog/what-is-chatgpt/">GPT-4</a>, is a mobile browser that revolutionizes your online experience. It provides detailed summaries, answers questions, and even creates images using <a href="https://www.hongkiat.com/blog/dall-e-3-chatgpt/">DALL-E 3</a>. Prioritizing your privacy, it features tracking prevention, <a href="https://www.hongkiat.com/blog/edge-inprivate-mode-by-default/">InPrivate browsing</a>, and Microsoft Defender Smartscreen.</p> <p>Edge also makes shopping smarter with price comparison tools and coupon finders, ensuring a comprehensive and secure browsing experience.</p> <h5>Features:</h5> <ul> <li>AI copilot offers comprehensive answers and summarizes pages.</li> <li>DALL-E 3 creates images from text prompts.</li> <li>Enhanced privacy with tracking prevention and secure browsing.</li> <li>AdBlock Plus blocks unwanted ads.</li> <li>Smart Shopping provides price comparison and cashback.</li> <li>Password monitoring for potential dark web threats.</li> </ul> <p><strong>Download Microsoft Edge for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/microsoft-edge-ai-browser/id1288723196">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.microsoft.emmx">Android</a> </div> <hr> <h2>6. Puffin</h2> <figure><img loading="lazy" decoding="async" alt="Puffin" height="843" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Puffin.jpg" width="1500"></figure> <p>Puffin Browser is a cloud-powered mobile browser that shifts computing tasks from your device to cloud servers for incredibly fast web page loading. This unique approach not only speeds up browsing but also saves up to 90% of bandwidth with its proprietary technology. Beyond speed, Puffin ensures secure browsing on all networks with encryption and enhances mobile gaming with an on-screen gamepad. </p> <p>It’s also designed to minimize data usage, making it a fast, secure, and efficient choice for mobile internet users.</p> <h5>Features:</h5> <ul> <li>Experience faster browsing powered by cloud computing.</li> <li>Save up to 90% bandwidth during regular browsing.</li> <li>Enjoy fast, secure browsing with enhanced encryption.</li> <li>Control data usage by adjusting streaming and image quality.</li> </ul> <p><strong>Download Puffin for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/puffin-cloud-browser/id472937654">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.cloudmosa.puffinFree">Android</a> </div> <hr> <h2>7. Ghostery Privacy Browser</h2> <figure><img loading="lazy" decoding="async" alt="Ghostery Privacy Browser" height="847" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Ghostery-Privacy-Browser.jpg" width="1500"></figure> <p>Ghostery goes beyond typical ad-blocking; it’s a comprehensive privacy tool available on all browsers and devices. It offers a suite of features to <a href="https://www.hongkiat.com/blog/online-privacy-security-tips-tricks/">enhance your online privacy</a>, including the ability to block ads and trackers and a private search engine. Built on the reliable Firefox platform, it ensures a secure browsing experience with its private browsing mode and unbiased search options.</p> <h5>Features:</h5> <ul> <li>Blocks trackers and intrusive ads on all browsers.</li> <li>Prevents cookie pop-ups across all browsers.</li> <li>Integrated private search within the browser.</li> </ul> <p><strong>Download Ghostery for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/ghostery-privacy-ad-blocker/id1436953057">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.ghostery.android.ghostery">Android</a> </div> <hr> <h2>8. Brave Browser</h2> <figure><img fetchpriority="high" decoding="async" alt="Dolphin" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Dolphin.jpg" width="1500"></figure> <p>Brave Private Web Browser stands out with its integrated Adblock, VPN, and independent Brave Search. Known for its speed, it cuts down page load times and boosts performance. Brave ensures your privacy with advanced features like HTTPS Everywhere, script blocking, and cookie control, offering a secure and efficient browsing environment.</p> <h5>Features:</h5> <ul> <li>Ad-free and tracker-free browsing.</li> <li>Your privacy is protected with enhanced features.</li> <li>Use Brave Search for private, track-free searching.</li> <li>Earn rewards while browsing with Brave Rewards.</li> </ul> <p><strong>Download Brave for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/brave-private-web-browser-vpn/id1052879175">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.brave.browser">Android</a> </div> <hr> <h2>9. Ecosia</h2> <figure><img loading="lazy" decoding="async" alt="Ecosia" height="948" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Ecosia.jpg" width="1500"></figure> <p>Ecosia is a Chromium-based browser with a mission: to plant trees using its search revenue. It provides all essential features like tabs, incognito mode, and bookmarks while ensuring fast browsing with an ad blocker. Ecosia’s commitment to the environment is evident as it funds global tree planting initiatives, fights climate change, and supports communities. </p> <p>It respects user privacy by not tracking location or selling data and encrypts searches. As a carbon-negative option, Ecosia produces more renewable energy than it consumes, making it an eco-friendly choice for conscious users.</p> <h5>Features:</h5> <ul> <li>Browsing without ads with the integrated ad blocker.</li> <li>Combat climate change by planting trees through search revenue.</li> <li>Your privacy is protected, they don’t track nor sell data.</li> </ul> <p><strong>Download Ecosia for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/ecosia/id670881887">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.ecosia.android">Android</a> </div> <hr> <h2>10. Kiwi Browser</h2> <figure><img loading="lazy" decoding="async" alt="Kiwi Browser" height="843" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Kiwi-Browser.jpg" width="1500"></figure> <p>Kiwi Browser, based on Chromium and WebKit, offers a familiar and fast browsing experience. It’s known for its speed and includes a robust pop-up blocker and extension support. Unique features like unlocking Facebook Messenger without the app, customizable night mode, and a bottom address bar enhance usability.</p> <p>Kiwi also allows for homepage customization and provides a comfortable browsing experience tailored to user preferences.</p> <h5>Features:</h5> <ul> <li>Powerful pop-up blocking.</li> <li>Night mode offers comfortable reading.</li> <li>Privacy is prioritized, blocking trackers.</li> </ul> <p><strong>Download Kiwi for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/lk/app/kiwi-browser-adblocker-vpn/id6453991209">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.kiwibrowser.browser">Android</a> </div> <hr> <h2>11. Stargon Browser</h2> <figure><img loading="lazy" decoding="async" alt="Stargon Browser" height="856" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Stargon-Browser.jpg" width="1500"></figure> <p>Stargon Browser is a compact, swift Android browser featuring a powerful ad blocker and video download capabilities. It enhances your browsing with gesture controls, dark mode, DNS VPN, and an integrated video player. Focused on privacy and ease of use, Stargon includes a QR code scanner, file manager, and safe browsing options, making it a convenient and secure choice for mobile users.</p> <h5>Features:</h5> <ul> <li>No ads for cleaner browsing.</li> <li>Download videos directly.</li> <li>Save images easily.</li> <li>Enjoy low-light browsing with dark theme.</li> <li>Read distraction-free with reading mode.</li> <li>Browse privately with incognito mode.</li> </ul> <p><strong>Download Stargon for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=net.onecook.browser">Android</a> </div> <hr> <h2>12. Surfy Browser</h2> <figure><img loading="lazy" decoding="async" alt="Surfy Browser" height="814" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Surfy-Browser.jpg" width="1500"></figure> <p>Surfy Browser is a private web browser designed for an efficient and unique mobile experience. It offers password-protected browsing, customizable themes, and data-saving features. Built for a different kind of mobile web journey, Surfy reduces data usage while providing secure, full-screen reading and browsing sessions, catering to users seeking both privacy and practicality.</p> <h5>Features:</h5> <ul> <li>Lock browser or sessions with a password.</li> <li>Personalize with favorite colors and images.</li> <li>Listen to content with the voice engine.</li> <li>Navigate tabs with a simple swipe.</li> <li>Unlock app or bookmarks using a fingerprint.</li> </ul> <p><strong>Download Surfy for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.outcoder.browser">Android</a> </div> <hr> <h2>13. Tor Browser</h2> <figure><img loading="lazy" decoding="async" alt="Tor Browser" height="848" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Tor-Browser.jpg" width="1500"></figure> <p>Tor Browser, from the Tor Project, is synonymous with extreme privacy and freedom online. It ensures truly private browsing by isolating each website you visit, blocking trackers and ads, and clearing cookies after each session. </p> <p>Tor defends against surveillance and resists fingerprinting by making all users look the same. It employs multi-layered encryption as your data moves through the <a href="https://www.hongkiat.com/blog/introductions-to-bitcoins-tor-network/">Tor network</a>, keeping your activities confidential and allowing <a href="https://www.hongkiat.com/blog/alternative-ways-to-access-blocked-websites/">access to sites blocked by your local ISP</a>.</p> <h5>Features:</h5> <ul> <li>Blocks trackers for private browsing.</li> <li>Safeguards against surveillance.</li> <li>Protects identity through fingerprint resistance.</li> <li>Provides multi-layered encryption.</li> <li>Enables access to blocked websites.</li> </ul> <p><strong>Download Tor for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/onion-browser/id519296448">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=org.torproject.torbrowser">Android</a> </div> <hr> <h2>14. Vivaldi Browser</h2> <figure><img loading="lazy" decoding="async" alt="Vivaldi Browser" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Vivaldi-Browser.jpg" width="1500"></figure> <p><a href="https://www.hongkiat.com/blog/cool-vivaldi-browser-features/">Vivaldi</a> is a feature-rich browser designed to enhance productivity, creativity, and safety. It offers advanced tab management, allowing you to organize and handle tabs efficiently. Vivaldi prioritizes your privacy by blocking trackers and ads and includes a range of tools like note-taking, page translation, and full-page screenshots to streamline your browsing experience.</p> <h5>Features:</h5> <ul> <li>Experience safer browsing with enhanced privacy protection.</li> <li>Smart tools like note-taking and translation.</li> <li>Advanced tab management features for easy organization.</li> <li>Keep screens tidy with two-level tab stacks.</li> <li>Access tools like history and downloads in split-screen.</li> <li>Personalize settings and explore new features.</li> </ul> <p><strong>Download Vivaldi for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/vivaldi-powerful-web-browser/id1633234600">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.vivaldi.browser">Android</a> </div> <hr> <h2>15. Aloha Browser</h2> <figure><img loading="lazy" decoding="async" alt="Aloha Browser" height="766" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Aloha-Browser.jpg" width="1500"></figure> <p>Aloha Browser combines a sleek interface with a host of powerful features. It guarantees private browsing with no activity logs and includes an unlimited VPN for secure, anonymous internet access. </p> <p>Aloha comes with a built-in <a href="https://www.hongkiat.com/blog/metamask-alternatives/">crypto wallet</a>, an ad blocker for uninterrupted browsing, and full Web3.0 support for blockchain games and platforms. It also features a robust media player, background music play, data saver mode, secure private tabs, and a QR code reader, making it a comprehensive tool for modern internet users.</p> <h5>Features:</h5> <ul> <li>Assures privacy with no activity logs.</li> <li>Offers unlimited secure VPN browsing.</li> <li>Provides a wallet for multiple cryptocurrencies.</li> <li>Blocks annoying ads for clean browsing.</li> <li>Supports Web3 for blockchain game access.</li> </ul> <p><strong>Download Aloha for:</strong></p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://apps.apple.com/us/app/aloha-browser-private-vpn/id1105317682">iOS</a> <a rel="nofollow noopener" target="_blank" href="https://play.google.com/store/apps/details?id=com.aloha.browser">Android</a> </div> <hr> <h2>16. Orion Browser</h2> <figure><img loading="lazy" decoding="async" alt="Orion Browser" height="1026" src="https://assets.hongkiat.com/uploads/mobile-phone-browsers/Orion-Browser.jpg" width="1500"></figure> <p>Orion Browser by Kagi is a fast, free, and privacy-centric web browser tailored for iPhone and iPad users. It ensures a smooth browsing experience free from ads and telemetry. With its robust anti-tracking technology and built-in ad-blocker, Orion is dedicated to protecting your online privacy and providing a secure browsing environment.</p> <h5>Features:</h5> <ul> <li>Clean browsing without data collection.</li> <li>Ensures your data remains private.</li> <li>Blocks ads for smooth browsing.</li> </ul> <p><strong>Download Orion for:</strong></p> <div class=" Mobile Android iOS smartphones Web Browsers Fahad Khan 5 Powerful MCP Servers To Transform Your Development Workflow https://www.hongkiat.com/blog/mcp-servers-development-tools/ hongkiat.com urn:uuid:8dd7a8f8-77a7-38b2-5188-4be14f2e47f5 Tue, 22 Jul 2025 13:00:18 +0000 <p>The Model Context Protocol (MCP) is an open standard that lets AI assistants connect with external data sources, tools, or systems. This makes them much more useful by allowing them to do things like run code, manage files, and interact with APIs. In my previous article, we looked at how MCP works, how to install&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">5 Powerful MCP Servers To Transform Your Development Workflow</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>The Model Context Protocol (MCP) is an open standard that lets <a href="https://www.hongkiat.com/blog/create-chatbot-with-openai/">AI assistants</a> connect with external data sources, tools, or systems. This makes them much more useful by allowing them to do things like run code, manage files, and interact with APIs.</p> <p>In <a href="https://www.hongkiat.com/blog/mcp-guide-ai-tool-integration/">my previous article</a>, we looked at how MCP works, how to install it, and how to use a few MCP servers. In this article, we’ll explore more MCP servers, this time focusing on tools that can help developers save time and work more efficiently.</p> <p>We’ll continue using <a rel="nofollow noopener" target="_blank" href="https://claude.ai/download">Claude</a> to run the MCP servers as it has MCP capabilities built-in, is easy to install, and is compatible with major platforms.</p> <p>So, let’s dive in!</p> <hr> <h2>1. <a rel="nofollow noopener" target="_blank" href="https://github.com/21st-dev/magic-mcp">21st.dev Magic</a></h2> <p><strong>21st.dev Magic</strong> is an <a href="https://www.hongkiat.com/blog/best-ai-tools-for-git-commit-messages/">AI powered tool</a> that allows you to build modern UI components just by describing them in plain language. It works with popular editors like <a rel="nofollow noopener" target="_blank" href="https://www.cursor.com">Cursor</a>, <a rel="nofollow noopener" target="_blank" href="https://windsurf.com/editor">Windsurf</a>, <a rel="nofollow noopener" target="_blank" href="https://code.visualstudio.com">VS Code</a> (with <a rel="nofollow noopener" target="_blank" href="https://cline.bot">Cline</a>), as well as <a rel="nofollow noopener" target="_blank" href="https://claude.ai">Claude</a>.</p> <p>So you can just type what you need, and it will instantly create ready-to-use code. This makes building UI prototypes faster and easier, with less manual work.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/21stdev.jpg" alt="21st.dev Magic UI component builder" width="1000" height="600"> </figure> <h4>Installation</h4> <p>To get started, first create an account at <a rel="nofollow noopener" target="_blank" href="https://21st.dev">21st.dev</a> to get your API key. Once you’ve signed up, you can find your API key on the <a rel="nofollow noopener" target="_blank" href="https://21st.dev/api-access">API Access</a> page.</p> <p>To install the MCP server, add the following configuration and replace <code>[api-key]</code> with your own API key.</p> <pre> { "mcpServers": { "@21st-dev/magic": { "command": "npx", "args": [ "-y", "@21st-dev/magic@latest", "API_KEY=\"[api-key]\"", ] } } } </pre> <h4>Example Prompts</h4> <p>When sending a prompt to trigger 21st Magic MCP, it’s best to start your prompt with code <code>/ui</code>, for example:</p> <pre><strong>/ui create a signup form</strong></pre> <p>After sending the prompt, you will receive the code for the signup form, usually with some variants. You can then copy and paste this code into your editor to use it.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-21st-signup-form.jpg" alt="21st Magic signup form example" width="1000" height="600"> </figure> <p>We can improve our prompt by giving it more detailed instructions, for example:</p> <pre><strong>/ui create a pricing table component with two plans: Free and Pro. Each plan should include a signup button at the bottom.</strong></pre> <p>It’s smart enough to understand the instruction and generates pricing tables with just two plans, as shown below, and even provides some variants.</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-21st-pricing-table.jpg" alt="21st Magic pricing table example" width="1000" height="600"> </figure> <p>This is a great MCP server for any designers or developers to create prototypes. It can help you create UI components quickly and easily.</p> <hr> <h2>2. <a rel="nofollow noopener" target="_blank" href="https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem">Filesystem</a></h2> <p>The <strong>Filesystem MCP</strong> Server allows an AI assistant to work with your local filesystem to read, write, and manage files. With this setup, the AI can do things like create folders, move files, or check file details. This makes it easier to automate everyday file tasks and boost your productivity.</p> <h4>Installation</h4> <pre> { "mcpServers": { "filesystem": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-filesystem", "/Users/tfirdaus/Desktop" ] } } } </pre> <h4>Example Prompts</h4> <p>Let’s first try with a simple prompt:</p> <pre><strong>how many files are there in my Desktop directory?</strong></pre> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-filesystem.jpg" alt="Filesystem MCP file count example" width="1000" height="600"> </figure> <p>As we can see above, it’s smart enough to give us the count and details about the files.</p> <p>You can even take it a step further by giving more detailed instructions. For example, let’s say your Downloads folder is cluttered with all kinds of files and folders. You could ask it to find all the directories that appear to be WordPress plugins with the following prompt:</p> <pre><strong>find and list all the directories that appear to contain a WordPress plugin. A typical plugin folder includes a readme.txt file and several .php files.</strong></pre> <hr> <h2>3. <a rel="nofollow noopener" target="_blank" href="https://github.com/benborla/mcp-server-mysql">MySQL</a></h2> <p>The <strong>MySQL MCP Server</strong> allows an AI assistant to connect to a MySQL database so it can run SQL queries, manage database connections, and fetch data. This integration makes it easier to retrieve information using natural language commands.</p> <h4>Installation</h4> <p>To install this server, you need to make sure that you have access to MySQL installed either on your machine or on a remote server. Then add the following:</p> <pre> { "mcpServers": { "mysql": { "command": "npx", "args": [ "-y", "@benborla29/mcp-server-mysql" ], "env": { "MYSQL_HOST": "127.0.0.1", "MYSQL_PORT": "3306", "MYSQL_USER": "[your-mysql-username]", "MYSQL_PASS": "[your-mysql-password]", "MYSQL_DB": "your_database", "ALLOW_INSERT_OPERATION": "false", "ALLOW_UPDATE_OPERATION": "false", "ALLOW_DELETE_OPERATION": "false", "PATH": "/Users/[username]/.nvm/versions/node/v22.14.0/bin:/usr/bin:/bin", "NODE_PATH": "/Users/[username]/.nvm/versions/node/v22.14.0/lib/node_modules" } } } } </pre> <p>Make sure to replace <code>[your-mysql-username]</code> and <code>[your-mysql-password]</code> with your own MySQL username and password. You can also change the <code>MYSQL_DB</code> to the database you want to connect to.</p> <p>As for the <code>PATH</code> and the <code>NODE_PATH</code>, you can find them by running the following command in your terminal:</p> <pre> which node </pre> <h4>Example Prompts</h4> <p>To use the MySQL MCP server, you can start by asking it to show you the tables in your database. For example:</p> <pre><strong>List all the tables from my wordpress database?</strong></pre> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-mysql-list-table.jpg" alt="MySQL MCP database tables list" width="1000" height="600"> </figure> <p>As shown above, we get a full list of tables. What’s impressive is that the AI even understands and classifies which tables belong to WordPress Core and which ones are from WooCommerce.</p> <p>We can also ask it to show us specific data. For example:</p> <pre><strong>Get the ID of all posts where the title starts with "Hello"</strong></pre> <p>And we get the results in a nice table, as shown below:</p> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-mysql-list-title-like.jpg" alt="MySQL MCP post search results" width="1000" height="600"> </figure> <hr> <h2>4. <a rel="nofollow noopener" target="_blank" href="https://github.com/modelcontextprotocol/servers/tree/main/src/git">Git</a></h2> <p>The <strong>Git MCP Server</strong> allows an AI assistant to interact with a Git repository directly. It supports operations such as cloning repositories, creating branches, committing changes, and viewing logs. This integration allows you to manage your Git workflows using just natural language commands. No need to remember complex Git commands.</p> <h4>Installation</h4> <p>To install this server, you need to have Git installed on your machine. You can check if you have Git installed by running the following command in your terminal:</p> <pre> git --version </pre> <p>Then, you will also need to have the <a rel="nofollow noopener" target="_blank" href="https://github.com/astral-sh/uv">uv</a> command installed.</p> <pre> { "mcp": { "servers": { "git": { "command": "uvx", "args": ["mcp-server-git"] } } } } </pre> <h4>Example Prompts</h4> <p>Let’s try a simple prompt to check the current branch in a local repository:</p> <pre><strong>Check the current branch in this repository [path-to-repository]</strong></pre> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-git-branch.jpg" alt="Git MCP branch status check" width="1000" height="600"> </figure> <p>We can also perform more complex operations, such as reverting the latest commit. For example:</p> <pre><strong>Revert the latest commit in this repository [path-to-repository]</strong></pre> <figure> <img loading="lazy" decoding="async" src="https://assets.hongkiat.com/uploads/mcp-servers-development-tools/prompts-git-revert.jpg" alt="Git MCP commit revert example" width="1000" height="850"> </figure> <p>It is smart enough to first check if the Git tree is clean, meaning that there are no uncommitted changes. Then, it will revert the latest commit and show you the commit message.</p> <p>There are many other Git commands that this MCP server can execute, such as <a rel="nofollow noopener" target="_blank" href="https://git-scm.com/docs/git-checkout">Git Checkout</a>, <a rel="nofollow noopener" target="_blank" href="https://git-scm.com/docs/git-commit">Commit</a>, <a rel="nofollow noopener" target="_blank" href="https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging">Create branch</a>, <a rel="nofollow noopener" target="_blank" href="https://git-scm.com/docs/git-add">Add</a>, etc.</p> <hr> <h2>5. <a rel="nofollow noopener" target="_blank" href="https://github.com/ckreiling/mcp-server-docker">Docker</a></h2> <p>The <strong>Docker MCP Server</strong> is an MCP server that lets you manage Docker using natural language. You can create containers with simple prompts, inspect and debug running ones, and handle persistent data through Docker volumes. It’s great for server admins managing remote Docker setups.</p> <h4>Installation</h4> <p>To install this server, you need to have Docker installed on your machine. You can check if you have Docker installed by running the following command in your terminal:</p> <pre> docker --version </pre> <p>Then, add the following configuration to run the MCP server:</p> <pre> "mcp-server-docker": { "command": "uvx", "args": [ "mcp-server-docker" ] } </pre> <h4>Example Prompts</h4> <p>First, we can try a simple prompt:</p> <pre><strong>List running containers</strong></pre> <p>Since this MCP server supports many Docker commands—like creating containers, starting them, pulling images, and more—we can try a more advanced prompt, such as:</p> <pre><strong>Run a WordPress container using the official image, with MySQL, and Nginx running on port 8000.</strong></pre> <p>This command will set up three containers: one for WordPress using the official image, one for MySQL, and another for Nginx, which will run on port 8000.</p> <hr> <h2>Wrapping Up</h2> <p>In this article, we have explored MCP servers that can help you work more efficiently. These servers allow you to automate tasks and interact with internal systems in your local or external services using natural language commands.</p> <p>You can send prompts that will trigger these MCP servers and save you a lot of time and effort in your daily work.</p> <p>We hope you find this article helpful and that you can use these MCP servers to boost your productivity.</p><p>The post <a href="https://www.hongkiat.com/blog/mcp-servers-development-tools/">5 Powerful MCP Servers To Transform Your Development Workflow</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Internet Artificial Intelligence Thoriq Firdaus Best Business VPN Services for Enterprise Security https://www.hongkiat.com/blog/best-business-vpn/ hongkiat.com urn:uuid:ad33d268-cf95-d52e-faa2-a2d34fc74c74 Tue, 22 Jul 2025 07:00:50 +0000 <p>In the aftermath of the pandemic, there has been a growing trend of remote working and virtual work environments. To enable your remote workers and virtual teams to connect to your corporate network securely, you need a business VPN service. A Business VPN shields your corporate data from security threats, enabling virtual workers to connect&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/best-business-vpn/">Best Business VPN Services for Enterprise Security</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p>In the aftermath of the pandemic, there has been a growing trend of <a href="https://www.hongkiat.com/blog/remote-working-stay-effective/">remote working</a> and <a href="https://www.hongkiat.com/blog/project-management-software/">virtual work environments</a>. To enable your remote workers and virtual teams to <strong>connect to your corporate network securely</strong>, you need a business VPN service.</p> <p>A Business VPN <strong>shields your corporate data from security threats</strong>, enabling virtual workers to connect securely to your company network.</p> <p>But that’s not all. This post highlights some of the most important benefits of using a business VPN – and if you’re convinced enough, you can take a look at the best business VPN service available today and see which one works best for your business.</p> <h3>In this article:</h3> <table> <tr> <th>Name</th> <th>Key Feature</th> <th>Price</th> </tr> <tr> <td><a href="#nordlayer" rel="nofollow">NordLayer</a></td> <td>Multi-layered security with easy setup and management for businesses of all sizes</td> <td>From $7/user/month</td> </tr> <tr> <td><a href="#perimeter81" rel="nofollow">Perimeter81</a></td> <td>Feature-rich cyber security with intuitive dashboard and real-time monitoring</td> <td>From $8/user/month</td> </tr> <tr> <td><a href="#twingate" rel="nofollow">Twingate</a></td> <td>Zero-trust access solution with cloud-based infrastructure support</td> <td>From $5/user/month</td> </tr> <tr> <td><a href="#torguard" rel="nofollow">TorGuard</a></td> <td>Multi-platform VPN with strict encryption and dedicated support team</td> <td>From $32/month (5 users)</td> </tr> <tr> <td><a href="#strongvpn" rel="nofollow">StrongVPN</a></td> <td>WireGuard Protocol support with fast performance and zero logging</td> <td>From $3.66/month</td> </tr> </table> <hr> <h2 id="benefits">How Can Companies Benefit From a Business VPN?</h2> <p>Either you run a big corporation or small/medium enterprise, if you work with a virtual team or have branches in other places, then it becomes imperative to use a business VPN.</p> <p>Why you ask? Well, here is a list of benefits your company can get from using a business VPN:</p> <ul> <li><strong>Secure connectivity</strong> to the company network and shared resources.</li> <li><strong>Business data protection</strong> from security threats like hacking and surveillance.</li> <li><strong>Enhanced security</strong> for a low cost, especially for startups and small businesses.</li> <li><strong>Connect securely from anywhere</strong> – even from a public network.</li> <li><strong>Bypass geo-restrictions</strong> (if any) for remote workers in the country/region that has blocked access to company resources.</li> <li><strong>Easier to set up and maintainance</strong> compared to other network security solutions.</li> </ul> <hr> <h2 id="top-vpn">Top Business VPN Services in the Industry</h2> <p>So you decided to get a business VPN owing to the security and connectivity requirements of your company and you’re on the lookout for the best one that aligns with your particular needs.</p> <p>In the following I’m going to give a brief description of some of the best business VPN services along with their specific features and pricing options so you can make an informed decision.</p> <h2 id="nordlayer">1. <a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/nordlayer">NordLayer</a></h2> <figure> <a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/nordlayer"> <img decoding="async" alt="NordLayer business vpn" src="https://assets.hongkiat.com/uploads/best-business-vpn/NordLayer.jpg"> </a> </figure> <p>NordLayer is one of the best business VPN providers in the market that’s <strong>designed specifically for enhanced business data security for big and small businesses</strong>. With its reliable and multi-layered data security features, your remote workforce can safely connect to your network infrastructure.</p> <p>If we talk about ease of use, NordLayer surpasses all other solutions in this category. It is really simple to set it up (without requiring additional resources), <strong>integrate it with your existing infrastructure, and scale it</strong> according to the ever-fluctuating requirements of a growing business. With an intuitive control panel, you can <strong>monitor user activity, implement security policies, and manage licenses</strong>.</p> <p>Moreover, to manage a user base of more than 40,000 users from 5500 companies worldwide, NordLayer offers <strong>efficient and reliable customer support with a record response time</strong> as well as a comprehensive blog and FAQ section right on the website.</p> <h3>NordLayer’s features:</h3> <p>Backed by certified information security management systems and military-grade encryption, NordLayer offers some powerful features including:</p> <ul> <li><strong>Multi-layered network security</strong> – 2-factor authentication, SSO, auto-connect, threat block, custom DNS, network segmentation, rooted device detection, and smart access, among many others.</li> <li><strong>Hardware-free setup</strong> so you can quickly integrate it within your existing infrastructure and start using a secure network within no time.</li> <li><strong>Reliable global network of 30+ server locations</strong> ideal for conducting product performance tests in any market around the world.</li> <li><strong>Hybrid work security</strong> providing secure access to the company network, managing user verification, and endpoint protection for employee devices.</li> <li><strong>Integration with many network equipment and endpoints</strong> including Google Workspace, Azure, Okta, Amazon Web Services, and OneLogin, etc.</li> <li><strong>Centralized control panel</strong> to implement network security policies, monitor user activity, and manage license transferability all through an intuitive interface.</li> <li><strong>24/7 customer support</strong> offered by network specialists with a response time of under a minute.</li> </ul> <h3>Pricing:</h3> <p>NordLayer offers different pricing plans according to client’s requirements ranging from:</p> <ul> <li><strong>Basic</strong>: $7/user/month, and</li> <li><strong>Advanced</strong>: $9/user/month.</li> </ul> <p>You can also get a <strong>Custom Plan</strong> for your particular needs after a free consultation with NordLayer specialists.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/nordlayer">Get NordLayer Business VPN</a> </div> <hr> <h2 id="perimeter81">2. <a rel="nofollow noopener" target="_blank" href="https://www.perimeter81.com/">Perimeter81</a></h2> <figure> <a rel="nofollow noopener" target="_blank" href="https://www.perimeter81.com/"> <img decoding="async" alt="Perimeter81 business vpn" src="https://assets.hongkiat.com/uploads/best-business-vpn/Perimeter81.jpg"> </a> </figure> <p>Perimeter81 offers a reliable VPN security platform for your business network. It offers a <strong>feature-rich cyber security experience</strong> that adheres to high standards of software security. Plus, you can find multiple data security solutions customized to your particular industry or business needs.</p> <p>To develop and manage your security network, Perimeter81 gives you an easy-to-use <strong>dashboard that gives you an overview of your network policies and access information</strong>. Additionally, you can check user activity in real-time through graphs and charts.</p> <p>Perimeter81 is pretty simple to install and <strong>integrates in your existing network</strong>. It also saves you a lot of time that is otherwise wasted in dealing with cyber complexity.</p> <h3>Perimeter81’s features:</h3> <p>Here are some of the features you can look forward to in Perimeter81 business VPN:</p> <ul> <li><strong>Access control encryption</strong> for strict data protection.</li> <li><strong>Easy user management</strong> through intuitive dashboard.</li> <li><strong>Real-time endpoint awareness</strong> for all user devices.</li> <li><strong>Total network visibility</strong> to keep an eye on all user activity.</li> <li><strong>Multi-factor authentication</strong> for an extra layer of security where needed.</li> <li><strong>Split tunneling</strong> and secure web gateway.</li> </ul> <h3>Pricing:</h3> <p>Perimeter81 offers an array of pricing options including:</p> <ul> <li> <strong>Essential</strong>: $8/user/month,</li> <li><strong>Premium</strong>: $12/user/month,</li> <li><strong>Premium Plus</strong>: $16/user/month, and</li> <li><strong>Enterprise</strong> with customized security features for your needs.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.perimeter81.com/">Get Perimeter81 Business VPN</a> </div> <hr> <h2 id="twingate">3. <a rel="nofollow noopener" target="_blank" href="https://www.twingate.com/">Twingate</a></h2> <figure> <a rel="nofollow noopener" target="_blank" href="https://www.twingate.com/"> <img decoding="async" alt="Twingate business vpn" src="https://assets.hongkiat.com/uploads/best-business-vpn/Twingate.jpg"> </a> </figure> <p>Twingate is not exactly a business VPN, but a <strong>cloud-based service</strong> that’s focused on advanced network security. It offers a zero-trust access (ZTA) solution for your <strong>remote workforce to give them fast and secure access to your corporate network</strong>.</p> <p>You can deploy the Twingate VPN in your network or any of the popular cloud-based infrastructures through its lightweight connectors. It supports <strong>Amazon Web Services, Azure, Google Cloud Platform, SCIM, One Login</strong> as well as Linux server.</p> <p>What sets Twingate apart is its user-friendly functionality and advanced security features that quietly run in the background and don’t impact user performance or latency.</p> <h3>Twingate’s features:</h3> <p>The security features offered by Twingate are quite similar to a business VPN and here are some of the best:</p> <ul> <li><strong>Split tunneling</strong> at the network resource level</li> <li><strong>Fast and easy set up</strong> with efficient management through a simple dashboard</li> <li><strong>Set software-based filters</strong> instead of gateways</li> <li><strong>Universal multi-level authentication</strong> that you can implement on anything including SSH</li> <li><strong>Real-time insights</strong> on user activity in the network</li> <li><strong>Strong device control</strong> to protect sensitive corporate data</li> </ul> <h3>Pricing:</h3> <p>Twingate offers a free starter package with a limited number of users and devices. For more advanced features there is:</p> <ul> <li> <strong>Teams</strong>: $5/user/month, and</li> <li><strong>Business</strong>: $10/user/month.</li> </ul> <p>If your company needs specialized access controls, then you can get a quote on the <strong>Enterprise Custom</strong> package.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.twingate.com/">Get Twingate Business VPN</a> </div> <hr> <h2 id="torguard">4. <a rel="nofollow noopener" target="_blank" href="https://torguard.net/">TorGuard</a></h2> <figure> <a rel="nofollow noopener" target="_blank" href="https://torguard.net/"> <img decoding="async" alt="TorGuard business vpn" src="https://assets.hongkiat.com/uploads/best-business-vpn/TorGuard.jpg"> </a> </figure> <p>If you’re looking for a simple and straightforward business VPN solution, then TorGuard would suit you the best. It’s a <strong>multi-platform VPN service</strong> (supports <strong>Windows, macOS, and mobile VPN apps</strong>) that allows you to access your company network or business data securely and from anywhere in the world.</p> <p>With <strong>strict encryption and using the strongest protocols</strong>, TorGuard ensures there are no corporate data leaks and users connect securely with your network even if they’re using a public WiFi. Also, it offers a <strong>dedicated customer support team</strong> of account managers with sufficient tech know-how to help resolve your day-to-day issues.</p> <h3>TorGuard’s features:</h3> <p>TorGuard offers many network security features for businesses of all sizes. Some of these features include:</p> <ul> <li><strong>Professional account admin dashboard</strong> to manage users and other settings</li> <li><strong>Custom server setup</strong> available on different pricing plans</li> <li><strong>Unblock any app or online service</strong> with stealth VPN and proxy service</li> <li><strong>Tunnel encryption</strong> feature so every employee can have a secure access to the cloud</li> <li><strong>Add logo to the management panel</strong> to give it a professional look</li> <li><strong>Unlimited bandwidth</strong> and lightning fast speed</li> </ul> <h3>Pricing:</h3> <p>TorGuard comes with different pricing plans categorized in line with your specific business needs. These include:</p> <ul> <li><strong>Starter</strong>: $32/month (5 users), </li> <li><strong>Small</strong>: $69/month (10 users),</li> <li><strong>Medium</strong>: $110/month (15 users), and</li> <li><strong>Large</strong>: $169/month (20 users).</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://torguard.net/">Get TorGuard Business VPN</a> </div> <hr> <h2 id="strongvpn">5. <a rel="nofollow noopener" target="_blank" href="https://strongvpn.com/">StrongVPN</a></h2> <figure> <a rel="nofollow noopener" target="_blank" href="https://strongvpn.com/"> <img decoding="async" alt="StrongVPN business vpn" src="https://assets.hongkiat.com/uploads/best-business-vpn/StrongVPN.jpg"> </a> </figure> <p>As the name suggests, StrongVPN comes with some powerful features for protecting your company’s privacy and securing business data. It’s a multi-platform VPN app that supports <strong>Windows, macOS, iOS, Android, Chromebook, and Linux</strong> etc.</p> <p>One of the most interesting features of StrongVPN is that it allows you to connect with the <strong>WireGuard Protocol that gives faster speed, increased performance</strong>, and takes up less resources on your system. Also, your virtual teams can connect easily and with the utmost securely from any location, including public WiFi.</p> <h3>StrongVPN’s features:</h3> <p>Apart from the WireGuard Protocol, StrongVPN offers many other cool features including:</p> <ul> <li><strong>Strong DNS</strong> that lets you change your location for added privacy.</li> <li><strong>IP address masking</strong> so you can conceal your activities from third-party spying.</li> <li><strong>Zero logging</strong> that ensures your private and business data is never tracked, stored or sold.</li> <li><strong>Multi-platform service</strong> offering apps for many PC and mobile devices.</li> </ul> <h3>Pricing:</h3> <p>StrongVPN has two pricing plans based on how you want it to be billed. There are:</p> <ul> <li><strong>Monthly Plan</strong>: $10.99, and</li> <li><strong>Annual Plan</strong>: $3.66.</li> </ul> <p>Additionally, if you opt for the Annual plan, you can avail a <strong>30-day free trial with money-back guarantee</strong>.</p> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://strongvpn.com/">Get StrongVPN Business VPN</a> </div> <hr> <h2 id="faq">FAQ</h2> <div class="faq"> <h3>Why does my business need a VPN?</h3> <p>Businesses use VPNs to ensure the security of data transmissions, especially when employees are working remotely or using public Wi-Fi networks. VPNs help protect against data breaches, cyber threats, and ensure that remote access to the business network is secure and private.</p> <h3>How does a Business VPN differ from a personal VPN?</h3> <p>A Business VPN is designed to accommodate multiple users, offering advanced management features, dedicated servers, and the ability to integrate with enterprise IT infrastructure. In contrast, a personal VPN is intended for individual use, with a focus on privacy and bypassing geo-restrictions.</p> <h3>Can a Business VPN improve internet speed?</h3> <p>While a VPN encrypts data traffic, which can sometimes slow down the connection, the impact on internet speed is usually minimal. In some cases, it can bypass ISP throttling, potentially improving speed when accessing certain resources.</p> <h3>How do I choose the right Business VPN provider?</h3> <p>When choosing a Business VPN provider, consider factors like security features (encryption standards), server locations, bandwidth limits, user management capabilities, customer support, and compliance with industry regulations.</p> <h3>Is it difficult to set up a Business VPN?</h3> <p>Setting up a Business VPN can vary in complexity depending on the provider. Many offer user-friendly interfaces and support to assist with setup. It’s essential to follow the provider’s guidelines and, if necessary, consult with IT professionals to ensure proper configuration.</p> <h3>Are there any downsides to using a Business VPN?</h3> <p>While Business VPNs offer significant security benefits, they may introduce complexity in network management and can sometimes cause slower internet speeds due to encryption overhead. It’s important to select a reputable provider and configure the VPN properly to minimize these issues.</p> </div><p>The post <a href="https://www.hongkiat.com/blog/best-business-vpn/">Best Business VPN Services for Enterprise Security</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> Internet bc Virtual Private Network (VPN) Hongkiat.com 20 Essential Digital Tools for Freelancers https://www.hongkiat.com/blog/essential-freelancer-tools/ hongkiat.com urn:uuid:b38d2b33-2dbd-b0a0-2091-7458f82c356d Fri, 18 Jul 2025 10:00:56 +0000 <p>Freelancing has witnessed a significant upswing, with an increasing number of professionals choosing it for its autonomy and flexibility. Freelancers represent a substantial segment of the global workforce, making impactful contributions across various sectors. Globally, an estimated 1.2 billion freelancers account for more than 34% of the worldwide workforce. This article will guide you through&#8230;</p> <p>The post <a href="https://www.hongkiat.com/blog/essential-freelancer-tools/">20 Essential Digital Tools for Freelancers</a> appeared first on <a href="https://www.hongkiat.com/blog">Hongkiat</a>.</p> <p><a href="https://www.hongkiat.com/blog/popular-freelancing-advices/">Freelancing</a> has witnessed a significant upswing, with an increasing number of professionals choosing it for its autonomy and flexibility.</p> <figure><img fetchpriority="high" decoding="async" alt="Freelancer tools hero" height="900" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/hero.jpg" width="1600"></figure> <p>Freelancers represent a substantial segment of the global workforce, making impactful contributions across various sectors. Globally, an estimated <a rel="nofollow noopener" target="_blank" href="https://marketsplash.com/writing-statistics/">1.2 billion freelancers</a> account for more than 34% of the worldwide workforce.</p> <p>This article will guide you through the latest technological and software innovations designed to boost productivity, streamline workflows, and enhance communication for those pursuing independent careers in diverse domains. It emphasizes tools that are particularly useful for freelancers.</p> <div class="toc" id="toc"> <h2>In this article</h2> <ul> <li><a href="#project_management" rel="nofollow">Project management tools</a> <ul> <li><a href="#monday" rel="nofollow">Monday.com</a></li> <li><a href="#trello" rel="nofollow">Trello</a></li> <li><a href="#asana" rel="nofollow">Asana</a></li> </ul> </li> <li><a href="#finance_management" rel="nofollow">Financial management tools</a> <ul> <li><a href="#freshbooks" rel="nofollow">Freshbooks</a></li> <li><a href="#quickbooks" rel="nofollow">QuickBooks</a></li> <li><a href="#wave" rel="nofollow">Wave</a></li> </ul> </li> <li><a href="#time_tracking" rel="nofollow">Time tracking and productivity tools</a> <ul> <li><a href="#toggl" rel="nofollow">Toggl</a></li> <li><a href="#rescuetime" rel="nofollow">RescueTime</a></li> <li><a href="#focusatwill" rel="nofollow">Focus@Will</a></li> </ul> </li> <li><a href="#communication" rel="nofollow">Communication and collaboration tools</a> <ul> <li><a href="#msteams" rel="nofollow">Microsoft Teams</a></li> <li><a href="#slack" rel="nofollow">Slack</a></li> <li><a href="#dropbox" rel="nofollow">Dropbox</a></li> </ul> </li> <li><a href="#portfolio" rel="nofollow">Online portfolio platforms</a> <ul> <li><a href="#behance" rel="nofollow">Behance</a></li> <li><a href="#dribbble" rel="nofollow">Dribbble</a></li> <li><a href="#wordpress" rel="nofollow">WordPress</a></li> </ul> </li> <li><a href="#cybersecurity" rel="nofollow">Cybersecurity tools</a> <ul> <li><a href="#dashlane" rel="nofollow">Dashlane</a></li> </ul> </li> <li><a href="#learning" rel="nofollow">Online learning platforms</a> <ul> <li><a href="#linkedin" rel="nofollow">LinkedIn Learning</a></li> <li><a href="#skillshare" rel="nofollow">Skillshare</a></li> </ul> </li> <li><a href="#social_management" rel="nofollow">Social media management tools</a> <ul> <li><a href="#hootsuite" rel="nofollow">Hootsuite</a></li> <li><a href="#buffer" rel="nofollow">Buffer</a></li> </ul> </li> </ul> <p> <button class="expand-button"> <i class="fas fa-chevron-down"></i> </button> </p></div> <hr> <h2 id="project_management">Project Management Tools</h2> <p><a href="https://www.hongkiat.com/blog/best-project-management-tools/">Project management tools</a> are vital for a freelancer’s workflow, offering a unified platform to manage tasks, collaborate with clients and teams, and ensure projects are completed on schedule.</p> <p><strong>Related:</strong> <a href="https://www.hongkiat.com/blog/best-project-management-tools/">More Project Management Tools</a></p> <h3 id="monday"><a rel="nofollow noopener" target="_blank" class="js-aw-brand-link" data-feed="QJvAiHutWbPQhwGIWtt8pjKY3W9bR22O" href="https://appwiki.nl/link/brand/QJvAiHutWbPQhwGIWtt8pjKY3W9bR22O">Monday.com</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://appwiki.nl/link/brand/QJvAiHutWbPQhwGIWtt8pjKY3W9bR22O"><img decoding="async" alt="Monday.com dashboard" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/Monday(dot)com.jpg"></a></figure> <p>Monday.com is a project management tool that enhances team collaboration and project oversight. With its customizable boards and workflows, Monday.com meets a wide range of project management requirements.</p> <h5>Why It’s Great:</h5> <ul> <li>Visual Workspaces: Tailor boards and workflows for a visual snapshot of your projects.</li> <li>Team Collaboration: Enable real-time collaboration with features for communication, file sharing, and updates.</li> <li>Automation: Streamline your workflow and increase efficiency by automating repetitive tasks.</li> </ul> <h5>Pricing:</h5> <ul> <li>Basic Plan: /user/month.</li> <li>Standard Plan: 0/user/month.</li> <li>Pro Plan: 6/user/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://appwiki.nl/link/brand/QJvAiHutWbPQhwGIWtt8pjKY3W9bR22O">Learn more about Monday.com</a> </div> <hr> <h3 id="trello"><a rel="nofollow noopener" target="_blank" href="https://trello.com/">Trello</a></h3> <figure><img decoding="async" alt="Trello board view" height="878" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/trello.jpg" width="1645"></figure> <p>Trello is a project management tool designed for collaborative task organization and team coordination. Its user-friendly interface and adaptable framework make it a favored option for those seeking a visual and straightforward project management solution.</p> <h5>Why It’s Great:</h5> <ul> <li>Visual Boards: Organize tasks on boards for a comprehensive view of project status.</li> <li>Flexible Card System: Customize cards to represent tasks, complete with due dates, attachments, and checklists.</li> <li>Team Collaboration: Enhance teamwork with task assignments, comments, and file sharing within cards.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Access core features for basic project management needs.</li> <li>Trello Business Class: 0/user/month when billed monthly.</li> <li>Trello Enterprise: 7.50/user/month when billed monthly.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://trello.com/">Learn more about Trello</a> </div> <hr> <h3 id="asana"><a rel="nofollow noopener" target="_blank" href="https://asana.com/">Asana</a></h3> <figure><img decoding="async" alt="Asana task view" height="890" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/asana.jpg" width="1720"></figure> <p>Asana is a project management tool designed to <a href="https://www.hongkiat.com/blog/online-collaboration-tips/">enhance team collaboration</a> and task organization. Its intuitive interface and extensive features make it an excellent choice for teams of various sizes.</p> <h5>Why It’s Great:</h5> <ul> <li>Task Organization: Easily categorize and prioritize tasks, fostering efficient project management.</li> <li>Collaborative Features: Support team collaboration with task assignments, comments, and file sharing.</li> <li>Project Visualization: Employ timeline and calendar views for a clear overview of project timelines and schedules.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Basic features suitable for small teams and individual use.</li> <li>Asana Premium: 0.99/user/month.</li> <li>Asana Business: 4.99/user/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://asana.com/">Learn more about Asana</a> </div> <hr> <h2 id="finance_management">Financial Management Tools</h2> <p>Financial management tools are essential for freelancers to <a href="https://www.hongkiat.com/blog/invoicing-and-time-management-apps/">streamline invoicing</a>, billing, and expense tracking, promoting financial stability and growth.</p> <h3 id="freshbooks"><a rel="nofollow noopener" target="_blank" class="js-aw-brand-link" data-feed="NwcTbnuIf8MC0TkkS78vJe8tzBoHcg1a" href="https://www.hongkiat.com/blog/go/freshbooks">FreshBooks</a></h3> <figure><a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/freshbooks"><img decoding="async" alt="FreshBooks dashboard" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/FreshBooks.jpg"></a></figure> <p>FreshBooks is an accounting and invoicing software tailored for small businesses and freelancers, providing easy-to-use tools for efficient financial management.</p> <h5>Why It’s Great:</h5> <ul> <li>Invoicing and Payments: Enables the creation of professional invoices, facilitates payments, and automates recurring billing.</li> <li>Expense Tracking: Simplifies the process of tracking expenses, making it easy to categorize and manage financial outgoings.</li> <li>Time Tracking: Offers integrated time tracking to ensure accurate billing and effective project management.</li> <li>Reporting: Generates comprehensive financial reports for a deeper understanding of business performance.</li> </ul> <h5>Pricing:</h5> <ul> <li>Lite: 1/month or 26.80/year</li> <li>Plus: 8/month or 10.40/year</li> <li>Premium: 5/month or 02.00/year</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.hongkiat.com/blog/go/freshbooks">Learn more about FreshBooks</a> </div> <hr> <h3 id="quickbooks"><a rel="nofollow noopener" target="_blank" href="https://quickbooks.intuit.com/">QuickBooks</a></h3> <figure><img loading="lazy" decoding="async" alt="QuickBooks interface" height="712" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/quickbooks.jpg" width="1807"></figure> <p>QuickBooks is a accounting software tailored for small and medium-sized businesses, offering features for bookkeeping, invoicing, and financial reporting.</p> <h5>Why It’s Great:</h5> <ul> <li>Invoicing and Payments: Streamlines the creation of professional invoices and facilitates payment processing.</li> <li>Expense Tracking: Simplifies the tracking and categorization of business expenses for precise financial records.</li> <li>Financial Reporting: Provides the ability to generate detailed financial reports to assess business performance.</li> <li>Tax Preparation: Aids in tax preparation by efficiently organizing financial data and transactions.</li> </ul> <h5>Pricing:</h5> <ul> <li>Simple Start: 3.94/month.</li> <li>Essentials: 1.50/month.</li> <li>Plus: 8.78/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://quickbooks.intuit.com/">Learn more about QuickBooks</a> </div> <hr> <h3 id="wave"><a rel="nofollow noopener" target="_blank" href="https://www.waveapps.com/">Wave</a></h3> <figure><img loading="lazy" decoding="async" alt="Wave accounting app" height="808" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/wave-apps.jpg" width="1738"></figure> <p>Wave is a accounting software designed for small businesses, freelancers, and entrepreneurs, featuring tools for invoicing, accounting, and receipt tracking.</p> <h5>Why It’s Great:</h5> <ul> <li>Invoicing and Payments: Create and dispatch professional invoices and manage payments online.</li> <li>Accounting Tools: Streamlines accounting with robust expense tracking and financial reporting capabilities.</li> <li>Payroll Services: Offers integrated payroll services for streamlined salary and tax management.</li> <li>Free Accounting Software: Provides a complimentary accounting solution with essential features.</li> </ul> <h5>Pricing:</h5> <ul> <li>Wave Accounting: Free.</li> <li>Wave Invoicing: Free.</li> <li>Wave Payroll: Offers payroll services with pricing tailored to location and business needs.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.waveapps.com/">Learn more about Wave</a> </div> <hr> <h2 id="time_tracking">Time Tracking and Productivity Tools</h2> <p>For freelancers, time is an invaluable resource. Time tracking tools provide insights into how time is spent, promoting better management and <a href="https://www.hongkiat.com/blog/how-to-boost-productivity/">enhanced productivity.</a></p> <p><strong>Related:</strong> Check out our posts on <a href="https://www.hongkiat.com/blog/time-tracking-apps-for-browser/">time tracking tools that works on browser</a>, or <a href="https://www.hongkiat.com/blog/time-tracking-mac-apps/">for Mac</a>.</p> <h3 id="toggl"><a rel="nofollow noopener" target="_blank" href="https://toggl.com/">Toggl:</a></h3> <figure><img loading="lazy" decoding="async" alt="Toggl time tracker" height="839" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/Toggl.jpg" width="1897"></figure> <p>Toggl is a <a href="https://www.hongkiat.com/blog/time-tracking-apps-for-browser/">time-tracking</a> and productivity tool tailored for both individuals and teams. With its straightforward interface and comprehensive reporting, Toggl aids users in understanding and optimizing their time.</p> <h5>Why It’s Great:</h5> <ul> <li>Time Tracking: Easily monitor time spent on tasks and projects with a straightforward timer.</li> <li>Project Visualization: Gain insights into project timelines and team activities with detailed reports.</li> <li>Integration: Seamlessly connect with various project management tools to enhance workflow tracking.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Essential time tracking features for individuals.</li> <li>Toggl Starter: /user/month.</li> <li>Toggl Business: 5/user/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://toggl.com/">Learn more about Toggl:</a> </div> <hr> <h3 id="rescuetime"><a rel="nofollow noopener" target="_blank" href="https://www.rescuetime.com/">RescueTime</a></h3> <figure><img loading="lazy" decoding="async" alt="RescueTime dashboard" height="782" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/rescue-time.jpg" width="1867"></figure> <p>RescueTime is a tool designed to enhance productivity by helping individuals and teams understand and manage their digital habits. It analyzes computer usage to offer valuable insights into time management.</p> <h5>Why It’s Great:</h5> <ul> <li>Activity Tracking: Monitors and categorizes computer activities to shed light on time usage patterns.</li> <li>Goal Setting: Enables users to set productivity goals and tracks progress, offering feedback for improvement.</li> <li>Focus Metrics: Assesses focus and distraction levels to help optimize work habits and productivity.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Offers basic time tracking and productivity insights.</li> <li>RescueTime Premium: 2/month or 8/year.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.rescuetime.com/">Learn more about RescueTime</a> </div> <hr> <h3 id="focusatwill"><a rel="nofollow noopener" target="_blank" href="https://www.focusatwill.com/">Focus@Will</a></h3> <figure><img loading="lazy" decoding="async" alt="Focus@Will player" height="782" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/focus-at-will.jpg" width="1853"></figure> <p>Focus@Will utilizes neuroscience and music to boost concentration and focus during work or study. It’s designed to enhance productivity through a personalized auditory environment.</p> <h5>Why It’s Great:</h5> <ul> <li>Neuroscience-Backed Music: Offers music channels scientifically designed to enhance focus and productivity.</li> <li>Personalized Experience: Tailors music selections to individual preferences and task requirements.</li> <li>Timer Functionality: Features customizable timers to structure work sessions and breaks effectively.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Provides limited access to features and music channels.</li> <li>Focus@Will Plus: .49/month or 2.49/year.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.focusatwill.com/">Learn more about Focus@Will</a> </div> <hr> <h2 id="communication">Communication and Collaboration Tools</h2> <p><a href="https://www.hongkiat.com/blog/effective-communication-tactics-for-designers/">Effective communication</a> is crucial for freelancers, especially when projects involve remote collaboration. <a href="https://www.hongkiat.com/blog/team-chat-tools/">Tools for communication</a> and collaboration ensure smooth interactions with clients and team members.</p> <h3 id="msteams"><a rel="nofollow noopener" target="_blank" href="https://www.microsoft.com/en-za/microsoft-teams/log-in">Microsoft Teams</a></h3> <figure><img loading="lazy" decoding="async" alt="Microsoft Teams chat" height="838" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/microsoft-teams.jpg" width="1811"></figure> <p>Microsoft Teams is an all-encompassing collaboration platform that integrates chat, video conferencing, file sharing, and app integration, creating a unified hub for teamwork within the Microsoft 365 ecosystem.</p> <h5>Why It’s Great:</h5> <ul> <li>Chat and Communication: Offers real-time chat and communication tools for continuous team interaction.</li> <li>File Sharing: Enables integrated file sharing and collaborative document editing directly within the platform.</li> <li>Video Conferencing: Provides comprehensive video conferencing capabilities for effective virtual meetings.</li> <li>App Integration: Supports extensive integration with Microsoft 365 and a wide range of third-party applications.</li> </ul> <h5>Pricing:</h5> <ul> <li>Essentials Plan: /user/month.</li> <li>Microsoft 365 Business Basic: /user/month.</li> <li>Microsoft 365 Business Standard: 2.50/user/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.microsoft.com/en-za/microsoft-teams/log-in">Learn more about Microsoft Teams</a> </div> <hr> <h3 id="slack"><a rel="nofollow noopener" target="_blank" href="https://slack.com/">Slack</a></h3> <figure><img loading="lazy" decoding="async" alt="Slack workspace" height="795" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/slack.jpg" width="1676"></figure> <p>Slack is a dynamic team collaboration platform that enhances communication through channels, direct messages, and integrations, fostering team connectivity and productivity.</p> <h5>Why It’s Great:</h5> <ul> <li>Channel-Based Communication: Organizes discussions into channels for efficient and structured team interactions.</li> <li>Integration Hub: Offers extensive integrations with third-party apps to create a centralized workspace.</li> <li>Direct Messaging: Enables direct messaging and file sharing for personalized or small group conversations.</li> </ul> <h5>Pricing:</h5> <ul> <li>Free Plan: Provides basic features suitable for small teams and casual users.</li> <li>Slack Standard: .25/user/month.</li> <li>Slack Business: 2.50/user/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://slack.com/">Learn more about Slack</a> </div> <hr> <h3 id="dropbox"><a rel="nofollow noopener" target="_blank" href="https://www.dropbox.com/">Dropbox</a></h3> <figure><img loading="lazy" decoding="async" alt="Dropbox file manager" height="709" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/dropbox.jpg" width="1791"></figure> <p>Dropbox is a cloud-based file storage and collaboration platform that enables users to securely store, access, and share files from any device.</p> <h5>Why It’s Great:</h5> <ul> <li>File Sync and Sharing: Ensures seamless file synchronization and sharing across various devices and with team members.</li> <li>Collaborative Workspaces: Allows the creation of shared folders and files for collaborative workspaces.</li> <li>Offline Access: Provides the ability to access files offline, ensuring continued productivity regardless of internet availability.</li> </ul> <h5>Pricing:</h5> <ul> <li>Basic Plan: Free, offering limited storage and features.</li> <li>Dropbox Plus: .99/month.</li> <li>Dropbox Business: 0/month.</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.dropbox.com/">Learn more about Dropbox</a> </div> <hr> <h2 id="portfolio">Online Portfolio Platforms</h2> <p>An <a href="https://www.hongkiat.com/blog/online-portfolios-for-designers/">online portfolio</a> is a critical tool for freelancers, serving as a virtual showcase of their work, skills, and achievements to attract potential clients.</p> <h3 id="behance"><a rel="nofollow noopener" target="_blank" href="https://www.behance.net/">Behance</a></h3> <figure><img loading="lazy" decoding="async" alt="Behance portfolio" height="907" src="https://assets.hongkiat.com/uploads/essential-freelancer-tools/behance.jpg" width="1891"></figure> <p>Behance is a leading platform for creative professionals to display their work, engage with a global creative community, and explore a wide array of inspirational projects.</p> <h5>Why It’s Great:</h5> <ul> <li>Portfolio Showcase: Offers a platform to create an attractive portfolio and present creative projects.</li> <li>Community Connection: Engage with an international community of creatives for exposure and feedback.</li> <li>Project Discovery: Explore and draw inspiration from a diverse range of creative projects.</li> <li>Job Opportunities: Access various job openings and freelance opportunities within the creative field.</li> </ul> <h5>Pricing:</h5> <ul> <li>Startup Plan: 9/month.</li> <li>Behance Pro Agent: 0/month (usage-based).</li> </ul> <div class="button"> <a rel="nofollow noopener" target="_blank" href="https://www.behance.net/">Learn more about Behance</a> </div> <hr> <h3 id="dribbble"><a rel="nofollow noopener" target="_blank" href="https://dribbble.com/">Dribbble</a></h3> <figure><img loading="lazy" decoding="async" alt="Dribbble shots" height="744" src="https://assets.ho Freelance Freelancers Hongkiat Lim Broadcast Design News Package http://www.aftereffectvn.info/2017/05/broadcast-design-news-package.html Free After Effect Template urn:uuid:1e1b6456-1fea-d06f-1b71-1d6d1aa27597 Wed, 03 May 2017 12:48:53 +0000 <div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-3jAqJjDpizg/WQVSjfZ0JDI/AAAAAAAAARw/mWPEorMhozshyXpI3qr--NTbxPFWGl1-gCLcB/s1600/preview_590_300_V21.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-3jAqJjDpizg/WQVSjfZ0JDI/AAAAAAAAARw/mWPEorMhozshyXpI3qr--NTbxPFWGl1-gCLcB/s1600/preview_590_300_V21.jpg"></a></div><h6 style="text-align: center;">VideoHive Broadcast Design News Package<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5 | 2.82gb</h6></div><a href="http://www.aftereffectvn.info/2017/05/broadcast-design-news-package.html#more">Đọc thêm »</a> After Effects Project File Broadcast Packages Files News VideoHive Jc-imedia.com VideoHive 100 Photo Slideshow http://www.aftereffectvn.info/2017/05/videohive-100-photo-slideshow.html Free After Effect Template urn:uuid:03674f16-1a70-6d0c-dd5f-d03d26465c84 Mon, 01 May 2017 18:53:51 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-wFDBjcoHPWs/WQeCJE9M-QI/AAAAAAAAFrU/lNEU7LppZFkR7NPrkKegxZuUXbNI1mioACLcB/s1600/100-photo-slide-show-after-effects-template-inline-VH-updated.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-wFDBjcoHPWs/WQeCJE9M-QI/AAAAAAAAFrU/lNEU7LppZFkR7NPrkKegxZuUXbNI1mioACLcB/s1600/100-photo-slide-show-after-effects-template-inline-VH-updated.jpg"></a></div><h6 style="text-align: center;">VideoHive 100 Photo Slideshow<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5, CS4 | 130mb</h6><a href="http://www.aftereffectvn.info/2017/05/videohive-100-photo-slideshow.html#more">Đọc thêm »</a> After Effects Project File Files Grunge Video Displays VideoHive StLove Cinematic Light Logo Reveal Pack http://www.aftereffectvn.info/2017/05/cinematic-light-logo-reveal-pack.html Free After Effect Template urn:uuid:5c80ab03-1d82-8487-0b2e-dcc9e3462691 Mon, 01 May 2017 18:25:27 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-mcF98zcbaYw/WQdsBeAs58I/AAAAAAAAFrE/NOYnsv8owWw8LeqpDvKMKGy8YLFv_D24ACLcB/s1600/stop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-mcF98zcbaYw/WQdsBeAs58I/AAAAAAAAFrE/NOYnsv8owWw8LeqpDvKMKGy8YLFv_D24ACLcB/s1600/stop.jpg"></a></div><h6 style="text-align: center;">VideoHive Cinematic Light Logo Reveal Pack<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5 | 65mb</h6><a href="http://www.aftereffectvn.info/2017/05/cinematic-light-logo-reveal-pack.html#more">Đọc thêm »</a> After Effects Project File Files Light Logo Stings VideoHive StLove HUD UI Infographics Pack 800+ http://www.aftereffectvn.info/2017/04/hud-ui-infographics-pack-800.html Free After Effect Template urn:uuid:7fc050fc-1443-aab5-7680-2524ddf19761 Fri, 21 Apr 2017 03:01:45 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-jB8kOIc71xE/WPl0E-KEBFI/AAAAAAAAFpQ/iHqjVZdAHtYWc2sJI0e859BRDD2oHh3cgCLcB/s1600/hudinfo_poster_new.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-jB8kOIc71xE/WPl0E-KEBFI/AAAAAAAAFpQ/iHqjVZdAHtYWc2sJI0e859BRDD2oHh3cgCLcB/s1600/hudinfo_poster_new.jpg"></a></div><h6 style="text-align: center;">VideoHive HUD UI Infographics Pack 800+<br>1920x1080 | CC2017, CC 2015, CC 2014, CC, CS6 | 460mb</h6><a href="http://www.aftereffectvn.info/2017/04/hud-ui-infographics-pack-800.html#more">Đọc thêm »</a> After Effects Project File Files Infographics VideoHive StLove Colorful Shadows - Motion Titles Pack http://www.aftereffectvn.info/2017/04/colorful-shadows-motion-titles-pack.html Free After Effect Template urn:uuid:ca556598-f791-a4ed-9d62-414ada300b95 Sat, 08 Apr 2017 04:41:20 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-LNBAVLKntx8/WOho6_0hGoI/AAAAAAAAFe8/-6kHXo8hwS07YWKP9ik3Oqg22J35OXMoQCLcB/s1600/Colorful%2BShadows%2B-%2BIMAGE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-LNBAVLKntx8/WOho6_0hGoI/AAAAAAAAFe8/-6kHXo8hwS07YWKP9ik3Oqg22J35OXMoQCLcB/s1600/Colorful%2BShadows%2B-%2BIMAGE.png"></a></div><h6 style="text-align: center;">VideoHive Colorful Shadows - Motion Titles Pack<br>1920x1080 | CC 2015, CC 2014, CC, CS6 | 95mb</h6><a href="http://www.aftereffectvn.info/2017/04/colorful-shadows-motion-titles-pack.html#more">Đọc thêm »</a> 3D - Object After Effects Project File Files Titles VideoHive StLove HUD - UI Graphics for FILM, TV and GAMES http://www.aftereffectvn.info/2017/04/hud-ui-graphics-for-film-tv-and-games.html Free After Effect Template urn:uuid:ee2bfff2-00ad-c7df-0153-b471a18c850a Wed, 05 Apr 2017 08:37:47 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-bV6pszONPX8/WOSfdCheYEI/AAAAAAAAFd8/16tt9E1JEIYcVBr6-a3dV2EJsPLxEZ6UgCLcB/s1600/HUD-UI-GRAPHICS_590x332_V2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-bV6pszONPX8/WOSfdCheYEI/AAAAAAAAFd8/16tt9E1JEIYcVBr6-a3dV2EJsPLxEZ6UgCLcB/s1600/HUD-UI-GRAPHICS_590x332_V2.jpg"></a></div><h6 style="text-align: center;">VideoHive HUD - UI Graphics for FILM, TV and GAMES<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5 | 2.17gb</h6><a href="http://www.aftereffectvn.info/2017/04/hud-ui-graphics-for-film-tv-and-games.html#more">Đọc thêm »</a> After Effects Project File Elements Files Miscellaneous Technology VideoHive StLove Element 3D Tutorials Model http://www.aftereffectvn.info/2017/03/element-3d-tutorials-model.html Free After Effect Template urn:uuid:56132028-1a19-63be-6cda-c7d0ae372cac Fri, 31 Mar 2017 08:00:01 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-P_C3W6UjJcc/WN4L8zlDPHI/AAAAAAAAFc4/Q2STf2-m-lcvJ8MGpH_qpsA6L2UXV-LlQCLcB/s1600/1%2Bthumb.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="378" src="https://4.bp.blogspot.com/-P_C3W6UjJcc/WN4L8zlDPHI/AAAAAAAAFc4/Q2STf2-m-lcvJ8MGpH_qpsA6L2UXV-LlQCLcB/s640/1%2Bthumb.jpg" width="640"></a></div><h6 style="text-align: center;">Element 3D Tutorials Model<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5, CS4 | 30min</h6><a href="http://www.aftereffectvn.info/2017/03/element-3d-tutorials-model.html#more">Đọc thêm »</a> After Effects Tutorial StLove VideoHive Lotus Pond Opener http://www.aftereffectvn.info/2017/03/videohive-lotus-pond-opener.html Free After Effect Template urn:uuid:c00b8c80-f582-30ba-5360-38508f4ee646 Thu, 30 Mar 2017 17:46:52 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-7j_x4c2CZwU/WN1BLbhEV5I/AAAAAAAAFco/xKUviLrfaH0PIyLCX_lj1s5O3NNz5bydwCLcB/s1600/590.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-7j_x4c2CZwU/WN1BLbhEV5I/AAAAAAAAFco/xKUviLrfaH0PIyLCX_lj1s5O3NNz5bydwCLcB/s1600/590.jpg"></a></div><h6 style="text-align: center;">VideoHive Lotus Pond Opener<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5 | 455mb</h6><a href="http://www.aftereffectvn.info/2017/03/videohive-lotus-pond-opener.html#more">Đọc thêm »</a> 3D - Object After Effects Project File Files Openers VideoHive StLove VideoHive Cartoon FX Pack http://www.aftereffectvn.info/2017/03/videohive-cartoon-fx-pack.html Free After Effect Template urn:uuid:bc54c5cb-f593-3771-32a2-31ce78fb7dc2 Sun, 26 Mar 2017 07:12:17 +0000 <div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-JsT8jYpgeSw/WNdjfc7jAAI/AAAAAAAAFcI/KXwYS7ST1yICay8jRgWtzbzLBjPUwNPYgCLcB/s1600/Untitled-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-JsT8jYpgeSw/WNdjfc7jAAI/AAAAAAAAFcI/KXwYS7ST1yICay8jRgWtzbzLBjPUwNPYgCLcB/s1600/Untitled-1.jpg"></a></div><h6 style="text-align: center;">VideoHive Cartoon FX Pack<br>1920x1080 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5, CS4 | 4.1gb</h6><a href="http://www.aftereffectvn.info/2017/03/videohive-cartoon-fx-pack.html#more">Đọc thêm »</a> After Effects Project File Background Cartoons Elements Files VideoHive StLove Solar System 2 ( Fantasy Planets ) 8K http://www.aftereffectvn.info/2017/03/solar-system-2-fantasy-planets-8k.html Free After Effect Template urn:uuid:b853400c-e63d-c27b-6c0e-ad142d3f6117 Sun, 26 Mar 2017 04:10:41 +0000 <div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-IRk_2qL2Opg/WNc4eUo0c1I/AAAAAAAAARc/yMtGuHdI-tI2M7KWX-fcpTsW1lNWnHK8gCLcB/s1600/preview%2Bimage.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-IRk_2qL2Opg/WNc4eUo0c1I/AAAAAAAAARc/yMtGuHdI-tI2M7KWX-fcpTsW1lNWnHK8gCLcB/s1600/preview%2Bimage.jpg"></a></div><h6 style="text-align: center;">VideoHive Solar System 2 ( Fantasy Planets ) 8K<br>7680x4320 | CC 2015, CC 2014, CC, CS6, CS5.5, CS5 | 600mb</h6></div><a href="http://www.aftereffectvn.info/2017/03/solar-system-2-fantasy-planets-8k.html#more">Đọc thêm »</a> After Effects Project File Files Space Titles VideoHive Jc-imedia.com