<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Stefan Majiros: Mobile App Development Company | Barcelona, Bratislava]]></title><description><![CDATA[stefan-majiros.com is a remote mobile app development company (React Native, Android, iOS) based in Barcelona & Bratislava. We also provide IT consulting.]]></description><link>https://stefan-majiros.com/</link><image><url>https://stefan-majiros.com/favicon.png</url><title>Stefan Majiros: Mobile App Development Company | Barcelona, Bratislava</title><link>https://stefan-majiros.com/</link></image><generator>Ghost 3.35</generator><lastBuildDate>Fri, 13 Mar 2026 16:51:20 GMT</lastBuildDate><atom:link href="https://stefan-majiros.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Serverless Social Network w/ React Native, AWS Amplify, and Firebase]]></title><description><![CDATA[CITOO is serverless social network MVP, through which users could share pics and videos of their favorite places in the city. The 2 variants were developed: 
first, that uses AWS Amplify (Cognito, Lambda, S3, AppSync, DynamoDB), and second, that uses Firebase (Firestore, Cloud Functions, Storage).]]></description><link>https://stefan-majiros.com/mobile-portfolio-projects/serverless-social-network-mvp-with-aws-amplify-and-firebase/</link><guid isPermaLink="false">6129ff54d3764937a87e21b1</guid><category><![CDATA[serverless]]></category><category><![CDATA[aws-amplify]]></category><category><![CDATA[firebase]]></category><category><![CDATA[mvp]]></category><category><![CDATA[maps]]></category><category><![CDATA[content-moderation]]></category><category><![CDATA[multimedia]]></category><category><![CDATA[geo-fetching]]></category><category><![CDATA[mfa]]></category><category><![CDATA[video-calling]]></category><category><![CDATA[push-notifications]]></category><category><![CDATA[lottie-animations]]></category><category><![CDATA[graphql]]></category><dc:creator><![CDATA[Stefan Majiros]]></dc:creator><pubDate>Thu, 19 Aug 2021 10:51:50 GMT</pubDate><media:content url="https://stefan-majiros.com/content/images/2021/08/citoo-final-hero2.png" medium="image"/><content:encoded><![CDATA[<img src="https://stefan-majiros.com/content/images/2021/08/citoo-final-hero2.png" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase"><p>Citoo is the <strong>serverless social network <a href="https://en.wikipedia.org/wiki/Minimum_viable_product">MVP</a> </strong>with content moderation control, through which users could share pics and videos of their favorite places in the city they live. </p><p></p><p>The 2 app variants were developed where each use either:<strong> AWS Amplify</strong> <em>(Cognito, Lambda, S3, AppSync, DynamoDB, SNS)</em> or <strong>Firebase</strong> <em>(Firestore, Cloud Functions, Cloud-Messaging, Storage)</em>.</p><p>I was responsible for <strong>UI / UX research, mobile design, mobile development</strong> for Android and iOS <em>(with React Native), </em>and <strong>serverless development</strong> with NodeJS.</p><p>In this post, you can find the main business requirements, final design, features, challenges, and my price estimation for a similar app.</p><hr><h2 id="main-business-requirements">Main Business Requirements</h2><ul><li>Users could signup with <strong>email/password</strong> and <strong>social providers</strong> <em>(Google &amp; Apple Sign-in)</em> and they would be <strong>verified with</strong> <strong>the</strong> <strong>phone number</strong><em> (MFA)</em></li><li>Users could upload <strong>images</strong> and <strong>video</strong> posts of their favorite places <em>(with <strong>GPS</strong> coordinates)</em> in the city they are located</li><li>Users could browse uploaded posts on the <strong>map</strong></li><li>Posts could be <strong>liked</strong> and <strong>commented</strong></li><li><strong>Content moderation </strong><em>(posts containing explicit content like nudity,  violence, etc. will be "<strong>blurred</strong>")</em></li><li><strong>Users</strong> could <strong>chat</strong> with other users after establishing <strong>friendship</strong> <em>(creating friendship consists of creating, sending friend requests, and approving / rejecting<strong> </strong>them)</em></li><li>Users who are friends could also use <strong>live video-calling</strong>, or <strong>share their mobile device screen</strong> in live video calls <em>(provided by Zoom)</em></li><li>When chatting, a user could share text, voice, video, or images (from camera &amp; gallery)</li><li>Users could <strong>search</strong> for other users <em>(based on their description in their profile)</em></li><li>Users could <strong>edit their own profile</strong> <em>(edit description's text, and profile photos) </em></li><li>Users are notified about new friend-requests or new chat messages with <strong>push-notifications</strong></li></ul><h2 id="design">Design</h2><p>In the freelance mobile development studio at stefan-majiros.com, I always make sure to start working on a mobile app by creating high fidelity <strong>mobile design files</strong> using Figma. Then and only then, after a design is approved from the clients side, I will transform design into code using <strong>Storybook</strong> <strong>components</strong>. See the final design of Citoo below:</p><p></p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/intro-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/intro-done.png 600w, https://stefan-majiros.com/content/images/2021/09/intro-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/phone-number-verification.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/phone-number-verification.png 600w, https://stefan-majiros.com/content/images/2021/09/phone-number-verification.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/appleId-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/appleId-done.png 600w, https://stefan-majiros.com/content/images/2021/09/appleId-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/GoogleId-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/GoogleId-done.png 600w, https://stefan-majiros.com/content/images/2021/09/GoogleId-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Apple Sign-In and Google Sign-In Support</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/pincCodeSetup-1.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/pincCodeSetup-1.png 600w, https://stefan-majiros.com/content/images/2021/09/pincCodeSetup-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/login-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/login-done.png 600w, https://stefan-majiros.com/content/images/2021/09/login-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>PIN Code screens (on the left in Registration flow, on the right in Login Flow)</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/cities-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/cities-done.png 600w, https://stefan-majiros.com/content/images/2021/09/cities-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/city-detail-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/city-detail-done.png 600w, https://stefan-majiros.com/content/images/2021/09/city-detail-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Browsing Cities and Posts</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/profile-screen-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/profile-screen-done.png 600w, https://stefan-majiros.com/content/images/2021/09/profile-screen-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/friendship-request-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/friendship-request-done.png 600w, https://stefan-majiros.com/content/images/2021/09/friendship-request-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Profile Screen And Friendship Requests</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/city-detail-map-2.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/city-detail-map-2.png 600w, https://stefan-majiros.com/content/images/2021/09/city-detail-map-2.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/commentsScreen-1-1.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/commentsScreen-1-1.png 600w, https://stefan-majiros.com/content/images/2021/09/commentsScreen-1-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Map View and Comments Screen</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/camera-layout.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/camera-layout.png 600w, https://stefan-majiros.com/content/images/2021/09/camera-layout.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/gallery-done.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/gallery-done.png 600w, https://stefan-majiros.com/content/images/2021/09/gallery-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Camera Layout and Custom Gallery Component</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/chatEmpty2.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/chatEmpty2.png 600w, https://stefan-majiros.com/content/images/2021/09/chatEmpty2.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/chat-citoo.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/chat-citoo.png 600w, https://stefan-majiros.com/content/images/2021/09/chat-citoo.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Chat Example</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/chatDetail.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/chatDetail.png 600w, https://stefan-majiros.com/content/images/2021/09/chatDetail.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/custom-gallery.png" width="1000" height="1000" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/custom-gallery.png 600w, https://stefan-majiros.com/content/images/2021/09/custom-gallery.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Chat With Custom Gallery</figcaption></figure><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/opening-chat.png" width="1200" height="1200" alt="Serverless Social Network w/ React Native, AWS Amplify, and Firebase" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/opening-chat.png 600w, https://stefan-majiros.com/content/images/size/w1000/2021/09/opening-chat.png 1000w, https://stefan-majiros.com/content/images/2021/09/opening-chat.png 1200w" sizes="(min-width: 1200px) 1200px"></div></div></div><figcaption>Opening chat and list of all friends in the app</figcaption></figure><h2 id="project-challenges">Project Challenges</h2><ul><li><strong>Data</strong> <strong>Modeling </strong><em>(when using <strong>serverless NoSQL databases</strong> like Firestore or DynamoDB, it took a little more time to figure out how the data should be modeled or organized properly in order to <strong>maintain elasticity and scalability</strong> of the app)</em></li><li><strong>The Architecture Of The Solution</strong> <em>(data protection, populating Algolia Search Index, exchanging Zoom meetings details were not trivial problems to solve)</em></li><li><strong>Security - </strong>this comes in hand with data modeling, as typically, in such kind of application as Citoo, users prefer to have some data that are:  <strong>private</strong><em> </em>(accessible only for given user), <strong>protected</strong> <em>(so the users e.g. in some group could access it)</em> or <strong>public</strong><em> (in some cases, the part of content could be accessible also to people outside the app</em>). AWS Amplify and Firebase require a different approach to enforce security.</li></ul><hr><h2 id="implemented-features-technical-">Implemented  Features (Technical)</h2><ul><li>Users could upload and browse posts <em>(the post contains text description and either picture or video taken from gallery or device camera)</em></li><li>Posts are uploaded to the city where a user is currently located <em>(using <a href="https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse">reverse geo-coding</a>) </em></li><li>All uploaded posts <strong>could be liked, or commented</strong></li><li><strong>Maps</strong> <strong>Integration</strong> offers additional UI for users to display relevant posts close to their physical location</li><li><strong>Moderation Control</strong>:  all uploaded <strong>content is moderated</strong> using <strong>AWS Rekognition</strong> or <strong>Google Cloud Vision</strong> (<em>if the uploaded data contains nudity, sex, violence, etc. the post will be blurred immediately</em>)</li><li><strong>Generating Thumbnails</strong> of uploaded video posts on the cloud-side using NodeJS</li><li><strong>Multi-Factor Authentication</strong>: User signup w/ email&amp;password or social providers <em>(Apple Sign-in, Google Sign-in) </em>combined with PIN code, FaceID, or TouchID<em> </em>authentication</li><li><strong>Chat</strong> with support for <strong>sharing text, videos &amp; images </strong><em>(from the camera or the gallery)</em><strong> and voice </strong><em>(playing and recording)</em> among users who are friends</li><li><strong>Video Calling</strong>, and <strong>sharing mobile device screens</strong> using Zoom SDK</li><li><strong>Modeling friendship</strong> <em>(sending friend requests, establishing friendship)</em> in order to be able to chat with them</li><li><strong>Algolia search integration</strong> <em>(index as a service) - </em>as DynamoDB and Firestore databases do not offer reliable way for indexes / full-text querying</li><li><strong>Push Notifications</strong></li><li><strong>AWS AppSync</strong> integration (GraphQL service) for <strong>real-time data exchange</strong></li><li><strong>Storybook</strong> is used for 'testing' of components, <strong>development the custom of mobile design system</strong> and easier maintenance of the app in the future, <strong>Jest</strong> for unit testing</li><li>Business logic is implemented with Redux and Redux-Saga</li><li><strong>App Localizations</strong> into English and French</li><li><strong>Lottie Animations</strong></li><li>The support for <strong>multiple environments </strong>and<strong> app variants (dev and prod) </strong>with MS Appcenter CI pipelines.</li><li><strong>Firebase Perfomance,</strong> <strong>Remote Config, Crashlytics </strong>(to add dynamic configuration and track errors in production)</li><li><strong>Build pipelines </strong>in <strong>AppCenter</strong></li></ul><hr><h2 id="estimation-of-price-and-delivery-time">Estimation of Price and Delivery Time</h2><p>The estimates below were created with having a typical 40-hours workweek in the mind. However, working in my own developer studio gives me the <strong>sporadic</strong> <strong>possibility to work more than 40 hours per week</strong> <strong>without asking anybody for permissions</strong>, and if the time to market is really crucial for you, I can even hire an additional freelancer whom I trust to help deliver the app to help your business faster. </p><p>The development studio at <a href="http://localhost:2368/serverless-social-network-mvp-with-aws-amplify-and-firebase/stefan-majiros.com">stefan-majiros.com </a>could deliver a similar app<strong> with custom relationships between data</strong>)<strong> starting from 20k EUR, ending somewhere around 45k EUR </strong>(based on further complexity or additional features).</p><p>Regarding time, a similar app could be developed in the time range from <strong>40 to 82 man-days </strong>(starting from scratch, creating a design,  Storybook components, modeling data structures with security in mind, and finishing development with submitting in the stores). If you do not plan to use custom data structures or model other complicated relationships (you want a "clone" of Citoo), a similar production-grade<strong> </strong>app could be shipped <strong>under</strong> <strong>30 man-days to help your business.</strong></p><p>Saying in calendar months, if you are not interested man-days, the total development time for similar app for iOS and Android could be in the range of <strong>2 to 4 calendar months.</strong></p>]]></content:encoded></item><item><title><![CDATA[Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)]]></title><description><![CDATA[Kaf.y is e-commerce mobile app, through which users could buy their favourite coffee and schedule automatic coffee subscriptions. The app is aimed at digital nomads who found themselves in a city where staff in shops does not speak English.]]></description><link>https://stefan-majiros.com/mobile-portfolio-projects/mobile-e-commerce-app-with-stripe-and-strapi-cms/</link><guid isPermaLink="false">6129ff54d3764937a87e21b0</guid><category><![CDATA[cms]]></category><category><![CDATA[strapi]]></category><category><![CDATA[stripe]]></category><category><![CDATA[online-payments]]></category><category><![CDATA[graphql]]></category><category><![CDATA[branded-design]]></category><category><![CDATA[coffee subscriptions]]></category><category><![CDATA[small-business]]></category><category><![CDATA[subscriptions]]></category><dc:creator><![CDATA[Stefan Majiros]]></dc:creator><pubDate>Mon, 16 Aug 2021 16:30:06 GMT</pubDate><media:content url="https://stefan-majiros.com/content/images/2021/08/kavybackground-done-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://stefan-majiros.com/content/images/2021/08/kavybackground-done-1.png" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)"><p>Kaf.y is an e-commerce mobile app, through which users could <strong>buy their favorite coffee</strong> and <strong>schedule automatic coffee orders</strong> (setup coffee-subscriptions). The app is aimed at digital nomads who found themselves in a city where staff in shops does not speak English. The app design was heavily inspired by local a coffee shop in Barcelona.</p><p></p><p><strong>I was responsible for market research, UI / UX design, and mobile development</strong>. You can find design, features, challenges, and price estimation below.</p><hr><h2 id="main-business-requirements">Main Business Requirements</h2><ul><li><strong>Ordering coffee, and scheduling pickups at the shops</strong></li><li><strong>Integration with Strapi CMS</strong></li><li><strong>Accepting online payments (one-time payments and subscriptions) using Stripe</strong></li></ul><h2 id="design">Design</h2><h3 id="existing-brand-local-coffee-shop-in-barcelona">Existing Brand - Local Coffee Shop In Barcelona</h3><p>In the freelance studio at stefan-majiros.com, I always make sure to start working on a mobile app by creating high fidelity <strong>mobile design</strong> using Figma. Then and only then, after the design is approved from the client side, I will transform it into code using <strong>Storybook</strong> <strong>components</strong>. See the outcomes below:</p><p></p><h3 id="onboarding">Onboarding</h3><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/onboarding1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/onboarding1.png 600w, https://stefan-majiros.com/content/images/2021/09/onboarding1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/onboarding2.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/onboarding2.png 600w, https://stefan-majiros.com/content/images/2021/09/onboarding2.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Onboarding part 1.</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/onboarding3.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/onboarding3.png 600w, https://stefan-majiros.com/content/images/2021/09/onboarding3.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/onboarding4.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/onboarding4.png 600w, https://stefan-majiros.com/content/images/2021/09/onboarding4.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Onboarding part 2.</figcaption></figure><h3 id="coffee-list-and-detail">Coffee List and Detail</h3><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/cafe10.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/cafe10.png 600w, https://stefan-majiros.com/content/images/2021/09/cafe10.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/kafy3v2-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/kafy3v2-1.png 600w, https://stefan-majiros.com/content/images/2021/09/kafy3v2-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Coffee List and Detail</figcaption></figure><h3 id="auto-ordering">Auto Ordering</h3><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/kafy1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/kafy1.png 600w, https://stefan-majiros.com/content/images/2021/09/kafy1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/cafee6.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/cafee6.png 600w, https://stefan-majiros.com/content/images/2021/09/cafee6.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Onboarding for Bluepass Mobile App</figcaption></figure><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autorder1-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autorder1-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autorder1-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autoOrder2-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autoOrder2-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autoOrder2-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autoOrder3-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autoOrder3-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autoOrder3-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autoOrder3v2-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autoOrder3v2-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autoOrder3v2-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Coffee Auto Order Flow, part 1</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autoroder4-1-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autoroder4-1-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autoroder4-1-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/autoorder5-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/autoorder5-1.png 600w, https://stefan-majiros.com/content/images/2021/09/autoorder5-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Auto Order - Last Steps</figcaption></figure><h3 id="shopping-cart">Shopping Cart</h3><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/coffee.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/coffee.png 600w, https://stefan-majiros.com/content/images/2021/09/coffee.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/kavy4v2-1.png" width="1000" height="1000" alt="Mobile E-commerce App With Stripe Payments and GraphQL CMS (Strapi)" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/kavy4v2-1.png 600w, https://stefan-majiros.com/content/images/2021/09/kavy4v2-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Empty States, and Shopping Cart</figcaption></figure><h2 id="project-challenges">Project Challenges</h2><ul><li>Integration of Stripe payments (but thanks to their excellent docs, it was not such a big challenge)</li><li>Data modelling in Strapi </li><li>Authentication in Strapi</li></ul><hr><h2 id="implemented-features-technical-">Implemented  Features (Technical)</h2><ul><li>Strapi CMS integration using GraphQL</li><li>Modeling data in Strapi dashboard so client would be able to update or add new products</li><li>Processing payments with Stripe and serverless Lambda functions hosted at </li><li>The app uses PIN code / FaceID / TouchID (<strong>biometrics</strong>) <strong>authentication</strong></li><li><strong>Storybook</strong> is used for 'testing' of components, <strong>development custom of the mobile design system</strong> and easier maintenance of the app in the future, <strong>Jest</strong> for unit testing</li><li>The support for <strong>multiple environments </strong>and<strong> app variants (dev and prod) </strong>with MS Appcenter CI pipelines.</li><li><strong>Firebase Crashlytics </strong>(to add dynamic configuration and track errors in production)</li><li><strong>Localization</strong> into almost 100 languages</li><li><strong>Units tests </strong>with 70% code coverage<strong>,</strong></li><li><strong>Redux-Saga</strong> and <strong>Redux</strong></li></ul><hr><h2 id="estimation-of-price-and-delivery-time">Estimation of Price and Delivery Time</h2><p>The development studio at <a href="https://www.stefan-majiros.com">stefan-majiros.com </a>could deliver a similar app<strong> starting from 20k EUR</strong>.</p><p>Working in my own developer studio gives me the <strong>possibility to work more than 40 hours per week</strong> without asking anybody for permission, and if the time to the market is really crucial for you, I can even hire an additional freelancer whom I trust to help deliver the app to help your business faster.</p><p>A similar app could be developed in the time range from <strong>20 to 42 man-days </strong>(starting from scratch, creating a design, writing Storybook components, proceeding to the iterative development, and finishing with submission in stores). If you do not plan to use now-well-known standards like CBOR or use any very custom features, a similar production-grade<strong> </strong>app could be shipped <strong>under</strong> <strong>30 man-days.</strong></p><p>Saying in normal months, if you are interested in normal months and not man-days, the total development time for the similar app for iOS and Android could be in the range of <strong>1 to 2.5 calendar months.</strong></p>]]></content:encoded></item><item><title><![CDATA[Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner]]></title><description><![CDATA[Bluepass is open-source, enterprise-grade mobile app built with React Native in order to scan, verify and store EU Covid Travel Certificates that are also known in some EU countries as Greenpass. ]]></description><link>https://stefan-majiros.com/mobile-portfolio-projects/bluepass-eu-covid-travel-certificate-scanner/</link><guid isPermaLink="false">6129ff54d3764937a87e21af</guid><category><![CDATA[eu-standards]]></category><category><![CDATA[greenpass]]></category><category><![CDATA[covid-travel-certificate]]></category><category><![CDATA[cbor]]></category><category><![CDATA[cwt]]></category><category><![CDATA[crypto-certificates]]></category><category><![CDATA[jsonschema]]></category><category><![CDATA[jsonlogic]]></category><category><![CDATA[international-standards]]></category><category><![CDATA[enterprise-ready]]></category><dc:creator><![CDATA[Stefan Majiros]]></dc:creator><pubDate>Wed, 11 Aug 2021 17:35:09 GMT</pubDate><media:content url="https://stefan-majiros.com/content/images/2021/08/bluepass-background-hero-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://stefan-majiros.com/content/images/2021/08/bluepass-background-hero-1.png" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner"><p>Bluepass is an open-source, enterprise-grade mobile app built with React Native in order to scan, verify and store EU Covid Travel Certificates that are also known in some EU countries as <strong>Greenpasses</strong>.<strong> </strong></p><p>The app was developed in accordance with international EU and health standards and<strong> I was responsible for market research, UI / UX design, and mobile development</strong>. Take a look at its design, features, challenges, documentation website and price estimation below.</p><p></p><hr><h2 id="main-business-requirements">Main Business Requirements</h2><ul><li><strong>Scanning</strong> and <strong>verification</strong> of  EU Covid Travel Certificates (in QR format) using device <strong>camera</strong> and from images in the device <strong>gallery</strong></li><li><strong>Storing</strong> verified certificates in <strong>encrypted</strong> form, on the device, and behind <strong>authentication</strong></li><li><strong>Management of cryptographic keys</strong> used for signing and verification of travel certificates (each travel certificate is "signed" with JWT-like standard (CWT) where cryptographic certificates (.DER) are used in order to verify the integrity of travel certificates easier)</li></ul><h2 id="design">Design</h2><p>Before development started, I had created high fidelity <strong>mobile design</strong> using Figma. Then I transformed this design into code using <strong>Storybook</strong> <strong>components</strong>. See the outcomes below:</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/intro1-2.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/intro1-2.png 600w, https://stefan-majiros.com/content/images/2021/09/intro1-2.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/intro2-1.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/intro2-1.png 600w, https://stefan-majiros.com/content/images/2021/09/intro2-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Onboarding part 1</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/intro3-1.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/intro3-1.png 600w, https://stefan-majiros.com/content/images/2021/09/intro3-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/intro-finished-1.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/intro-finished-1.png 600w, https://stefan-majiros.com/content/images/2021/09/intro-finished-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Onboarding part2.</figcaption></figure><h3 id="bluepass-screenshots-of-mobile-design">Bluepass - Screenshots of Mobile Design</h3><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/certificates-empty.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/certificates-empty.png 600w, https://stefan-majiros.com/content/images/2021/09/certificates-empty.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/certificates-list.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/certificates-list.png 600w, https://stefan-majiros.com/content/images/2021/09/certificates-list.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Travel Certificates Lists</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/certificate-valid.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/certificate-valid.png 600w, https://stefan-majiros.com/content/images/2021/09/certificate-valid.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/CertificateNotValid.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/CertificateNotValid.png 600w, https://stefan-majiros.com/content/images/2021/09/CertificateNotValid.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Verification Outcomes</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/certificate-detail.png" width="1200" height="1200" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/certificate-detail.png 600w, https://stefan-majiros.com/content/images/size/w1000/2021/09/certificate-detail.png 1000w, https://stefan-majiros.com/content/images/2021/09/certificate-detail.png 1200w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/certificate-detail2.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/certificate-detail2.png 600w, https://stefan-majiros.com/content/images/2021/09/certificate-detail2.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Stored Certificate Detail</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/keys-empty.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/keys-empty.png 600w, https://stefan-majiros.com/content/images/2021/09/keys-empty.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/keys-list.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/keys-list.png 600w, https://stefan-majiros.com/content/images/2021/09/keys-list.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Public Keys List</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/key-detail.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/key-detail.png 600w, https://stefan-majiros.com/content/images/2021/09/key-detail.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/pop-up.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/pop-up.png 600w, https://stefan-majiros.com/content/images/2021/09/pop-up.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Expired Key Detail and Verification Popup</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/settings-1.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/settings-1.png 600w, https://stefan-majiros.com/content/images/2021/09/settings-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/settings2.png" width="1000" height="1000" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/settings2.png 600w, https://stefan-majiros.com/content/images/2021/09/settings2.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Bluepass - Settings</figcaption></figure><h2 id="project-challenges">Project Challenges</h2><ul><li>The biggest challenge was dealing with data in <strong>CBOR</strong> format, studying <strong>EU specifications and standards</strong>, and finding (or implementing)  <strong>libraries</strong> that work in React Native environment. </li><li>Then, considerable effort was spent to <strong>reduce startup time</strong> <strong>on Android </strong>(<strong>from 6s to 2s</strong>) as we used Hermes non-compatible libraries (<em>Note: When enabled, Hermes promise to reduce startup time without manual interventions to the code base</em>).</li><li>I also needed to develop few <strong>Native modules </strong>in order to parse cryptographic certificates, and <strong>create the forked version of the library</strong> that detects QR code in gallery images using Google Vision (<em>in Android, embedded ZXing scanner does not work reliably and fast enough - it took more than 15s to detect QR</em>). By using<strong> </strong>Google Vision SDK, detection of QR in the gallery image is done immediately.</li></ul><p><em>The verification flow of issued EU Covid Travel Certificates consisted of several steps that included <strong>jsonSchema</strong> verification, <strong>jsonLogic</strong> validation, (expiry and issue) <strong>dates</strong> validation, and <strong>cryptographic verification</strong> of signatures.</em></p><hr><h2 id="implemented-features-technical-">Implemented  Features (Technical)</h2><ul><li>Considerable effort was spent on studying standards and finding <strong>libraries</strong> to implement travel certificate <strong>verification</strong> in accordance with EU standards: <strong>CBOR, ZLIB, base45, COSE, base64, jsonSchema, jsonLogic, ASN</strong></li><li><strong>Native Modules Integration</strong> (in Kotlin and Swift) for the validation of crypto signatures of issued certificates and their dates</li><li>The data from verified QR travel certificates are stored in an <strong>encrypted</strong> <strong>database</strong>, credentials in Keychain</li><li>The app uses PIN code / FaceID / TouchID (<strong>biometrics</strong>) <strong>authentication</strong></li><li><strong>Storybook</strong> is used for 'testing' of components, and the <strong>development of custom mobile design system</strong> and easier maintenance of the app in the future, <strong>Jest</strong> for unit testing, <strong>Cavy</strong> for <strong>E2E</strong> tests</li><li>Redux was not used, instead, I tried<strong> easy-peasy library</strong> (less verbose, Redux compatible library)</li><li>The support for <strong>multiple environments </strong>and<strong> app variants (dev and prod) </strong>with MS Appcenter CI pipelines. The Bluepass is also <strong>AWS-Amplify ready </strong>(<em>I integrated Lambda functions first in multiple AWS Amplify environments, but later after considerations - as they are no real "secrets and all health data stay on the device all the time - I decided to host some configuration data publicly in S3 for simplicity and easier management.</em></li><li><strong>Husky (Githooks)</strong> to force linting of source-code files before the push to the remote repository, and <strong>patch-package</strong> for dealing with bugs in open-source libs</li><li>Added Swagger client into React Native for official API support</li><li><strong>Firebase</strong> <strong>Remote Config and Crashlytics </strong>(to add dynamic configuration and track errors in production)</li><li><strong>Integrated Google Vision</strong> to detect QRs on gallery images</li><li><strong>Optimized startup time</strong> using <strong>RAM bundle</strong> - reduced <strong>from 6s to 2s</strong></li><li><strong>Stores deployment</strong> (private testing in Google Play and Appstore Testflight)</li><li><strong>Localization</strong> into almost 100 languages</li><li><strong>Units tests </strong>with 70% code coverage<strong>,</strong></li><li><strong>E2E tests using Cavy</strong> executed at CI at the <strong>nightly</strong> basis</li></ul><hr><p>If you prefer to see the app in action, see this video: </p><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="356" height="200" src="https://www.youtube.com/embed/xuy82WLOeQ8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><figcaption>Bluepass - (Greenpass Scanner) Promo Video / Voiceover</figcaption></figure><hr><h2 id="-documentation-website">+ Documentation website </h2><p>The documentation website was also part of the delivery and was built using Docusaurus, deployed at Vercel, and currently is deployed live at this URL: <a href="https://blue-pass19.vercel.app/"><strong>https://blue-pass19.vercel.app/</strong></a>.<strong> </strong>It explains app features for technical people and developers, demonstrates some code patterns, and also contains QR Codes that were used for testing.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-15-at-4.28.05-PM.png" class="kg-image" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/Screen-Shot-2021-08-15-at-4.28.05-PM.png 600w, https://stefan-majiros.com/content/images/size/w1000/2021/09/Screen-Shot-2021-08-15-at-4.28.05-PM.png 1000w, https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-15-at-4.28.05-PM.png 1484w" sizes="(min-width: 1200px) 1200px"><figcaption>Bluepass QR Scanner (Greenpass alternative) Docs Welcome Page</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.09-PM.png" width="1000" height="596" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/Screen-Shot-2021-08-16-at-2.12.09-PM.png 600w, https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.09-PM.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.17-PM.png" width="1000" height="596" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/Screen-Shot-2021-08-16-at-2.12.17-PM.png 600w, https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.17-PM.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.41-PM.png" width="1000" height="596" alt="Bluepass, Greenpass - Open-source EU Covid Travel Certificate QR Scanner" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/Screen-Shot-2021-08-16-at-2.12.41-PM.png 600w, https://stefan-majiros.com/content/images/2021/09/Screen-Shot-2021-08-16-at-2.12.41-PM.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Documentation website</figcaption></figure><h2 id="estimation-of-price-and-delivery-time">Estimation of Price and Delivery Time</h2><p>If you are looking to build a similar app with me or any other freelancer, the price will be typically several thousand less than 140k. The development studio at stefan-majiros.com could deliver a similar app<strong> </strong>(that uses not-so-well widespread standards with integration of 3rd party native modules)<strong> starting from 20k EUR</strong>.</p><blockquote><em>Slovakia government paid for a couple of Greenpass apps with very similar features reportedly over <strong>140k EUR</strong>. However, they used the team of several developers, and they also added features that integrated government RESTful API.</em></blockquote><p>Working in my own developer studio gives me the <strong>possibility to work more than 40 hours per week</strong> without asking anybody for permission, and if the time to market is really crucial for you, I can even hire an additional freelancer whom I trust to help deliver the app to help your business faster.</p><p>A similar app could be developed in the time range from <strong>20 to 42 man-days </strong>(starting from scratch, creating the design,  Storybook components, <strong>studying new standards</strong>, and finishing development with submitting in the stores). If you do not plan to use now-well-known standards like CBOR or use any very custom features, the similar production-grade<strong> </strong>app could be shipped <strong>under</strong> <strong>30 man-days.</strong></p><p>Saying in normal months, if you are interested in normal months and not man-days, the total development time for a similar app for iOS and Android could be in the range of <strong>1 to 2.5 calendar months.</strong></p>]]></content:encoded></item><item><title><![CDATA[Mobile STU-dent: Mobile app to access university resources and make student's life easier]]></title><description><![CDATA[Mobile STU-dent is the MVP mobile application that makes life easier for university students at STU. Offers mail integration, displaying schedules and news.]]></description><link>https://stefan-majiros.com/mobile-portfolio-projects/mobile-student-mobile-mvp-app-for-uni-students/</link><guid isPermaLink="false">6129ff54d3764937a87e21ab</guid><category><![CDATA[university]]></category><category><![CDATA[re-design]]></category><category><![CDATA[backend-development]]></category><category><![CDATA[built-upon-legacy-system]]></category><category><![CDATA[ldap-integration]]></category><category><![CDATA[market-research]]></category><dc:creator><![CDATA[Stefan Majiros]]></dc:creator><pubDate>Thu, 17 Dec 2020 23:03:10 GMT</pubDate><media:content url="https://stefan-majiros.com/content/images/2021/08/mobile-student-hero-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://stefan-majiros.com/content/images/2021/08/mobile-student-hero-2.png" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier"><p>Mobile STU-dent is the <strong>MVP</strong> (<strong>minimal viable product</strong>) of a cross-platform mobile application for STU (Slovak University of Technology) and its students.</p><p>At <a href="https://www.stuba.sk/">STU,</a> no mobile application was available at that time, so enrolled students were forced to use a mobile-unfriendly website called AIS (Academic Information System) to access data like grades, etc.</p><p></p><p>In order to create a mobile application, I needed to <strong>design</strong> and <strong>build a RESTful API</strong> that integrated various data sources (the developed API had both the <strong>public</strong> and the <strong>private</strong>/secured parts). Also, as the AIS itself had no official APIs documentation, nor any public APIs, everything needed to be analyzed, almost reverse-engineered, and developed<em>.</em> </p><p><strong>I was responsible for market research, solution architecture, UI / UX design, and software development</strong> at the client and the server side (in that time, I worked as a backend + mobile developer).  After the development of a fully functional MVP, the project was stopped due to unrelated reasons (the lack of resources).</p><p>Take a look at market research, its design, features, challenges, and price estimation below.</p><hr><h2 id="main-business-requirements">Main Business Requirements</h2><ul><li><strong>LDAP integration:</strong> Users could use existing credentials  for sign up and login</li><li><strong>Building and architecting API  </strong>(In order to develop mobile application, I had to design, implement and document a proprietary API)</li><li><strong>Displaying news from the faculty (organization-like) public websites</strong></li><li><strong>Displaying news from the auth-walled AIS (</strong><em>AIS (Academical Information System) was the main source of the data for the mobile app. It had no public APIs, no public documentation.)</em></li><li><strong>Mails integration </strong><em>(Each student at STU gets access to 2 mailboxes - first mailbox is accessible only from internal network, and supports only POP3, and the second mailbox can be used for receiving emails from public using IMAP</em></li><li><strong>Browsing schedule, completed subjects, grades, syllabus previewer</strong></li><li><strong>Browsing personal profile details</strong></li></ul><h2 id="market-research">Market research</h2><p>Before I started working on design, I created a short, but effective questionnaire as a part of market research. Then with small help from people working at the university, I distributed it to almost 1200 future users of the app / students aged 18-25.</p><p>By getting over 1200 responses, we got a really good insight into what users expect, and what features should be shipped when. 96% of the asked students responded, that <strong>they would install the app</strong> as they <strong>prefer to use a mobile</strong> phone to access these resources (55% of asked students uses prefer to use mobile instead of web portal). The <strong>connection price is not much important</strong> for them (the students equally used the Wifi and cellular data connection).</p><p>Regarding<strong> retention rate</strong>, almost 60% of users visit AIS every day. When asking about <strong>crowdfunding</strong>, 70% responded that it is the role of the university, not for the students. Last, but not least, having fancy design(8%) lost against having <strong>plenty of functionality</strong> (53%).</p><blockquote><em>By asking a similar questionnaire, the road to deliver a successful mobile app is clearer, and more importantly, you can see what features are needed for your business, while backed by real-world data.</em></blockquote><p>96% of responders wanted to display the content from the AIS, public faculty websites, and see information about their accommodation. However, some of the students replied, that they also wanted to see what will be for the lunch in the restaurants nearby, use built-in events-reminder,  even in-app messaging, notifications about canceled class, etc. Some students used other communication channels in their faculties - Facebook, faculty public websites (that are mostly in each faculty domain), or Slack.</p><p>With a limited time span (<strong>4 months</strong>), it simply was not possible to develop all the features that users wanted on my own and therefore I had to prioritize and re-evaluate all requirements. It seemed more realistic to onboard more developers to implement the next features right after the successful lunch of MVP.</p><h2 id="design">Design</h2><p>There were two versions of design for the app: below, you are looking at final version that was created after shortly after the work on project  was suspended:</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/launch-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/launch-done.png 600w, https://stefan-majiros.com/content/images/2021/09/launch-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/siggnIn1.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/siggnIn1.png 600w, https://stefan-majiros.com/content/images/2021/09/siggnIn1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Sign in flow</figcaption></figure><p>    </p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/signin-step2-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/signin-step2-done.png 600w, https://stefan-majiros.com/content/images/2021/09/signin-step2-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/signin-step3.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/signin-step3.png 600w, https://stefan-majiros.com/content/images/2021/09/signin-step3.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Sign in flow</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/home-refactored-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/home-refactored-done.png 600w, https://stefan-majiros.com/content/images/2021/09/home-refactored-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/homecreen2.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/homecreen2.png 600w, https://stefan-majiros.com/content/images/2021/09/homecreen2.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Home Screen</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/news-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/news-done.png 600w, https://stefan-majiros.com/content/images/2021/09/news-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/news-archive.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/news-archive.png 600w, https://stefan-majiros.com/content/images/2021/09/news-archive.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>News, and Archived News</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/mails-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/mails-done.png 600w, https://stefan-majiros.com/content/images/2021/09/mails-done.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/mail-reply-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/mail-reply-done.png 600w, https://stefan-majiros.com/content/images/2021/09/mail-reply-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Mails for 2 inboxes and Mail Detail</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/news-webview-done-1.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/news-webview-done-1.png 600w, https://stefan-majiros.com/content/images/2021/09/news-webview-done-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/WriteNewMail-done-1.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/WriteNewMail-done-1.png 600w, https://stefan-majiros.com/content/images/2021/09/WriteNewMail-done-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>News Detail (in Webview) and New Mail Screen</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/subjects-initial.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/subjects-initial.png 600w, https://stefan-majiros.com/content/images/2021/09/subjects-initial.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/no-grades-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/no-grades-done.png 600w, https://stefan-majiros.com/content/images/2021/09/no-grades-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Subjects Screens</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/subject-end2.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/subject-end2.png 600w, https://stefan-majiros.com/content/images/2021/09/subject-end2.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/schedulefinder-done.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/schedulefinder-done.png 600w, https://stefan-majiros.com/content/images/2021/09/schedulefinder-done.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p></p><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/edit-favourite-people.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/edit-favourite-people.png 600w, https://stefan-majiros.com/content/images/2021/09/edit-favourite-people.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/favourite-people-1.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/favourite-people-1.png 600w, https://stefan-majiros.com/content/images/2021/09/favourite-people-1.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>People and Favorite people</figcaption></figure><p></p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/people-search-1.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/people-search-1.png 600w, https://stefan-majiros.com/content/images/2021/09/people-search-1.png 1000w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://stefan-majiros.com/content/images/2021/09/person-detail.png" width="1000" height="1000" alt="Mobile STU-dent: Mobile app to access university resources and make student's life easier" srcset="https://stefan-majiros.com/content/images/size/w600/2021/09/person-detail.png 600w, https://stefan-majiros.com/content/images/2021/09/person-detail.png 1000w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>People Search and Profile Detail</figcaption></figure><p></p><h2 id="project-challenges">Project challenges</h2><ul><li>The biggest challenge in this project was <strong>analyzing</strong> the internals and the API of the legacy system without any documentation</li><li>Then, quite a lot of effort was spent on<strong> mail retrieval</strong> (studying POP3 and IMAP protocols specifics)</li><li><strong>Management &amp; Planning</strong> (prioritizing features and managing time was not always easy)</li></ul><h2 id="implemented-features-technical-">Implemented Features (Technical)</h2><h3 id="server-side">Server-side </h3><ul><li>Spring Boot Web App with retrieving e-mails using<strong> Java Mail</strong> library</li><li>Websites parsing using <strong>jsoup</strong> library</li><li>Implementation of <strong>HTTP Basic</strong> Authentication with <strong>LDAP</strong> Integration</li></ul><h3 id="client-side-mobile-">Client-side (Mobile)</h3><ul><li>Redux, Redux-Persist, Reselect</li><li>The data are stored on-device in an <strong><strong>encrypted</strong> <strong>database</strong></strong>, credentials in Keychain</li><li>Swagger (OpenAPI) client integration</li><li>Webview integration (embedded web browser)</li><li>Email/password authentication using existing credentials</li></ul><h2 id="estimation-of-price-and-delivery">Estimation of Price and Delivery</h2><p>Regarding mobile app estimate, a similar application could be shipped under <strong>35 man-days</strong> (if the design is provided in advance). </p><p>Although the app does not use any complex business flows or integrates native libraries, the proper implementation of design takes some time.  When hiring additional freelancer, delivery time could be reduced drastically in this case - it would take about <strong>20 man-days</strong> to ship a similar app with me and and additional freelancer, as in this kind of app, the most of time would take the implementation of UI, which could be easily run in parallel.</p><p>The mobile and serverless freelance studio at <a href="http://localhost:2368/mobile-student/stefan-majiros.com">stefan-majiros.com</a> could deliver the similar mobile app for Android and iOS within the total price starting at <strong>12K EUR</strong> (the final price depends on the complexity of features, and design, time pressure, etc.).</p>]]></content:encoded></item></channel></rss>