# Bright Inventions > A leading digital product agency in Poland. > From mobile apps and complex backend systems to emerging technology solutions, we create success stories for startups, consultancy agencies, and mid-size organisations across industries including FinTech, Blockchain, HealthTech, Retail, Logistics and more. ## Services - [MVP Development Agency](https://brightinventions.pl/our-areas/mvp-development/index.md): Since 2012 we have developed MVPs for clients from the UK, Germany, Israel and more. We build MVPs for startups, corpora - [Agile Workshops for Teams](https://brightinventions.pl/our-areas/agile-workshops/index.md): Since 2012 we have developed over 50 software solutions with Agile methodology. We provide Agile training for businesses - [Bluetooth Development](https://brightinventions.pl/our-areas/bluetooth-development/index.md): We are a digital products agency based in Poland. Our Android & iOS teams specialize in Bluetooth Low Energy and iBeacon - [AI Solutions](https://brightinventions.pl/our-areas/ai-software-development/index.md): As a digital products agency, we build secure AI solutions. From generative AI & machine learning to prompt engineering, - [Application modernization](https://brightinventions.pl/our-areas/app-modernization/index.md): We transform legacy systems into modern, scalable, and efficient applications. - [Blockchain Solutions](https://brightinventions.pl/our-areas/blockchain/index.md): We are a digital products agency from Poland. We specialise in building blockchain solutions based on Ethereum and Subst - [Cloud Computing Services](https://brightinventions.pl/our-areas/cloud-services/index.md): We are a digital products agency from Poland offering cloud services based on AWS. We assist clients with cloud migratio - [Custom Software Development](https://brightinventions.pl/our-areas/custom-software-development/index.md): We are a digital products agency from Poland. Since 2012 we have developed custom applications for clients from the UK, - [Custom Asset Tracking](https://brightinventions.pl/our-areas/asset-tracking/index.md): Poland-based digital products agency creating tailored solutions for businesses that outgrow off-the-shelf software. Let - [Best Digital Product Studio in Gdańsk](https://brightinventions.pl/our-areas/gdansk-digital-product-agency/index.md): Meet a leading digital product agency in Gdańsk (Poland). Bright Inventions is a digital product agency crafting custom - [Healthcare Technology Consulting](https://brightinventions.pl/our-areas/healthcare-software-development/index.md): Since 2012, we’ve built cutting-edge HealthTech solutions for clients in the UK, Germany, Israel & beyond. Work with a d - [IoT Solutions](https://brightinventions.pl/our-areas/iot-development/index.md): As a digital products agency, we offer IoT application development and IoT integration services in the UK and the USA. C - [Mobile App Development](https://brightinventions.pl/our-areas/mobile-app-development/index.md): We are a digital products agency from Poland. We specialise in building native apps for iOS and Android. Looking for app - [MVP Entwicklung](https://brightinventions.pl/our-areas/mvp-entwicklung-agentur/index.md): Seit 2012 entwickeln wir MVPs für Startups, Unternehmen und Agenturen in Deutschland, Großbritannien, Israel. Kontaktier - [Customized food delivery integration for your POS](https://brightinventions.pl/our-areas/food-delivery-pos-integration/index.md): POS integration with Uber Eats, Wolt, Just Eat Takeaway (and more) tailored to your point of sale system. - [Product workshops for business](https://brightinventions.pl/our-areas/product-workshops/index.md): Since 2012 we have built software for over 40 businesses. At product workshops we will establish a product development p - [POS Software Development](https://brightinventions.pl/our-areas/pos-software-development/index.md): A digital products agency offering POS software development services since 2012. Building, scaling and modernizing custo - [Product Design Services](https://brightinventions.pl/our-areas/product-design/index.md): We are a digital products agency specialising in product design. We prepare prototypes of app and web solutions and deli - [Your App Deserves the Best](https://brightinventions.pl/our-areas/welcome-back/index.md): From HealthTech, IoT, POS, and Fintech – we turn ideas into robust digital solutions. - [Custom Uber Eats and POS Integrations](https://brightinventions.pl/our-areas/uber-eats-pos-integration/index.md): Uber Eats and POS (Point-of-Sale) Integration for hospitality. - [Building Software Aligned with Zebra Technologies](https://brightinventions.pl/our-areas/zebra-technologies-integrations/index.md): Track Everything with Custom Software Aligned to Zebra Technologies - [Web Development Services](https://brightinventions.pl/our-areas/web-development/index.md): We are a digital products agency from Poland. We build web apps, web services and websites for clients from the USA, UK, ## Projects - [Supporting People with Parkinson's Disease – MVP story ](https://brightinventions.pl/projects/solution-for-parkinsons-patients/index.md): From the idea to the patient engagement solution in 3 months. Discover the journey of an eHealth MVP crafted to engage i - [AirHelp's Flight Compensation Checker – From Concept to MVP](https://brightinventions.pl/projects/airhelp/index.md): AirHelp iOS mobile application lets you check if your flight is eligible for compensation and guides you through the who - [Emergency Services Accessible to People with Hearing Loss [Confidential Project]](https://brightinventions.pl/projects/emergency-contact-app/index.md): The American emergency dispatch system, established in the 1960s, originally relied on landlines and still doesn't suppo - [Boosting User Acquisition with App Clip & Instant App for Relevo – a Food Take-Away and Delivery App](https://brightinventions.pl/projects/app-clips-instant-apps-solution/index.md): Overcoming user hesitancy towards installing new applications is a crucial challenge in today's competitive market. Disc - [Breaking Free from High Fees: Restaurant Delivery Drivers App](https://brightinventions.pl/projects/delivery-drivers-app/index.md): While food delivery platforms offer convenience, they come with high commission fees for restaurant owners. What if ther - [Managing Substrate Treasury Proposals – Web3Foundation App Development](https://brightinventions.pl/projects/bright-treasury/index.md): Bright Inventions’s original solution. A web app supporting Substrate Blockchain networks: Polkadot and Kusama in upload - [Solving Problems with Printer Integrations in a Global POS System – Just Eat POS Case Study](https://brightinventions.pl/projects/pos-devices-integration/index.md): From label printers to kitchen thermal printers, payment terminals, and tablets – restaurant staff has to operate more d - [Breaking Status Quo in Restaurants with Kitchen Display System](https://brightinventions.pl/projects/kitchen-display-system/index.md): Can technology change the status quo? The Kitchen Display System developed for the Israeli startup Practi stands as a pr - [Circles secures $16.5M in Series A and Emerges as Leading Group Support App](https://brightinventions.pl/projects/online-group-support/index.md): Circles is an online group therapy application connecting individuals seeking emotional support. As a mental health tech - [Building IoT-Based Water Quality Monitoring System for Fish Transportation](https://brightinventions.pl/projects/water-quality-monitoring/index.md): Maintaining food product quality isn’t just about logistics — it’s about trust and the right technology behind it. This - [Crafting Stress-Free and Secure POS Bill Splitting for Restaurants](https://brightinventions.pl/projects/pos-bill-splitting/index.md): Bill splitting is a convenient way to share the cost for diners. Yet for waitstaff, it can be a source of stress, partic - [CryptoAtlas: User-Driven Development in the Cryptocurrency World](https://brightinventions.pl/projects/cryptocurrency-platfrom/index.md): CryptoAtlas is a social platform connecting people passionate about cryptocurrency. The first and only place where you c - [Cutting Waste in Healthcare: Building a Custom Hospital Asset Tracking Solution](https://brightinventions.pl/projects/hospital-asset-tracking/index.md): Our client, a provider of inventory tracking solutions, saw an opportunity to bring more clarity to hospital operations. - [Digitilized Invoicing: Hassle-Free Invoices for Restaurants ](https://brightinventions.pl/projects/invoice-generation-system/index.md): Hundreds of invoices easily generated without any disturbances and limits. This is the reality our client envisioned, ai - [Codeforia: Empowering the Next Generation of Coders with Gamified Learning](https://brightinventions.pl/projects/e-learning-coding-platform/index.md): We all know how crucial programming skills are for this generation and the future. Yet, public school systems still lack - [Optimizing Medicine Distribution for UK Care Homes](https://brightinventions.pl/projects/emar-healthcare-solution/index.md): Nurses are forced to juggle the care of multiple patients, each with unique health profiles, medication plans, and aller - [Turning Smartphones into Terminals with Card Payment App](https://brightinventions.pl/projects/credit-card-reader/index.md): A fintech iOS and Android application that allows businesses to charge credit cards without a payment terminal. - [Driving a 35% Increase in Benefit Card Payments Through Tailored POS Integration](https://brightinventions.pl/projects/pos-integration-benefit-loyalty-cards/index.md): When a fast-growing restaurant chain asked our client, a POS vendor, to support benefit and loyalty cards like Multipass - [Real-Time Location Experience with iBeacon Tech in Housing Market](https://brightinventions.pl/projects/easytapp/index.md): An app that allowed users to receive real estate and car sales’ offers based on their real-time location. - [Elevating the Retail POS: Integrating Tap to Pay for Effortless Transactions](https://brightinventions.pl/projects/tap-to-pay-pos/index.md): It all began with a request from a major global retail client: integrate Tap to Pay (T2P) into their existing iOS and An - [Eliminating Device Clutter with POS and Food Delivery Apps Integration](https://brightinventions.pl/projects/pos-third-party-delivery/index.md): From Uber Eats, Wolt to Just Eat and beyond, managing online orders from multiple food delivery platforms is challenging - [ePOS and RMS](https://brightinventions.pl/projects/epos-and-retail-management-system/index.md): Our service included creating an intelligent point-of-sale application which runs on iPads. The application is widely us - [Faster Labeling Printout with Custom Zebra and Shopify Integrations](https://brightinventions.pl/projects/custom-labeling-printout/index.md): A manual, time-consuming labeling process hindered Boosa & Co, a pet catering company's, e-commerce operations and brand - [Finebite’s Pivot Story: Loyalty App Hits 1M Users with New Reservation Feature](https://brightinventions.pl/projects/everytap/index.md): Finebite app helps to discover the best restaurants in the biggest Polish cities. Finebite originated from a very popula - [Food Delivery iOS App Modernization: SwiftUI & Modern Concurrency Migrations](https://brightinventions.pl/projects/leading-food-delivery-app/index.md): Meet a popular food delivery app and employee benefit in one. Our experienced iOS team quickly enhanced the app’s potent - [From MVP to a Solution Helping People in Asia and Africa](https://brightinventions.pl/projects/card-tracking-system/index.md): Introducing the Card Tracking System, a digital marvel that is not just code but a life-changing force across Asia and A - [Navigating Digital Transformation at Construction Sites: Heinrich Schmid's Doc-Sharing App](https://brightinventions.pl/projects/document-management-apps-construction/index.md): The Heinrich Schmid Group is a distinguished provider of construction services, with a rich history spanning over 110 ye - [Implementing Sygic GPS Navigation into Driver’s Application](https://brightinventions.pl/projects/navigation-driver-app-integration/index.md): Drivers are the lifeblood of any road logistics network. So, when digitalizing operations for a freight forwarding compa - [Retail iOS and Android Apps with Bluetooth Integration – Just Eat POS](https://brightinventions.pl/projects/system-for-restaurants-mobile/index.md): Just Eat POS was a retail system available on iOS and Android used by restaurants in Israel and the UK. We scaled this p - [Legacy Modernization of 30-Year-Old Restaurant POS](https://brightinventions.pl/projects/pos-legacy/index.md): Is it possible to revamp nearly 30-year-old software? Discover how our engineering team redesigned and modernized a rest - [Just Eat POS: From Startup to Global ePOS Provider](https://brightinventions.pl/projects/system-for-restaurants/index.md): Just Eat POS was a retail system used by restaurants in Israel and the UK. We worked on this project for almost a decade - [Lösung für Parkinson-Patienten](https://brightinventions.pl/projects/losung-fur-parkinson-patienten/index.md): Ein persönliches digitales Tagebuch für Parkinson-Patienten. Mit der App können Benutzer Ihre Symptome aufzeichnen und d - [MedKitDoc – The Future of Telemedicine & Remote Care in Germany](https://brightinventions.pl/projects/telehealth-solution/index.md): In a world where older and chronically ill people often find themselves isolated without easy access to healthcare, MedK - [The Future of Physiotherapy: Engaging Patients with Mobile Application](https://brightinventions.pl/projects/mobile-therapy-application/index.md): Physiotherapy holds the transformative power to improve lives, especially during challenging times such as recovery afte - [Software für Messeplanung](https://brightinventions.pl/projects/software-fur-messeplanung/index.md): Eine Messeplanungssoftware, die Art und Weise revolutioniert, wie Unternehmen alle für Branchenveranstaltungen erforderl - [App für Physiotherapie](https://brightinventions.pl/projects/mobile-therapieanwendung/index.md): Eine mobile Anwendung für das Gesundheitswesen, die Patienten bei der Physiotherapie unterstützt. Es bietet Therapeuten - [Optimizing Cycling Training with App Integrated with Wahoo Fitness Devices](https://brightinventions.pl/projects/motivo/index.md): Turbo Training and Indoor Cycling Workouts. The app is your own personal cycling coach. It offers Interactive training p - [Building Reliable Digital Survey Solution with Offline Mode](https://brightinventions.pl/projects/app-digitized-surveys/index.md): A web application that enables digitizing mobile reporting. It helps you to build, with no code, the digitized surveys f - [PituPitu](https://brightinventions.pl/projects/pitupitu/index.md): Pitu Pitu is a popular party app that allows users to find best parties in Polish main cities such as Tricity, Warsaw, C - [ShopScout App: Perfect Mystery Shopper Experience](https://brightinventions.pl/projects/pospulse-shopscout/index.md): A solution for FMCG companies and retail chains for verifying if products are properly displayed on shelves by asking co - [The Story of the Successful Launch of FemTech MVP for Pregnant Women](https://brightinventions.pl/projects/pregnancy-app/index.md): Can technology be emphatic? Dive into the story of an application crafted for expectant mothers, offering personalized n - [Reducing Automotive Production Delays with a Custom Manufacturing Asset Tracking](https://brightinventions.pl/projects/asset-tracking-car-manufacturing/index.md): While scaling a custom asset tracking platform over the past 7 years for our client – a provider of tracking solutions w - [From MVP to 200k Users. Meet Relevo – Sustainable Food Take-Away & Delivery App ](https://brightinventions.pl/projects/eco-friendly-app/index.md): Over 3 million single-use plastic containers have been saved thanks to German startup Relevo. Every reusable container t - [Empowering MHealth System with NHS-Certified Bluetooth Devices](https://brightinventions.pl/projects/remote-patient-monitoring/index.md): The future of healthcare lies in remote medical care. In the system we helped our client build that future is already a - [App fur Schwangere Frauen](https://brightinventions.pl/projects/schwangerschafts-app/index.md): Eine mobile App für das Gesundheitswesen, die schwangere Frauen in jeder Phase ihrer Schwangerschaft und Geburt unterstü - [SmartHelp: Instant Emergency Localization with a Single Click](https://brightinventions.pl/projects/smarthelp/index.md): An emergency service app that allows users to easily call for help and provide authorities with personal information, ex - [Speeding-Up Restaurant Phone Ordering with POS & Caller ID Integration](https://brightinventions.pl/projects/restaurant-pos-caller-id/index.md): From the phone ring to order acceptance in under a minute! Managing restaurant phone orders has always been challenging, - [Digitally Connecting the UK Care Homes](https://brightinventions.pl/projects/vCare/index.md): Behind the story of Camascope, there is a pharmacist who experienced firsthand the challenges care home professionals fa - [Digitalizing Logistics: How We Transformed a Transport Management System](https://brightinventions.pl/projects/transportation-management-system/index.md): The Transport Management System analyses routes, cutting the time from 10-30 seconds to just 3-5 seconds per order, prov - [Transforming Devices into Scalable Trackers for Equipment Tracking for Manufacturing](https://brightinventions.pl/projects/manufacturing-asset-tracking/index.md): Can a lost device actually signal where it is? Yes! That was the breakthrough moment for a major firm in the manufacturi - [Improving User Experience for xpomaker – Trade Fairs Management Software](https://brightinventions.pl/projects/xpomaker/index.md): A trade fair planning software that revolutionizes the way companies prepare and organize all assets needed for industry ## Blog (Recent) - [The Hidden Costs of "Alpha": The Struggle with Compose Screenshot Tests](https://brightinventions.pl/blog/compose-screenshot-test-library/index.md): Some time ago, we decided to integrate the new Compose Screenshot Testing library into our app. Even though the library - [A Decade in Dev: Mikołaj on Lessons Learned, Ownership, and Tech Recruitment Path](https://brightinventions.pl/blog/decade-in-software-development/index.md): Mikołaj is a senior fullstack developer with a career ten years in the making. In this interview, he opens up about less - [5 Trends in HealthTech to Watch in 2026](https://brightinventions.pl/blog/top-trends-in-healthtech/index.md): Are we ready to book a doctor appointment via ChatGPT? Why should wellness become a priority for healthcare software com - [Top FemTech Conferences and Meetups 2026](https://brightinventions.pl/blog/femtech-conferences-meetups/index.md): Are you looking for events focusing on technology for women's health? We’ve got you covered. Check out the exciting FemT - [Top HealthTech Conferences in Europe to Attend in 2026](https://brightinventions.pl/blog/healthtech-conferences-europe/index.md): Looking for on-site healthcare conferences to attend in 2026? We’ve got you covered. Check exciting health conferences t - [Top Healthcare Podcasts to Listen to in 2026: Insights from the eHealth leaders](https://brightinventions.pl/blog/top-healthcare-podcasts/index.md): Podcasts have become a key source of knowledge and inspiration for professionals in the healthtech space. From keeping u - [How to Lose Respect and Fail as a Leader. 8 Things You Are Doing Wrong](https://brightinventions.pl/blog/how-to-lose-respect-and-fail-as-a-leader-8-things-you-are-doing-wrong/index.md): Leadership today is undergoing some transformation. The research in organisational psychology and management highlights - [What Digital Product Passport Means for Global 2000 Manufacturers](https://brightinventions.pl/blog/digital-product-passport-manufacturers/index.md): The European Union has shifted the burden of proof of sustainability from the marketing department to the IT department. - [Avoiding UX Traps: A Frontend Developer with a Passion for Product Design](https://brightinventions.pl/blog/frontend-developer-with-passion-for-product-design/index.md): With nearly two decades of experience in software development, Krystian’s journey has taken him from early web builds to - [Your First iOS CI Pipeline in Azure DevOps](https://brightinventions.pl/blog/first-ios-ci-in-azure-devops/index.md): In this article I will guide you through creation of your first CI pipeline using Azure DevOps Platform. Since I wrote m - [Why JS Math Doesn’t Math?](https://brightinventions.pl/blog/why-js-math-does-not-math/index.md): In this article, we’ll explore why JavaScript’s floating-point calculations behave the way they do, and what’s really go - [Using Transactional Analysis to Improve Feedback and Team Communication](https://brightinventions.pl/blog/using-transactional-analysis-to-improve-feedback-and-team-communication/index.md): Providing effective feedback needs both skills and knowledge. While it may seem like just a conversation, the way we giv - [Got a ConnectivityException Crash? Read How to Solve It](https://brightinventions.pl/blog/android-connectivity-exception-too-many-requests/index.md): Have you seen the ConnectivityException$TooManyRequests exception in your Crashlytics dashboard? Perhaps you have notice - [AI Agents Comparison from iOS Developer Perspective](https://brightinventions.pl/blog/ai-agents-comparison-from-ios-dev-perspective/index.md): GitHub Copilot was one of the earliest LLM powered tools helping developers with their everyday chores. It was also quit - [From Concrete Profession to Flexible Code. A Mobile Developer's Career Story](https://brightinventions.pl/blog/mobile-developer-career-story/index.md): From delivering precast concrete elements for one of the longest tunnels in Poland to programming, Mateusz's career jour - [Negativity Bias: Why Your Glass at Work Is Always Half-Empty](https://brightinventions.pl/blog/negativity-bias-why-your-glass-at-work-is-always-half-empty/index.md): You know that feeling when you have done a lot right, but all you can think about is the one thing that went wrong? Mayb - [Join CocoaHeads Tricity in October](https://brightinventions.pl/blog/cocoaheads-tricity-32/index.md): CocoaHeads Tricity is back! Sign up for a free event celebrating all things iOS! Listen to talks about AI-Powered iOS Co - [Integrating Firebase into Tuist Project](https://brightinventions.pl/blog/integrating-firebase-into-tuist-project/index.md): Firebase is one of the most commonly used third-party library in iOS development. With functionalities ranging from Cras - [Understanding the Bigger Picture in Programming. Patryk’s Career Journey](https://brightinventions.pl/blog/bigger-picture-backend-developer-career-story/index.md): Patryk shares his biggest challenges in software development, why he needs to understand the big picture before writing - [Bright Inventions is now Framna Poland](https://brightinventions.pl/blog/bright-inventions-is-now-framna-poland/index.md): Today Bright Inventions officially becomes Framna Poland, the leading international agency for digital products. Framna - [POS Software Development: 2025 Guide for Custom Point of Sale System](https://brightinventions.pl/blog/pos-software-development-guide/index.md): Dive into the technical world of the POS development process. Discover key features of Point of Sale, top challenges, tr - [Certificate Pinning on iOS in Practice](https://brightinventions.pl/blog/certificate-pinning-in-ios-app/index.md): New feature for yesterday, too long backlog of bug tasks and this crazy new crash that started occurring randomly out of - [Thriving in the Details. Behind Kasia’s QA mindset](https://brightinventions.pl/blog/kasia-qa-mindset-career-story/index.md): Kasia thrives on rules, diagrams, and compliance. She used to ensure that oil platforms were safe for workers. Eventuall - [POS Delivery Integration. API vs FTP – What Works Best?](https://brightinventions.pl/blog/pos-delivery-integration-api-ftp/index.md): For many restaurant chains, third-party delivery platforms like Wolt, Just Eat, or 10bis are now essential revenue strea - [Breaking the Code: Patryk's Quality Assurance Career Journey](https://brightinventions.pl/blog/patryk-quality-assurance-career-journey/index.md): Since college, Patryk knew that writing code wasn’t for him. But breaking it? That was a different story. In this interv - [POS Integration: What You Should Know about POS System Integration](https://brightinventions.pl/blog/pos-integration/index.md): The era of point of sales that just handle payment operations is long over. Now POS system can serve as the central hub - [Watching People Talk - Drama Triangle at Work](https://brightinventions.pl/blog/drama-triangle-at-work/index.md): Words are powerful. The way we speak to each other shapes how we feel, how we work, and even how we see ourselves. In a - [One Codebase for iOS and Android with Kotlin Multiplatform](https://brightinventions.pl/blog/one-codebase-ios-android-kotlin-multiplatform/index.md): In this article, I'll guide you step-by-step through creating a shared library, with a focus on implementing it for iOS - [The Current Status of Test Fixtures Support in Android](https://brightinventions.pl/blog/current-test-fixtures-support-android/index.md): While test fixtures have been available in Gradle since 2019, their support in the Android Gradle Plugin is still evolvi - [Deep Research AI Tools: ChatGPT vs Claude vs Gemini vs Grok vs Perplexity](https://brightinventions.pl/blog/ai-deep-research-comparison/index.md): The landscape of AI-powered research tools has evolved dramatically in 2025. What was once exclusive to premium tiers is - [Top Mental Health Conferences 2025](https://brightinventions.pl/blog/mental-health-conferences/index.md): If your calendar isn't full already, check out these mental health conferences that will still take place in 2025 across - [React Context and why not every child throws a re-render party](https://brightinventions.pl/blog/react-context-rerenders/index.md): React Context is a powerful tool that makes it easy to share data across multiple components, helping to avoid a common - [The List of 42 Smart Healthcare Devices (Regularly Updated)](https://brightinventions.pl/blog/bluetooth-devices-that-change-healthcare/index.md): Smart earrings, tattoos, smart socks, robot pets, and more... Discover the types of smart health devices transforming pa - [Top Healthcare Conferences to Attend in the USA in 2025](https://brightinventions.pl/blog/healthtech-conferences-usa/index.md): Are you planning to attend health conferences in the USA? Dive into the list of top healthcare conferences 2025 USA! 202 - [Microsoft Clarity for Web & Mobile Development: Benefits, Challenges, and Alternatives](https://brightinventions.pl/blog/microsoft-clarity-software-development/index.md): Users rarely have time to give you feedback – so it's up to you to uncover insights yourself. This article explores how - [Building Frontends, Embracing AI: A Look into Michał’s Career](https://brightinventions.pl/blog/building-frontends-embracing-ai/index.md): It took Michał only one day to choose his career path – but the spontaneity of that decision didn’t stop him from thrivi - [Offboarding with Heart - Making the Last Chapter Counts](https://brightinventions.pl/blog/offboarding-with-heart-making-the-last-chapter-counts/index.md): Letting people go used to be one of the hardest parts of my job (and sometimes it still is). I would lose sleep over it, - [Switching from Android Studio to IntelliJ IDEA for JetBrains Junie](https://brightinventions.pl/blog/switching-from-android-studio-to-idea-for-junie/index.md): IntelliJ IDEA Ultimate can be a viable alternative to Android Studio for Android development, offering additional featur - [How to Migrate Android App to Flutter: Step-by-Step Guide](https://brightinventions.pl/blog/migrating-from-android-app-to-flutter/index.md): If you already have an existing app written in Android and want to gradually introduce Flutter (e.g., one screen at a ti - [How to Integrate Payment Providers into a POS System: A Strategic Overview for Modern Restaurants](https://brightinventions.pl/blog/payment-provider-pos-integration/index.md): Point of Sale systems have evolved into multi-functional platforms that support diverse payment methods, helping restaur - [JetBrains Junie & AI Assistant vs Cursor for Frontend Developers – Which AI Agent Comes Out on Top?](https://brightinventions.pl/blog/jetbrains-junie-ai-assistant-vs-cursor-frontend-developers/index.md): Background Today I reactivated my JetBrains (JB) subscription so I could take Junie and the AI Assistant for a test‑driv - [Migrating from iOS App to Flutter – a Painless Getting Started Guide](https://brightinventions.pl/blog/migrating-from-ios-app-to-flutter/index.md): Migrating iOS app from native to Flutter doesn't have to mean rewriting your entire app from scratch. If you have a work - [Efficient S3 File Upload Pipeline with Presigned URLs, Event Triggers, and Lambda Processing](https://brightinventions.pl/blog/efficient-S3-file-uploads-with-async-processing/index.md): Uploading files to S3 via pre-signed POST URLs allows clients to upload securely and efficiently without routing large p - [Asset Tracking: A Guide to Smarter Asset Management](https://brightinventions.pl/blog/asset-tracking-guide/index.md): Businesses large and small must monitor the location, status, and condition of their physical assets in real time to imp - [From Gradle Plugin to CLI - A More Flexible Way to Distribute Android Apps with Firebase App Distribution](https://brightinventions.pl/blog/from-gradle-plugin-to-cli-android/index.md): Firebase App Distribution is a fantastic tool for continuous delivery, providing an easy way to manage pre-release build - [Cursor vs Junie for Android Developers. Which Is the Better AI Agent?](https://brightinventions.pl/blog/cursor-vs-junie-for-android/index.md): Junie and Cursor — two prominent AI agents — have entered the realm of Android development. Let's explore their strength - [Faster and Smarter - Improving File Uploads with S3 Multipart, Pre-Signed URLs and S3 Transfer Acceleration](https://brightinventions.pl/blog/improving-s3-large-files-uploads/index.md): Uploading large files to S3 can be slow and unreliable over weak networks. Using multipart upload with pre-signed URLs i - [Climbing Challenges in Tech and Life: Paweł’s 10-Year Dev Journey](https://brightinventions.pl/blog/climbing-challenges-in-tech-life-pawel/index.md): With a decade of experience in the software industry, Paweł has seen it all – from working with complex legacy systems t - [How to Gather Actionable Feedback Inside a POS System – Without Interrupting the Flow](https://brightinventions.pl/blog/how-to-gather-actionable-feedback-inside-a-pos-system/index.md): Understanding your users is key to building a Point of Sale (POS) system that not only works but actually supports staff - [Supercharged Test Running with Custom Modes in Cursor IDE](https://brightinventions.pl/blog/supercharged-test-running-with-custom-modes-in-cursor-ide/index.md): The Problem with Running Tests in Cursor If you're using Cursor as your primary IDE, you've probably already experienced ## Team - [Adam Kruczek](https://brightinventions.pl/about-us/adam-k/index.md): React Native Developer - [Adam Waniak](https://brightinventions.pl/about-us/adam-w/index.md): Backend Developer - [Agata Bielówka](https://brightinventions.pl/about-us/agata/index.md): Project Manager - [Agata Dankowska](https://brightinventions.pl/about-us/agata-m/index.md): Recruiting Specialist - [Agnieszka Olszewska](https://brightinventions.pl/about-us/agnieszka/index.md): Senior Fullstack Developer - [Aleksandra Zagórska](https://brightinventions.pl/about-us/aleksandra-z/index.md): Fullstack Developer - [Andrzej Zabost](https://brightinventions.pl/about-us/azabost/index.md): Senior Android Developer - [Arek Dobosz](https://brightinventions.pl/about-us/arek-d/index.md): Senior Fullstack Developer - [Artur Suliński](https://brightinventions.pl/about-us/arturs/index.md): Senior iOS Developer - [Aleksandra Zawisza ](https://brightinventions.pl/about-us/aleksandra-zaw/index.md): Product Designer - [Bartek Krzyżański](https://brightinventions.pl/about-us/bartek-k/index.md): Backend Developer - [Bartosz Szafran](https://brightinventions.pl/about-us/bartosz-sz/index.md): Senior Frontend Developer - [Dawid Czarnecki](https://brightinventions.pl/about-us/dawid-cz/index.md): Fullstack Developer - [Dominik Dygowski](https://brightinventions.pl/about-us/dominik-d/index.md): Senior Fullstack Developer - [Filip Jabłoński](https://brightinventions.pl/about-us/filip/index.md): Senior iOS Developer - [Izabela Pawlik](https://brightinventions.pl/about-us/izabela/index.md): Digital Marketing Specialist - [Jakub Mandra](https://brightinventions.pl/about-us/jakub-m/index.md): Senior Fullstack Developer - [Jarek Łankuć](https://brightinventions.pl/about-us/jarek/index.md): DevOps Engineer - [Joanna Cieszyńska](https://brightinventions.pl/about-us/joanna-c/index.md): Product Designer - [Jędrzej Kowaliński](https://brightinventions.pl/about-us/jedrzej/index.md): Fullstack Developer - [Jędrzej Sadowski](https://brightinventions.pl/about-us/jedrzej-s/index.md): Senior Frontend Developer - [Karol Kandyba](https://brightinventions.pl/about-us/karol-ka/index.md): Senior Android Developer - [Kasia Łukasiewicz](https://brightinventions.pl/about-us/kasia/index.md): Senior Project Manager - [Katarzyna Gałka](https://brightinventions.pl/about-us/kasia-g/index.md): Project Manager - [Katarzyna Bednarz](https://brightinventions.pl/about-us/katarzyna-b/index.md): QA Engineer - [Krystian Kamiński](https://brightinventions.pl/about-us/krystian/index.md): Senior Frontend Developer - [Krzysztof Serocki](https://brightinventions.pl/about-us/krzysiek-s/index.md): Android Developer - [Maciej Królik](https://brightinventions.pl/about-us/maciej-k/index.md): Android Developer - [Maciej Sawicki](https://brightinventions.pl/about-us/maciej-s/index.md): Senior Frontend Developer - [Magda Sadowska](https://brightinventions.pl/about-us/magda/index.md): Office & HR Assistant - [Maja Puta](https://brightinventions.pl/about-us/maja/index.md): QA Specialist - [Marcin Kędziora](https://brightinventions.pl/about-us/marcin-ke/index.md): Fullstack Developer - [Marta Borawska](https://brightinventions.pl/about-us/marta/index.md): QA Specialist - [Marcin Świderek](https://brightinventions.pl/about-us/marcin-sw/index.md): Fullstack Developer - [Mateusz Gabrynowicz](https://brightinventions.pl/about-us/mateuszg/index.md): Senior Mobile Developer - [Mateusz Klimczak](https://brightinventions.pl/about-us/mateusz/index.md): Partner & Head of Delivery - [Małgorzata Zielińska](https://brightinventions.pl/about-us/malgorzata-z/index.md): Senior QA Engineer - [Michał Bednarz](https://brightinventions.pl/about-us/michal-be/index.md): Fullstack Developer - [Michał Osadowski](https://brightinventions.pl/about-us/michal-bu/index.md): Frontend Developer - [Michał Demiańczuk](https://brightinventions.pl/about-us/michal-d/index.md): QA Specialist - [Michał Kukiełka](https://brightinventions.pl/about-us/michal-ku/index.md): Fullstack Developer - [Michał Waśniewski](https://brightinventions.pl/about-us/michal-was/index.md): Senior iOS Developer - [Michał Wójcik](https://brightinventions.pl/about-us/michal-wo/index.md): Fullstack Developer - [Michał Łepek](https://brightinventions.pl/about-us/michal-l/index.md): Backend Developer - [Michał Łukasiewicz](https://brightinventions.pl/about-us/michal/index.md): Co-founder & Senior iOS Developer - [Mikołaj Grochowski](https://brightinventions.pl/about-us/mikolaj-g/index.md): Senior Fullstack Developer - [Patryk Bąk](https://brightinventions.pl/about-us/patryk-b/index.md): QA Engineer - [Patryk Sienkiewicz](https://brightinventions.pl/about-us/patryk-s/index.md): Senior Backend Developer - [Patryk Łempio](https://brightinventions.pl/about-us/patryk-l/index.md): Backend Developer - [Paulina Trendel](https://brightinventions.pl/about-us/paulina-t/index.md): Recruiting Specialist - [Paweł Olszewski](https://brightinventions.pl/about-us/pawel-o/index.md): Fullstack Developer - [Paweł Polak](https://brightinventions.pl/about-us/pawel-p/index.md): Fullstack Developer - [Piotr Mionskowski](https://brightinventions.pl/about-us/piotr/index.md): Head of Technology & POS Expert - [Piotr Rutka](https://brightinventions.pl/about-us/piotr-r/index.md): Senior Android Developer - [Radosław Landowski](https://brightinventions.pl/about-us/radek-l/index.md): Senior Backend Developer - [Radek Pieczątkiewicz](https://brightinventions.pl/about-us/radek/index.md): Android Developer - [Rafał Opacki](https://brightinventions.pl/about-us/rafal-op/index.md): Senior Fullstack Developer - [Rafał Hofman](https://brightinventions.pl/about-us/rafal-h/index.md): Fullstack Developer - [Sara Łęcka](https://brightinventions.pl/about-us/sara-l/index.md): Recruitment Specialist - [Rafał Went](https://brightinventions.pl/about-us/rafal-w/index.md): Fullstack Developer - [Sebastian Rodykow](https://brightinventions.pl/about-us/sebastian-r/index.md): Senior iOS Developer - [Szymon Gęsicki](https://brightinventions.pl/about-us/szymon-g/index.md): Flutter Developer - [Szymon Miloch](https://brightinventions.pl/about-us/szymek/index.md): Android & Web Developer - [Tomasz Krzywicki](https://brightinventions.pl/about-us/tomasz-k/index.md): Senior Backend Developer - [Sławomir Kopaczewski](https://brightinventions.pl/about-us/slawek/index.md): Fullstack Developer - [Tomasz Scharmach](https://brightinventions.pl/about-us/tomasz-sch/index.md): Backend Developer - [Tomasz Lizer](https://brightinventions.pl/about-us/tomasz-l/index.md): Senior iOS Developer - [Ula Stankiewicz](https://brightinventions.pl/about-us/ula/index.md): Head of People & Communications - [Wojciech Janeczek](https://brightinventions.pl/about-us/wojciech-j/index.md): Frontend Developer - [Wojciech Kałębasiak](https://brightinventions.pl/about-us/wojciech-k/index.md): DevOps Engineer - [Łukasz Niedźwiedź](https://brightinventions.pl/about-us/lukasz-n/index.md): iOS Developer - [Łukasz Reszetow](https://brightinventions.pl/about-us/lukasz/index.md): Android Developer ## Optional - [All Blog Posts](https://brightinventions.pl/blog/): Full archive of 598+ blog posts - [Career](https://brightinventions.pl/career/): Current job openings - [Start a Project](https://brightinventions.pl/start-project/): Contact form --- # Services ## MVP Development Agency *Source: https://brightinventions.pl/our-areas/mvp-development/index.md* ## is MVP right for your business? MVP stands for minimum viable product. It is the first version of your product containing only key features. MVP development is a perfect solution for you if: ### you represent startup Are you a startup with the idea for a software product? Building MVP is a low-cost solution to launch the first version of your product that may help you find first clients and investors. Additionally, **MVP development helps quickly validate your business idea** thanks to actual users feedback. ### you represent a corporation MVPs aren’t reserved only for startups. They can be the right solution for greater organisations as well. Developing MVPs for corporations speed things up. It helps to effortlessly **build a product with crucial features that may be presented to the stakeholders**. ### you represent a consultancy agency Do you want to develop MVPs to distribute them to your clients? We are happy to assist you. We bring to the table years of experience in software development. Our custom software development approach based on Agile methodologies will result in developing high-quality MVPs. ### you have an idea for a solution and want to verify its potential An idea is only the beginning of the software development process. Building an MVP app means a short time to market. Thanks to nimble development you can **develop your product before your competition**. We can also organise **product workshops** for your team to jointly evaluate the business potential of your idea. We will help you on every step of the development path. ## Agile Workshops for Teams *Source: https://brightinventions.pl/our-areas/agile-workshops/index.md* ## who will benefit from an Agile workshop? - Startups and businesses that have software developer teams and want to start following Agile manifesto. - Fully co-located software teams as well as teams combining members alongside different offices. We help you deal with different cultures and support in a cultural Agile transformation. - Organisations that want to cooperate with us on a software development project and are willing to understand how we plan and prioritize our work in order to bring your product to the market. ## meet our Agile master Katarzyna Łukasiewicz is a determined and passionate Agile Coach with **over ten years of experience in teaching and mentoring** individuals as well as organisations based on Agile principles. She graduated from Gdańsk University of Technology with a PhD in “Method of selecting programming practices for the safety-critical software development projects”. ![kasia łukasiewicz agile coach](../../static/images/kasia_agile_coach_bright_inventions.png "") She is actively involved in the Agile community through her participation, publications or speaking events. As a member of the academic community she teaches future software developers and PMs about best practices in software development projects. **As a Process Manager at Bright Inventions she brings her expertise into software development team** and accelerates progress delivering value, while teaching new skills as necessary to tackle the technical challenges the team is facing. She makes the team work effectively with modern development practices, tools and approaches. Katarzyna will guide you and your team through Agile development in order to establish the best practices for your team. ## what will you learn about Agile? It depends on your needs, but our team will be more than happy to show you: - How to introduce Agile Manifesto for your team. - What are the best methods and practices to make your team Agile. - What are the phases of Agile development including steps like: user stories or Agile discovery phase. - How to combine technical knowledge with deep Agile experience to achieve high market focus, productivity, and quality. - How Agile teams generate opportunities, reduce risk, and decrease costs. - How Agile benefits cross-cultural teams and in remote teams. - How to solve project management problems in your team. - How to evaluate the existing Agile approach in the team. ## Bluetooth Development *Source: https://brightinventions.pl/our-areas/bluetooth-development/index.md* ## what is Bluetooth and why you might need it? Thanks to Bluetooth **different devices communicate and exchange information over a short distance**. One of the most common Bluetooth devices might be headphones. Although, nowadays the technology is used on a much bigger scale. Thanks to Bluetooth (especially its modern version called **Bluetooth Low Energy**) and tech like **iBeacon** we can build a high-quality network of devices while consuming less device operation power. If you want to develop software products that communicate with hardware, Bluetooth will probably be a must. ## bluetooth development services Bluetooth is an essential part of many software development projects. No matter the industry you represent, you need to rely on experienced Bluetooth experts. For over a decade we have been working on customized applications based on Bluetooth: ### android Bluetooth development Our Android software team builds native applications for various purposes. Android apps might work as Bluetooth clients that perform scanning for other devices and gather data for them. On the other hand, applications built by our team could also work as Bluetooth servers. It means that they create public APIs, which can be found and connected to by other BLE devices wanting to fetch our data. We specialize in delivering Bluetooth android applications for ePOS, retail, and healthcare. ### iOS Bluetooth development We build Bluetooth solutions for iOS applications. We specialize in iBeacon development. Our iOS development team has used iBeacon technology for example working on an [Everytap](/projects/everytap/) hospitality application or listing browser app – [EasyTapp](/projects/easytapp/). ### Bluetooth Low Energy We use Bluetooth Low Energy (LE) technology in order to build native iOS and Android applications. Bluetooth LE enables reducing power consumption of the device while ensuring the same quality of communication and range. ## AI Solutions *Source: https://brightinventions.pl/our-areas/ai-software-development/index.md* Whether you require complex systems with an extensive vector database or a no-code solution, our AI engineers will build a secure and thoroughly tested AI solution. Every element, including embeddings and prompts, is meticulously scrutinized for optimal utilization. **From the beginning, you will understand the potential of your solution as well as its operational costs**. ## machine learning We craft algorithms that are both powerful and resource-efficient. Our goal is to develop tailored machine learning **enabling your systems to learn from data, improve over time, and make intelligent decisions**. By leveraging advanced predictive models, we aim to enhance your operations and deliver insightful outcomes to help you make data-driven decisions. ## generative AI Generative AI can elevate your solution to a new level, yet its implementations should proceed with strategic planning, validation of the right tools, and **ensuring adherence to data security practices and regulations, including GDPR and HIPAA**. Our AI software development team will navigate you through various aspects of Generative AI including chatbots, Natural Language Processing and conversational AI. ## building chatbots Chatbots are one of the most well-known implementations of generative AI. Whether you want to build a chatbot to enhance your customer success or for internal use, **we will help you tailor the chatbot to your business needs**. ## prompt engineering We offer tailored AI prompt engineering services designed to meet your business needs, enhanced with embedding technology. It allows us to **minimize costs effectively while utilizing economical models**, providing you with efficient and affordable solutions. ## LLM app development We build **Large Language Models trained on vast amounts of textual data, enabling you to generate and process natural language text**. These systems can produce a wide variety of outputs, including text, images, music, and even video. ## natural language processing solutions We delve into the realm of Natural Language Processing offering personalized NLP solutions tailored to your unique requirements, **providing your users with the most human-like experience possible**. ## conversational AI development Our team customizes Conversational AI systems to align with your specific goals, ensuring **these systems are adept at understanding and responding to human language in a natural and intuitive manner**. ## Application modernization *Source: https://brightinventions.pl/our-areas/app-modernization/index.md* Is your system older than some of the engineers who work on it? Although it is profitable, maintaining the application has become a constant struggle, as acquiring new users to your rusty UI. You know the time for a system upgrade has come, but how do you achieve it without compromising the existing system? We hear you and are here to help. We will revamp your system without any disturbances for your users, maintaining full compatibility and preserving the core of your app that has brought you success all these years. ## legacy modernization services ### software audit We provide deep insights into your technology stacks, identifying risks and pinpointing areas for significant improvement. ### redesign We ensure your system is intuitive, accessible, and easy to navigate, enhancing user engagement and satisfaction. ### cloud migration As an AWS Partner, we ensure a smooth and efficient migration to cloud environments, enhancing scalability, performance, and cost-efficiency. ### application re-engineering & refactoring We enhance a legacy system in ways that were not possible when it was originally created by adding new features, integrating new technologies, and improving code clarity without affecting your app functionality. ### re-architecting We transform your legacy system into modern, scalable, and efficient architecture to meet any business challenge with agility and robust performance. ### integrations We connect your solution with external providers, third parties, and business partners. **We specialize in retail integrations including POS integrations with payment platforms** (Stripe, Square, Paypal, Adyen), **food delivery platforms**, or **devices** (printers, terminals, or cash registers). ### security improvements Enhance the security of your systems with our in-depth experience. We ensure your infrastructure complies with GDPR, HIPAA and other legal requirements. ## Blockchain Solutions *Source: https://brightinventions.pl/our-areas/blockchain/index.md* ## what is blockchain and why you might need it? Simply saying **blockchain is a chain of blocks connected thanks to cryptography**. Blockchain is decentralized. Therefore practically no one can take control of it. Although blockchain is mostly known as a technology behind cryptocurrency, it goes way beyond that. Blockchain could be **a perfect fit for startups and larger companies** building software products for the **fintech, healthcare, or banking industries**. If you plan or already are building products with a focus on **decentralization, transparency, and security**, you should base your web or mobile application on the blockchain. ## blockchain solutions that we have developed We specialize in integrating web and mobile apps with blockchain solutions. For over 4 years we have been developing products using **Ethereum** technology. Apart from that we are **Substrate** enthusiasts. We have built **BrightTreasury** module application to **support the Polkadot community** built around the Substrate. We use and support the Substrate framework because we believe that it is the future of the internet.  ### BrightTreasury **BrightTreasury is our original product supporting the blockchain community**. It is a standalone web application that allows performing basic actions on the Treasury and Bounties modules of Polkadot and Kusama Substrate networks. The app is **a part of the Web3 Foundation (W3F) grants program**. The goal of our product is to make blockchain accessible to more users. The app is still being developed by our team with **full support from Polkadot and Kusama**. ## Cloud Computing Services *Source: https://brightinventions.pl/our-areas/cloud-services/index.md* ## AWS cloud services As a cloud development company we closely cooperate with Amazon Web Services using the top tools Amazon has to offer. We specialise in AWS Lambda which enables serverless developments where instead of traditional serval administration you pay only for functions you use. ## Custom Software Development *Source: https://brightinventions.pl/our-areas/custom-software-development/index.md* ## is custom application development a good fit for you? If your business needs an individual approach and flexible development process, a custom digital products agency like Bright Inventions will be a perfect fit for you. We help our customers throughout all software delivery phases: from ideation and requirements’ elicitation, through product design and Agile project management to software development, quality assurance, and maintenance. Custom software development is where our development team truly shines! ## Custom Asset Tracking *Source: https://brightinventions.pl/our-areas/asset-tracking/index.md* We develop tailored asset tracking solutions when off-the-shelf tools just don’t fit your business needs. With 10+ years of experience, we build IT asset tracking solutions using Bluetooth, RFID, Wi-Fi, barcodes, and more – tailored to your business. Whether you're looking to digitize internal operations or deliver a robust tracking solution to your clients, we're here to handle the technical challenges for you. ## Best Digital Product Studio in Gdańsk *Source: https://brightinventions.pl/our-areas/gdansk-digital-product-agency/index.md* Welcome to Gdańsk, the city that embraces its 1000-year history while emerging as one of the most vibrant technological hubs in Poland. We are **Bright Inventions – a company proudly located in the city, just 15 minutes from the airport**. Are you currently exploring Gdansk? Why don't we grab a coffee together? Meet with our software engineering team and learn how together we can create software that matters. ## Gdańsk from our team’s perspective ## our expertise From concept to launch, we help organizations of all shapes and sizes build impactful digital products. Our clients – ranging from startups and consultancies to renowned NGOs and global organizations – operate in FinTech, Blockchain, HealthTech, Retail, Logistics, and more. ### [IoT development](/our-areas/iot-development/) We specialize in [integrating smart bluetooth devices into sophisticated systems](/projects/remote-patient-monitoring/). We have cooperated with clients representing the industrial, healthcare, and [retail](/projects/system-for-restaurants/) sectors. ### [healthcare software development](/our-areas/healthcare-software-development/) We assist our partners in developing products that have a meaningful impact on the lives of their end users. By building an [engagement app for chronically ill patients](/projects/solution-for-parkinsons-patients/), a [digital guide for future moms](/projects/pregnancy-app/), or an [online therapy platform](/projects/online-group-support/), we take part in the global digital healthcare movement. ### [MVP development](/our-areas/mvp-development/) We craft MVPs to quickly validate ideas for the software solutions. We’ve built numerous MVPs including a [humanitarian aid solution which turned into a global product](/projects/card-tracking-system/). ## Healthcare Technology Consulting *Source: https://brightinventions.pl/our-areas/healthcare-software-development/index.md* ## healthcare technology consulting Scaling a **HealthTech solution** is not just a challenge—it’s a mission to bring life-saving healthcare innovations to the world. As a **healthcare technology consulting** partner, our team has successfully supported **healthcare software companies** and startups in Germany, the UK, the US, and Israel, leveraging cutting-edge technologies to build **custom healthcare software development solutions**. ## customized healthcare software development services ### generative AI in healthcare Secure **LLM (Large Language Models)** enable the analysis of health data, effective remote care, and even support faster diagnostics of cancer, vascular diseases, and other life-threatening disorders. **As a leading healthcare IT company, we work with LLM models daily**, integrating AI into **custom healthcare software development** to enhance patient care. ### telemedicine (telehealth) app development Effective communication between doctors, nurses, and patients is crucial in **digital health**. As a **telemedicine app development company**, we build **telemedicine software development solutions** that facilitate video consultations, messaging, and remote healthcare services. Our **telehealth app development** expertise ensures seamless connectivity between patients and healthcare providers. ### IoT in healthcare with wearables By integrating **Bluetooth devices and IoT networks**, we enable continuous **remote patient monitoring solutions** for **healthcare application development**. **We have successfully implemented NHS-certified IoT networks for home care settings across the UK, ensuring HIPAA- and GDPR-compliant healthcare IT services**. ### remote patient monitoring solutions **Our healthcare digital products agency** uses advanced **cloud computing** to develop **EHR software solutions** that enable secure, real-time access to patient records. As **healthcare technology company** we design systems to comply with HIPAA and GDPR, ensuring secure and efficient management of health information and patient data. Additionally, we provide the capability to access data even when offline, enhancing accessibility and reliability ### EHR (Electronic health record) solutions **By leveraging advanced cloud computing technologies, we've helped to develop seamless EHR solutions that facilitate the storage and real-time sharing of patient records**. Our systems are designed to comply with HIPAA and GDPR, ensuring secure and efficient management of health information. Additionally, we provide the capability to access data even when offline, enhancing accessibility and reliability. ### patient engagement apps Empowering patients through **patient engagement apps** is at the heart of **healthcare IT services**. Our team has extensive experience in **healthcare mobile application development**, including[**solutions tailored for** chronic disease management](/projects/solution-for-parkinsons-patients/)and neurological disorders like Parkinson’s. ### FemTech solutions From **[pregnancy and postpartum support apps](/projects/pregnancy-app/)** to fertility tracking applications and IVF support, our **custom healthcare software development services** cater to the unique needs of women’s health. As a trusted **healthcare software development agency, we design personalized solutions for every stage of a woman’s health journey.** ### eMAR (electronic medication administration record) Medication distribution is a critical yet error-prone healthcare process. As an experienced **healthcare digital products agency**, we specialize in **eMAR software solutions** that optimize medication tracking, improve safety, and streamline medical workflows. ### mental health technology Respond effectively to critical mental healthcare challenges with our solution. Whether it's depression, anxiety, or other mental disorders, we are committed to helping you scale solutions with a primary focus on and respect for your users. **Proudly supporting the growth of the [online group therapy platform](/projects/online-group-support/) based in the US, we draw upon our experience to navigate the sensitive realm of digital mental health with care and expertise**. Addressing **mental health software development** needs with care and expertise, as an experienced **healthcare technology company** we build solutions that support **online therapy, mood tracking, and AI-driven mental health assessments**. **Our healthcare software development services** include HIPAA-compliant mental health solutions, ensuring security and privacy for sensitive patient data. ## IoT Solutions *Source: https://brightinventions.pl/our-areas/iot-development/index.md* ## comprehensive IoT services Our **IoT solutions** scale software across industries like healthcare, fleet management, **industrial IoT**, retail, and fintech. Partnering with a **IoT solutions company** or **IoT agency** ensures **secure device integration** and real-time **IoT monitoring**. At Bright Inventions, we specialize in **IoT services**: ## Mobile App Development *Source: https://brightinventions.pl/our-areas/mobile-app-development/index.md* ## mobile app development services As a mobile app development company, we specialize in iOS and Android software development. ### iOS app development & maintenance If you want to create a **native iOS app for Apple users**, then you’re in great hands. Throughout the years, we’ve worked on iOS projects of all levels of complexity – **from simple projects for startups and mid-sized companies to complex apps** for well-established, global brands. Regardless of whether you’re looking to develop your app from scratch, or searching for a team to take over an existing app’s maintenance and further development – reach out. We might just be the perfect match! ### Android app development & maintenance Our mobile app developers will help you build an impressive presence among Android device users. We’ve worked on building n**ative apps at all stages of development** – from ideation and app design to launching and maintaining your app on Google Play store. You can count on our expert Android developers to help choose the very best technology stack for your project. Reach out to learn more! ## MVP Entwicklung *Source: https://brightinventions.pl/our-areas/mvp-entwicklung-agentur/index.md* ## ist MVP das Richtige für Ihr Unternehmen? MVP steht für Minimum Viable Product, was so viel wie "minimal funktionsfähiges Produkt" bedeutet. Es ist die erste Version Ihres Produkts, die nur die wichtigsten Funktionen enthält. Die MVP-Entwicklung ist eine perfekte Lösung für Sie, wenn: ### sie vertreten die Interessen der Startups Sind Sie ein Startup mit der Idee für ein Softwareprodukt? Die MVP ist eine kostengünstige Lösung, um die erste Version Ihres Produkts auf den Markt zu bringen, die Ihnen helfen kann, erste Kunden und Investoren zu finden. Darüber hinaus hilft die MVP-Entwicklung dank des Feedbacks der tatsächlichen Benutzer, Ihre Geschäftsidee schnell zu beurteilen. ### sie vertreten ein Unternehmen MVPs sind nicht nur Startups vorbehalten. Sie können auch für größere Organisationen die richtige Lösung sein. Die Entwicklung von MVP für Unternehmen beschleunigt die Arbeit. Es hilft, mühelos ein Produkt mit entscheidenden Merkmalen zu erstellen, das den Stakeholdern präsentiert werden kann. ### sie vertreten eine Beratungsagentur Haben Sie vielleicht eine Interesse um MVP an Ihre Kunden bekannt zu machen? Wir helfen Ihnen gerne weiter. Wir bringen jahrelange Erfahrung in der Softwareentwicklung mit. Unser kundenspezifischer Softwareentwicklungsansatz, der auf agilen Methoden basiert, führt zur Entwicklung hochwertiger MVP. ### sie haben eine Idee für eine Lösung und möchten deren Potenzial prüfen Sie haben eine Idee für eine Lösung und möchten deren Potenzial prüfen Eine Idee ist nur der Anfang des Softwareentwicklungsprozesses. Das Erstellen einer MVP-App bedeutet eine kurze Markteinführungszeit. Dank flinker Entwicklung können Sie Ihr Produkt vor Ihrer Konkurrenz entwickeln. Wir können auch Produktworkshops für Ihr Team organisieren, um gemeinsam das Geschäftspotenzial Ihrer Idee zu beurteilen. Wir begleiten Sie auf jedem Schritt des Entwicklungsweges. ## Customized food delivery integration for your POS *Source: https://brightinventions.pl/our-areas/food-delivery-pos-integration/index.md* ## food delivery platforms we integrate with And more! Just let us know if you need an integration with other 3rd parties. ## advantages of a custom food delivery integration Why you should go beyond an ordinary food delivery app integration. ## Product workshops for business *Source: https://brightinventions.pl/our-areas/product-workshops/index.md* ## when product workshops will be a good fit for you? Product workshops bring value at every phase of software development. They might help you to kick off your idea as well as evaluate your much more advanced product. Find product workshops that will perfectly match your case: ### you have an idea for a product, but not sure where to start The **product discovery workshop** is a good fit for this case. Our team will gladly help you with discovering the product you need, detecting all the opportunities, threats, and future prospects. Together, we will discover the scope of your potential product and prepare the product development plan. We suggest contributing 1-2 days to the product discovery workshop (also known as product development workshops). During the workshop, our team will facilitate the activities that will help to generate new possible ideas, understand your potential customers and your business needs. ### you have an idea and know how your product should look like and work, but need to put it all together in a system We’ve created a **product flow workshop** for this case. We will help you map the user journeys and set the flow of your product. Moreover, we will help you to look at the product from a different perspective to make sure you’ve covered all the cases. Our team will also suggest the best suitable technology for your project. Depending on your individual case, we suggest 2-4 days workshop. Through the course of the workshop, we will create a flow of your product together, we will also help you decide what features should be considered for your Minimum Viable Product (MVP). Upon request, we can provide you with the mock-ups of your product. ### you already have a product, but want to know how it could be improved A **product reset (evaluation) workshop** might be the best fit for your case. We will create the workshops to help you find all the bottlenecks of your product and together we will discover how to find solutions for these drawbacks. Our team will revise the project from the technological perspective as well and if needed, suggest the most efficient solutions. We recommend from 2-4 days for this workshop. Upon request, we can provide you with the mock-ups for a redesign of your product and a plan of how to implement the improvements if any needed. Because we treat each case individually, please contact us for further discussion to set the best scope for your workshop case. ## POS Software Development *Source: https://brightinventions.pl/our-areas/pos-software-development/index.md* ## what we offer as a leading POS development company For over 12 years, we have been designing and building **custom POS systems** for hospitality, particularly restaurants, as well as retail businesses. As an experienced **POS digital products agency**, we specialize in **custom POS software development** to meet your unique business needs. What can we do for you? ## Product Design Services *Source: https://brightinventions.pl/our-areas/product-design/index.md* ## product design services that we offer It does not matter in which phase you are with your product, we will make sure you make the best out of it. Our product design process contains a couple of steps to ensure that your project will reflect your business goals. We are flexible, the final product design flow always depends on your needs. ### product workshops Working on your product design starts from workshops where we establish the road for your product to meet expectations and business goals. Workshops are a great help for clients who came only with an idea and want to verify its potential. Also, they are a great option for mature organisations that aims to improve an existing product. ### wireframe design After workshops we create wireframes which are simple designs that will show you the basic flow of your application. So from the very beginning you know that we are on the same page. ### mockup design After discussing wireframes, we are ready to transform them into mockups. They are simple designs that will show you – for the very first time – the user interface. Mockups assure you that your idea is rightfully represented in the design. ### prototype design Finally, our product development team creates prototypes. They are simple clickable mockups that are a great way to quickly test the idea at this still a very early stage. Prototyping helps to eliminate mistakes that could be very costly if there were included in the production version. ### user interface and user experience design This is the moment to incorporate all the best UI and UX practices into your solution. Our main focus is to create the best experience for the users, and in order to do that we follow universal UX laws and make designs look simple but solid on all devices. ### designing the whole system At Bright Inventions we go along with our clients through their whole product journey, from the ideation phase to the maintenance. We put every design aspect of the product together. The final design is a combination of our expertise in product design, usability testing and frontend development. ## Your App Deserves the Best *Source: https://brightinventions.pl/our-areas/welcome-back/index.md* ## our expertise We will support your business at every stage it requires, whether it’s developing an MVP, scaling operations, or modernizing legacy systems. ## Custom Uber Eats and POS Integrations *Source: https://brightinventions.pl/our-areas/uber-eats-pos-integration/index.md* ## why a custom Uber Eats and POS integration is right for your business You might try to connect your POS with Uber Eats just like everyone else does, or you might opt for a custom Uber Eats-POS integration to deliver features tailored to your users. Discover the advantages of a custom Uber Eats and POS integration: ## Building Software Aligned with Zebra Technologies *Source: https://brightinventions.pl/our-areas/zebra-technologies-integrations/index.md* ## hire a team that builds software around your needs — fully integrated with Zebra devices If off-the-shelf worked, you wouldn’t be here. With 13+ years of experience, we build what actually works. **Get every feature you need to grow**\ Access what out-of-the-box solutions can't deliver. **Track every asset in real time**\ Always know the location and status of your devices, tools, and inventory. **Do more with Zebra devices you already own**\ Turn your devices into trackers — no extra hardware costs. **Transform Zebra printers into powerful retail tools**\ From labeling to point-of-sale support — unlock the full potential of Zebra printers. **Track what others can’t**\ Even through concrete walls, high-traffic zones, or when monitoring unique conditions like water quality. **Speed up any production**\ Pinpoint delays by tracking how long parts sit at each station. **Know exactly where your shipments are**\ No more guessing. Just accurate, real-time delivery insights. ## Web Development Services *Source: https://brightinventions.pl/our-areas/web-development/index.md* ## web development services As a web development company, we specialise in web app and website development. ### web app development We’ve developed web applications for startups and larger businesses representing industries such as healthcare, retail or fintech. We specialise in building web applications that integrate with blockchain. We combine technical knowledge with the Agile approach developing simple web apps as well as complex platforms. ### website development We also are open to developing tailor-made websites. From basic static pages to interactive multifunctional internet platforms such as news aggregators, marketplaces or e-commerce. We rely on Agile methodology and work with a rich technology stack – JavaScript, CSS, HTML, Java, Node.js, React, AWS, MySQL, PostgreSQL and many more. # Projects ## Supporting People with Parkinson's Disease – MVP story *Source: https://brightinventions.pl/projects/solution-for-parkinsons-patients/index.md* **technologies**: Swift, Kotlin, Node.js, Typescript, AWS Only in the U.S. **each year, about [90,000](https://www.parkinson.org/understanding-parkinsons/statistics) people are diagnosed with Parkinson's diseas**e. Living with a chronic illness like Parkinson’s imposes many lifestyle changes on the patient. For those battling the disease, it is crucial to **have a way to easily track their overall vitals, medicine intake, or note any symptoms** that need to be brought to doctors’ attention. Our long-time partner from Germany (a digital agency and early-stage project incubator), reached out to us with a ready-to-implement idea their customers had for an app. **The goal was to develop a mobile app that simplifies the day-to-day lives of patients suffering from Parkinson’s disease**. Before reaching out to us, our client had already designed a high-fidelity wireframe of the user interface. Consequently, they needed a technological partner to take ownership of the software development process. And so, **Bright Inventions was entrusted with the implementation of the entire system** - the development of two apps (iOS and Android), as well as the entire backend. The app functioned as a personal digital diary for individuals with Parkinson's disease, allowing users to log their symptoms and monitor their medication intake. **Its primary aim was to observe the body's reaction to therapies, aiding patients and healthcare professionals in managing the condition**. The app provided advanced analytics for physicians to better understand patient conditions. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients3.png) From the beginning, we understood that **the key element of the solution must have been inclusive and empathic UX/UI design**. The app had to be **friendly in use for patients suffering from tremors** or other movement disorders. Also, as the elderly constitute the majority of patients suffering from Parkinson’s, **the challenge was to deliver a legible, highly intuitive interface that would minimize the chances of mistake**s. If an accidental input were to take place, though, the interface also needed to allow the option to undo the action. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients1.png) Although our team wasn't directly responsible for creating designs, based on our experience in developing user-oriented solutions, **we provided numerous recommendations to simplify features** of the graphical user interface to better suit the needs of people with Parkinson’s. The client responded positively to our recommendations, subsequently giving us the green light to proceed. The greatest challenge, however, was to **fulfill the highest security and privacy standards to protect users**. Given its healthcare nature, the app stored sensitive medical data on patients’ health, including information on pain and tremors, as well as data on very specific side effects, such as sexual drive levels and gambling propensity. One of the security tactics we implemented was **breaking down the encrypted database into two – each stored in a different AWS services’ physical location**. The first database stored basic user data, such as name or email address. The second database kept sensitive medical information, including medication intake or physical symptoms and side effects. Through this decision, **we minimized the chance that, in the event of a data breach, the attacking party would be able to access all the information**. Therefore, even in the case of a data breach, **the risk of matching symptoms to specific patients' names is low**. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients2.png) After three months, **we successfully delivered the MVP of the solution**, followed by overseeing several iterations of the system to enhance its functionality. **This project is an example of an inclusive patient engagement app designed to support chronically ill patients, regardless of their age or technical proficiency**. It’s great to be a part of this MVP’s story! *Presented mockups are not real implemented design. Mockups were created for the purpose of case study.* ## AirHelp's Flight Compensation Checker – From Concept to MVP *Source: https://brightinventions.pl/projects/airhelp/index.md* In 2015 [AirHelp](https://www.airhelp.com/en-gb/) was a fast-growing startup with a mission to educate passengers about their rights. AirHelp came to us with a basic version of their iOS app and expected us to rewrite it. We developed an MVP version of the app taking care of the backend. We helped AirHelp to launch a new version of the app in the AppStore. In the meantime, the client had time to build an in-house development team that could pursue the project in the future. ![airhelp mobile app development](../../static/images/flight_compensation_app_mockup.png "It is not a real implemented design. It is a mockup example created for the purpose of case study.") *It is not a real implemented design. It is a mockup example created for the purpose of case study.* The main goal was to create a mobile-friendly tool for users that want to file a complaint about a delayed or canceled flight. The app had to be really simple and minimalistic so that users are able to quickly go with the flow even if they have to provide much detailed information about the flight. ![airhelp mobile app development](../../static/images/flight_compensation_app_mockup3.png "It is not a real implemented design. It is a mockup example created for the purpose of case study.") *It is not a real implemented design. It is a mockup example created for the purpose of case study.* We developed an MVP version of an iOS app. After that AirHelp in-house development team could continue the project. Nowadays, AirHelps successfully completed the transformation from a startup to the top global air passengers’ rights advocate. We are happy that we could assist them at the beginning of their incredible journey. ## Emergency Services Accessible to People with Hearing Loss [Confidential Project] *Source: https://brightinventions.pl/projects/emergency-contact-app/index.md* technologies: PWA, AWS Lambda, Node.js, React. Have you ever made a phone call to 911? That is one of the most stressful situations in life. **Put yourself in the shoes of deaf or hard-of-hearing people**. Imagine **their stress when they are in an emergency and cannot communicate it**. Approximately **[11 million Americans](https://nationaldeafcenter.org/faq/how-many-deaf-people-live-in-the-united-states/) are deaf or have hearing difficulties, yet 911 call centers only accept phone call**s. People with speaking disabilities are not the only group excluded from the emergency response system. Consider i**ndividuals who need to call the police while hiding from the intruder**. The inability to silently send a text to 911 could potentially endanger their lives. **We partnered with a US-based non-profit organization and together introduced a solution that aims to fight health inequity** and make emergency assistance more accessible. **A web application reaches 911 through a provider that handles the emergency request** no matter if the dispatch center supports API communication or not (then it makes a voice call on the user's behalf). This application f**eatures a user-friendly interface**, allowing individuals in emergencies to quickly report the issue. It's worth noting that **the solution is a progressive web app (PWA), which means it is a web application that can be easily accessed on smartphones without installation** from any application stores. This was a key requirement from our client, who wanted to ensure the application would be quickly accessible in emergencies. The key challenge was **designing a smooth user interface supporting people in reporting emergencies**. Given that users would be accessing the app during extremely stressful moments, this consideration was crucial. Although our team wasn’t in charge of product design, we offered our insights based on more than a decade of experience in software development. We are always deeply invested in product design because it is one of the critical success factors for most solutions. In the case of this application, it was undoubtedly the paramount factor. In collaboration with our client and based on research provided by scientists from American universities, **we finetuned a design that minimized the process, eliminated potential errors, and guided users effectively to avoid additional stress**. Another challenge originated from the core of the solution, which aims to help people and even save lives. This underscored the immense gravity of our responsibility as software providers. **Any issue in production could directly endanger someone's life**. Therefore, one of the key strategies we implemented was **performance monitoring and alerting systems**. These allowed us to **detect and respond to any disruptions before they could affect users**. The monitoring system enabled us to continuously track the application's performance, while the alerting system notified us of potential problems, allowing us to take swift action.
![emergency](/images/emergency_dispatch_app_photo.png "emergency")
**The pilot version was successfully released** in one of the American state capital cities. The app was widely **featured in the top media including NBC, Forbes, and ABC** reaching a national audience. Now the project is in a crucial phase of partnering with national dispatch systems. This application is a great example of how technology can break barriers for those in need and we are thrilled to be involved in it. ## Boosting User Acquisition with App Clip & Instant App for Relevo – a Food Take-Away and Delivery App *Source: https://brightinventions.pl/projects/app-clips-instant-apps-solution/index.md* **technologies:** Swift, SwiftUI, Kotlin, App Clip, Instant Apps Relevo changes the takeout experience by facilitating the borrowing of reusable packages in restaurants across Germany. Although their mobile app is appreciated by over 200,000 people, users in Germany still exhibit some hesitancy towards unfamiliar app downloads. This cultural obstacle was likely to stop Relevo from spreading its impactful plastic-fight mission. After recognizing the problem, our team introduced a game-changing solution.
![Relevo official materials](../../static/images/relevo_materials.png "Relevo official materials")
Our mobile development team engineered and launched an often underestimated marvel: **the Instant App and App Clip. These cutting-edge technologies grant users access to a basic version of the Relevo app without the need for a full installation**. Displayed as an intuitive pop-up on mobile devices, the **Instant App/App Clip adeptly highlights specific features, spotlighting the app's pivotal benefits**. The sample versions of Relevo’s solution are conveniently accessible either through Google Play or by scanning a QR code. If you love it, you install it. As simple as that!
![Relevo Instant App on Google Play](../../static/images/relevo_instant_app_google_play.png "Relevo Instant App on Google Play")
Relevo Instant App on Google Play
The essential aspect of the implementation involved setting up analytics to measure the users' acquisition through the channels provided by App Clip and Instant App. **We devised and implemented tracking protocols, enabling the Relevo team to meticulously monitor the results of this implementation**. The critical challenge involved **strategizing which features should be incorporated into the sample versions of the iOS and Android apps**. The challenge lay in crafting a flow that not only entices new users to Relevo but also adheres to the strict size limitations stipulated by Google and Apple. Furthermore, **the flow needed to closely resemble the final version of the application to ensure a seamless transition**. This way, switching from App Clip/Instant App would be a smooth experience.
![quote](/images/case_study_client_quote_relevo_founder.png "quote")
Once the strategic decisions were made, our team embarked on **finding optimal methods to implement these selected features within the sample versions**. This was accomplished through a modular approach, segmenting various parts of the application into distinct modules. This strategy not only enhanced clarity but also streamlined the customization process for App Clip and Instant App.
![Relevo official materials](../../static/images/relevo_official_material.png "Relevo official materials")
By implementing App Clip and Instant App, **we have streamlined the process of introducing new users to Relevo, instantly showcasing the app's key features on their screens** without necessitating a full download. Over time, users opt to install the app as they recognize its value. We are proud to affirm that both **App Clip and Instant App have evolved into significant channels for user acquisition**, reaching audiences that might otherwise be inaccessible. *Bright inventions serves both as a development partner and a sparing partner in challenging and choosing the right approach & setup.* *The excitement the whole development team is putting into our work is vivid and the communication goes beyond only work related topics. To find a development partner matching the skillset and the cultural / communicational level of bright inventions is tough to imaging.* **Matthias Potthast, Founder of Relevo** ## Breaking Free from High Fees: Restaurant Delivery Drivers App *Source: https://brightinventions.pl/projects/delivery-drivers-app/index.md* **technologies:** Kotlin, Swift Practi, later known as Just Eat POS, has been digitalizing restaurant operations for years, helping restaurants and stores across Israel and the UK find savings through technology. One major concern for restaurant owners is the **high cost associated with partnerships with third-party delivery providers**. By hiring their own drivers, restaurants can offer more affordable delivery options to their customers. However, **effective collaboration between couriers and waitstaff can only succeed with the right technology**, ensuring that in-house deliveries are just as competitive as those offered by specialized platforms. Another restaurant owners’ concern is the **inability to manage all deliveries within a single app**. Typically, when they hire external delivery providers, waitstaff has to manage separate apps, such as Deligoo. **Restaurant owners seek an all-in-one solution**, allowing their staff to handle all deliveries directly through the POS application. Practi addressed these issues by **enhancing their multifunctional POS system with a delivery management app** that connects restaurants directly with their drivers. Our team developed this solution, along with many others, during our **10-year partnership with Practi (later acquired by Just Eat Takeaway.com)**. The delivery drivers app, available for iOS and Android, simplifies the collaboration between restaurant couriers and waitstaff. **Waitstaff can easily assign orders to drivers, and drivers** also have the option to assign themselves to orders. **The app then navigates couriers to the delivery destinations**, providing all necessary order details, including payment status (whether the order has been prepaid or requires payment upon delivery). Once the delivery is completed, **the driver updates the order status**, informing the waitstaff that the meal has been delivered and confirming the payment method chosen by the client.
![UI app for delivery drivers](/images/case_study_mockup_app_for_delivery_drivers.png "app for delivery drivers mockups")
The app ensures that in-house drivers have all the essential information on their phones, eliminating time-consuming discussions with waitstaff. Since the app is integrated with Just Eat POS, **waitstaff can manage all online orders from a single device**, with real-time data transfer to drivers. This allows waitstaff to efficiently handle online orders while simultaneously managing other tasks on the same POS device. **Every online order is synchronized in real-time**, whether it originates from an external food delivery platform or is a phone order. Therefore drivers have instant access to new orders and can focus on quick order collection and delivery. One of the technical challenges was **implementing geolocation in a way that didn't excessively drain the phone's battery**. To optimize battery usage, we developed a solution that **sends location data at specific intervals when the app is active**. When the app runs in the background, location **updates are only sent when there is a significant change in the driver’s location**. This approach helps preserve the battery life of couriers' devices.
![delivery drivers app mockups](/images/delivery_drivers_app_mockups.png "delivery drivers app mockups")
The app became **a valuable asset for new and existing Just Eat POS users**. After its launch, it was especially appreciated by restaurants seeking to offer their customers in-house delivery services, free from the additional fees typically associated with popular food delivery platforms. ## Managing Substrate Treasury Proposals – Web3Foundation App Development *Source: https://brightinventions.pl/projects/bright-treasury/index.md* ![Bright Treasury](../../static/images/treasuryappwww.png) **technologies:** React, TypeScript, Node.js, NestJS, TypeScript, PostgreSQL, AWS The [Treasury](https://wiki.polkadot.network/docs/learn-treasury) is a cryptocurrency pot of funds collected mostly through transaction fees, slashing and staking inefficiency. The fund is managed by Polkadot and Kusama Substrate networks. The Treasury funds can be spent on any proposal related to developing or promoting the [Substrate Blockchain](/blog/5-benefits-of-substrate-blockchain) technology. Bright Inventions has been developing a web application that will make the grunt application more user-friendly. The project was backed by Substrate community by receiving a grant from the [Web3 Foundation](https://web3.foundation/). The first stage of development was funded by Web3 Foundation. Now the app is 100% supported by Polkadot and Kusama Treasuries.
Our focus is to attract more professionals who could contribute to the community with their ideas and skills but at the same time may not be as fluent in blockchain customs and terminology. BrightTreasury application help them apply their proposals even if they aren’t blockchain experts. The funds are available for software agencies as well as companies that want to share knowledge about Substrate such as marketing agencies or video production studios. We believe that BrightTreasury app offers a chance to increase the number of fund proposals. Eventually, it will make the Substrate Blockchain a more accessible technology. ![Bright Treasury Substrate](../../static/images/treasuryapp_www.png) Based on the discussions with the Substrate networks’ users and council members as well as the analysis of the comments under Polkadot and Kusama proposal submissions, we identified the areas that caused most issues in the Treasury funding process from the user’s perspective. The main needs that were brought up were: * a more intuitive proposal submission flow, with the clearer indication of a proposal idea being subject to the community discussion, before submitting to blockchain and committing with bond funds  * one place for following the submitted proposals, their status and the results of motions * a unified discussion forum to leave comments about the submitted proposals as well as their draft versions (ideas) * the implementation of the new bounties funding mechanism Following these needs, we have proposed a solution that will benefit the Substrate chains communities. The [custom software development](/our-areas/custom-software-development) process was broken into three milestones. The first two were completed in July 2021. The third one was completed in 2022.  ![Bright Treasury blockchain](../../static/images/treasury_www_3.png) ### Milestone 1 — Idea creating & Proposal submission & in-app logins The main goal of this milestone is to implement the core flow of the app, which is the Proposal lifecycle. As a result, the user will be able to create an Idea, add all the necessary details, create Milestones for an Idea, make it public and decide to submit the Idea to the blockchain, turning it into a formal Proposal. The status of the Proposal will be then updated based on the data returning from the API. To perform these actions a user will need to be logged in, however, browsing through ideas and proposals will be available to everyone.  ### Milestone 2 — discussions panel & treasury overview & multiple networks The goal of this milestone is to add more features to the ideas and proposals handling. The ideas as well as proposals will have the discussion functionality added and it will be possible to add them to multiple networks as well, as the representation of multiple blockchain networks feature will also be implemented at this stage. What is more, an overview of the treasury statistics will be presented for each network respectively.  ### Milestone 3 — Bounties & in-app history The main goal of this milestone is the implementation of the bounties mechanism. Users will be able to add and browse through bounties, vote for their curators and check the current status. The curators will be able to accept (or reject) their nominations and manage the bounty’s status. Additionally, in this milestone we plan to add a basic integration with Polkassembly. It will be possible to see the description of a proposal/bounty published on Polkassembly. We will also include the history feature based on the data from Polkassembly, which would allow users to browse through the closed proposals and bounties in addition to in-app ideas. BrightTreasury is live! The first version of the app was released in December 2021. After the launch the Substrate community appreciated the project and decided to support its further development and maintenance. ## Solving Problems with Printer Integrations in a Global POS System – Just Eat POS Case Study *Source: https://brightinventions.pl/projects/pos-devices-integration/index.md* **technology**: React, TypeScript, Kotlin, Spring Boot, Swift, Realm, AWS What lies behind the bustling restaurant kitchen counter? You’ll find a medley of fresh ingredients and a blend of known and unknown flavors. The kitchen buzzes with a busy staff managing multiple orders simultaneously. However, there are also crucial elements you might not consider – **numerous retail devices as part of the point of sales system**. From printers and terminals to kitchen display systems and tablets, these devices are integral to restaurant operations. Yet, their sheer **number and complexity can add to the chaos for an already overwhelmed restaurant staff.** Just Eat POS is a point-of-sale (POS) system that we have been scaling for almost a decade, **evolving from the startup Practi to a global solution within the JustEat Takeaway portfolio**. One of the system's key advantages is the uninterrupted integration of POS devices. The system we built supports devices from various producers, allowing restaurants to **easily connect their POS printers from manufacturers such as Epson, Star, and tablets with built-in printers like Citaq or Sunmi**.
![quote](/images/just_eat_quote.png "quote")
The POS system is also flexible in terms of the types of devices it supports. Restaurants and stores could **easily operate with equipment such as cash registers, electronic scales, barcode scanners, magnetic stripe readers, and kiosks**. These devices are mostly connected via Bluetooth and, in some cases, through WiFi, making Just Eat POS the central hub for all restaurant payment and order operations. We added crucial automation features to alleviate some responsibilities from the already burdened waitstaff. One such feature is the **automated order printout for the kitchen. After completing an order, a printer prints the kitchen receipt with only the essential information for the kitchen** (excluding prices, for example), ensuring that the kitchen staff receives the order promptly and can proceed with meal preparation. This automation means the waitstaff no longer has to worry about whether the kitchen receives the necessary information. As a **[POS software development company](/our-areas/pos-software-development/)** we were in charge of **unifying various devices with different Software Development Kits (SDKs) into one system**. Diving into different SDKs and hardware producers' requirements was a demanding process, but it enabled our team to greatly increase the number of devices Just Eat POS supports, giving restaurants a lot of freedom in terms of the devices they wanted to use. One of the challenges of printer integration was **maintaining a reliable connection with multiple printers simultaneously**. Restaurant employees often needed to print receipts for clients while also printing meal orders for the kitchen. To tackle this, **our team developed an efficient simple system that assigned specific roles to each printer**, streamlining the process and ensuring smooth operations.
![kitchen order receipts](/images/printed_kitchen_receipts.png "kitchen order receipts")
The system must remain reliable even if one of the printers turns off. In such cases, the mechanism designed by our team allows the system to reroute the receipt or kitchen order to another device. This assures waitstaff that, **regardless of any issues with printing devices, the system always finds an alternative way to print the document**. This is of utmost importance, especially when restaurant staff are taking orders from clients, as any printing malfunctions could negatively impact the customer experience and potentially result in poor reviews. As a result, Just Eat POS has become a system offering a stable connection to various retail devices. **It allows restaurants to choose the hardware they prefer while ensuring that, even if a printer malfunctions, the system will still manage the printing process**. This solution has been highly appreciated by restaurants and stores across Israel and the UK. ## Breaking Status Quo in Restaurants with Kitchen Display System *Source: https://brightinventions.pl/projects/kitchen-display-system/index.md* technologies: Swift, Firebase, Crashlytics, Alamofire, Realm, MVVM **This story starts in the hot, crowded restaurant kitchen full of busy staff trying to handle too many printed food orders**. This old-fashioned approach has been so deeply ingrained in the daily life of the staff that they haven’t thought of confronting the system, despite experiencing its limitations first-hand.
![kitchen printed receipts](/images/printed_kitchen_receipts.png "")
The high volume of printed receipts posed a challenge for the already busy kitchen staff, making it **difficult to keep track of them**. As a result, receipts often became mixed up, disrupting their proper order, and were prone to being lost or damaged, which made them difficult to read. They also proved ineffective as a tool for exchanging information. For instance, **kitchen personnel had no means of informing waitstaff about the progress of meal preparation**. This system also failed to provide relevant data regarding meal preparation to delivery providers, which resulted in **unrealistic delivery estimates**.
![printed kitchen receipt - example](/images/kitchen_receipt_order.png "An example of a printed receipt for a kitchen staff")
An example of a printed receipt for a kitchen staff
Our product team uncovered these limitations, deciding to change printed receipts into a screen placed in the center of every restaurant kitchen. It was high time to put receipts into the past. Instead, a bespoke Kitchen Display System (KDS) has emerged. **The Kitchen Display System seamlessly presents all orders on an enormous kitchen screen**. Additionally, **kitchen staff can update order progress** effortlessly keeping waitstaff in the loop. **KDS eliminates receipts loss, reduces paper use, and optimizes the collaborative efforts between the kitchen and waitstaff**. Finally, both teams can dedicate their undivided attention to their core responsibilities: food preparation and customer service. The new system also **improves tracking of order preparation time**, enhancing delivery estimates. This not only **optimizes driver pickups** but also **improves customer satisfaction**.
![kitchen display system mockup](/images/kds_mockup.png "")
Boosting productivity? That's another perk of our revamped system. We included color-coded indicators to identify orders that take too long to process. **The color-coding system is fully customizable, empowering restaurant staff to determine specific time thresholds associated with each color**. For instance, the red color might indicate that a meal has not been prepared within 20 minutes after ordering. The last thing that the kitchen staff should worry about is the quality of the internet connection. Therefore, **we implemented an offline mode, enabling crucial actions to be taken even offline**. To **make the transition to KDS as smooth as possible** we had to ensure instant communication across multiple environments, involving the POS application, backend, KDS, and waitstaff application. By implementing a constant synchronization the system displayed new orders on the kitchen screen in a matter of seconds. The Right UI was also a crucial factor in convincing restaurant staff to transition from their old system. **Our team collaborated closely with Practi's product designers to craft a simple, user-friendly UI that would appeal to even the most resistant end users**.
![restaurant](/images/kds_restaurant_photo.png "")
After the successful launch of the Kitchen Display System, employees of numerous restaurants across Israel and the United Kingdom finally said goodbye to unloved receipts. **KDS became a remedy to all pain points of the outdated kitchen thermal receipt system**. That’s another weight lifted off the shoulders of restaurant workers during our 10-year collaboration with Practi. Let’s continue this journey. Destination: change! ## Circles secures $16.5M in Series A and Emerges as Leading Group Support App *Source: https://brightinventions.pl/projects/online-group-support/index.md* **technologies**: TypeScript, React, Node.js (Express.js), PostgreSQL/Redis, AWS, React Native More than 1 in 5 U.S. adults, roughly [57.8 million people](https://www.nimh.nih.gov/health/statistics/mental-illness) **— a number close to the population of Italy — live with a mental illness**. However, not everyone has the means to access mental health experts and receive the necessary assistance, especially when dealing with particularly unique issues. One such issue is **narcissistic personality disorder (NPD)**. In the USA, [approximately 1 in 200 people have this disorder](https://www.therecoveryvillage.com/mental-health/narcissistic-personality-disorder/npd-statistics/). Although it is less common than other mental disorders such as depression, it profoundly affects those in relationships with individuals suffering from NPD. Given that this mental health issue is still considered niche, finding expert help to manage the challenges of such difficult relationships can be problematic. **[Circles](https://circlesup.com/), an Israeli startup, has launched a mental health tech application** designed for those dealing with grief, divorce, or simply seeking a safe space to express their emotions. After launching the pilot version, **Circles approached our team for expertise in scaling their product** in a competitive market. Initially involved in **web development**, we now offer support in other areas such as **mobile development** and **cloud computing**.
![mental health app mockups](../../static/images/mental_health_app_mockups.png "mental health app mockups")
With Circles iOS or Android app, **users can easily join audio meetings led by mental health experts**. The audio drop-in and drop-out functionality, crafted by our team, not only offers easy access to mental support but also creates a sense of community. We also developed **numerous custom features to enhance the audio room experience, including user reactions, caller queuing, a call moderator panel, and an in-built chat**. Beyond group therapy sessions, Circles provides **continuous interaction with therapists** and a **personalized mental health plan** developed by its experts.
![Client's review](/images/case_study_circles_client_quote_update.png "Client's review")
**Circles is experiencing a phase of steady growth, continually attracting an increasing number of users**, particularly in the mobile sector. **As the app's user base expands, it brings forth scalability challenges** that every DevOps team must confront. Our primary focus is not just on adapting to these changes but on proactively preparing the infrastructure beforehand. **Our current cloud computing priority is horizontal scaling** which is a technique used to increase the capacity and performance of a system by adding more instances of the same component. By horizontally scaling, **Circles will achieve higher availability, better load balancing, and the capability to handle larger user loads seamlessly, ensuring the best possible app experience for users**.
![group support app mockups](../../static/images/group_therapy_app_mockups.png "group support app mockups")
**Kobi Avriel – Former VP R&D at Circles** *We have found Bright Inventions to be a professional group of people that we feel we can trust, as an integral part of our company, not only to deliver in the right quality, but be proactive, contributing from their experience to help us shape the company’s R&D and product. Their ability to source experts has been exceptional.* *Bright Inventions is above our expectations, and we are very happy from both the great quality of people we are fortunate to work with, and the professionalism that seems to be in Bright Inventions DNA.* Notable milestones mark the journey of Circles. **In their Series A funding round, the Israeli startup successfully raised $16.5 million**. Not only do they get a thumbs-up from investors, but their solution is also making waves in the mental health community. **Circles was honored with the title of 'Best for Group Support' emerging as a winner in the Online Therapy & Wellness Awards, organized by [Verywell Mind](https://www.verywellmind.com/verywell-mind-s-2023-online-therapy-and-wellness-awards-7966994)**. We are delighted to assist Circles on their impressive way to digitalize mental health. ## Building IoT-Based Water Quality Monitoring System for Fish Transportation *Source: https://brightinventions.pl/projects/water-quality-monitoring/index.md* technologies: Swift, Android, Bluetooth Low Energy, Zebra Technologies In the food industry, precise temperature control during transportation is essential — fish transportation highlights the issue. As one of the most temperature-sensitive foods, **fish must stay between 0°C and 4°C (32°F to 39°F)**. Even small deviations can lead to contamination. Yet maintaining this precision is difficult. One of the key problems we aimed to solve for a **global fisheries export company** is the ability to monitor the temperature inside each individual fish crate, ensuring freshness is maintained at every stage of the journey — not just the overall container. To address these challenges, we set out to build a custom IoT network specifically designed for food transportation and water management — **a system that monitors critical water conditions in real time, 24/7**. We developed an integration with trackers capable of monitoring water parameters — including internal container temperature — directly inside fish crates. These trackers, paired with our custom-built software, allow the staff to **detect issues like overheating** **due to a lid left open or poor sealing**, helping maintain the ideal temperature range for maximum freshness.
![fish transportation water monitoring](/images/water_monitoring_case_study.png "fish transportation water monitoring")
Now, the staff can monitor water conditions live and access detailed graphs showing temperature at every step of the journey — from packaging to delivery. The platform **works across both Android and iOS devices**, giving teams the flexibility to use the tools they already have. While this is a major operational benefit, supporting such a wide range of mobile environments introduces its own set of technical challenges — especially when it comes to **ensuring stable, efficient background tracking**. One major challenge was the **fragmentation of Android devices**. Each manufacturer — from Samsung through Xiaomi to Zebra Technologies — customizes the Android operating system. As a result, critical functionality like continuous background scanning for nearby trackers might work perfectly on one device, while not functioning at all on another. To address this, we conducted extensive **device-level testing**, especially on models used by the fisheries export company’s team. Internally, we **test across multiple brands** to replicate edge cases and catch compatibility issues early.
![Fish export](/images/water_monitoring_case_study_fish_transport.png "Fish export")
We also **designed a comprehensive onboarding process** during the app’s first launch to ensure all necessary permissions are granted such as access to Bluetooth and precise GPS location. This helps to ensure the app performs reliably across different environments and system versions. On **iOS devices**, development was more streamlined due to the smaller number of models, but maintaining background operations still required careful tuning. Apple’s strict resource management policies meant our app needed additional optimization to function consistently in passive mode. A key part of our approach is also **optimizing battery efficiency**. Since our solution relies on continuous Bluetooth scanning, we based it on **Bluetooth Low Energy (BLE)** and optimized the data flow. Instead of sending data immediately to the backend, we batch and sync messages every 40 seconds, which keeps energy usage low without compromising data accuracy. Thanks to the implementation of our custom IoT solution for water management, a leading seafood export company has significantly **reduced the risk of compliance issues** and brand damage related to fish freshness. With continuous, real-time monitoring, the team can respond more quickly to negative conditions — helping **reduce product waste and, in turn, financial losses**. ## Crafting Stress-Free and Secure POS Bill Splitting for Restaurants *Source: https://brightinventions.pl/projects/pos-bill-splitting/index.md* **technologies**: Kotlin, Swift, Firebase, Realm, MixPanel, Fastlane After enjoying a delicious three-course meal, clients are ready to settle the bill and free up the table. But then, the waitstaff hears those dreaded words: “Can we split the bill?” **While customers love the convenience of splitting bills, it might be a different story for the waitstaff**. Their frustration typically stems from a POS system that doesn’t truly support bill splitting, making the process stressful and prone to errors. For a decade of collaboration with POS provider Practi (later acquired by Just Eat Takeaway.com), **we developed numerous features and applications, including the bill splitting that supports restaurants across Israel and the United Kingdom**. Our bill-splitting solution allows the POS system to handle all possible scenarios, **enabling the division of any component of the bill – from individual courses to delivery fees and tips**. Customers can also split the payment by paying with a credit card, cash, or coupons.
![The system divides the total costs into the specific payments.](/images/pos_bill_split.png "The system divides the total costs into the specific payments.")
*The system divides the total costs into the specific payments.* The system is designed to **fully support waitstaff by providing all necessary calculations through a user-friendly interface**, eliminating the need for manual calculations. Restaurant staff simply provides details about the number of splits, discounts, and chosen payment methods, and the system guides them through the entire process. **It not only calculates the correct amounts but also ensures that the appropriate taxes are applied after the split**.
![POS bill split mechanism for restaurants](/images/pos_bill_split4.png "POS bill split mechanism for restaurants")
Splitting the bill might seem like simple math to customers, but **complexities that require meticulous coding lie beneath the surface**. For instance, what if some customers want to pay only for specific meals while splitting the delivery fee, and one of them has a discount that applies only to their portion of the bill? What if one customer wishes to leave a tip that should be included in their part of the payment? What if the total payment cannot be evenly split (for example, try to divide $10 into three equal payments)? These scenarios quickly turn into mathematical challenges.
![tipping](/images/pos_bill_split3.png "tipping")
Our team had to anticipate and account for a wide range of such possibilities, ensuring that every aspect – **from the division of costs down to the smallest decimal, to the accurate calculation of taxes, and the application of various discounts, whether they apply during specific hours or on particular bundles – was handled by the system**. The ultimate solution to this challenge was to **conduct a meticulous analysis of as many possible cases as we could identify**. Therefore we needed to optimize our logging and monitoring systems to manage the enormous volume of data generated by these transactions, making it easier to debug and refine the feature in the future. Why was it necessary to scrutinize the payment process so deeply? Because what might seem like a simple restaurant payment can be fraught with potential issues. **From network problems and payment provider errors to complications with 3DS payment confirmations, there are many factors to consider**. Therefore, when building solutions that involve payment processing, it’s crucial to monitor data carefully to quickly identify and resolve issues, while maintaining a balance in the scope of data stored and analyzed. This led to another significant challenge: ensuring that sensitive data, such as names, surnames, or card numbers, was not collected. **In adherence to PCI DSS (Payment Card Industry Data Security Standard) Compliance, we implemented DataDog with data obfuscation techniques, retaining only the essential data** required to trace backend communication with the client and monitor the entire payment processing path. Beyond data obfuscation, we implemented other security practices, such as **two-fold protection of cardholder data, encryption** of transmitted data, and the creation and maintenance of **access logs**.
![bill splitting UI](/images/pos_bill_split2.png "bill splitting UI")
**The bill split not only meets security requirements but also complies with tax regulations** in the UK and Israel, providing a stress-free and secure experience for both customers and waitstaff. It became an essential feature of the point-of-sale system offered by Practi (later known as Just Eat POS). ## CryptoAtlas: User-Driven Development in the Cryptocurrency World *Source: https://brightinventions.pl/projects/cryptocurrency-platfrom/index.md* * Homepage feed aggregating news from other social media platforms, followed communities and influencers * Building communities * Integrations with Twitter, Medium & Youtube * Direct messages * AMA sessions with influencers * FrontEnd: React + TypeScript * Backend: NestJS, TypeORM, PostgreSQL * Deployment: Docker + Amazon Web Services (AWS) Cryptocurrency world has never had an online platform dedicated exclusively to the community. Our client from Italy wanted to change that. We offered our services and helped to build [CryptoAtlas](https://www.cryptoatlas.io) that would not only aggregate cryptocurrency news from platforms like Twitter or Youtube but also deliver its own content provided by the top crypto opinion leaders. The goal was to create a cryptocurrency platform that would fill the gap on the market. The founder’s priority is to listen to the community and offer a product that meets their expectations. Since the very beginning the target group was known, deeply scrutinized and understood by our client. Everything at CryptoAtlas is a result of feedback gathered from crypto influencers and communities. Users of CryptoAtlas have been a crucial part of this project even before the launch. The platform was launched in August 2020. It attracts top crypto influencers that now build their communities on CryptoAtlas. ![cryptocurrency social platform](../../static/images/cryptocurrency_platform.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* Bright Inventions’s development process is extremely flexible. We are open to users' ideas and constantly develop features that users expect. We try to turn users' feedback into new features in weeks, not months. It helps to build a loyal community that knows they are listened to. Crypto community is a very demanding group of users. They know what they want. Many of them have a high level of technical knowledge. That’s why CryptoAtlas has to offer a top-quality product, with a friendly interface and modern design. Month by month CryptoAtlas is gaining a steady number of new users. The challenge is to scale the product according to the significant growth of users. ## Cutting Waste in Healthcare: Building a Custom Hospital Asset Tracking Solution *Source: https://brightinventions.pl/projects/hospital-asset-tracking/index.md* technologies: Swift, Android, Bluetooth Low Energy, Zebra Technologies Hospitals are home to some of the most expensive and most critical assets in the world: life-saving medical equipment, an ultrasound machine can cost up to [30,000 USD](https://www.uscimaging.com/blog/ultrasound-machine-cost/), and even hospital beds, which can cost as much as [25,000 USD](https://hmedicalinc.com/2024/10/04/how-much-does-medical-equipment-cost/). These assets must always be available, well-maintained, and properly allocated.
![Healthcare asset tracking](/images/healthcare_asset_tracking.png "Healthcare asset tracking")
Our client, a provider of advanced asset-tracking solutions, saw a unique opportunity to adapt their technology specifically for the medical industry. Their vision? A tailored **medical asset tracking** platform that could help hospitals reduce waste, optimize inventory management, and give doctors and nurses more time to focus on what matters most – patient care. One of the key challenges they wanted to solve was time tracking during medical rounds. How long do doctors spend at each bed? Are there patterns that signal bottlenecks, or inefficiencies in ward routines? **Healthcare asset tracking** can offer answers to these questions. To meet the hospitals’ unique needs, we adjusted the tracking app that we’ve been scaling for years so now it turns nearly any piece of hospital equipment into a traceable asset. It’s thanks to small trackers attached to devices, even hospital beds and a special **healthcare asset tracking** app developed by our team. With **Bluetooth Low Energy (BLE)** any mobile device running the app, whether it’s a nurse’s phone or an administrator’s tablet, can scan nearby assets to identify them, retrieve details, and even see their most recent location on a map. Want to know where a particular ultrasound machine was last used? The app shows when and where it was moved. **Can’t find a defibrillator** that should be nearby? **You can ping its tracker directly from the app, prompting it to make a sound**, making it easier to locate in a high-pressure moment. Beyond tracking movement, the platform can also collect and display sensor data. For example, BLE sensors placed around hospital rooms can **monitor temperature in real time**, allowing staff to view historical trends through an interactive dashboard. This is especially valuable in operating rooms, neonatal units, or laboratories, where even minor temperature fluctuations can affect patient safety or the reliability of medical procedures.
![medical asset tracking](/images/hospital_asset_tracking.png "Medical asset tracking")
The **hospital asset tracking** app supports both iOS and Android devices, everything from iPhones, Samsung and Google Pixels to more rugged, industrial hardware like Zebra Technologies' phones. Hospitals can use the system in two ways: either by attaching trackers directly to assets, or by leveraging staff mobile phones as active participants in the network, acting both as scanners and trackers. One of the most innovative uses? **Attaching trackers to hospital beds**. This enables real-time insight into daily medical rounds. By monitoring how long doctors spend at each bed, hospital managers can better understand patterns, optimize schedules, and predict when a physician will be free for consultations or urgent tasks. One of the main technical hurdles (particularly on Android devices) is the **sheer diversity of phone manufacturers**. Many manufacturers apply their own custom overlays over the standard Android operating system, which often affects the background processes. This had a direct impact on one of our core features: **continuous scanning for nearby trackers**, even when the app runs in the background. On some devices, this functionality works flawlessly, on others, with some disturbances. To tackle this, we took a hands-on, multi-pronged approach. We **tested our app on a wide range of devices**, each from a different brand. We paid special attention to models known for custom firmware, like Samsung (with its One UI overlay) and rugged enterprise-grade devices like Zebra. **To support this technically, we:** * built countless unit tests to maintain logic consistency; * ran extensive manual testing, supported by a dedicated QA specialist; * conducted full regression testing before every release; * end-to-end (E2E) automated tests that verify app functionality without any developer or tester interference, eliminating the risk of human error during the testing process. We also made **app onboarding** as thorough as possible. On first installation, users are guided through a detailed setup flow where they grant essential permissions: Bluetooth access, precise GPS location, notification permissions, and disabling battery optimization. We also request the SCHEDULE_EXACT_ALARM permission, which allows the app to perform regular health checks, ensuring that background processes are running correctly and the system continues to operate as expected.
![Hospital asset tracking](/images/hospital_asset_tracking_photo3.png "Hospital asset tracking")
Another major concern was **battery consumption**. Since the app must constantly listen for Bluetooth signals, some level of battery impact is unavoidable. Our goal was to minimize that effect as much as possible. While listening has to happen in real-time, we optimized the parts of the app responsible for processing and syncing data. Instead of sending every detected event immediately to the backend, we bundle them and send updates every 40 seconds in efficient batches. This significantly reduced unnecessary energy use without compromising accuracy. We also encountered environment-specific edge cases. Every hospital is different, not just in layout, but in construction. **Hospital buildings are often large, with thick concrete walls, long corridors, and complex floor plans**. Bluetooth signals can weaken or drop entirely depending on where a device is located. In some cases, we had to adjust parameters or behavior in the app to adapt to the specific challenges of a particular hospital's infrastructure. By transforming our client’s inventory system into a **medical asset tracking** solution, we helped them successfully enter the healthcare industry. Medical equipment typically accounts for around [10%](https://www.aha.org/costsofcaring) of a hospital’s total budget. But equipment is only part of the equation. Labor remains the single largest cost for hospitals – and one of the hardest to optimize without reliable data. The **hospital asset tracking** system gives administrators a clear view into how staff time is spent, especially during daily medical rounds. In a system where every second matters, this kind of visibility doesn’t just boost operations, it helps put more time back where it's needed the most – patient’s sake. ## Digitilized Invoicing: Hassle-Free Invoices for Restaurants *Source: https://brightinventions.pl/projects/invoice-generation-system/index.md* **technologies**: TypeScript, React, Kotlin, Spring Boot, AWS In the heart of the bustling hospitality industry, invoice management is a persistent challenge. **Restaurant managers spend too much time on the tedious task of generating invoices**. Recognizing this inefficiency, **our client, a forward-thinking Israeli company specializing in digital solutions for hospitality, saw the need for change**. With a vision to digitalize invoice management in the industry, we joined forces to create a fintech solution. This innovation quickly became a key part of their digital portfolio.
![invoices](/images/invoice_system.png "invoices")
In **2016**, our journey began. Our team set out to create an **invoice generation system based on an API that guarantees a verified connection**. This system empowers restaurants to seamlessly send data for invoice creation, with invoices then accessible through a dedicated restaurant panel or sent directly via email. **Within just 3 months, we launched the first version of the product**. Our partnership with the client has only grown stronger over the years as **we continuously maintain, enhance, and modernize the system**. As our fintech solution evolved, **we incorporated several additional features, including digital signatures for invoices and key verification**. The key verification is particularly security-focused; **the system generates invoices only when the user's key matches their account**. This additional layer of security not only verifies the user's identity but also ensures the credibility of each invoice. We have also developed a **client management panel** that provides **access to all invoices**, enables customization (such as adding logos to invoices), and **generates detailed fiscal and tax reports**. These reports summarize key metrics, including the number of invoices, payment method types, and the total net and gross amount paid by each client.
![invoice generation system for restaurants](/images/invoice_system_restaurant.png "invoice generation system for restaurants")
Recently, **we implemented a critical update in line with an amendment to the VAT Law in Israel**. Beginning May 5, 2024, businesses receiving tax invoices exceeding 25,000 NIS can deduct input tax only if the invoice includes an allocation number. Anticipating this change, **we adapted our system to generate invoices with certified allocation numbers**, ensuring our **users remain compliant with the new regulations**. In our mission to provide a superb invoicing experience, our team faced **the challenge of ensuring that users could generate an unlimited number of invoices without any disruptions**. Imagine a busy restaurant manager needing to process hundreds of invoices at once – this task needed to be efficient. To make this possible, **we designed a request queue system**. This system works in the background, generating invoices without impacting the application's performance. Restaurant managers can **send vast amounts of data for invoice creation and continue using the software without any slowdowns or interruptions**.
![invoices](/images/invoice_system_photo.png "invoices")
This solution was **crucial in preventing potential application crashes** that could occur from handling a high volume of simultaneous requests. By implementing the queue system, we effectively minimized this risk, ensuring a smooth and reliable experience for all users. **For over 8 years, our invoice generator has been a notable tool for efficient financial operations in the dining industry across Israel**. We had the opportunity to create this fintech solution from scratch, nurturing its growth and evolution through continuous software modernizations and updates. ## Codeforia: Empowering the Next Generation of Coders with Gamified Learning *Source: https://brightinventions.pl/projects/e-learning-coding-platform/index.md* technologies: Next.js, React In today's world, programming skills are as essential as learning a foreign language. Yet, **public education systems struggle to engage young people in programming courses**, leaving a significant skills gap unaddressed. For instance, over [40%](https://op.europa.eu/en/publication-detail/-/publication/59721dc6-a0aa-11ef-85f0-01aa75ed71a1) of eighth-grade students across 22 EU education systems have not attained basic digital skills. Similarly, in the USA, only [60%](https://www.eschoolnews.com/steam/2024/11/26/computer-science-education-more-investment-access-gaps/) of public high schools offer foundational computer science courses. To address this challenge, our client – an [established programming school](https://www.jacektomasiewicz.pl/) – set out to develop an edtech platform dedicated to programming education. Leveraging their extensive experience in delivering effective programming courses, they decided to launch a customized web platform offering a diverse range of paid online programming courses. The client’s goal was to rapidly develop an e-learning platform that would expand their educational offerings and **attract clients from the education sector, including schools and universities**. The client enlisted our assistance for frontend development. While we were primarily responsible for implementing the client’s design mockups, our role went beyond execution. We proactively **provided guidance and shared best UX practices, ensuring a polished and user-friendly final product**.
![Codeforia](/images/codeforia_task.png "It is a mockup example created for the purpose of the case study. It is based on the design made by Codeforia Team.")
*It is a mockup example created for the purpose of the case study. It is based on the design made by Codeforia Team.* Now Codeforia offers 15 comprehensive Python lessons and over 200 programming tasks designed to engage learners in hands-on coding practice. The platform includes a **user-friendly code editor** with both light and dark mode options, adhering to common UI standards. It also features a **built-in debugger** and a crucial tool for tracking progress: **code submission history**, ensuring no modifications are ever lost. What truly sets Codeforia apart is its automated code testing feature, allowing users to instantly check and validate their solutions through pre-designed test cases. One of the key challenges was **building an app that would actively engage students in course participation** while encouraging them to complete new tasks. Based on our recommendation, the client implemented **various gamification features, including progress tracking, insights into mastered skills, and information on skills yet to be acquired**. These enhancements were designed to boost user engagement and increase online course completion rates.
![Mockups edtech](/images/codeforia_progress.png "It is a mockup example created for the purpose of the case study. It is based on the design made by Codeforia Team.")
*It is a mockup example created for the purpose of the case study. It is based on the design made by Codeforia Team.* The beta version of the platform was launched in 2023. We have continued to support the development cycle during the critical months post-launch. Today, **Codeforia empowers individuals, organizations, and schools in developing essential digital skills**. We are confident that Codeforia will inspire countless young people to discover their passion for programming! ## Optimizing Medicine Distribution for UK Care Homes *Source: https://brightinventions.pl/projects/emar-healthcare-solution/index.md* **technologies:** Kotlin, Swift, Bluetooth, Adobe XD **In the United Kingdom, approximately [17,100 care homes are dedicated to accommodating over 400,000 individuals](https://www.braemarfinance.co.uk/s/insights/blog/facts-figures-uk-care-home-sector-MCXEQ2ZU7QKVFOBOP272VSXJDDWQ#:~:text=The%20care%20home%20sector%20in,after%20more%20than%20400%2C000%20people.)**. The UK's care home sector plays a pivotal role in supporting those in need of professional care. In the extensive array of duties borne by care home providers, the task of **medicine distribution is a crucial and demanding responsibility**. The lack of digitalization in this area has cast a long shadow, leading to a confronting reality where **communication between pharmacies and care homes is fragmented and historical data on patient medication distribution alarmingly inaccessible**. Our client is a UK-based health tech company aiming to streamline medicine distribution for care home professionals.
![eMAR](/images/home_care_health_tech.png "eMAR")
Upon the debut of their initial **Electronic Medication Administration Record (eMAR) solution, the client reached out to our team to explore a collaborative effort to refine and advance the product to a more sophisticated stage**. As a result, a comprehensive eMAR solution has been developed together with a mobile application, accessible on both Apple and Android devices, which now **provides seamless access to patients' medical history and prescribed medications**. This application facilitates **real-time updates on medication intake** accessible for healthcare providers, patients, and their families. The **offline mode empowers caregivers to make essential updates without concern for internet connectivity**. Furthermore, our collaboration with the client includes implementing a system that mandates supervisor approval for significant treatment changes, fostering a collaborative approach. **The system also minimizes errors by promptly notifying care home staff of potential missed medications, thereby lightening their workload through our client-centric solutions**. **Our challenge was to help the client create a system that truly enhances daily operations instead of adding to the workload of care providers**. In response, we designed an interface that prioritizes essential information, ensuring all critical patient data is accessible on a single screen. Based on detailed field studies and research, we identified that end-users desire quick access to patient information and don’t want to navigate through multiple screens to obtain it. **Therefore, we prioritized creating an interface that is intuitive, speedy, and seamless to meet their needs**. Navigating through another challenge, our collaboration intensified as we honed in on enhancing a pivotal HealthTech feature – **offline mode**. Recognizing the significance of a reliable app in time-sensitive situations, we worked closely to design an interface that distinctly indicates when users are in offline mode, fostering seamless data synchronization at a later stage. We helped our client during the crucial post-MVP phase to build a solution that addresses all the needs and requirements of the nurses and doctors working with the system. **eMAR now supports a wide range of care homes across the UK**. As the population ages, the demand for care services that allow older individuals to remain in their homes becomes increasingly important. Therefore, solutions like eMAR will play a significant role in digitizing healthcare. During our collaboration, we also built the [Remote Patient Monitoring with wearables and a telemedicine application](/projects/remote-patient-monitoring/). Read more about it in another case study! ## Turning Smartphones into Terminals with Card Payment App *Source: https://brightinventions.pl/projects/credit-card-reader/index.md* * Integration with an external card reader * Card scanning (magnetic stripe reader) * Card scanning and automatic data recognition (based on the card’s photo) * Card charging * Sending the bill/invoice to the customer’s email address * Transaction history Despite the high demand for cashless transactions, not all companies worldwide have access to or can afford to use payment terminals. For instance, while the above payment methods are ubiquitous in Europe, they are far less common in countries such as Israel. In order to bridge this gap on the Israeli market, our client decided to develop a mobile app that would allow businesses to accept card payments without a physical terminal. Our client, a company that operates on the Israeli market, reached out to us with the goal of developing an iOS app for their payment service. The objective was to allow users to accept credit card payments without a physical terminal. When we first started our cooperation, the clients already had an up-and-running backend for the service, as well as a design for the intended interface. All they needed was to bring the mobile app to the market. The goal was to allow the end-user to attach a separate device to their phone via a mini-jack or lightening/USB-C, that would allow reading the data stored on the card’s magnetic stripe. This required the right technical approach towards decoding the information stored on the card. ![cashless transactions app](../../static/images/card_reader_mobile.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* Initially, Bright Inventions was entrusted with the development of the iOS app only. However, as we proceeded with our cooperation, we have also been assigned with bringing the Android app to the market. While the external device for credit card scanning was chosen by the client, it was our responsibility to solve the issues with the device’s SDK – namely, it refused to work on the newest operating systems. Another obstacle was that the application was developed at the exact time when the newest iPhones premiered without an audio jack, which meant we needed to develop a lightning jack module. The third challenge our mobile app developers tackled was ensuring that the app operated properly in Hebrew, i.e., in a right-to-left (RTL) language. This was especially important when it came to critical transaction data, such as properly displaying the amount charged. ![cashless transactions app](../../static/images/card_reader_mockup3.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* The application was successfully delivered and launched in both Google Play and the iOS App Store. The app is present on the market and used by a whole range of customers. ## Driving a 35% Increase in Benefit Card Payments Through Tailored POS Integration *Source: https://brightinventions.pl/projects/pos-integration-benefit-loyalty-cards/index.md* technologies: Kotlin, Spring boot, AWS ECS, .net, Flutter, Grafana A leading point-of-sale vendor needed to expand their payment offering as part of a broader [POS legacy system modernization](/projects/pos-legacy/). The goal was to support a wider range of secure payment options, including **benefit cards, employee meal cards and loyalty programs**, alongside traditional methods like cash and credit cards. We centered this [POS integration](/blog/pos-integration/) around major benefit cards and loyalty cards in the Israeli market, where our client operates, including payment providers such as **Multipass, Verifone, Cibus, and Value Card**. To meet the client's needs, we built a comprehensive integration that connected their iPad-based POS systems with various payment providers via a real-time API. This allowed restaurant staff to offer a seamless checkout experience – customers could now select their preferred payment method, including **benefit cards**, and the system would automatically apply relevant discounts or benefits. Technically, the integration works by sending a charge request from the POS to the external payment provider’s API, debiting the customer’s account with the order amount. The system then uses the provider’s response to update the payment status within the POS. One of the first challenges was strategic: with plans to integrate with five different payment providers, we had to prioritize carefully. We worked closely with the client to **identify the most critical payment providers** for their restaurant clients and started implementation there, ensuring maximum value early in the project. A significant hurdle was the **limited or inconsistent technical documentation** from some of the third-party payment providers. While a few partners offered robust, well-documented APIs, others required a more hands-on approach. We engaged in extensive, thoughtful email correspondence with provider support teams to clarify edge cases. We also faced the challenge of **unifying payment logic and mapping discounts and confirmations** across all third-parties. Each payment provider had a slightly different process flow, response format, and timing. To maintain a consistent user experience and back-end reporting logic, we had to **adapt our internal system to normalize these differences**. It ensured that every transaction, regardless of provider, was correctly processed, recorded, and confirmed. To solve this, we developed for the POS system a **dedicated microservice** responsible for managing communication with external payment providers. This service acted as a proxy layer, handling request formatting, authentication, and response parsing. We also built a lightweight service that **mapped the local order data into a standardized payment request format** and routed it through the microservice. This architecture not only simplified the client-side logic but also made it easier to scale and onboard new providers over time. The impact of the integration was clear almost immediately. In just the first month after launch, **meal purchase through benefit cards rose by 35%**, indicating strong user adoption and improved convenience for customers. By the end of the implementation, restaurants gained access to a broader set of payment options beyond the usual methods. This added flexibility not only improved the customer experience but also **strengthened our client’s position** in the highly competitive point-of-sale market. ## Real-Time Location Experience with iBeacon Tech in Housing Market *Source: https://brightinventions.pl/projects/easytapp/index.md* * Browsing through residential and car listings (with photos) * Defining search parameters for items and locations * Adding real estate and automotive listings to users’ ‘Favourites’ lists EasyTapp was an iOS and Android app that allowed users to browse through real estate and automotive listings. The app triggered push notifications on users’ phones in real time, as they were passing by a residential property or car that were up for sale. ![easytapp mobile app development](../../static/images/easytap_quartet1_copy.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* When Bright Inventions first started working on the project, the company already had an operational backend and ready-to-implement designs for the user interface. They now needed a reliable mobile development partner to bring their iOS and Android apps to life. Firstly, the goal was to allow users to browse through, filter, and save car and real estate listings to their ‘Favourites’ lists. Secondly, EasyTapp founders wanted to help sellers bring attention to their offers by leveraging user location data. Namely, they wanted the app to trigger push notifications on users’ screens, informing them that they were in the vicinity of a car or real estate that were up for sale on the EasyTapp platform. ![easytapp mobile app development](../../static/images/easytap_1_mockup1.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* The key challenge Bright Invention developers had to face was finding a technological solution that would allow the app to synchronize effortlessly in the background without draining the device’s battery (as it’s often the case if location data is enabled in the background). For this reason, our experts decided to bet on iBeacon technology. If a seller purchased an iBeacon device, they would have been able to trigger automatic notifications on potential buyers’ screens, as they passed by the car or property. Such an approach was much more efficient and battery-friendly compared to the GPS-based alternative. The application was successfully finalized and launched in Google Play and the iOS App Store. ## Elevating the Retail POS: Integrating Tap to Pay for Effortless Transactions *Source: https://brightinventions.pl/projects/tap-to-pay-pos/index.md* technologies: Android, Kotlin, iOS, Swift Imagine transforming a smartphone into a fully functional payment terminal – no extra hardware, just a tap. That’s the magic of Tap to Pay. It means transactions can happen **card-to-phone** or even **phone-to-phone**, making the checkout process quicker, and incredibly convenient. This was especially appealing for businesses on the go or those looking to trim hardware expenses, as these are core characteristics of our clients user base. To bring this vision to life, we designed a dynamic **payment flow that cleverly adapted to the user's Stripe integration status**. We introduced a series of intuitive onboarding and payment screens. If a user didn’t yet have an active Stripe integration, selecting Tap to Pay would guide them through connecting an account, completing necessary setup steps like registering a terminal location, and then proceeding to accept payments. For those already integrated with Stripe, it was a straight shot to accepting a Tap to Pay transaction, no interruptions.
![Tap to Pay](/images/payment_phone.png "Tap to Pay")
The path to implementation wasn't without its twists. One of the primary challenges with Tap to Pay on iPhone was **Apple's requirements**. Enabling this feature in a production environment demanded a special entitlement from Apple. This wasn't a simple click; it required the Apple Developer account holder to submit a formal request, and only after approval could development and testing truly begin. Until that entitlement was granted, our testing was confined to local environments via Xcode. Distributing the feature to testers or staging environments was impossible. This forced us to meticulously sequence development tasks, prioritize what could be tested locally, and align our timeline with Apple’s review process. Another significant hurdle was integrating Tap to Pay alongside the existing payment methods while also **addressing regional availability**. Tap to Pay is only supported in select countries, necessitating careful control over feature propagation based on the user’s location. Our solution was a **gradual rollout strategy** using remote configuration, allowing us to enable the feature selectively and monitor its stability in real-time. Beyond the technicalities, we faced the challenge of **introducing this new feature to retailers**. Its success hinged on users being aware of its availability and feeling confident using it. This demanded early and close collaboration with the marketing team to craft clear messaging, intuitive onboarding flows, and effective in-app communication. From day one, our focus was on building a simple, intuitive user interface with clear screens, ensuring users could complete a payment confidently, even on their very first try. The integration of Tap to Pay on both iOS and Android platforms proved to be a game-changer for our client's retail operations. It didn't just streamline the checkout process; it elevated overall customer satisfaction. This adoption aligns perfectly with global trends in contactless payments. For instance, [Visa](https://investor.visa.com/news/news-details/2025/Visa-Tap-to-Phone-Adoption-Soars-200-Year-over-Year-Growth-Worldwide/default.aspx) reported a **200% year-over-year growth in Tap to Phone adoption worldwide**, underscoring the rapid expansion. And now our client is a part of this huge global change in contactless payment. ## Eliminating Device Clutter with POS and Food Delivery Apps Integration *Source: https://brightinventions.pl/projects/pos-third-party-delivery/index.md* **technologies**: Kotlin, SpringBoot, AWS, TypeScript Let’s step behind the restaurant counter and observe the waitstaff in action. In addition to serving in-house guests, they must **manage online orders from third-party food delivery platforms** like Wolt and Uber Eats. **Each platform provides its own device for managing orders**, adding to the growing number of devices that already overwhelm the busy staff (from a point-of-sale desktop to payment terminals, thermal printers, and more). But **what if all third-party, in-house, and phone orders were automatically integrated into a single device**? That was the goal of the food delivery providers integration we developed for the Practi POS provider (later known as **[Just Eat POS](/projects/system-for-restaurants/)**) for restaurants in Israel and the UK. A key aspect of this integration is **menu synchronization**. Any changes to the menu – such as prices, unavailable items, or ingredients – are automatically updated across all food delivery platforms, eliminating the need for waitstaff to manually update each one. However, if a restaurant wants to for example set different prices for various platforms, they can easily make those adjustments using the simple POS interface:
![POS delivery integration UI](/images/pos_delivery_integration_ui.png "POS UI")
The true gem of this integration is **the real-time synchronization of every order on the Just Eat POS system**. Whether it's an online, on-site, or phone order, all information is automatically displayed on the primary POS device. This means the waitstaff can finally retire the multiple devices provided by third-party platforms. Now, **everything is accessible through the Just Eat POS device – the only one the restaurant needs**. This automation also eliminates the errors occurring when busy staff manually transfer online orders to the main POS device so they can be sent to the kitchen. Now, **orders are processed automatically, speeding up meal preparation and delivery**. What’s more, order statuses are available on the same device, **keeping the waitstaff informed** throughout the process – from order acceptance to delivery. Integration with food delivery platforms aligned perfectly with other parts of the multifunctional Just Eat POS. For example, **if a restaurant prefers to manage deliveries in-house, they can also use the [delivery drivers application](/projects/delivery-drivers-app/) offered by Just Eat POS**. Thanks to order synchronization, every order is available in the app, making it easy to coordinate deliveries. The app provides drivers with all the necessary information for a successful delivery, including the customer’s address, navigation with a map, and payment status. The **greatest technical challenges lie in menu and order synchronization**. To keep all data synced across multiple platforms, restaurants rely on a stable internet connection, which isn’t always guaranteed. In cases of lost connectivity, our team implemented solutions to ensure proper synchronization as soon as possible. **We developed automatic monitoring of the integration status, continuously checking connection stability**. If disruptions occur, the system will automatically restore the connection once available to synchronize all menu and order information. Additionally, to achieve real-time order updates, **we had to design a mechanism that would automatically receive, verify, and process every order**. The POS system also updates order statuses and driver information, ensuring this data is available to the third-party provider. For example, with Just Eat POS, **users can track the order's delivery progress, even though the waitstaff manages the order exclusively through the [POS device](/blog/what-are-point-of-sale-devices/)**. Another challenge related to synchronization was **automating the import of menus from third-party providers to sync with the POS**. This was difficult due to the complex meal sets, with multiple bundles, and add-ons, as well as the different data structures used by each food delivery app. Our team had to analyze these differences and **implement a mechanism to transform the various data structures into a unified format**, ensuring synchronization with the POS system while accommodating the complexities of meal sets, bundles, and add-ons. Food delivery integration has been one of the most impactful changes, instantly making the waitstaff's work easier. Thanks to this integration, **Just Eat POS has firmly established itself as a truly versatile solution, offering connections with a wide range of third-party providers**. Our team developed this integration from scratch, along with dozens of other applications and features built for Practi (Just Eat POS) throughout our decade-long partnership. ## ePOS and RMS *Source: https://brightinventions.pl/projects/epos-and-retail-management-system/index.md* ## Main features: - Printer and cash drawer integration - Reporting services - Analytics - Data export and import - Third party integration ## Skills: - **iOS:** Objective-C, Swift, ReactiveCocoa - **Android:** Kotlin, AndroidX - **Backend:** Kotlin, Java, Node.js, Docker, AWS, MySQL, PostgreSQL - **Frontend:** Angular, Babel, Elastic Beanstalk, Docker ## Faster Labeling Printout with Custom Zebra and Shopify Integrations *Source: https://brightinventions.pl/projects/custom-labeling-printout/index.md* Our client, an e-commerce business specializing in animal catering, faced a significant operational bottleneck. Each morning, their team **manually printed vast numbers of labels** one by one to attach to individual meal packages. Crucially, they also had to **manually click within Shopify** to confirm each label was printed. This manual process was time-consuming and highly prone to errors. They approached us seeking to **automate label generation and printing**. Their primary goal was one-click printing of all necessary labels, directly integrated with their Shopify data. Also, they specifically aimed to achieve a truly customized label that could convey comprehensive product details and reinforce their brand. Given they operate with **Zebra Technologies** printers, it was crucial that these new, detailed labels were precisely rendered on their existing hardware. The market offered no off-the-shelf solution that met their nuanced requirements. This drove them to seek a custom integration with Shopify and Zebra Technologies printers, a solution that could truly change their fulfillment process. We developed a unique server-based application that seamlessly integrates with a local printer application. The printing process is now fully automated. The team can now **print every label with a single click, or even set up automated printing schedules at predetermined times**. The integration with Zebra Technologies label printer is also a bespoke solution, as no existing market offering could precisely handle the client's needs for printing on specific Zebra printer models, **accommodating their chosen paper type and sticker format,** nor allowing for the desired level of custom label design.
![Zebra Technologies](/images/zebra_technologies_label_printer.png "Zebra Technologies")
Their previous Shopify setup offered severely limited label customization. Our solution unlocked the ability to include vital information directly on labels, such as **preparation instructions, meal nutritional values, and a fully expressed unique brand identity**. This ultimately created an informative, and visually appealing packaging experience for pet owners, enhancing brand perception. A significant challenge revolved around rigorous label testing to ensure precise printing. This required continuous access to the client's specific Zebra printers throughout the development phase. Fortunately, **Bright Inventions, as a registered Zebra Technologies partner**, possesses both the necessary hardware access and extensive experience with printer integrations. This allowed us to conduct real-time print tests and iterative adjustments, ensuring every detail of the custom labels was perfectly rendered from the outset. Our solution delivered a unique brand experience for the client's customers, **allowing [Boosa & Co](https://boosa.co/)** **to truly stand out** in the competitive animal catering market. Internally, we accelerated the team's daily workflow, **freeing them from the manual burden of label printing** and enabling them to focus on core business operations. ## Finebite’s Pivot Story: Loyalty App Hits 1M Users with New Reservation Feature *Source: https://brightinventions.pl/projects/everytap/index.md* * Highly polished user interface * Integration with restaurants management systems * Integration with online payment platform with 3DS * In-depth user behaviour analytics * A/B testing Let’s be honest – halfway through the working day, we all have the same recurring thoughts on our minds: “time for lunch!”. However, if you haven’t come prepared with your own meal, you might also have to decide where to head out for lunch in the first place. The same goes for spending an evening out in town – where should you head over to with your friends to grab a bite (and a fulfilling one, at that!)? Everytap and Finebite, two restaurant loyalty and reservation apps for iOS and Android, were designed to make finding the answer to these questions just a few clicks away. Since Everytap first launched in 2014, it has steadily transformed from a restaurant loyalty app into a much more sophisticated platform – thus paving the way for its younger counterpart, Finebite. Bright Inventions has worked on the ideation and development of both platforms, as discussed below. Apart from an online reservation feature, Finebite also currently offers a truly unbeatable perk – 50% off the entire menu in return for an online review or filling in a restaurant survey. This, in turn, lets restaurants acquire more guests during off-peak hours, receive more reviews, and collect feedback privately. Now, if that doesn’t make you feel a sudden urge for dining out, we don’t know what does! Bright Inventions has been a partner of Everytap and Finebite from the company’s early days. Throughout the years, we helped ideate, develop, and rebuild the app from scratch and turn its first version, Everytap, into a whole new service – Finebite.
![Review from Finebite](../../static/images/case_study_finebite_client_quote.png "review from our client")
Back in 2014, the founders have entrusted us with developing an app that would revolutionize the way restaurant visitors participate in loyalty programs, and encourage them to dine out more frequently. Initially known as Everytap, the service was to substitute physical discount cards with a more visually-appealing, interactive alternative that would let them collect points/stamps in the app. With this idea in mind, the founders have asked for our assistance in verifying the concept against the market and building two native apps for iOS and Android. The app was to leverage users’ geolocalization to show personalized deals at nearby restaurants and allow them to collect loyalty points upon payment. We worked with the Everytap team to establish how their potential customers’ needs and benefits – both those of restaurant-goers and restaurant owners – could be best addressed. Once we made sure both target user groups could genuinely benefit from using the app, we moved on to defining its technical requirements. Apart from deciding on the technology used for the two mobile apps and backend, we also had to tackle the challenge of integrating a solution that would leverage users’ geolocation. This was necessary for the functioning of two key features of the app – loyalty points’ collection and redeeming special offers. We knew that we needed to integrate the app not only with Google Maps and Facebook but also with a technology that would trigger location-based push notifications on screen. We decided to turn to iBeacon – a Bluetooth-based technology. For this purpose, we integrated with an iBeacon service offered by [Estimote](https://estimote.com/). Once introduced into the app, it became possible to trigger notifications to users as they entered or passed restaurants. iBeacon technology also enabled users to collect and spend points at partner venues via the app. For backend, our developers chose Ruby-on-Rails – specifically, they worked with MongoDB and Heroku. The product design team was also engaged in the process – we equipped the app with plenty of custom animations and UI effects, designed to help navigate the app.
![Finebite app designs](/images/in_text_finebite_mockups.png "Finebite app designs")
Mockup examples designed by Finebite's Product Design Team.
The app first launched in the Apple Store and Google Play stores in 2014 and gained significant popularity across Poland. The Everytap team was, however, well aware that they could not rest on their laurels if they wanted to remain competitive to its users for years to come. Since the app’s launch, the Everytap team kept close track of app store reviews and feature requests so that they could drive customer-inspired changes. They have also ongoingly worked on optimizing the business model so that it remained attractive to restaurants. And so, step by step, the app transformed from a service offering promotional offers and loyalty points’ collection to one that let its users dine for half the price and book tables online. Restaurants have also been given the possibility to run multiple offers in the app (whereas, in its early day, Everytap offered just one a day). Eventually, the Everytap team also decided to drop iBeacon technology. Namely, ever since the online reservation panel had been introduced, users passing near restaurants stopped being the target group. While Everytap founders hit the jackpot with these changes, they weren’t entirely satisfied with where it took the overall UX, stability, and performance of the app. And so, they have reached out to us with a radical decision – they have decided to bid farewell to Everytap and turn it into Finebite, a sophisticated, robust restaurant platform. For this to happen, the app needed to be either significantly rebuilt, or created from scratch. Given Everytap’s technology debt, we agreed that the second option was the best direction to go. And so, our teams have once again joined forces to bring Finebite to the market. From a technological standpoint, the key difference between both apps was that we chose not to reuse the same technologies. And so, for Finebite we decided to drop Java in favor of Kotlin (Android) and substituted Objective-C with Swift (iOS). From a user’s perspective, the app is now much more intuitive, features a cohesive design, and offers top-notch performance. *They kept us in the loop at all times and provided updates and progress reports on a weekly basis. They were also very accessible, and interactions between our designers and their developers were productive. They made us feel like we were one cohesive team, even going so far as to build a workstation at their office for our lead backend developer.* **Adam Pachucki, Head of Product at Finebite** During the past 5 years, the app has evolved from a loyalty program service to a sophisticated reservation and customer review platform. Finebite has been steadily growing and expanding to new markets. Users admit that Finebite is a true bridge between the world of new technologies and the traditional dining experience. They also admit that the app encourages them to dine out more frequently and share their feedback with restaurants and the diners’ community. In the words of one of its users, Finebite “is a very cool option for regular diners as well as an encouragement to try something new. In general, one of the most sophisticated Android applications”. ## Food Delivery iOS App Modernization: SwiftUI & Modern Concurrency Migrations *Source: https://brightinventions.pl/projects/leading-food-delivery-app/index.md* **technologies**: Swift UI, Swift Concurrency, Firebase, Apple Pay Our client, **a leading global online food delivery marketplace**, sought our expertise in iOS development to enhance their already popular food delivery app and benefit solution in Israel. **They required a highly skilled [mobile development](/our-areas/mobile-app-development/) team with strong cohesion and experience working together for years**. Our iOS experts quickly took charge of the existing app and **swiftly familiarized themselves with the app's structure and underlying code**. That smooth transition allowed us to efficiently maintain the current solution while simultaneously planning and executing further modernizations and development. **For over 2 years, we have been developing this unique solution that serves both B2C and B2B markets**. This is not an ordinary food delivery app; it also functions as an employer benefit platform. With the app, companies can transfer funds to their employees, who can use this money to pay for lunch or grocery shopping. Thanks to the **integration with Apple Pay and local payment providers**, users can securely manage their funds with ease. Also, the app combined with a special card unlocks unique bonuses and discounts. That's an additional key element that drives employers who want to share special offers with their employees. The application is a **native iOS solution**, a domain in which our team excels. We handle the tech side of the project holistically, covering mobile development, quality assurance, performance monitoring, and key tech and business decision consulting. We work in close collaboration with client representatives, including project managers and product designers.
![food delivery app](/images/food_delivery_photo_case_study.png "")
One of the primary challenges is planning code modernization in line with ongoing development while ensuring high performance. **A significant migration we are currently undertaking is the switch from UIKit to SwiftUI**. SwiftUI allows the software team for faster view prototyping, helping our client save resources. However, updating a highly popular application is a marathon, not a sprint. Transitioning to SwiftUI, especially for a widely used app, involves meticulous planning and execution. We are diligently progressing through this transition. We are committed to implementing the top solutions Apple offers, including SwiftUI for more efficient UI development and Swift Concurrency for writing asynchronous code. Implementing the top iOS stack ensures that **with every new iOS release, the application will be swiftly adjustable and new updates quickly accessible to users on new Apple devices**. A crucial part of code modernization is also **shifting from asynchronous code to Modern Concurrency, which improved the app’s stability by eliminating data races** (when two threads access the same data concurrently and at least one modifies it) and **increasing thread safety** (the protection of data from concurrent access issues). Another challenge we faced was the **effective testing of screens with Hebrew UI known for RTL (right-to-left) language**. Although our team has over a decade of experience developing mobile and web solutions for the Israeli market, ensuring efficient testing is crucial. T**hanks to snapshot testing, we can generate snapshots of particular screens. A special engine helps testers analyze differences between the UI design and the testing environment**, predicting issues such as misaligned buttons. When testing a UI based on a language you are unfamiliar with, tools like these are invaluable. **Our client deeply appreciated our approach to quality assurance, engaging a software tester from our team to be part of the mobile team developing the Android version of this application.**
![](/images/food_delivery_case_study.png "")
After just a couple of weeks of joining the project centered around a highly popular product, we were able to take care of the solution smoothly. **Not only do we maintain it, but we also keep developing it, adding new features**. Among them is a **users' subaccount** where they can keep leftover funds for future spending, as well as an **active order banner** where users can check the order progress without refreshing the app. Thanks to the **quick search feature**, users can also look on the map for restaurants in the area and quickly view the menu and possible discounts. While adding all these new features and conducting code modernization simultaneously, we ensured that users didn't experience any negative effects from the changes we introduced to the code. **The app continues to grow as a leading food delivery solution in Israel**. ## From MVP to a Solution Helping People in Asia and Africa *Source: https://brightinventions.pl/projects/card-tracking-system/index.md* **technologies:** React.js + Redux, MaterialUI + styled-components, Node.js, NestJS, Kotlin, AWS – CloudFormation, TeamCity In the world affected by military conflicts, social inequalities and the rising number of refugees the aid provided by **NGOs and humanitarian organizations must undergo digitalization to effectively address global challenges**. While media coverage often focuses on refugees making long journeys to Europe or the USA, the reality is that **the majority of refugees reside in Asian countries**. According to [resque.com](https://www.rescue.org/article/facts-about-refugees-key-facts-faqs-and-statistics) Jordan hosts the second-highest number of refugees per capita in the world. In regions such as Africa and Asia, far removed from the global media spotlight and influencer attention, the battle for an improved quality of life is ongoing. **Humanitarian organizations strive to aid not only refugees but also those hailing from the poorest regions and those who have lost their means of livelihood** and shelter due to natural disasters. Technology must become a handful tool for organizations aiming to help. **The Card Tracker System is one of the humanitarian projects harnessing the power of technology for aid**.
![Natural disaster](../../static/images/natural_disaster-girl.png "Natural disaster")
Our client, **one of the leading global humanitarian agencies, approached us looking to create a system that would improve their payment instrument distribution process**. As part of the agency's ongoing effort to support people in need in some of our planet's poorest regions, **the agency distributes payment instruments (prepaid cards, SIM cards, vouchers, etc.) to local communities around the globe**. This, in turn, **allows beneficiaries to acquire essential items** like food, hygiene products, and other necessities for their families.
![QR code](../../static/images/qr_code.png "QR code")
The client required a **system that would follow the payment instruments at every stage** – all the way from the point of order to distributing them to the beneficiaries and beyond. The system was required to show the cards' status to ensure they fulfilled their purpose: giving resources to families living below the poverty line. Any fraudulent activity was to be tracked by the system and dealt with accordingly by the staff on the ground. The system didn't monitor the payment transactions the card was used in. Still, it tracks the handing over of cards between different departments and organizations within the humanitarian agency. Thanks to that, **the client can quickly check how many cards are ready to be distributed and how many have already been passed on to end users**. The system was developed on two platforms. **The web application acts as the back office application, mainly displaying events logs and the issued cards' status**. Meanwhile, the **Android mobile application enables scanning of the cards**, sending data between the on-the-ground staff and the offices, and recording when they are distributed to the end users. In this project, **Bright Inventions handled every aspect of the project**, from product design work all the way to backend and frontend development to deployment and maintenance. The project goal was to **create an automated, transparent, and uniform system allowing the delivery of payment instruments to people in need**. The system has to work globally; therefore, it has to be easily adjustable to local law and the specific situations of different communities in Africa and Asia. The system also requires to **support card distribution in poor internet coverage areas**, making an offline mode a must. We had the privilege of **starting the whole development process from scratch**, starting with the product design side of the proceedings. The development process required us to **turn the manual card distribution process into a digital flow**. The Card Tracking System was **developed as an MVP**. The goal was to build crucial features, release the product, and quickly verify if it meets the clients and their users' expectations. As the **feedback for the initial MVP was positive**, we started further work on delivering the full version of the app.
![Payment with phone](../../static/images/payment_phone.png "Payment with phone")
The social impact this solution would make meant the discovery and prototyping phase was crucial in establishing an understanding of the various aspects of the project. For example, during the process, we found that the **eligibility criteria for an individual to receive the cards varies from country to country** and is sometimes linked to the specific life circumstances of the beneficiaries. We also had to **account for people without the proper ID required by the local authorities**. Some of the refugees in question left their homes so quickly that they did not have any documents at all. Each of these instances affected the flow of the app, creating more work for the product design team. **Close cooperation with the agency employees was vital during the prototyping and discovery phase**. These people work on the ground and understand the local processes and circumstances the refugees face. The information they shared through a series of interviews was crucial in understanding the solution needed. These interviews allowed us to customize the final product to the needs of the staff working across the humanitarian agency. At Bright Inventions, **we are honored that we could develop a card tracking system that supports the daily jobs of humanitarian agency employees** helping them to organize aid during missions in areas affected by natural disasters, climate change, or wars. The local people can use the cards distributed to meet their most basic needs. **Our client's efforts not only result in helping people in the crises of poverty but also help to stimulate the local economies**.
![Shopping](../../static/images/shopping_girl_women.png "Shopping")
**A pilot of the system was launched in 2020** in one of the Middle Eastern countries where the agency operates. The reception has been positive, and **the system was rolled out across other countries in the Middle East and Africa**. We are still working on the system, constantly developing new features, offering maintenance and assistance in launching the application in the new markets. The social impact certainly makes this a gratifying experience for our team, and we are thrilled to develop it with the client. ## Navigating Digital Transformation at Construction Sites: Heinrich Schmid's Doc-Sharing App *Source: https://brightinventions.pl/projects/document-management-apps-construction/index.md* **technologies**: SwiftUI, Apollo GraphQL, CoreData, Sourcery, Bitrise, Jetpack Compose, Hilt, offline-first approach, Jira, Figma, GitHub Actions. Imagine stepping into the **bureaucratic world of construction site personnel**, where every day is a navigation through a sea of paperwork. Employees need access to a collection of documents, from architectural plans, site photographs to daily reports, timesheets, and others. Additionally, they generate numerous documents on-site, adding to the already substantial pile of documentation. **What if all this paperwork were just one click away on a smartphone or tablet?** Critical documents would no longer be misplaced or damaged at construction sites, and access to sensitive information would be limited to individuals with the appropriate credentials.
![A quote from the client](/images/baumappe_quote_update.png "Client's perspective")
Our client, Heinrich Schmid, is a building construction group, eagerly embracing digital transformation. **One of their goals was to manage the whole construction documentation** via smartphone or tablet and eliminate paper documentation. We were pleased to help them with this transition. **Our team takes care exclusively of mobile development**. The backend is developed by another software company. It requires close cooperation between various development teams to sync apps with the backend properly.
![Document Management Apps for Construction](../../static/images/app_mockups_dodocumenttion_management_apps.png "Mockup examples designed by Heinrich Schmid's Product Design Team.")
Mockup examples designed by Heinrich Schmid's Product Design Team. **The initial phase involved launching the MVP – HS Baumappe iOS and Android applications** designed to facilitate the creation and sharing of documents among the construction crew, clients, and external contractors. Thanks to sophisticated access management, only employees with the appropriate credentials can access the various documents, significantly enhancing security and data protection. The client trusted us to choose the most optimal solutions, therefore we use top tools such as **SwiftUI or Jetpack Compose highly recommended by Apple and Android**. We also made a strategic decision regarding the app architecture. We decided to **build HS Baumappe as a multi-module application**. Instead of building an app as a huge monolith, we separated the code into single responsibility modules. As a result, it improved developers’ productivity, code clarity, and interoperability. It also **helps to save costs and scale the solution during the post-MVP phase**. Internet access is typically unreliable at construction sites. Therefore from the beginning, the priority was to build the **offline-first application**. Developing offline mode is always an interesting technological challenge. However, we have successfully delivered this feature for numerous clients. **Thanks to an offline mode users can create any document without an internet connection and the app will store the data on the user’s device**. All files will be synchronized when the internet connection is back.
![App for construction company mockup](../../static/images/hs_baumappe_case_study_mockup.png "Mockup examples designed by Heinrich Schmid's Product Design Team.")
Mockup example designed by Heinrich Schmid's Product Design Team.
*The collaboration with Bright Inventions started off very promising. Based on our business needs, **they gave great architectural advice, important technical information, and overall good guidance**, which allowed an ambitious start into the project.* *After months of smooth development and satisfying output, we were challenged with some very critical technical barriers, which collided with our business vision of the app. Due to great proactive efforts on Bright Inventions side, the Heinrich Schmid IT team, and the good communication towards our third-party backend developer team, we overcame this hurdle and managed to get the app behavior as envisioned and desired.* *With the currently ongoing MVP release, the only point of criticism our users raised is the following: “We want more features!”. Therefore, the **MVP release is a great success** so far and we envision a lot more features to come in the app, together with our partner Bright Inventions.* **Leon Seiz, Former Product Owner at Heinrich Schmid** Following the launch of the MVP, it received positive feedback from its end users. **We continue to work on the mobile application adding other crucial features** such as the digital signature of the documents. ## Implementing Sygic GPS Navigation into Driver’s Application *Source: https://brightinventions.pl/projects/navigation-driver-app-integration/index.md* technologies: Android, Kotlin, Figma. Our client, a [transportation services provider](/projects/transportation-management-system/), wanted to introduce a new process where **dispatchers create predefined routes that drivers must strictly follow**. This ensures precise mileage tracking, making it **easier to accurately settle payments with drivers** based on kilometers traveled. To achieve this, the system required seamless integration with a navigation solution that would ensure couriers adhere to the exact routes designed by freight forwarders. While we had the freedom to choose the right navigation system, the client emphasized one critical requirement: **the predefined route must remain unchanged**, helping drivers stay on the exact route planned by the dispatcher. After careful research, the best option seemed to be **Sygic navigation** because it was the only solution we found at that moment providing the crucial functionality our client required. Sygic allowed routing based on a **fully predefined path**, with **no limits on the number of waypoints** and without displaying them on the map during navigation. Most available popular navigation systems offered navigation based on specific coordinates, but they had limitations. Some displayed coordinates on the map during navigation, while others restricted the number of waypoints (typically around **150**), which would be problematic and inaccurate for long-haul routes – such as from Estonia to Portugal. To enhance usability, **Sygic navigation should be embedded directly into our application** rather than redirecting users to an external app. While both approaches have pros and cons, we prioritized usability: * **Drivers don’t have to install an additional app**, which would have been a major obstacle given their limited time. * **We maintain better control over the navigation experience**, whereas relying on an external app would leave us with no influence over its behavior or potential updates. What’s more, based on the details of a given route, the app would display map download recommendations. Most drivers turn off mobile data when traveling through Switzerland due to high roaming costs, so if a route included Swiss territory, the app would notify the driver before the journey began – prompting them to download the necessary maps in advance and ensuring they were fully prepared for the trip.
![UI navigation](/images/ui_navigation_design_case_study.png "UI navigation")
The research phase was definitely a challenge, as the client had very specific requirements.\ As part of our research, **we held discussions with various navigation providers** to assess their capabilities. Developing this **Proof of Concept (POC)** also proved to be complex. During the testing phase with Sygic, we submitted numerous requests for adjustments to their SDK to better align with our requirements. Another key challenge we faced was **licensing design**. Sygic’s licensing model is based on either a per-device or per-unique-ID approach, so we had to carefully develop an optimal licensing strategy within our Transportation Management System (TMS) to keep costs under control. We designed the **licensing system to be per vehicle**, as staff rotation is more frequent than changes to the fleet. When a driver is assigned a specific vehicle for a given time period, they receive a corresponding license. Once their assignment ends and they switch to another vehicle, they are issued a different license.
![navigation Sygic case study](/images/case_study_navigation_drivers_app.png "navigation Sygic case study")
We have developed a **fully functional Proof of Concept**, which is currently undergoing testing by the client’s staff, particularly freight forwarders and drivers. The implemented navigation system includes all necessary features to ensure accurate route estimation and maintain proper payment settlement, helping to avoid inconsistencies caused by incorrect routing. ## Retail iOS and Android Apps with Bluetooth Integration – Just Eat POS *Source: https://brightinventions.pl/projects/system-for-restaurants-mobile/index.md* Just Eat POS system took care of the whole process of managing restaurant orders: from ordering the meal, providing kitchen staff with details to delivering the order to the client’s table or home. A huge part of the system was a couple of Android and iOS applications. Also, read another [Just Eat POS case study](/projects/system-for-restaurants) about other products built for this enormous system. * ePOS iOS and Android **applications used by restaurant staff** to take orders and manage payments. * iOS and Android **[courier delivery application](/projects/delivery-drivers-app/)** which assists drivers in delivering orders.
![Mobile apps restaurant and retail](../../static/images/mobile_retail_app.png "It is not a real implemented design. It is a mockup example created for the purpose of a case study.")
*It is not a real implemented design. It is a mockup example created for the purpose of a case study.* **technologies:** Kotlin, Coroutines, Realm, ReactiveSwift, Firebase, Google Maps, Dagger 2, Fastlane iOS products developed by our team were used in restaurants in Israel. Practi iOS solution was one of the top ePOS solutions used by restaurants in Israel. There were **three main retail products developed by bright iOS developers**. ### **Reggie iOS ePOS application** **Reggie was “the mind” of the whole ePOS system at the restaurant**. It was a cash register itself. It was fully [integrated with JustEat and a couple of other online food delivery companies](/projects/pos-third-party-delivery/). You could manage orders from clients in the restaurant as well as took care of all phone and internet orders. Also, the app enabled you to manage drivers if the restaurant hired them. ### **Click & Collect – iOS white label application** **The app was dedicated to restaurants which want to offer clients their own meal-ordering application**. “White label app” was the product that can be easily adjusted to clients brand visual identity and business needs. Therefore every restaurant can use this app but it looks differently for every business. The app allowed restaurant’s customers to order items from menu and get them delivered or collected on their own. ### **Delivery drivers app**  Our team also developed an independent **product used by drivers who deliver the orders from a restaurant to customers**. The app not only showed the destination and navigates drivers but also kept them informed about the transaction details. Drivers knew whether the order was paid or it needed to be paid. The driver was well-aware about the payment method (by cash or card). Thanks to the app, drivers were provided with all necessary information and could focus on delivering the meals as soon as possible. Read more about [delivery drivers app](/projects/delivery-drivers-app/). Android development team delivered similar solutions to the iOS team. Android app was used by end-users in the UK. ### Reggie Android ePOS application The app let you manage food orders made at restaurant, by phone or the website. **Some of the features of the Android Just Eat POS application are:** * **Catalog** – the main screen of the app used to quickly set up orders taken at place (in person). The cashier or other stuff member had access to all menu items and could choose the ones a client wanted to order. They could also choose the delivery option if needed and enter client’s data. Then a cashier could proceed to the transaction. * **Customer Orders** – the dashboard displaying all orders made externally – via a phone or online food delivery providers like Takeaway, Just Eat, etc. So these were orders that weren't made in person. The app user could quickly check the status of every order and assign a driver to deliver it to the customer. * **Reports** – the app displayed various data and statistics that showed your company revenue, number of orders and sold items, details about the inventory and more. * **Printing receipt** – the app enabled to print payment receipts as well as receipts printed in the kitchen with details about the order. * **Integration with CallerID** – when a client called, the application assigns the caller number with the order. A great part of working with Just Eat POS was **building [iOS and Android applications integrated with Bluetooth retail and ePOS devices](/projects/pos-devices-integration/)** including: * POS Desktops, * Payment terminals, * Magnetic stripe readers, * Label and thermal printers, * Caller ID hardware, * Kitchen Display Systems, * Electronic scales, * Barcode scanners, * Kiosks. Our applications had been integrated mostly with **Sunmi Technology** – one of the top global hardware providers.
![quote](/images/just_eat_quote.png "quote")
Just Eat POS (prev. Practi) and Bright Inventions (experienced [POS software development company](/our-areas/pos-software-development/)) have established a long-term business relationship and our team proudly collaborates with **Just Eat Takeaway on various retail solutions**. ## Legacy Modernization of 30-Year-Old Restaurant POS *Source: https://brightinventions.pl/projects/pos-legacy/index.md* **technologies:** Kotlin, Spring Boot, Flutter, Grafana, Figma Every legacy system eventually reaches a point where its founder must face the ultimate challenge: revamping the software. The clock is ticking! Every day, acquiring new users is becoming more challenging with an outdated UI and disturbing performance. Yet **how do you upgrade the system without losing loyal users who have made you profit all these years**? **Our client, a company offering digital solutions for the hospitality industry, was facing these challenges**. For over two decades, its system has been utilized by restaurants nationwide. However, the application required modernization to remain competitive in the POS market. The client reached out to us for a **complete POS system revamp**. They also **expressed interest in developing mobile applications** to expand its digital portfolio. Based on over a decade of experience in [POS software development](/our-areas/pos-software-development/), we began the work by **auditing the software for modernization**, allowing us to spot areas for significant improvement. One of the key aspects of the upgrade was a **new product design** to streamline the process for users, who are primarily waitstaff. The modern UI provides **quick access to core POS features** such as managing table orders with any possible modifiers (extra fries, no onions, etc.), sending orders to the kitchen, and managing payments, including splitting payments and tipping. It also ensures **integrations with retail devices including printers, cash registers, terminals**, and more. **During the application re-engineering, we identified features that needed alteration or addition**. For example, **we introduced a role management feature that allows assigning roles with appropriate permissions**, such as restricting discount approvals to managers. This addition enhances the system's safety and transparency for restaurant staff. Our mobile team also **developed a hybrid mobile app accessible for iOS and Android**. That has been a meaningful upgrade because the system used to be based only on a desktop application. Following the client's expectations, we needed to keep the old version of the POS operational while working on the modernization. It matches our revamp approach. **Our goal is not to create a revolution, so compatibility with the legacy system is key**. Despite the old version being built with outdated technologies like Visual Basic 6 and operating with binary files, we ensured compatibility. **Our team built a Spring Boot and Kotlin library to read and translate these binary files into Kotlin objects**. Day by day we retain compatibility while integrating new technologies. **We deliver code compatible with the old POS and aligned with modern standards. This way, when the old version is eventually retired, the new one will be self-sustainable and ready for further development and scalability**. Another challenge is adjusting to the various hardware that restaurants possess. Therefore we have to **pay extra attention to performance and memory efficiency to make the software accessible on a spectrum of devices**, both new and old. To achieve that **we also introduced app performance monitoring with Grafana, which enables us to foresee performance issues before they could affect users**. Thanks to reports and alerts, we are aware of some features not working properly or if the system is overloaded, and we can quickly react to that.
![pos system restaurant](/images/pos_restaurant.png "pos system restaurant")
The modern version of the solution has been **released reaching its first users in a testing phase**. Meanwhile, our team continues the software modernization by **planning cloud migrations, further integrations with payment and food delivery providers, and enhancements to the payment process**. ## Just Eat POS: From Startup to Global ePOS Provider *Source: https://brightinventions.pl/projects/system-for-restaurants/index.md* **Just Eat POS system took care of the whole process of managing restaurant orders: from ordering the meal, providing kitchen staff with details to delivering the order to the client’s table or home**. It also supported daily running of the restaurant by managing employees time, creating menus or providing tools to build their own restaurant website. * **[ePOS iOS and Android applications](/projects/system-for-restaurants-mobile)** used by restaurant staff to take orders and manage payments. * **White label application for restaurants** to take orders via their own, dedicated website. * **iOS and Android [delivery drivers applications](/projects/delivery-drivers-app/)** which assisted couriers in delivering orders. * A **website that enabled to display restaurant’s menu** and offered [integrations with online food delivery providers](/projects/pos-third-party-delivery/) like JET or Wolt. * **Backoffice solutions** including managing integrations and API connections. **technologies:** React, TypeScript, Kotlin, Swift, Realm, Firebase, Fastlane The client reached out to us in **2013**. At that time it was an early-stage Israeli startup “Practi” that offered web application solutions to users. Since 2013 **the company has transformed from a promising startup to an international ePOS applications provider**. In 2019 Practi was **acquired by Just Eat Takeaway**. **Bright Inventions, as a [POS software development company](/our-areas/pos-software-development/), had a great opportunity to assist the client** during this incredible ride, including the whole business transformation. The client expected us to actively take part in creating the whole system. We were not only “code suppliers”, **we were technical partners offering years of software development experience**. Our mobile and web knowledge, and the fact that we have been working on this system since 2013 enabled us to evaluate technical and business decisions. As a result, when needed, we gladly offered alternative solutions that would benefit the client and end-users. Just Eat POS system (prev. Practi) was a product with over 10 years of history. It was built as a startup solution for a small group of clients with specific needs. The system became a part of the Just Eat Takeaway's family. Therefore **scalability was the key**. Our teams took care of rebuilding some applications to make them more accessible for a growing number of users. The increasing number of users also meant that **Bright Inventions’s team had to actively monitor services, especially metrics such as CPU usage, number of database connections and average response time**. The goal was to predict and solve any potential issues before they could affect clients.
![POS case study](/images/pos_practi_jet_mockup.png "")
All Bright Inventions’ developers worked closely with the business side. Bright Inventions’s was represented by 8 development squads (each squad had about 5 developers and 2 dedicated QA engineers) who took care of various areas of this massive hospitality system. Let us show you some of the development teams. Read about iOS and Android development teams's products in a [Just Eat POS mobile applications case study](/projects/system-for-restaurants-mobile).
![quote](/images/just_eat_quote.png "quote")
### Frontend team One of Bright Inventions Frontend team **priorities was the development of the Just Eat POS Backoffice**. This was a web application that enabled managing business daily activities and gave access to financial reports. **Here are examples of many features of the Just Eat POS Backoffice:** * Dashboard with all necessary information that shows the financial condition of your restaurant. * Restaurant menu creator. * Establishing prices of items on a menu. * Managing the team and adjusting their roles e.g. cashier, branch manager and more. * Access to sales reports and other crucial business data. Inventory management. * Setting up basic restaurant configurations e.g. taxes, operating hours, delivery hours, delivery charge and more.
![POS sales reports case study](/images/pos_reports_sales.png "")
**Frontend team took an active role at every phase of frontend app development** process working closely with a product manager and product designers. The Backoffice system had been on the market for around 10 years. Therefore one of the priorities of the frontend team was to **migrate the app to modern technology while delivering new features** to users who used this platform everyday at work. Thanks to the trust of the client, **the team took part in the decision-making process regarding which libraries, tools and technologies to choose** to rewrite the platform. The migration didn't include only changing to newest technologies. The essential part of it was also implementation of new designs maintaining the best possible UX and UI experience.
![POS payment options case study](/images/pos_payment_option.png "")
### Backend team The team was responsible for maintaining and developing backend. All applications within Just Eat POS ecosystem were connected to the same backend. **The main job of backend team was delivering features, supporting any initiatives on the Just Eat POS applications.** It was **crucial especially in terms of white label apps where the clients incorporated changes and decided about the final look and functionalities of their app**. In this case, the backend team had to step forward and support clients with appropriate changes in backend. Additionally, the **Backend team paid much attention to the performance**. Since all Just Eat POS apps were connected to the one shared backend, any hiccup that happens on the Backend propagated to every client, affecting UX. We relied on the observability of our services. **We tried to detect any abnormalities in the CPU usage, number of database connections or average response time to detect issues before they became visible to our customers**. Data we stored provided our client with significant insight into the behaviour of our customers. Feeding this data into the data lake gave the data science team a way to study the customers, and helped make more meaningful, data-driven features.
![POS table management case study](/images/pos_table_management.png "")
### Backend integrations team This team **took care of integrations with food delivery platforms and menu platforms**. Thanks to their work restaurants using Just Eat POS solution could change the menu in only one place and it would be automatically updated on every possible platform the restaurant used to display its menu. Another responsibility of this team was **integrations with online food order and delivery providers like Just Eat or Takeaway.** The goal of backend integrations team was to enable management of orders from different platforms in one device. So restaurant employees didn't have to use different apps and devices to take care of orders from other platforms. Just Eat POS (prev. Practi) and Bright Inventions have established a long-term business relationship. Practi was one of our first clients. **During almost a decade of our cooperation the client transformed from a startup to a global Point-Of-Sale system provider used by businesses in Israel and the UK**. ## Lösung für Parkinson-Patienten *Source: https://brightinventions.pl/projects/losung-fur-parkinson-patienten/index.md* ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients2.png) *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* * Verfolgung der körperlichen Reaktion auf Standard- und experimentelle Therapien Medikamentenerinnerung * Zugänglichkeit – eine einfache Möglichkeit, medizinische Informationen für Patienten mit Bewegungsstörungen hinzuzufügen * Erweiterte Statistiken und Berichte für Ärzte * Gamifizierung der App iOS: Swift, RxSwift, Alamofire Android: Kotlin, RxKotlin, Dagger, Retrofit Backend: Node.js, Typescript, PostgreSQL, AWS Services Das Leben mit einer chronischen Krankheit wie Parkinson erfordert dem Patienten viele Veränderungen im Lebensstil auf. Für diejenigen, die gegen die Krankheit kämpfen, ist es von entscheidender Bedeutung, dass sie eine Möglichkeit haben, ihre allgemeinen Vitalwerte, die Einnahme von Medikamenten oder alle Symptome, auf die sie ihren Arzt aufmerksam machen müssen, leicht zu verfolgen. Unser langjähriger Kunde (eine Produktdesignagentur und Projektinkubator in der Frühphase) wandte sich mit einer umsetzungsfertigen Idee seiner Kunden für eine App an uns. Ziel des Projekts war die Entwicklung einer mobilen App, die den Alltag von Parkinson-Patienten vereinfachen wird. Bevor sie sich an uns wandten, hatten unsere Kunden bereits ein High-Fidelity-Wireframe der Benutzeroberfläche entworfen. Jetzt brauchten sie einen Technologiepartner, der den Softwareentwicklungsprozess übernimmt. Und so wurde Bright Inventions mit der Umsetzung des gesamten Systems betraut – der Entwicklung zweier Apps (iOS und Android) sowie des gesamten Backends. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients3.png) *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* Es gab mehrere Herausforderungen, die wir angehen mussten. Erstens musste die App für Patienten mit Tremor oder anderen Bewegungsstörungen geeignet sein. Da ältere Menschen die Mehrheit der an Parkinson erkrankten Patienten ausmachen, musste die Benutzeroberfläche gut lesbar und äußerst intuitiv sein um die Wahrscheinlichkeit von Fehlern zu minimieren. Sollte es jedoch zu einer versehentlichen Eingabe kommen, muss die Schnittstelle auch die Möglichkeit bieten, die Aktion rückgängig zu machen. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients1.png) *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* Während der Softwareentwicklung sind unserem Team viele Funktionen in der GUI aufgefallen, die für eine solche Benutzergruppe zu komplex waren. Wir haben dann jeweils eine einfachere Lösung vorgeschlagen, die positiv aufgenommen wurde und der Auftraggeber hat das grüne Licht gegeben. Die größte Herausforderung bestand jedoch darin, die höchsten Sicherheits- und Datenschutzstandards zum Schutz der Benutzer zu erfüllen. Aufgrund ihrer medizinischen Natur speicherte die App sehr empfindliche Daten über die Gesundheit der Patienten (neben Informationen zu Schmerzen oder Zittern ermöglichte sie den Benutzern auch, ihren sexuellen Antrieb oder ihre Spielneigung zu notieren). Aus diesem Grund hat sich Bright Inventions entschieden, die Datenbank in zwei Teile aufzuteilen, die jeweils an einem anderen physischen Standort der AWS-Dienste gespeichert sind. Die erste Datenbank hat die grundlegende Benutzerdaten wie Name oder E-Mail-Adresse gespeichert. Die zweite Datenbank hat empfindliche Informationen enthalten, einschließlich der Einnahme von Medikamenten oder körperlichen Symptomen und Empfindungen. Durch diese Entscheidung haben wir sichergestellt, dass die angreifende Seite nicht in der Lage wäre, auf alle Informationen zuzugreifen. Auf diese Weise gab es praktisch keine Chance, Symptome oder Medikamenteneinnahme bestimmten Patientennamen zuzuordnen. Insgesamt hat unsere Projektarbeit 5 Monate gedauert und bestand aus zwei Etappen. Die erste Phase endete mit dem Launch des MVP (Entwicklung dauerte 3 Monate). Die zweite Phase unserer Zusammenarbeit, die zu mehreren Iterationen des Systems geführt hat, erstreckte sich über einen Zeitraum von weiteren 2 Monaten. Nach der Entscheidung der Partei, der die App gehörte (also des Kunden unseres Kunden), wurde das Projekt auf Eis gelegt. Im Moment sind die nächsten Schritte nicht bekannt und die App steht nicht öffentlich zum Download bereit. ![App for Parkinson's Patients](../../static/images/app_for_parkinson_patients4.png) *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* ## MedKitDoc – The Future of Telemedicine & Remote Care in Germany *Source: https://brightinventions.pl/projects/telehealth-solution/index.md* **technologies:** Kotlin, AWS-CDK, OpenTelemetry, MySQL The story of [MedKitDoc](https://medkitdoc.de/en/) started before it was even founded. Its two **co-founders were unable to assist their chronically ill grandmother living hundreds of miles away**. Benjamin Gutermann, one of the co-founders and a doctor, found his skills ineffective over the distance. If only he could have listened to his grandmother's heart and checked her lung sounds. **Ultimately, their grandmother had to be hospitalized, which they believed might have been avoided**. In Germany, the demographic trend indicates a significant increase in the population of elderly individuals, particularly those living alone. **As of 2020, [nearly 6 million people aged 65 or over were living alone](https://www.destatis.de/EN/Press/2021/09/PE21_N057_12411.html), representing one in three people (34%) of that age group**. Remote patient monitoring and telehealth are essential for ensuring well-being and providing the necessary assistance before it's too late. **MedKitDoc is paving the way in remote medical care in Germany** by integrating certified medical devices, applications, and trained specialists into a comprehensive healthcare solution. This innovative approach has gained popularity in care homes, facilitating virtual appointments between patients and doctors who may be located far away. **Patients use smart healthcare devices to monitor their vital signs, which are then transmitted to the doctor via the app**. At the same time, **doctors conduct real-time communication with patients through video calls**, enabling the prompt initiation of appropriate treatment based on the medical data collected through the devices and the patient's consultation.
![MedKitDoc](/images/medkitdoc_mockups.png "MedKitDoc")
After experiencing several years of successful growth, the founders of **MedKitDoc decided to seek assistance with backend development to ensure the ongoing expansion of their solution**. They reached out to us, and **we gladly kicked off this collaboration**. **Our team is responsible for backend development and the infrastructure** – the core of the system. In close partnership with our client, one of our colleagues from Bright Inventions takes on the role of a tech lead. **Together, we oversee a development team comprising backend, mobile, and QA experts**. Through collaborative efforts with our client, MedKitDoc has undergone continuous improvement. **New features like medical documentation storage and integrations with medical providers have been developed to enhance user experience**. We also **enhance existing features**, including the scheduling of video appointments between doctors and patients, which has been a core function of MedKitDoc for years.
![telehealth](/images/telehealth_solution.png "telehealth")
Faced with the challenge of ensuring optimal performance for MedKitDoc, **we implemented a robust strategic solution – performance monitoring based on the OpenTelemetry standard**, which provides our client with vital insights, including response time, peak usage periods, and resource utilization within the application. The primary aim is to proactively identify and address any potential performance issues, enabling swift interventions before they can impact the end-users' experience. We have also helped to address the challenges of comprehensive business and marketing analytics by maintaining **monitoring for crucial metrics like feature usage**, including successful appointment count, the number of messages exchanged between patient and doctor, and the number of shared documents. **The data serves as a valuable resource for the client's analytics team ensuring app optimizations are always based on solid and reliable data**.
![Client's review](/images/case_study_medkitdoc_client_quote.png "Client's review")
Securing healthcare solutions that store sensitive medical data, such as MedKitDoc, presents an additional challenge in **ensuring compliance with HIPAA, GDPR and being eligible for German TÜV certification**. To meet these requirements, it's essential to **follow best security practices such as data encryption, and managing user access with tools like AWS Cognito, among many others**. Part of addressing this challenge involves **software modernization**. While our core responsibility is to deliver new features, we also play a crucial role in **modernizing the current code and architecture**. This includes updating libraries to comply with security standards, and **ensuring that our solution remains secure and trustworthy for handling sensitive medical data**.
![MedKitDoc](/images/medkitdoc_mockups_app.png "MedKitDoc")
**Dorian Koch, the founder and former CEO of MedKitDoc** *Compared to everyone else, Bright Inventions doesn’t promise things they can’t deliver. They tell us what they can and can’t do. When I ask for an iOS or Android developer, they take their time to get a good one instead of assigning someone who has the bare minimum. The best thing about them is that I can count on their actions. They have skilled teammates who’ve gone through a vetting process.* MedKitDoc is changing telemedicine in Germany. **By implementing new features and gathering data to understand users' needs, we proudly support their mission to increase access to medical care** among people who are often left to manage on their own. Let's hope that remote patient care will soon be a widespread reality for older and chronically ill individuals. ## The Future of Physiotherapy: Engaging Patients with Mobile Application *Source: https://brightinventions.pl/projects/mobile-therapy-application/index.md* **technologies:** Swift, Kotlin, Node.js, Typescript, AWS, React Physiotherapy plays a crucial role in s**upporting successful recovery after discharge** from hospital care. It’s also an effective tool for **reducing the negative impacts of desk-bound work or sports injuries**.
![physiotherapy](../../static/images/physiotherapy.png "physiotherapy")
One of the recoveries physiotherapy can deeply influence is post-stroke care. Globally, cardiovascular disease remains the leading cause of death, with stroke being a significant contributor. **Physiotherapy can start as early as 24 hours following a stroke**. **Unfortunately, in many cases, patients do not receive physiotherapy as promptly or as frequently as they should**. The critical window for maximizing recovery post-stroke is narrow, and once it closes, the optimal recovery is almost impossible. No matter the condition a patient has, **short and infrequent psychotherapy visits probably won't solve their issues**. The key is to continue the work at home. **What if technology could support patients and therapists to harness the potential of physiotherapy** by motivating patients to exercise at home and streamlining therapists' workflows to give them more time for personalized patient care? **Our client, a digital agency and an early-stage project incubator based in Germany**, has turned to us with a ready-to-implement idea for a healthcare app. Before reaching out to us, **they had already spent over 300 hours validating their concept** by observing physiotherapy sessions. This resulted in a comprehensive plan for an app that would solve the biggest challenges patients and therapists face, including limited time therapists have for each patient, patients not exercising regularly, and performing some exercises incorrectly at home. **Our client entrusted us with the implementation of the entire system comprised of iOS and Android applications and the backend**. We also crafted separate modules for patients and therapists. ![Mobile Therapy App](../../static/images/mobile_therapy_app2.jpg) On the patient profile, one could download the therapy plan, as well as use the app daily for exercise and progress tracking. **The patient’s app also featured reminders and thanks to gamification, motivated the patient to continue on their path to recovery** by displaying therapy statistics. **The therapist panel was more sophisticated**. Firstly, it needed to allow therapists to customize plans for each patient. **The specialist could quickly make photos or videos of patients performing the exercises** and upload them to an individual patient profile, so the patient could then correctly perform the exercises at home without worrying about remembering them correctly. Therapists could also plan out exercise sessions on a calendar and include information on the number of circuits per exercise as well as other important recommendations. One of the technical challenges was **enabling smooth video uploads of the exercise recordings**. Given that physiotherapists already had minimal time allocated per patient, we aimed to avoid having them spend it waiting for videos to upload. Furthermore, **we wanted to ensure they could continue using their devices without interruption while the videos were being uploaded**. Therefore, **we implemented asynchronous uploading, allowing therapists to freely continue using the phone** while the videos were uploaded in the background. ![Mobile Therapy App](../../static/images/mobile_therapy_app3.jpg) Another challenge we faced collaboratively with our client was **finding the most user-friendly way to introduce the app to patients**. As visits tend to be very short, it was crucial that the therapist and patients would be able to link their accounts in the app quickly. Naturally, only some patients already had the app when they came in, and not everyone felt comfortable with using new technologies. Low levels of tech-savviness meant it was difficult for them to download the app during the session, register an account, and – most importantly – link their profiles with those of therapists. Also, it would mean that the precious time meant for the therapy would be taken away for dealing with the new app installation. **We solved the problem by automating the linking of patient-therapist profiles through a previously generated codes**. Therefore, the therapist could print the codes, and simply give it to the patients at the end of the session. This enabled patients to link their accounts from the comfort of their homes after the physiotherapy session was over. By inserting the code in the app, they were able to download the prescribed exercise plan. We delivered the Minimum Viable Product (MVP) within a six-month timeframe. Subsequently, our client opted for an external audit of the project's technical aspects, which was successfully passed. The solution has expanded, changing the physiotherapy experience for individuals across Germany. We are thrilled to contribute to the digitalization of traditional psychotherapy. *Presented mockups are not real implemented design. Mockups were created for the purpose of case study.* ## Software für Messeplanung *Source: https://brightinventions.pl/projects/software-fur-messeplanung/index.md* ![A trade fair planning software](../../static/images/xpomaker_dashboard2.png "") * Schaffung neuer Messeprojekte * Einladen von Benutzern als Teammitglieder zu Projekten * Task-Management-Panel * Hinzufügen und Verwalten einer Liste von Artikeln, die für Messestände benötigt werden * Verwaltung der Unterkünfte und Zeitpläne des Messepersonals * Kalenderansicht der für die Messe geplanten Aufgaben und Veranstaltungen * Planer für das Budget- und Ausgabenmanagement * Deployment: Docker + Docker-Compose, AWS - CloudFormation, ECS, EC2, S3, LoadBalancer, RDS, TeamCity * FrontEnd: ReactJS + TypeScript, Redux, Sass * Backend: NestJS, TypeORM, PostgreSQL, Swagger, Stripe Für viele Branchen ist die Teilnahme an Messen das Herzstück des Geschäfts und ein Schlüsselelement für den Verkauf, die Leadgenerierung und den Aufbau von B2B-Partnerschaften. Die Verantwortung für die Ausstellung auf Branchenveranstaltungen kann sich jedoch angesichts der Anzahl der damit verbundenen Aufgaben überwältigend anfühlen. In den meisten Fällen muss Ihr Messeauftritt Monate im Voraus sorgfältig geplant werden und erfordert von Ihnen die gleichzeitige Koordination mehrerer Prozesse. Eine einzige Verzögerung eines Auftragnehmers oder ein kleines Versäumnis auf Ihrer Seite, und – wie bei einem Dominospiel – kann der gesamte Plan zusammenbrechen. Wie behält man also den Überblick, ohne sich Gedanken über organisatorisches Chaos und Fristen machen zu müssen? Hier kommt xpomaker ins Spiel. ![A trade fair planning software](../../static/images/xpomaker_dashboard.png "") Die Gründer von xpomaker haben nach einem erfahrenen Produktdesignteam gesucht, das die allgemeine Vision für die Software in ein benutzerfreundliches, optisch ansprechendes Produkt übersetzen würde. Als sich unsere Wege zum ersten Mal gekreuzt haben, hatten sie bereits mit einem Beratungsunternehmen zusammengearbeitet, das dabei geholfen hat, die erforderlichen UX-Funktionen und Benutzererwartungen zu ermitteln. Während unsere Zusammenarbeit zunächst mit einem Interface-Design-Projekt begonnen hat, wurden wir schnell gebeten, die gesamte App zu rebranden und neu zu gestalten – einschließlich der Betreuung von Frontend- und Backend-Anpassungen. Wir haben zunächst an der Bereitstellung von High-Fidelity-Wireframe der vorgeschlagenen Benutzeroberfläche gearbeitet. Um sicherzustellen, dass die Designs alle erforderlichen Funktionen enthalten, hat unser Team mit dem Produkteigentümer des Beratungsunternehmens zusammengearbeitet. Für xpomaker war es entscheidend, dass sich die App-Architektur und das Design den Benutzern vertraut anfühlen. Das bedeutete, dass wir eine Benutzeroberfläche entwerfen sollten, die der Erfahrung der Verwendung von Tabellenkalkulationen zum Verfolgen des Messevorbereitungsfortschritts ähnelt. Daher war uns klar, dass ein Tabellenformat sowie der Import/Export von .xls-Dateien zwei Funktionen waren, die berücksichtigt und im Design widergespiegelt werden mussten. Zweitens musste die App einen Zahlungsprozess integrieren, der es den Benutzern ermöglicht, Einnahmen zu verwalten und Gelder zu überweisen. Nachdem wir mehrere Zahlungslösungen auf dem Markt analysiert haben, haben wir uns für Stripe entschieden, das jederzeit Abonnementzahlungen und Rechnungsabwicklung bietet – beides für den Kunden von wesentlicher Bedeutung. All diese Schritte haben es uns ermöglicht, eine Lösung bereitzustellen, die für ihre Benutzer sowohl funktional als auch intuitiv wird. Nachdem unsere Arbeit am Interface-Design abgeschlossen war, engagierte uns xpomaker für ein Rebranding-Projekt, an dem sie gearbeitet hatten. Der Umfang unserer Arbeit umfasste die Durchführung aller notwendigen Softwareentwicklungsanpassungen am Frontend und Backend der App. Nach der Rebranding-Phase unserer Zusammenarbeit, in der sich der Name und die visuelle Identität des Unternehmens geändert hatten, hat unser Team die gesamte App neu gestaltet und die Software entsprechend weiterentwickelt. xpomaker ist jetzt auf dem deutschen Markt präsent und bietet drei Abonnements an. Mit der Software können Benutzer beliebig viele Ausstellungsprojekte koordinieren. Unser Team ist derzeit für die App-Wartung zuständig. Die App-Gründer sammeln jetzt jedoch Benutzerfeedback, um sich auf eine weitere Runde benutzerinspirierter Design- und Softwarearbeiten vorzubereiten. ## App für Physiotherapie *Source: https://brightinventions.pl/projects/mobile-therapieanwendung/index.md* ![Healthcare app development](../../static/images/therapy_app_mockup.png "") *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* * Therapeutenmodul(Benutzerpanel) * Patientenmodul(Benutzerpanel) * Datenverfolgungssystem * Benutzerdefinierte Animationen * Hintergrundverbindung zwischen den Geräten des Patienten und des Therapeuten **iOS:** Swift, RxSwift, Alamofire **Android:** Kotlin, RxJava, Retrofit, Dagger **Backend:** Node.js, Typescript, PostgreSQL, AWS Services **Frontend:** React, Typescript Irgendwann in unserem Leben benötigen entweder wir selbst oder unsere Lieben eine Physiotherapie, um wieder auf die Beine zu kommen. Es gibt jedoch viele Faktoren, die Einfluss darauf haben, ob dies ein stressfreier und effektiver Prozess sein wird. Vor diesem Hintergrund hat unser Kunde eine App entwickelt, die Therapeuten und Patienten auf dem Weg zu einer schnellen (und nachhaltigen!) Genesung unterstützt. ![Mobile Therapy App](../../static/images/mobile_therapy_app2.jpg "") *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde* Unser Kunde, eine Produktdesignagentur und Inkubator für Projekte in der Frühphase, hat sich mit einer umsetzungsreifen Idee für eine App an uns gewandt. Bevor sie sich an Bright Inventions wandten, hatten sie bereits Monate damit verbracht, ihr Konzept festzustellen, indem sie Physiotherapiesitzungen beobachteten. Daraus entstand ein umfassender Plan für eine App, die die größten Herausforderungen von Patienten und Therapeuten lösen sollte. **Diese beinhalten** * Begrenzte Zeit, die Therapeuten für jeden Patienten haben * Patienten neigen dazu, zu vergessen, wie sie ihre Übungen richtig ausführen * Patienten, die sich nicht regelmäßig genug bewegen * Übungen, die von Therapeuten empfohlen werden, wiederholen sich oft bei Patienten. Unser Kunde hatte auch ein High-Fidelity-Wireframe der App und beauftragte uns mit der Implementierung des gesamten Systems, bestehend aus: * iOS und Android apps, * Backend, * Content Management System (verwendet zum Beispiel zum Speichern von Schritt-für-Schritt-Video-Tutorials für Patienten), * Ein Admin-Panel für Therapeuten. ![Mobile Therapy App](../../static/images/mobile_therapy_app3.jpg "") *Es ist kein wirklich implementiertes Design. Es handelt sich um ein Mockup-Beispiel, das zum Zweck der Fallstudie erstellt wurde.* Eine der größten Herausforderungen für das System bestand darin, sicherzustellen, dass es der Art und Weise entspricht, wie Physiotherapie im wirklichen Leben aussieht. Da die Besuche in der Regel sehr kurz sind, war es entscheidend, dass Therapeut und Patient ihre Konten in der App schnell verknüpfen können. Natürlich hatten nicht alle Patienten die App bei ihrem Eintritt bereits und haben sich auch nicht wohl im Umgang mit neuen Technologien gefühlt. Aufgrund ihrer geringen Technikkenntnisse war es für sie schwierig, die App herunterzuladen, ein Konto zu registrieren und – was am wichtigsten ist – ihre Profile mit denen von Therapeuten zu verknüpfen. Wir haben uns entschieden, das letztere Problem zu lösen, indem wir die Verknüpfung von Patienten-Therapeuten-Profilen durch einen zuvor generierten und gedruckten Code automatisieren. Auf diese Weise können Patienten ihre Konten nach Beendigung der Physiotherapiesitzung bequem von zu Hause aus verknüpfen. Durch Einfügen des Codes in die App können sie nun ihren vorgeschriebenen Trainingsplan herunterladen. Wir mussten auch separate Module für Patienten und Therapeuten erstellen. Auf dem Patientenprofil konnte man den Therapieplan herunterladen sowie die App täglich zur Übungs- und Fortschrittsverfolgung nutzen. Auch die Patienten-App erinnert und motiviert den Patienten durch die Anzeige von Therapiestatistiken, seinen Weg der Genesung fortzusetzen. Das Therapeutenpanel war viel anspruchsvoller. Erstens musste es den Therapeuten ermöglicht werden, Pläne für jeden Patienten individuell anzupassen. Außerdem mussten sie die Trainingseinheiten in einem Kalender planen und Informationen über die Anzahl der Zirkel pro Übung eintragen. Außerdem brauchten sie eine Option zum Speichern von Fotos und Videos, die während der therapeutischen Sitzung des Patienten aufgenommen wurden. Alternativ sollten sie auch aus einer im CMS gespeicherten Bibliothek von Tutorial-Videos auswählen Unsere Arbeit mit dem Kunden dauerte, bis das MVP gebaut und verbessert wurde. Die gesamte Zusammenarbeit hat ein halbes Jahr gedauert. Sechs Monate später haben unsere Kunden die App zum Verkauf angeboten. Schnell hat sich ein Interessent entschieden, vor Abgabe eines Angebots ein Audit der Software zu beauftragen. Nach einer positiven Bewertung hat sich das Unternehmen entschieden, den Kauf abzuschließen und entwickelt die App nun mit einem internen Entwick ## Optimizing Cycling Training with App Integrated with Wahoo Fitness Devices *Source: https://brightinventions.pl/projects/motivo/index.md* * Wahoo Fitness Integration * Apple In app purchases * Web purchases using Stripe * Bespoke user interface * Advanced animations When you’re a cyclist winter months is when your next season performance is decided. Give up to the elements and you’re done. Or... build your own indoor training system with Motivo. The app offers Interactive training plans and workouts for indoor cycling. Motivo makes sure you're getting the best results from a turbo training or spinning with full Wahoo KICKR Erg mode support.
![Cycling](../../static/images/pro-cycling.jpg "Cycling")
Daniel Bachini and Alain Ritchie, two London based cycling professionals, approached Bright Inventions in the late Summer of 2014 with the idea for a mobile training platform that would help cyclists like themselves in staying fit during the off season months. The goal was to launch a fully fledged system before the upcoming winter season after having tested the alpha and beta versions with the internal Motivo Cycling Team. ![Cycling Workouts Mobile App Development](../../static/images/motivo_mockup.png) A major challenge during the development phase was to ensure seamless integration with a set of Wahoo Fitness devices ranging from the heart rate sensors, speed & power sensors to power trainers (such as Wahoo’s flagship KICKR model). Bright Inventions was engaged in the ideation process and took full responsibility for the software part. A very ambitious timeline called for a highly optimised approach to the development. From the day zero a dedicated small team has been assigned to work on the Wahoo Fitness integration aspects. In parallel, two workshops with the customer representatives (held in Gdansk and London) led to the identification of the features supporting key business needs and the creation of prioritised requirements spec. It was clear from the beginning that some of the lower priority features wouldn’t make it to the first version of the product. A semi-professional internal Motivo Cycling Team was established and tasked with testing the alpha and beta versions of the upcoming product. They took on the challenge of including the Motivo app in their daily training, often doing extra exercises just to validate the app. In retrospect, the product would have never happened if it hadn’t been for the feedback collected from the Motivo Cycling Team. A highly iterative approach was taken with regards to user interface. Two most important screens (calendar and workout) were designed in a few different variations and the experiments conducted with the cyclist team helped decide on the one finally picked for the public release. ![Cycling Workouts Mobile App](../../static/images/motivo-1.png) The AppStore launch in January 2015 was supported by an advertising campaign that included ads in the UK sport press. A number of free subscription packages were given away as a way of enticing prospective users. Motivo successfully filled in the niche and many amatour and semi-professinonal cyclists switched to it as their primary training tool. More people than expected started to heavily use the workout builder in the web back office system which led to the further development of that area. Multiple additional engagement strategies were put in place as a result of analysis of the users interaction patterns with the product. ## Building Reliable Digital Survey Solution with Offline Mode *Source: https://brightinventions.pl/projects/app-digitized-surveys/index.md* * Planning investigations * Conducting a specific investigation * Self-investigations for the inspection targets (with video chat option) * Managing investigation projects  * Creating questionnaires  * Managing inspection targets and reporters * Following ongoing investigations and their subjects on a map * Generating PDF reports from investigations * Offline mode * Colours and logo customisation on a company level * Third party integrations (API’s etc) **technologies:** React, Node.js, PostgreSQL + Azure and Docker containers This is a web solution that helps to digitize the company work. The app can be easily customised according to the user's business needs. It helps to create and share digital questionnaires, reports and surveys. It is a perfect tool for companies that provide inspections and audits. Also, this is the first dedicated app for the social care team. ![web app development](../../static/images/digitizing_mobile_reporting_app.png) The goal of the software development process was to build a solution that would be flexible, easy to adjust and available offline mode for users. Our aim was to develop a UX friendly no-code workflow that helped to create digital questionnaires or surveys by users to end-users in a convenient and quick way. For example, a real-estate agency could create a questionnaire for a client to establish what property they would like to buy. We have already worked with this client on a mobile version of the app with similar functionality. This time the client wanted us to create a web app with an independent backend from scratch. The app needed to be simple to use and able to work offline as well. One of the key aspects of the app is the need to operate offline without any interruption and to synchronize whenever a connection is restored. This requirement determined the following technological solutions: * localStorage, Redux persist – they allow us to keep the needed data within the web browser, * Service worker – used for queuing requests sent while being offline. What is more, the web app needed to be responsive and work well both on desktop and mobile devices (phones and tablets) as most of the users are expected to work in the terrain. We used the media queries to adjust the styles depending on the screen resolution.  ![web app development](../../static/images/digitizing_mobile_reporting.png) Currently, the app is used by end-users to perform various types of questionnaire-based investigations. The end-users are highly satisfied with the ease of use. We take care of the maintenance and bug fixes, with some new features being introduced every now and then. ## PituPitu *Source: https://brightinventions.pl/projects/pitupitu/index.md* ## Main features: - Custom made black-and-white map theme - custom made horizontal scroller which you can swipe left-right to navigate between places and swipe up-down to reveal/hide more details - Facebook integration - auto-refresh - integration with GPS location provider ## Skills: - **iOS:** Objective-C - **Android:** Java - **Backend:** Ruby On Rails ## ShopScout App: Perfect Mystery Shopper Experience *Source: https://brightinventions.pl/projects/pospulse-shopscout/index.md* **POSPulse** * Defining and publishing assignments for ShopScout app users * Verifying the completion of assignments * Issuing payments (rewards) for proper task completion **ShopScout** * Browsing through available tasks, divided into categories * Completing assignments (i.e., taking photos, tagging the location, filling in surveys, etc.) * Redeeming funds collected on the user account Contracts between FMCG brands and chain stores often specify strict product presentation guidelines. For instance, they might indicate that the product needs to be placed in a specific aisle or next to a competing brand. It’s up to retail store owners to ensure that this requirement is filled at all times, and that the products are restocked in a timely manner. ![app for FMCG](../../static/images/pos_2_mockup.png) *It is not a real implemented design. It is a mockup example created for the purpose of case study.* Traditionally, stores needed to engage staff in such quality monitoring checks. POSPulse relieves them of this burden by engaging consumers who use the ShopScout app. Namely, companies can set specific tasks (such as, for instance, asking clients to take a photo of shampoo at a specific chain store). They can also be asked to fill in a user survey. To confirm that an assignment has been completed properly, the user needs to submit a product photo that includes localization data. For each finalized assignment, the user receives a financial reward. When POSPulse founders first reached out to [Bright Inventions](/), they had already finalized their work on the app design and were ready to proceed to software development. We were entrusted with building the entire system – the iOS and Android apps, a dedicated backend, and a web app for the operators (CMS). Our software developers worked on the app’s [MVP development](/our-areas/mvp-development/). After a successful market launch, we have also helped optimize the app in a series of post-MVP iterations. The app MVP was a huge success. With the growing global demand for their services, the app founders decided to create an in-house software team who eventually took over the development. The ShopScout app is available on both Google Play and the iOS App Store. As of late-2020, it has over 800,000 active users across multiple markets. ## The Story of the Successful Launch of FemTech MVP for Pregnant Women *Source: https://brightinventions.pl/projects/pregnancy-app/index.md* The studies **in the USA show that [over 50% of pregnant women](https://www.jmir.org/2021/10/e25667) downloaded pregnancy-related apps**, averaging three downloads during their prenatal period. It’s no surprise that women look for some technological assistance to help them navigate this unique time. **Although there are lots of FemTech applications addressed to pregnant women, many of them lack one thing: empathy**. A digital agency, with whom we have established a successful collaboration on various software products, presented us with an intriguing problem. **They were seeking expertise in developing the MVP for a fitness and nutrition app tailored for expectant mothers, aiming to ensure a healthy nine-month journey**. Notably, two key members of our team, both fathers-to-be, brought a unique perspective to the project, closely aligned with the product's purpose. **This collaboration was fully based on addressing specific industry needs and collecting valuable insights from the target user group**. **We started with thorough research and workshops in Berlin to understand the expectations and the technical assets** that needed to be created. As Bright Inventions focused on the technical aspects of the project, including **the development of the backend system, iOS, and Android apps**, the agency collaboratively worked on creating engaging videos and recipes. These elements were designed to enhance the app's value for paying customers. **The goal was to create a solution that felt personalized to female users at every step**. During the onboarding process, we exemplified the app's commitment to addressing women's unique needs. Through detailed questions about diet and fitness habits, we not only tailored content specifically for women but also fostered a connection with end-users. This approach conveyed to users that the app's creators genuinely aim to support them throughout pregnancy and the postpartum period.
![FemTech mockups](../../static/images/femtech_mockups.png "FemTech mockups")
The significant effort in the MVP development was dedicated to building a solution that tailors content to female users. **By observing users' interactions with the provided recipes and workouts (i.e. what they marked as favorite, what they cooked, etc.) the system allows for a personalized and adaptive content delivery** based on a user’s individual experience. This project has told us a lot about implementing tech that shows its users that they are listened to. The development process was all about empathy. **Our client conducted interviews with the potential users (mothers-to-be), analyzed their needs, and set up a rudimentary web-based proof of concept** to verify their discoveries. Building a product like this requires an immense amount of understanding of the user's needs. **We needed to deeply scrutinize every feature and interface element to ensure its clarity and smooth navigation**. The pregnancy app needs to make things easy, obvious, and fun. It also needs to build trust. Naturally, we couldn't make the final software and design decisions based on intuition, especially after the MVP launch. Therefore, **we adopted a data-driven development approach, relying exclusively on in-depth user behavior analytics and A/B testing**. [Read how the data-driven development saved onboarding for this app from failure](/blog/data-driven-development-femtech-app-onboarding/). The application was launched for iOS and Android at the same time, receiving **positive reviews from the first users**. With the help of the agency’s marketing team, **a solid user base has been achieved** in a relatively short amount of time. Over the years, **thousands of women have shown their love for the app**, and we're thrilled to be a part of the creation process of such a remarkable product. ## Reducing Automotive Production Delays with a Custom Manufacturing Asset Tracking *Source: https://brightinventions.pl/projects/asset-tracking-car-manufacturing/index.md* technologies: Swift, Android, Bluetooth Low Energy, Zebra Technologies A typical car contains **[around 30,000 individual parts](https://collectorsautosupply.com/blog/how-many-parts-are-in-a-car/)** and every one of them has to arrive and fit into the right place at the right time within a highly complex manufacturing environment. With a process this intricate, how do you even begin to spot what needs improving? This is exactly the challenge one of our clients – a provider of advanced asset tracking solutions set out to solve for a key player in the sector. Their end customer (a leading car manufacturer) needed a custom asset tracking system that would allow them to **track car components along the assembly line**, monitor **how long it takes to build an entire vehicle**, and identify **where delays happen and why**. The goal? To pinpoint the weakest links in the production chain and make smarter, real-time decisions to improve efficiency without guesswork or unnecessary warehousing. The system we develop operates in real-time, on the **assembly floor**, where each car-in-progress moves from one workstation to the next. At every station, a **gateway box is** installed. When a **tracker attached to a vehicle** comes into range, the system logs its location and displays the data live in the admin console. To monitor the production line, each vehicle is equipped with a small tracker. Yet the tracking process doesn’t start with a sensor – it starts with a person. The first step involves a factory worker equipped with a **handheld scanner** and our **mobile app**. At the start of the line, the employee scans a **QR code** of the tracker attached to the car component, linking it to the asset via the app. This pairing process has to be lightning fast. A new vehicle arrives every **10 seconds**, leaving only a brief window for scanning and syncing before the next car rolls in. To meet these constraints, we had to: * Optimize for **ultra-fast connection speeds** to pair trackers in real time * Build an interface that supports fast recognition and error handling * Eliminate anything that could slow down the user, including loading animations or complex screens * **Design a clean, minimalist notification system** to confirm success instantly, with no extra taps or distractions This isn’t just a technical integration – it’s a deep collaboration with the people on the floor. We work to understand their pace, their constraints, and the rhythm of their daily work. Building a fast, responsive asset tracking system is one thing. Making it reliable across an unpredictable manufacturing floor is another. To enable real time asset tracking we needed to maintain stable **background operation** across both Android and Apple devices used by the particular manufacturer company staff. Both platforms limit what apps can do in the background, especially with Bluetooth. To overcome this, we deeply optimized the app’s behavior and built an **onboarding and permission granting strategy**. From the first launch, users were guided to enable exactly what was needed which means no guesswork and no digging into settings menus. We also had to make sure the system didn’t **drain device batteries**, especially since it needs to run all day in a high-paced production environment. We achieved this by **batching network messages**, minimizing Bluetooth processing, and fine-tuning how and when the app wakes up in the background. The physical environment introduced its own set of challenges. Bluetooth Low Energy signal strength can be disrupted by all kinds of factors: * **Thick concrete walls** (common in European factories) reduce signal range * **Factory layouts** create unexpected dead zones or interference * Even **human bodies**, mostly made of water, could block signals simply by the user holding the device a certain way Testing this system wasn’t just a technical checklist, it was a full exploration of the factory's reality. Our QA team spent weeks reproducing obscure edge cases: dropped packets, gateway collisions, signal distortion due to metal machinery. By simulating even the most unlikely scenarios, we were able to harden the system for the unexpected and deliver a tracking solution that performs under real-world pressure. With manufacturing asset tracking in place, managers get access to live production data they can act on instantly. The system makes it clear which stations consistently slow down the line, helping to find the reasons why. In some cases, the delays in manufacturing might be caused by staffing issues: not enough machine operators to keep up with demand. In others, frequent malfunctions might reveal the need for stronger preventive maintenance at specific workstations.
![car manufacturing](/images/asset_tracking_production_automotive.png "car manufacturing")
The data can also reveal different problems hidden in the factory layout itself. In certain areas, just moving parts from one station to the next situated on the other side of the factory might take too much time. That can lead to a larger discussion about floor design – and in several cases, a rearrangement of workstations led to improvements in production speed. These are just a few examples of how manufacturing asset tracking can help change guesswork into proactive optimization. With clear, reliable data driven decision-making, the automotive companies could prevent delays, and reduce inefficiencies. Yet **the key to success lies in customization** – with asset tracking, every detail of a business’s operations can influence how well the software performs. ## From MVP to 200k Users. Meet Relevo – Sustainable Food Take-Away & Delivery App *Source: https://brightinventions.pl/projects/eco-friendly-app/index.md* **technologies:** Node.js, NestJS, React, MySQL, SwiftUI, Kotlin, AWS The year 2473 – by then, the plastic made today will probably have decomposed. Germany itself witnesses the consumption of approximately [3 million tons of plastic packaging yearly](https://www.statista.com/statistics/1265122/plastic-packaging-consumption-germany/). **Relevo, a Germany-based startup, introduced a pioneering solution: the provision of reusable containers for restaurants**, which could be borrowed by their customers free of charge.
![Relevo app](../../static/images/relevo_official_material3.png "Relevo app")
Relevo’s immense growth following the MVP launch was every startup founder's dream but it also presented some hurdles. As the app user base started to grow our client **needed an experienced tech partner to lead them through the further development providing a seamless Android and iOS mobile experience as well as transforming to new frameworks**. The client sought a well-organized team ready to support them in scaling a best-in-class tableware reusable system that would be highly rated by the users. Lunch hours can be the nemesis of every food-related app. **Our primary challenge was to guarantee the stability of the system during peak hours**. By implementing a robust cloud infrastructure, we not only enhanced the application's reliability but also paved the way for other innovations. Therefore our current emphasis is on the continuous development of a more mature product with a strong commitment to code quality. We have introduced a range of automated tests and are dedicated to further improving our quality assurance processes. **The challenge is to consistently deliver the most reliable and optimal solution that can be effectively extended to thousands of restaurants and an even larger user base**. Another notable obstacle we confronted was a technical limitation – **many restaurants throughout Germany operate without reliable internet access. In response, we devised a solution by implementing an offline mode, transforming Relevo apps into [offline-first applications](https://brightinventions.pl/blog/offline-first-app-guide-for-startups-app-owners-case-studies/)**. This enhancement allows users to carry out essential actions within the app, such as borrowing food containers, even in offline conditions. Once their internet connection is restored, the app seamlessly synchronizes all data, ensuring a smooth and uninterrupted user experience.
![Relevo packaging](../../static/images/relevo_official_material2.png "Relevo packaging")
The final hurdle is especially captivating because it leans toward cultural barriers rather than technical ones. **Users in Germany are cautious about downloading unfamiliar apps, so our team implemented App Clip and Instant App solutions to break this social barrier**. By implementing these technologies, we have streamlined the process of introducing new users to Relevo’s platform, instantly showcasing the app's key features on their screens without necessitating a full download. Over time, users opt to install the app as they recognize its value. Both App Clip and Instant App have evolved into significant channels for user acquisition. At the heart of our work was a **massive tech revamp featuring Node.js, NestJS, and AWS** to supercharge performance, scalability, and efficiency. This allowed us to enhance the system on many levels. By leveraging the power of Node.js and NestJS, we aimed to create a robust and flexible backend architecture that could seamlessly support the application's evolving needs. Additionally, **the incorporation of AWS services offered us a reliable and scalable cloud infrastructure to host and manage applications and data**, further reinforcing our technical foundation. In the front line, a **restaurant digital panel emerged with a management center for reusable tableware, orders, and tracking inventory** — everything in one sleek interface accessible to over **3,000 Relevo partners**.
![Client's quote](../../static/images/case_study_client_quote_relevo.png "Client's quote")
Behind the scenes, we can’t forget about building the **admin panel for Relevos’ team to strengthen ties with their massive network of partners**. This invisible hand keeps the client's eco revolution thriving. It coordinates orders, troubleshoots, ensures smooth collaboration with every partner, and incorporates a robust analytics dashboard, providing valuable insights related to tableware borrowing. Finally, this green wave wouldn’t have taken place without **Android and iOS applications that enable over 200,000 Relevo users to borrow reusable tableware**. Users seamlessly scan QR codes on Relevo's packaging, enjoying their take-away food and drinks wherever they want.
![Relevo mockups](../../static/images/in_text_relevo_mobile_mockups-4-.png "Relevo mockups")
After 3 years of collaboration, Relevo’s solution has transformed from an immature product to a fully-fledged one. **The mobile app is available in over 700 European cities and is loved by over 200,000 users**. Relevo no longer wrestles with peak hours, allowing them to concentrate on their green mission. We are thrilled to stand alongside Relevo in this extraordinary project. While our collaboration initially centered around backend development, we are appreciative that the client extended their trust to us, enabling us to oversee the complete system's development. More than [3 million plastic containers have been saved](https://app.relevo.de/) through our collaboration, and the count continues! *Bright inventions and the whole team is always with full heart at the project, understands our logic and intention behind and respects our requests and demands. The quality of delivered stories/features is in general very high / fast and the understanding of bright inventions is to work as a partner-team to get the best solution ready. We highly appreciate the cooperation and the great business progress Relevo did would not be possible without the dedicated work of bright inventions.* **Matthias Potthast, Founder of Relevo** ## Empowering MHealth System with NHS-Certified Bluetooth Devices *Source: https://brightinventions.pl/projects/remote-patient-monitoring/index.md* **technologies:** Dagger, Kotlin Coroutines, Jetpack Libraries, Adobe XD When COVID-19 swept across the world, it revealed the stark reality of global healthcare. **The traditional health systems, with staff shortages and the glaring lack of funding for public care, have not been able to face the rising challenges**. Among these challenges were the escalating cases of chronic diseases and mental health issues. The healthcare sector urgently needs a comprehensive and technologically advanced solution that addresses the shortcomings revealed during the COVID-19 pandemic. This could be done by the integration of telehealth services, remote patient monitoring, efficient data management, and improved communication channels between healthcare providers and patients. **We joined forces with our client based in the United Kingdom to find the cure for the healthcare sickness in the United Kingdom**. Our collaboration has already yielded a robust [Medicine Administration Record (eMAR) system](/projects/vCare/), available on both Android and iOS platforms. After that, we took another step towards healthcare digitalization. Our team supported the client in **developing a pilot Remote Patient Monitoring (RPM) system for Android**, the application accessible by a doctor at their office, showing them in real-time the vital signs of their patients who are currently at home. The app is now available in the United Kingdom.
![Pulse oximeter](../../static/images/pulse_oximeter.png "Pulse oximeter")
The RPM system is centered around an Android application, complemented by a couple of **Bluetooth health-monitoring devices** integrated by the Bright Inventions team. The application empowers medical professionals to efficiently manage more patients without needing individual, time-consuming examinations. Another crucial step towards the digitalization of healthcare is **telemedicine**. We supported our client in this area as well. **Our team crafted an Android application supporting online consultations for users**. Patients have a scheduled consultation in the app; all they need to do is join the meeting, enabling the camera and microphone. 
![Telemedicine](../../static/images/telemedicine.png "Telemedicine")
Our team faced the formidable **challenge of integrating various healthcare devices with distinct Software Development Kits (SDKs) into a cohesive system**. With our Android team's expertise, we successfully harmonized these disparate SDKs into a unified system. Furthermore, another compelling challenge involved **developing an algorithm capable of rapidly detecting whether a patient's vital signs signal an urgent requirement for assistance**. Our team devised a solution that facilitates data transmission to the doctor, **triggering an alarm in the event the patient’s medical condition escalates to a life-threatening state**. Our client has become an **approved NHS supplier of remote monitoring services and an ISO 27001 accredited company**. The company sets a direction for digital healthcare transformation in the UK. We are proud to have been a part of this advancement in health technology and are confident that this product will positively impact the lives of hundreds of thousands of people. ## App fur Schwangere Frauen *Source: https://brightinventions.pl/projects/schwangerschafts-app/index.md* ![Pregnancy App](../../static/images/preganncy_app_2_screens2.png "") ## Wichtigste technische Elemente * Apple- und Android-In-App-Käufe * Videoinhalte für Premium-Kunden verfügbar * Tiefe Integration mit Systemkalender, Erinnerungen, Push-Benachrichtigungen * Detaillierte Analysen des Benutzerverhaltens * A/B-Tests ## Einleitung Die mobile App unterstützt werdende Mütter, indem sie ihnen Möglichkeiten bietet, während ihrer neunmonatigen Reise fit zu bleiben und sich gesund zu ernähren. Die kuratierten Inhalte werden basierend auf den Nutzerinteressen personalisiert. Jede Woche bringt eine neue Reihe von Übungen, Rezepten und Tipps. ## Verfahren Die Agentur hinter der Schwangerschafts-App hatte in der Vergangenheit bereits bei mehreren Produkten mit Bright Inventions zusammengearbeitet. Wie zuvor hatte der Kunde Interviews mit den potenziellen Benutzern (werdenden Müttern) geführt, ihre Bedürfnisse analysiert und einen rudimentären webbasierten Proof of Concept eingerichtet, um ihre Entdeckungen zu verifizieren Sobald der Bedarf für das Produkt bestätigt war, engagierte sich Bright Inventions. Wir begannen mit einem Workshop in Berlin, um die Erwartungen und die erforderlichen technischen Ressourcen zu verstehen, die geschaffen werden mussten. Glücklicherweise waren zwei Personen, die von Bright Inventions an dem Produkt beteiligt waren, zu dieser Zeit werdende Väter, die ihre Partner intensiv unterstützt haben und die Notwendigkeit eines solchen Produkts gesehen haben. Der Entwicklungsprozess war geprägt von Empathie. Der Aufbau eines solchen Produkts erfordert ein immenses Verständnis der Benutzeranforderungen. Kein Element der Benutzeroberfläche darf verwirrend, unklar oder schwer zu bedienen sein. Eine Anwendung für werdende Mütter muss die Dinge einfach, offensichtlich und unterhaltsam machen. Es muss auch Vertrauen aufbauen. Da Bright Inventions auf der technischen Seite (Backend-System, iOS- und Android-Apps) arbeitete, hat die Agenturseite die Erstellung der Videos und Rezepte übernommen, die in der App für die zahlenden Kunden verfügbar gemacht werden sollten. Ein großer Teil der Arbeit bestand darin, eine Lösung zu bauen, die die Inhalte an die Benutzer anpasst. Durch die Beobachtung der Interaktionen der Benutzer mit den bereitgestellten Rezepten und Workouts (d. h. was sie als Favoriten markiert haben, was sie gekocht haben usw.) passt das System das Material an, um das Erlebnis zu personalisieren. Technische Herausforderungen bestanden in erster Linie darin, die Parität der Funktionen auf allen Plattformen und die tiefe Integration mit dem Systemkalender sicherzustellen. Ereignisse mussten automatisch zum Kalender hinzugefügt, auf allen Benutzergeräten synchronisiert und geplante Push-Benachrichtigungen zu den entsprechenden Zeiten ausgelöst werden. ![Pregnancy App](../../static/images/pregnancy_app1.png "") ## Start Die Anwendung wurde aufgrund der positiven Bewertungen der ersten Benutzer gleichzeitig für iOS und Android gestartet. Mit Hilfe des Marketingteams der Agentur wurde in relativ kurzer Zeit eine solide Nutzerbasis erreicht. Die App hat sich als separates Unternehmen ausgegliedert und mit dem Aufbau eines eigenen internen Entwicklungsteams begonnen. Bright Inventions hat all diese Bemühungen unterstützt, half bei der Auswahl der richtigen Ingenieure und beim gesamten Wissenstransfer. ## SmartHelp: Instant Emergency Localization with a Single Click *Source: https://brightinventions.pl/projects/smarthelp/index.md* SmartHelp is a holistic solution offering emergency services to anyone who’s found themselves in need of critical help. The app operates in Norway, and makes it nearly effortless for users to answer the three questions emergency centers ask before they send a rescue team – ‘where’, ‘what’, and ‘who’. The first step (“where are you?”) is done by streamlining the user’s location to a map-centric emergency call center. Secondly, the user answers the “what is it?” question by clicking on the symbol that depicts the type of emergency (fire, police, or medical assistance). Next, he/she is connected to the rescue center via call or chat. The third question (“who are you?”) is automatically answered with pre-defined personal information such as name, address, and existing medical conditions. All this allows the emergency call handler to share the user’s details with the rescue team. The app also covers situations, when the user is in no condition to communicate with the emergency center back and forth. This is done using a key device integrated with the app – **SmartButton**. ![An emergency service app ](../../static/images/smarthelp_screens1and2.png) The single-click emergency button allows the user to instantly streamline they location not only to rescuers, but also family, friends, or even their security company – anyone whose details were added to the app. Importantly, once the SmartButton is pressed, all of the notified sides keep receiving live updates on the status of the rescue request (for ex., if the user exchanged any chat communication with the emergency team, it also gets shared with the other parties). This feature can also be leveraged by institutional clients (for ex. Health & Safety professionals), who need to make sure their employees are always safe and taken care of in case of any work-related emergency. The goal was to create a system that consists of three elements: two native mobile apps – for iPhone and Android, an Emergency Services web panel allowing to locate and communicate with users (both those with the app and without it), and the backend. Bright Inventions has been a part of the project from the very beginning – from the ideation phase to the project’s full-stack implementation, deployment, and maintenance. The iOS and Android native applications were designed to provide a smooth user experience that respects user habits in each operating system. The biggest UX-related challenge was to make sure that the app is extremely simple to use by those who have found themselves or another person in a state of critical emergency. ![An emergency service app ](../../static/images/amarthelp33_700.jpg) For the iOS native application, our developers used Objective-C/Swift, ReactiveCocoa, and for Android – Kotlin, RxAndroid, Dagger, and Retrofit. Server-side applications were developed with the use of Node.js and Nest.js. PostgreSQL was chosen for database creation, integration, and management. On the front-end, the developers worked with React, supported by Socket.io and Leaflet. It was critical that the SmartHelp platform represents a 'Privacy by Design' approach. And so, the software was built with a fully end-to-end encrypted channel for exchanging situational awareness information between parties. Its ingenious cryptographic architecture allowed SmartHelp to be certified for medical information processing under Norwegian data privacy laws, comprising of some of the most stringent requirements in the world. SmartHelp has been in operational use since December 2014. To date, it is the only app that makes the user visible on the map to call center staff right at the moment of the call. Apart from a freshly-revamped design, the newest version of the app now also offers more than the emergency communication features themselves. The app allows any organization to set up its own emergency response center with internal emergency numbers, own resources, and secure communication. SmartHelp can also be used in day-to-day life to share a user’s location with friends, travelling companions, family, or colleagues. It can also be used to communicate with the wider public. By setting a geographical area and sending messages to those who are within its premises or nearby, users can warn them about an impending dangerous situation.
![Emergency app](../../static/images/smarthelp.png "Emergency app")
## Speeding-Up Restaurant Phone Ordering with POS & Caller ID Integration *Source: https://brightinventions.pl/projects/restaurant-pos-caller-id/index.md* **technologies:** Kotlin, Swift Imagine managing hundreds of restaurant orders coming from different channels: online, in-house, and by phone. **Handling phone orders, in particular, can be especially time-consuming and error-prone**. Waitstaff must ensure that the details, from the order itself to the customer’s address and phone number, are accurately recorded. **This manual process consumes time and increases the risk of mistakes**, such as incorrect orders or deliveries to the wrong address. When scaling the point-of-sale solution for Practi, a company later acquired by Just Eat Takeaway.com, we recognized the need to speed up the phone ordering process. Our [POS development](/blog/pos-software-development-guide/) team recommended integrating the Practi POS system with a Caller ID to transform the phone ordering. So, what’s special about this integration? The Caller ID is a device that automatically transfers information about the incoming phone number to the restaurant's POS system. Yet it goes beyond just displaying a phone number. By **combining the Caller ID data with the POS system, the waitstaff instantly identifies the caller**, checks if they are a regular customer, and accesses their previous order history and delivery address.
![Caller ID and POS](/images/pos_caller_id_case_study.png "")
In cases where the caller is a regular customer, **the waitstaff can quickly suggest the customer’s usual order** and any loyalty points earned are automatically added to the customer’s account. What’s more, if a customer calls to ask about the status of their order, the waitstaff has all the information without needing the customer to provide any additional details. One of the issues we needed to face was the **lack of standardization for mobile country number prefixes**, such as +44. This meant that if a customer called from the same phone number but the system received it once with the prefix and once without, it would not recognize them as the same caller. This inconsistency could lead to duplicate entries and confusion in the order history. To address this, **we developed a custom validation solution that could recognize phone numbers as identical**, whether they included the country prefix or not. Another challenge we discovered during the testing phase was that occasionally **the information sent by Caller ID wasn’t captured**. The Caller ID device operates in broadcast mode, meaning **it transmits data across the network without directing it to a specific receiver, such as a POS application**. This created situations where the restaurant might not receive the caller’s information, compromising the reliability of the Caller ID integration. This issue influenced the way we designed the entire integration. To address this challenge, **we explored a key feature of the Caller ID device: sending information multiple times across the network to ensure no phone number would be missed**. Building on the provided specifications, **our team developed the Caller ID and [POS integration](/blog/pos-integration/) from scratch**, as no solution was provided by the device manufacturer. A crucial part of our solution was **filtering out duplicate inputs**, which naturally occur when Caller ID sends information multiple times. Our integration was designed to **ensure that even when the local network experiences disruptions, the POS application can still reliably capture caller information**. Integrating Caller ID for restaurants resulted in **shorter call times and a more personalized experience** – customers felt recognized from the very first "hello". This integration was successfully implemented in restaurants across the UK and Israel, helping businesses improve order management and build stronger relationships with their customers. ## Digitally Connecting the UK Care Homes *Source: https://brightinventions.pl/projects/vCare/index.md* **technologies:** Kotlin, Swift, Bluetooth, Adobe XD **In the United Kingdom, approximately [17,100 care homes are dedicated to accommodating over 400,000 individuals](https://www.braemarfinance.co.uk/s/insights/blog/facts-figures-uk-care-home-sector-MCXEQ2ZU7QKVFOBOP272VSXJDDWQ#:~:text=The%20care%20home%20sector%20in,after%20more%20than%20400%2C000%20people.)**. The UK's care home sector plays a pivotal role in supporting those in need of professional care. In the extensive array of duties borne by care home providers, the task of **medicine distribution is a crucial and demanding responsibility**. The lack of digitalization in this area has cast a long shadow, leading to a confronting reality where **communication between pharmacies and care homes is fragmented and historical data on patient medication distribution alarmingly inaccessible**. **Camascope, formerly VCare Systems, a UK-based health tech company**, was co-founded by **[Saurabh Shah](https://blog.camascope.com/resources/post/the-camascope-story), a pharmacist with 15+ years of experience** whose vision led to the creation of the Electronic **Medication Administration Record (eMAR)**, streamlining medicine distribution for care home professionals.
![home care HealthTech](../../static/images/home_care_health_tech.png "home care HealthTech")
Upon the debut of their initial eMAR solution, **Camascope reached out to our team to explore a collaborative effort aimed at refining and advancing the product to a more sophisticated stage**. As a result, a comprehensive eMAR solution emerged. A mobile application, accessible on both Apple and Android devices, now **provides seamless access to patients' medical history and prescribed medications**. This application facilitates **real-time updates on medication intake** accessible for healthcare providers, patients, and their families. The **offline mode empowers caregivers to make essential updates without concern for internet connectivity**. Moreover, the **Camascope system mandates supervisor approval for significant treatment alterations. It also reduces errors by promptly notifying care home staff about potential missed medications**, alleviating the considerable responsibility of their workload. Imagine being a nurse, juggling the care of multiple patients, each with unique health profiles, medication plans, and allergy considerations. Healthcare providers grapple with a flood of information. **The crucial challenge was to create a system that not only organizes this complexity but also reduces the risk of errors**. **We crafted a design that prioritizes crucial information while keeping all important patient data accessible on a single screen**. Based on detailed field studies and research, we understood that end-users desire quick access to patient information and don’t want to navigate through multiple screens to obtain it. Thus, ensuring the **interface is easy, fast, and smooth was the answer they needed**. Another challenge was **building a system that would genuinely streamline daily processes**, rather than becoming an additional burden on the shoulders of care providers. Our team built a variety of features specifically crafted to streamline the daily operations of caregivers. For instance, **by scanning the barcodes of medications, the system automatically notifies which medicine has been administered, eliminating the need for manual input**. An important feature we also incorporated was a user-friendly **body map, which enables physicians to quickly select a body part on the map, linking it to the administered medication or medical procedure**. This intuitive tool aids in both accuracy and efficiency in patient care. Overcoming another hurdle, **we focused on refining a critical HealthTech feature – offline mode**. In situations where every second counts, having a reliable app without an internet connection is imperative. Our challenge was to **design an interface that unmistakably signals when users are in offline mode, ensuring seamless data synchronization at a later stage**. The emphasis here was on a clear and intuitive design. *
Camascope mockup for the offline mode marked by the information bar.
* **As an NHS Trusted Supplier and Crown Commercial Service Supplier Camascope has digitalised medicine distribution for over 1,000 health & care organizations**. The system is integrated with **leading pharmacy chains such as Boots, LloydsPharmacy, and Well**. We are proud to have helped Camascope level up its solution during a crucial scaling phase. Currently, **the system supports over 25,000 active patients across the UK**, establishing itself as a leading mMedTech platform for British care homes. During our collaboration with Camascope, we also built an [IOT system with MedTech wearables and a telemedicine application](/projects/remote-patient-monitoring/). Read more about it in another case study! ## Digitalizing Logistics: How We Transformed a Transport Management System *Source: https://brightinventions.pl/projects/transportation-management-system/index.md* * **Importing freight listings** from popular transport marketplaces. * **Filtering out listings** that don’t match the basic criteria (weight and size of the load, route details, etc.). * **Preliminary matching** of the listings with the right vehicle and driver. Then it can be verified by the forwarder. * **Managing the route** from arrival to the destination point. Adding extra points on the carriers’ map. * Receiving **notifications from the drivers** about delays or other disturbances on the road. **Frontend**: TypeScript, React, Redux, React Query **Backend**: Nest.js, TypeScript, AWS, PostgreSQL, Prisma **Android development**: Kotlin, Coroutines, Flows, ViewModel, Firebase, Hilt, and other Google APIs **Product design**: Figma, Adobe Illustrator The client started a collaboration with Bright Inventions to **build a customized tool for their internal transport management department**. It offers one of the fastest and safest forwarding and transport services to companies all over Europe. In 2022 they executed over 180,000 shipping orders. Like many logistics companies our client struggled with endless paperwork, and tons of Excel sheets, which defined the inefficient core of their transport management system. They aimed for a change, hoping for a successful digitalization of their daily work. But, **finding an off-the-shelf solution that truly fit their unique needs was a challenge**. **That's when they partnered with Bright Inventions to craft a tailor-made Transport Management System.** Our client's main goal? To **see if their software management system idea could handle their daily operations and potentially grow into something bigger**. Our solution? **Start small and smart with an MVP** (Minimum Viable Product) – the quickest path to validating your game-changing ideas. The solution was supposed to **transform forwarders’ work into a less repetitive, faster, and more automatic job**. The aim was to limit both: the time between finding and matching load with the right transport provider and the number of kilometers done by empty vehicles. Fast and effective utilization of vehicles' spare capacity is essential for the industry. Also, another long-term goal is to **support daily communication with road hauliers with a customized Android application** dedicated to drivers. The main challenge was to **build a fast solution**. Time is the key to the shipping industry. The app has to aggregate the listings quickly and assign them to the right carriers. Every millisecond counts. Our team designed an **algorithm that would automatically filter out transport listings to display only the ones that match the client's expectations**. In terms of product design, the right **architectural information** is the key. **Forwarders work at a high pace and they expect any work tool to make their job even faster**. The client required us to include as much information as possible on one screen, so they could scan all the information fast.
![transport management system UI case study](../../static/images/tms_market_ui.png "undefined")
**At Bright Inventions, we took charge of every stage in creating the MVP** – from defining requirements and product design, through web development, rigorous quality testing, and efficient cloud management, to a successful launch. Naturally, our work didn't stop there. We are here for ongoing maintenance, too. The MVP took off in October 2022, and the client's team loved what they saw.
![Testimonial](../../static/images/case_study_tms_client_quote_update.png "Testimonial")
### Web development based on the latest technologies From the beginning, **we were entrusted to choose the right stack** and had the pleasure of implementing the top tools available at the moment. While we were venturing into the realm of MVP implementation, our commitment to forward-thinking was unwavering. **The technical stack we selected had to be future-proof, and capable of facilitating seamless long-term system integration**. This choice prioritized rapid implementation, uninterrupted performance, and the agility to effortlessly incorporate new features. Our objective extended beyond ensuring a frictionless user experience. We also aimed to streamline the software development process, optimizing time and effort allocation for our team in the foreseeable future. To make it possible **we implemented the best solutions JavaScript and AWS have to offer with Lambda and SNS on top of them**.
![transport management app case study UI UX](../../static/images/tms_case_study_screen_map.png "undefined")
### Product design: the key success factor to a smooth digital transformation Before our team presented the MVP mockups we took the necessary steps that helped us design the product. Our process commenced with comprehensive **desk research**, seamlessly transitioning into rigorous **benchmarking**. Furthermore, we leveraged the valuable opportunity to engage in **field studies** and **user shadowing**, complemented by adaptive interviews. The challenge confronting the product design team was the **development of a user-friendly, yet data-intensive system. Our primary objective was to ensure a seamless transition for users who have long relied on existing tools**. Users had to swiftly recognize the advantages offered by the new solution.
![shipping mobile app mockups](../../static/images/in_text_tms_mobile_mockups.png "shipping mobile app mockups")
We addressed this challenge by implementing best UX practices such as: **representing a mental model** of end users, designing a **navigation flow based on familiar user patterns**, and incorporating an **information hierarchy** to include as much data as possible on a screen without overwhelming users. Read our blog post to find more recommendations for [UX design for the transport management software](/blog/ux-design-transport-management-software-case-study/). ### Mobile development for effective communication between freight forwarders and drivers **Following the triumphant MVP launch of a web application, our client chose to partner with us for mobile app development**. We have been hard at work crafting a **native Android mobile app**, and the MVP has just hit the market. Exciting times ahead! **The mobile app supports communication between forwarders and drivers**. For example, it allows sharing of carriers' localization with the forwarders and sending scans of documents. After the MVP launch, the app is now being tested by the first users.
![Mobile app for drivers](../../static/images/driver_app.png "Mobile app for drivers")
It is essential to highlight the significance of product design in the context of a mobile application. **The mobile application is specifically designed for haulers, where the display of only essential information, such as loading specifics and route details, is paramount**. Distractions with extraneous information are minimized. The user interface prioritizes simplicity, enabling couriers to promptly update loading statuses, such as “delivered” or “delayed”. **The app makes it a breeze to upload transport order documents**. Our design is all about being clear and user-friendly, with big, eye-catching buttons that set it apart from the ordinary business apps you come across every day. MVP launch ensured the client that the system has the potential to change the daily work on their team. **The company is on the verge of a complete digital transformation**. At this moment **90% of daily transport management operations are done with the new system**. **Our team managed to meet the crucial client’s requirement** – delivering a fast transport listings filtering system. As a result, **the system analyses routes for forwarders in up to 5 seconds per order, saving a total of 300 h per employee a year**. Before that, the filtering process had to be done manually. *Their flexible and professional approach to business was impressive. The difficulties encountered in the creation process were never a problem, only a challenge. All the set goals were met on time.* **Grzegorz Gajewski, Development & Training Manager** We’re delighted that **the client decided to continue our cooperation after a successful MVP launch – both web and mobile versions**. Now we focus on scaling the product in the post-MVP phase. Our team implements new features such as the electronic circulation of documents. We still work closely with end users, quickly responding to their feedback. Open communications, flexibility, and adaptability are the key factors of this successful digitalization. ## Transforming Devices into Scalable Trackers for Equipment Tracking for Manufacturing *Source: https://brightinventions.pl/projects/manufacturing-asset-tracking/index.md* technologies: Swift, Android, Bluetooth Low Energy, Zebra Technologies When it comes to workplace fraud, most of it isn’t some elaborate heist – it’s just stuff quietly going missing. In fact, asset misappropriation accounts for [89%](https://bradyware.com/new-acfe-report-exposes-rising-fraud-costs-trends/) of all reported cases. For manufacturers, where machinery, tools, and mobile assets are constantly in motion, **the need for reliable asset tracking is more critical than ever**. Traditionally, companies have relied on dedicated tracking hardware – physical devices attached to every asset to monitor its location and usage. While effective, **this method might be redundant** – especially in environments already equipped with a range of capable devices. One of our clients in the manufacturing sector faced this exact dilemma. They had already invested heavily in mobile devices, including popular iOS and Android smartphones, as well as specialized **Zebra Technologies** hardware. The question was: **Could we transform these existing devices into a scalable asset tracking system?** To address this challenge, we developed a scalable, software-based asset tracking network inspired by the principles behind **Apple’s iBeacon technology**. Our custom solution **leverages devices the company already owns** by transforming them into active participants in a decentralized tracking system. Using **Bluetooth Low Energy (BLE)**, each mobile device can act either as a tracker or as a detector. By simply installing the application we built for the company, any iOS or Android device becomes capable of simulating a beacon signal. This means **the devices can both emit their presence and listen for signals from nearby assets** – essentially turning the entire mobile fleet into a dynamic, location-aware network. Here’s how it works: if a device is lost, it can be marked as "missing" in the system. The next time another employee carrying a phone with our app passes nearby, their device picks up the BLE signal and sends a command to the lost asset. That command triggers **the lost device to vibrate and emit a loud sound, making it easy to locate** – even if it’s out of sight. What’s more, the app logs when and where the missing item was last detected and by whom, creating a real-time trail of activity. This **transforms every employee’s pocket into a tool for tracking and recovery** – no extra hardware required. One of the biggest challenges was the **fragmentation in the Android ecosystem**. Every manufacturer tends to modify the Android operating system, which affects background behavior and Bluetooth scanning. A feature like continuous BLE scanning – essential for our solution – works flawlessly on one device but may be completely blocked on another. We had to ensure stability across a wide array of devices, from Zebra scanners to Samsung or Apple smartphones, each with their own quirks.
![device tracking](/images/manufacturing_asset_tracking_photo.png "device tracking")
**Maintaining consistent background operation was critical** – and no small feat. Both Android and iOS place strict limitations on what apps can do in the background, especially when it comes to Bluetooth activity. We made it work by deeply optimizing the app's behavior, which required a **strong understanding of both Apple’s and Android’s native system**s. Just as important was designing a thoughtful permission strategy: from the very first onboarding screen, users were guided to grant all the necessary permissions to ensure the app could function reliably in the background. What’s more, the **equipment tracking** app has to remain active at all times without significant drain of the battery. We optimized power consumption by batching network messages and reducing how often we processed Bluetooth events, without sacrificing responsiveness. **Environmental factors** added another layer: solid concrete walls (common in Europe) versus thin drywall (typical in the US) significantly altered signal strength. Even human bodies – being mostly water – can block BLE signals when a device is held in hand. Therefore **testing this system was a monumental task**. Our QA team became deeply familiar with countless edge cases – from interrupted data packets to the physical realities of the factory itself, including its layout, construction materials, and how they impacted signal behavior. All that effort paid off: by reproducing even the most specific and obscure conditions, we were able to **reduce unexpected bugs in the production environment** and deliver a more reliable product. Every company-owned device is now **tracked in real time, 24/7** – reducing the risk of asset misplacement or misuse. Globally, businesses lose an estimated [5%](https://www.smallbizgenius.net/by-the-numbers/employee-theft-statistics/?utm_source=chatgpt.com) of their revenue annually to occupational fraud. By implementing a software-based tracking system that requires no additional hardware, a leading company in the manufacturing sector took a major step toward safeguarding their assets. ## Improving User Experience for xpomaker – Trade Fairs Management Software *Source: https://brightinventions.pl/projects/xpomaker/index.md* ![A trade fair planning software](../../static/images/xpomaker_dashboard2.png) * Creation of new fair projects * Inviting users to projects as team members * Task management panel * Adding and managing list of items needed for fair stands * Managing fair staff accomodation and timetables * Calendar view of tasks and events planned for the fair * Budget and expense management planner **technologies**: ReactJS + TypeScript, Redux, NestJS, PostgreSQL, Stripe, Docker, AWS, TeamCity For many industries, participating in fairs lies at the heart of business, and is a key element of sales, lead generation, and building B2B partnerships. However, being responsible for exhibiting at industry events can feel overwhelming given the number of tasks involved. In most cases, your fair presence must be carefully planned months in advance, and requires you to simultaneously coordinate multiple processes. A single delay from a contractor or a minor omission on your side, and – like a game of dominoes – the whole plan can collapse. So, how do you stay on top of all this without worrying about organizational chaos and deadlines? Here’s where xpomaker comes into play. ![A trade fair planning software](../../static/images/xpomaker_dashboard.png) The Founders of xpomaker were looking for an experienced product design team who would translate the general vision for the software into a user-friendly, visually-appealing product. When our paths first crossed, they had already been cooperating with a consulting company that helped determine the necessary UX features and user expectations. While our cooperation initially started off with an interface design project, we were quickly asked to rebrand and redesign the entire app – including taking care of frontend and backend adjustments. We first worked on delivering high-fidelity wireframes of the proposed user interface. To make sure that the designs incorporated all necessary features, our team cooperated with the consulting company’s product owner. For xpomaker, it was crucial that the app architecture and design felt familiar to users. This meant that we were to design an interface that would resemble the experience of using spreadsheets for tracking fair preparation progress. Hence, we knew that a table format, as well as .xls file import/export were two features that needed to be taken into account and reflected in the design. Secondly, the app needed to incorporate a payment process that would allow users to manage revenue and wire funds. Having analyzed multiple payment solutions on the market, we have decided on Stripe, which featured subscription payments and invoice handling – both essential to the client. All of these steps allowed us to deliver a solution that is both functional and intuitive to its users. After our work on the interface design had finished, xpomaker engaged us in a rebranding project they had been working on. The scope of our work included applying all necessary software development adjustments on the frontend and backend of the app. After the rebranding phase of our cooperation when the name and the visual identity of the company had changed, our team redesigned the entire app and refine the software accordingly. xpomaker is now present on the German market and offers three subscription plans. The software lets users coordinate as many exhibition projects as needed. Our team is currently responsible for the app maintenance. However, the app founders are now collecting user feedback in preparation for another round of user-inspired design and software work. # Blog Posts ## The Hidden Costs of "Alpha": The Struggle with Compose Screenshot Tests *Published: 2026-02-16 | Author: lukasz | Tags: Android, Mobile, Compose, Screenshot Testing* *Source: https://brightinventions.pl/blog/compose-screenshot-test-library/index.md* **Some time ago, we decided to integrate the new[ Compose Screenshot Testing](https://developer.android.com/studio/preview/compose-screenshot-testing) library into our app. Even though the library was (and still is) in alpha, the promise of a seamless, first-party setup was incredibly appealing.** **Oh, how wrong we were.** ## The Configuration Rabbit Hole After reviewing the official documentation, we were confident we could integrate the library and start testing in no time. We followed the setup steps to the letter: adding properties, applying the plugin, and configuring the dependencies. Then came the first Gradle Sync. It failed with an error that would haunt us for a long time: ```YAML java.lang.NullPointerException: getValue(...) must not be null at com.android.compose.screenshot.PreviewScreenshotGradlePlugin$Companion .getSCREENSHOT_TEST_PLUGIN_VERSION(PreviewScreenshotGradlePlugin.kt:95) ```
![This is fine meme](/images/compose-screenshot-test-library/this-is-fine.jpg "This is fine meme")
We found a few similar cases online and tried every suggested fix, but nothing stuck. It appeared that the plugin application order during Gradle Sync was clashing with our current project configuration. At this point, we decided to kill two birds with one stone. We were still managing dependencies via **buildSrc**, so we decided to migrate to **Version Catalogs**. While we didn't expect the migration itself to fix the plugin error, we hoped the cleaner structure would help us isolate the cause. (The migration of 50+ modules is a story for another day, but thanks to some AI assistance—shoutout to Junie!—we finished faster than expected.) With the migration complete, we reapplied the plugin and—to no one's surprise—hit the same error. However, thanks to the migration, we were finally in a position to easily begin the tedious process of slowly porting our project configuration into a clean 'empty' project where the library _did_ work.  ## The Culprit: A "Hidden" Classpath Collision Eventually, we found the culprit: a plugin interdependency conflict caused by a naming collision. It turned out that both the Google screenshot library and the Kotlinter plugin were trying to package a file named `version.properties` at the root of their JARs. When Gradle attempted to sync, Kotlinter "won" the collision and placed its own `version.properties` on the classpath. Since this file lacked the `buildVersion` property that the Google plugin expected, it triggered a `NullPointerException`, leading to the sync failure. We reported [the issue](https://issuetracker.google.com/issues/482074642) on the Google Issue Tracker and discovered that while Google has [already addressed](https://android.googlesource.com/platform/tools/base/+/0f8f8da6641225cf0e934ca878f6b0fbbf350315%5E%21/preview/screenshot/screenshot-test-gradle-plugin/src/main/java/com/android/compose/screenshot/PreviewScreenshotGradlePlugin.kt) this in their source—renaming their file to the more specific `com-android-compose-screenshot.properties`—that fix hadn't been deployed to a public release yet. Fortunately, the Kotlinter team had already moved to a [unique naming convention](https://github.com/jeremymailen/kotlinter-gradle/pull/457/changes) a few versions back to prevent exactly this type of conflict. By simply updating our Kotlinter version, the Gradle Sync finally passed. ## The CI Wall Our struggles are over! That’s what we thought…  We added tests, generated reference images and verified everything locally. It worked perfectly—valid UI changes passed, and regressions triggered failures. Then we moved to the CI pipeline. We introduced a new step for our tests but then the builds started failing. When we investigated the generated reports, we were met with a confusing sight:
![Images comparison](/images/compose-screenshot-test-library/images-comparison.png "Images comparison")
Even though there were no visible differences between the local and CI images, the validation failed. This is a classic screenshot testing hurdle: tiny environmental differences (like font rendering or GPU anti-aliasing) between local machines and CI runners.
![Images hex comparison](/images/compose-screenshot-test-library/images-hex-comparison.png "Images hex comparison")
To the naked eye, the images were clones, but a dive into the metadata and hex data told a different story. Despite a mere **1-byte difference** in total file size, a binary comparison revealed discrepancies at over **8000 distinct locations**. This highlights how deep the "environment gap" actually goes.
![Spiderman pointing meme](/images/compose-screenshot-test-library/spiderman-pointing.jpg "Spiderman pointing meme")
We attempted to resolve this by applying an `imageDifferenceThreshold`, but even that didn't stabilize the results. ## The Compromise In the end, we settled on an imperfect solution. We implemented a separate CI workflow that, when triggered manually, generates new reference images and commits them directly to the feature branch. Notably, such a server-side approach is the one [recommended in the official guide](https://developer.android.com/training/testing/ui-tests/screenshot#take-screenshots). However, in our view, it remains less than ideal because it prevents us from reliably running the full validation check on our local machines. Still, it gives us a consistent environment for our "source of truth." It’s a workaround we can live with—for now. ## The Verdict: Was it Worth It? Looking back at this "Alpha" rollercoaster, you might think we regret the decision. On the contrary—despite the bumps in the road, the final outcome has brought plenty of value to our project. The initial struggle was a one-time cost that is now paying dividends in our daily development. By pushing through the configuration hell, we’ve gained several key advantages: - **Double Duty for Previews:** It has significantly boosted our motivation to create high-quality, comprehensive `@Preview` blocks. Since they now serve as the foundation for our screenshot tests, we’re essentially "killing two birds with one stone"—better documentation and automated testing in one go. - **Multi-Device Confidence:** We now have much greater peace of mind regarding UI consistency across different form factors. It’s easy to overlook a layout shift on a tablet when you're primarily developing on a phone, but the screenshot suite catches these regressions instantly. - **Faster, Fearless Refactoring:** We can now refactor core UI components or update our design system tokens with much less anxiety. If a change impacts 50 screens, we know exactly which ones—and by how many pixels—within minutes. - **Visual Documentation for the Team:** The generated reference images serve as an "as-built" documentation that anyone—from QA to Designers—can review to see the current state of the UI without even running the app. While the library is still in its early stages, the first-party integration feels like a solid long-term bet. If you can push through the initial setup friction, the boost in UI stability is well worth the effort. ## A Decade in Dev: Mikołaj on Lessons Learned, Ownership, and Tech Recruitment Path *Published: 2026-01-09 | Author: mikolaj-g | Tags: bright insights* *Source: https://brightinventions.pl/blog/decade-in-software-development/index.md* **Mikołaj is a senior fullstack developer with a career ten years in the making. In this interview, he opens up about lessons in self-care, why he looks for "ownership" when interviewing candidates, and whether the "dashboard" era of software might be coming to an end.**
![Career story fullstack developer](/images/brightstorymikolajgrid.png "Career story fullstack developer")
## Happy 10th anniversary in software development! Looking back, which sectors do you remember working in the most? Most of my memories are related to the public sector because **I worked for a long time with universities and public offices**. I felt I had a great deal of influence there, especially on end users and their experience. I also have a lot of memories connected to **working in e-commerce**; I was part of that industry when COVID struck and everything changed so fast. We had to adapt products to new realities overnight, just like many others. ## If you could go back in time, what would you say to yourself at the start of your career? I would say to **focus on taking care of myself**, not just my work ambitions. For years I took too much on my shoulders because of my willingness to learn, but at some point, it just wasn’t healthy. Another thing I’d say is to be wiser about which projects to get involved in, as I also did a lot of freelance work after hours. Actually, let me take that back – I think some things were just meant to be. **Even if some of my decisions were bad, they taught me many lessons**, so let’s scratch that second piece of advice! 🙂 ## You’ve been testing the OpenAI Apps SDK. What was your experience with it? Do you think we’ll be "chatting" with our apps soon? I tested it on a side project specifically built for trying out new solutions – an app for event management. It made it much easier to import participant lists and use the chat to invite them with emails built right there in the conversation. I specifically wanted to see if this truly has the potential to improve the user experience and provide real value, and I think it will work well for many apps. **If you’re already using ChatGPT, staying within the app to complete tasks is very convenient**.
![Quote on OpenAI Apps SDK](/images/mikolaj_quote_chatgpt.png "Quote on OpenAI Apps SDK")
It also gives digital products a chance to be discovered by entirely new groups of users. While it might not be for every app, **I can definitely see a future where we spend more time interacting with ChatGPT rather than clicking through traditional dashboards**. *Learn more on what [OpenAI’s new releases mean for digital products](https://framna.com/on-demand/the-next-platform-shift?ref=brightinventions).* ## It’s been a year since you joined Bright Inventions. How has the experience been so far? It’s been great. I’ve found exactly what I was looking for when I joined: **closer cooperation with partners, the opportunity to grow as a fullstack developer, and plenty of knowledge-sharing**. Bright Inventions gives me all of that. I also really enjoy working in smaller teams; I’ve had the chance to do that here, and I can truly feel that we are all working toward the same goal. ## You recently started a new role as a tech recruiter. How are you finding the start of this new career path? It’s been a surprising journey so far, in ways I never would have expected. It turns out that **time management is a crucial challenge and a skill I really need to build**. Not only do I have to manage the timing of candidates' responses, but also my own questions and the flow of the conversation in general. I have to touch on many different subjects regarding such a wide area of fullstack development; **I can’t just scratch the surface because I need to evaluate a candidate’s knowledge and approach**. However, these interviews can’t last forever, so finding that balance has been my biggest challenge so far. ## What do you expect from candidates? I’m looking for candidates who take ownership of the solutions they build – people who look at a product as a whole, not just from a coding perspective. **It’s not just about how to build a feature, but how it will influence the user.** I really appreciate it when a developer cares about the user experience.
![Quote on users](/images/mikolaj_quote_feature_user.png "Quote on users")
## And what about you? What do you expect from yourself as a recruiter? I expect to keep getting better at recruitment and developing my skills in that area, especially when it comes to **navigating the interview**. I also want to focus on **providing valuable feedback**. We provide initial feedback during the interview and then a more elaborate version afterward; I’m still working on perfecting that "on-the-spot" feedback during the conversation itself. ## What do you remember about your own job interview at Bright Inventions? It was actually **that interview that convinced me I wanted to join the team**. I was quite stressed at first because the interview was supposed to take 2.5 hours, which felt rather long, so I didn’t know what to expect. But once it started, the atmosphere was so kind that the stress just evaporated. We had this **inspiring discussion about technologies and programming approaches**. I also really **enjoyed the soft skills part of the interview**; we talked quite broadly about meaningful things including priorities at work, work-life balance and personal development, which gave me a great **teaser of the company's mindset and the people working here**. I felt I would fit there like a glove. But it wasn't all roses! **I remember being very tired afterward**, it was really a lot. That’s why I totally understand when people prefer to divide it into two separate interviews, which is also an option we offer. ## What are your travel plans for 2026? I’m going to Madeira in February. Aside from that, I have lots of ideas, but I try not to plan too far ahead. I also try to take weekend trips nearby. **We just went to Kashubia with friends for a digital detox** – no phones, no TV, nothing all weekend. We spent time close to nature, even having a campfire in December.
![Private archive](/images/mikolaj_photo_private.png "Private archive")
## How was the digital detox? We were in a big group, so there was a lot to do together. We’re also a very creative bunch of people, so we could easily come up with our own games and entertainment. What was interesting was **how often during conversations we felt the need to look something up online – to verify a fact or check something**. In the end, it gave us the reflection that maybe we don’t need to look up everything; it might not be that important after all. However, I think a weekend was enough, a full week would be too long! I actually missed a parcel from a courier during the trip, so let’s just say there were some consequences. But I must admit, **knowing that no one can call or disturb you really helps you relax fully**. ## Apart from traveling, what else do you do after hours? I recently **started a music production course**. It’s something I knew absolutely nothing about, so it’s interesting to dive into the unknown. It’s very exciting, although the downside is that it means spending even more hours in front of the computer. ## What kind of music do you want to create? Mostly electronic music, but I try to keep an open mind. I see interesting elements in other genres that I would love to implement in my own music. **I want to eventually figure out where the limits of my creativity lie**. ## 5 Trends in HealthTech to Watch in 2026 *Published: 2024-01-17 | Author: mateusz | Tags: HealthTech, AI* *Source: https://brightinventions.pl/blog/top-trends-in-healthtech/index.md* **Are we ready to book a doctor appointment via ChatGPT? Why should wellness become a priority for [healthcare software companies](/our-areas/healthcare-software-development/)? What trends will be shaping digital products in healthcare in 2026?**
![Tech trends in healthcare 2026](/images/healthtech_trends_blog_post_update.png "Tech trends in healthcare 2026")
## Managing health with ChatGPT In 2025, [OpenAI launched a new Apps SDK](https://openai.com/index/developers-can-now-submit-apps-to-chatgpt/) that allows developers to embed fully interactive third-party applications directly into the ChatGPT experience. At the beginning of 2026 **OpenAI introduced [ChatGPT Health](https://openai.com/index/introducing-chatgpt-health/) so healthcare and wellness apps can now also be a part of ChatGPT experience**. Now it allows to better understand medical data, fitness plans etc. but soon it might be much more - enabling for example to make a doctor appointment via Chat GPT. Instead of patients having to leave ChatGPT to visit a clinic website or use a separate scheduling app, healthcare services can now be integrated right into the conversational flow. **Patients can soon ask ChatGPT to help find doctors nearby, explore available appointment slots, and complete bookings – all without switching context or opening a separate app**. Naturally, scheduling a doctor’s appointment is only one example. It is up to digital product builders to critically assess whether their HealthTech applications truly deliver value to patients when embedded within OpenAI’s ecosystem. This validation should be a top priority for every healthcare technology builder in the coming weeks as conversational platforms increasingly shape how people access healthcare. [Learn what OpenAI update means for digital products](https://framna.com/on-demand/the-next-platform-shift?ref=brightinventions), including HealthTech. ## Wellness is growing driven by Millennials and Gen Z The wellness sector is growing, driven by younger generations who have made it a top priority. Notably, this segment of healthcare appears remarkably resilient; Millennials and Gen Z are unwilling to compromise on wellness even during financial disruptions. According to a [McKinsey](https://www.mckinsey.com/industries/consumer-packaged-goods/our-insights/future-of-wellness-trends) study:

Wellness is more important to consumers than ever

In the United States alone, we estimate that it represents more than \$500 billion in annual spend, growing at 4 to 5 percent each year. (Despite macroeconomic volatility through the first half of 2025, we believe the wellness category is resilient. Meanwhile, 84 percent of US consumers say wellness is a “top” or “important” priority (in the United Kingdom, that figure is 79 percent, while it soars to 94 percent in China).
McKinsey
![running wellness](/images/running-6252827_1280.jpg "Running")
## We still need to wait for a global breakthrough in AI for diagnostics Although in recent years, there was **widespread discussion about AI's potential in diagnostics**, actual implementations in this field remain limited, despite many companies actively working on it. We'll see if 2026 will bring a true breakthrough for companies working on diagnostics, with patients actively benefiting from AI-powered solutions. Here are examples of companies and organizations working on implementing AI in disease diagnostics that are worth watching in 2025: [SkinVision](https://www.skinvision.com/pl/), [iCAD](https://www.icadmed.com/), [Eyenuk](https://www.eyenuk.com/en/), [AinnovaTech](https://www.ainnovatech.com/), [Cleerly](https://cleerlyhealth.com/), [AI Dermatologist](https://ai-derm.com/). ## Chronic diseases will continue to drive the future of healthcare technology **Chronic diseases account for approximately 74% of all deaths globally** according to [WHO](https://www.who.int/news-room/fact-sheets/detail/noncommunicable-diseases). This includes **cardiovascular diseases**, which are the leading cause of death worldwide, responsible for about 17.9 million deaths annually, followed by **cancers** (9.3 million), **chronic respiratory diseases** (4.1 million), and **diabetes** (2.0 million). The significant issue that many health system providers must address is not only the rising number of patients with chronic diseases but also the fact that **these conditions are starting to affect people much earlier than in previous generations**. A notable example is [ulcerative colitis (UC)](https://www.yalemedicine.org/conditions/pediatric-ulcerative-colitis), a type of inflammatory bowel disease, that is increasingly being diagnosed in children and adolescents. While it traditionally affects individuals in their late 20s, recent trends indicate a rise in pediatric cases. In many cases, **chronic diseases are also considered invisible diseases**, as they often present **no visible symptoms in those suffering from them**. However, this does not mean that the people around us don’t require regular healthcare. In another article, we delved into the subject of [developing technology for patients with invisible diseases](https://brightinventions.pl/blog/technology-for-invisible-diseases/). ## Hybrid apps as investor magnets in the healthcare industry What lessons can healthcare startup founders take away from these challenging years? **If possible, start small, low-cost, and validate your idea quickly**. [Building an MVP](/our-areas/mvp-development/) is essential, but the choice of technology is just as critical. Hybrid technologies including React Native and Flutter, while not perfect, can be the best option for startups to validate their ideas and secure the funding necessary for scaling. However, it’s not a one-size-fits-all approach, and **not every startup founder should blindly follow this trend**. If you’re planning to build a complex solution that operates extensively in the background or relies heavily on Bluetooth communication, then native development is the only viable path. Also, **some MVPs simply cannot be low-cost** due to the complexity of the technology or the requirements of the healthcare domain. Additionally, many startups have to rely on bootstrapping or securing initial funding before they can even begin thinking about market validation. Hybryd app cannot be a investor-magnet in cases like that. Read our blog post to explore the [differences between native and hybrid app development](/blog/native-app-development-vs-cross-platform/). ## Feeling excited about any particular trend in healthcare software? These are top healthcare technology trends that might shape the future of HealthTech. 2026, we are ready for you! ## Top FemTech Conferences and Meetups 2026 *Published: 2024-04-05 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/femtech-conferences-meetups/index.md* **Are you looking for events focusing on technology for women's health? We’ve got you covered. Check out the exciting FemTech conferences and meetups that will take place in 2026.**
![FemTech conferences and meetups](../../static/images/meetup_femtech.png "FemTech conferences and meetups")
## Innovation in Women's Health and FemTech * **Date:** 27 February 2026 * **City:** London, UK * **Keynote speakers: Ida Tin (Co-founder of Clue), Valentina Milanova (Founder of Daye), Lawrence Tallon (CEO of MHRA).** * **Details: This high-level event brings together clinicians and tech founders to discuss the "changing paradigm of AI" in women's health. Expect deep dives into AI-powered ultrasound, the breast milk microbiome, and narrowing the health investment gap.** * **Link: [rsm.ac.uk](https://www.rsm.ac.uk/events/obstetrics-and-gynaecology/2025-26/ogu03/)** ## 3rd Global Conference on Women Health (FemTech World) * **Date: 9–10 July 2026** * **City: Frankfurt, Germany / Hybrid** * **Details: This hybrid event centers on "Innovation, Collaboration, and Education." It is a key date for policymakers and researchers to discuss global access to FemTech solutions and the latest in oncology and reproductive health.** * **Link: [femtechworld.co.uk](http://femtechworld.co.uk)** ## FemHealth Integrates 2025 **Date**: March 19, 2026 **City**: Manchester, the UK **Details**: FemHealth Integrates is a unique event addressing the gender gap in healthcare – both in health outcomes and within the health industry workforce **Link**: [lifescienceintegrates.com/event/](https://lifescienceintegrates.com/event/femhealth-integrates-2025/#venue) ## Top HealthTech Conferences in Europe to Attend in 2026 *Published: 2024-02-07 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/healthtech-conferences-europe/index.md* **Looking for on-site healthcare conferences to attend in 2026? We’ve got you covered. Check exciting health conferences that will take place in upcoming months in Europe.**
![health conferences 2025](/images/healthcare_conference.png "health conferences 2025")
## Radical Health Festival Helsinki & EHTEL Symposium * **Date:** 19–21 January 2026 * **City:** Helsinki, Finland * **Details:** Kick off the year in one of the world's most digitalized health ecosystems. This event brings together "bold thinkers" to discuss preventive care and the legislative future of health data in Europe. * **Link:** [radicalhealthfestival.messukeskus.com](https://radicalhealthfestival.messukeskus.com/) ## health.tech global summit * **Date: 3–5 March 2026** * **City: Basel, Switzerland** * **Ticket pricing:** From CHF 999 (Startups/Academia) to CHF 1,800 (General/Investors) - (Early bird) * **Number of attendees:** 5,000+ * **Keynote speakers:** Dr. Anthony Fauci (Former Director of NIAID), Tim Peake (Former ESA Astronaut), Hanna Boëthius (Founder, Hanna Diabetes Expert). * **Details:** Moving to the pharmaceutical hub of Basel for 2026, this summit is the premier meeting point for the "Pharma-meets-Tech" ecosystem, focusing on AI in drug discovery and personalized health. * **Link:** [health.tech](https://www.health.tech/) ## DMEA – Connecting Digital Health * **Date:** 21–23 April 2026 * **City:** Berlin, Germany * **Details:** Europe's largest event for health IT. If your focus is on hospital information systems (HIS), interoperability, or the "Smart Hospital," DMEA is an essential stop. * **Link:** [dmea.de](https://www.dmea.de/en/) ## The MedTech Forum 2026 * **Date:** 11–13 May 2026 * **City:** Stockholm, Sweden * **Details:** Organized by MedTech Europe, this is the region’s largest conference for the medical technology industry, emphasizing regulatory updates, MDR compliance, and market access. * **Link:** [medtecheurope.org](https://www.medtecheurope.org/) ## **HIMSS26 European Health Conference & Exhibition** * **Date:** 19–21 May 2026 * **City:** Copenhagen, Denmark * **Speakers**: Elena Bonfiglioli (Microsoft), Leila Taghizadeh (Allianz), Mark Davies (IBM) * **Details:** The "gold standard" of digital health. The 2026 European edition moves to Copenhagen to explore clinical decision support, nursing delivery models, and AI trust. * **Link:** [himss.org/event-himss-europe](https://www.google.com/search?q=https://www.himss.org/event-himss-europe) ## **HLTH Europe 2026** * **Date:** 15–18 June 2026 * **City:** Amsterdam, Netherlands * **Number of attendees:** 5,000+ * **Keynote speakers:** Alexandru-Florin Rogobete (Minister of Health Romania), Brenya Adjei (Managing Director, gematik), Björn Ekmehag (CEO, Skåne University Hospital) * **Details:** Known for its high-energy environment and festival-like atmosphere, HLTH Europe returns to Amsterdam to bridge the gap between global expertise and local European healthcare challenges. [Read our review of HLTH Europe 2024](/blog/hlth-amsterdam-2024-summary/). * **Link:** [europe.hlth.com](https://europe.hlth.com/) ## **International Conference on AI in Healthcare (AIiH 2026)** * **Date: 26–28 August 2026** * **City: London, UK** * **Keynote speakers:** Alex Frangi (University of Manchester), Mihaela van der Schaar (University of Cambridge), Michael Lones (Heriot-Watt University) * **Details:** A more academic-leaning conference for those looking to dive deep into medical data science and machine learning for diagnostics. * **Link: [aiih.cc](https://aiih.cc/)** ## **MEDICA** * **Date: 16–19 November 2026** * **City: Düsseldorf, Germany** * **Details: The world's largest medical trade fair. Its "Connected Healthcare Forum" is the place to be for hardware and software manufacturers looking for global distribution.** * **Link:** [medica-tradefair.com](http://medica-tradefair.com) ## **Digital Health World Congress 2026** * **Date:** 26–27 November 2026 * **City:** London, UK * **Ticket pricing:** Early Bird from £495 (plus VAT) to £2,250 full price. * **Number of attendees:** 200 * **Keynote speakers:** Paul Stevens (OMRON), Raj Modi (Oracle), Laura Rowlinson (NHS). * **Details:** A highly focused event looking at the future of IoT, genomics, and "Agentic AI" in the intelligent health system. * **Link:** [d](https://digitalhealthcareworldcongress.com/)[igitalhealthcareworldcongress.com](https://digitalhealthcareworldcongress.com/) ## Top Healthcare Podcasts to Listen to in 2026: Insights from the eHealth leaders *Published: 2024-09-18 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/top-healthcare-podcasts/index.md* **Podcasts have become a key source of knowledge and inspiration for professionals in the healthtech space. From keeping up with the latest trends to going deep into niche topics, healthtech podcasts offer valuable insights for anyone interested in the intersection of healthcare and technology. In conversations with healthtech leaders at the [HLTH Europe Conference in Amsterdam](https://europe.hlth.com/), several podcasts were mentioned as their go-to resources.** ## **Podcasts recommended by HealthTech Experts** During the conference, various experts shared their top picks for healthtech podcasts:
![Guy Siman on podcast Huberman Lab](/images/baner_guy_quote_podcast.png "Guy Siman on podcast Huberman Lab")
* [Hospitalogy](https://hospitalogy.com/) by Blake Madden and [Healthcare Huddle](https://www.healthcarehuddle.com/) by Jared Dashevsky were highly recommended by [Dr. Adam Brown](https://www.linkedin.com/in/adambrownmdmba/), an emergency physician and healthtech leader. He values these podcasts for their **comprehensive coverage of financials, market movements, and healthcare trends**. As he mentioned, “Encouraging business leaders to think empathically and recognize the health connections in their policies is key.” * [SomX Podcast by James Somauroo](https://www.jamessomauroo.com/) is a favorite of Claudia Pastides, Director of Medical Accuracy at [Flo Health.](https://flo.health/) She appreciates the podcast for its **insightful discussions on healthcare innovation**, where industry leaders go into the latest healthtech advancements and challenges.
![Claudia Pastides on Healthcare Podcasts](/images/baner_claudia_podcast.png "Claudia Pastides on Healthcare Podcasts")
* [MedTech Talks and Device Talks](https://medtechmvp.com/media/medtech-talk-podcast) were mentioned by Guy Siman, co-founder of [Sensars](https://www.sensars.com/), as top resources for those interested in the medical device sector. Both podcasts provide **valuable perspectives on new technologies, regulatory hurdles, and market dynamics within the medtech field.** * [A podcast led by Dr. Andrew Huberman](https://www.hubermanlab.com/) was also highlighted by Guy Siman for its focus in neuroscience, health, and wellness. It’s particularly **appreciated for its scientific approach** and practical health advice. ## Other must-listen HealthTech podcasts In addition to the expert-recommended podcasts, there are several others widely recognized for their insightful content and engaging discussions: * [Digital Health Today ](https://digitalhealthtoday.com/)features interviews with leaders and innovators in digital health, covering topics from **telehealth to AI and healthcare policy**. It’s a great resource for understanding the global digital health space. * [StartUp Health NOW](https://healthpodcastnetwork.com/show/startup-health-now-podcast/) shares conversations with entrepreneurs and thought leaders driving change in digital health. This podcast is known for its **focus on mission-driven startups** and their journeys to transform healthcare. * [Healthcare Rap](https://shiftforwardhealth.com/show/healthcare-rap/) offers a unique blend of healthcare marketing insights and digital innovation trends. It’s particularly engaging for those interested in **how digital health is transforming patient experiences** and healthcare delivery. * [Faces of Digital Health](https://www.facesofdigitalhealth.com/) explores global perspectives on **digital health innovation and implementation**, providing insights into how different countries are adopting digital health and the challenges they face. Tjasa Zajc, the podcast creator, brings a unique blend of IT industry knowledge and journalistic expertise.
![Tjasa Zajc](/images/1690350804443.jpeg "Tjasa Zajc")
*source: Tjasa Zajc LinkedIn profile* * [The #HCBiz Show](https://thehcbiz.com/)! Its about the business side of healthcare, discussing innovation, policy changes, and the impact of digital health tools. It’s ideal for **breaking down complex topics in an understandable way.** * [MedTech Talk Podcast](https://medtechmvp.com/media/medtech-talk-podcast) focuses on the **medtech industry**, covering topics like medical device startups, regulatory changes, and investment strategies. * [Data Book](https://podcasts.apple.com/us/podcast/data-book/id1365789336), produced by Inside Digital Health, centers around data analytics, health IT, cybersecurity, and **the role of big data in healthcare**. * [The Outcomes Rocket](https://outcomesrocket.health/) features interviews with healthcare leaders, innovators, and entrepreneurs, d**iscussing ways to improve healthcare outcomes and delivery**. * [Health Unchained](https://healthunchained.org/) focuses on **the intersection of blockchain and healthcare**, making it a must-listen for those interested in the future of decentralized healthcare systems. These podcasts cover a wide range of topics, from digital health innovations and healthcare policy to medtech advancements and data-driven healthcare. Whether you're a startup founder, healthcare provider, investor, or tech enthusiast, these podcasts provide valuable insights and perspectives to help go through the ever-evolving world of healthtech. ## How to Lose Respect and Fail as a Leader. 8 Things You Are Doing Wrong *Published: 2025-12-12 | Author: ula | Tags: leadership, teamwork, communication* *Source: https://brightinventions.pl/blog/how-to-lose-respect-and-fail-as-a-leader-8-things-you-are-doing-wrong/index.md* Leadership today is undergoing some transformation. The research in organisational psychology and management highlights a shift from traditional, top-down authority toward more dynamic, adaptive, and people-centric leadership models. According to [the studies by Harvard Business Review and McKinsey,](https://www.mckinsey.com/capabilities/people-and-organizational-performance/our-insights/psychological-safety-and-the-critical-role-of-leadership-development) modern leaders must navigate in the rapidly changing environments, foster psychological safety, and balance business objectives with employee well-being. Leaders are no longer just decision-makers, they are facilitators of collaboration, enablers of innovation, and architects of company culture. In the context of tech-driven industries, like in every other domains, **leadership requires not just technical expertise but also a deep understanding of human dynamics, team motivation, and continuous learning.** Everyone has different expectations of leaders and managers, and we know that some expectations are not easily to be fulfilled. Yet there are also certain behaviors and traits that universally undermine effective leadership. **So rather than discussing how to become a great leader or manager (there are thousands of articles on that) let us focus on something less explored - the best ways to become bad one. 😉** ## ⛔️ **Believing you are superior to everyone else** Believing you are superior to everyone else can be one of the biggest pitfalls in leadership. True leadership is not about positioning yourself above others, it is  about empowering those around you to thrive. **Effective leaders understand that their role is not to be the smartest or most skilled person in the room, but rather to create an environment where their team can perform at its best.**  As Simon Sinek puts it ***“The greatest contribution of a leader is to make others leaders.”*** The research on servant leadership show that leaders who focus on the growth and well-being of their teams foster higher engagement, satisfaction, and performance. Similarly, [a Harvard Business Review study found that humble leaders who acknowledge their team’s strengths and contributions tend to build more innovative and high-performing organizations](https://hbr.org/2025/01/research-humble-leaders-inspire-others-to-step-up).  Those who lead with humility, emotional intelligence, and a genuine desire to learn from others often drive the most sustainable success, which is not easy, and not for everyone.  ## ⛔️ **Knowing all the answers** Leadership is not about having all the answers even though I myself once used to think it is. In fact, it is about creating an environment where the best ideas can surface. The management expert Peter Drucker once said that *“The most important thing in communication is hearing what isn’t said.”.* **I would say that the most important thing in communication is active listening to others.** Ignoring team members' ideas and dismissing others' input alienates a team and stifles innovation. This highlights the need for leaders to go beyond their own opinions and truly engage with people in their teams. Leaders who listen effectively build trust and make better decisions. By embracing diverse perspectives, they not only avoid blind spots but also foster a culture where people feel valued and motivated to contribute. And let us face it -  there is almost always more than one answer to a question, and it does not have to be leader’s one. ## ⛔️ **Letting ego takes the credit** [Humility in leadership fosters stronger connections and mutual respect](https://brightinventions.pl/blog/h-factor-in-leadership-do-we-really-need-it/). **Leadership isn not about personal glory, it is about elevating the entire team**. When leaders take all the credit, they may (and often they will) demotivate their team. Bad leaders do not create an environment where success is shared, they do not recognise individual and collective achievements. They are not ensuring that every team member feels valued. **One day I realized that leadership is not about me - not about my title, my ego, or being in the spotlight. True leaders often work behind the scenes, creating space for others to shine.** Their impact is real, even if it goes unnoticed. Being a leader means letting go of personal recognition and focusing instead on enabling others to grow. It is about creating opportunities, removing obstacles, and quietly empowering those around you to succeed. ## ⛔️ **Spread negative vibe** This attitude can be incredibly damaging to both a team and your work environment. **When you focus on spreading negative energy, whether it is through frustration, gossip, or constant complaints, it creates a toxic atmosphere that drags everyone down.** People start feeling demotivated, stressed, and less willing to engage, and that is when productivity and creativity suffer. Energy is contagious. If you walk around the office (or hop on Google Meet) constantly pointing out what is wrong, you are not just venting, you are setting the tone. And trust me, it is not the tone of a winning team. It is the tone of eye rolls, silent meetings, and people updating their LinkedIn profiles at lunch. 😉 **Great leaders lift people up.** They do not ignore problems, but they help the team focus on solutions, keep conversations open, and support others in tackling challenges head-on. ## ⛔️ **Neglecting to give feedback** One of the fastest ways to fail as a leader is to skip giving feedback. Without it people are like sailors without a compass who are floating around, hoping they are on the right track. 🚢 **Feedback is not just "nice to have”, it is oxygen for growth**. [According to Gallup, employees who receive regular feedback are 3.6 times more likely to be engaged at work.](https://www.forbes.com/councils/forbeshumanresourcescouncil/2023/10/27/the-future-of-performance-getting-hooked-on-feedback/) No feedback? No growth. No direction. No results. And let us be honest - no one wants to be the captain of a ship that is slowly sinking just because we were too polite (or too scared) to say, "Hey, maybe turn left a little." ## ⛔️ **Playing the blame game** Sometimes I can see one pattern that always ends badly - when a leader cannot admit they made a mistake. It is not that they are bad people (I am quite sure about that), but most of them genuinely believed they were doing the right thing, yet when things went wrong  instead of saying “my bad” they pointed fingers. Nothing makes a team lose motivation faster than seeing their leader dodge responsibility. **Accountability is a foundation for trust. If a leader cannot say “I messed up,” how can they expect their team to be open, honest, and brave enough to take smart risks?** Owning mistakes does not make you look weak. It makes you look like a human being, and someone people actually may want to follow. ## ⛔️ **Holding on too tight** When you first step into a leadership role, it is tough to let go. It feels like handing over your baby to someone else and hoping they do not drop it. You may think: “No one can do it as well as I can.” or  “No one can do it as well and as fast as I can.” But here is the kicker - they usually can and even if they cannot, it is usually not a problem. At first it feels uncomfortable to share responsibilities, to delegate decisions, and to let others take the reins. It is the moment to have to admit that your way is not the only way. **But the secret is that the more you empower your team, the more they grow, and so do you.** **It is a win-win. The real challenge is not, however, letting go - it is realizing that doing so lets you do more of what you are really good at.** So, delegate smartly, trust your people, and watch everyone rise to the occasion. ## ⛔️ **Playing favorites** **Favoritism is not just a bad manager’s habit - I would say it is a culture killer.** It might begin subtly with assigning the most exciting tasks to the same person, overlooking small mistakes from one team member while holding others to a higher standard, or simply listening more attentively to those you personally connect with. You may not even notice you are doing it at first. But your team will. When people feel the playing field is not level, morale drops and collaboration suffers. Even the "favorite" may sometimes suffers when placed under a spotlight they did not ask for which results in being isolated from the rest of the team. Great leadership for me means fairness. **It means being aware of your own biases and making sure your behavior reflects your values, not your preferences. Everyone deserves to feel seen, heard, and given a fair chance to grow.** ## **What can you do if you recognise these traits in yourself?** There are two ways: ### 1. Step away from leadership – it is not the path for everyone, and that is completely fine. ### 2. Start working on yourself - begin addressing the habits or behaviours holding you back. You can’t see them, ask people you work them - they for sure can. Growth takes time, consistency, and effort. There are no shortcuts. Once I got a piece of advice that stuck with me: ***If you want to help others, start by helping yourself.*** In order to truly support, lead, or uplift others, you first need to be self-aware. **Clarity in yourself leads to clarity in relationships.** **When you understand your own patterns, triggers, and values, you lead with intention rather than impulse. It is a reminder that the path to serving others well begins with the courage to do the inner work first.** ## What Digital Product Passport Means for Global 2000 Manufacturers *Published: 2025-12-11 | Author: izabela | Tags: business strategy* *Source: https://brightinventions.pl/blog/digital-product-passport-manufacturers/index.md* **The European Union has shifted the burden of proof of sustainability from the marketing department to the IT department. Printing a green leaf on the packaging won’t be enough soon. You’ll need to prove it with data that every consumer will get access to. The regulation demands a Digital Product Passport (DPP) for nearly every physical good placed on the EU market.**
![Digital Product Passport - mockup example.](/images/gemini_generated_image_c361ryc361ryc361.png "Digital Product Passport - mockup example.")
AI-generated conceptual image.
## What is a Digital Product Passport (DPP)? A [Digital Product Passport (DPP)](https://data.europa.eu/en/news-events/news/eus-digital-product-passport-advancing-transparency-and-sustainability) is a digital record that acts as a "twin" to a physical product, securely accessible via a scan (QR code, NFC, or RFID). It shows product's entire lifecycle, including: * **Origin & Composition**: Where materials came from and what the product is made of (e.g., % of recycled content). * **Sustainability**: Carbon footprint and environmental impact. * **Circularity**: Instructions for repair, dismantling, and recycling. ## Digital product passport compliance deadlines If your deadline is 2027, you might already be behind schedule. | **Industry** | **Hard Compliance Deadline** | **The "Data Reality"** | | ------------------------ | ---------------------------- | ---------------------------------------------------------------------- | | **Batteries** | Feb 18, 2027 | Applies to all EV, LMT (e-bike), and industrial batteries >2kWh. | | **Textiles & Apparel** | Mid-2027 / 2028 | Requires item-level traceability (likely RFID) for millions of SKUs. | | **Iron & Steel** | 2027 | Tracking "scrap input" vs. "virgin ore" ratios across blast furnaces. | | **Aluminum** | ~2027 | Treated as a priority intermediate product alongside steel. | | **Tyres** | 2027 | Moving from a sticker label to a full digital lifecycle record. | | **Furniture** | 2028 / 2029 | Complicated by multi-material composition (wood, foam, metal, fabric). | | **Consumer Electronics** | 2029 | Focus on "Right to Repair" metrics and critical raw material recovery. | ## What you actually have to build You probably can’t just use a generic SaaS portal. Why? Because the data requirements for every industry vary and you need custom software that will answer to that. **Custom digital solutions don't just "generate a QR code”**, they dive deeper. Check some examples below. ### DPP for For Batteries **The challenge**: Dynamic health monitoring. **Required data**: * **Static**: Manufacturing date, chemistry type (Li-ion, LFP), and hazardous substances. * **Dynamic**: State of Health (SoH) data, expected cycle life, and "carbon footprint" calculated specifically for that manufacturing batch. **The dev angle**: You need an API that can pull real-time BMS (Battery Management System) data and serialize it into the passport. More information: [https://circulareconomy.europa.eu](https://circulareconomy.europa.eu/platform/sites/default/files/2024-03/1qp5rxiZ-CEPS-InDepthAnalysis-2024-05_Implementing-the-EU-digital-battery-passport.pdf) ### DPP for Textiles **The challenge**: Granularity. **Required data**: Fiber composition (e.g., 60% Recycled Polyester, 40% Virgin Cotton), country of origin for each weaving/stitching stage, and presence of microplastics. **The dev angle**: This is an RFID game. You cannot scan QR codes on 50,000 t-shirts manually. You need a solution that integrates with UHF RFID readers (like those from Zebra Technologies) to associate a unique digital ID with a physical garment in milliseconds. ## The "build vs. buy" reality check: Why enterprise needs custom architecture ### Reason 1: Adjusting to legacy code SaaS platforms assume a "clean" world. They are built for modern environments, expecting your data to be neatly organized in cloud-native systems accessible via standard RESTful APIs. **The reality**: Your enterprise data landscape is likely a stack built over decades. Are you juggling a 10-year-old warehouse system, a heavily customized on-premise ERP, and multiple siloed product lifecycle management (PLM) tools inherited from recent corporate acquisitions? **The problem**: Generic SaaS tools hit a wall when facing this complexity. They cannot natively interpret proprietary database schemas, heavily modified logic (like custom stored procedures), or the "dirty data" discrepancies between your US and European divisions (e.g., metric vs. imperial inconsistencies). If the SaaS connector expects Field A, but your system uses Custom Field B, the integration fails. **The custom solution**: A Bright Inventions we integrate your legacy or complex infrastructure with the modern web. We don't ask your systems to change, our goal is to maintain backward compatibility if needed. We extract, clean, and normalize the data before it ever hits the passport. This allows you to achieve EU compliance without triggering a multi-million dollar infrastructure overhaul. ### Reason 2: Less reliance on third-parties When you sign up for a SaaS DPP vendor, you are effectively uploading your entire supply chain map – your Tier 2 suppliers, your exact chemical formulations, and your pricing structures – into a third-party's cloud. **The risk**: You are renting your own data. If that vendor pivots, gets acquired by a competitor, or hikes their API pricing by 400%, you are held hostage. You cannot easily "export" a live, dynamic passport history to a new provider. **The custom solution**: By building a custom solution you retain 100% data sovereignty. You own the graph database. You own the API keys. You decide exactly what is public (compliance data) and what is private (IP/Formulations), with no risk of a vendor peeking into your trade secrets. ### Reason 3: Turning Compliance into Customer Experience (CX) A standard "compliance" passport is a boring static page that checks a box for the EU regulator. It is a cost center.
![Digital Product Passport - mockup example.](/images/gemini_generated_image_v3uox9v3uox9v3uo.png "Digital Product Passport - mockup example.")
AI-generated conceptual image.
**The opportunity**: A custom passport is a post-purchase engagement channel. **The custom solution**: Because we control the frontend experience (PWA or Native App), we can turn the "scan" into a revenue generator: **One-click resale**: "Scan your jacket's tag to list it on our second-hand marketplace instantly." **Predictive maintenance**: "Scan your e-bike battery to see its current health and book a service appointment." **Authentication**: Luxury brands can use the passport to prove provenance, killing the counterfeit market. **Loyalty**: "Scan your product to register the warranty and earn 500 points." **The verdict:** **Don't build a digital passport just to avoid a fine. Build a digital passport to own your data and own your customer.** ## Relying on the right hardware When it comes to supply chain visibility, Zebra Technologies is the undisputed global leader. From ruggedized mobile computers and barcode scanners to RFID readers and industrial printers, Zebra hardware powers the operations of the world’s largest manufacturers and logistics companies. However, hardware is only half the equation. **As [Zebra Registered ISV Partner](https://www.zebra.com/pl/pl/partners/partner-application-locator/partner-details.html?id=0016S00003NQa9WQAT&viewType=nav) we possess deep experience in building custom applications specifically for Zebra devices.** **Native optimization**: We build native solutions that fully leverage Zebra’s specialized scanning engines and rugged capabilities. **Workflow integration**: We understand the specific UX constraints of a factory worker wearing gloves or a logistics driver in the rain. We design interfaces that are fast, high-contrast, and error-proof. **Seamless connectivity**: We ensure that the data captured on the floor – whether via barcode or RFID –syncs instantly with your central middleware, ensuring your Digital Product Passport is updated in real-time. By combining Zebra’s world-class durability with our custom software logic, we bridge the gap between the physical product and its digital twin. ## Does your company need Digital Product Passport solution? Let's talk about your operational challenges. [Contact us](https://brightinventions.pl/start-project/) to book a meeting in 1 business day! ## Avoiding UX Traps: A Frontend Developer with a Passion for Product Design *Published: 2025-12-05 | Author: krystian | Tags: bright insights* *Source: https://brightinventions.pl/blog/frontend-developer-with-passion-for-product-design/index.md* **With nearly two decades of experience in software development, Krystian’s journey has taken him from early web builds to becoming a frontend specialist. In this interview, Krystian shares how he builds strong partnerships with product designers to create better user experiences, and shares his candid reasons why team leadership wasn't a career path he found utmost rewarding.**
![Frontend developer's career story](/images/brightstorykrystiangrid.png "Frontend developer's career story")
## Tell us more about the beginning of your career. My interest in web development started when I was a teenager, building my first HTML sites. It led me to **study Computer Science and Econometrics**. I landed my first commercial job at a small software development agency. They were developing their own **CMS and building sites** on top of it. That was over **17 years ago**. I stayed there for about two years before moving to an electronics distribution company. I started out with PHP there too, but eventually **pivoted to specializing in frontend** to support their e-commerce platform. We used Angular and had some legacy code, but for the new features, I was building in React. We also did a ton of SEO optimization. After a few years, I took on my first management responsibilities, though leadership itself wasn’t my main driver. **My biggest satisfaction came from working with product designers** because I already felt confident knowing a lot of UX traps that product teams can get themselves into, so I wanted to help avoid that.
![Quote on satisfaction](/images/krystian_quote_satisfaction.png "Quote on satisfaction")
## And how was this cooperation with product designers going? At first it wasn't easy because, in many situations, **a developer has a chance to contribute to the design when it’s quite late** – the design is done, the backlog is full, and here comes the frontend developer having some suggestions. This was especially hard when many people in the team already felt quite attached to the design. That was something that took time to develop – this relationship with designers and **including me, a developer, earlier in the process** with some feedback at brainstorming or mockup stages. We slowly moved to that, so I felt I could also contribute and there was no bad blood with the designers. ## You mentioned that the team leader role wasn't the most rewarding path for you. Why? Although I got pretty positive feedback from my team members, I’m truly not sure if I could be a good leader when challenges arise. I managed a really great team full of professionals eager to do the job well. But **what if I encountered a demotivated team?** I’m not sure if I would know how to handle that. I’m not comfortable giving corrective feedback. I am also not sure if I am assertive enough, or if I could handle conflict – I’d rather avoid it. So I guess I lack lots of traits that a leader should have. ## Leaders aren’t necessarily born with these traits. Maybe you could still improve in these areas? Maybe, yes. Naturally, there were areas of leadership I cherished, such as getting the chance to cooperate with other departments, and bringing different worlds together to build a digital product. Also, as I said, I really liked working with the team I had. I just think **I wasn't tested in harder scenarios** where I would need to step out of my comfort zone. ## What perspective can a frontend developer bring to product design? One example is that developers should remind the team that an **interface will be visible on very different devices, especially on mobile**. We should remember about protective zones for clickable elements. A frontend developer should always have in mind how each element will behave on mobile with small and bigger resolutions. From my experience, **people tend to treat design as something static**, but it changes according to devices, and that’s something a frontend developer should put stress on. Also, adding an extra voice to the conversation (like a developer’s) might help to sometimes go beyond the rules for the user's benefit.
![Quote on design](/images/krystian_quote_design.png "Quote on design")
## What do you mean by that? I once read about [Formula 1 teams helping to optimize the space in surgery rooms](https://surgery.international/f1-racing-on-track-to-help-surgical-teams/). When the driver goes into the pit bay, everyone from the team is placed for maximum optimization so the driver can leave as fast as possible. This precision is something of value for hospitals as well. I think that naturally, we should follow the rules, like we all know that a hamburger menu must be on mobile, and a shopping cart should have a cart icon and probably be on the right side of the page. But sometimes, **we still need to bend the rules, just like they started to challenge the status quo in that special hospital environment to make it more efficient**. For example, if we see from data that users are scrolling to a feature which is far down, or maybe they need to visit a few pages to get to it, maybe it’s a sign to put it high up on the homepage to make it more accessible. Even if this feature might not make sense on the homepage at first sight. If it gives value to users and is popular, we might as well go for it. **The hierarchy of information is one thing, but convenience is another**. Frontend developers can’t bring Formula 1 driver experience, but they can add a unique perspective to the table in product teams. ## How do you feel at Bright Inventions? I’ve had the chance to build quite a range of products, and right now I’m working on a solution for the tourism industry. Although the web is still closest to me, I learned React Native here, and **this flexibility regarding tools, product and responsibilities suits me**. I am particularly happy that my recent project just reached a stage close to my heart, where we are working on the user experience for the web solution. I love contributing to that, working side by side with the product designer. We are at a stage where **we work with mutual trust, sharing our ideas and suggestions**, and I love that I get to build relationships like this at Bright Inventions.
![At the Bright Inventions’ Gdansk office.](/images/krystian_pies.png "At the Bright Inventions’ Gdansk office.")
At the Bright Inventions’ Gdansk office.
## Did you enjoy our rainy sailing during the recent team retreat? Yes, very much. **I was actually hoping for a stronger wind** so it would toss the sailboats around more. You know, a little more endorphins wouldn’t hurt anyone and would definitely help us bond even more.
![Rainy sailing team retreat.](/images/krystian_sailing.png "Rainy sailing team retreat.")
Rainy sailing team retreat.
## But there was even a storm at some point? It wasn’t enough for you? I guess my expectations were even higher. 😁 ## Your First iOS CI Pipeline in Azure DevOps *Published: 2025-11-13 | Author: tomasz-l | Tags: iOS, Tools, CI/CD* *Source: https://brightinventions.pl/blog/first-ios-ci-in-azure-devops/index.md* **In this article I will guide you through creation of your first CI pipeline using Azure DevOps Platform.** Since I wrote my first test and run it on CI pipeline in one of my past projects I got hooked on the concept of Continuous Integration and Delivery (CI/CD). From that moment I tried to dip my fingers into sauce of automation whenever I could. Since then I have maintained and created many such CI/CD pipelines. Recently I got opportunity to prepare yet another one - this time in Azure DevOps and to my surprise it was really great experience. I will not go deeper into the details of scripting side to build and test your code. Instead you can checkout article series form my colleague Artur who does just that: - [Build and Run iOS App Tests Locally with Fastlane](/blog/building-running-ios-app-test-locally-fastlane/) - [Upload iOS App to TestFlight with GitHub Actions and Fastlane Match](/blog/ios-testflight-github-actions-fastlane-match/) - [Build and Run iOS App Tests with GitHub Actions](/blog/ios-build-run-tests-github-actions/) ## TL;DR Sorry, no sensible TL;DR today... You've come pretty far already though! If you are in a real rush however go and checkout [example CI pipeline](/blog/ai-agents-comparison-from-ios-dev-perspective/#summary). ## Yaml, yaml everywhere
![Yaml everywhere meme](/images/first-ios-ci-in-azure-devops/yaml-everywhere-meme.webp "Yaml everywhere meme")
Similarly to other CI/CD infrastructure providers like GitHub actions, Bitrise, TeamCity... Azure DevOps uses Yaml to define pipelines which creates our CI/CD setup. For creating such pipelines You may find [YAML schema reference for Azure Pipelines](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/?view=azure-pipelines) to be a very handy link. In contrast to GitHub Actions - You don't need to have pipeline present on default repository branch. You need to however define it in the Azure DevOps UI. If one wishes - pipeline can be also fully "clicked through" in UI using "classic editor" however it seems not to be recommended way. I also feel that most developers would still prefer better control over pipeline by creating and maintaining YAML files themselves (at least I do). ## Creating the pipeline As stated above - all pipelines in Azure DevOps needs to be defined in UI. We will do just that and end up with yaml starter we will later on modify so it becomes actual CI pipeline. Firstly go to Your Azure DevOps Project, then navigate to: **Pipelines -> Pipelines** and click on `New pipeline` button in the top right corner.
![Create new pipeline](/images/first-ios-ci-in-azure-devops/new-pipeline-create.webp "Create new pipeline")
On the next screen you will ve prompted to choose where your source code resides. This tutorial covers however only case for code hosted in Azure Repos so lets select this option. It is still possible to connect our pipeline with external sources like GitHub or BitBucket or any arbitrary Git repository as well as Subversion. You may be missing some features and conveniences though...
![Connect source for codebase](/images/first-ios-ci-in-azure-devops/new-pipeline-connect-source-host.webp "Connect source for codebase")
Now you have to select repository for which pipeline is being created. In my case this is repo for our iOS application.
![Select repository for pipeline](/images/first-ios-ci-in-azure-devops/new-pipeline-select-repo.webp "Select repository for pipeline")
I hope in previous step you have selected repository with iOS source code. If you did just that then you will be presented with customized options including template based on [Xcode v5 task](https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/xcode-v5?view=azure-pipelines). Personally I do not like such deep vendor lock-in but you can select it to see how it looks. We will modify this file later on nevertheless 😃
![Pipeline templates](/images/first-ios-ci-in-azure-devops/new-pipeline-template.webp "Pipeline templates")
Now important part! Before you save your pipeline please checkout its path and name. Not only is it vague with generic name `azure-pipelines.yml` but also resides in project root...
![This is fine meme](/images/first-ios-ci-in-azure-devops/it-is-fine-meme.webp "This is fine meme")
We are good developers, we like order and verbosity! Lets rename that fella and put it somewhere nice and cozy. You may already be familiar with dot directories convention like `.github`, `.vscode` or `.ssh`. Taking that as an example I have put all my pipelines and related "code" inside `.azure` folder which nicely separates vendor specific files in a single hidden directory. To achieve the same just click name of the pipeline and edit its name and path - folders will be created for us during save.
![Rename pipeline](/images/first-ios-ci-in-azure-devops/new-pipeline-rename.webp "Rename pipeline") ![Renamed pipeline](/images/first-ios-ci-in-azure-devops/new-pipeline-renamed.webp "Renamed pipeline")
Yes, now we finally save (you can either select Save and run or just save using option from dropdown). We are not done however!
![Save pipeline](/images/first-ios-ci-in-azure-devops/new-pipeline-save.webp "Save pipeline")
At this stage I will recommend you to create separate branch where you can work on actual pipeline implementation in your editor of choice.
![Save pipeline options](/images/first-ios-ci-in-azure-devops/new-pipeline-save-options.webp "Save pipeline options")
## Dial it in Depending on your initial selection you will have pipeline which is probably not fully functional yet. We need to work on actual YAML to make it work. Lets break down building blocks of such pipeline. ### Pipeline triggers In the example pipeline you can spot trigger keyword as the first element of the pipeline yaml definition. ```YAML trigger: - main ``` Such trigger will run our pipeline for push events happening on `main` branch. We can also specify triggering `paths` in the project, whether to `batch` runs and what `tags` should trigger a run. See [trigger definition](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/trigger?view=azure-pipelines) for more details on that. What is missing here however is pull request trigger. If you only want to trigger CI as part of pull request quality gate check and don't want it to run otherwise - you need to explicitly disable it. You can do that either with `none` option in each pipeline: ```YAML trigger: none ``` Alternatively you can `Disable implied YAML CI trigger` in your project settings (Azure DevOps -> Project Settings -> Pipelines -> Settings) or at organization level.
![Implied YAML trigger option](/images/first-ios-ci-in-azure-devops/implied-YAML-trigger.webp "Implied YAML trigger option")
### Runner environment Second item in template pipeline is agent `pool` which states where our pipeline will be run. If we choose to use [Microsoft hosted](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=windows-images%2Cyaml#software) agents we can choose from `windows`, `ubuntu` and `macOS` virtual machines. Since we are creating CI for iOS project there is no much choice: we need mac OS in order to build project with xcode(build). You can either specify specific OS version like `macOS-15` or `macOS-14` or go with default choice using `macOS-latest`. Keep in mind however that `macOS-latest` won't actually be latest version of mac OS operating system available on the market. Since we want to use microsoft hosted agents we will use `vmImage` option specifying VM version to run our pipeline. ```YAML pool: vmImage: "macOS-latest" ``` You can check [pool definition](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/pool?view=azure-pipelines) to learn about more details. ### Can we do something finally? Now is the main sauce of the pipeline: `steps`. Steps allow us to specify sequential operations that will be made on a single runner. Azure DevOps allows us to organize our pipelines into stages where each stage can contain multiple jobs and each job is build out of `steps`. Stages and jobs execute concurrently on separate runners whereas steps runs sequentially on a single runner. In this tutorial we won't be considering those higher levels of pipeline hierarchy and will focus solely on steps. You may read about those in future article 😉 There are multiple types of steps that we can perform. From perspective of iOS CI creation most important are: `checkout`, `task` and `script`. Other interesting type that may be useful but not described in this tutorial is `template`. You can read more about other available step types in [steps definition](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/steps?view=azure-pipelines). So first things first - we need to fetch our source code - as you can imagine we do so with `checkout` step: ```YAML steps: - checkout: self fetchDepth: 1 lfs: true ``` If not provided checkout will be performed implicitly with self parameter for all jobs besides `deployment` one. When we define pipeline with just steps we implicitly have single job and this job will implicitly run checkout for us if not defined. When we have access to the source code we can finally do something fun, here is where `task` and `script` comes into play. At this stage you might be interested in [Cache@2](https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/cache-v2?view=azure-pipelines) task that automatically saves and restores cache based on provided keys and paths. I have one for bundler: ```YAML parameters: - name: BUNDLER_PATH type: string default: vendor/bundle steps: - task: Cache@2 displayName: Cache Bundler gems inputs: key: 'bundler | "$(Agent.OS)" | "$(ImageVersion)" | Gemfile.lock' restoreKeys: | bundler | "$(Agent.OS)" | "$(ImageVersion)" bundler | "$(Agent.OS)" path: ${{ parameters.BUNDLER_PATH }} ``` In the snippet above I specify to cache files found in `vendor.bundle` folder which is same path I provide to bundler during install command. Later you can find key which consist of multiple elements: prefix (bundler) to distinguish it from other caches, OS version and runner image version explicitly specified as string and `Gemfile.lock`. Last part is the most important one. Specifying it like above is actually parsed as file path and that file is being hashed. If file changes then hash changes as well - that way we can tell if there is exact match for cached bundle or not. In case there is no exact match for cache found we use `restoreKeys` to find "nearest" cache best matching our current run. This is why we can provide multiple restoreKeys. If you are like me and like to hold control, then `scripts` will take us from here. With scripts you can do basically anything that can be done in commandline (keeping in mind lack of interactivity - you cannot type password on CI runner). We can for example add missing part to the Cache task above which is actually install bundle: ```YAML [...] steps: [...] - script: "bundle install --path ${{ parameters.BUNDLER_PATH }}" displayName: Install Bundler dependencies ``` If you use fastlane, you could run unit tests using `scan` command, it will be as simple as defining it as `steps.script` like one below: ```YAML [...] steps: [...] - script: fastlane scan displayName: Run unit tests with fastlane scan ``` ### Trigger CI run for PRs So we created pipeline from our building blocks - now how to run it on Pull Requests? And how to make it a mandatory check before merge is allowed? You guessed it - project settings 😅 Navigate to **Project Settings -> Repos -> Repositories -> your-repository -> Policies**, then select target branch for which you would like to apply branch policy (CI check for pull request). Typically it will be your default branch (eg `main` or `develop`). After selecting branch you will see branch specific settings - scroll to bottom and add new `Build Validation`. Here you can select pipeline together with additional on how it should be enforced.
![Build validation settings](/images/first-ios-ci-in-azure-devops/build-validation.webp "Build validation settings")
## Example CI pipeline Right now we have all we needed to create fully functional CI pipeline: - Defined pipeline in Azure DevOps - Created YAML definition for pipeline - Learn basic keywords to create CI pipeline in YAML Project I have worked on is using fastlane for automations (both CI and CD) which version is managed with bundler. Additionally it is using Cocoapods for dependency management (yeah, I know what year we have 🙈). Besides that I was still observing random slowdowns due to simulator bugs hence additional helper tools are being setup to combat that and speedup builds. Here is full pipeline: ```YAML trigger: none pool: vmImage: "macOS-15" parameters: - name: XCODE_VERSION type: string default: 26.1 - name: BUNDLER_PATH type: string default: vendor/bundle - name: KILL_APSD type: boolean default: true displayName: Kill apsd process steps: - script: sudo xcode-select -s /Applications/Xcode_${{ parameters.XCODE_VERSION }}.app displayName: Sets Xcode version to ${{ parameters.XCODE_VERSION }} - task: Cache@2 displayName: Cache Bundler gems inputs: key: 'bundler | "$(Agent.OS)" | "$(ImageVersion)" | Gemfile.lock' restoreKeys: | bundler | "$(Agent.OS)" | "$(ImageVersion)" bundler | "$(Agent.OS)" path: ${{ parameters.BUNDLER_PATH }} - script: "bundle install --path ${{ parameters.BUNDLER_PATH }}" displayName: Install Bundler dependencies - task: Cache@2 displayName: Cache Pods inputs: key: 'pods | "$(Agent.OS)" | "$(ImageVersion)" | "${{ parameters.XCODE_VERSION }}" | Podfile.lock' restoreKeys: | pods | "$(Agent.OS)" | "$(ImageVersion)" | "${{ parameters.XCODE_VERSION }}" pods | "$(Agent.OS)" | "$(ImageVersion)" pods | "$(Agent.OS)" path: "$(Build.SourcesDirectory)/Pods" - script: bundle exec pod install displayName: Install Cocoapods dependencies - script: | wget https://github.com/biscuitehh/yeetd/releases/download/1.0/yeetd-normal.pkg sudo installer -pkg yeetd-normal.pkg -target / defaults write dev.biscuit.yeetd killapsd ${{ parameters.KILL_APSD }} yeetd & displayName: Install and run Yeetd - script: bundle exec fastlane pr_check displayName: Build and run tests ``` And here is how I call such pipeline from within **Azure project -> Pipelines -> your-pipeline -> run**
![Run pipeline maually](/images/first-ios-ci-in-azure-devops/run-pipeline-manualy.webp "Run pipeline maually") ![Run pipeline maually options](/images/first-ios-ci-in-azure-devops/run-pipeline-manualy-config.webp "Run pipeline maually options")
## One more thing I lied... Snippet above is not my real pipeline file. Instead I went crazy with previously mentioned template and here is how it actually looks: ```YAML trigger: none pool: vmImage: "macOS-15" variables: - template: variables/xcode-version.yml steps: - template: templates/setup/project-steps.yml - template: templates/convenience/yeetd-step.yml - script: bundle exec fastlane pr_check displayName: Build and run tests ``` I will be sharing details on that as well as how to create CD pipeline in future article so stay tuned and experiment in the meantime. ## Final thoughts In the early days of my career I was having visceral thoughts about different infrastructure providers. Back in the day GitLab CI was my favorite and none other could come close. With time, experience and evolution of tools it faded away. I still had inner thoughts that Azure Devops may be rubbish yet I knew it is the best choice to stick with common approach in a bigger organization for which I prepared this setup. This does not necessarily mean that one should always use tools that particular organization use - it is always context dependent. In a small stable team it will be much more important for the team members to be familiar with tools they use. If developer experience is at proper level then satisfaction of work will be respectively higher as well. So yes - I liked it - it works just like any other CI/CD infrastructure. And it is deeply and neatly integrated in whole infrastructure we use for that project and it was incredibly simple to set up. Also I liked templating a lot, but more on that later... ## Why JS Math Doesn’t Math? *Published: 2025-11-13 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/why-js-math-does-not-math/index.md* **In this article, we’ll explore why JavaScript’s floating-point calculations behave the way they do, and what’s really going on under the hood.** This post has two parts. The first (this one) gives a high-level overview of floating-point arithmetic in JavaScript. The second dives into the low-level mechanics and calculations, so you can see exactly what happens behind the scenes.
![JavaScript math](/images/blogpost_blog_js_math_image.png "JavaScript math")
## Is JavaScript broken? You’ve probably heard people say that JavaScript is a “broken” language and sometimes it really seems that way. One of the most famous examples is how JavaScript handles floating-point arithmetic. Adding simple numbers can produce strange, unexpected results. It’s funny, but the truth is, this isn’t actually JavaScript’s fault. The behavior comes from the number system it’s built on - a specification shared across many programming languages. ## JS’s math don’t maths Let’s debunk a famous myth. Try adding 0.1 and 0.2 in JavaScript. You’d expect 0.3, right? Instead, you get `0.30000000000000004`. Even this simple calculation seems to confuse JS! *„JS floating-point numbers system is broken”* ## Counting in Binary At their core, computers only understand binary, a language of 0s and 1s. To perform calculations, we first need to represent our numbers in this form. If you’re not interested in the details of the conversion process (see the section below), here are the binary approximations for our example numbers: `0.1 - 0.0001 1001 1001 1001…` `0.2 - 0.0011 0011 0011 0011…` ### Bonus. How to convert decimal values into binary If you’re not into the technical details, you can skip this part—but it’s actually quite simple and can be useful. To convert a fraction to binary, all you need to do is multiply it by 2. If the result is greater than or equal to 1, you write a binary 1 for that step; otherwise, it’s 0. Then, if you wrote 1, subtract 1 from the result and repeat: 1. `0.1 * 2 = 0.2 → binary 0` 2. `0.2 * 2 = 0.4 → binary 0` 3. `0.4 * 2 = 0.8 → binary 0` 4. `0.8 * 2 = 1.6 → binary 1` 5. `(1.6 - 1) * 2 = 0.6 * 2 = 1.2 → binary 1` 6. `(1.2 - 1) * 2 = 0.2 * 2 = 0.4 → binary 0` 7. `0.4 * 2 = 0.8 → binary 0` 8. `0.8 * 2 = 1.6 → binary 1` 9. `…` As you can see, the process starts repeating the same numbers — and that’s totally normal. Later, I’ll explain how we handle numbers like this. By the way, you can also get the same result in JavaScript using:\ *(0.1).toString(2)* ### Infinitely repeating binary fractions Floating-point numbers like 0.1 and 0.2 are **infinitely repeating binary fractions**. What does that mean? When you try to convert 0.1 into binary, the digits enter an endless loop, they repeat forever. This proves that some decimal numbers simply cannot be represented exactly in binary. We can only store an approximation. So, how does JavaScript handle these numbers anyway? ## IEEE math JavaScript [uses](https://262.ecma-international.org/16.0/index.html?_gl=1*14nfdzv*_ga*MTM1MjExMjkxMC4xNzYwNjk4MDcy*_ga_TDCK4DWEPP*czE3NjA2OTgwNzEkbzEkZzEkdDE3NjA2OTgwOTgkajMzJGwwJGgw#sec-ecmascript-language-types-number-type) 64-bit double-precision floating-point numbers, following the IEEE 754 standard (first version defined in 1985). This standard isn’t unique to JavaScript, it’s also used in many other languages like Python, Kotlin, C#, and more. (Try the same calculation in one of those languages, you might be surprised by the results!) The IEEE 754 standard lets computers represent repeating decimal numbers, like 0.1 and 0.2, using finite binary approximations. But how does it actually do that? ### IEEE-754 binary format The IEEE-754 standard defines how computers handle decimal number calculations. It requires numbers to be converted into a specific binary-like format. Without diving into all the details (which I’ll cover in an upcoming post), the key point is that IEEE-754 uses a finite representation. This means it won’t exactly match the “ideal” binary results we saw earlier for 0.1 and 0.2. For example, the IEEE-754 values for our numbers are: `0.1 → 0 01111111011 1001100110011001100110011001100110011001100110011010 (in decimal: 0.100000001490116119384765625)` `0.2 → 0 01111111100 1001100110011001100110011001100110011001100110011010 (in decimal: 0.20000000298023223876953125)` Adding these two values gives: `0.100000001490116119384765625 + 0.20000000298023223876953125` And that’s why we get the “unexpected” result! If you’re curious about how these IEEE binaries are actually created, hang tight, I’ll go through the full process in the next post. For now, just trust these values. ## What's next Now you know why JavaScript sometimes “can’t math” and how floating-point numbers are stored behind the scenes. In the next post, we’ll dig deeper into the actual calculations and see exactly how these tiny rounding quirks happen. Stay tuned! Read more: 1. [To ‘b’ or Not to ‘b’: The Semantic Status of HTML ‘b’ Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) 3. [JavaScript Types De-Objectified](/blog/javascript-types-deobjectified/) 4. [Eye on ‘i’ — Understanding ‘i’ as a Semantic Element](/blog/understanding-i-as-semantic-element/) 5. [Breaking Down the “alt” Attribute Myth in img Tag Best Practices](/blog/breaking-down-alt-attribute/) 6. [The Truth About Keys and Re-Renders in React](/blog/keys-and-re-renders-in-react/) 7. [React Context and why not every child throws a re-render party](/blog/react-context-rerenders/) ## Using Transactional Analysis to Improve Feedback and Team Communication *Published: 2025-11-04 | Author: ula | Tags: communication, feedback, leadership* *Source: https://brightinventions.pl/blog/using-transactional-analysis-to-improve-feedback-and-team-communication/index.md* Providing effective feedback needs both skills and knowledge. While it may seem like just a conversation, the way we give and receive feedback often reflects deeper psychological patterns in communication. **Transactional Analysis (TA) is about understanding the dynamics between individuals by recognizing the roles we unconsciously adopt during conversations.** Developed by Dr. Eric Berne in the late 1950s, TA is a psychological theory and therapeutic approach centered on improving interpersonal communication and behavior. **Are we speaking from a place of authority? Engaging empathetically as equals? Or perhaps unconsciously slipping into defensive behavior? Recognizing these dynamics is crucial, especially in feedback scenarios.** In the context of feedback, these dynamics can determine whether our message fosters growth, creates friction, or misses the mark entirely. Transactional Analysis offers insights and tools to help us approach feedback conversations with clarity, confidence, and empathy. According to TA, people develop life scripts or unconscious life plans, which influence their behaviors and interactions throughout life. Understanding and altering these scripts can lead to healthier relationships and personal growth. ## **transactional analysis - ego states** **Transactional Analysis posits that individuals operate from three distinct ego states: Parent, Adult, and Child.** The Parent state is derived from external influences and authority figures (often your own parents), the Adult state processes information objectively and is focused on facts and the presence, and the Child state encompasses our internal feelings and experiences from childhood. Dr. Eric Berne identified them as following: **1. Parent** * **Critical Parent:** Behaviors, thoughts, and feelings that mimic those of our authority figures (parents, teachers) when we were young. This state can be controlling, judgmental, and critical. * **Nurturing Parent:** This aspect is caring, supportive, and protective, offering comfort and nurturing similar to a loving parent. **2. Adult** * This state is rational, objective, and data-driven. The Adult ego state processes information logically and responds to the "here and now" rather than being influenced by past experiences or emotions. It is the state that deals with reality and problem-solving. **3. Child** * **Natural Child:** This part is spontaneous, creative, and intuitive. It reflects our natural desires, emotions, and creativity. * **Adapted Child:** This reflects behaviors, thoughts, and feelings that have been adapted in response to the environment, such as compliance, rebellion, or submission, often shaped by early experiences and societal expectations. ## **imbalance and communication consequences** Each ego state serves a purpose, and a healthy balance between them is crucial for effective communication and relationships. When one dominates disproportionately, it can lead to various negative consequences, and undermines a productive dialogue. ### 🚨 Dominance of the Parent State When the Critical Parent dominates, communication can become either overly judgmental or condescending, discouraging others from sharing their views, or rigid, where ideas are dismissed without discussion, creating tension or resentment. On the other hand, if the nurturing parent dominate,  it may result in excessive caretaking, reducing accountability and autonomy in others. It may also encourage dependency, or undermine others' growth and problem-solving abilities. ### 🚨Dominance of the Child State If the Adapted Child dominates, communication might become submissive, with constant deferral to others' opinions. It may lead to avoidance of responsibility and inability to assert needs. If the Free Child dominates, interactions may seem impulsive, overly emotional, or detached from consequences. There’s a risk of appearing unreliable or failing to address serious matters effectively. ### 🚨 Dominance of the Adult State The Adult ego state is logical, rational, and fact-driven, focused on objective reality. However, even dominance here can have negative consequences such as overemphasis on logic leading to making communication feel cold or transactional, or ignoring emotions and intuition particularly in situations requiring sensitivity or creativity. **Effective communication and feedback requires fluidity, using the Parent for care or guidance, the Adult for rational problem-solving, and the Child for creativity and connection.** A lack of balance diminishes these possibilities, emphasizing the need for self-awareness and intentional shifts between states depending on the context. ## **TA’s life positions in feedback** In Transactional Analysis (TA), there is also a concept of life positions such as *"I’m OK, you’re OK”,* which profoundly affects how feedback is given, received, and processed. These positions represent our underlying attitudes towards ourselves and others in communication and relationships. Here's how they influence feedback dynamics: ### I’m OK 😊, You’re OK 😊 This position reflects mutual respect and self-worth, fostering constructive and growth-oriented feedback exchanges. Feedback is provided with empathy and clarity, focusing on behaviors rather than personal judgments. The giver assumes the receiver can learn, grow, and improve, encouraging engagement rather than defensiveness. The receiver sees feedback as an opportunity for growth rather than a personal attack. They acknowledge their value while appreciating the other's positive intentions, making it easier to process and act upon feedback. ### I’m OK 😊, You’re Not OK 😒 This position is critical and judgmental, often leading to feedback that feels harsh or condescending. The giver may come across as superior, focusing more on finding faults than offering solutions. This risks undermining the receiver’s confidence and fostering resentment or disengagement. If feedback aligns with this mindset, the receiver might resist it entirely, thinking, *“They just don’t understand me.”* Alternatively, it can lead to feelings of inadequacy and discouragement. ### I’m Not OK 😒 , You’re OK 😊 This position reflects self-doubt, often making feedback exchanges ineffective. The giver may downplay their feedback, lack confidence in their insights, or apologize unnecessarily. The message becomes diluted, leaving the receiver unclear about what to address or change. Feedback is seen as validation of self-doubt, reinforcing insecurity or passivity. The receiver might avoid acting on feedback, thinking they lack the ability to improve. ### I’m Not OK 😒, You’re Not OK 😒 This position is deeply pessimistic and often results in ineffective or negative communication. Feedback may seem hopeless or cynical, framed as, *“Nothing ever changes anyway.”* The giver may project their frustrations, leaving the receiver feeling attacked or unmotivated. The receiver might dismiss the feedback entirely, believing nothing they do will ever be good enough. This leads to disengagement and a lack of improvement. **The *“I’m OK, you’re OK”* position enables productive, respectful, and empowering feedback exchanges. It creates an environment of trust and mutual understanding, where both parties feel valued and are open to growth. By maintaining this position, we frame feedback as a dialogue rather than a confrontation.** It helps bridge gaps, encouraging positive outcomes and long-term improvements for individuals and teams alike. ## **how to make the most of TA in feedback processing** Transactional Analysis aims to help individuals gain insights into their behaviors and interactions, enabling them to improve communication, resolve conflicts, and enhance personal and professional relationships. You can effectively integrate it into your feedback process. Whether It is identifying emotional triggers, adjusting your communication style, or steering the conversation towards solutions, below I am including some tips that may help you handle feedback moments with confidence and clarity. ### 🧠 identify your own ego state Start with self-awareness and before giving feedback, ensure you are communicating from an Adult state - calm, composed, and logical. This sets the tone for constructive dialogue. The fact-based communication helps you avoid emotional reactions or judgment. ### 🧠 avoid communication in Critical Parent and Adapted Child dynamics These can lead to defensiveness and resistance from the recipient. **Example:** Instead of saying, *"You never finish your tasks on time."* (Critical Parent - Adapted Child), reframe to: *"I noticed the last three projects were completed after the deadline. What can we do to improve planning?"* (Adult - Adult). Avoid authoritative commands or condescension (Critical Parent). Use neutral, respectful language to maintain balance. ### 🧠 try to analyse the recipient’s ego state Assess (keeping in mind you might still misread their state) if they are in Parent, Adult, or Child mode. If they show emotional defensiveness (Child), show support through Nurturing Parent communication, but transition back to an Adult-Adult dialogue to address the issue. **Example:** **Nurturing Parent:** *"I understand how frustrating it can be when deadlines feel overwhelming. Let’s figure out a way to prevent this."* **Adult:** *"What actions can we take to better manage our time?"* ### 🧠 invite collaboration Use questions like, *“How do you think we can improve this?”* or *“What resources might help?”.* This approach reflects the life position *“I’m OK, you’re OK”* by signaling mutual respect and equality in the conversation. **It fosters an Adult-Adult exchange, emphasizing that both parties are capable, responsible, and committed to finding constructive solutions together.** This life position builds trust and empowers the recipient to take ownership of the next steps. ### 🧠  provide support but encourage autonomy If emotions surface, show understanding, but guide the conversation toward actionable solutions rather than dwelling on frustrations. For example, *“I understand this situation has been challenging, and it’s completely valid to feel that way.”* This reflects the *“I’m OK, you’re OK”* life position, reinforcing that their feelings are acknowledged without judgment. However, it’s essential to guide the conversation toward actionable solutions to maintain progress and focus. For instance, you might say, *“Let’s think about what steps we can take to move forward and address this effectively.”* ### **summary**  By consciously applying Transactional Analysis (TA), feedback can become a healthy routine in the workplace. Feedback delivered through the lens of TA doesn’t just help address performance or behavior, it builds trust, enhances relationships, and fosters personal growth. TA creates an environment where feedback is not feared but welcomed as an opportunity to learn and evolve. **Eric Berne once said that *“the destiny of every human being is decided by what goes on inside his skull when confronted with what goes on outside his skull.”* Through TA, we can better understand these inner dialogues, enabling feedback to be not just a critique but an empowering catalyst for change.** #### Transactional Analysis is a fascinating and complex framework, and this article only touches the surface. If something here sparked your curiosity, take it as a sign to dig deeper. It’s definitely worth it. ❤️ ## Got a ConnectivityException Crash? Read How to Solve It *Published: 2025-10-17 | Author: szymek | Tags: Android, WorkManager* *Source: https://brightinventions.pl/blog/android-connectivity-exception-too-many-requests/index.md* **Have you seen the `ConnectivityException$TooManyRequests` exception in your Crashlytics dashboard? Perhaps you have noticed `WorkManager` as well? Don’t throw any stones yet! It might be something else that is causing it.**
![ConnectivityException in Android](/images/android-connectivity-exception-too-many-requests.jpg "ConnectivityException in Android")
## Why is it crashing? Android has implemented a protective measure against memory leaks that can occur when registering too many network callbacks using `ConnectivityManager.registerNetworkCallback` [method](https://developer.android.com/reference/android/net/ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,%20android.net.ConnectivityManager.NetworkCallback)). Android's `ConnectivityManager` imposes a limit on network callback registrations. Attempting to register more than 100 network callbacks will result in a `ConnectivityException$TooManyRequests` error, [as detailed in the official documentation](https://developer.android.com/reference/android/net/ConnectivityManager#registerBestMatchingNetworkCallback(android.net.NetworkRequest,%20android.net.ConnectivityManager.NetworkCallback,%20android.os.Handler)). For instance, continuously registering callbacks without proper deregistration will lead to an application crash. You can try that with the following code placed e.g. in your `MainActivity.onCreate` method. ```kotlin repeat(100) { connectivityManager.registerNetworkCallback(...) } ``` ## WorkManager callback registration When you create a `WorkRequest` with an online network constraint, it can register a network callback. However, registering 100 separate `WorkRequest` instances doesn't necessarily mean 100 network callbacks will be registered. The new _2.10.1_ version has reduced the likelihood of this occurring (see [changelog](https://developer.android.com/jetpack/androidx/releases/work#2.10.1) and the [change itself](https://android-review.googlesource.com/c/platform/frameworks/support/+/3588735)). ## Is WorkManager the one to blame? While `WorkManager` `WorkRequest` instances can indeed register network callbacks and potentially contribute to `ConnectivityException$TooManyRequests` crashes, it's not always the sole or primary cause. It's crucial to consider that other parts of your application, or even third-party libraries, might be registering network callbacks. If these other sources are poorly managed, perhaps repeatedly registering callbacks without proper deregistration and then simply catching any resulting exceptions (including `ConnectivityException$TooManyRequests`), they could silently accumulate `NetworkCallback`s up to the system's 100-limit. In such a scenario, when `WorkManager` attempts to schedule a new `WorkRequest` with an online network constraint, its subsequent registration of a network callback would then trigger the `ConnectivityException$TooManyRequests` exception, as WorkManager in some versions does not implement a try-catch mechanism around this specific callback registration ([see explanation why here](https://issuetracker.google.com/issues/231499040#comment23)). This makes it appear as though `WorkManager` is the culprit, when in reality, the issue might lie with other components consuming the available callback slots. ## What can be an alternative cause of the ConnectivityException$TooManyRequests? Since it's not a `WorkManager`, we need to identify what's registering the other 99 network callbacks. You can directly search your code for network callback registrations, which might reveal the root cause. However, even if you find it, an additional verification step is recommended: examine heap dumps. Interact with your app thoroughly - navigate every screen, use all features, and repeat this process with network (Wi-Fi, cellular data, etc.) both on and off. Afterward, create a heap dump using [Android Profiler](https://developer.android.com/studio/profile). Once you create a heap dump, search for `NetworkCallback`, then try to find references to your code or external libraries you use.
![ConnectivityException Profiler](/images/android-connectivity-exception-too-many-requests-profiler.png "ConnectivityException Profiler")
In our case, the external Chat library we use was registering those callbacks using Coil when trying to load a lot of chat messages containing offline images queued to be sent. **What was it in your case?** ## AI Agents Comparison from iOS Developer Perspective *Published: 2025-10-16 | Author: tomasz-l | Tags: iOS, AI, Tools* *Source: https://brightinventions.pl/blog/ai-agents-comparison-from-ios-dev-perspective/index.md* GitHub Copilot was one of the earliest LLM powered tools helping developers with their everyday chores. It was also quite early to support Xcode (first by third party and later by first party plugins). Due to that and few other factors (copilot being endorsed in one of my projects as well as having educational license for it) I ended up using it in my AI supercharged coding endeavour. In iOS development I was mostly using Copilot in autocomplete mode and never really dove deep into agentic coding with it. ## TL;DR GitHub copilot ended up being the worst across all agents. Claude Code may be easy default choice for Apple developer. You can go directly to [summary](/blog/ai-agents-comparison-from-ios-dev-perspective/#summary) to see what I have chosen for myself. ## Moar AI
![Moar AI meme](/images/ai-agents-comparison-from-ios-dev-perspective/Moar-AI-meme.webp "Moar AI meme")
Recently I got to work in few projects requiring technologies new for me and I started experimenting a bit more with Copilot in `agent` mode. Based on approach it was typically hit and miss. I have learned a bit about how to work with agents and notice improvement when using separate steps: 1. Prepare requirements documentation 1. Work on feature based on prepared documentation 1. Reset context when wonky things start occurring Nevertheless it still didn't felt right. In all cases at some point it was really hard to force Copilot agent to do what I expected it to do. Kind of like it was rebelling against me 😅 ### Even moar AI
![Can I has Moar AI meme](/images/ai-agents-comparison-from-ios-dev-perspective/Can-I-has-more-AI-meme.webp "Can I has Moar AI meme")
Having seen many success stories of agentic coding both in and out of Bright Inventions I wanted to go deeper and understand what I am doing wrong. I have started looking into different sources to learn and later enrolled into course ([10xDevs.pl](https://www.10xdevs.pl)). It inspired me to do the basic stuff actually: test what different tools give me and how those behave in the field. Idea was simple: test out as many different tools as possible, see if any works better than currently used Copilot and adopt it if that is the case. ## Benchmark While I was considering testing different tools I have stumbled on quite simple bug in one of the projects I worked on. For very specific response in login flow (401) user ends up with endless spinner and blocked app UI. Quite simple thing, but finding root case required a bit of debugging and especially time (~10-15 minutes). I though this might be really good starting point for comparison and that is what I used for a benchmark. For evaluation I decided to use IDE and CLI tools: - GitHub Copilot (Agent mode in VS Code with Claude Sonnet 4.5) [Educational license] - Xcode 26 Coding Assistant (GPT-5) [Pro subscription] - Cursor (Agent in auto mode) [Free trial] - Windsurf (Code mode with GPT-5 low reasoning) [Free trial] - Gemini CLI (Gemini 2.5 Pro) [Free plan] - Claude Code (Claude Sonnet 4.5) [Pro subscription] - Codex (GPT-5 codex) [Pro subscription] For GitHub Copilot I have chosen Claude Sonnet 4.5 as it felt the best for me in prior usage. Rest of the agents were using stock settings (model/mode mentioned above) as far as I am concerned. Each of the agent was presented with exact same prompt: ``` This is iOS app using cocoapods for dependency management and xcworkspace. It is quite simple but I have a bug with it. When I try to login button shows loading animation and then nothing happens. Analyse app and logging flow to help me identifying login issue. ``` Even though I already knew what was broken and how to fix it during conversations (if any was needed) I pretended to have no idea what is going on. Also I will be looking at few key metrics: Speed; Correctness; Regressions. Expectations: - Root cause - not calling completion callback in case of 401 - being found - Handle potential issue in both request flows implemented in affected class - Fix made in a generic way, not tied to specific issue I have stumbled upon - No regressions introduced - Potential side effects explained ### Copilot In the first pass I was greeted with potential root cause which was obviously incorrect. There were two solutions proposed to fix the issue. Agent was hinting that completion callback was never called, however targeted wrong level of abstraction - not the one were actual issue occurred. I have asked agent to implement its proposed solution adn as expected it was not correct. After actual testing (just to be sure) I have explained that issue still occurs. This time copilot agent proposed additional fixes and logging which were both incorrect (fixes did not fixed issue and logs did not highlighted root cause). After few additional rounds of back and forth with agent and hints that we might be looking at wrong place we ended up finding actual root cause. In the end issue itself got fixed but in a way that was well below acceptable quality (fix applied at generic layer using very path of endpoint for which issue occurred). Besides that quite significant regression was introduced: previous 401 handling was completely removed. - **Speed: 2/5** Felt slower than most of other agents, not unbearably slow though. Total score additionally lowered however due too amount of back and forth needed. - **Accuracy: 1/5** Low quality solution, lots of hints and back and forth needed. Only one of the request paths was covered with changes. - **Regression: 3/5** App uses Alamofire and one of the changes was to remove `validate()` call from commonly used request path. Change seemed unrelated and it was not explained to why it was made. ### Xcode Coding Assistant I have initially tried running test without paid subscription, but I have ended up with exhausted quota warning before prompt was fully processed. I have switched to my Pro subscription afterwards and it moved forward quite well. Xcode Coding Assistant have identified actual root cause in first pass, proposing solution which seemed sensible to me. After asking it to implement its recommended solution it went off rails pretty quickly. Firstly it started with `wrong level of abstraction` issue where it referenced path of request which caused issue - this seems to be becoming a common thread between agents 😅 I have tried working with agent trying to suggest that there might be better solution which will stick to separation of concerns in different layers. Second iteration introduced lots of unnecessary code which was quite confusing. In the end I have directly asked for solution I expected and it tidied code quite nicely. - **Speed: 3/5** Coding agent seemed to be responding the slowest from the bunch per prompt. - **Accuracy: 4/5** Even though it required little bit of back and forth issue was fixed correctly and for both theoretical paths. - **Regression: 4/5** No meaningful regression introduced, not explained however potential side effects of adding completion callback where it was previously missing. ### Cursor Cursor was the first agent I have actually tried and it blown me off completely. Not only was it super fast, but it found the root cause first try not issues. At that point I knew I was probably missing out. One thing to notice is that I have asked to `Analyse` the problem, yet cursor went ahead and implemented solution right away 🙉 - **Speed: 5/5** Really can;t get better than that. Prompt was processed very fast and no back and forth required at all. - **Accuracy: 5/5** It knew exactly what I wanted ;) - **Regression: 4/5** I would expect little bit of explanation, that adding callback for 401 case in generic network layer may introduce unexpected behaviors which might need to be handled. ### Windsurf Windsurf was second agent I have tried and again - result was quite shocking to me... Root cause was identified immediately. It has however manifested `low effort` approach found in some other cases trying to reference endpoint path for which issue occurred. When I suggested this might be a code smell I got presented with few alternative propositions one of which was the expected one. Unfortunately there was regression introduced upon actual implementation: previous 401 handling was completely removed. After additional back and forth and going circles we have reached expected solution. - **Speed: 3.5/5** Root cause found immediately, lost some points due to issues during actual implementation. - **Accuracy: 4/5** End result was proper solution but it required trained eye along the way 😉 - **Regression: 3/5** Even though it was fixed - complete removal of 401 was quite significant regression. ### Gemini CLI Similarly to Cursor Gemini CLI was really fast and spot on - with one caveat - it only handled one of the two paths exhibiting same potential issue. - **Speed: 5/5** Again - as fast as possible. - **Accuracy: 4/5** Missed to handle second path potentially exhibiting same issue, however actual fix was spot on. - **Regression: 4/5** Once more - missed explanation of possible side effects of implemented solution. ### Claude Code Encounter with Claude Code was little bit strange, as I was testing subsequent agents I was leaving their solutions on separate branches - it may have caused glitch I have experienced. Ofc root cause was identified immediately, yet later on Claude mention it is actually fixed. When pushing on it a bit it has explained that in fact issue still occurs but there is fix for it in other branches. Seems it knew how to fix the issue in expected way, however I have asked it to copy the fix over. It has used solution previously done with Xcode Code assistant which in the end was spot on. - **Speed: 4.5/5** It was on pair with other `fast` agents, however `glitch` made the whole process a little bit longer. - **Accuracy: 5/5** Chosen best possible solutions from branches available - it may actually surfaced superpower of looking more holistically at repo? - **Regression: 4/5** As in other cases explanation of potential side effects was missing. ### Codex Last but not least: Codex from OpenAI. It seemed to be up to the task similarly to other CLIs. Only difference is that it seemed little bit slower. Nevertheless it found and solved issue first try. - **Speed: 4/5** Some minus points for slower inference as compared to other agents. - **Accuracy: 5/5** Again - spot on solution! - **Regression: 3/5** Once more - missing side effects explanation. ### Summary For me there are few main takeaways from this test: - There are much better tools available as compared to GitHub Copilot - Actual model used is not the most important part - see that Claude Sonnet 4.5 was used by both Copilot and Claude Code with drastically different outcomes... - Most of the tools are offering quite similar quality - at least in this test In addition to that we must consider which flow is more convenient for us. IDE integration (Copilot, Cursor, Windsurf, Xcode) is very convenient. I do however prefer CLI at this point. This is mainly because I dislike Copilot after this benchmark and don't feel like using VSCode clones. Xcode on the other hand - which seems to be perfect solution - still might be a work in progress feature. It was significantly slower and in some additional (out of scope) testing it have managed to crash itself (complete lack of responsiveness from Xcode)... Experience working in Xcode is already bad (who have not experienced crashes, beach balls etc) so I don't want to make it even worse 🥹 It is also worth mentioning that most of those tools require paid subscription. Both Cursor and Windsurf offers free trials though. You can also use Gemini CLI for free. At least not by paying with money - you will pay with your data however. And Google does not want you to know that - going into `/privacy` ends up with `Error loading Opt-in settings: User does not have a current tier`... You can check out this [GitHub issue](https://github.com/google-gemini/gemini-cli/issues/2407) for more details. ## Conclusions Even though some parts of this post (especially ones connected to Copilot) may seem pessimistic I believe all agents brought real value for me as a developer in that particular example. Even with Copilot I would save some time - not by it doing the job, but hinting me in the right direction. This is pretty amazing how far we have come! Copilot example left me with one additional thought (which can escape in those more successful scenarios): > Human brain is still the most amazing machine that ever existed - let's not forget that! Even though we are gifted with all those amazing (AI) tools - we should still remember to train our most important (from devs perspective) muscle - our brain. We are still in control and AI agent is there to help us do the things we might now want to do, not the other way around. For now I will most probably explore Claude Code a bit more - I have also heard from multiple sources already that Claude Code works quite nicely for iOS development. It also got bonus points for having theme that suits my auto light/dark theme lifestyle. I do miss however option in any of the CLIs to have dynamic theme based on system theme. I also encourage You to test different tools for yourself. ## From Concrete Profession to Flexible Code. A Mobile Developer's Career Story *Published: 2025-10-13 | Author: mateuszg | Tags: bright insights* *Source: https://brightinventions.pl/blog/mobile-developer-career-story/index.md* **From delivering precast concrete elements for one of the longest tunnels in Poland to programming, Mateusz's career journey has been full of changes. He especially embraces shifts in technologies, viewing tools not as goals, but as a means to an end. Learn how flexibility has elevated his career and what has been his goal all along.**
![Mobile developer's career story](/images/brightstorymateuszggrid.png "Mobile developer's career story")
## What was your journey towards software programming? It was a long and bumpy one, I guess. I actually studied **civil engineering**, and at the time, my only real connection to programming was that my brother is a programmer. When I graduated, I started working as a quality controller at a factory producing precast elements for a very interesting project – **one of the longest tunnels in Poland**. I also began to learn how to code in my spare time. During my studies, I saw that more and more of my peers were deciding to switch to software development, and I also had a friend who was trying to convince me to do the same. Learning after hours wasn't easy while working in construction, because a shift could last up to 12 hours. After a day like that, it was tough to find time for family and studying. But, I managed to learn **web development fundamentals**. ## But you eventually became an Android developer? Yes, but that was **totally by accident**. I decided to sign up for a bootcamp and simply chose the one that was scheduled to start the soonest. It just so happened that it was a course on Android development. After finishing the bootcamp, I quickly found my first job in the field and was able to leave the construction industry for good.
![Mateusz's career story](/images/brightstorymateuszg.png "Mateusz's career story")
## Was it a difficult goodbye to construction? No, not at all. That industry really wore me out, but at the same time, it gave me the **motivation I needed to change** my career path. I didn't find the work very rewarding, especially after all the sleepless nights I spent studying in college. Also, **it's not nearly as flexible as the tech industry**, and it's much harder to learn on your own. As a programmer, I can build an app in my spare time to test new solutions. I can't exactly go and build a house on my own just to learn something new. ## What has your experience been like working at Bright Inventions? I really enjoy working here, especially because of the very flexible approach, which gives me **lots of opportunities to learn**. For example, I joined as an Android Developer, but soon after I started, I was put on a project where Flutter was needed. That was quite exciting for me because I'd never done cross-platform development before. ## I imagine some developers wouldn't be happy with such a sudden change of technology. What are your thoughts on that? Probably, yes. **I don't consider myself a typical software developer**, given my different educational and professional background. I'm sure there are people who are much more knowledgeable when it comes to native Android development. For me, **I just love solving problems**, it doesn't matter what the tool is. If I can learn a new one to get the job done, that’s even better. If I were told that I needed to learn backend development to solve a problem, I would gladly do it.
![Quote on solving problems](/images/mateusz_quote_tools.png "Quote on solving problems")
## How does the business domain of our partners affect the code you write? I don't think the business domain itself is the main factor. The most important thing is the **business value we need to deliver**. That value depends on many aspects – not just the domain, but also the partner's immediate business goals, their current challenges, and user feedback. **Business value is our compass**. It points us toward the goal, and a developer's job is to find the most effective way to provide that value.
![Quote on business value](/images/mateusz_quote_business_value.png "Quote on business value")
For example, let's say we need to add an important feature that users are expecting quickly, but we face technical limitations that prevent us from writing 'perfect' code (for instance, a backend system that constrains our mobile development). In that case, it’s all about finding a middle ground. We need to **find a way to deliver the value** now without complicating our work in the future. Code doesn't need to be perfect or beautiful, as long as it won't slow us down later or significantly increase our technical debt. The key, however, is **keeping the partner in the loop**. They need to understand that we are choosing a pragmatic solution to deliver the feature as soon as possible, and that a refactor might be needed in the future to implement it according to all best practices. If we take too much time to deliver a perfectly implemented feature, our competition could already be gaining users with their own **imperfect, but earlier-launched, feature**. ## What’s the key to successful communication with partners and colleagues? I believe the key is **honest and direct communication**. I value receiving and giving clear feedback, though of course, it's important to find the right balance to ensure that directness is always constructive. When collaborating with partners, I especially appreciate having close and transparent communication. It's crucial that the partner keeps our team in the loop with their business goals and domain challenges. **When we have that context, I can truly adjust my work** to meet their real needs. Otherwise, it can feel like we're just completing tickets without understanding how our work actually influences their business. Ultimately, it’s much better to have direct contact with the partner to discuss what they want to achieve before a ticket is even created. It sometimes turns out that a proposed task isn't what the partner truly needs in the end. Great communication helps everyone **avoid unnecessary assignments**, which, as we know, saves a significant amount of time and resources. ## What do you enjoy doing after work? My free time is dedicated to my children. We try to **be active together**, often going cycling or hiking when we can. After the kids are asleep, I sometimes find a bit of time to play video games.
![Visiting Plitvice Lakes National Park in Croatia.](/images/mateusz_travelling.png "Visiting Plitvice Lakes National Park in Croatia.")
## So you often ride a bike? Yes, definitely. Whenever I can, **I choose my bike over the car to commute**. The nature of our work requires a lot of sitting, and the last thing I want to do after hours is sit even more in a car stuck in traffic. That's where the bike really comes in handy.
![Mateusz during one of many bike rides.](/images/mateusz_bike.png "Mateusz during one of many bike rides.")
## Negativity Bias: Why Your Glass at Work Is Always Half-Empty *Published: 2025-10-07 | Author: ula | Tags: leadership, communication, business psychology* *Source: https://brightinventions.pl/blog/negativity-bias-why-your-glass-at-work-is-always-half-empty/index.md* You know that feeling when you have done a lot right, but all you can think about is the one thing that went wrong? Maybe a presentation went well, a teammate appreciated your help and yet your mind keeps replaying that tiny mistake from three days ago. Our brains are wired to notice problems first. It helped our ancestors survive. But at work, it can quietly sap motivation, trust, and teamwork. The good news? Once we catch ourselves, we can start noticing wins, learning from mistakes, and slowly build a healthier, more balanced way to tackle each day. ## one negative comment ruining the whole day We have all been there. Someone gives us five compliments and one criticism, and somehow, we only remember the criticism. It is not just you, it is how our brains work. **The human brain is built to spot risks and threats. In prehistoric times this helped keep us safe. At work it means we notice what is broken more than what is working.** [On a biological level, negative events trigger stronger and faster activity in the amygdala, the brain’s “alarm center.”](https://pmc.ncbi.nlm.nih.gov/articles/PMC8102621/?utm_source=chatgpt.com) They also release more cortisol, the stress hormone, which makes the memory stick longer and feel heavier. Positive experiences, on the other hand, need to be consciously repeated or savored for the brain to register them with the same intensity. ## always chasing what is wrong Negativity bias often shows up as focusing on fears, anxieties, or small mistakes while overlooking the dozens of things that go right. You notice gaps instead of progress, your glass always feels half-empty. Sometimes it is a colleague who always sees the worst-case scenario: * “This change will never work.” * “They are going to fire her.” * “This will fail for sure.” * “They’ll cheat us somehow.” * "He will never accept my offer." * "I won't get this promotion." etc. Even when results are positive, their focus is on what could go wrong next. Negativity spreads like ripples in a pond. Other team members may start feeling drained, and creativity and collaboration shrink. **Striving for improvement, being aware of potential risks and considering different scenarios is important, it helps you stay prepared and make better decisions. But when the focus is always on what could go wrong or what is missing, constant negativity can quietly shape the morale of everyone around you.** ## the complaining trap We all do it - complain about the weather, traffic, work, or that one person who never replies to emails. Complaining feels good in the moment as it is a quick way to vent frustration and connect with others over shared annoyances. But it is also one of the most common expressions of negativity bias. **When we complain, we reinforce neural pathways that favour negative thinking, making it easier to notice problems and harder to appreciate positives.** The more we complain, the more our brains get used to spotting what is wrong instead of what is right. While venting can provide momentary relief, habitual complaining trains the brain to expect disappointment and perceive the world through a critical lens. **Neuroscientist Dr. Rick Hanson explains that the brain is [“like Velcro for the negative and Teflon for the positive"](https://rickhanson.com/velcro-for-the-bad-teflon-for-the-good/), meaning negative experiences stick more easily and shape our mental wiring.**  [](https://rickhanson.com/velcro-for-the-bad-teflon-for-the-good/?utm_source=chatgpt.com) Over time, this can amplify stress, strain relationships, and create a feedback loop where negativity becomes our default mode of interpretation. Recognizing when we are complaining and consciously [shifting toward problem-solving ](https://brightinventions.pl/blog/how-to-develop-solution-oriented-mindset-in-your-life-and-in-your-team/)or gratitude helps to weaken this bias and restore emotional balance. ## shifting the balance: small steps to break the bias **Even tiny habits can help your brain notice the positive.** Jot a quick gratitude note, celebrate a small win, or give yourself a pat on the back. These simple actions send signals that your brain actually wires in. Neuroscience shows that doing this strengthens the areas that regulate emotions while calming the “alarm center” that tends to fixate on problems. [The study shows that higher levels of gratitude are linked to greater resilience, better mental health, and fewer symptoms of anxiety and depression.](https://positivepsychology.com/neuroscience-of-gratitude/) ### So, how can you rewire your brain for positivity? 1. Write down things you are thankful for. [It activates brain regions associated with reward, enhancing feelings of contentment and emotional well-being.](https://positivepsychology.com/neuroscience-of-gratitude/?utm_source=chatgpt.com) 2. Recognize and celebrate small achievements to boost motivation and reinforce positive behavior. 3. Be kind to yourself during challenging times. It will reduce stress and promote emotional resilience. 4. Practise mindfulness to increase awareness of the present moment, reduce anxiety and improve emotional regulation. 5. Express gratitude to others regularly to strengthen relationships and enhance feelings of social support. ## start small, think big By consistently practicing small habits (you have to choose/find these that work for you), you can shift your focus from what is wrong to what is right, fostering a more positive and resilient approach. **The mindset you bring to work does not just shape your own motivation - it quietly influences the energy, confidence, and collaboration of everyone around you.** At the end of the day, the choice is yours: let your brain replay only the setbacks and risks, or remind yourself of the effort, learning, and wins along the way. ## Join CocoaHeads Tricity in October *Published: 2025-09-25 | Author: izabela | Tags: bright insights* *Source: https://brightinventions.pl/blog/cocoaheads-tricity-32/index.md* **CocoaHeads Tricity is back! Sign up for a free event celebrating all things iOS! Listen to talks about AI-Powered iOS Coding and SwiftUI Coordinators. See you in Gdańsk on October 6.**
![CocoaHeads Tricity 32](/images/cocoaheads-32-6th-october-2025.png "CocoaHeads Tricity 32")
## Expect talks from experience iOS developers Connect with fellow iOS developers, share ideas, enjoy food, and listen to inspiring talks: **From Melody to Symphony: Coordinators in the World of SwiftUI. Moving beyond declarative navigation toward structure at scale,** Kamil Buczel (Senior iOS developer at Tilt) SwiftUI’s NavigationStack makes navigation clean and declarative - perfect for small, fresh apps. But real-world projects rarely live in a purely SwiftUI world: UIKit still plays a key role for complex layouts, transitions, and data-heavy screens. This talk shows how to move from declarative navigation to structured, testable flows using the MVVM+C pattern and Coordinators, bridging SwiftUI with UIKit when needed. You’ll learn how coordinators bring clarity, memory safety, and explicit contracts to navigation, helping your app scale with confidence. **Vibe it and Ship it – Agentic Coding in Practice**, Łukasz Domaradzki (Senior iOS Developer at XTB) From idea to App Store publication – all with the help of AI agents. During the presentation, Łukasz will talk about how he used Claude Code to write mobile code, detailing what worked great and what the biggest challenges were. Using the Frettier app as an example, he will share lessons learned that can be useful for any developer experimenting with AI. ## Get to know our speakers **Kamil Buczel, Senior iOS developer at Tilt** Building iOS apps in Swift since 2014, across industries ranging from art auctions and food ordering to airline systems and live fashion marketplaces. He has worked as both a solo developer shaping entire products and as part of large teams delivering complex, multi-module architectures. What drives him is finding the right path to solutions - asking questions, exploring perspectives, and ensuring quality serves real needs rather than existing for its own sake.
![Kamil Buczel, Senior iOS developer at Tilt](/images/cocoaheads-32-kamil-buczel.png "Kamil Buczel, Senior iOS developer at Tilt")
**Łukasz Domaradzki, Senior iOS Developer at XTB** He is an experienced iOS developer who has been creating mobile apps for many years. He has worked on solutions for the aviation industry and is currently developing a fintech application at XTB. He is also interested in the new possibilities that AI brings to the mobile space.
![Łukasz Domaradzki, Senior iOS Developer at XTB](/images/cocoaheads-32-łukasz-domaradzki.png "Łukasz Domaradzki, Senior iOS Developer at XTB")
## Claim your spot **When**: Monday, October 6, 2025, at 6:00 PM **Where**: Incubator STARTER, Lęborska 3b, Gdańsk **Register**: Claim your spot on [Meetup](https://www.meetup.com/cocoaheads-tricity/events/311048704/?eventOrigin=group_events_list)! See you there for great insights and even better pizza! ## Integrating Firebase into Tuist Project *Published: 2025-09-18 | Author: tomasz-l | Tags: iOS, Tuist, Firebase* *Source: https://brightinventions.pl/blog/integrating-firebase-into-tuist-project/index.md* Firebase is one of the most commonly used third-party library in iOS development. With functionalities ranging from Crashlytics, to analytics, feature flags... there is too much stuff to list all of it 😅 Today we will be focusing on integrating Firebase Crashlytics into our iOS app, with one caveat: it uses Tuist. Lo and behold, we might run into some strange behaviors! ## TL;DR For pure and suggested tuist integration code jump straight to [Tuist "native" integration](/blog/integrating-firebase-into-tuist-project/#tuist-native-integration). ## But wait, why Tuist? If you ever worked in team, you might have faced conflicts in your Xcode projects. This is main idea from which Tuist originated. There is nothing original about that idea and many before did similar things. You may recal dedicated tools like xcode-gen but most probably you might be even using one right now: Cocoapods. Yeah if you think about that it generates project as well 🙉 Thing that made Tuist interesting to me in the first place was that it is using `Swift` making it very familiar to developers in Apple ecosystem. Right now Tuist is a very powerful tool that not only allows you to omit frustration fighting with project settings and conflicts (and random changes), but also optimise and bring your development to the next level. Enough for now, that is mostly all that we need for now to continue. Nevertheless I highly encourage you to have a deeper look into [Tuist](https://tuist.dev) - thing you will not regret doing. ## Why Crashlytics? Answer here is simple: Crashlytics is battle tested tool that allows you to control your app stability. It is free as well. And as we all know free is fair price to pay. You might stick to plain Xcode organiser insights or different tool, yet today is a day of Crashlytics. ## But there is more than one... 🧐 ...way of integrating third parties using Tuist. Indeed Tuist allows us to integrate third parties using its own system based on XcodeProj but there is second option too. One can integrate third party dependencies using plain Xcode SPM integration. ### Tuist project Lets start with Tuist project structure. For detailed working code you can reference this demonstration repository: [tuist-firebase](https://github.com/TomaszLizer/tuist-firebase). At this stage we assume you have working Tuist project, but if not you can use reference above or create one with `tuist init` (and instal tuist with `brew install tuist` if you don't have it already). In order to enter project edit mode you need to run `tuist edit` command in project root. This will create and open Xcode project with three main files: - Tuist.swift - it holds details of Tuist project itself - Project.swfit - this is definition of what previously was our .xcodeproj file - all in Swift! - Tuist/Package.swift - Package definition used for managing dependencies Today we will be touching `Project.swift` as well as `Package.swift`. ### Xcode SPM path Lets start with straightforward way - one that will be very familiar if you worked with SPM in Xcode before. In the beginning lets just start adding our dependency. 1. Add Firebase as a remote package in `Project.swift`: ```swift // Project.swift Project( [...] packages: [ .remote(url: "https://github.com/firebase/firebase-ios-sdk", requirement: .exact("12.3.0")) ] ) ``` 1. Add the required Firebase products to your app target dependencies, e.g.: ```swift // Project.swift Project( [...] targets: [ .target( [...] dependencies: [ .package(product: "FirebaseCrashlytics") ] ) ] ) ``` It might be confusing that we are defining this dependency in `Project.swift` and not in `Package.swift` but remember - `Project.swift` is descriptor of our `.xcodeproj`. So we included our dependency - now lets use it. Before we move forward you will also need to get your hands on `GoogleService-Info.plist` file. You can find it in your Firebase project settings. 3. Ensure dSYM files are being created by specifying correct debug information format: ```swift // Project.swift let baseSettings = SettingsDictionary() .debugInformationFormat(.dwarfWithDsym) let projectSettings = Settings.settings(base: baseSettings) let project = Project( name: "tuist-firebase", settings: projectSettings, [...] ) ``` This is crucial part without which we won't be able to read crash data in Crashlytics console. 1. Add post-build script uploads dSYM files to Crashlytics automatically: ```swift // Project.swift Project( [...] targets: [ .target( [...] scripts: [ .post( script: """ ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run """, name: "Upload Symbols to Crashlytics", inputPaths: [ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", ] ) ] ) ] ) ``` Note: script path will be different when using XcodeProj integration. 1. Place your `GoogleService-Info.plist` in `tuist-firebase/Resources` so it is bundled with the app. 1. Setup Firebase in your application. As a last step we need to con figure firebase itself inside the app ```swift // AppMain.swift import Firebase [...] FirebaseApp.configure() ``` Now lets run `tuist generate` and see what happens. You should be greeted with similar view: Xcode project like any other one you know and Firebase dependencies resolving with SPM. Don't get attached too much to that - we will be getting rid of plain SPM integration later on.
![tuist generate script execution](/images/integrating-firebase-into-tuist-project/tuist-generate.webp "tuist generate script execution")
![Project structure with SPM integration](/images/integrating-firebase-into-tuist-project/tuist-xcode-spm.webp "Project structure with SPM integration")
### Test your integration! As we will uncover later on - this is extremely important part - we need to test that our integration works correctly. This can be as simple as adding fatalError somewhere in our app. I typically just add some button that does just that. It is worth noting, that while app is connected to debugger, firebase will not collect crash data. You need to install your shiny app and disconnect debugger (just kill the run with stop button in xcode). Then in order for the crash to be visible in the Firebase console, we need to run the app again - it will process and send crash reports. If everything is fine you should see your first crash pretty quick (typically up to few minutes). ### Tuist "native" integration So what is wrong with our SPM integrated firebase? Well, everything... If you worked with SPM you may recall constant and somehow random reloading of dependencies. It is guaranteed to happen just after your transatlantic plane took off. And when you have quite a few dependencies in SPM (see how much we got just by getting Firebase) then it can get wonky as well. Tuist takes Cocoapods approach which gives us many benefits. Instead of relying on SPM it creates workspace with child projects. This allows for lots of clever things that Tuist does, including caching, dependency graph based testing, optimised builds. But again, just go and check out [Tuist.dev](https://tuist.dev) as there is too much of goodness there to even brief it meaningfully in this short article. If you had peeked at attached repo, you might noticed that not much changed for this migration to happen, but lets wrap it up as if we just started. 1. Add Firebase as a remote package in `Package.swift`: ```swift // Package.swift Package( [...] dependencies: [ .package(url: "https://github.com/firebase/firebase-ios-sdk", exact: "12.3.0") ] ) ``` 1. Add the required Firebase products to your app target dependencies in `Project.swift`: ```swift // Project.swift Project( [...] targets: [ .target( [...] dependencies: [ .external(name: "FirebaseCrashlytics") ] ) ] ) ``` 1. Ensure correct build settings, including dSYM creation and linking Objective-C code: ```swift // Project.swift let baseSettings = SettingsDictionary() .debugInformationFormat(.dwarfWithDsym) .otherLinkerFlags(["-ObjC"]) let projectSettings = Settings.settings(base: baseSettings) let project = Project( name: "tuist-firebase", settings: projectSettings, [...] ``` In addition to dSYM creation we added `-ObjC` linker flag - it is crucial here, but more on that later. 1. Add post-build script uploads dSYM files to Crashlytics automatically: ```swift // Project.swift Project( targets: [ .target( [...] scripts: [ .post( script: """ Tuist/.build/checkouts/firebase-ios-sdk/Crashlytics/run """, name: "Upload Symbols to Crashlytics", inputPaths: [ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", ] ) ] ) ] ) ``` The only thing that changed here is path to script - it is obviously different due to different way of integrating SDK. 1. Place your `GoogleService-Info.plist` in `tuist-firebase/Resources` so it is bundled with the app. 1. Setup Firebase in your application. ```swift // MainApp.swift import Firebase [...] FirebaseApp.configure() ``` After migration to "proper" way of handling dependencies with Tuist we need to make one more step before `tuist generate`. Similarly to good old Cocoapods we have `tuist install`. It will fetch our dependencies, convert to projects and integrate into our main project using `xcworkspace` with child projects.
![tuist install script execution](/images/integrating-firebase-into-tuist-project/tuist-install.webp "tuist install script execution")
![Project structure with XcodeProj integration](/images/integrating-firebase-into-tuist-project/tuist-xcodeproj.webp "Project structure with XcodeProj integration")
### What the fuss with ObjC This is where funny things happens. In one of our projects we have stumbled once on a very strange issue upon migration to Tuist. Crash reports stopped working. Debugging started - firstly lets add firebase debug flag. You can do that by adding `-FIRDebugEnabled` launch argument. To do that in Tuist we have to define scheme. We do so in `Project.swift` at the top level of Project definition: ```swift // Project.swift Project( [...] schemes: [ .scheme( name: "Tuist-Firebase-Debug", buildAction: .buildAction(targets: [.target("tuist-firebase")]), runAction: .runAction( configuration: .debug, arguments: .arguments( launchArguments: [.launchArgument(name: "-FIRDebugEnabled", isEnabled: true)] ) ), ), ] ) ``` This gives us ability to see rich logging from Firebase, including Crashlytics. Keen observer might quickly notice this log: ```lldb 12.3.0 - [FirebaseCrashlytics][I-CLS000000] Completed report submission with id: [...] ``` Hence crash report was generated and seemingly sent, but why cannot I see that in Firebase console? So we dove deeper, stepping into execution of crash report submission. Searching for `Completed report submission with id` moves us to `FIRCLSReportUploader.m:216`. After adding breakpoint I can see that indeed we stepped here and sent something somewhere. But where? Lets check function that calls callback we are in, which is `-[GDTCORTransport sendDataEvent:onComplete:]` in `GDTCORTransport.m:56`. It in turn points us to `-[GDTCORTransformer transformEvent:withTransformers:onComplete:]` in `GDTCORTransformer.m:55` and that is the place for our next breakpoint to understand what is happening. > You can *Open quickly* (⌘+⇧+o) above file references in xcode. Just copy, paste into open quickly and go to check it yourself. And then comes the realization - breakpoint is not resolving - this symbol is unknown to compiler - something is very wrong here.
![Xcode unresolved breakpoint](/images/integrating-firebase-into-tuist-project/xcode-unresolved-breakpoint.webp "Xcode unresolved breakpoint")
Turns out we had a bug in our project definition, linker flags in particular. Instead of `-ObjC` we have accidentally put `-Objc`.
![why Objc meme](/images/integrating-firebase-into-tuist-project/why-Objc-meme.webp "why Objc meme")
Quick fix, one liner, or in this case: **one character** and we are golden 🙈 ## Conclusions As we learned, one need to be extremely careful with the details when it comes to Xcode project settings. It is worth noting that in this particular case the issue was very subtle and almost unnoticeable. App was not crashing it just misbehaved (greatly). This comes from specific nature of Objective-C which is dynamic. Especially in how it treats missing objects. In our case bunch of Crahslytics related dependencies where not compiled into our app because linker did not saw their usage. **If you'd like to dive deeper into Objective-C and why the `-ObjC` linker flag matters so much, you can start with the [Building Objective-C static libraries with categories](https://developer.apple.com/library/archive/qa/qa1490/_index.html).** This particular requirement is also documented in Firebase: [Integrate without using Swift Package Manager - Frameworks](https://firebase.google.com/docs/ios/setup#frameworks). One thing to note here is that applying this flag has global effect on your project. It may cause compiled binary to be larger in some circumstances. If you face such issue you may want to integrate via SPM or consider force loading only specific Objective-C library, but that is topic for another day. ## Understanding the Bigger Picture in Programming. Patryk’s Career Journey *Published: 2025-09-09 | Author: patryk-s | Tags: bright insights* *Source: https://brightinventions.pl/blog/bigger-picture-backend-developer-career-story/index.md* **Patryk shares his biggest challenges in software development, why he needs to understand the big picture before writing any line of code, and what helps him reset after work. Meet Patryk, a Senior Backend Developer at Bright Inventions.**
![Backend developer career story](/images/brightstorypatryks_grid.png "Backend developer career story")
## Even as a child, you were interested in programming but you chose civil engineering in college. Why? Honestly, I don’t really know – I guess **I was a bit naive**. I didn’t think it through; I just thought civil engineering sounded cool. But later I realized it wasn’t for me. I dropped out in my third year and switched to computer science, though I never actually graduated. ## What has been your biggest challenge so far in your career? Interestingly, technical challenges don’t really stick out, I feel like every tech problem has a solution. For me, **communication is tougher** – even within the team, just dealing with frictions or misunderstandings can be way more challenging. ## What is a bad code in your opinion? The code that is **not understandable** while reading and **impossible to change**. ## How can you fix that? Well, there are many books covering that subject so there’s no single answer. Maybe **being open is a good start**. You should think about how the code might be used in the future, and remember that it will probably be modified. Be open to any possibility, and don’t focus only on completing the actual task. Our work goes beyond that, or at least it should, if we want to write clean code.
![Quote on clean code.](/images/patryk_quote_clean_code.png "Quote on clean code.")
## But what if you need to quickly deliver results – for example, for a startup that needs a feature added fast? You can balance that. For sure, clients can push us and it doesn’t always have to be about profit. **We have been working on an [app for a humanitarian agency](/projects/card-tracking-system/) for years, and sometimes we need to quickly add a feature because people are starving**. Therefore the organization needs a way to provide them with payment cards so they can buy groceries and other necessities for themselves and their families. We can’t just say, “Wait, we need to write clean code first, people can wait.” But it all comes down to communication – we explain to the client that we need to do it fast, with some shortcuts, but after it’s launched we need a sprint to rewrite it, because otherwise it will be bug-prone. Clients are usually on board with that, **it’s our job to make them aware that we can cut corners, but then we need to make up for it**. ## How do you use AI in your daily work? I use **ChatGPT, Cursor, Junie, and Assistant** on a daily basis. Junie is great for bigger features, while Assistant works well for smaller tasks or functions.
![Backend developer career story](/images/brightstorypatryks.png "Backend developer career story")
## How does AI save your time? A good example is a prototype I was building for a client with Cursor. The goal was to show them a different approach to their main feature. It took me around two days – but **without AI, I would have spent maybe even a week on that**. ## Do you enjoy working at Bright Inventions? I’ve been here for over five years – I wouldn’t have stayed that long if I didn’t like it. **People here are kind and positive, and that’s the most important thing**. In the end, it all depends on people – clients are also people after all. So it really comes down to whether we share the same vibe and understanding. ## What are you working on in your current projects right now? I’ve been doing some interesting things with blockchain. **Since Parity is no longer supported, our client asked us to find the right alternative**. So I had to research various blockchain clients and choose the one that would tick all the boxes required for this project. It was challenging but also very interesting. ## How do you react to changes from the client? I’m asking because some developers find it difficult. It can be frustrating but not because of the change itself, more when you don’t know the reason behind it. I don’t like when developers aren’t familiar with the context. **I want to know the full picture – why some priorities are shifting**. At Bright Inventions, **we work with clients who explain their business decisions, and we even give input from the tech side** to help them make some of those calls. That way, the changes aren’t that frustrating after all. The last thing I’d want is to just write code thoughtlessly.
![Quote on business decisions](/images/patryk_quote_business_decisions.png "Quote on business decisions")
## After hours you make music. Do you have a dream to be a professional music producer? Not really, I treat it more as a hobby. I like creating pieces from scratch, and sometimes I meet with friends and we make something together just for fun. Recently, I **also started learning guitar and piano**. I’m curious to see how that will turn out. ## What else are you doing after hours? I ride **MTB (mountain biking)** and sometimes take part in competitions, but I treat it more as another workout session. I also go for **walks with my dog** Tesla, and I regularly go **mountain hiking**. For example, I went with a friend to Norway, we slept in a tent and hiked for about a week. Now my goal is to do it in the Alps – a 10-day hike with just a tent and a backpack. A perfect detox from technology, and a great way to really rest.
![At one of the MTB races.](/images/patryk_mtb.png "At one of the MTB races.")
At one of the MTB races.
## Your dog Tesla is a regular office visitor. Does she enjoy the company? Oh yes, **she’s always happy when she’s at the office**. She loves to accompany me wherever I go.
![Patryk and Tesla at the Bright Inventions' office.](/images/patryk_tesla_dog.png "Patryk and Tesla at the Bright Inventions' office.")
Patryk and Tesla at the Bright Inventions' office.
## Bright Inventions is now Framna Poland *Published: 2025-09-03 | Author: ula | Tags: news, bright insights* *Source: https://brightinventions.pl/blog/bright-inventions-is-now-framna-poland/index.md* Today Bright Inventions officially becomes Framna Poland, the leading international agency for digital products. Framna is the shared brand uniting the agencies formerly known as Shape in Denmark, Bontouch in Sweden, and Move in the Netherlands. **With more than 600 talented people on board, Framna is on a journey to become a global go-to studio for digital products, helping the most ambitious brands bring their visions to life.** This rebrand is a natural next step that fits perfectly with our own ambitions and vision for the future.
![Bright Inventions & Framna ](/images/article-image-4.png "")
## Aiming Higher Bright Inventions started at the dawn of the mobile era, and just like the digital landscape we navigate, the company has grown fast and agile. Our ambition keeps evolving fueled by long-term partnerships with clients like Just Eat Takeaway.com, Relevo, the UN World Food Programme (WFP). With a strong track record in IoT and AI solutions, as well as employee-facing enterprise mobile products, we have become the leading mobile studio in Poland — and now, as Framna Poland, we are ready for the next chapter expanding further into other international markets.
![Michał quote Framna ](/images/quotation-1-michal.png "")
## Framna CEO on Framna Poland: A Perfect Fit Joacim M. Jeppesen, CEO of Framna, on their new partner, “Framna Poland brings strong engineering capabilities and a culture deeply committed to quality. Like all of us at Framna, they are ambitious on behalf of the businesses and organizations they partner with, aiming to create market-leading digital products. Their track record includes both consumer-facing products and bespoke enterprise solutions that unlock operational efficiency, greater flexibility, better use of data, and more. **The team combines reliable, enterprise-grade engineering with innovative use of technologies, IoT, and AI. These capabilities are vital to our pursuit of being the best possible partner to the brands and businesses we work with, and our ambition to become the leading digital product agency globally.** We are excited to share the Framna name with our colleagues in Poland.”
![Joacim CEO Framna ](/images/quotation-1-joacim.png "")
## About Framna Framna, whose name comes from Old Norse, meaning "to advance" or "to bring forward" – is a growing digital product agency with over 600 talented people across nine studios in Sweden, Denmark, the United Kingdom, the United States, Switzerland, the Netherlands, and Poland. **We create digital products that over 10 million people worldwide depend on every day, collaborating with international heavyweights like IKEA, Post-it®, Red Bull, and Credit Suisse, as well as leading national brands such as Swedish Railways (SJ), PostNord, Novo Nordisk, Rabobank, and ENGIE.** Our work helps shape markets, transform industries, and fuel meaningful growth. Every day, millions of people around the world experience the digital products we bring to life. ## What’s Ahead By collaborating across teams and markets under one shared brand, we will tap into a larger pool of talent and technological opportunities, ensuring that we create standout digital products that really make an impact. Our studios will work closely together, sharing expertise, insights, and knowledge to deliver the best results. There will be no changes to the Polish studio's management or organization, and existing partner relationships will continue as usual. The Bright Inventions name is being retired in favor of Framna Poland, but the team, leadership, and the company behind it remain the same. ## POS Software Development: 2025 Guide for Custom Point of Sale System *Published: 2024-10-16 | Author: piotr | Tags: POS* *Source: https://brightinventions.pl/blog/pos-software-development-guide/index.md* **Dive into the technical world of the POS development process. Discover key features of Point of Sale, top challenges, trends, and real case studies. Explore the guide about custom POS development based on our over a decade of experience in building, scaling, and modernizing POS systems for hospitality and retail.**
![POS development](/images/pos_development_guide_blog_cover.png "POS development")
## Point of sale system definition A **Point-of-Sale (POS) system is a combination of hardware and software** that facilitates sales transactions and manages business operations in **retail, hospitality**, and other industries. It includes **devices like thermal printers, POS terminals, desktop and mobile POS systems**, enabling businesses to process payments, track inventory, and manage orders. **POS system development can be tailored to meet specific needs** such as supporting old desktop hardware which may be still used by end users, especially in hospitality. Point-of-sale software's main functionality is ensuring **a smooth connection between hardware and software components**. Therefore a **POS developer** must understand both hardware and software components to build an effective system. ## Key POS features to include in modern POS software development POS systems are versatile solutions that **consist of dozens of features, additional applications, and POS hardware**, forming the technological backbone for managing client orders in restaurants, hotels, and retail settings. ### Examples of must-have features in POS development * **Inventory Management**: Track stock levels, reduce waste, and reorder automatically. * **Integrations**: Connect with POS hardware (printers, card readers) and third-party services. * **Z-Report and X-Report**: Essential for daily financial summaries and cash register audits. * **Check-in/Check-out**: Manage employee time tracking efficiently. * **Payment Processing**: Accept various payment types. * **Order Management**: Handle bundles, variants, and customizations. * **Table Management**: Organize seating with a visual floor plan. * **Digital Ordering**: Enable online orders. * **Payment Split**: Allow customers to split payments. * **Notes for Kitchen**: Special instructions for orders. * **Reporting & Analytics**: Real-time data for business insights. ### Extra POS Solution Features for Standout POS Application Development * **Dark Kitchen:** Support for off-site kitchens. * **Splitting the Bill**: Divide the bill between guests. * **Kitchen Display System**: Digital kitchen orders. * **Kiosk Integration**: Self-service options. * **Offline Mode**: Operate without internet and sync the POS system's data as soon as the internet connection is restored. * **Cloud-Based POS**: Access from anywhere. * **Delivery Management**: Manage deliveries efficiently. * **Order Sync with Marketplaces**: Orders from delivery platforms are available on a single POS device. * **Caller ID**: Recognize regular customers during phone ordering. ## POS software development: cloud POS or on-premise POS Cloud POS and on-premise POS systems differ in their infrastructure and setup. **A cloud POS operates through the internet, offering flexibility, remote access, and automatic updates**. It's easier to scale but **requires a reliable internet connection which can be an issue in restaurant or hotel environments**. On the other hand, **traditional POS involves hosting software and hardware locally**, which gives businesses more control but requires regular maintenance and **higher costs**. When you build a POS system, consider business needs: cloud POS excels in flexibility and usually lower costs, while on-premise POS offers better control and offline POS capabilities. Every **POS software developer** must weigh the benefits and challenges of both options, including internet dependency vs. full local control. ## Types of integrations with point of sale software For **POS developers** and vendors, a key aspect of a **POS development** is its ability to reliably integrate POS with various devices and multiple third-party providers. Let’s dive into the types of POS integrations: ### POS solution and hardware integrations Check out the [examples of retail devices that are part of a POS system](/blog/what-are-point-of-sale-devices/), ranging from POS desktops, terminals, and kiosks to printers. Printers, in particular, can often present the most technical challenges.  Modern POS systems should integrate with printers wirelessly and reliably. This means that if one printer fails to print a receipt, the POS system should automatically switch to a backup printer. Be aware of common technical challenges when [integrating POS systems with retail devices, especially printers](/projects/pos-devices-integration/). ### POS and payment provider integrations From choosing the right providers to handling the payment process, and managing daily communication with payment partners, POS providers face many challenges. If you are at the stage of choosing a payment provider, consider answering these [key questions which will help you build a well-thought-out payment solution](/blog/implementing-payments-key-questions-for-startup-founders-and-ctos/) offering a high number of payment methods. The most popular payment global providers are **Stripe, Square, and Adyen**. Read more about technical aspects of [integrating payment providers with POS](/blog/payment-provider-pos-integration/) in our another blog post. ### POS and food delivery applications integration The most popular third-party food delivery providers include **Uber Eats, Wolt, Just Eat (or local representatives like Lieferando) or Deliveroo**.
![POS food delivery apps integration](/images/food_delivery_photo_case_study.png "POS food delivery apps integration")
Restaurant owners are aware of the **pros and cons of food delivery integrations**. Technology can help minimize the drawbacks more than you might think: #### Pros: 1. **A vital client acquisition channel.** 2. **Support for delivery if the restaurant lacks in-house drivers.** #### Cons: 1. **High fees associated with client acquisition and delivery services.** **Tech solution**: A custom point of sale that offers a **white-label solution enables restaurants to build their own digital ordering website**, reducing the high costs associated with third-party delivery platforms.  Additionally, **having a POS with an integrated [delivery drivers app](/projects/delivery-drivers-app/)** allows restaurant owners to manage their food delivery in-house if they choose to, offering greater control and cost savings over outsourced delivery services. 2. **Too many devices for staff to manage.** **Tech solution**: custom [POS and food delivery providers integration](/our-areas/food-delivery-pos-integration/) transferring orders from external providers into one POS device. 3. **Restaurant menu discrepancies across platforms.** **Tech solution**: a proper [integration with food delivery apps](/projects/pos-third-party-delivery/) can sync changes from the main POS to all platforms, reducing errors and saving time. Are you wondering whether API or FTP is the better choice for your [POS and delivery software integrations](/blog/pos-delivery-integration-api-ftp/)? Learn more! ### POS and Caller ID integration Caller ID is a device that provides information about incoming phone numbers. With the right integration with the POS, **when a staff member answers the phone, they can instantly see on-screen details if a regular customer is calling**. This includes all the necessary information to efficiently process the order, such as the delivery address and phone number. This feature streamlines phone ordering and enhances the customer experience with a more personalized touch. Check how our team took care of the [POS and Caller ID integration](/projects/restaurant-pos-caller-id/) and learn about challenges our engineers faced.
![Caller ID and POS](/images/pos_caller_id_case_study.png "Caller ID and POS")
Read more about [POS integration](/blog/pos-integration/) and its challenges in our another blog post. ## Emerging trends in POS application development: what to expect in 2025 and beyond Explore **POS development** trends. ### The continuous rise of QR code ordering as a response to restaurant staff shortages QR code ordering supports busy staff by allowing customers to place orders and pay directly, which reduces wait times.  Although **QR codes shouldn’t replace staff initially** - clients should still be able to discuss the order with waitstaff, **using QR codes for payment can alleviate pressure on staff during peak hours**, improving overall efficiency and customer experience.
![QR code ordering](/images/qr_code_restaurant_ordering.png "QR code ordering")
### Transiting from paper kitchen receipts to Kitchen Display Systems (KDS) While many establishments still rely on old-fashioned paper methods, KDS offers a more efficient, modern solution. It streamlines order management, reducing mistakes and speeding up service. **Orders can be tracked and modified in real-time, improving communication between the kitchen and front-of-house staff.** This shift not only cuts down on paper waste but also enhances overall workflow and accuracy in busy kitchens, optimizing food delivery time. Check out an actual [case study of Kitchen Display System](/projects/kitchen-display-system/) and how it changed restaurant operations in the UK and Israel. ### Hardware decluttering of restaurant, retail, and hotel counters The fact that modern point-of-sale software is connected to many devices is both a benefit and a challenge in some cases. For example, **taking care of multiple devices provided by different food delivery parties brings more responsibility to already busy waitstaff**. [Building a custom point of sale](/our-areas/pos-software-development/) allows **all orders, whether from in-house dining, phone orders, delivery apps, or a white-label application, to be transferred into a single POS system**. This means waitstaff can view and manage all orders on one device, aligning with the growing trend in **POS application development** aimed at **eliminating the unnecessary POS devices** often provided by third-party systems such as Just Eat, Uber Eats or Deliveroo. ### Using AI for analytics and inventory management With AI, restaurants can **track customer preferences, predict demand, and optimize stock levels to reduce waste**. AI-powered analytics allow businesses to make data-driven decisions about menu offerings, pricing, loyalty programs, and staffing, improving overall efficiency and customer experience. In inventory management, **AI helps monitor stock in real-time, quickly informing about the need for ingredients reorder**. ## How to build a POS System that complies with local and international regulations As a POS vendor, your POS functions have to be adjusted to local regulations and tax rules. Here are a couple of compliance issues your software engineering team has to be aware of. ### Compliance with GDPR in custom POS development During **POS software development**, it's critical to ensure [GDPR](https://gdpr-info.eu/) compliance, particularly in how customer data is collected, stored, and processed. This includes securing consent for data collection, ensuring data encryption, and providing customers with the ability to request data deletion. ### Compliance with PCI DSS for payment processing To protect sensitive payment information, your POS system must comply with the [PCI Data Security Standard (PCI DSS)](https://www.pcisecuritystandards.org/standards/pci-dss/). This **involves implementing data obfuscation techniques, two-fold protection of cardholder data, encryption of transmitted data, and the creation and maintenance of access logs**. Check **how to get access to POS data to optimize your payment solutions at the same adhering to security regulations**. Our **POS application development** team **faced that challenge while building the [bill split feature](/projects/pos-bill-splitting/)**. ### Adherence to local tax law during POS development Your POS system must integrate with local tax rules, including **calculating the correct sales tax and generating tax-compliant receipts**. This may involve adapting the software to meet region-specific tax regulations, such as VAT or GST, and keeping up with changes in local tax laws to ensure ongoing compliance. One example of adapting to tax rule changes is when **our team implemented an amendment to the VAT law in Israel, which directly impacted invoice generation**. **We adjusted the [restaurant invoice generation software](/projects/invoice-generation-system/) to comply with these updates** by modifying the information included in the invoices. Check out the case study to learn more about it! ## The role of UX/UI in building intuitive custom POS software From understanding the specific needs of POS system users to integrating UI/UX solutions that address their pain points, a **POS software developer** must follow this path during **POS development**.
![UX/UI for POS](/images/establish-button-hierarchy.png "UX/UI for POS")
One critical feature requiring extra attention is payment processing. To ensure a smooth experience, it's essential to implement must-have UX/UI practices, such as: * informative animations; * iconography with labels; * button hierarchy. Read more about [designing payment in POS](/blog/payment-point-of-sale-design-ui-ux/) and check the designs for inspiration! ### The Role of User Personas in POS Application Development User personas serve as fictional yet data-driven representations of your target users, encapsulating their behaviors, needs, and challenges. By crafting detailed personas, **POS developers** can tailor **custom POS** solutions that resonate with actual user experiences, leading to more intuitive and effective systems.​ For instance, consider "Jennifer," a meticulously developed persona representing a frontline retail staff member. Her profile sheds light on daily operational **challenges, such as managing customer orders and dealing with nonintuitive bill splitting**. Insights from such personas guide **POS developers** in prioritizing features like streamlined checkout processes, real-time inventory updates, and user-friendly interfaces.​ Integrating user personas into the development lifecycle ensures that the POS application aligns with real-world user expectations, enhancing usability and satisfaction.​ To explore a comprehensive user persona example and understand how it can inform your **POS development** strategy, download the free PDF: ## Getting feedback from point-of-sale users Anyone developing software solutions for hospitality or retail knows that end users are busy. Even though sales assistants or waitstaff use your tools daily, they rarely have time to provide valuable feedback. That’s why it’s the POS developer’s job to find alternative ways to gather insights without disrupting users' workflow. Discover a few [tactics that can help you collect actionable feedback](/blog/how-to-gather-actionable-feedback-inside-a-pos-system/) on your solution. ## Do you want to build your own POS system? As a [POS software development company](/our-areas/pos-software-development/) we have been creating cutting-edge POS solutions for over a decade. [Contact our POS developers](/our-areas/pos-software-development/#contactForm) team to discuss cost-effective POS. ## Certificate Pinning on iOS in Practice *Published: 2025-08-14 | Author: tomasz-l | Tags: iOS, Security* *Source: https://brightinventions.pl/blog/certificate-pinning-in-ios-app/index.md* New feature for yesterday, too long backlog of bug tasks and this crazy new crash that started occurring randomly out of nowhere... No wonder that there is no time to focus on security aspects of our apps. But lets break this vicious cycle now and dive into fundamental practice for securing your app: **Certificate pinning**. ## Someone is looking Main reason for Certificate pinning implementation is so called Man in the middle attack. Not only does it allow malicious user to reverse engineer our APIs and test for vulnerabilities but also leaves possibility for intercepting data of our users. You can test this right away on your own app with use of SSL/TLS proxy like good old [Charles](https://www.charlesproxy.com) or [Proxyman](https://proxyman.com) (my current go to) or any other SSL/TLS proxy out there. Here for example I could not only read but also substitute data retrieved by some popular classified advertisements portal ending up with funnily looking tabBar:
![Proxyman Map Local feature](/images/certificate-pinning-in-ios-app/proxyman-map-local.webp "Proxyman Map Local feature")
![TabBar affected by MITM attack](../../static/images/certificate-pinning-in-ios-app/affected-app.webp "TabBar affected by MITM attack")
## Pinning tiers So what is this whole certificate, how to pin it and even where to pin it? Lets start with TLS itself... TLS or Transport Layer Security is a protocol that stands in between server and client which allows for those two entities to negotiate secure connection and verify identity of the server that client talks to. This is being made with help of Server trust which is based on certificate chain. This chain typically consist of three parts: * Root CA - long lived trusted anchor which is typically preinstalled on your device * Intermediate CA - Issued by trusted root CA and used to sign leaf certificates * Leaf certificate - end certificate, one that was granted for your server Now whenever we want to connect to our server over https we will first negotiate encrypted connection with use of certificate chain. Client app will verify that it comes from the trusted root (which is handled at the system level) and connect. This predicate can be broken if malicious actor is able to force system to trust its own root CA with which fake certificate can be made. Alternatively such actor might be able to access private keys lower in the trust chain, eg intermediate CA (first case is exactly how TLS proxies works) and pretend to be our trusted server. We can prevent such issue from happening by verifying that certificate we receive in our chain is known and trusted to us. This is similar to how platforms comes preinstalled with trusted root certificates but we will be verifying our own server certificate instead. This verification process is what we call Certificate pinning and we can pin any of the certificate in the chain. We will stick however to leaf certificate as it gives as certainty to whom we speak to. ### Not only certificates Besides pinning entire certificate we can also pin certificate fingerprint or public key of private/public key pair used to sign certificate. Pinning certificate fingerprint can be more compact yet less verbose, there is no much difference here as compared to pinning whole certificate. Pinning public key gives as little bit of flexibility depending on how our certificate is being created since it can be refreshed with the same private/public key pair, but more on that later... ## How to pin Certificate pinning in principle is very simple: * During connection with server we are presented with authentication challenge * Challenge contains host name and certificate chain * We can check if leaf certificate in challenge is matching one that we expect There are plenty networking libraries that can handle certificate pinning out of the box like [Alamofire](https://github.com/Alamofire/Alamofire/) (see their [docs](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security)) and for standard use cases those do the job well. Lets go deeper and implement simple pinning ourselves to get better understanding of what is going on. ### Retrieving certificate for your domain Starting point is to get actual certificate we want to pin. You can either reach to team managing domain for the certificate or you can get certificate currently used in production with openssl command. You can use example below for that purpose. Just exchange `` with actual domain for which you want to retrieve certificate. ```sh openssl s_client -connect :443 -showcerts /dev/null \ | awk '/-----BEGIN CERTIFICATE-----/{i++} i==1 {print}' > leaf.pem ``` You will need this certificate later on to actually pin to it. Save those as a resources in your project. I have chosen structured folder directory to easily store and retrieve certificates. Structure is like this: `Certificates//.der` (eg `Cetificate/bright.dev/leaf.der`). In order to make it work (xcode bundling resources keeping folder structure) you also need to make `Certificates` and actual (blue) folder in the project and not xcode group. Now you can access those pinned certificates in the runtime retrieving them from Bundle like below: ```swift import Foundation import Security func certificates(matchingHost host: String) -> [SecCertificate] { guard let resourceURL = Bundle.main.resourceURL else { return [] } let certificatesURL = resourceURL .appendingPathComponent("Certificates", conformingTo: .directory) .appendingPathComponent(host, conformingTo: .directory) do { let certificateUrls = try FileManager.default.contentsOfDirectory( at: certificatesURL, includingPropertiesForKeys: [.isRegularFileKey] ) let certificates = certificateUrls.compactMap { file -> Certificate? in let fileType = file.pathExtension guard fileType == "pem", let data = try? Data(contentsOf: file), let secCert = SecCertificateCreateWithData(nil, data as CFData) else { return nil } return secCert } return certificates } catch { return [] } } ``` Here we have encountered Security framework for the first time. It might seem cumbersome and not Swifty - see that we created `SecCertificate object using SecCertificateCreateWithData. This is pretty old and crusty API, so lets get used to it... 😅 ### Validating certificate We have now our certificate added to the project - lets *pin* it! In order to pin certificate we need to tap into previously mentioned `Authentication Challenge`. Fortunately there is really simple way of doing so with use of `URLSessionDelegate`. There are few steps to tackle in order to pin certificate: 1. Conform to and assign `URLSessionDelegate` to session object 2. Implement [urlSession(_:didReceive:completionHandler:)](https://developer.apple.com/documentation/foundation/urlsessiondelegate/urlsession(_:didreceive:completionhandler:)) delegate method. See that you can use callback or async variant. 3. Check host for which authentication challenge is being made 4. Get trusted certificates for the given host (this is where you retrieve certificate eg from bundled resources). 5. Handle fallback when no trusted certificate found. Either go with default platform behavior or cancel challenge all together (depending on your use case). 6. Retrieve leaf certificate from server trust (`SecTrust`) object. 7. Check if leaf certificate from authentication challenge is known and trusted to us. ```swift extension NetworkManager { func setupSession { // #1 Assign delegate to the session object URLSession.shared.delegate = self } } // #1.1 Ofc you need to implement delegate extension NetworkManager: URLSessionDelegate { // #2 Implement authentication challenge delegate method func urlSession( _ session: URLSession, didReceive challenge: URLAuthenticationChallenge ) async -> (URLSession.AuthChallengeDisposition, URLCredential?) { // #3 Checking host for the challenge let host = challenge.protectionSpace.host // #4 Get trusted certificate for host let trustedCertificates = certificates(matchingHost: host) if trustedCertificates.isEmpty { // #5 Fallback when no trusted certificate found return (.cancelAuthenticationChallenge, nil) } // #6 Retrieve leaf certificate from trust object guard let trust = challenge.protectionSpace.serverTrust, let chain = SecTrustCopyCertificateChain(trust) as? [SecCertificate], let leaf = chain.first, // #7 Validate that leaf is one of our trusted certificates trustedCertificates.contains(leaf) else { return (.cancelAuthenticationChallenge, nil) } return (.performDefaultHandling, nil) } } ``` As simple as that, with just a few lines of code we have protected our app from malicious actors trying to intercept our communication. It can't be that simple, can it? ## Where the devil sleeps Issue that lies in this simple method is that certificates needs to be refreshed. For leaf certificates this happens relatively often - every year. This means that when we refresh our certificate which is pinned we also have to update app as well (remember - it was embedded as part of the app). This seems quite inconvenient both from perspective of release process as well as for our clients. Not only will they be interrupted by required update, but with raised deployment target we could leave behind older version of the app completely broken.
![Cat meme about certificate refresh](/images/certificate-pinning-in-ios-app/certificate-refresh-meme.webp "Cat meme about certificate refresh")
## What to do next? Maybe we could pin certificate lower in the chain? It gives as more time, but inevitably at some point it also needs to be refreshed and pinning it is potentially less secure. There is also possibility to utilize public key pinning - in case we control certificate creation and reuse same key pair for new certificate creation, then our refreshed certificate can be still pinned with same public key. This is however not always the truth (eg certificate creation and refresh is managed by platform we use). Moreover it is a good practice and recommendation to rotate public/private key pair regularly so if we stick to such good practices wew still need to update app with new pinned public key. But maybe we could somehow update our app with latest certificates remotely? How about safety of such solution, is it even possible? Fortunately there are some solutions for this problem and we could name a few: * [Background updates](https://developer.apple.com/documentation/usernotifications/pushing-background-updates-to-your-app) - with use of APNS * [CloudKit database](https://developer.apple.com/documentation/cloudkitjs/cloudkit/database) - and its public database No solution is 100% secure and this is always a game of cat and mouse, but using one of the above methods allows us to leverage security of platform (iOS) in order to update our pinning without updating app itself. From perspective of security of our app if underlying system is compromised, then there is not much to be securing anyway, right? With the example of CloudKit database, we can use its [publicCloudDatabase](https://developer.apple.com/documentation/cloudkitjs/cloudkit/container/1628710-publicclouddatabase) as a mean of distribution of updated certificates. Public database does not require our users to be signed into iCloud, so it is solution available to all of our users. Not only that, but we could even use cloudKit subscriptions to refresh state almost instantly. This is solution I have chosen for one of our clients. Not only this makes it much safer for their users as we check identity of server we talk to, but also much easier to maintain the product in the long term making it accessible even for users with older version of the app. ## Attribution I would like to make a tribute to one of my favorite articles which was main inspiration for cloudKit usage in certificate pinning: [Secret Management on iOS](https://nshipster.com/secrets/) by [Mattt](https://nshipster.com/authors/mattt/). ## Thriving in the Details. Behind Kasia’s QA mindset *Published: 2025-08-13 | Author: katarzyna-b | Tags: bright story* *Source: https://brightinventions.pl/blog/kasia-qa-mindset-career-story/index.md* **Kasia thrives on rules, diagrams, and compliance. She used to ensure that oil platforms were safe for workers. Eventually, she discovered how similar that work was to software development, leading her to change her career path. The one thing she hasn’t changed is her sharp eye for the details hidden in complex workflows that might scare others away.**
![software tester's career story](/images/brightstorykasiab_grid.png "software tester's career story")
## What was your profession before you joined IT? I’m an ocean engineer specializing in the exploration of underwater oil deposits. After my engineering degree, I went on to do a master’s in **Subsea Technology,** which basically means designing and building offshore systems for the exploitation of underwater oil fields. That’s when I found a job at a shipyard working on the **Petrofac FPF1 modification** project for the floating refinery platform. I stayed there for nearly two years. At that time I started to specialize in **commissioning** – that’s the phase right after construction is finished. You have to check if everything works, so we coordinated the work, making sure it was safe, for example, ensuring nobody would be scheduled to weld in an area where someone else would be running a pressure test. This was all happening in spaces that weren’t yet open for normal operations, so planning and coordination were critical. There was a lot of going through documentation and working with people who thought they knew best how things should be done. There was also quite a bit of pressure to push certain tasks through and get work permits approved. It was actually truly interesting and gave me experience in so many areas, including mechanical and electrical. It was also **my first real interaction with the IT world**, because we were building a database in Microsoft Access. We built forms based on the tables and their dependencies, so that later the database admin could easily input information. We generated various reports using the queries we had created ourselves. In some cases, we basically had to be ready to step in as database administrators if needed. When that project ended, I spent a short time in **Rotterdam** for another job. Once I got back, I spent quite a while looking for work, eventually moving into quality assurance. ## And how did that come about? I was looking for a job for a while and honestly didn’t really know what I wanted to do next, so I decided to go to a job fair. A woman approached me there and asked if I wanted to take part in a **European Union program for future software testers**. It might sound like a golden opportunity, but it meant I had to fully commit – taking a one-month course, passing certification exams, and then starting a three-month internship. During those intense months, I realized I enjoyed it, and it wasn’t that far from what I had been doing before. Many of my skills transferred easily to this new line of work – **it was still all about quality**. The difference was that instead of checking the safety coordination of work on oil platforms, I was checking the connections between systems and their security.
![Quote on commissioning](/images/kasia_quote_commissioning.png "Quote on commissioning")
Kasia at the Bright Inventions sailing team retreat.
The only thing I really had to learn from scratch was Agile. I mean – the whole idea was new to me, but commissioning actually has a lot of similarities to software development such as such as breaking down a massive project into smaller testable phases, **managing a "punch list" of issues that functions just like a bug backlog**, and relying on daily meetings between cross-functional teams to solve problems as they arise; and of course the entire process is a massive testing exercise. Checking a single instrument is like a unit test, verifying a subsystem is like an integration test, and the final performance trial is the ultimate user acceptance test (UAT). The program, after I passed my exams, gave me an **internship at a local company** – and from there it was all up to me. When I started my internship, I quickly felt that manual testing alone wasn’t enough for me, so I looked for a framework, chose Cypress, and **wrote tests to cover the most important paths** in the application during my internship. I felt that was the key to my future in the company – I was determined to show my managers how quickly I could grow as a software tester. Eventually, the company appreciated my development, and they were happy with both my progress and my communication skills with clients and team members. ## Is it still possible for a career shift like yours in quality assurance? It’s definitely harder compared to six years ago when I was doing it. Back then, **I joined an industry that needed new talent**; companies were willing to train people to see who showed promise, and they invested their resources in teaching. Now, you need to already have some knowledge and experience to prove you’re worth that investment. It’s especially tough if you’re just doing manual testing – **coding skills from the start are essential**. So yes, it’s harder, but it’s not impossible.
![Kasia at the Bright Inventions sailing team retreat.](/images/kasia_sailing_team_retreat.png "Kasia at the Bright Inventions sailing team retreat.")
Kasia at the Bright Inventions sailing team retreat.
## How do you work with AI? Mainly, I use AI for **improving automated tests** – for example, when I write a block of code, I put it into Gemini and ask if it can be simplified. I also sometimes use it to look for solutions, but I keep a **healthy amount of skepticism** – not all of its suggestions work in practice. ## Can AI replace you in the future? I’m not afraid of that. For sure, **some roles will disappear and new ones will be created.** We’ll just need to keep learning and adapt to the new reality. It’s the same with the QA role – at the beginning, it was just a tester, someone who checked everything manually. Then it grew into quality assurance, a person who knows the project best. You’re not just testing; you make sure the project is consistent, you notice gaps in UX, and **you act as a link between everyone** because you talk to the client, the designer, and the developers.
![Quote on software tester's role](/images/kasia_quote_tester_role.png "Quote on software tester's role")
**AI won’t take our jobs because we will adapt to the new reality**. Someone will still have to check what AI writes. It can generate tests, but they don’t always work because AI doesn’t have the full knowledge, and it can’t connect the dots in a human way. Also, someone needs to train the AI for the designated purposes. ## Can you walk us through the project you're involved in at Bright Inventions? I’m part of the team developing a [transport management system](/projects/transportation-management-system/). When I joined the project, it was mainly focused on matching transport offer listings with the right vehicle and driver, and preparing optimized routes. Now, there’s so much more – **we’re developing separate panels for freight forwarders, admins, and couriers**, with tools for document exchange and communication. It’s amazing to be part of a product that’s growing so quickly and on so many levels.
![At the Bright Inventions sailing team retreat.](/images/team_retreat_sailing.png "At the Bright Inventions sailing team retreat.")
At the Bright Inventions sailing team retreat.
## I imagine this industry aligns quite well with your previous professional experience. Yes, I caught on pretty quickly. **Logistics isn’t unfamiliar to me** – even during college, I had quite a bit of exposure to road transportation. Of course, it’s different from maritime shipping, but the basics are similar, especially when it comes to logical dependencies. In general, **I enjoy rules, schemas, and diagrams** – they help me process and understand things faster. I often draw up mind maps to see what depends on what, and that helps me when writing documentation or connecting the dots in my head. ## I know you’re passionate about sewing. Which of your creations has made you especially proud? **Sewing was always present in my home**. My grandma used to sew – not professionally, but she made clothes for family and friends. Later, my mom also picked it up; she used to sew for herself and us, and she also did knitting and crocheting, though that’s a complete mystery to me! My sister is very good at it, but I tried and it just never clicked. Sewing, on the other hand, is a process I grew to appreciate, although it took me a few tries. You really need patience. **The actual sewing part is just the final stage – before that, there’s so much preparation**. You have to design the pattern, prep the fabric, iron multiple pieces... There are tons of steps involved. The piece I’m most proud of is a cocktail dress I made for myself. It had a deep open back and a square neckline. It took a full week of sewing, but it was a project that stretched out over a year. You need time and the right mindset – **if you’re not feeling it, it’s better to step away and come back later**. Otherwise, you just end up ripping everything out and starting over, and that’s frustrating, although I’ve definitely done my fair share of unpicking and reworking.
![Kasia's dress](/images/kasia_dress.png "Kasia's dress")
One of Kasia’s favorite dresses she created.
Even when the garment is finished, you often still need to adjust and fit it properly. I’m a big fan of oversized pieces because they’re a bit more forgiving. I also **try to sew gifts for people** when I can – it’s a nice way to share something personal. ## POS Delivery Integration. API vs FTP – What Works Best? *Published: 2025-08-12 | Author: agata | Tags: POS* *Source: https://brightinventions.pl/blog/pos-delivery-integration-api-ftp/index.md* For many restaurant chains, third-party delivery platforms like Wolt, Just Eat, or 10bis are now essential revenue streams. But these partnerships also bring a technical challenge: how should your POS system receive incoming orders? From a development standpoint, delivery providers usually stick to one approach — either API integration or FTP integration. Each method comes with its own advantages, trade-offs, and ideal use cases. Knowing how both work helps restaurant owners and POS providers adapt to whichever method their delivery partners use and make the most of it in daily operations. ## **Why Integrate Delivery Platforms with a POS?** When your POS is directly connected to delivery platforms, you get more than just convenience: * ✅ Operational efficiency – No more manually entering orders from tablets into the POS. * ✅ Reduced errors – Eliminate miscommunication between the front-of-house and kitchen. * ✅ Faster order processing – Orders go straight to the kitchen or bar printer in seconds. * ✅ Better reporting & data – Real-time synchronization with sales, billing, and analytics. In short, seamless integration saves time, reduces headaches, and makes customers happier. ## **The Two Main Integration Approaches** #### 1. API Integration Orders are sent (pushed) or retrieved (pulled) from the delivery platform via RESTful APIs, typically in real time. Most modern delivery services now provide this option. #### 2. FTP Integration Orders are exported and imported as structured files (CSV, XML, JSON) via FTP/SFTP. This is common with legacy platforms or when no real-time API is available. ## **Deep Dive: API Integration** ### Pros * Real-time – Orders arrive instantly in the POS. * Better reliability – Easier to validate, retry, and monitor transactions. * Scalable & secure – Modern authentication like OAuth or JWT. * Future-proof – Easier to extend for new features like menu sync or promotions. ### Cons * Higher initial investment – Requires close cooperation with the delivery platform’s tech team. * Ongoing maintenance – Third-party APIs can change, requiring regular updates. * Potential limits – Rate limits or complex authentication flows can slow things down.
![API Delivery POS Integration](/images/frame-2608444.png "API Integration")
Best For: Modern platforms, high-volume restaurants, and fast-paced kitchen environments. ## **Deep Dive: FTP Integration** Pros * Simple setup – Especially for older POS systems. * Works without an API – Useful if the delivery partner’s tech is limited. * Good for batch processing – Can group multiple orders in one file transfer. Cons * Not instant – Delays between when a customer orders and the POS receives it. * Manual monitoring – More effort to troubleshoot or validate orders. * Data format headaches – Differences in file structure and error handling can slow integration.
![FTP DELIVERY POS INTEGRATION](/images/frame-2608443.png "FTP Integration")
Best For: Legacy systems, low-volume restaurants, and situations where real-time isn’t critical. ## **Choosing Between API and FTP** When deciding, consider: * Platform maturity – Does the delivery partner offer a robust API? * Order volume – The higher the volume, the more API’s speed matters. * Time sensitivity – How critical is real-time processing? * Error handling – Do you need automated retries and validation? * Resources & timeline – Do you have the dev capacity for an API build? * Security & compliance – PCI, GDPR, and other regulations. ## **Our Experience** Our team has integrated both API and FTP connections into a single POS interface. For the end user — waitstaff or kitchen staff — the technical method doesn’t matter. They just need a smooth, consistent experience. We handle the complexity behind the scenes, so orders from Wolt via API and orders from an older FTP-based platform appear identical in the POS. This unified approach keeps workflows simple while allowing for gradual tech upgrades.
![API vs FTP delivery integration](/images/case_study_food_delivery_app_modernization.png "API vs FTP delivery integration")
# **Conclusion** There’s no one-size-fits-all answer: * API is ideal for speed, scalability, and modern integrations. * FTP still works for legacy setups and initial partnerships. The right choice depends on your partners, operations, and technical resources. Often, the best solution is a hybrid approach — using API where possible, but still supporting FTP where needed. **Want help integrating delivery into your POS? Let’s talk.** As a [POS software development company](/our-areas/pos-software-development/) we've been taking care of [POS software development](/blog/pos-software-development-guide/) since 2012. ## Breaking the Code: Patryk's Quality Assurance Career Journey *Published: 2025-07-10 | Author: patryk-b | Tags: bright insights* *Source: https://brightinventions.pl/blog/patryk-quality-assurance-career-journey/index.md* **Since college, Patryk knew that writing code wasn’t for him. But breaking it? That was a different story. In this interview, he shares why he chose to become a QA Engineer, whether he’s worried about AI taking over his job, and why you probably shouldn’t offer him a tomato.**
![QA Engineer career story](/images/brightstorypatrykb_grid.png "QA Engineer career story")
## How did you land in the software development industry? It all started in technical school. I enrolled in a computer science class and earned a degree as an IT Technician. The reason I chose that path seemed simple at the time – **I liked playing computer games, so I figured computer science must be related to that**. That was a common assumption back then. At school, our teachers were very enthusiastic and encouraging. They kept telling us that IT was the future, and **their passion got me excited to pursue computer science at the college level** as well. Now, people usually ask me: “If you studied computer science, **why did you end up in quality assurance** instead of software development?” 😄 ## Yes, one really wonders – why did you choose the QA path? Even during college, I noticed that our **academic teachers didn’t really focus on why something works or doesn’t work**. They just told us to write pieces of code from a template, without even checking if it actually worked or not. But I wanted to do the opposite – **I wanted to break things and understand why they broke**. 😄 I was always the one asking, “What’s behind the code we’re writing?” – and I don’t think the academics appreciated that very much.
![Quote](/images/patryk_quote_college.png "Quote")
It’s definitely something subjective, but **programming felt a bit tedious** to me (sorry, my dear colleagues). I feel more connected to the product, the business side, and the end users as a QA. I also feel like I can have more influence there. ## How do you explain to your grandparents what it is you do at work? Oh, it’s rather difficult – my grandma can’t even fully understand that I talk to people on camera for work, and that I do it from home. My family knows I do something related to computers. I try to explain it by saying they have apps on their phones, and those apps are built by companies like the one I work for. My role is to **test the quality of those apps**. These days, they ask less and less about my job – I think it just feels too abstract or hard to grasp for them. But I know **they’re proud of me** anyway, because I’m the first engineer in our family. ## You used to work on projects in the banking sector. How does that experience affect your work? In banking, the app might have seemed simple on the surface, but there were many things happening behind the scenes that could go wrong. **Even the smallest calculation error can significantly affect the user experience**. Working on those kinds of projects made me much more detail-oriented. That also taught me how important it is to understand the end user and to simulate their actions as realistically as possible. There’s this **constant, quiet pressure in the banking sector** because even a small bug can ruin an entire release. I think that’s a good kind of pressure though. It shapes your mindset as a QA. ## You also had a startup adventure in your career. How do you look back on that experience? Working with startups has a lot of advantages, especially when you’re involved in a really interesting business idea that you genuinely feel has the potential to scale and grow. However, in some cases, startup founders face challenges like not fully knowing their clients or end users yet, because they’re still in the discovery phase. **For me as a QA, understanding who the end user is (so I can simulate their journey through our solution) is absolutely crucial**.
![Quote on end users](/images/patryk_quote_end_user.png "Quote on end users")
That meant I had to work very closely with the business side to understand users and client requirements as well as possible. And in a startup environment, those things can change quite often, so adaptability was key. ## How do you see yourself as a QA in the midst of the AI revolution? I’m still a bit cautious when it comes to using AI in software testing. The human factor is still very important. Even if you use AI for automated testing, y**ou still need to verify whether the AI agents actually understand user needs and truly grasp the business domain**. That said, AI is definitely helpful for things like **writing documentation and verifying errors**. When I encounter bugs during testing, AI can often help me find solutions faster. I’m not worried about AI replacing me, human review is still essential.
![Quote on AI](/images/patryk_quote_ai.png "Quote on AI")
## You started working at Bright Inventions a year ago. How do you recall that time? I truly **enjoy the fact that it’s not a huge company**, that’s exactly what I was looking for. In bigger organizations, I sometimes felt more like a resource than a team member. Here, I really feel like part of the team. I’m still amazed by how many **people actually know each other**. You can see it even on Slack – how they tease each other and joke around, you can tell these are long-term relationships, not just colleagues who work together. And I’ll never forget when I was considering Bright Inventions and visited the website – I saw that every team member had their own profile page with a photo and bio. That made a big impression on me. It showed that **people truly matter here**, they’re treated like humans, not just assets. ## What is special about the software project you're currently part of? We’re delivering a [mobile and web application for a global humanitarian organization](/projects/card-tracking-system/) that fights hunger supporting people in some of the world’s poorest and most conflict-affected regions. Everyone on the team truly feels that **we’re doing something that drives real change and helps people** in their everyday lives. The system we’re building supports the distribution of payment instruments (like cards, SIM cards, and vouchers) which allow people in crisis to purchase essential goods. We feel the impact of our work, especially when we receive updates and **photos showing how our app helps beneficiaries** access food and hygiene products for their families. We’re continuously expanding the number of countries where this technology is used and that makes me genuinely proud. Of course, I wish we lived in a world where apps like this weren’t needed but we all know that’s not the case. ## I know you’re not a fan of tomatoes. What did they ever do to you? 😉 It’s the texture, it’s just disgusting! I call them **rotten apples**. When I see someone slicing a tomato, I literally have to turn away, that’s not a sight I want to witness. I’ve always been like that. The funny thing is, I actually like ketchup, and I’m okay with tomato soup, as long as there’s no pulp in it. ## And what do you do after hours? Well, I’ve recently become a dog dad to a Border Collie and it’s intense! **Having a puppy really keeps me on my toes**. We walk a lot, and honestly, it’s already building better stamina than me, so I’m trying to catch up. I’m also planning to get back to the gym – hopefully that helps!
![Dog](/images/patryk_dog.png "Dog")
Leon – Patryk's dog.
Aside from that, I’m a bit of a **romantic musician type** – just me and my guitar. I really enjoy playing, though my puppy isn’t the biggest fan of my performances. ## Do you write songs? Yes, I’ve written some music over the years, but I was never a singer, so I always had to find someone else to perform. **I played in a few bands during school**, but it never turned into anything more serious. Still, the guitar has always been a big part of my life. It’s just something that’s stayed with me. ## POS Integration: What You Should Know about POS System Integration *Published: 2025-06-11 | Author: piotr | Tags: POS* *Source: https://brightinventions.pl/blog/pos-integration/index.md* **The era of point of sales that just handle payment operations is long over. Now POS system can serve as the central hub for operations and management in businesses that sell goods or services. However, this central role is largely made possible through** **POS integrations**. **Read about the types of integrations modern point-of-sale systems should offer.** ## POS integration definition What is pos integration? POS integration refers to the process of **connecting the POS system with other software platforms to enable seamless data exchange and synchronization across different systems**. For example, many restaurant POS systems are integrated with food delivery platforms such as **Glovo, Uber Eats, or Just Eat** to automatically receive and process orders from these marketplaces. Note: Point-of-sale and point of sale are written in both ways, both are commonly used, the latter is more common, but both seem to be correct.
![POS integration](/images/pos_integration_types.png "POS integration")
## Point-of-Sale integration with payment providers When integrating with third-party payment systems, several common challenges may arise: ### Challenge 1: Determining which payment providers to prioritize One of the first hurdles is identifying which payment providers should be prioritized for integration. This decision should be based on thorough **market research and regional trends**. For example, in the Netherlands, **iDEAL** is a widely used payment method, while in Germany, **SEPA** transfers are very common. The key is to understand your target market and prioritize integrations with providers that are most relevant to your users’ preferences. **Solution:** Conduct in-depth market research to understand the most popular and trusted payment methods in each region you operate in. This ensures your POS solution meets local customer expectations and increases adoption rates.
![payment POS](/images/card-payment-restaurant.png "payment POS")
### Challenge 2: Access to quality documentation and support on how to integrate your POS Not all payment providers offer clear, up-to-date technical documentation, which can significantly slow down the integration process. In such cases, your development team may need to engage in frequent communication with the provider’s technical support team to clarify implementation details. **Solution:** When selecting payment providers to integrate with, do a preliminary review of their developer resources. Check if they provide accessible, well-maintained APIs, SDKs, and documentation. This can help you avoid delays and make more accurate time estimates during project planning. ### Challenge 3: Dealing with legacy POS systems Integrating modern payment providers with legacy POS software can be particularly challenging. Older systems often rely on outdated APIs or lack support for modern integration standards, which complicates efforts to add new payment methods or meet current security requirements. There are multiple approaches to integrating payment providers with POS systems. We cover them in more depth in our dedicated [article on POS integration with payment providers](/blog/payment-provider-pos-integration/). One common approach is **API-based integration**, which is often preferred because it supports a wide range of payment methods – credit cards, mobile wallets, benefit cards, and more – while also helping ensure compliance with security standards like PCI DSS. **Solution:** When working with legacy POS systems that use outdated APIs, while payment providers offer modern interfaces, the integration gap needs to be bridged carefully. A practical solution is to develop a **middleware layer** that acts as a translator between the legacy POS and the new payment provider APIs. This middleware can normalize data, handle authentication, and enforce security rules, making the integration more manageable without needing to completely rebuild the existing POS infrastructure. Another option is to **gradually** [**modernize** **the POS system**](/projects/pos-legacy/) – starting with the payment module – so that it can support modern standards in phases. ### Challenge 4: Navigating mobile requirements from Apple or Google One key example is implementing tap-to-pay, which enables sellers and restaurant management to turn their smartphones into payment terminals. **Enabling this feature on iPhones is a long-term process** that demands a special entitlement from Apple. It requires the Apple Developer account holder to submit a formal request, and only after approval can development and testing truly begin. **Solution**: Include in your estimates the time to obtain all of Apple’s necessary entitlements and rules. Additionally, focus rigorously on testing scenarios because until that entitlement is granted, testing can be confined only to local environments via Xcode. This typically means that the time for final feature testing by QA testers or on a staging environment is usually very short. Check out the actual case study of [implementing tap-to-pay for a global POS vendor](/projects/tap-to-pay-pos/), enabling its clients to offer this new payment method.
![Tap to pay](/images/payment_phone.png "Tap to pay")
## POS integration with food delivery systems (online ordering POS integration) For many restaurants, partnering with food delivery apps is essential for business growth. These platforms help attract more customers and streamline the delivery process. While basic integrations with platforms like Uber Eats or Glovo are often available out of the box, they come with a major downside: **each platform typically provides a separate device for managing its orders**. This leads to operational clutter, as staff must monitor multiple devices in parallel with the main POS system. As a result, [custom POS integrations with food delivery platforms](/our-areas/food-delivery-pos-integration/) have become increasingly popular. These solutions unify orders from all third-party platforms and present them in a single interface within the main application of the integrated POS, improving efficiency and reducing complexity. ### Challenge 1: Managing multiple devices and ensuring real-time synchronization With each delivery platform requiring its own dedicated device, restaurant staff often struggle with a fragmented workflow. This setup increases the risk of missed or delayed orders and reduces overall efficiency. **Solution**: Custom integrations consolidate all third-party delivery orders into the POS system. This allows staff to manage everything from one interface, with real-time synchronization of orders and menus across platforms. It simplifies operations, reduces device clutter, and enhances order accuracy. ### Challenge 2: Importing and unifying menus from different third parties Another challenge related to menu synchronization is automating the import of menus from third-party providers to sync with the POS. Every food delivery provider has its menus in different data structures. With complex meal customizations, including bundles, add-ons, and so on, there are many opportunities for synchronization mistakes.Solution: Build a custom mechanism that transforms these various data structures into a unified format, ensuring proper synchronization. Read more on how we [integrated POS with food delivery apps](/projects/pos-third-party-delivery/). ## POS Integration with hardware The number of hardware [POS devices](/blog/what-are-point-of-sale-devices/) used in restaurants and retail stores continues to grow. Modern POS systems must integrate with various devices such as contactless payment terminals, receipt and kitchen printers, barcode scanners, scales, and tablets. Ensuring reliable communication between the POS and each device is essential for smooth, uninterrupted operations. ### Challenge 1: Compatibility across diverse hardware Restaurants often use a mix of hardware – like printers, tablets, and barcode scanners—from different manufacturers. Integrating these devices into one POS system is challenging due to varied SDKs, communication protocols (e.g., Bluetooth, Wi-Fi), and inconsistent reliability. **Solution**: A custom integration framework to support more types of devices (e.g., **Epson, Star, Sunmi**) with unified communication layer for handling various SDKs and protocols. ### Challenge 2: Maintaining a reliable connection with multiple printers simultaneously Restaurant employees often needed to print receipts for clients while also printing meal orders for the kitchen. **Solution**: Role-based device assignment to route tasks (e.g., customer receipts vs. kitchen orders). One device is printing the receipt, another information for the kitchen, they can operate simultaneously. ### Challenge 3: Device malfunction when they are needed the most Imagine the stress when the receipt printer suddenly stops working and the line of annoyed customers keeps growing. Or when the waitstaff tries to print kitchen tickets, but the printer fails – disrupting the entire food preparation flow. **Solution**: Custom mechanism designed to allows the system to reroute the receipt or kitchen order to another device. This assures waitstaff that, regardless of any issues with printing devices, the system always finds an alternative way to print the document. Explore how our team solved problems with [printer integrations for Just Eat POS](/projects/pos-devices-integration/). ## POS eCommerce integration As more businesses adopt omnichannel strategies, POS and eCommerce integration has become essential. This connection allows for synchronization of sales, inventory, customer data, and pricing between physical stores and online shops – creating a consistent experience across all sales channels. ### Challenge 1: Inventory mismatches Without real-time syncing, stock levels can quickly become inconsistent between your online store and physical locations, leading to overselling or stockouts. **Solution:** Implement real-time, two-way inventory synchronization between the POS and eCommerce systems. This ensures that inventory is updated immediately after every sale, return, or restock – online or offline. ### Challenge 2: Inconsistent product information Manually updating product names, prices, or descriptions in both systems can cause discrepancies and confuse customers. **Solution:** Use a centralized product catalog that feeds both the POS and eCommerce platform. Automate data syncing so that changes made in one system reflect everywhere. ### Challenge 3: Complex order and fulfillment flows Online orders may require in-store pickup, shipping from different locations, or partial fulfillment—all of which can be difficult to manage without clear integration. **Solution:** Design custom logic within your integration to handle multiple fulfillment workflows. This includes syncing order statuses, splitting shipments, and managing returns across systems. ### Challenge 4: API limitations or variability Different eCommerce platforms (like Shopify, WooCommerce, or Magento) have unique API structures, which can make integration inconsistent or limited. **Solution:** Introduce a middleware layer that acts as a translator between systems. This approach standardizes communication and allows easier scaling across multiple platforms. ## Integrated POS and accounting software Integrating accounting and POS software helps businesses transfer data and automate financial reporting, track sales, manage taxes, and simplify bookkeeping. With POS accounting software, transactions from the POS are automatically pushed to the accounting system, reducing manual work and errors. ### Challenge: Data mismatch between the POS and accounting systems One common issue is data mismatch — especially with taxes, refunds, or daily summaries. **Solution**: To prevent this, ensure proper data mapping and use automated syncing (daily or real time). If off-the-self solution doesn't apply in you case, consider customization that supports your local tax formats and offer detailed reconciliation features. ## POS Integration with Caller ID While not the most common feature, integrating a POS system with Caller ID can significantly improve operations in hospitality – especially in restaurants that handle phone orders. Caller ID devices display information about incoming calls, and with proper integration, the POS system can automatically match the phone number to a returning customer. This allows staff to instantly see the caller’s details, such as their delivery address, order history, and loyalty programs status — enabling faster service and a more personalized customer experience. ### Challenge: Phone number validation One issue during integration is inconsistent phone number formatting, especially with country prefixes (e.g., +1). A system might treat numbers with and without the prefix as different customers. **Solution**: A custom validation mechanism was built to normalize phone numbers and consistently assign them to the correct customer profile — ensuring accurate caller recognition every time. Check how we [integrated Caller ID with restaurant POS](/projects/restaurant-pos-caller-id/).
![Restaurant Caller ID](/images/restaurant_phone.jpg "Restaurant Caller ID")
## POS system integration - does it have to be customized? There are many out-of-the-box solutions for POS system integration that work well — especially for popular use cases like [POS integration with Uber Eats](/our-areas/uber-eats-pos-integration/) or major payment providers. However, off-the-shelf integrations don’t always solve the unique operational challenges businesses face. If you're a POS provider or a restaurant chain, you likely need to support diverse clients — each expecting that the point-of-sale system adapts to their specific workflows, platforms, and hardware. In these cases, custom integrations are often essential. That’s why partnering with a [POS integration company](/our-areas/food-delivery-pos-integration/) experienced in [point-of-sale system development](https://brightinventions.pl/our-areas/pos-software-development/) can be a strategic move. ## Watching People Talk - Drama Triangle at Work *Published: 2025-07-07 | Author: ula | Tags: leadership, communication, feedback* *Source: https://brightinventions.pl/blog/drama-triangle-at-work/index.md* Words are powerful. The way we speak to each other shapes how we feel, how we work, and even how we see ourselves. In a team setting communication can build trust or quietly break it down. Sometimes without even knowing it, we fall into roles in conversations that create drama, confusion, or stress. One of the most useful tools to understand this pattern is the Drama Triangle. ## ⚠️ what is the drama triangle The Drama Triangle was developed by Dr. Stephen Karpman in the 1960s. It is a model of dysfunctional social interaction. In this triangle, people take on one of three roles: **Victim** - feels helpless, stuck, or unfairly treated **Persecutor** - criticizes, blames, or controls **Rescuer** - jumps in to "save" others, often without being asked
 These roles can shift quickly during a conversation. One moment you feel like a helper, and the next you are being blamed, or you are blaming someone else. This triangle creates drama instead of solving problems.

 ## 🧐not manipulation, it’s a habit **The Drama Triangle is not something we consciously choose to play. Most of the time we slip into these roles unintentionally, driven by stress, emotional patterns, or unmet needs.** It is usually a subconscious reaction, not deliberate manipulation. We might jump in as the Rescuer because we want to be helpful, but we may unintentionally disempower others. Or we might take on the Victim role because we feel unheard or overwhelmed - not because we want pity. The Persecutor role can show up when we feel frustrated and try to take control, even if it means blaming others. These roles can switch quickly within a single conversation. **Someone might start off as a Rescuer, then feel unappreciated and become the Victim, and later respond with blame, slipping into the Persecutor role.** It is a cycle that creates emotional noise instead of clarity and connection. ## 🧠 why it matters at work In teams this unconscious pattern can show up during project discussions, code reviews, hiring conversations, or feedback sessions. **It leads to misunderstandings, defensiveness, and strained relationships, even when everyone has good intentions.** By becoming aware of the Drama Triangle, we can start recognizing when we are sliding into one of the roles and pause before reacting. This gives us a chance to step out of the triangle and respond more constructively with curiosity, ownership, and empathy.

![drama triangle](/images/drama-triangle-ula.png "")
## 👀 what does drama triangle can look like at work? The drama triangle can sneak into even the most well-meaning teams. It does not always sound dramatic or toxic. Often it is subtle. It hides behind frustrated questions, over-helping, or quietly taking on too much without speaking up. Below you can find a few common workplace scenarios where the drama triangle quietly takes the lead and how it affects collaboration without us even noticing. **Example 1: Project manager & developer** PM: *“This feature is still not done? We can’t afford more delays.”* (Persecutor) Developer: *“I’m doing my best, but priorities keep changing.”* (Victim) PM: *“Let me help you break it down so we can speed it up.”* (Rescuer) 👉 What’s missing? Clear ownership and honest conversation about scope, priorities, and planning. Each role reinforces tension rather than solving the real problem. **Example 2: QA engineer & developer** QA: *“There are still bugs in this release. Can you finally fix them?”* (Persecutor) Dev: *“I didn’t even know about those! Why does this always fall on me?”* (Victim) QA: *“Okay, I’ll log them again and try to verify myself.”* (Rescuer) 👉 The dynamic turns into blame and overwork, instead of teaming up on process improvements or clearer communication. **Example 3: Hiring manager & Recruiter** Recruiter: *“I’ve reached out to over 50 candidates, but very few responded positively.”* (Victim) Manager: *“Maybe we are being too picky. Let me look through the profiles myself.”* (Rescuer) Recruiter: *“I’m trying everything I can here.”* (Victim, again) 👉 Instead of a collaborative review of the sourcing strategy or refining the job ad, the triangle creates tension and subtle undermining. **Example 4: Boss & CTO** Boss: *“Why is our delivery speed slowing down?”* (Persecutor) CTO: *“We are doing what we can with the team size we have.”* (Victim) Boss: *“Maybe I should personally join the sprint planning next week.”* (Rescuer) 👉 Rather than addressing root causes like resource planning or technical debt, the conversation spirals into stress and overstepping. **Example 5: Marketing specialist & Manager** Manager: *“Why aren’t we seeing better engagement on this campaign?”* (Persecutor) Specialist: *“We tried everything, but the algorithm keeps changing.”* (Victim) Manager: *“Let me rewrite the ad copy myself.”* (Rescuer) 👉 This erodes trust, motivation, and learning opportunities. The triangle turns creative teamwork into subtle blame and micromanagement. ## 🚩the drama triangle in feedback processing Feedback is another place where the triangle often shows up especially when emotions run high. * Someone receiving feedback might feel attacked (Victim). * The giver might come across as blaming (Persecutor). * A third person might jump in to smooth things over (Rescuer), instead of helping both sides process and grow.
 That is why building a healthy feedback culture requires more than just “giving feedback.” **It means being aware of these subtle emotional patterns, staying curious instead of reactive, and focusing on shared goals instead of playing roles.** ## 🆘 how to step out of the drama triangle - reframing roles Just becoming aware of the drama triangle is already a powerful first step. **Once you notice the patterns, you can choose a different way to respond - one that leads to clarity instead of confusion, ownership instead of blame.** 

 [Building on Karpman’s work David Emerald offers a powerful alternative in his book The Power of TED.](https://www.dramykellermft.com/blog/drama-to-empowerment) He reframes these three roles into more positive, empowering ones that help break the cycle of drama. Instead of the Victim we become the Creator - taking responsibility and focusing on solutions. The Persecutor becomes the Challenger, who provides honest, constructive feedback without blame. And the Rescuer evolves into the Coach, supporting others to find their own answers rather than taking over. By adopting these new roles we can **shift out of the drama roles and run into constructive collaboration:** ✅ **From Victim to Owner** Instead of thinking *“This is happening to me”*, shift to *“What can I influence or ask for?”* Ask yourself: * What do I need right now to move forward? * Is there a request I can make instead of just expressing frustration? * Am I taking responsibility for what is actually mine (and not more than that)?
 💬 Instead of: *“There’s nothing I can do.”* **Try: “Here’s where I am stuck, and here is what would help.”** ✅ **From Persecutor to Challenger** Instead of blaming, challenge others constructively and stay solution-oriented. Ask yourself: * Am I criticizing, or am I helping someone grow? * Am I assuming negative intent, or staying curious? * Can I be direct and respectful?
 💬 Instead of: *“Why haven’t you done this yet?”* **Try: “What’s blocking progress on this? How can we solve it?”** ✅ **From Rescuer to Coach or Partner** Instead of fixing things for others, empower them to solve it themselves (with support if needed). Ask yourself: * Am I helping, or taking over? * Has this person asked for help, or am I jumping in by habit? * Can I offer support without removing ownership?
 💬 Instead of: *“I’ll take care of it for you.”* **Try: “How can I support you in figuring this out?”** Teams can also create **shared practices** to make drama less likely. For example, we can normalize asking questions before assuming intent and create psychological safety where people can admit mistakes without blame. Also making “ownership” part of your culture and knowing who is responsible for what really help. And last but not least - honest daily communication - use check-ins to surface emotions early instead of letting them leak into conflict. ## final thoughts

 The Drama Triangle isn not about bad people or broken teams. It is about human habits we all fall into, especially under pressure. It is natural. But when we notice it, we can shift. Instead of blaming, we can ask. Instead of rescuing, we can support. Instead of feeling like a victim, we can take ownership. The key is not to avoid emotion, but to notice the pattern and step out of the drama with intention and kindness. **Language shapes our world. And every time we choose a healthier way to speak, we help build a better one.** ❤️ ## One Codebase for iOS and Android with Kotlin Multiplatform *Published: 2025-07-01 | Author: szymon-g | Tags: mobile, kotlin, iOS* *Source: https://brightinventions.pl/blog/one-codebase-ios-android-kotlin-multiplatform/index.md* **In this article, I'll guide you step-by-step through creating a shared library, with a focus on implementing it for iOS via an XCFramework.**
![Kotlin Multiplatform](/images/blog_post_kmp_phone.png "Kotlin Multiplatform")
## Setting Up a Kotlin Multiplatform Library In Android Studio, I created a new project using the **"Kotlin Multiplatform Library"** template.\ During the setup, there's an option for iOS framework distribution, where you can choose between: * Regular Framework (built for one architecture) * XCFramework (supports all architectures) * CocoaPods (iOS dependency manager) I selected XCFramework because it fit my needs best and offered an easy way to integrate the shared code into the iOS project. ## Adding a Shared Kotlin Class Next, I added a simple Kotlin class to the shared module: ```kotlin class KotlinMultiplatformClass { fun greeting(): String { return "Hello from Kotlin Multiplatform!" } fun sum(a: Int, b: Int): Int { return a + b } } ``` This class is compiled into the shared library and will be available on both iOS and Android. ## Using the Shared Library on Android On Android, using the shared code is straightforward. You just add the shared module as a dependency and use the class directly in Kotlin code. No extra setup is needed beyond the standard Gradle configuration. ## Using the XCFramework in iOS To generate the .xcframework file, I used a Gradle task provided by the Kotlin Multiplatform plugin. This task can be executed from the Gradle tool window in Android Studio. Once the task completes, the .xcframework is available in the build output directory. To use the shared Kotlin code in an iOS project, I added the generated .xcframework to my Xcode project by including it in the project settings. After that, I imported the Kotlin module in the relevant Swift files. Swift using: ```swift import YourFrameworkName ``` Once imported, I could create an instance of the shared Kotlin class and call its methods directly in Swift: ```swift let kotlinMultiplatform = KotlinMultiplatformClass() print(kotlinMultiplatform.greeting()) ``` That’s it! The Kotlin logic is now fully accessible in Swift, and I can use the same logic on both platforms. ## Kotlin Multiplatform Tutorial – Conclusion Kotlin Multiplatform makes it incredibly easy to share core logic between Android and iOS. By using an XCFramework, you can integrate your shared Kotlin code into any iOS project with minimal setup.\ If you're maintaining two codebases and want to unify shared business logic, Kotlin Multiplatform is absolutely worth exploring. ## The Current Status of Test Fixtures Support in Android *Published: 2025-06-30 | Author: azabost | Tags: kotlin, android, gradle, testing* *Source: https://brightinventions.pl/blog/current-test-fixtures-support-android/index.md* **While test fixtures have been available in Gradle since 2019, their support in the Android Gradle Plugin is still evolving. With AGP 8.5, Kotlin sources in test fixtures are now supported in Android modules, but this feature remains experimental and is hidden behind a feature flag. Although a powerful tool for sharing test utilities across modules, test fixtures support in Android is not yet widely known or documented.**
![Test Fixtures Support in Android](/images/test-board.jpg "Test Fixtures Support in Android")
## The Evolution of Test Fixtures Support [Test fixtures](https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures) were first introduced in Gradle 5.6 back in 2019. This feature allows developers to create and share test utilities across modules, making it easier to maintain consistent testing approaches throughout a project. However, Android developers had to wait a few years before this functionality became available in their ecosystem. Test fixtures support was not added to the Android build system until the release of [Android Gradle Plugin and Android Studio Chipmunk](https://developer.android.com/build/releases/past-releases/agp-7-2-0-release-notes#test-fixtures). ## Initial Limitations The initial implementation of test fixtures in AGP had significant limitations. The support was better for Java than for Kotlin, creating a frustrating experience for many Android developers who had embraced Kotlin as their primary language. Specifically, an Android module (such as a library or application) could consume test fixtures from a standard Kotlin module (one using the Kotlin Gradle Plugin instead of the Android Gradle Plugin) without issue. The limitation was that an Android module itself could only define test fixtures written in Java, not Kotlin. This limitation was tracked in [Google's issue tracker](https://issuetracker.google.com/issues/219687418). ## Recent Improvements AGP 8.5 introduces support for Kotlin sources in test fixtures within Android modules. This improvement is currently behind an experimental flag, which might explain why it hasn't received much attention yet. The feature was tracked in [this issue](https://issuetracker.google.com/issues/259523353). ## Configuration Differences While test fixtures are supported in both standard Kotlin and Android modules, the configuration process differs between them. Getting started requires knowing about the experimental support and understanding the specific setup needed for each module type. For a standard Kotlin module, enabling test fixtures is straightforward: ``` plugins { id("kotlin") id("java-test-fixtures") // <-- this } ``` However, Android modules cannot use the `java-test-fixtures` plugin. Instead, they require a different configuration: ``` plugins { id("com.android.library") kotlin("android") } android { testFixtures.enable = true // <-- this } ``` Enabling Kotlin support in test fixtures for Android modules currently requires the following feature toggle in your `gradle.properties` file: ``` android.experimental.enableTestFixturesKotlinSupport=true ``` What currently makes this situation particularly challenging is that the [official Gradle documentation](https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures) omits the specific configuration required for Android modules. This can mislead developers into thinking that test fixtures should be enabled in the same manner across all module types. Moreover, the experimental flag for Kotlin support is not documented in the official Android documentation. This lack of documentation makes it difficult for developers to discover and utilize this feature, even though it has been available since AGP 8.5. The missing documentation is likely due to the experimental status of the feature, as experimental features often remain undocumented until they become stable. ## Conclusion While test fixtures support was added to Android significantly later than to Java or Kotlin, its arrival is a positive development. The recent addition of Kotlin support for test fixtures in Android modules is a welcome improvement that will make it easier for Android developers to create and share test utilities across their projects. This enhancement allows for more consistent testing approaches and better code organization, ultimately leading to more maintainable Android applications. ## Deep Research AI Tools: ChatGPT vs Claude vs Gemini vs Grok vs Perplexity *Published: 2025-06-27 | Author: rafal h | Tags: ai, research, productivity, ChatGPT* *Source: https://brightinventions.pl/blog/ai-deep-research-comparison/index.md* **The landscape of AI-powered research tools has evolved dramatically in 2025. What was once exclusive to premium tiers is now becoming more accessible, with providers racing to offer comprehensive internet search capabilities paired with source citations and detailed report generation. After extensive testing across five major platforms - ChatGPT Plus, Claude Pro, Gemini (Free), Grok (Free), and Perplexity Pro - I'm sharing my hands-on experience to help you choose the right tool for your research needs.**
![Deep research comparison](/images/ai_deep_search.png "Deep research - tools comparision")
## What is Deep Research? Deep Research represents a significant leap from simple chatbot interactions. These tools don't just answer questions - they actively search the internet, evaluate multiple sources, synthesize information, and generate comprehensive reports complete with citations. Think of it as **having a research assistant who can quickly scan through dozens (or even hundreds) of sources** and compile findings into a coherent narrative. ## The Contenders ### ChatGPT Deep Research (OpenAI) * **Pricing**: Plus tier ($20/month) and FREE tier * **Usage**: Free users get 5 lightweight queries/month, Plus users get 10 standard + 15 lightweight queries/month * **Strengths**: Exceptional accuracy and depth, based on o3 and o4-mini reasoning model ### Claude Research (Anthropic) * **Pricing**: Pro tier ($20/month) * **Usage**: Subject to standard message limits * **Strengths**: Thoughtful analysis, Google Workspace integration ### Gemini Deep Research (Google) * **Pricing**: FREE with limited uses, expanded access with Gemini Advanced subscription * **Usage**: Free users get "a few times a month", Advanced users get more * **Strengths**: Google ecosystem integration, powered by a good scored Gemini 2.5 Pro. ### Grok DeepSearch (xAI) * **Pricing**: Free tier available, SuperGrok subscription ($30/month) for expanded access * **Usage**: Limited queries for free users, expanded for Premium+ and SuperGrok users * **Strengths**: Real-time X (Twitter) data access ### Perplexity Deep Research * **Pricing**: Free with limits, Pro subscription ($20/month) for unlimited * **Usage**: Limited queries/day for free users, unlimited for Pro * **Strengths**: Speed (under 3 minutes), established search capabilities ## Deep Research Testing Methodology I evaluated each platform using the same complex research queries such as: 1. Technical feasibility assessments for project planning 2. Deep dives into unfamiliar topics 3. Deep dives into technical possibilities They were mostly related to web dev world, but I have also tried some deep search for personal advice (health or financial). ## Detailed Deep Research Comparison Please have in mind that this is my personal ranking as of today. The results might be completely different for your use case or usage. ### 1. ChatGPT Deep Research **What Sets It Apart:** ChatGPT's Deep Research uses a specialized version of OpenAI's o3/o4-mini model and can autonomously search for and read information from diverse online sources. The tool excels at understanding nuanced queries and diving deep into technical subjects. As noted by community members on X (including mentions by A. Karpathy), the quality difference is noticeable. **Best For:** * Complex project feasibility studies * Academic research * Technical deep dives where accuracy is paramount * Users already invested in the OpenAI ecosystem **Drawbacks:** * Limited monthly queries even on paid tiers * Can take up to 30 minutes for complex queries ### 2. Gemini Deep Research (Free) **What Sets It Apart:** Gemini Deep Research autonomously searches and deeply browses the web to find relevant, up-to-date information. Despite being free, it performs impressively well. Gemini users can try Deep Research a few times a month at no cost, and Gemini Advanced users get expanded access. **Best For:** * Users who need frequent research without subscription costs * Projects requiring data export to Google Workspace * General research tasks * Users already invested in the Gemini ecosystem **Drawbacks:** * Limited uses per month for free tier * Cryptic privacy settings (AFAIK you have to turn off your Gemini history to avoid training the model) ### 3. Claude Research **What Sets It Apart:** Artifacts look and feel & general UI/UX of the solution. The results are also good. **Best For:** * Users already invested in the Anthropic ecosystem **Drawbacks:** * Sometimes limits are kicking in. ### 4. Grok DeepSearch (Free) **What Sets It Apart:** xAI also introduced DeepSearch, a feature that scans the internet and X to generate detailed summaries in response to queries. Grok's strength lies in its real-time information access through X (Twitter) integration. **Best For:** * Current events research * Social media trend analysis * Quick fact-checking with X platform data **Drawbacks:** * Less comprehensive for deep academic research * Limited features in free tier * Can be inconsistent with factual accuracy ### 5. Perplexity Pro Deep Research **What Sets It Apart:** Deep Research on Perplexity not only attains high scores on industry benchmarks, but it does so while completing most research tasks in under 3 minutes. **Best For:** * Quick searches and summaries * Users already invested in the Perplexity ecosystem * Time-sensitive research needs **Drawbacks:** * Less depth compared to ChatGPT's Deep Research * May rely on easily available sources ## The Verdict: Best Deep Research AI After some testing, here's my ranking: 1. **ChatGPT Deep Research** - Accuracy and depth, now accessible even on free tier 2. **Gemini (Free) = Claude Research** - Excellent alternatives with different strengths 3. **Grok DeepSearch (Free)** - Good for specific use cases, especially real-time data 4. **Perplexity Research** - Fastest but less comprehensive In the end, if other features are turning you to given ecosystem (like Claude Code for Anthropic or Codex for OpenAI) just use deep search you are provided with when paying for subscription. ## Looking Forward The rapid democratization of deep research tools in 2025 is exciting. ChatGPT now offers Deep Research even to free users (though limited), Gemini provides free access with decent capabilities, and Perplexity maintains its speed advantage. The competition has intensified, with each platform carving out its niche. Remember, **the "best" tool ultimately depends on your specific use case, budget, and workflow preference**s. With free tiers now widely available, I recommend testing each platform to understand which works best for your research needs. In the end, what really matters is the usage of new technologies for fast and good research. - - - *Have you tried these deep research tools? Share your experiences and let me know which one works best for your research needs.* ## Top Mental Health Conferences 2025 *Published: 2025-06-26 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/mental-health-conferences/index.md* **If your calendar isn't full already, check out these mental health conferences that will still take place in 2025 across the globe.** ## 2nd International Conference on Mental Health and Human Resilience **Date**: July 21-22, 2025 **City**: London, UK **Ticket pricing**: from 599 USD to 1449 USD. This global gathering is dedicated to advancing the understanding, support, and advocacy for mental health, with a theme of "Mindfulness in Action: Cultivating Holistic Wellness." **Details**: [mentalhealth.novelticsconferences.com](https://mentalhealth.novelticsconferences.com/) ## Global Mental Health Research 2025 (MentalHeal2025) **Date**: July 14-16, 2025 **City**: Phnom Penh, Cambodia **Ticket pricing**: from 275 USD to 450 USD MentalHeal2025 is a premier event exploring the latest innovations, research, and strategies in mental health, bringing together professionals, researchers, policymakers, and academics from around the world. **Details**: [mental.health3000.org](https://mental.health3000.org/) ## Hong Kong International Mental Health Conference – “Navigating Life's Defining Moments” **Date**: November 6-8, 2025 **City**: Hong Kong **Ticket pricing**: from 50 USD to 3,800 USD Mind HK's third conference will focus on the evidence, psychology, and culture of mental health across the lifespan, with a dedicated Mental Wellbeing Festival for the public. **Details**: [hkmentalhealthconference.com](https://hkmentalhealthconference.com/) ## 7th Global Mental Health Summit **Date**: November 10-12, 2025 **City**: Cape Town, South Africa **Ticket pricing**: from 300 USD to 500 USD This premier event, organized by the Movement for Global Mental Health and the Global Mental Health Peer Network, will bring together experts to discuss the current state and future of mental health, with the theme "Mental Health and Wellbeing - What has Changed? What needs to Change. **Details**: [www.7thgmhsummit.org](https://www.7thgmhsummit.org/) ## 12th Global Summit on Mental Health and Resilience **Date**: November 6-7, 2025 **City**: Tokyo, Japan **Ticket pricing**: from 199 USD to 799 USD This summit aims to connect mental health leaders, advocates, experts, and academics to discuss new advancements, challenges, and novel findings in mental health and resilience. **Details**: [idias.org/etn/mhr-2025/](https://idias.org/etn/mhr-2025/) ## React Context and why not every child throws a re-render party *Published: 2025-06-25 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/react-context-rerenders/index.md* **React Context is a powerful tool that makes it easy to share data across multiple components, helping to avoid a common issue known as *props drilling*. While Context is sometimes mistakenly treated as a state management solution - especially in comparisons with tools like Redux - its primary purpose isn't managing complex application state. In this article, however, I want to focus on debunking a different myth: the belief that all components inside a Context Provider automatically re-render when the context value changes.**
![](/images/react_context.png "")
## Anatomy of Context The **React Context API** revolves around two main components: the **Provider** and the **Consumer**. The Provider is a component that wraps part of your component tree and makes data (**value** property in the Provider) available to all its descendants. Any component within this tree can become a Consumer (but simply being inside the Provider doesn’t make a component a Consumer) allowing it to access the shared data exposed by the Provider, at which point it becomes a Consumer. In short, the *Provider supplies the data*, and the *Consumers receive it -* no need to pass props manually through every level of the component tree. ### The Truth About Context and Re-renders You may already know ([and here's more on that](/blog/keys-and-re-renders-in-react)) that when a context value changes, React will re-render all components that subscribe to that context. But what about components that are simply nested inside the Provider and don’t use the context at all? Do they re-render too? One common misconception - often discussed as a downside of using Context is that: > All components inside a Provider re-render when the context value changes This would indeed be inefficient if it were true. But the reality is more nuanced. ### Context and Its Children Let’s look at a practical example ([available also here](https://reactplayground.vercel.app/#N4IgLgziBcBmCGAbCBTANCAbrK1QEsA7AExQA8A6AK1xHwFsAHAewCcwACAQUcY9lbN6HAOQUA9D0bUIZEQB1CDFuw4AlFPADGnAUNGtNOhUqZtOwDlsPwwKNc2acAvv0HCRNnQFpiQ8VqI+CiEYCaKWsyEEJyRofBEKKwcALwcfloArvQhYBQA5ihgAKKIKDmhAEIAngCSxAAUno5hAJQRUTEcgk6pVjZ2Dk4NcWAJhEnthD15hiRJDYoc6kZ51pp2peW5i4TLyxraeQDKYKz4OgCyzKRoS-uEmYiId3v7hzoU67YoWxVgDSkU2WU1aIAwUhkZBgdDMqg+YDQHEs3zsAGEonYyIiOJlUBjQuQcXiUKcfkiScVYLAUDoOK49MJ5CAvGBmQBuRQdaKcABy2QARkkCVjOGlUSgRUSGq1OYRuV1+fQhawpdiAAqCTD4UjJNINFEAC3wiGIc3prVSAD5kfc4l0ANqPZVJJGoMBKlUAXT6JLJdgaAAZZVy3pTqbSATLrba3st7ZwdX13bVCaxMEgGtGUjb3Z6Fnscxw9gBqDgARlaSIATIG6yH5XHukVMqw9tmbYFNKxU3Z05mdQ3ls4kQ6vQ37oYwK32-dlgAefOqzFEiia5ja3UcDOITIoFLAZ0q5xWuf7YBaY2mubOM-z8RLtV5debpKnt4N5xyhWcY6ZAUQNY+BCsQaJXsQfQdrG8adJwO57r6+IrtiDSPshYBDlYnTMGUFCIMw+SLCAf4AUBIFgSaEGGN4cy6igxDMhObxTjOHDzsQ+CYFaFGmtw0DIvBKDOPeHFcXKX6hgmHAAKrRP+gHnOR4GQZaRbAHa2G4fhhHMrJEDyWR9E8VRIR0QxIBMcsLFtmxonccplT8TEtgXCJnFWuJ34TGQKicKQCBPLomSEDo+BRNwvDRupzEtjZuz7GxaGEhqWo6m+Z4LiRCnAUZyniO+CULnpBmKbllEcPld4PoKwroS+aWsAVHCfuCIAxNUuFaBAtAUAKYB7NFyywJi3gQPgABeKD8dWhj0OJIDOM4QA)): ``` import React, { createContext, useContext, useState, useEffect } from "react"; const NumberContext = createContext(); const NumberContextProvider = ({ children }) => { const [number, setNumber] = useState(0); useEffect(() => { const id = setInterval(() => setNumber(n => n + 1), 2000); return () => clearInterval(id); }, []); return ( {children} ); }; const SubscribedChild = () => { const value = useContext(NumberContext); console.log("SubscribedChild re-rendered"); return
Child A: {value}
; }; const UnsubscribedChild = () => { console.log("UnsubscribedChild rendered"); return
Child B: static
; }; export default function App() { return ( ); } ``` According to the myth, you’d expect to see logs from both components every 2 seconds. But when you check the console, you’ll notice that **UnsubscribedChild** logs only once, while **SubscribedChild** logs on every update. Why is that? Only components that both are wrapped inside the Provider, and subscribe to the context using `useContext` or `` will re-render when the context value changes. The myth contains a grain of truth: sometimes, unintended re-renders can happen when a context contains multiple values, and even a change to one of them causes all subscribers to update - even if they only use part of the data. That’s why it’s a good practice to: 1. Keep contexts focused and minimal 2. Avoid using a single context for large, frequently changing state 3. Create multiple small contexts instead of one "big store" shared by many components However, we will focus on optimization techniques for Contexts another time. - - - ##### Take a look at our earlier blog post debunking frontend myths: 1. [To ‘b’ or Not to ‘b’: The Semantic Status of HTML ‘b’ Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) 3. [JavaScript Types De-Objectified](/blog/javascript-types-deobjectified/) 4. [Eye on ‘i’ — Understanding ‘i’ as a Semantic Element](/blog/understanding-i-as-semantic-element/) 5. [Breaking Down the “alt” Attribute Myth in img Tag Best Practices](/blog/breaking-down-alt-attribute/) 6. [The Truth About Keys and Re-Renders in React](/blog/keys-and-re-renders-in-react/) ## The List of 42 Smart Healthcare Devices (Regularly Updated) *Published: 2021-08-03 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/bluetooth-devices-that-change-healthcare/index.md* **Smart earrings, tattoos, smart socks, robot pets, and more... Discover the types of smart health devices transforming patient care with the Internet of Things (IoT). Also, meet [healthcare software development companies](/our-areas/healthcare-software-development/) that are behind these devices. The list is continuously updated.**
![smart devices healthcare](../../static/images/smart_devices_healthcare.png "smart devices healthcare")
**Contents** [Healthcare wearables](/blog/bluetooth-devices-that-change-healthcare/#smart-health-devices--wearables) [Remote patient monitoring & diagnostics devices](/blog/bluetooth-devices-that-change-healthcare/#remote-patient-monitoring--diagnostics-devices) [Chronic disease management devices](/blog/bluetooth-devices-that-change-healthcare/#chronic-disease-management-devices) [Healthcare assistance devices](/blog/bluetooth-devices-that-change-healthcare/#healthcare-assistance-devices) [FemTech devices](/blog/bluetooth-devices-that-change-healthcare/#femtech-devices) ## Smart health devices – wearables
![healthcare and fitness wearables](/images/wearables_dall-e.png "DALL-E generated image")
DALL-E generated image
### Multi-functional smartwatch They monitor stress levels, movement disorders, sleep tracking, blood pressure, heart disease. Due to their widespread popularity, these bluetooth health devices have the potential to evolve from mere fitness trackers to healthcare tools accessible to the masses. Companies: Brands like Fitbit and Garmin specialize in such devices. ### Smart ring Smart rings have shown promise in areas such as sign language recognition and the early detection of COVID-19 and other viral infections. They are also utilized for early detection and prevention of burnout and other mental disorders. Companies: Oura, Motiv, Ringly, and Nuanic are examples of companies that have developed smart rings, providing insights into human well-being. ### Smart earrings Researchers at the University of Washington are developing smart earrings capable of monitoring signs of stress, eating, exercise, and ovulation. Companies: this technology is mostly developed at universities.
![Image generated by DALL-E.](/images/smart_earrings.png "Image generated by DALL-E.")
### Smart bracelet A smart bracelet can as many wearables track vital signs. High-performance athletic wearables provide detailed insights into recovery, strain, and sleep, designed primarily for athletes and fitness enthusiasts. Companies: Fitbit, Garmin, Whoop specializes in athletic and lifestyle wearables. ### Smart tattoos Smart tattoos offer a promising future in the realm of personalized medicine including continuous health monitoring in a non-invasive and virtually unnoticeable manner. Companies: smart tattoos are still in the experimental stage, undergoing research. ### Smart headband Smart headbands are designed to monitor brain activity, stress levels, and sleep patterns. They often utilize sensors to collect data that can aid meditation, improve sleep, and manage neurological conditions. Companies: Muse and Emotiv produce headbands that are widely used in neurofeedback and mental health improvement applications. ### Smart belt Wearable smart healthcare devices that monitor physical fitness, track posture, and even alert users to health issues like irregular breathing or heart rates. They can also provide haptic feedback for posture correction. Companies: WELT is an example of a company that has developed smart belts with health tracking. ### Smart socks Smart socks monitor foot temperature, helping to detect early signs of inflammation or injury. Smart socks can also help with the fall prevention. Companies such as Siren and Palarum offer smart socks. ### Smart shoe insoles Smart shoe insoles are designed to fit inside footwear and provide real-time feedback on walking and running patterns. This technology is a proactive tool in diabetic foot ulcer prevention, helping to maintain foot health and mobility in patients with diabetes. Companies: Digitsole, Orpyx, Nurvv are leading smart shoe insoles providers. ### Smart contact lenses Connected contact lenses are innovative devices designed to monitor physiological conditions, like glucose levels or intraocular pressure, or to provide augmented reality displays. Companies: Companies like Alcon and Mojo Vision are pioneering this technology, aiming to merge vision correction with digital data display or health monitoring functionalities. ### Smart glasses These smart healthcare devices are particularly valuable for providing real-time patient data display, assisting with surgical procedures through augmented reality overlays, and improving accessibility for the visually impaired by enhancing residual vision or reading text aloud. Companies: Vuzix and Google, Apple are key players in the development of smart glasses. ### Fall-detection devices These smart health devices use sensors to detect falls among patients and the elderly, alerting caregivers and emergency services automatically. Companies: Lifeline develops fall-detection devices and sensors. ### Smart bandages They monitor wound conditions, such as moisture and temperature, and can deliver targeted drug treatments to improve healing processes. Companies: This bluetooth health device is still mostly in the prototype phase; if you know companies that are developing smart bandages, let us know in the comments. ## Remote patient monitoring & diagnostics devices
![Remote patient monitoring & diagnostics devices](/images/family_devices_dall-e.png "Image generated by DALL-E.")
Image generated by DALL-E.
### Pulse oximeter It monitors the oxygen saturation of the patient’s blood and displays the percentage of blood loaded with oxygen. Companies: Masimo, iHealth are examples of companies developing smart pulse oximeter ### Bluetooth thermometer Modern thermometer devices not only read a patient's temperature remotely but also send the data to the app that evaluates them. Companies: ihealth, Withings and Kinsa are examples of companies developing smart thermometers. ### Sphygmomanometer (electronic blood pressure monitor) These devices often feature wireless connectivity, enabling easy tracking and management of blood pressure readings. Companies: Omron, Withings and Qardio are examples of companies at the forefront of developing smart sphygmomanometers. ### Spirometer Devcies designed to measure lung function and help diagnose, monitor, and treat respiratory conditions such as asthma, COPD (chronic obstructive pulmonary disease), and cystic fibrosis. Companies: NuovoAir, AioCare are examples of companies known for developing innovative smart spirometers. ### Stethoscope It enables real-time and remote medical examinations that don’t have to be conducted by doctors. Caregivers not only can record a patient’s beating heart but even “broadcast” it live to the doctor. Check companies developing smart home stethoscopes: Stethome, Feelix@Home. ### Smart cardiac monitor These are medical devices that continuously measure and record heart activity, providing essential data for detecting heart conditions such as arrhythmias, heart attacks, and other cardiovascular issues. Their “smart versions” can be utilised by patients in home settings. Companies: SmartHeart is an example of a company manufacturing home cardiac monitors. ### Smart scale Smart scales that not only measure weight but also track body composition, including muscle mass and body fat percentage. Companies: Withings, Fitbit and Xiaomi are examples of companies selling smart scales ### Sleep monitors Devices that track sleep patterns and quality, providing insights into sleep cycles, disturbances, and overall sleep health. Companies: Fitbit, Philips, and Withings are notable producers of sleep monitoring devices that integrate with other health tracking systems. ### Skin cancer detection device A device that utilizes spectroscopy to evaluate skin lesions and detect potential skin cancers, recommending further analysis when necessary. Company: DermaSensor is leading the way with this innovative approach to early skin cancer detection. ## Chronic disease management devices
![chronic management devices](/images/chronic_diseases_devices_dall-e.png "Image generated by DALL-E.")
Image generated by DALL-E.
### Artificial pancreas Medtronic and Insulet are known for their development of artificial pancreas systems that automatically adjust insulin levels in diabetic patients. Companies: Medtronic, Insulet are developing artificial pancreas ### Smart pillbox Smart pillboxes help manage medication schedules and ensure adherence to prescriptions and provides alerts whenever something is due. Companies: Tinylogics, and PillDrill are developing smart pillbox. ### Smart med dispenser A smart medication dispenser intelligently manages and dispenses prescribed drugs, ensuring that patients take the correct dosage at the right times, thereby improving adherence and overall treatment efficacy. Companies: Hero is one of the companies developing smart dispensers. ### Smart inhalers Smart health devices that help manage respiratory conditions like asthma or COPD by tracking usage patterns and medication adherence, and sometimes providing feedback on inhalation technique. Companies: Propeller Health and Teva Pharmaceuticals offer advanced connected inhaler systems that sync with mobile apps for real-time monitoring. ### Glucose monitoring systems They provide continuous or flash monitoring of blood glucose levels, helping individuals with diabetes manage their condition more effectively. Companies: Dexcom and Abbott Laboratories are leading manufacturers of CGM (continuous glucose monitoring) systems, offering devices that deliver real-time glucose readings and trend data. ### Wearable device to track epilepsy This bluetooth health device is focused on monitoring and analyzing symptoms of epilepsy, aiding in the effective management of the condition. Company: Neurava is at the forefront of developing these innovative wearable devices. ### Wearable for monitoring of chronic kidney disease A wearable device for the arm that uses non-invasive methods to prevent and monitor chronic kidney diseases, offering a new approach to managing this widespread health issue. Company: Metyos is pioneering this technology with its cutting-edge wearable device. ### Devices for chronic pain Description: Smart health devices designed to deliver neuromodulation therapy, effectively managing chronic pain conditions and improving quality of life. Company: Nalu Medical is known for its advanced pain management devices. ### Gloves reducing hand tremors These gloves are engineered to stabilize hand movements for patients with Parkinson’s disease, helping to reduce tremors and improve daily functionality. Company: Various is in the development stages for this type of assistive technology. ## Healthcare assistance devices
![Healthcare assistance devices](/images/home_smart_devices_dall-e.png "Image generated by DALL-E.")
Image generated by DALL-E.
### AI voice assistant AI-driven voice assistants to help manage health by providing medication reminders, scheduling doctor’s appointments, and offering health advice. Companies: Nuance and Orbita offer AI voice assistants. ### Assistive robot Robots can assist staff in hospitals by automating routine tasks like fetching and delivering supplies. Company: Diligent Robotics is an example of the company developing robots supporting hospital staff. ### Robot pet Companies like Joy for All create robotic pets designed to provide companionship for the elderly, which can help reduce stress and provide emotional support. Company: Joy for All offers pets for emotional support. ### Smart carpet They are designed to enhance elderly care by detecting falls and unusual walking patterns, and alerting caregivers to potential issues. Company: SensFloor by Future-Shape is a notable example of this technology. ### Digital mirror It provides health and beauty insights, integrates with other health devices, and supports teleconsultation. Companies: CareOS ang Neurologic develop smart mirrors. ## FemTech devices
![FemTech devices](/images/femtech_devices_dall-e.png "Image generated by DALL-E.")
### Breast self-examination device A device specifically designed to enable women to perform regular breast self-examinations at home, which is crucial for early detection of breast cancer. Company: Glooma and Dotplot are aim to empower women to monitor their breast health effectively. ### Devices for urinary incontinence treatment These devices can include wearable sensors that detect moisture and send alerts to a smartphone app, allowing users to track incidents and patterns. Some advanced systems also offer pelvic floor training programs to strengthen muscles and reduce incidents of leaks. Companies: Elvie and INNOVO are notable in the field of devices for urinary incontinence. ### Fertility tracker devices These devices often track physiological markers such as basal body temperature, hormone levels, or menstrual cycle patterns to predict ovulation and optimize the chances of conception. Companies: Ava, Kegg and Clearblue are leading manufacturers in this sector. ### Breastfeeding monitor Devices designed to assist nursing mothers by tracking breastfeeding sessions, monitoring the baby’s intake, and analyzing feeding patterns. This information helps mothers manage their feeding schedules and ensures adequate nutrition for the baby. Company: Coro is one of the pioneers in breastfeeding monitoring. ### Smart breast pump Modern breast pumps connected to a dedicated app enable monitoring of milk volume, tracking of pumping sessions, and offer guidance to optimize the pumping experience. Companies: Elvie, Willow and Freemie offer smart breast pumps. ### Hot flush relief bracelet A piece of smart jewelry that automatically tracks hot flashes for women experiencing menopause, offering relief by triggering cooling at the onset of a flush. Companies: Grace is the manufacturer developing bracelets for women with menopause. ## Top Healthcare Conferences to Attend in the USA in 2025 *Published: 2024-02-08 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/healthtech-conferences-usa/index.md* **Are you planning to attend health conferences in the USA? Dive into the list of top healthcare conferences 2025 USA!**
![Digital Health Conferences USA](../../static/images/us_healthtech_conferences.png "Digital Health Conferences USA")
## 2025 AHA Leadership Summit **Date**: July 20-22, 2025 **City**: Nashville, TN **Ticket pricing**: up to $1,475 **Number of attendees**: Not specified, but unites senior healthcare executives, clinicians, and industry experts. The AHA Leadership Summit unites senior healthcare executives, clinicians, and industry experts to explore innovative strategies for improving care quality, enhancing financial stability, tackling workforce challenges, and elevating the patient experience. Details: [leadershipsummit.aha.org](https://leadershipsummit.aha.org/) ## HLTH **Date**: October 19-22, 2025 **City**: Las Vegas, NV **Ticket pricing**: up to $2,395 **Number of attendees**: 12,000+ HLTH is a leading event that brings together senior leaders to solve healthcare's most pressing challenges and realize the most promising opportunities to create health's future, showcasing the latest technological innovations for the entire health ecosystem. Details: [hlth.com/](https://hlth.com/2025event) ## Healthcare conferences 2025 that already took place in the USA ### ViVE **Date**: February 16-19, 2025 **City**: Nashville, TN **Ticket pricing**: up to $2,395 **Number of attendees**: 9,000+ ViVE is the premier, curated event experience for digital health decision makers focusing on the business of healthcare. Details: [www.viveevent.com](https://www.viveevent.com/) ### HIMSS **Date**: March 3-6, 2025 **City**: Las Vegas, NV **Ticket pricing**: up to $1645 **Number of attendees**: 35,000+ A 4-day event with an exhibition offering many opportunities to network with other digital health leaders. **Details**: [himssconference.com](https://www.himssconference.com/en/homepage.html) ### Health 2.0 **Date**: March 4–6, 2025 **City**: Las Vegas, NV **Ticket pricing**: up to $3000 **Number of attendees**: Information not provided The Health 2.0 Conference deliberates on ways to boost the global healthcare ecosystem by bringing the brightest minds in healthcare and wellness under one roof. **Details**: [www.health2conf.com/usa-2025](https://www.health2conf.com/usa-2025) ### Digital Health 2025 **Date**: May 12-13, 2025 **City**: Nashville, TN **Ticket pricing**: up to $1,595 **Number of attendees**: 300+ Digital Health is an interactive and decision-maker-driven event helping to forge meaningful connections with key decision-makers. Details: [events.reutersevents.com/healthcare/digital-health-usa](https://events.reutersevents.com/healthcare/digital-health-usa) ### Digital Healthcare Innovation Summit (DHIS) East **Date**: May 19-20, 2025 **City**: Boston, MA **Ticket pricing**: up to $1,599 **Number of attendees**: Information not provided A conference for investors, startups & emerging companies, tech companies, payers, providers, veteran advisors, and more. Details: [events.reutersevents.com/](https://events.reutersevents.com/healthcare/digital-health-usa) ## Microsoft Clarity for Web & Mobile Development: Benefits, Challenges, and Alternatives *Published: 2025-06-12 | Author: izabela | Tags: design, frontend* *Source: https://brightinventions.pl/blog/microsoft-clarity-software-development/index.md* **Users rarely have time to give you feedback – so it's up to you to uncover insights yourself. This article explores how Microsoft Clarity can help you better understand user behavior through tools like heatmaps and session recordings. It also compares Clarity with other popular analytics solutions such as Hotjar and PostHog. Let’s dive in!**
![Microsoft Clarity](/images/microsoft_clarity_blog_post.png "Microsoft Clarity")
## Microsoft Clarity Pricing This tool has emerged as a hot must-have in analytics, especially among marketing specialists, thanks to the fact that Microsoft Clarity is **free to use**. Naturally, when something is free, it often means that our data becomes the product – and Microsoft is transparent about this on their [website](https://clarity.microsoft.com/pricing):

Clarity is built by Microsoft, one of the largest technology companies in the world. Microsoft processes a massive amount of anonymous data around user behavior to gain insights and improve machine learning models that power many of our products and services. Clarity is one of the ways Microsoft gathers this important data—and why we've made it available for free.
From the Microsoft Clarity webpage
Before adding the Clarity script to your website, web app, or mobile application, it’s essential to **review Microsoft Clarity [privacy policy](https://learn.microsoft.com/en-us/clarity/faq#privacy)**. This is critical if you represent sensitive sectors such as banking, government, or healthcare, where sharing user data with a third-party service may not be acceptable. ## Microsoft Clarity Features That’s all for the disclaimers – let’s now discuss what Clarity actually offers. Clarity is widely used for website analytics, but it can also be used to **analyze web and mobile applications**. It supports Android, iOS, React Native apps, and Microsoft has just announced that the Clarity Flutter SDK is now available to everyone as well, following the completion of beta testing. ### Session Recording You can watch your users’ sessions to identify issues such as: * **Dead clicks** – when users click on something that isn’t clickable. This usually indicates a design issue where an element *appears* interactive but isn’t. * **Rage clicks** – when a user clicks repeatedly on an element out of frustration. This typically means the element doesn’t work, is too slow to respond, or gives no feedback. * **Roadblocks** – anything that prevents users from reaching a goal you’ve defined – such as submitting a form. ### Heatmaps Microsoft Clarity’s heatmaps are a type of report that allows you to generate visual insights based on filtered categories of users visiting specific pages. These heatmaps help you understand how users interact with your site or app. For example, you can analyze: * **Most-clicked or tapped areas** – see which elements attract the most interaction. * **Attention hotspots** – discover where users focus their attention. Interestingly, this isn’t always the area above the fold. * **Scrolling behavior** – measure how far users scroll. ## How to use Microsoft Clarity in software Development ### Testing and debugging Clarity helps you **reproduce bugs quickly** by letting you watch exactly what happened. It also provides useful technical details such as **device specifications, browser type, and screen resolution**. Example of information about the user:
![Microsoft Clarity](/images/microsoft_clarity_session_info.png "Microsoft Clarity")
### Getting user feedback without engaging them directly Users in industries like healthcare, transportation, and retail are often too busy to provide valuable feedback. That’s where Clarity comes in – **you can gain insight into their behavior without interrupting their workflow**. For example, you might observe users visiting a new feature screen but not interacting with it – a signal that something may need adjustment. Here’s an example of an insight generated by Clarity’s AI from one of our blog user sessions:
![Microsoft Clarity - session insights example](/images/microsoft_clarity_session_insights.png "Microsoft Clarity - session insights example")
AI summaries are especially useful when you need to extract insights from hundreds of session recordings. Usually, collecting data is the easy part – but finding the time to analyze it is the real challenge. ### Legacy software modernization and redesign Clarity is highly effective when [modernizing or redesigning legacy software](/our-areas/app-modernization/). It helps you **identify ways to make key features more user-friendly** and efficient – which is especially important for solutions used daily by frontline workers, such as [custom point-of-sale systems](/projects/system-for-restaurants/), [transport management software](/projects/transportation-management-system/), or [electronic health record platforms](/projects/emar-healthcare-solution/). During the redesign process, Clarity allows you to **spot patterns in how users interact with existing features** – patterns worth preserving – as well as **roadblocks and frustration points** that should be eliminated in the modernized version. For example, Clarity can help you identify **which sections of your page attract the most user attention**. During a redesign, this insight helps ensure you maintain focus on those high-impact areas – as long as they naturally align with your goals for that specific page. Here's an example of key takeaways for a website:
![Microsoft Clarity key takeaways](/images/key_takeaways_example_clarity.png "Microsoft Clarity key takeaways")
## Does Microsoft Clarity slow down your website or apps There’s no clear-cut answer to this question – any additional script has the potential to impact your website or web [app’s performance](/blog/healthcare-app-performance-monitoring/). The best way to know the actual effect is to **measure your performance metrics before and after implementing the Clarity script**. A particularly important consideration is using **Clarity in mobile applications**. Based on our experience, **the impact can vary**. In some projects, we observed performance issues – especially on older mobile devices – while in others, there were no complaints or signs of degradation. That’s why it's essential to follow a test-and-measure approach. **Implement and test performance as early as possible**. Testing in a staging environment is recommended, but it might not expose all edge cases. If performance issues arise – for instance, on older Android devices – you can re-configure the Clarity script. You have the option to **adjust the snippet so it fires only on specific devices or operating systems**. **You can also fire it temporarily** – for example, shortly after launching a crucial feature to observe user behavior. ## Microsoft Clarity alternatives No tool is perfect, so our team at [Bright Inventions](/) enjoys testing various solutions to find the one that gives the most value for a certain business and domain. Check out these Microsoft Clarity alternatives. ### Microsoft Clarity vs Hotjar Session recording and heatmaps are the core features of a quite popular tool – Hotjar (but free plan is limited). Explore main key differences and similarities between both tools. | Feature | Microsoft Clarity | Hotjar | | -------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | Pricing | Free (but you pay with your data) | Free plan with limited features; paid plans start at ~$39/month | | Session Recordings | Yes – unlimited recordings | Yes – limited by plan | | Heatmaps | Yes – includes click, scroll, and attention heatmaps | Yes – includes click, move, and scroll heatmaps | | User Filtering | Yes – strong filtering and segmentation options | Yes – advanced options available on higher-tier plans | | Surveys/Feedback | No | Yes – includes feedback widgets and surveys | | Privacy & Data Usage | Data is used by Microsoft for machine learning – requires disclosure to end users | GDPR/CCPA compliant – more privacy-focused, especially on paid plans | | Mobile App Support | Yes – supports web apps, native apps (Android/iOS), React Native; Flutter in beta testing | Limited – mostly for websites and web apps | | Performance Impact | Lightweight script, but testing is recommended – particularly on mobile | Slightly heavier script; potential performance impact on large or complex websites | ### Microsoft Clarity vs Posthog If you're concerned about your app's performance – or already know that Clarity affects its speed – consider using PostHog for its Wireframe Mode feature. This is how [PostHog](https://posthog.com/docs/session-replay/mobile) describes their solution:

The view hierarchy is transformed to a JSON data structure and later rendered as an HTML wireframe. Since it is a wireframe, the UI won't have the original look and feel but it should be close enough to understand the user's behavior.
From the PostHog webpage
Below is an example of a screen captured in wireframe mode in Android:
![PostHog](/images/screenshot_2024-07-31_at_3.16.16_pm.png "PostHog")
Source: [posthog.com/docs](https://posthog.com/docs/session-replay/mobile) And here’s a detailed Microsoft Clarity vs PostHog comparison: | Feature | Microsoft Clarity | PostHog | | -------------------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- | | **Pricing** | Free | Free tier (up to 1M events/month), with paid plans for higher volume and advanced features | | **Session Recordings** | Yes – unlimited and automatic | Yes – with advanced options like Wireframe Mode for better performance on mobile | | **Heatmaps** | Yes – click, scroll, and attention heatmaps | Yes – clickmaps and scrollmaps | | **User Interaction Data** | Rage clicks, dead clicks, scroll depth, session filters | Clicks, hovers, session replays, funnels, retention, and custom events | | **Wireframe Mode** | Not available | Yes – drastically reduces load during mobile session recording by using JSON-based wireframes | | **Mobile App Support** | Web and mobile web; limited native mobile support (React Native, Flutter beta) | Full support – Android, iOS, React Native, and Flutter (with performance-optimized recording) | | **Privacy & Data Control** | Data sent to Microsoft and used for machine learning | Self-hosted or cloud – full control of your data (ideal for privacy-conscious orgs) | | **Integrations** | Growing number of integrated solutions e.g. GA4, Zapier, HubSpot, Firebase. | Wide plugin system, API access, and integrations with tools like GitHub, Segment, Zapier | | **Custom Reporting** | Limited – prebuilt behavior-focused reports | Extensive – customizable dashboards, SQL-like queries (HogQL), and advanced segmentation | | **Ease of Use** | Easy setup, non-technical friendly interface | More technical – developer-oriented, but highly customizable | | **Performance Impact** | Lightweight script, but mobile performance varies | Wireframe Mode helps maintain app speed, especially on low-end or older mobile devices | ### Microsoft Clarity vs. Google Analytics In case you wonder, **Google Analytics (GA4) is not really an alternative to Clarity**. At this moment, both tools complement each other. **GA4 provides a more quantitative perspective** mostly appreciated by marketing specialists such as number of users, sessions, time on page, traffic sources, demographic data. **Clarity helps you understand the “why” behind metrics that GA4 reveals** with focus on actual user behavior valuable for UX-designer, QAs, developers. Ideally, they should be used together in modern user behavior analytics – as long as your business is comfortable sharing data with both organizations: Microsoft and Google. ## Data isn’t just for marketing specialists Maybe some still believe that data analysis is mainly for marketing specialists and data analysts – but it should also be a key part of the software development process. Whether you're a developer, QA engineer, designer, or project manager, product decisions work best when they’re grounded in data. That’s the approach we take at Bright Inventions. If you’re not getting meaningful feedback from your end users, **we can help you find ways to gather insights without disrupting their experience**. It’s something we already do, for example, when [collecting feedback from POS system users](/blog/how-to-gather-actionable-feedback-inside-a-pos-system/). [Contact us](/start-project/) to explore how we can support your solution! ## Building Frontends, Embracing AI: A Look into Michał’s Career *Published: 2025-06-10 | Author: michal-bu | Tags: bright insights* *Source: https://brightinventions.pl/blog/building-frontends-embracing-ai/index.md* **It took Michał only one day to choose his career path – but the spontaneity of that decision didn’t stop him from thriving in his work. Discover how Michał embraces AI in his daily routine, why he appreciates a feedback-driven culture, and whether he feels intimidated by the fullstack developers around him.**
![Frontend developer career story](/images/brightstorymichalo_grid_new.png "Frontend developer career story")
## When did you decide you wanted to be a programmer? It was a bit of an accident. In high school, my plan was to work on a ship. I applied to the\ Maritime University of Szczecin, but I wasn’t accepted due to poor eyesight. The problem was that I found out only one day before I was leaving for a sailing trip. Since the university admission process was set to begin during that time, I had just **one day to make a quick decision about my future** and prepare my application documents before I left. I figured **computer science would be a good direction** – though I don’t remember exactly why – and I called the West Pomeranian University of Technology in Szczecin to ask if I could already bring in my application documents, even though they were officially starting to accept them a few days later. They agreed, and in the end, I was accepted. It turned out I was quite good at it and felt comfortable with it. During my studies, I landed an internship where they eventually offered me a job as a Java developer. That's when I had **my first contact with a commercial project**, but then I was moved to [web development](/our-areas/web-development/), and it's been that way ever since. ## What is it like to be a frontend developer surrounded by fullstack developers? I approach it with the mindset that if backend work were ever required of me, I’d be ready to handle it. I’ve **worked as a fullstack developer in previous roles**, and even here at Bright Inventions, I had the opportunity to do fullstack work on another project. So if the need arises, I’d find my way. ## What do you like about the project you're working on? I really **enjoy the level of freedom and independence** I have – which also comes with responsibility. I’m the only person on our team handling the frontend, so a lot depends on how I set things up, and **I’m accountable for the outcomes** – both good and bad. I’ve also noticed that **the client places a lot of trust in me** when it comes to decision-making, and that really means a lot.
![Quote on freedom](/images/michal_quote_freedom.png "Quote on freedom")
## How does your cooperation with the product designer look on a daily basis? I have a great working relationship with our designer – she gets guidelines from the product side, and then **we discuss the details together**, especially if something might be problematic or if there’s a way to improve the experience for users. I don't feel super confident choosing fonts or colors, but I do have a good sense of which interface elements work well in certain places. I’m not just handed a finished design and told to build it – she actually comes to me early on, and **we often talk things through before the design phase even begins**. ## Which AI tools do you use daily at work? I use GPT every day – it’s helpful for programming tasks. For those, I usually rely on **GPT o4-mini-high**. If I need to review my messages or write something more user-friendly, I use **GPT-4o**. I’m also testing **JetBrains' AI assistant and “Junie”** – I play around with them from time to time – and of course **GitHub Copilot**, but that’s kind of standard nowadays. I’ve been checking how well Junie handles different types of tasks. My first real use case was when I had to review a set of fields that were no longer in use. **I gave Junie a list of types along with the corresponding files, and it had to go through the project to identify what could be removed**. It actually did quite well. I had to tweak the prompt a few times, because it didn’t catch every resource on the first try, but eventually it went through everything and gave me a list of which fields were still in use and which weren’t. Something that would have taken me a few days, I managed to complete in just one day with its help.
![A glimpse from Michał’s honeymoon in Santorini.](/images/greece_michal.png "A glimpse from Michał’s honeymoon in Santorini.")
A glimpse from Michał’s honeymoon in Santorini.
## What made you want to join Bright Inventions? It happened at a time when my previous company was making cuts, and a few people were let go – including me. **Bright Inventions was recommended to me by Arek**, who I had worked with before – he had moved to Bright and encouraged me to reach out. After that, I spoke with Ula and Mateusz, and we really clicked during that interview. At the time, I was looking for a new place to settle into – I’m not a fan of jumping from job to job. What really appealed to me was the **[feedback culture](/blog/8-mistakes-you-make-while-giving-constructive-feedback/)** at Bright Inventions. I get the sense that if I ever started falling short or there was room for improvement, **I’d get that feedback in a way that’s constructive and actionable**.
![Quote on communication skills.](/images/michal_quote_communication_skills.png "Quote on communication skills.")
That feedback culture is useful in everyday life too. The communication skills you develop – like **expressing how you feel without shifting blame onto someone else** – are really valuable. It helps you say things like how you’ve been feeling lately in a constructive way. It’s important to talk about all kinds of things, even small ones, and to try to understand the other person’s intentions. ## What cultural differences do you face at work while working with the U.S. client? We live in such a global village now that the **U.S. feels culturally quite close to us**. Both in business and in daily life, we consume the same media and share the same cultural bubble. I don’t notice major cultural differences in my day-to-day work.
![Sailing across Gdańsk Bay during a rainy team retreat.](/images/team_retreat_sailing_rain.png "Sailing across Gdańsk Bay during a rainy team retreat.")
Sailing across Gdańsk Bay during a rainy team retreat.
## What do you enjoy doing after work? After hours, I enjoy spending time with my cats and experimenting in the kitchen. I don’t necessarily stick to Polish recipes; I like trying out dishes from different cuisines. For example, I was in Portugal with my wife and we really liked a cod dish casserole we had there – one of the first things I did when I got back was try to recreate it, and it turned out almost exactly the same.
![Michał’s cats.](/images/michal_cats.png "Michał’s cats.")
Michał’s cats.
I also like playing computer games. Right now, I’m playing Clair Obscur: Expedition 33 – in my opinion, it’s a masterpiece, especially the music. Other than that, I mostly play RPGs, World of Warcraft, and games like that. ## Offboarding with Heart - Making the Last Chapter Counts *Published: 2025-06-09 | Author: ula | Tags: leadership, communication* *Source: https://brightinventions.pl/blog/offboarding-with-heart-making-the-last-chapter-counts/index.md* Letting people go used to be one of the hardest parts of my job (and sometimes it still is). I would lose sleep over it, overthink conversations, and feel an overwhelming sense of guilt. In the beginning every offboarding used to feel personal, and I struggled to separate my emotions from the process. **But over time I realised that offboarding is not just about endings, it is about transitions, and it is about turning goodbyes into growth.** It is a human experience that requires empathy, honest conversations, and a commitment to ensuring respect for everyone involved. **It is also good to understand that there comes a point when holding onto a professional relationship does more harm than good, both for the individual and the company**. Whether it is a mismatch in expectations, a shift in business needs, or simply a role that no longer fits, saying goodbye sometimes is crucial. While done right offboarding is not just about closing a chapter, it is about helping a company or someone who works there turn the page to the next opportunity. ## personal struggles In the beginning of my HR journey offboarding felt like that one part of the job that I wasn’t sure how to navigate. The awkwardness, the uncertainty, and the whole “I don’t want to say it, but I need to say it” moment. I have never seen offboarding as just another task to check off in a list. For me it has always been much more than that. When I hire someone, I do deeply believe in them. I see potential, I imagine how they will grow within the team, and I invest in their success. So, when the moment comes to let someone go, it probably always may feel a bit personal. It is not that I don’t understand the reasoning behind the decision. It is that delivering this type of news has always been one of the hardest things I might have to learn. **It made me feel like I had failed them - failed the employee, the team, and the organisation.** As if I had created a problem rather than solved one, and that I had wasted both the candidate’s time and the company’s. And honestly? It is also because I genuinely like the people that come. They are my team. I have never believed in bad intentions - only in circumstances, mismatches, or situations that didn’t unfold as we hoped. ## making a transition Over time I have come to see offboarding differently. It is not just about ending a chapter. It is about setting the stage for the next one. **Sometimes, letting someone go is not about rejection, it is about redirection**. Keeping them in a role that is not the right fit doesn’t do them any favors. It just keeps them from opportunities that could be much better for them. I know this might sound like sugarcoating. But it is not. I genuinely cheer for every person I have to say goodbye to. I know that for them this moment is often one of the toughest in their career. That is why I approach it with empathy, honesty, and as much support as I can offer. **It is still sometimes difficult for me, but I have also learned that no matter how much I want something to work out, sometimes it just won’t - and that is okay.** It’s the same when someone leaves the company I work for. I always feel a bit sentimental. I cheer them on and fully understand they have their own reasons for the decision, but a part of me still feels sad that it didn’t work out. At the same time, I really admire their courage to make a change. ## leaving a positive legacy **I have always believed that the true measure of collaboration is not about how we start working together - it is about how we part ways.** There was a reason we begin this journey together. It could not have been all wrong. No one forced us into it. Along the way, there were wins, lessons learned, and moments worth remembering even if in the end things do not turn out as planned. Offboarding is not just a formal goodbye, it is a reflection of your company’s culture and how you treat people - even when they are leaving. A poorly handled offboarding process can leave a sour taste, not just for the person leaving but for your remaining team, too. **If your company prides itself on being a great place to work, then the way you handle departures should reflect that.** A well-executed offboarding process shows you care even when things are not going according to the plan. It is about making sure people leave on good terms. Not everyone is suited to lead an offboarding process. Too often, I hear about managers handling it mechanically, like choosing what to eat for breakfast. I get it - stress plays a big role in these situations. **But if you can’t approach offboarding with empathy and respect for the person affected, it is better to step aside and let someone who can.** **When I go through an offboarding process, I see a person - a human being - not a job title.** So, if this chapter is coming to a close, the least I can do is make sure it ends with dignity, respect, and a genuine appreciation for the time we shared. Because at the end of the day, offboarding is not just about paperwork. ## consequences of holding on too long l admit there were times when I held on to a person or situation a bit too long. **I have tried to convince myself that somehow, magically or with huge effort of both sides, everything would work out.** Maybe after the next sprint, or maybe after the next release, things would click. Any honestly sometimes they did, but usually they didn’t. If someone is not the right fit for the job, sticking with them for too long just causes friction both for them, the team, and the client. It is like trying to force a square peg into a round hole, no matter how much you try, it is just going to get worse. But it works both ways. If you start feeling that the company or the role isn’t right for you, the result is often the same - frustration, burnout, or simply a sense of not belonging. **Letting go, even if difficult, can be the healthiest choice for everyone involved.** It is even harder when accoriding to you everything is going well, but sometimes it is the best choice for both sides. For the individual, it opens up the opportunity to take a role that actually fits and lets them thrive. And for the company, it frees up resources to bring in someone who will add more value. In the very long run it is a win-win. ## how to end collaboration with empathy All managers and leaders have awkward moments where the “exit interview” feels more like a bad breakup than a professional conversation. **But the secret tool is empathy.** There are a few tips to make the process smoother and a little less cringe: * **Be honest, but kind.** You do not need to sugarcoat things, but at the same time, do not turn the conversation into a list of all the things the person did good or wrong. **Be transparent about why the decision was made, but also acknowledge the contributions.** Every team member, no matter how long they were with you, brought something valuable. Recognize it.  * **Offer support.** Offboarding does not mean cutting ties completely. Depending on the situation, offering career advice, sharing job opportunities, or simply connecting them with your network can make all the difference. **Don’t be afraid to help someone get to the next step, even if it is not within your company.** * **Keep the door open.** Don’t make the departure feel like the end of the world. Who knows, maybe you will cross paths again down the line or they might come back to your team as a boomerang employee. In the tech world you never know when a past employee could be your next colleague. Keep the relationship cordial and professional. * **Respect the decision.** When an employee decides to leave, it is important to handle the transition with gratitude. Their decision may come from a desire for growth, a career shift, or personal reasons. Regardless of why they are moving on, showing kindness in their departure leaves the door open for future connections and reinforces a positive workplace culture. ## growth through change Looking back I have come to understand that **offboarding is not a failure, it might be a part of the journey.** It might be about growth not only for the person leaving, but for the team and the organization, too. **At the same time I believe some offboardings can be avoided. Clearer expectations, better onboarding, regular feedback, and honest conversations, especially early on, can help spot misalignments before they become too big to fix.** When we invest in mutual understanding and ongoing support, we give people (and ourselves) a real chance to grow in the right place. Adam Grant once said that *You don't have to have it all figured out to move forward. You just have to be honest about where you are at.* This quote captures something essential about healthy team dynamics as **the key to progress is not perfection it is honesty**. In the workplace we often avoid tough conversations because we feel we need to have all the answers before we speak up. **But when we are honest early about mismatched expectations, unclear roles, or personal challenges, we can adjust, support each other, and prevent situations from escalating into disconnection or offboarding.** Regular feedback loops, check-ins, and psychological safety allow everyone to be transparent about what is working and what is not. That’s how teams evolve together. We do not do it by pretending things are fine, but by having the courage to say that we need help moving forward. ## Switching from Android Studio to IntelliJ IDEA for JetBrains Junie *Published: 2025-05-16 | Author: azabost | Tags: android, AI, agent* *Source: https://brightinventions.pl/blog/switching-from-android-studio-to-idea-for-junie/index.md* **IntelliJ IDEA Ultimate can be a viable alternative to Android Studio for Android development, offering additional features like [JetBrains Junie](https://www.jetbrains.com/junie/) agent. While most Android development features used on daily basis function correctly, some niche plugins and features specific to Android Studio are not available. This post explores the differences, limitations, and benefits of making the switch.**
![Switch from Android Studio to IntelliJ IDEA](/images/android-studio-to-idea.jpg "Switch from Android Studio to IntelliJ IDEA")
## Why Switch from Android Studio to IntelliJ IDEA? As an Android developer, I've been using Android Studio for years. It's a specialized IDE built specifically for Android development, based on the IntelliJ platform. This isn't my first attempt at switching to IntelliJ IDEA - I've tried once or twice a few years ago but always ended up returning to Android Studio due to various issues including incompatibility problems, bugs, and outdated Android support that lagged behind Android Studio. Recently, I decided to give it another try and switch to IntelliJ IDEA Ultimate primarily to use the [JetBrains Junie](https://www.jetbrains.com/junie/) AI agent, which is currently not available in Android Studio. The AI assistant capabilities were the main motivation behind this transition, as they have the potential to enhance productivity in daily development tasks. It's important to note that I'm not planning to replace Android Studio entirely this time. My intention is to use both IDEs as needed and eventually return to Android Studio as my primary development environment once it starts supporting Junie. This way, I can ensure I always have access to the latest Android-related features and bug fixes while still benefiting from AI assistance in the meantime. If you're interested in AI-assisted development for Android, Szymon recently made a detailed comparison between [Cursor](https://www.cursor.com/) and [Junie](https://www.jetbrains.com/junie/) agents for Android development in [his blog post ](/blog/cursor-vs-junie-for-android/). ## The Current State of Android Development in IntelliJ IDEA Once the Android plugin is installed, the majority of features needed for daily Android development work fine in IntelliJ IDEA. The core Android development experience is largely intact, including: * Building and running Android applications * Debugging and profiling apps * Managing emulators and devices * App Inspection (Network, Database and Background Tasks Inspectors) * Layout editor and preview * Jetpack Compose support * and many more However, there are some notable differences and limitations that developers should be aware of before making the switch. ## Differences and Limitations ### 1. K2 mode Starting with IntelliJ IDEA 2025.1, the [K2 mode is enabled by default](https://blog.jetbrains.com/idea/2025/04/k2-mode-in-intellij-idea-2025-1-current-state-and-faq/). In my case, it [caused certain issues](https://youtrack.jetbrains.com/issue/IDEA-373172/Gradle-files-and-buildSrc-are-becoming-unusable-unresolved-references-no-code-completion-etc.) in some places (e.g. `buildSrc` or `kotlinx.serialization.Serializable` classes). K2 mode can be disabled in IDEA settings: `Languages & Frameworks / Kotlin / Enable K2 mode`. However, if you do that, the IDE won't support some of the newer Kotlin features, such as: - guard conditions in `when` with a subject - non-local break and continue - multi-dollar string interpolation - context parameters ### 2. Android Plugin Version One of the most significant differences is that IDEA's Android plugin may be outdated compared to the latest stable Android Studio. This can lead to missing features or compatibility issues with newer Android APIs or Gradle versions. Examples of recent issues include: * [a plugin compatibility problem](https://youtrack.jetbrains.com/issue/IDEA-363218/Android-plugin-not-compatible-with-2024.3.-New-version-cannot-be-found-in-the-IDE) * [a problem with creating a new Android project](https://youtrack.jetbrains.com/issue/IDEA-369539/Exception-when-creating-a-new-Android-project) * [a mysterious Gradle sync warning](https://youtrack.jetbrains.com/issue/IDEA-370039/Method-AnalysisSchema.getDataClassTypesByFqName-isnt-supported-by-Gradle-v8.10.2) You can see that IDEA needs to merge the upstream Android Studio updates regularly ([example here](https://youtrack.jetbrains.com/issue/IDEA-367722)), which can lead to delays in their availability. ### 3. Missing Bundled Plugins Android Studio comes with several bundled plugins that are not available on the JetBrains Marketplace, meaning they cannot be easily installed in IntelliJ IDEA. These include: * Firebase Services * Firebase Testing * Test Recorder * Android APK Support * Android NDK Support * Android SDK Upgrade Assistant * Google Cloud Tools for Android Studio * App Links Assistant The absence of these plugins can limit functionality for some developers who rely on them. ### 4. Plugins That Can Be Installed in IDEA Several Android Studio plugins can be installed manually in IntelliJ IDEA: * Android (the core plugin that you must install to work with Android projects) * Android Design Tools * Jetpack Compose * Smali Viewer ### 5. Plugin Functionality Overlap It's worth noting that not all missing plugins might be critical, as there's a possibility that some functionality could be duplicated by other plugins available in IDEA, though I haven't thoroughly tested this. For example: * IDEA includes a "Jetpack Multiplatform" plugin which might serve as an alternative to the "Jetpack Compose" plugin from Android Studio, though their functionalities may not be identical. * IDEA can open APK files despite lacking the "Android APK Support" plugin, though I suspect the functionality may differ. However, don't expect features like Firebase Assistant, App Links Assistant, or NDK support to appear automatically if their dedicated plugins are missing. ### 6. Known Issues with Workarounds #### Library Source Navigation Navigating to a 3rd party library source code doesn't work by default as if the sources were not available ([related issue](https://youtrack.jetbrains.com/issue/IDEA-352729/Intellij-fails-to-automatically-download-sources-despite-having-the-Download-sources-option-enabled-in-the-settings)) **Workaround:** Enable the "Download sources" checkbox in "Advanced Settings" in IDEA and trigger Gradle sync. #### Creating New Files in Android View Mode If Project view is in "Android" mode, you can't create a new file (the "New" menu option is grayed out). **Workaround:** Switch the mode to "Project" to fix the problem. ## Conclusion Switching from Android Studio to IntelliJ IDEA Ultimate for Android development is feasible, especially if you need IDEA-specific features. Most core Android development features work well, but you should be prepared for some limitations and potential workarounds. Before making the switch, consider your specific workflow and the tools you rely on. Chances are, you won't miss anything from Android Studio. For many developers, the benefits of using IntelliJ IDEA's additional features outweigh the limitations, especially since the core Android development experience remains largely intact. ## How to Migrate Android App to Flutter: Step-by-Step Guide *Published: 2025-06-04 | Author: szymon-g | Tags: flutter, mobile development, android* *Source: https://brightinventions.pl/blog/migrating-from-android-app-to-flutter/index.md* If you already have an existing app written in Android and want to gradually introduce Flutter (e.g., one screen at a time), the good news is: **you don’t need to rewrite the entire project**. You can successfully **migrate your Android app to Flutter** step by step. In a previous blog post, I showed how to [migrate from iOS app to Flutter](https://brightinventions.pl/blog/migrating-from-ios-app-to-flutter/). In this article, we’ll focus on the Android side of the journey and explore multiple ways to integrate Flutter into your existing native app. Let’s see how we can **migrate an app from native Android to Flutter** with minimal friction and maximum flexibility. ## Project setup The official Flutter documentation provides detailed steps for integrating Flutter into an Android project: [Flutter Add-to-App – Android Project Setup](https://docs.flutter.dev/add-to-app/android/project-setup) In this post, we'll skip the basic configuration and go straight to the part developers care about most: **how to launch Flutter screens from your Android app**. We'll look at several methods - from the simplest one to more advanced use cases involving cached engines and inter-platform communication. ## Default FlutterActivity This is the simplest way to launch Flutter from Android - without specifying custom routes or entrypoints. Perfect for testing or initial migration. ```kotlin context.startActivity(FlutterActivity.createDefaultIntent(context)) ``` In Dart, your app entrypoint might look like: ```dart void main() { runApp(const DefaultScreen()); } ``` ## Cached FlutterEngine Creating and caching a **FlutterEngine** gives you more control and allows reuse across multiple launches, improving performance. ```kotlin val engine = FlutterEngine(context) engine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) FlutterEngineCache.getInstance().put("engine_id", engine) ``` Then launch Flutter using the cached engine: ```kotlin val intent = FlutterActivity .withCachedEngine("engine_id") .build(context) context.startActivity(intent) ``` ## Custom entrypoint + initialRoute This lets you define a custom Dart function instead of the default main(), and you can also control which screen Flutter starts with using initialRoute. ```dart @pragma('vm:entry-point') void routedMain() { runApp(MaterialApp( initialRoute: '/', routes: { '/': (_) => Text('Default'), '/about': (_) => Text('About screen'), }, )); } ``` ```kotlin val engine = FlutterEngine(context) engine.navigationChannel.setInitialRoute("/about") engine.dartExecutor.executeDartEntrypoint( DartExecutor.DartEntrypoint( context.assets, FlutterMain.findAppBundlePath(), "routedMain" ) ) FlutterEngineCache.getInstance().put("engine_id", engine) val intent = FlutterActivity .withCachedEngine("engine_id") .build(context) context.startActivity(intent) ``` ## Communicating with Flutter via MethodChannel For advanced integration, you can use a MethodChannel to dynamically send data from Android to Flutter - like which screen to show or what state to update. ```kotlin val engine = FlutterEngine(context) engine.dartExecutor.executeDartEntrypoint(...) FlutterEngineCache.getInstance().put("engine_id", engine) val channel = MethodChannel(engine.dartExecutor.binaryMessenger, "com.example.events") channel.invokeMethod("events", screenName) startActivity(FlutterActivity.withCachedEngine("engine_id").build(context)) ``` ```dart @pragma('vm:entry-point') void eventMain() { runApp(const EventScreen()); } ``` ```dart enum Event { loading, firstView, secondView; static Event? fromString(String value) { return Event.values.firstWhere( (e) => e.name == value, orElse: () => Event.loading, ); } } class EventScreen extends StatefulWidget { const EventScreen({super.key}); @override State createState() => _EventScreenState(); } class _EventScreenState extends State { final _channel = MethodChannel('com.example.events'); final ValueNotifier currentEvent = ValueNotifier(Event.loading); @override void initState() { super.initState(); _channel.setMethodCallHandler((call) async { if (call.method == 'events') { final parsed = Event.fromString(call.arguments ?? ""); if (parsed != null) { currentEvent.value = parsed; } } }); } @override Widget build(BuildContext context) { return MaterialApp( home: ValueListenableBuilder( valueListenable: currentEvent, builder: (context, value, _) { switch (value) { case Event.firstView: return FirstView(); case Event.secondView: return SecondView(); case Event.loading: return LoadingView(); } }, ), ); } @override void dispose() { _channel.setMethodCallHandler(null); super.dispose(); } } ``` ## Which method should I use? Not sure which approach is right for your use case? Here's a practical guide: * **You want to quickly test or prototype a Flutter screen. Use Default FlutterActivity** This method is very easy to set up and doesn’t require any extra configuration. However, it creates a new FlutterEngine every time the screen is launched, which results in noticeably slower startup. It’s best suited only for internal testing and proof-of-concept work. * **You want to reuse the Flutter engine and display a specific screen. Use Cached FlutterEngine with initialRoute or custom entrypoint** This method gives you better performance by caching the FlutterEngine, so the app doesn’t need to initialize Flutter on each launch. Additionally, it allows you to set the initial route or entry function, which is useful for showing predefined screens. Ideal for integrating simple, self-contained Flutter screens such as about pages. * **You need full control and want to pass data or interact with Flutter dynamically. Use MethodChannel communication** This is the most flexible and powerful approach. It allows two-way communication between Android and Flutter at runtime, enabling you to send data. Perfect for scenarios where Flutter needs to be deeply integrated into your app’s business logic or dynamic flows. ## Migrate Android app to Flutter – Summary Migrating from native Android to Flutter doesn’t have to be all-or-nothing. You can start small - with a single screen - and expand gradually as your team gains experience and confidence. This hybrid approach lets you test Flutter’s benefits in production without risking the stability of your entire app. ## How to Integrate Payment Providers into a POS System: A Strategic Overview for Modern Restaurants *Published: 2025-05-30 | Author: agata | Tags: POS* *Source: https://brightinventions.pl/blog/payment-provider-pos-integration/index.md* **Point of Sale** systems have evolved into multi-functional platforms that support diverse payment methods, helping restaurants offer seamless and cashless customer experiences. In recent years, benefit-linked discount cards like [10bis](https://www.10bis.co.il/next/en/), [Sodexo](https://us.sodexo.com/employee-portal), [Square](https://squareup.com/us/en), [Stripe](https://stripe.com/en-pl/payments), [Benefit Systems](https://www.benefitsystems.pl/en/), and [Edenred](https://www.edenredbenefits.com/) have also become popular—especially as part of company benefit programs. So, how do you integrate such providers into a POS system efficiently and securely? **Let’s explore the key [POS integration](/blog/pos-integration/) options.** ## Why Integrate with Payment Providers? • Meet customer expectations for fast, flexible, cashless payments • Enable support for company benefit programs and loyalty schemes • Improve operational speed and reduce manual errors • Unlock analytics on payment behavior
![payment provider integration](/images/pos_software_development_mobile.png "")
## Key Integration Variants ### 1. API-Based Integration The POS communicates with the payment provider’s servers directly via REST APIs in real time. * Ideal for iPad, Windows, and cloud-based systems * Supports cards, mobile wallets, benefit cards * Requires strong security compliance (e.g., PCI DSS) ### 2. Payment Terminal Integration The POS connects to a physical terminal via USB, Bluetooth, or LAN. * Common in fixed hardware setups * Works with terminals from vendors like Verifone or banks ### 3. SDK-Based Integration Payment functionality is embedded directly into the POS app via a software development kit. * Great for mobile-first apps or custom user flows * Requires tracking SDK updates and maintenance ### 4. Middleware / Aggregator Integration A third-party provider handles communication with multiple payment platforms. * Fast to implement * Reduces the need for custom development * Ideal for businesses scaling across regions
![why integrate with payment providers](/images/chatgpt-image-may-30-2025-03_28_51-pm.png "Why integrate with payment providers")
## Real-Time Payment Flow Example * Customer places an order * At checkout, they choose a payment method: cash, credit card, or benefit-linked card * If using a benefit card, the system checks its validity and applies relevant discount rules (e.g., 10% off lunch orders) * Payment is processed * The order is automatically sent to the kitchen or bar * The transaction is recorded in the daily financial summary ## Real Client Use Case A fast-growing restaurant chain wanted to expand their payment options to include employee benefit cards like [10bis](https://www.10bis.co.il/next/en/) and [Value Card](https://home.valuecard.co.il/). We integrated their iPad and Windows-based POS system with a real-time API flow, enabling customers to apply benefit-linked discounts at checkout. The result: Employee meal redemptions increased by 35% in the first month, and order processing became faster and more error-free for staff. ## Our Know-How: As a [POS software development company](/our-areas/pos-software-development/), we’ve helped restaurants and retail brands design smart, integrated payment solutions. Whether you’re integrating a single provider or scaling across platforms and regions, we’ve got the experience to support you. [Let’s talk](/start-project/)! ## JetBrains Junie & AI Assistant vs Cursor for Frontend Developers – Which AI Agent Comes Out on Top? *Published: 2025-05-26 | Author: rafal h | Tags: AI, cursor, Junie, Jetbrains, productivity* *Source: https://brightinventions.pl/blog/jetbrains-junie-ai-assistant-vs-cursor-frontend-developers/index.md*
![JetBrains Junie & AI Assistant vs Cursor for Frontend Developers](https://brightinventions.pl/static/fac12b008ce40322ae70e7bab825e0cc/4a130/c05852c0-38dc-40d2-bc8f-47ba0fa9bdc6-1-.webp "JetBrains Junie & AI Assistant vs Cursor for Frontend Developers")
## Background Today I reactivated my JetBrains (JB) subscription so I could take **Junie** and the **AI Assistant** for a test‑drive. Since **February** I have been working mostly in **Cursor**, especially on frontend code (React, React Query, MUI). I switched due to a rise of frontend AI tools and AI editors which are major web dev tools now. I wanted to check whether it is worth coming back to JB and see what has changed—features such as project‑wide **Local History**, stronger **3‑way merge** or good **refactor** capabilities have always been placing Jebtrains on top of other IDEs for me. ## The Task The feature I had to implement to test those was simple but multifile: in an application that lists projects I needed to **add an option for creating a new project**, but with a **type selection shown in a modal**. I prepared the implementation **without MCP servers**. ## JetBrains Junie & AI Assistant ### Pros * **Junie produced a solid first draft.** With the same specification and by adding the relevant files to the context it generated a clean, sensible solution—better than Cursor on the first attempt. * **Strong “core” IDE features.** JB still offers project‑level Local History, much better conflict merging, refactoring and the other things that make it a good IDE. * **Extra AI Assistant tricks.** Some functions, for example **AI‑powered rename**, are not available in Cursor. ### Cons * **Noticeably slower autocomplete.** AI Assistant completion felt slower than in Cursor and at times failed to appear at all. * **Slower refinement loop.** The pace of applying feedback or refactoring was lower and the AI Assistant did not always hit the mark. * **Limited AI customisation.** There is no way to split rules/context into smaller files; Junie works with a single, general file. ## Cursor ### Pros * **Agent mode with Sonnet 3.7 matched Junie.** For this feature implementation it performed very similarly. * **Greater flexibility.** Cursor lets you split files or AI rules into smaller pieces, define your own modes, and even perform web‑based editing; the AI Assistant currently offers only web based chat (edit is in Beta and it is offline). * **Additional modes.** Things like documentation indexing are available. * **Editable plan mode.** You can tweak the execution plan while coding, giving you tighter control. * **Faster context management.** Adding files to the context is much quicker; in AI Assistant you have to use the “+” button every time. I am **not discussing history or checkpoints**—both tools handle those well enough IMHO. ## Summary: AI tools for frontend development For now **Cursor** still comes out on top for me—mainly because of its **speed, customisation options and overall flexibility** when it comes to AI assistance. JetBrains has made real progress since February and **Junie can deliver pleasant surprises**, but it still needs a bit more polish before it can fully compete with Cursor. What is your opinion on that? ## Migrating from iOS App to Flutter – a Painless Getting Started Guide *Published: 2025-05-23 | Author: szymon-g | Tags: mobile development, iOS, flutter* *Source: https://brightinventions.pl/blog/migrating-from-ios-app-to-flutter/index.md* Migrating iOS app from native to Flutter doesn't have to mean rewriting your entire app from scratch. If you have a working iOS app and you want to enjoy the benefits of Flutter you can introduce it gradually — a great way to **migrate iOS app to Flutter** without a full rewrite. In this post, I'll show you step-by-step how to add Flutter to an existing iOS project, and the different ways to run Flutter views - from the simplest to more optimized ones. ## Adding flutter to an existing iOS application To integrate Flutter into an existing iOS app, I followed the official [Add to App](https://docs.flutter.dev/add-to-app/ios/project-setup) guide provided by the Flutter team. The documentation outlines multiple integration paths - it's important to choose the one that best fits your project setup. In my case, I used the "Link and Embed frameworks in Xcode" approach. ## Quick start: FlutterViewController with initialRoute The easiest way to launch a Flutter view in an existing iOS app is to create a new `FlutterViewController` and set the initialRoute. Flutter: ```dart @pragma('vm:entry-point') void routedMain() { runApp(RoutedApp()); } class RoutedApp extends StatelessWidget { const RoutedApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( initialRoute: '/', routes: { '/': (_) => const DefaultScreen(), '/about': (_) => const AboutScreen(), }, ); } } ``` iOS: ```swift struct RoutedFlutterScreen: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> FlutterViewController { let flutterEngine = FlutterEngine() flutterEngine.run(withEntrypoint: "routedMain", initialRoute: "/about") return FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) } func updateUIViewController(_ uiViewController: FlutterViewController, context: Context) {} } ``` This approach has a defect - each time a new FlutterEngine is created and the run() method is called, which starts the Flutter application from scratch. Why is this a problem? The flutterEngine.run(...) method performs a full initialization of the Flutter engine, including loading the entire Dart VM runtime and loading the entire application. Worse yet, this call blocks the main thread and can cause the application to temporarily “hang”, or what is known as a UI freeze. From the user's point of view, the screen may look “cropped” before the Flutter view appears. ## Optimization: FlutterEngine singleton To avoid delays every time the Flutter view is launched, a better approach is to prepare the FlutterEngine instance once - typically at application startup. This is most often done in the AppDelegate, where the engine is initialized and started only once during the app’s lifecycle. iOS: ```swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { flutterEngine.run(withEntrypoint: "routedMain") return true } ``` iOS: ```swift let controller = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) ``` By doing this, Flutter doesn’t need to be reloaded every time a Flutter screen is opened - the engine is already running, so transitions to Flutter views happen instantly. Of course, calling flutterEngine.run(...) still takes time (in my case, ~233 ms on average), but this cost can be absorbed naturally during app startup, when other resources are being loaded anyway. This makes the delay imperceptible to the user, while giving you the benefits of a pre-warmed engine. But beware - this approach has its limitations. If you run FlutterEngine.run(...) once with a specific entrypoint and initialRoute value, you can't change them later directly from iOS. ## Communication via MethodChannel If you want to switch Flutter views dynamically, you can use MethodChannel instead of initialRoute. iOS: ```swift struct MethodChannelScreen: UIViewControllerRepresentable { let screenName: String let flutterEngine: FlutterEngine func makeUIViewController(context: Context) -> FlutterViewController { let controller = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) let channel = FlutterMethodChannel( name: "com.example.events", binaryMessenger: controller.binaryMessenger ) channel.invokeMethod("events", arguments: screenName) return controller } func updateUIViewController(_ uiViewController: FlutterViewController, context: Context) {} } ``` Flutter: ```swift @pragma('vm:entry-point') void eventMain() { runApp(const EventScreen()); } enum Event { loading, firstView, secondView; static Event? fromString(String value) { return Event.values.firstWhere( (e) => e.name == value, orElse: () => Event.loading, ); } } class EventScreen extends StatefulWidget { const EventScreen({super.key}); @override State createState() => _EventScreenState(); } class _EventScreenState extends State { final _channel = MethodChannel('com.example.events'); final ValueNotifier currentEvent = ValueNotifier(Event.loading); @override void initState() { super.initState(); _channel.setMethodCallHandler((call) async { if (call.method == 'events') { final parsed = Event.fromString(call.arguments ?? ""); if (parsed != null) { currentEvent.value = parsed; } } }); } @override Widget build(BuildContext context) { return MaterialApp( home: ValueListenableBuilder( valueListenable: currentEvent, builder: (context, value, _) { switch (value) { case Event.firstView: return FirstView(); case Event.secondView: return SecondView(); case Event.loading: return LoadingView(); } }, ), ); } @override void dispose() { _channel.setMethodCallHandler(null); super.dispose(); } } ``` To get around the limitation of not being able to change the initialRoute after FlutterEngine starts, we can take advantage of the communication between native code and Flutter using MethodChannel. This is a mechanism that allows us to exchange data and call methods between Dart and Swift (and vice versa). In this approach: * FlutterEngine is started once, at the start of the application * native code sends data to Flutter when the view is shown, e.g., telling it what screen should appear * Flutter responds to this data and dynamically switches the view ## Performance Migrating an existing iOS app to Flutter introduces some performance overhead — particularly noticeable during app startup. I measured launch times in two different scenarios using Xcode's App Launch instrument: * Launching the native iOS app **without** the Flutter framework * Launching the iOS app **with** the Flutter framework embedded All tests were conducted on an iPhone 12, in **release mode**, using the Instruments app. The app was **force-closed**, and the device was **rebooted before each run** to avoid any warm-start effects. Each result represents the **average of 10 separate runs**. Here's a breakdown of the startup phases (in milliseconds): | Scenario | Create the process | Frameworks initialize | Static Runtime Initialization | |:--------------------------------:|:------------------:|:----------------------:|:-----------------------------:| | Without Flutter framework | 519.95 ms | 81.23 ms | 3.07 ms | | With Flutter framework embedded | 512.27 ms | 188.19 ms | 6.88 ms | As shown above, the inclusion of the Flutter framework results in a 106.96 ms increase in the Frameworks initialize phase and a 3.81 ms increase in Static Runtime Initialization. Additionally, I measured the average time for calling `flutterEngine.run()`, which was **~233 ms**. This call triggers the initialization of the Dart runtime and begins executing your Flutter entrypoint. Since this happens only once (if using a pre-warmed engine), the cost is incurred upfront but avoids delays during Flutter screen transitions. ## Migrate iOS app to Flutter – Summary Migrating to Flutter in an existing iOS app doesn't have to be complicated. You can migrate gradually, starting with a single screen and choosing the approach that best fits your app's needs — that's the beauty of a gradual **migrate iOS app to Flutter** process. ## Efficient S3 File Upload Pipeline with Presigned URLs, Event Triggers, and Lambda Processing *Published: 2025-05-20 | Author: kuba-s | Tags: S3,, AWS, Lambda, Architecture* *Source: https://brightinventions.pl/blog/efficient-S3-file-uploads-with-async-processing/index.md* **Uploading files to S3 via pre-signed POST URLs allows clients to upload securely and efficiently without routing large payloads through your backend. You can enforce upload rules like file size and required metadata using S3 form conditions. A Lambda trigger processes the file after upload — extracting metadata and saving records to a database. This approach offloads heavy lifting to AWS, improves scalability, and keeps your architecture clean — but requires handling async workflow.** ## The Problem Storing files in S3 is a common requirement for web and mobile applications — whether you're dealing with profile pictures, documents, videos, or logs. But designing the upload flow isn't just about sending bytes to a bucket. How files get uploaded and how you process them afterward can have a huge impact on system performance, cost, reliability, and security. ### Uploading files through your backend The most straightforward approach is to let the client send the file to your backend server, and then have the server upload it to S3. **Here’s why that’s not ideal:** * **Double handling:** Your server receives the file, buffers it, and then forwards it to S3 — doubling the network I/O and increasing processing time. * **Server load:** Large files can consume memory and bandwidth, especially when multiple users upload concurrently. * **Latency:** The user waits for the file to upload to your server and then to S3, which slows down the perceived performance. While simple to implement, this architecture doesn't scale well, especially when handling large files or high volumes of uploads. ### Letting the client upload directly to S3 To avoid server bottlenecks, a common alternative is to let the client upload directly to S3. In this model, the user sends the file straight to S3 from the frontend, and once the upload finishes, the client notifies your backend. **This improves efficiency but introduces two major concerns:** * **Security risk:** Uploading directly requires credentials with permission to s3:PutObject. Exposing AWS credentials in frontend code is a security risk — they can be extracted and misused. * **Unreliable notifications:** The client is responsible for notifying the backend after the upload. But what if the user closes their browser before the notification is sent? Your system may never learn that a file was uploaded. Clearly, both options have trade-offs. What we need is a secure, efficient way to upload files from the client — without overloading the backend — while also ensuring the backend is reliably notified and can process the uploaded content. ## Solution To solve both the performance and reliability problems, we can rethink the flow by combining several AWS features — presigned URLs, S3 event notifications, and AWS Lambda. **Here’s how it works:** 1. The backend generates a presigned URL and returns it to the client. Optionally, it can also store metadata about the expected upload in a database. 2. The client uploads the file directly to S3 using the presigned URL. 3. Once the upload completes, S3 triggers a Lambda function via an event notification. 4. The Lambda processes the uploaded file and stores any necessary metadata in the backend database — such as size, type, custom S3 metadata, or the result of scanning or parsing the file. This gives you the best of both worlds: * Fast and secure direct uploads from the client to S3 * No exposure of AWS credentials * Guaranteed backend processing without relying on the client to notify anything Let’s break down each part. ### Backend: Generating a presigned POST URL Using the AWS SDK, we can generate a presigned POST with custom conditions and expiration. Here’s an example in TypeScript: ```typescript // upload/presign.ts import { S3Client } from "@aws-sdk/client-s3"; import { createPresignedPost } from "@aws-sdk/s3-presigned-post"; import { randomUUID } from "crypto"; const s3 = new S3Client({ region: "us-east-1" }); const BUCKET = process.env.BUCKET_NAME!; export async function createPresignedUpload(userId: string, contentType: string) { const key = `uploads/${randomUUID()}`; const { url, fields } = await createPresignedPost(s3, { Bucket: BUCKET, Key: key, Conditions: [ ["eq", "$Content-Type", contentType], // Enforces exact content type ["eq", "$x-amz-meta-user-id", userId], // Enforce user ID is sent in metadata ["starts-with", "$x-amz-meta-name", ""], // Enforce frontend to provide file name ["content-length-range", 0, 10 * 1024 * 1024], // Limit file size to 10MB ], Fields: { "Content-Type": contentType, "x-amz-meta-user-id": userId, }, Expires: 900, // 15 minutes }); return { url, fields, key }; } ``` **Explanation:** This creates a short-lived URL used to upload the file. The `fields` are pre-filled form values that the client may submit with the upload — these can include known headers like Content-Type as well as custom metadata fields prefixed with x-amz-. The `conditions` block defines the rules that S3 will enforce when validating the upload request. * The file must not exceed 10 MB. * The Content-Type must exactly match the expected MIME type. * The upload must include a custom metadata field x-amz-meta-name, with value provided by the frontend, used to store the original file name. * A custom metadata field x-amz-meta-user-id must be included. This demonstrates how to pass metadata into the upload — in this example, the userId could come from your database or be extracted from a decoded JWT, allowing uploads to be tied to a specific user. S3 enforces these conditions at the time of upload. Any missing or mismatched field will cause the upload to fail. Note that only known headers and metadata fields prefixed with `x-amz-meta-` are stored as custom metadata — other arbitrary fields are ignored. ### Frontend: Upload file and attach metadata ```typescript async function uploadFile(file: File) { // 1. Request upload parameters from backend const res = await fetch("/api/upload/presign", { method: "POST", body: JSON.stringify({ contentType: file.type, }), headers: { "Content-Type": "application/json" }, }); const { url, fields, key } = await res.json(); // 2. Construct form data with all backend-provided fields const formData = new FormData(); Object.entries(fields).forEach(([k, v]) => { formData.append(k, v as string); }); // 3. Frontend adds its required metadata (enforced by backend policy) formData.append("x-amz-meta-name", file.name); // 4. Final field must be the actual file formData.append("file", file); // 5. Upload directly to S3 const uploadRes = await fetch(url, { method: "POST", body: formData, }); if (!uploadRes.ok) { throw new Error("Upload failed"); } console.log("Upload succeeded:", key); } ``` ### 3. S3 Triggers Lambda S3 can emit **event notifications** when certain actions occur on a bucket—like when a new object is created, deleted, or restored. These events can be used to trigger downstream processing automatically, such as invoking a Lambda function. **Common use case:** Trigger a Lambda function every time a new file is uploaded to a specific folder in a bucket (e.g., for image processing, virus scanning, or moving data into a database). **Setting up S3 as a Lambda trigger (via AWS Console):** 1. Go to the S3 bucket where files are uploaded. 2. Click “Properties”, then scroll down to “Event notifications”. 3. Click “Create event notification”. 4. Configure the event: Name the event. Event type: choose POST (for presigned URL uploads), or other types as needed. Prefix/Suffix: optionally limit to a folder or file type, e.g.: Prefix: uploads/ Destination: choose Lambda Function, then select an existing Lambda from the dropdown. Confirm permissions: S3 must be allowed to invoke your Lambda. If it’s not already, you’ll be prompted to grant permissions automatically. Once set up, any new file matching the criteria will automatically trigger the selected Lambda with an event payload containing metadata about the file (e.g. bucket name, key, size, etc.). ### 4. Lambda: Process the uploaded file Once S3 triggers the Lambda function (as set up earlier), the function can access event metadata and retrieve the uploaded object's details from S3, storing the metadata in the database. ```typescript // lambda/process-upload.ts import { S3Client, HeadObjectCommand } from "@aws-sdk/client-s3"; import { S3Event } from "aws-lambda"; import { randomUUID } from "crypto"; import { uploadRepo } from "./upload-repo"; const s3 = new S3Client({}); export const handler = async (event: any) => { const record = event.Records?.[0]; if (!record) throw new Error("No S3 record found"); const bucket = record.s3.bucket.name; const key = decodeURIComponent(record.s3.object.key.replace(/\+/g, " ")); const head = await s3.send(new HeadObjectCommand({ Bucket: bucket, Key: key })); const contentType = head.ContentType; const size = head.ContentLength; const userId = head.Metadata?.["user-id"]; const originalName = head.Metadata?.["name"]; if (!userId || !originalName) { throw new Error("Missing required metadata"); } await uploadRepo.save({ id: randomUUID(), bucket, key, size, contentType, userId, originalName, }); console.log("Upload metadata saved:", { bucket, key }); }; ``` ### 5. Tradeoffs Like everything in software engineering, this approach is not a silver bullet. It solves many problems—offloading traffic to S3, reducing backend load, and enabling secure, scalable uploads—but comes with tradeoffs: * **Asynchronous processing:** The upload is processed asynchronously. If the client needs to wait for the file to be fully processed (e.g. metadata stored in a DB), it must implement polling mechanism to be notified when the file is ready. * **No early validation of file content:** Since the upload goes directly to S3, your backend only sees the file after it lands. You can enforce structure (e.g. content type, size, custom metadata) at upload time via presigned policy conditions, but you can't inspect or reject the file contents in advance. * **Complexity:** The solution is more complex than a simple direct upload. ## Conclusion Pre-signed POST uploads with S3 offer a clean and scalable way to accept files directly from clients — enforcing structure with upload policies and enriching the process with metadata. Combined with S3 event triggers and Lambda, it becomes easy to build automated pipelines that respond to new uploads in near real-time. Just remember: this pattern is asynchronous, so systems that expect immediate results must account for it. When used thoughtfully, it’s a lightweight and powerful foundation for modern file upload flows. ## Asset Tracking: A Guide to Smarter Asset Management *Published: 2025-05-20 | Author: izabela | Tags: asset tracking, development* *Source: https://brightinventions.pl/blog/asset-tracking-guide/index.md* **Businesses large and small must monitor the location, status, and condition of their physical assets in real time to improve asset utilization, reduce losses, enhance productivity, and maintain a competitive edge. This introductory guide will walk you through the essentials of asset tracking, including the benefits, core technologies, and how to choose the right asset tracking solution for your business.**
![asset tracking guide](/images/asset_tracking_guide_cover.png "asset tracking guide")
## What is Asset Tracking? **Asset tracking** refers to the method of monitoring the physical assets of an organization—such as vehicles, machinery, equipment, tools, and inventory—using various **tracking technologies**. These systems record asset data like location, status, and movement over time, providing businesses with improved **visibility** and control. ## How Does Asset Tracking Work? Asset tracking works through the integration of hardware, software, and communication technologies. Here's a breakdown: 1. **Asset tag**: Assets are tagged with identifiers such as barcodes, QR codes, RFID, or GPS-enabled devices. Although, in some cases [tracking devices can be tags as well](/projects/manufacturing-asset-tracking/). 2. **Tracking device**: These tags communicate with a **tracking device** or reader to log data. 3. **Asset tracking software**: Data from tracking devices is collected and processed by **asset management software**. 4. **Cloud-based asset tracking**: Modern systems store this data in the cloud, offering remote access and real-time updates. ## The Benefits of Asset Tracking Implementing a robust **asset tracking system** delivers numerous benefits: * **Enhanced visibility**: Know where your assets are at any time. * **Improved asset utilization**: Eliminate idle time and maximize use. * **Reduced downtime**: Schedule maintenance based on real-time data. * **Optimized operations**: Increase **productivity** by streamlining workflows. * **Loss prevention**: Prevent theft and misplacement with real-time alerts. Note that asset misappropriation accounts for nearly [90%](https://bradyware.com/new-acfe-report-exposes-rising-fraud-costs-trends/) of reported workplace fraud cases. * **Data-driven decisions**: Use historical and current data to guide strategy. ## Industries That Benefit from Asset Tracking Technologies Location tracking and inventory offers valuable benefits across industries: * **Logistics and Transportation**: Real-time GPS tracking enhances fleet visibility, improves delivery accuracy, and reduces fuel consumption. * **Construction**: Tracks equipment across job sites to prevent loss, reduce idle time, and enhance asset utilization. * **Healthcare**: Monitors medical devices and critical equipment to ensure availability, compliance, and proper sanitation. * **Manufacturing**: Increases operational efficiency by tracking tools, automating maintenance, and minimizing downtime. * **Retail**: Enhances inventory accuracy, supports demand forecasting, and optimizes supply chain workflows. * **Government and Public Services**: Improves transparency and accountability by managing public assets and reducing operational inefficiencies. ## Core Technologies in Asset Tracking Understanding the different **asset tracking technologies** can help you choose the right system: ### Barcode and QR Code These are simple, cost-effective options that require manual scanning. Best for low-value, stationary assets. ### RFID (Radio Frequency Identification) RFID tags automatically transmit data to readers, making them ideal for warehouse and inventory tracking. ### GPS Asset Tracking **GPS asset tracking** offers real-time location updates and is especially useful for **fleet and asset** management across large geographic areas. ### IoT Asset Tracking **IoT asset tracking** uses smart sensors and internet connectivity to deliver advanced analytics, condition monitoring, and predictive maintenance alerts. It's an integral part of **iot asset management**. ### Cloud-Based Asset Tracking A **cloud-based asset** tracking system enables teams to access asset information from anywhere, promoting better collaboration and decision-making. ## Choosing the Right Asset Tracking Software Selecting the **most suited asset tracking** system depends on several factors: * **Type of assets**: Are you tracking vehicles, equipment, or tools? * **Mobility**: Are your assets stationary or on the move? * **Budget**: What is the total cost of implementation? * **Scalability**: Can the system grow with your business? * **Integration**: Does it integrate with your existing **asset management** tools or mobile devices that could become your asset trackers? For example Zebra Technologies hone are a great example of a potential asset tracker. ## Fleet and Asset Tracking For businesses with transportation needs, combining **fleet and asset** tracking is a game-changer. **GPS asset tracking solutions** help monitor vehicle locations, driver behavior, fuel consumption, and delivery times in **real-time**, all while tracking cargo. ## Asset Tracking Devices and Hardware Different **asset tracking devices** are available based on asset type and use-case: * **Passive tags**: Low-cost, used for barcode and RFID. * **Active GPS devices**: Battery-powered and ideal for remote tracking. * **IoT sensors**: Monitor temperature, vibration, and usage. * **Fixed readers**: Installed at entry/exit points for automated logging. * **Mobile devices** your company already owns that can become trackers with Bluetooth Low Energy. Choosing the appropriate **asset tracking hardware** ensures accurate and reliable data collection. ## Cloud-Based Asset Management A **cloud-based asset management** system not only provides better access but also reduces IT overhead. Features include: * Automatic software updates * Enhanced data security * Remote management capabilities * Scalability for growing businesses ## Enhancing Asset Utilization and Operational Efficiency One of the most tangible **benefits of asset** tracking is improved **asset utilization**. By knowing where and how assets are used, companies can: * Reassign underused equipment * Schedule preventive maintenance * Avoid unnecessary purchases * Increase uptime and **operational efficiency** ## Real-Time Alerts and Monitoring Modern **asset tracking systems** offer asset life alerts for: * Unauthorized movement * Maintenance due * Environmental changes (e.g., temperature/humidity) * Battery levels of tracking devices This level of **asset monitoring** ensures fast response times and minimizes risk. ## Optimizing Asset Location and Deployment Using **asset tracking software**, businesses can analyze historical location data to optimize the placement and **utilization** of assets. Strategic asset allocation reduces travel time, lowers fuel costs, and improves service delivery. ## Integration with Existing Business Tools Today’s **asset management software** often integrates with: * **ERP (Enterprise Resource Planning) systems**: SAP ERP, Oracle NetSuite, Microsoft Dynamics 365, Odoo, Infor CloudSuite; * **Inventory management tools:** TradeGecko (QuickBooks Commerce), Zoho Inventory, Cin7, Fishbowl Inventory, inFlow Inventory; * **CMMS (Computerized Maintenance Management Systems)**: UpKeep, Fiix, eMaint, Hippo CMMS, Maintenance Connection; * **Financial software:** QuickBooks, Xero, Sage Intacct, FreshBooks, Wave Accounting. Integration boosts efficiency and provides a unified view of all business operations. ## Custom vs. Off-the-Shelf Asset Tracking Solutions When considering asset tracking systems, businesses often face the choice between custom-built solutions and off-the-shelf software. Each approach has its advantages and limitations. ### Off-the-Shelf Solutions **Pros:** * Lower upfront cost * Faster deployment * Vendor support and regular updates **Cons:** * Limited customization * May not integrate well with specific workflows * Potential scalability issues ### Custom Asset Tracking Solutions **Pros:** * Fully tailored to business processes * Scalable with company growth * Easier integration with legacy systems and specific hardware **Cons:** * Higher initial investment * Longer development time * Internal responsibility for updates and maintenance Choosing between these options depends on the complexity of your needs, existing infrastructure, and long-term goals. ## Case Studies: Real-World Applications These real-world applications highlight how customized asset tracking systems can be tailored to meet industry-specific challenges effectively. ### 1. IoT-Based Water Quality Monitoring for Fish Transportation A global seafood exporter required a system to monitor water conditions inside fish crates during transport. Our team developed a [custom IoT solution that used sensors to track water quality indicators](/projects/water-quality-monitoring/) such as temperature. The system sent real-time alerts when anomalies were detected, ensuring compliance with safety standards and reducing spoilage. This improved quality assurance and customer satisfaction.
![water monitoring](/images/water_monitoring_case_study.png "water monitoring")
### 2. Manufacturing Asset Tracking Using Existing Devices A manufacturing client needed a cost-effective way to track tools and equipment throughout their facilities. Our team repurposed the client's existing mobile devices by leveraging Bluetooth Low Energy (BLE) technology to create a lightweight and efficient [tracking solution for manufacturing](/projects/manufacturing-asset-tracking/). This minimized the need for additional hardware, improved asset visibility, reduced loss, and boosted operational efficiency.
![manufacturing asset tracking](/images/manufacturing_asset_tracking_photo.png "manufacturing asset tracking")
## Best Practices for Implementing Asset Tracking Follow these steps for successful deployment: 1. **Audit your assets**: Identify what needs to be tracked. 2. **Choose the right asset tracking solution or hire a asset tracking software development company** to build a tailored solution. 3. **Tag and categorize**: Use the appropriate **asset tracking tags**. 4. **Train your staff**: Ensure everyone knows how to use the system. 5. **Monitor and adjust**: Continuously refine your process for better results. ## Future of Asset Tracking The future lies in intelligent, **IoT-enabled asset tracking** systems that offer advanced analytics, AI-powered predictions, and seamless integrations. As **tracking technology** evolves, expect: * Smart maintenance scheduling * Predictive analytics * Automated inventory management * Augmented reality for warehouse navigation ## Asset Monitoring: Conclusion **Asset tracking** is a powerful tool that enables organizations to **track assets**, enhance **visibility**, and boost **productivity** through real-time data. Whether you're looking to manage a **fleet**, reduce downtime, or improve **asset utilization**, investing in the right **asset tracking software** and **asset tracking system** can transform your operations. From **barcode** tags to **IoT asset tracking**, the choices are vast but choosing a **cloud-based asset management** solution that aligns with your needs is the best step forward. Start tracking your assets smarter today and unlock the true potential of your resources. - - - Looking to implement you very own **[asset tracking](/our-areas/asset-tracking/) custom solution**? Contact our experts to find the **best solution** for your business and see how it can **optimize** operations and drive better results. ## From Gradle Plugin to CLI - A More Flexible Way to Distribute Android Apps with Firebase App Distribution *Published: 2025-05-15 | Author: filip-g | Tags: android, kotlin, gradle, firebase* *Source: https://brightinventions.pl/blog/from-gradle-plugin-to-cli-android/index.md* **Firebase App Distribution is a fantastic tool for continuous delivery, providing an easy way to manage pre-release builds and sharing them with testers.\ For a long time in our project, the [Firebase App Distribution Gradle plugin](https://firebase.google.com/docs/app-distribution/android/distribute-gradle) was a convenient way to automate this process directly within our build scripts.\ However, as our project’s complexity grew, particularly with the introduction of new flavor dimensions, we encountered limitations that led us to explore a more flexible alternative: the Firebase CLI.** ## The Convenience (and Limitations) of the Gradle Plugin Initially, the Firebase App Distribution Gradle plugin was more than enough for our project. All we had to do was to apply the plugin in the `build.gradle` file and configure the `firebaseAppDistribution` closure by specifying appId, service account file and testers group. Since we had 2 flavors at that time - `staging` and `live`, we could also configure each of them separately: ```groovy // app-level build.gradle.kts file plugins { id("com.google.firebase.appdistribution") } android { flavorDimensions += "environment" productFlavors { create(“staging”) { dimension = "environment" firebaseAppDistribution { appId = // staging App Id groups = // testers group releaseNotes = "Bug fixes and improvements" } create(“live”) { dimension = "environment" firebaseAppDistribution { appId = // live App Id groups = // testers group releaseNotes = "Bug fixes and improvements" } } } } ``` This setup allowed us to upload both variants of the app to App Distribution from a CI workflow, by using a single Gradle command `appDistributionUploadStagingRelease` or `appDistributionUploadLiveRelease`. ### Growing project complexity This worked perfectly well until our app received a second branding, which forced us to create a new flavor dimension - *brand*.\ Adding the second flavor dimension resulted in having 4 merged flavors instead of 2: * brand1Live * brand1Staging * brand2Live * brand2Staging Since all those 4 app versions had different App IDs in the Firebase console, we also needed 4 different App Distribution plugin setups. Unfortunately, at the time of writing this blog post (May 2025), the plugin doesn’t allow that, as there exist only 3 versions for the `firebaseAppDistribution` configuration function: ```kotlin // com.google.firebase.appdistribution.gradle.ExtensionAwareKt fun org.gradle.api.Project.firebaseAppDistribution() fun org.gradle.nativeplatform.BuildType.firebaseAppDistribution() fun com.android.build.api.dsl.ProductFlavor.firebaseAppDistribution() ``` They allow to configure the App Distribution: * once for the entire project * for every individual build type * for every individual flavor There’s no way to combine 2 flavors together, or one flavor with one build type.\ To achieve it, we would need a 4th version, defined for example for `com.android.build.api.variant.ApplicationVariant`, as this class contains the definitions for all flavors and build types. ## The Flexibility of the Firebase CLI This is where the Firebase CLI became our preferred solution. It provides a direct interface to interact with various Firebase services, including App Distribution, via command-line. Since it’s decoupled from the Gradle build logic, it gives us full control over which build artifact gets distributed, perfectly solving our flavor dimension targeting problem. ### How to Use the Firebase CLI for App Distribution The easiest way to install Firebase CLI is to use Node Package Manager. Most of the CI systems have it installed already. In case it’s not available straight away, please refer to the [official installation docs](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). Once we have `npm` command available, we can install the CLI using a single terminal command: ```bash npm install -g firebase-tools ``` Now we should have access to the `firebase` command which is an entry point to the Firebase CLI.\ Then, we just need to invoke the `appdistribution:distribute` command. This command however, requires authentication. ### CLI Authentication CLI auth can be obtained in 2 ways: with Firebase Token, or Service Account File.\ The token approach is considered deprecated, hence we haven’t used it.\ It also requires a machine with an installed browser, as the token can be obtained only after performing a successful Google Auth.\ For more info please refer to [official docs](https://firebase.google.com/docs/cli#cli-ci-systems-firebase-token). The option with Service Account File is much easier to implement in a CI environment.\ It just requires a single file available through a system environment variable. The file itself can be obtained from Google Cloud Console.\ For a step-by-step guide, please check the [official docs](https://firebase.google.com/docs/app-distribution/authenticate-service-account?platform=android). The last step - creating a `GOOGLE_APPLICATION_CREDENTIALS` environment variable is crucial. Without this, the upload will fail, as the `appdistribution:distribute` command uses this env during runtime. ### Uploading the app After fulfilling the authentication requirements, we can finally upload the build by calling: ```powershell firebase appdistribution:distribute "path/to/the/build/file" \ --app FIREBASE_APP_ID \ --groups "internal-testers,qa-team" \ --release-notes "Bug fixes and improvements" ``` Parameters breakdown:\ `"path/to/the/build/file"` - a required argument pointing to the APK or AAB file\ `--app` - The App ID for your Android app in Firebase. You can find this in your Firebase project settings under "General".\ `--groups` - a comma-separated list of tester groups you want to distribute the build to. You can manage groups in the Firebase console.\ `--release-notes` - release notes for the testers. You can also use `--release-notes file` /`path/to/notes.txt` to provide notes from a file.\ If you are using token authentication, an additional `--token` parameter will be required. For a complete list of available parameters, please refer to the [official docs](https://firebase.google.com/docs/app-distribution/android/distribute-cli?apptype=apk#step_2_distribute_your_app_to_testers). Alternatively, instead of splitting the CLI usage into separate steps for installation and execution, we can make use of `npx` to run the `firebase`, command directly from a remote `npm` package: ```powershell npx --yes firebase-tools \ appdistribution:distribute "path/to/the/build/file" \ --app FIREBASE_APP_ID \ --groups "internal-testers,qa-team" \ --release-notes "Bug fixes and improvements" ``` Using `--yes` parameter allows to bypass any prompts that would appear during the execution. ### Uploading the build from CI In the case of our project, we are using GitHub Actions as a CI solution. It gives an option to define values for all the above parameters as inputs to a single workflow, so the decision on what app to upload can be done by simply passing appropriate arguments when dispatching the workflow. Even though our final CI workflow is a bit more complex, you can check a simple implementation in the [following gist](https://gist.github.com/fgrzeskowiak/473a0ececdfdff55f96e19dcf1e2cdfc). ## Conclusion While the Firebase App Distribution Gradle plugin is a convenient entry point, the Firebase CLI offers superior flexibility and control, especially when dealing with complex Android build configurations involving multiple flavor dimensions. By decoupling the build and upload steps and allowing you to explicitly specify the artifact to distribute, the CLI provides a solution that scales better with the complexity of your app variants. If you've hit limitations with the Gradle plugin due to your build setup, or simply need more control over your distribution process, switching to Firebase CLI might be a cure for that. ## Cursor vs Junie for Android Developers. Which Is the Better AI Agent? *Published: 2025-05-15 | Author: szymek | Tags: android, AI, agent* *Source: https://brightinventions.pl/blog/cursor-vs-junie-for-android/index.md* **[Junie](https://www.jetbrains.com/junie/) and [Cursor](https://www.cursor.com/) — two prominent AI agents — have entered the realm of Android development. Let's explore their strengths and weaknesses across different aspects of the development process.**
![Cursor vs. Junie for Android Development](/images/cursor-junie.jpg "Cursor vs. Junie for Android Development")
## AI Agents for Android development Plenty of AI tools are popping up that can really speed up Android development. Let's dive into what's currently available and check out some cool options we have right now. Among the most powerful AI tools out there are what people call AI Agents. These guys can automatically change your existing files, add completely new ones, or even whip up entire code modules, all based on what you ask them to do. You just switch to the Agent or Code mode in your tool and tell it how it can help. ## Samples Here are some examples of requests you could make that might be super helpful and boost your productivity: * Write unit tests for my `ViewModel` class, making sure to match the code style used in your `OtherViewModelTest` class. Generating unit tests with it takes only a few minutes, which can save hours compared to manual creation, especially for complex scenarios. * Migrate all the Jetpack Compose Material 2 Composables in your project over to Material 3. * Change how file uploads are handled by WorkManager. Instead of one `WorkRequest` per upload, use a single `WorkRequest` for multiple files with an upload queue stored in a Room database. Also, make sure to expose detailed updates about the queue and the status of each upload using a Coroutines Flow. * Create Jetpack Compose Composables that perfectly match the screen layout shown in the design image file `design.jpg`. * Figure out why the app is crashing with a provided stacktrace: ``. Once you know why, make that part of the code safer. * Replace all the direct `colorResource(R.color.)` calls in the code with the right `MaterialTheme` color defined in my Jetpack Compose theme. * Describe the reported bug and indicate the suspected area in the code that may require modifications. It should prompt you with suggestions on how to fix this bug. ## Cursor While it doesn't have official, deep Android support, Cursor is still pretty useful and can lend a hand in many situations. It's actually an IDE based on Visual Studio, called Cursor itself. You can install Android plugins to help with development, but honestly, it won't replace the top-tier Android IDEs from Jetbrains, like Android Studio and IntelliJ IDEA. ### How does it work? You just go into Agent mode, give Cursor the relevant context files it needs, and tell it what you want to achieve. You can even attach a design image file for it to generate Composables or XML layouts from. Make sure to give it as many context files as possible, because the more context Cursor has, the more accurate the results will be. **Pros:** * Really fast - usually finishes after a few seconds. * You can pick which AI model you want to use. * Has a "Thinking mode" which is great for trickier or less clear problems, like debugging or figuring out why an exception happened. * Awesome for generating small bits of boilerplate code (maybe up to a few files). * Writing unit tests based on a component to test **Cons:** * Android support isn't super convenient. * Cannot run app or unit tests. * Lacks network, memory, and UI analyzer tools. * Needs very specific file context; without enough info, the results can be useless. * Automatically generated tests may fail to compile or employ coding patterns not typical of your project. * Often spits out boilerplate code that doesn't even compile. * Can get stuck in a loop if you e.g. ask it to make tests pass by repeatedly running and fixing them. ## Junie It’s part of Jetbrains AI Pro. It's not available right in Android Studio yet. However, you can find it in IntelliJ IDEA Ultimate, which actually has decent Android development support. It comes with an Android plugin that gives you Jetpack Compose preview, Logcat, debugger, Network Inspector, Build Variants selector, Profiler, and a whole lot more that should cover most of your Android needs! You might miss some less common features bundled with Android Studio, like Firebase integration or the App Links Assistant, but for most things, it's got you covered. ### How does it work? You just select Code mode. You can add context files using the '+' icon or by mentioning file/class names. Then, just tell it what you need! You can't directly attach an image to the prompt, but you can drop the image file into your repository temporarily and tell Junie to use it as a reference. This way, it can generate Jetpack Compose or XML layouts based on that image. If you don't give Junie context, it's pretty likely to search for relevant info on its own. For instance, if you ask it to write code to save a data class object to SharedPreferences, Junie will probably look for any serialization library you're already using and suggest using that to handle storing complex data types. **Pros:** * Pretty accurate, gives results that make more sense and feel more insightful than Cursor. * If serialization is needed, it looks for existing examples in the project. * If unit testing mocks are needed, it looks for existing mocking libraries * When code changes affect other classes, it tries to make everything play nicely together. * Does not leave your code not compiling * Can totally write unit tests and even fix them on the spot if they're busted. * If a unit test doesn't compile or pass, it keeps trying to fix it until it does. * Haven't seen it get stuck in an infinite loop yet, which is cool. **Cons:** * Yeah, it's slower. * Processing more complex stuff just takes a good chunk of time. * Sometimes fixing all the unit tests in just one file means a separate AI request for each one, plus running the test, which can seriously chew up 10-20 minutes sometimes. * Creating a single unit test class for a typical Android ViewModel took around 3 to 5 minutes. * Migrating approximately 30 Composables from Jetpack Compose Material2 to Material3 within a specific package took around 20 minutes. However, it’s nothing compared to the estimated 8 hours. ## Summary AI Agents significantly improve daily work by saving time typically spent on writing boilerplate code. For intricate issues, Junie is the preferred tool, while Cursor is suitable for simpler, faster assistance. Which AI agent do you prefer for your Android development tasks? ## Faster and Smarter - Improving File Uploads with S3 Multipart, Pre-Signed URLs and S3 Transfer Acceleration *Published: 2025-05-13 | Author: kuba-s | Tags: S3, AWS, Architecture, Performance* *Source: https://brightinventions.pl/blog/improving-s3-large-files-uploads/index.md* **Uploading large files to S3 can be slow and unreliable over weak networks. Using multipart upload with pre-signed URLs improves speed, reliability, and security by allowing parallel uploads directly from the client. A lifecycle policy can automatically clean up abandoned uploads to avoid storage costs. S3 Transfer Acceleration speeds up uploads and downloads globally by routing traffic through AWS edge locations. It’s easy to enable and only charges if it improves performance.** ## Uploading large files to S3 Amazon S3 is one of the most reliable and scalable object storage services available today. It’s widely used for storing everything from static website assets to massive data archives, video libraries, backups, and logs. However, uploading large files to S3 isn’t as simple as doing a `PUT` request and calling it a day. Several challenges come into play, especially when network conditions are less than ideal. **Let's explore why:** * **Unreliable Networks:** In real-world scenarios, users may upload files over shaky connections — think mobile devices, public Wi-Fi, or spotty home internet. A single dropped connection during a large upload can force the entire operation to start over if not handled correctly. * **Single Connection Limitations:** A standard HTTP `PUT` upload streams the file over a single HTTP connection. Due to TCP throughput limitations, this often leads to underutilized bandwidth. Clearly, uploading large files over the internet is more fragile and slower than it should be. Anyone who has ever tried to upload a file over 1 GB on a flaky connection knows just how painful the process can be. Fortunately, S3 provides a purpose-built solution to address these challenges: **S3 multipart upload**. ## Introducing multipart upload: S3 solution for large files To make large file uploads more reliable and performant, AWS offers the **Multipart Upload** feature in S3. Instead of sending the entire file in a single request, the file is broken into smaller parts that can be uploaded independently — and in parallel. AWS provides clear guidelines around when to use multipart upload: * **Recommended:** For files larger than **100 MB**, AWS recommends using multipart upload to improve speed and resilience. * **Required:** For files over **5 GB**, multipart upload is mandatory. You cannot upload files of this size using a regular `PUT` request. This approach has multiple advantages: * **Failed parts can be retried individually.** * **Uploads can proceed in parallel, making better use of available bandwidth.** * **You gain greater control over error handling and progress tracking.** By leveraging multipart upload, developers can build upload flows that are faster, more resilient, and much better suited to real-world network conditions. ## Secure uploads with pre-signed urls When uploading directly to S3, you normally need to provide valid AWS credentials with permissions to `s3:PutObject`. Exposing those credentials in a frontend app is a big no-no — they can be misused if leaked. That’s where **pre-signed URLs** come in. A pre-signed URL grants temporary permission to upload a file directly to S3, without exposing any sensitive credentials. They’re: * **Time-limited** (you define expiration) * **Scope-limited** (you define exactly what operation they allow) * **Ideal for frontend uploads** (web, mobile, etc.) You can combine pre-signed URLs with multipart uploads to securely and efficiently upload large files directly from the client. ## Implementing multipart upload with pre-signed URLs in TypeScript Let’s walk through an example implementation of multipart upload using pre-signed URLs. This approach allows your frontend to upload large files directly to S3, securely and efficiently, without exposing credentials. We’ll expose three backend endpoints: * **Initialize Upload** – Starts a multipart upload and returns an UploadId. * **Generate Pre-Signed URLs** – Creates pre-signed URLs for each part. * **Finalize Upload** – Completes the upload after all parts have been uploaded. 1. **Backend: Initialize Upload** ```typescript // POST /api/upload/init export async function initMultipartUpload( key: string, contentType: string ) { const response = await s3.send( new CreateMultipartUploadCommand({ Bucket: BUCKET, Key: key, ContentType: contentType, }) ); return { uploadId: response.UploadId!, key, }; } ``` **Explanation**: This starts the multipart process and returns an UploadId, which is required to upload and track individual parts. 2. **Backend: Generate Pre-Signed URLs** ```typescript // POST /api/upload/presign export async function generatePresignedUrls( key: string, uploadId: string, parts: number ) { const urls = await Promise.all( Array.from({ length: parts }, (_, index) => { const command = new UploadPartCommand({ Bucket: BUCKET, Key: key, UploadId: uploadId, PartNumber: index + 1, }); return getSignedUrl(s3, command, { expiresIn: 900 }); }) ); return urls; } ``` **Explanation**: You generate a pre-signed URL for each part using `UploadPartCommand`, which can be used by the frontend to upload file chunks directly to S3. Keep track of each `PartNumber` to correctly finalize the upload later. 3. **Backend: Complete the Upload** ```typescript // POST /api/upload/complete export async function completeMultipartUpload( key: string, uploadId: string, parts: { ETag: string; PartNumber: number }[] ) { await s3.send( new CompleteMultipartUploadCommand({ Bucket: BUCKET, Key: key, UploadId: uploadId, MultipartUpload: { Parts: parts }, }) ); } ``` **Explanation**: S3 will combine all uploaded parts into a single object. If anything goes wrong before this step, the upload remains incomplete. 4. **Frontend: Putting it all together** Here's a high-level example of how a browser or mobile app can use those endpoints to upload a file in parallel: ```typescript async function uploadFile(file: File) { // 1. Initialize multipart upload const { uploadId, key } = await api.initMultipartUpload(file.name, file.type) // 2. Split file into parts with your custom logic const parts = splitIntoParts(file) // 3. Get pre-signed URLs const urls = await api.generatePresignedUrls(key, uploadId, parts.length) // 4. Upload chunks in parallel const uploads = await Promise.all( parts.map((part, idx) => fetch(urls[idx], { method: 'PUT', body: part }) .then((res) => res.json()) .then((res) => ({ ETag: res.headers.get('ETag')!, PartNumber: idx + 1, })) ) ) // 5. Finalize upload await api.completeMultipartUpload(key, uploadId, uploads) } ``` **Explanation**: The file is split into chunks client-side, and each chunk is uploaded using the corresponding pre-signed URL. After all uploads complete, the list of ETag and PartNumber values is sent to the backend to finalize the multipart upload. 5. **Bonus: Automatically clean up incomplete uploads** As a best practice, you can configure an S3 lifecycle policy to automatically delete incomplete multipart uploads after a set number of days. This keeps your bucket clean and avoids unexpected storage costs. ## Supercharging uploads with S3 Transfer Acceleration When users upload large files from across the globe, network latency and distance from the S3 bucket region can significantly slow down the process. S3 Transfer Acceleration is designed to solve exactly this problem — by leveraging AWS’s global infrastructure to speed up data transfers to and from S3. S3 Transfer Acceleration works by routing your uploads and downloads through the nearest **AWS Edge Location** using the Amazon CloudFront network. Once a file reaches an edge location, it travels over the **AWS global backbone**, a high-speed and low-latency network that connects AWS regions around the world. Instead of sending data all the way to your S3 bucket’s region over the public internet, users send it to the closest AWS edge server. This drastically reduces latency and improves upload (and download) performance, especially for users far from the bucket’s region. You can enable Transfer Acceleration in the bucket’s **Properties** tab in the S3 console. Once enabled, two special endpoints become available for use in your applications: * `https://.s3-accelerate.amazonaws.com` * `https://.s3-accelerate.dualstack.amazonaws.com` (for IPv6 support) Using either of these endpoints with your S3 client enables accelerated data transfers. If Transfer Acceleration doesn’t improve performance, AWS will compare the results and won’t charge you for using it. ## Conclusion S3 multipart upload with pre-signed URLs is a powerful and flexible way to upload large files to S3. It provides a secure and efficient way to upload files directly from the client, while also allowing for better error handling and progress tracking. S3 Transfer Acceleration is a further improvement that can speed up uploads and downloads globally by routing traffic through AWS edge locations. ## Climbing Challenges in Tech and Life: Paweł’s 10-Year Dev Journey *Published: 2025-05-09 | Author: pawel-o | Tags: bright insights* *Source: https://brightinventions.pl/blog/climbing-challenges-in-tech-life-pawel/index.md* **With a decade of experience in the software industry, Paweł has seen it all – from working with complex legacy systems to implementing modern authentication methods like passkeys. In this interview, he shares insights on technical challenges like payment integration, finding purpose in software projects, and how climbing (literally) changes his everyday life.**
![Career story: Paweł](/images/brightstorypawelogrid.png "Career story: Paweł")
## You’ve been in the industry for 10 years now – what have been the biggest challenges along the way? One of the biggest challenges has definitely been **working with legacy systems**, especially when the code wasn’t written by me or anyone from my current team. Unfortunately, in some cases, the code I had to work with wasn’t written with future maintenance in mind. Sometimes, you get the opportunity to rewrite it. But in many cases, you have to maintain it as it is. That’s when you focus on optimizing certain parts, adding tests, and simply **trying to leave the code in a better state than you found it**. Reading code is usually the most time-consuming part of a developer's work, and with legacy systems, it often feels like **solving a puzzle without all the pieces**.
![Quote on legacy systems](/images/pawel_quote_legacy.png "Quote on legacy systems")
## Is it discouraging for you to work with legacy systems? Not at all – I actually enjoy the challenge. What’s most rewarding is knowing I’m **adding real value to businesses**, not just working on projects that will never see the light of day. It might sound cliché, but I like working on something that can make a difference. I once worked for a company in the banking sector, but it didn’t give me the same sense of purpose I feel now, working with one of our clients whose mission is to reduce plastic waste. **The mission behind a software product really matters** to me. ## One of your current challenges is implementing payments for a retail application. Can you tell us more about that? It’s a major part of the app modernization. The app already had payments implemented which gave me an **opportunity to work with third-party services like Braintree and Stripe**. Yet now we’re expanding the number of payment providers and methods. We already support a variety of payment methods, including **credit cards, PayPal, Google Pay, and SEPA** – which is actually very popular in countries like Germany. Our goal is to **offer more payment methods tailored to the needs of each market**. For example, in the Netherlands, iDEAL is widely used. The challenge lies in coordinating all these providers and adapting the payment flows to each market – especially considering specific factors, like SEPA only handling payments within Europe, which makes it unsuitable for certain regions.
![Teambuilding](/images/teambuilding_laser_tag_pawel.png "Teambuilding")
Paweł during a laser tag team retreat.
## You recently worked on passkey login implementation, which is still a unique feature. How do you look back on the experience? At the time, it wasn’t exactly brand new, but there were very few well-documented implementations available. We had to **test a wide range of scenarios** to make sure we covered all possible login flows. Security is a tricky area – **a mistake in the login process can lead to issues like mixed user sessions**, which could irreversibly compromise user data. Overall, the biggest challenge was truly understanding how passkeys work, ensuring the solution was secure, and implementing it in a way that’s both reliable and user-friendly. ## What keeps you motivated in your role at Bright Inventions? The projects are interesting, and I really **appreciate the work culture and the openness to feedback**. It doesn’t feel like you’re just another anonymous employee – if you have a problem, there’s always someone you can talk to. ## Is it true that you built a climbing wall at your own house? Yes! Since my whole family – including my two daughters – climbs, we needed a place to practice. The wall is built into a long, narrow room, so we were able to squeeze it in, and it gives us the chance to use it every day.
![Bouldering wall](/images/bouldering_wall.png "Bouldering wall")
Homemade bouldering wall.
## Why do you travel to the same climbing spot in France every year? Because it’s simply the best in Europe! I really enjoy France – the wine, the baguettes, the Camembert cheese. We go bouldering just outside Paris, near one of Napoleon’s former residences. The kids climb too, or at least give it a try – unless there are lots of friends around, then they just play. But usually, they’ll climb a bit and enjoy being in the forest with everyone. And actually, we don’t go just once a year – **we go twice**! 😄 Spring and autumn are the best times. Summer is too hot, and while you could climb in winter – and some people do – I’m not a fan of the cold. That said, we went this February and it was actually really great.
![Bouldering in France.](/images/bouldering_pawel.png "Bouldering in France.")
Bouldering in France.
## How to Gather Actionable Feedback Inside a POS System – Without Interrupting the Flow *Published: 2025-05-06 | Author: agata | Tags: POS* *Source: https://brightinventions.pl/blog/how-to-gather-actionable-feedback-inside-a-pos-system/index.md* Understanding your users is key to building a Point of Sale (POS) system that not only works but actually supports staff during busy, high-pressure service hours. But when your users are waiters, bartenders, or restaurant managers — getting feedback isn’t as easy as sending out a survey. ## So how can you gather meaningful insights from inside the POS app, without slowing anyone down? As a [POS software development company](/our-areas/pos-software-development/) that builds custom systems for a variety of vendors, here’s how we approach it. ## In-App Questionnaire – But Only When It Makes Sense Let’s start with the obvious: asking the users directly. Instead of constant pop-ups or annoying reminders, we allow users to trigger the questionnaire themselves — for example, through a subtle button in the side menu labeled “Give Feedback”.
![feedback reporting inside a POS system](/images/pos-feedback-mockup.png "feedback reporting inside a POS system")
### This way: * Feedback comes in when users are ready to share. * The signal-to-noise ratio is much higher than with forced pop-ups. * It helps validate the usability of core workflows — like opening tables, sending orders to the kitchen, and handling payments — in the exact environment they’re used every day. In Point of Sale survey:  * Ease of use * Suggestions for improvement * Bugs or pain points * A simple CSAT (Customer Satisfaction) rating \ **💡 Pro tip:** Keep it short. 3–5 questions max, ideally with a text field for open feedback.
![POS Feedback Survey](/images/screenshot-2025-05-09-at-15.51.40.png "In-App Feedback Survey")
## Passive Feedback Through Analytics – Data Tells a Story Not all feedback has to be given intentionally. With the right setup, analytics can tell you everything — from where people get stuck, to how long it takes to close a table. ### **Our Stack** We use Firebase for in-app event tracking and connect it with Grafana for visualising and monitoring patterns. ### **What We Track** **1. Core Actions:** * Opening a table * Adding an item * Sending an order to the kitchen * Payment (partial, split, full) * Closing the table **These actions give us:** * A timeline of how long key processes take * Detection of bottlenecks (e.g. if many payments fail or are delayed) * Early warning signs of bugs or usability issues
![firebase analytics](/images/screenshot-2025-05-06-at-15.02.06.png "Firebase POS Analytics")
**2. Funnels & Flows: Where Are Users Struggling?** By inspecting user flows, we can answer questions like: * Which screens have the longest visit time? * Is that because the process is complex? * Or is the UI confusing or too slow? * Are users abandoning a process halfway? * Maybe they’re trying to apply a discount but can't find the button. * What’s the most typical flow – and how does it differ from the ideal one? * What workarounds users are performing? **This lets us:** * Spot friction points in the UX * Prioritise improvements * A/B test new solutions based on real data ## Combining Both Worlds: Data + Human Insight Data can show us what is happening, but users tell us why. That’s why the best approach is to combine: * Passive insights from analytics * Active insights from user-triggered feedback This hybrid approach helps us build better, faster, more intuitive custom POS software – rooted in how people really use it on the floor. ## **Final Thought**  Your POS app isn't just software – it's part of someone’s workday. The smoother and smarter you make it, the better their day goes. And to do that, you need feedback — but it doesn’t have to come from interviews or support tickets alone. The app itself can tell you everything you need to know. You just need to listen. ## Supercharged Test Running with Custom Modes in Cursor IDE *Published: 2025-04-29 | Author: patryk-s | Tags: TypeScript, cursor, testing, unit-testing* *Source: https://brightinventions.pl/blog/supercharged-test-running-with-custom-modes-in-cursor-ide/index.md*
![Test with cursor](/images/cover-cursor-unit-tests.png "test-with-cursor-image")
## The Problem with Running Tests in Cursor If you're using Cursor as your primary IDE, you've probably already experienced how powerful it can be—especially when combined with AI-assisted workflows. But when it comes to running tests, things get a bit tricky. Cursor doesn’t support running tests out of the box, so you're forced to rely on plugins. Unfortunately, these plugins often fall short when working on real-world projects. Setting the correct working directory becomes cumbersome, you can’t easily enforce a specific Node.js version with `nvm`, and passing environment variables is either awkward or unsupported. And even if you manage to run the tests, the output is rarely formatted in a clean or readable way. - - - ## Solving the Problem with Custom Modes To overcome these limitations, we can leverage Cursor's **Custom Modes**—a feature that allows you to define tailored workflows with specific tools and instructions. By creating a custom mode dedicated to running tests, you can automate the process of locating test files, executing them, formatting the results in a readable manner, and even suggesting code changes based on the outcomes. Fortunately, enabling Custom Modes is straightforward. This feature is available starting from Cursor version **0.48.x**, released on **March 23, 2025**. To activate it: 1. Open Cursor's settings by pressing `Cmd+Shift+J` (macOS) or `Ctrl+Shift+J` (Windows/Linux). 2. Navigate to `Settings → Features → Chat → Custom Modes`. 3. Toggle the option to enable Custom Modes. For more detailed guidance, refer to the official documentation: [Custom Modes](https://docs.cursor.com/chat/custom-modes). - - - ## Creating a Test Runner Mode Once Custom Modes are enabled, you can create your own tailored assistant for running tests. In the Chat sidebar, click the “+” next to your current chat mode and select **"Create new custom mode"**. This allows you to define not only how the assistant behaves, but also what it focuses on. I created a mode called **"Test Runner"** and disabled its permission to edit files—this way, it won’t make any accidental changes to your codebase. However, if you'd like it to suggest or apply fixes automatically, feel free to keep file editing enabled. Here’s the prompt I used for the assistant’s behavior: ``` When I ask you to run a test, find the matching .spec. file in the backend directory. Run it with: nvm use && cd backend && DEPLOY_ENV=test-local yarn test --runInBand "pathToFile" --testNamePattern="testName" --json You may use either pathToFile, testNamePattern, or both — choose what’s best for the context. Return only the test result in a clean, colorful, human-readable format ``` Paste this into the “Custom instructions” field during setup. For more details, refer to the official Cursor documentation: [Custom Modes](https://docs.cursor.com/chat/custom-modes). 👉 **Of course, make sure to adjust the prompt to reflect your specific way of running tests**, including any required environment variables, test runners, or command-line options. - - - ## Using Your Test Runner in Practice Once your **Test Runner** mode is ready, using it is as simple as talking to your AI. You can type natural commands like: * `"Run tests for my uncommitted files"` – the assistant will detect which files you've changed and locate the relevant `.spec.` files to test. * `"Run test for my LocationController"` – it will look for a file like `location.controller.spec.ts` and run it. * `"Run all tests"` – and it will go through the full test suite in your `backend` directory. The AI will choose the appropriate flags (`--testNamePattern` or file path), run the tests with the right Node version and environment, and return a clean, easy-to-read summary. Here's an example of what the output might look like:
![test-result-example](/images/screenshot-2025-04-29-at-15.36.42.png "test results")
\- all formatted to be easily readable at a glance.\ And the best part? If any test fails, the assistant can automatically suggest (or even apply) fixes based on the error output. - - - ## Give It a Try 🚀 With just a few minutes of setup, you can turn Cursor into a smart test runner that adapts to your project structure and gives you clean, actionable feedback right inside your IDE. **Try building your own *Test Runner* today and make your testing workflow faster, smoother, and a whole lot smarter.** - - - ## One Last Thing ☕ Remote work is great — flexible hours, deep focus, and fewer distractions.\ But let’s be honest: the best ideas often come not during Zoom calls, but over coffee in the office kitchen. Big thanks to Rafał for the hallway inspiration that sparked this approach. 💡 ## Custom Jest Matcher for Asserting Spreadsheets *Published: 2025-04-24 | Author: radek-l | Tags: QA* *Source: https://brightinventions.pl/blog/custom-jest-matcher-for-asserting-spreadsheets/index.md* **When working with matrix-like data in tests — think CSVs, XLSX, reports, or table-based API responses — comparing nested arrays or tabular structures can be a pain. Figuring what bit of data was faulty can be tricky, especially in big files. Let's fix that by implementing a custom matcher which visually prints the differences in the terminal in an eye-friendly and intuitive way.** ## The Matcher code Here’s a custom matcher for Jest: `toEqualTable`, with built-in inline diffing for terminal-friendly debugging ```typescript import {AsciiTable3} from "ascii-table3"; const chalk = require('chalk'); export type HasTabularData = { data: any[][] } export type TableMatcherData = HasTabularData | any[][] function inlineDiffRenderer(result: any[][]) { const legend = `Valid / ${chalk.yellowBright.bgRedBright('Actual')} / ${chalk.yellowBright.bgGreenBright('Expected')}`; const table = new AsciiTable3() .setTitle(legend) .setAlignCenter(3) .setStyle('unicode-single') .addRowMatrix(result); console.log(table.toString()); } export const jestTableMatchers = { toEqualTable(actual: TableMatcherData, expected: TableMatcherData) { const actualData = Array.isArray(actual) ? actual : actual.data; const expectedData = Array.isArray(expected) ? expected : expected.data; const rows = Math.max(actualData.length, expectedData.length); const cols = Math.max( ...actualData.map(r => r.length), ...expectedData.map(r => r.length) ); let pass = true; const result: any[][] = []; const resultMessages: string[] = []; for (let i = 0; i < rows; i++) { const row: any[] = [i]; for (let j = 0; j < cols; j++) { const a = actualData[i]?.[j] ?? null; const e = expectedData[i]?.[j] ?? null; if (a === e) { row.push(a); } else { pass = false; row.push(`${chalk.yellowBright.bgRedBright(a)} / ${chalk.yellowBright.bgGreenBright(e)}`); resultMessages.push(`[${i}][${j}] ${a} != ${e}`); } } result.push(row); } if (!pass) inlineDiffRenderer(result); return { pass, message: () => pass ? '' : resultMessages.join('\n'), }; }, }; expect.extend(jestTableMatchers); ``` ## Example test ```typescript describe('(THESE TESTS ARE SUPPOSED TO FAIL SO YOU CAN SEE THE DIFF IN TERMINAL) toEqualTable', () => { test('plain arrays: fails if values in cells are not equal', () => { const expected = [ ["First name", "Last name", "Age", "Type"], ["John", "Doe", 30, "Admin"], ["Adam", "Smith", 40, "Admin"], ["Rose", "Gatsby", 35, "User"] ] const actual = [ ["First name", "Last name", "Age", "Type"], ["John", "Doe", , "Admin"], ["Radek", "Smith", 40, "Admin"], ["Rose", "Gatsby", 35, "User"] ] expect(actual).toEqualTable(expected); }); }); ``` When the test fails, you'll see a colorful inline diff in your terminal. Mismatches are rendered in colours:
![Test output highlighting the incorrect and expected values](/images/screenshot-2025-04-24-at-13.22.56.png "Test output highlighting the incorrect and expected values")
## Summary We've implemented a custom Jest matcher `toEqualTable` for asserting tabular data like spreadsheets. It visually highlights mismatches using `ascii-table3` and `chalk` directly in the terminal, making failed tests easier to debug. The matcher supports both raw matrix inputs and structured objects. Ideal for testing CSV-like data or tables with precision and readability. You can consider writing your own renderers and show differences by creating an XLSX file with colorful formatting. What helpers and utils do you implement to make it easier to work with your tests? ## Publishing to Maven Central with JReleaser from GitHub *Published: 2025-04-24 | Author: piotr | Tags: java, gradle, maven, jreleaser* *Source: https://brightinventions.pl/blog/publishing-to-maven-central-with-jreleaser/index.md* **Publishing Java libraries to Maven Central is a crucial step for sharing your work with the wider Java community. While the process has traditionally been complex, JReleaser simplifies this workflow significantly, especially when integrated with GitHub Actions. This guide walks you through configuring JReleaser to publish your multi-module Gradle project to Maven Central directly from GitHub.** ## Contents: [Introduction to JReleaser and Maven Central](/blog/publishing-to-maven-central-with-jreleaser/#introduction-to-jreleaser-and-maven-central) [Setting up PublishingExtension and the staging-deploy directory](/blog/publishing-to-maven-central-with-jreleaser/#setting-up-publishingextension-and-the-staging-deploy-directory) [Configuring JReleaserExtension in build.gradle.kts](/blog/publishing-to-maven-central-with-jreleaser/#configuring-jreleaserextension-in-buildgradlekts) [Maven Central's special requirements](/blog/publishing-to-maven-central-with-jreleaser/#maven-centrals-special-requirements) [Environment variables for jreleaserRelease task](/blog/publishing-to-maven-central-with-jreleaser/#environment-variables-for-jreleaserrelease-task) [GPG signing with armored keys](/blog/publishing-to-maven-central-with-jreleaser/#gpg-signing-with-armored-keys) [Common misconception: JReleaser vs Gradle signing plugin](/blog/publishing-to-maven-central-with-jreleaser/#common-misconception-jreleaser-vs-gradle-signing-plugin) [References and resources](/blog/publishing-to-maven-central-with-jreleaser/#references-and-resources) ## Introduction to JReleaser and Maven Central [JReleaser](https://jreleaser.org/) is a release automation tool that simplifies the process of releasing and publishing Java projects. It handles various tasks including creating GitHub releases, generating changelogs, and publishing artifacts to Maven Central. When combined with GitHub Actions, it creates a powerful, automated release pipeline. Maven Central is the primary repository for Java libraries, making your artifacts easily accessible to developers worldwide through Maven, Gradle, or other build tools. Publishing to Maven Central requires meeting specific requirements and following a particular process, which JReleaser helps streamline. ## Setting up PublishingExtension and the staging-deploy directory Before JReleaser can publish your artifacts to Maven Central, you need to publish them to a local staging directory. This is done using Gradle's PublishingExtension: ```kotlin subprojects { // Apply necessary plugins apply(plugin = "maven-publish") // Configure Java for source and javadoc jars java { withJavadocJar() withSourcesJar() } // Configure publishing configure { publications { register("maven") { from(components["java"]) pom { name.set(project.name) description.set(project.description ?: project.name) url.set("https://github.com/your-org/your-repo") licenses { license { name.set("MIT") url.set("https://github.com/your-org/your-repo/blob/main/LICENSE") } } developers { developer { id.set("your-org") name.set("Your Organization") email.set("info@yourorganization.com") } } scm { connection.set("scm:git:git://github.com/your-org/your-repo.git") developerConnection.set("scm:git:ssh://github.com:your-org/your-repo.git") url.set("https://github.com/your-org/your-repo") } } } } repositories { maven { url = layout.buildDirectory.dir("staging-deploy").get().asFile.toURI() } } } } ``` The `staging-deploy` directory serves as a temporary storage location for your artifacts before JReleaser picks them up for publishing to Maven Central. This two-step process allows for validation and preparation of artifacts before the final publishing step. ## Configuring JReleaserExtension in build.gradle.kts To use JReleaser with Gradle, you need to apply the JReleaser plugin and configure the JReleaserExtension. Here's a sample configuration from a multi-module project: ```kotlin plugins { // Other plugins id("org.jreleaser") version "1.17.0" } // Project configuration configure { gitRootSearch = true project { description = "Your project description" authors = listOf("Your Organization") license = "MIT" links { homepage = "https://github.com/your-org/your-repo" bugTracker = "https://github.com/your-org/your-repo/issues" contact = "https://yourorganization.com" } inceptionYear = "2025" vendor = "Your Organization" copyright = "Copyright (c) ${LocalDate.now().year} Your Organization" } release { github { commitAuthor { name = "Your Organization" email = "info@yourorganization.com" } } } signing { active = Active.ALWAYS armored = true } deploy { maven { mavenCentral { register("sonatype") { active = Active.ALWAYS url = "https://central.sonatype.com/api/v1/publisher" subprojects.filter { it.name != "examples" }.forEach { project -> stagingRepository(project.layout.buildDirectory.dir("staging-deploy").get().asFile.path) } } } } } } ``` This configuration: - Sets project metadata (description, authors, license, etc.) - Configures GitHub release settings - Enables GPG signing with armored keys - Sets up Maven Central deployment for all subprojects except "examples" The `gitRootSearch = true` setting is particularly important for multi-module projects as it tells JReleaser to search for the Git root directory, ensuring proper version detection. ## Maven Central's special requirements Maven Central has specific requirements for artifacts: 1. **Complete POM information**: Your POM must include: - Project coordinates (groupId, artifactId, version) - Project name, description, and URL - License information - Developer information - SCM (Source Control Management) information 2. **Required artifacts**: - Main JAR file - Sources JAR - Javadoc JAR 3. **GPG signatures**: All artifacts must be signed with a GPG key that has been published to a public keyserver and registered with Sonatype. 4. **Sonatype account**: You need a Sonatype OSSRH (OSS Repository Hosting) account with permissions for your group ID. 5. **Coordinates validation**: Your group ID should be a domain you control or have permission to use. The new Maven Central portal (central.sonatype.com) has streamlined the publishing process compared to the older Nexus Repository Manager, and JReleaser is fully compatible with this new approach. ## Environment variables for jreleaserRelease task When running the `jreleaserRelease` task in a GitHub Actions workflow, you need to set several environment variables: ```yaml env: JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} JRELEASER_GPG_PASSPHRASE: ${{ secrets.MAVEN_CENTRAL_GPG_PASSPHRASE }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.MAVEN_CENTRAL_GPG_PRIVATE_KEY }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.MAVEN_CENTRAL_GPG_PUBLIC_KEY }} JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }} JRELEASER_MAVENCENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} ``` These variables are: - **JRELEASER_GITHUB_TOKEN**: Used to authenticate with GitHub for creating releases - **JRELEASER_GPG_PASSPHRASE**: The passphrase for your GPG key - **JRELEASER_GPG_SECRET_KEY**: Your GPG private key for signing artifacts - **JRELEASER_GPG_PUBLIC_KEY**: Your GPG public key - **JRELEASER_MAVENCENTRAL_USERNAME**: Your Maven Central (Sonatype) username - **JRELEASER_MAVENCENTRAL_PASSWORD**: Your Maven Central (Sonatype) password You need to add these secrets to your GitHub repository settings to make them available to your workflow. ## GPG signing with armored keys JReleaser's signing configuration includes an important setting: `armored = true`. This setting affects the format of the GPG keys expected by JReleaser. When `armored = true`, GPG keys must be in ASCII-armored format, which is a text-based representation of the binary key data. This format is more suitable for storing in GitHub secrets and environment variables. To export your GPG keys in ASCII-armored format: ```bash # Export public key gpg --armor --export your-key-id > public-key.asc # Export private key gpg --armor --export-secret-key your-key-id > private-key.asc ``` The content of these files (including the BEGIN and END markers) should be stored in the corresponding GitHub secrets. ## Common misconception: JReleaser vs Gradle signing plugin A common misconception in many blog posts and tutorials is that you need to configure the standard Gradle signing plugin separately when using JReleaser. This is incorrect. JReleaser handles the signing of artifacts during the deploy step, so there's no need to apply and configure the `signing` plugin in your Gradle build. The signing configuration in the JReleaserExtension is all you need. If you were to use both, you would end up with double-signed artifacts, which is unnecessary and can cause confusion. The correct approach is: 1. Configure PublishingExtension to publish unsigned artifacts to the staging directory 2. Configure JReleaserExtension with signing enabled 3. Let JReleaser handle the signing and publishing to Maven Central ## References and resources For more information on publishing to Maven Central and using JReleaser, check out these resources: - [JReleaser Documentation](https://jreleaser.org/guide/latest/) - [JReleaser Maven Central Example](https://jreleaser.org/guide/latest/examples/maven/maven-central.html) - [Sonatype OSSRH Guide](https://central.sonatype.org/publish/publish-guide/) - [GPG Setup for Maven Central](https://central.sonatype.org/publish/requirements/gpg/) - [Maven Central Requirements](https://central.sonatype.org/publish/requirements/) - [Working with PGP Signatures](https://central.sonatype.org/publish/requirements/gpg/) **Note: A full working example of the configuration described in this blog post is available at [https://github.com/bright/spring-modulith-gcp](https://github.com/bright/spring-modulith-gcp).** By following this guide, you should be able to set up an automated publishing pipeline that releases your Java libraries to Maven Central directly from GitHub using JReleaser, making your artifacts available to the wider Java community with minimal manual intervention. ## Leveraging Spring AI's VectorStore for Enhanced Semantic Search *Published: 2025-04-22 | Author: piotr | Tags: spring, ai, vector, vectorstore* *Source: https://brightinventions.pl/blog/leveraging-spring-ai-vectorstore-for-semantic-search/index.md* **In this follow-up article, we explore how Spring AI's VectorStore abstraction simplifies vector storage and retrieval, eliminating the need for custom repository methods and direct vector manipulation. Learn how this powerful abstraction enhances our Support Assistant application with improved document management and attachment handling.** ## Introduction to VectorStore In our [previous article](/blog/gentle-intro-to-spring-ai-embedding-model-abstraction), we explored Spring AI's Embedding Model abstraction for semantic search using pgvector. While that approach works well, it requires custom repository methods and direct manipulation of vector embeddings in our application code. Spring AI provides a higher-level abstraction called `VectorStore` that simplifies vector storage and retrieval, offering several advantages over direct vector manipulation: 1. **Abstraction from database details** - No need to write custom SQL queries or understand vector database internals 2. **Unified API across different vector databases** - The same code works with PostgreSQL, Redis, Pinecone, and other vector databases 3. **Document-based approach** - Work with rich document objects instead of raw vectors 4. **Built-in metadata filtering** - Filter search results based on document metadata 5. **Simplified management** - Add, update, and delete vectors with simple API calls Let's see how we've enhanced our Support Assistant application using VectorStore. ## From Direct Vectors to VectorStore ### Before: Direct Vector Manipulation Previously, our application stored embeddings directly in the database entities. This approach required: 1. Adding a vector column to our database tables 2. Creating custom repository methods with native SQL queries to perform vector similarity searches 3. Manually generating and storing embeddings for each entity 4. Writing complex SQL queries with vector operators This direct approach worked but had several drawbacks: 1. It tightly coupled our application to a specific vector database implementation 2. It required writing and maintaining custom SQL queries 3. It mixed vector operations with our business logic 4. It made it difficult to add new features or change the vector database ### After: Using VectorStore With VectorStore, we no longer need to store embeddings in our entity or write custom repository methods. Instead, we can use the default autoconfigured VectorStore backed by pgvector. We can also tune the configuration, if needed, by providing a VectorStore bean: ```kotlin @Configuration class VectorStoreConfig { @Bean fun pgVectorStore(jdbcTemplate: JdbcTemplate, embeddingModel: EmbeddingModel): PgVectorStore { return PgVectorStore.builder(jdbcTemplate, embeddingModel) .vectorTableName("support_vector_store") .distanceType(PgVectorStore.PgDistanceType.COSINE_DISTANCE) .indexType(PgVectorStore.PgIndexType.HNSW) .initializeSchema(true) .build() } } ``` You can also let Spring Boot initialise the database schema on startup by setting the following property in your `application.yml` file: ```yaml spring: ai: vectorstore: pgvector: initialize-schema: true ``` And our service now uses the VectorStore for similarity search: ```kotlin fun suggestResponse(customerMessage: String, limit: Int = 5): String { // Search for similar documents in the vector store val searchRequest = SearchRequest.builder() .query(customerMessage) .topK(limit) .similarityThreshold(0.5) .build() val similarDocuments = vectorStore.similaritySearch(searchRequest) // ... } ``` Let's take a closer look at the `similarityThreshold` method used in the `SearchRequest.Builder`: The `similarityThreshold` method filters search results based on their similarity score: - It accepts a value between 0.0 and 1.0 - Only documents with a similarity score equal to or greater than this threshold will be returned - A threshold of 0.0 (the default) means any similarity is accepted (no filtering) - A threshold of 1.0 means only exact matches are returned - Higher values (like 0.7 or 0.8) return only highly relevant results - Lower values (like 0.3 or 0.4) return more results, including less relevant ones This is particularly useful when you want to ensure that only truly relevant documents are included in your search results, avoiding false positives. ## The Document Abstraction At the heart of VectorStore is the `Document` class, which represents a piece of content with associated metadata. This abstraction allows us to work with rich, structured data rather than just raw text and vectors. When creating a ticket, we now convert it to a Document: ```kotlin val ticketDocument = Document.builder() .id(UUID.randomUUID().toString()) .text("${savedTicket.title} ${savedTicket.customerMessage} ${savedTicket.agentResponse}") .metadata( mapOf( "type" to "ticket", "ticketId" to savedTicket.id!!, "title" to savedTicket.title, "customerMessage" to savedTicket.customerMessage, "agentResponse" to savedTicket.agentResponse, "category" to savedTicket.category, "status" to savedTicket.status.name ) ) .build() // Add the ticket document to the vector store vectorStore.add(listOf(ticketDocument)) ``` Note that only the text of a document is part of embedding. ## Enhanced Functionality: Ticket Attachments One of the major benefits of using VectorStore is how easily we can extend our application with new features. We've added support for ticket attachments, which are now included in semantic search. ### Converting Attachments to Documents When a ticket has attachments, we convert each attachment to a Document: ```kotlin fun attachmentToDocument(attachment: TicketAttachment): Document { val documentBuilder = Document.builder() .id(UUID.randomUUID().toString()) .metadata( mapOf( "type" to "attachment", "ticketId" to (attachment.ticket.id!!), "fileName" to attachment.fileName, "contentType" to attachment.contentType ) ) return when { attachment.content != null -> { // Text attachment documentBuilder .text(attachment.content) .build() } attachment.contentType == "application/pdf" && attachment.binaryContent != null -> { // PDF attachment - in a real application, you would use a PDF parser here // For simplicity, we're just creating a document with text content documentBuilder .text("PDF attachment: ${attachment.fileName}") .build() } else -> { // Other binary attachment - in a real application, you might use different parsers // For simplicity, we're just creating a document with metadata documentBuilder .text("Binary attachment: ${attachment.fileName}") .build() } } } ``` ### Including Attachments in Search Results When generating responses, we now include content from both tickets and their attachments: ```kotlin val context = similarDocuments.joinToString("\n\n") { document -> val metadata = document.metadata if (metadata["type"] == "ticket") { """ Customer: ${metadata["customerMessage"]} Agent: ${metadata["agentResponse"]} """ } else { """ Attachment: ${metadata["fileName"]} Content: ${document.text ?: "No content available"} """ } } ``` ## Benefits of Using VectorStore Let's summarize the key benefits we've gained by switching to VectorStore: ### 1. Simplified Code Our code is now more focused on business logic rather than vector operations. We no longer need custom SQL queries or direct vector manipulation. ### 2. Enhanced Maintainability The VectorStore abstraction isolates our application from the details of the vector database. If we decide to switch from PostgreSQL to another vector database like Pinecone or Redis, we only need to change the VectorStore configuration, not our application code. ### 3. Improved Extensibility Adding new features like ticket attachments is straightforward. We simply convert the new content to Documents and add them to the VectorStore. ### 4. Better Metadata Management The Document abstraction allows us to associate rich metadata with our content, which we can use for filtering and organizing search results. ### 5. Optimized Performance VectorStore implementations are optimized for vector operations, providing better performance than custom solutions. ## Conclusion Spring AI's VectorStore abstraction provides a powerful, flexible way to implement semantic search in your applications. By abstracting away the details of vector storage and retrieval, it allows you to focus on your application's business logic while still leveraging the power of vector embeddings. In our Support Assistant application, switching to VectorStore has simplified our code, improved maintainability, and enabled new features like ticket attachments. If you're building applications with semantic search capabilities, VectorStore is definitely worth considering. The full source code for this enhanced version is available on [GitHub](https://github.com/miensol/spring-ai-gentle-intro). ## A Gentle Introduction to Spring AI's Embedding Model Abstraction *Published: 2025-04-20 | Author: piotr | Tags: spring, ai, vector* *Source: https://brightinventions.pl/blog/gentle-intro-to-spring-ai-embedding-model-abstraction/index.md* **In this article, we'll present a simple example of using embedding models to perform semantic search via pgvector. Learn how Spring AI's Embedding Model abstraction makes it easy to implement powerful semantic search capabilities in your Spring Boot applications.** ## Introduction to Embedding Models Embedding models transform text into numerical vector representations, capturing semantic meaning in a way that machines can understand. These vectors enable powerful semantic search capabilities, allowing us to find content based on meaning rather than just keyword matching. Spring AI provides a clean abstraction for working with embedding models through its `EmbeddingModel` interface, making it straightforward to integrate these capabilities into your Spring Boot applications. ## The Support Assistant Demo Project To demonstrate the power of embedding models, we've created a simple support assistant application that uses AI to provide support responses based on previous support tickets. The application: 1. Converts customer messages into vector embeddings 2. Finds semantically similar previous support tickets using vector search 3. Uses these similar tickets as context for generating a response Let's explore the key components of this system. ## The Embedding Model API At the heart of our application is Spring AI's [ `EmbeddingModel`](https://docs.spring.io/spring-ai/reference/api/embeddings.html) interface. Here's how we use it in our service: ```kotlin @Service class ResponseSuggestionService( private val embeddingModel: EmbeddingModel, private val supportTicketRepository: SupportTicketRepository, // ... ) { fun suggestResponse(customerMessage: String, limit: Int = 5): String { // Generate embedding for the customer message val embedding = embeddingModel.embed(customerMessage) // Find similar tickets val similarTickets = supportTicketRepository.findSimilarTickets(embedding, limit) // ... } } ``` The `embeddingModel.embed()` method converts text into a vector representation, which we can then use to find semantically similar content. ## Vector Search with pgvector Once we have our text converted to vectors, we need a way to efficiently search for similar vectors. This is where PostgreSQL's pgvector extension comes in. ### The Repository Query The heart of our semantic search is the `findSimilarTickets` method in our repository: ```kotlin @Query( value = """ SELECT * FROM support_tickets WHERE embedding <=> (:embedding)::vector < :threshold ORDER BY embedding <=> (:embedding)::vector LIMIT :limit """, nativeQuery = true ) fun findSimilarTickets( @Param("embedding") embedding: FloatArray, @Param("limit") limit: Int, @Param("threshold") threshold: Float = 0.5f, // 0 perfect matches, 1 different concept, 2 opposite ): List ``` Let's break down this query: 1. `embedding <=> (:embedding)::vector` - This calculates the cosine distance between the stored embedding and our query embedding 2. `WHERE ... < :threshold` - We filter results to only include those with a distance less than our threshold 3. `ORDER BY embedding <=> (:embedding)::vector` - We order results by distance, with closest matches first 4. `LIMIT :limit` - We limit the number of results returned The `<=>` operator is pgvector's cosine distance operator, which measures the dissimilarity between vectors. ### Creating and Storing Embeddings An important part of our system is how we create and store support tickets with their embeddings. Here's how it works: ```kotlin // Generate embedding for the ticket content val embedding = embeddingModel.embed( "$title $questionVariation $responseVariation" ) val ticket = SupportTicket( ..., embedding = embedding ) supportTicketRepository.save(ticket) ``` The embedding is generated by concatenating the ticket's title, customer message, and agent response, then passing this text to the embedding model. The resulting vector is stored in the `embedding` field of the `SupportTicket` entity. In our model, the embedding field is defined with Hibernate annotations: ```kotlin @JdbcTypeCode(SqlTypes.VECTOR) @Column(name = "embedding") @Array(length = 1024) // must match dimensions of the embedding model val embedding: FloatArray? = null ``` The `@JdbcTypeCode(SqlTypes.VECTOR)` annotation tells Hibernate to use the PostgreSQL vector type, while `@Array(length = 1024)` specifies the vector dimension, which must match the output of our embedding model. ## Cosine Distance vs. Cosine Similarity It's important to understand the difference between cosine distance and cosine similarity: - **Cosine Similarity**: Ranges from -1 to 1 - 1: Vectors are identical - 0: Vectors are orthogonal (unrelated) - -1: Vectors are opposite - **Cosine Distance**: Defined as 1 - cosine similarity, ranges from 0 to 2 - 0: Identical vectors - 1: Unrelated vectors - 2: Opposite vectors The `<=>` operator in our SQL query is PostgreSQL's cosine distance operator, which measures the dissimilarity between vectors. The threshold value of 0.5 ensures that we only return tickets that are semantically similar to the query, filtering out unrelated or opposite concepts. ## Using Ollama for Embeddings For our embedding model, we're using Ollama with two specific models: - **mistral** - The default model for generating responses - **mxbai-embed-large** - A specialized model for generating embeddings Ollama provides a lightweight way to run these models locally, making it perfect for development and testing. ## Setting Up Vector Storage To use vector embeddings with PostgreSQL and Hibernate, we need a few key components: ### SQL Migration First, we need to set up our database with the pgvector extension: ```sql CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE support_tickets ( -- other columns... embedding vector(1024) ); CREATE INDEX ON support_tickets USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); ``` The key points here are: - We create a vector column with 1024 dimensions - We create an index using the IVF algorithm optimized for cosine distance operations ### Hibernate Configuration On the Java side, we need the Hibernate Vector extension: ```kotlin dependencies { implementation("org.hibernate.orm:hibernate-vector:6.6.11.Final") implementation("org.springframework.ai:spring-ai-pgvector-store-spring-boot-starter") // ... } ``` This extension allows Hibernate to work with PostgreSQL's vector type, mapping between Java's `FloatArray` and PostgreSQL's `vector`. ## Conclusion Spring AI's Embedding Model abstraction provides a clean, simple way to work with vector embeddings in your Spring Boot applications. Combined with PostgreSQL's pgvector extension, it enables powerful semantic search capabilities with minimal code. In our next blog post, we'll explore how to use Spring AI's `VectorStore` abstraction to simplify vector storage and retrieval even further, eliminating the need for custom repository methods. The full source code for this example is available in [GitHub](https://github.com/miensol/spring-ai-gentle-intro/tree/70dc3dc394d32995aadc80f220932254a5658b01). ## Who is Jennifer? User Persona for Point of Sale *Published: 2025-04-15 | Author: joanna-c | Tags: POS, design* *Source: https://brightinventions.pl/blog/user-persona-for-point-of-sale/index.md* **If you're involved in POS development, understanding the real needs of end users can be a challenge. Busy waitstaff rarely have time to articulate their experiences, pain points, or expectations. Fortunately, we’ve created a detailed user persona based on in-depth UX research and over 13 years of hands-on experience with POS systems in the hospitality industry. Download your copy now!** ## Meet Jennifer: The Everyday POS Power User Jennifer is an energetic waitress with a few years of experience working in a busy dining restaurant. While she doesn’t consider herself particularly tech-savvy, she’s incredibly familiar with her restaurant’s Point-of-Sale system — probably more than anyone else on her team. She represents a core user group for anyone working on **[POS software development](/our-areas/pos-software-development/)** efforts: someone who needs a system that’s intuitive, fast, and dependable in high-pressure environments. ## Why a Persona Like Jennifer Matters for POS Builders Whether you’re modernizing your current system or starting fresh with [POS design](/blog/payment-point-of-sale-design-ui-ux/) & development, Jennifer’s story offers actionable insights. By understanding her workflows, frustrations, and goals, your team can create better tools — and ultimately deliver a smoother, more efficient experience for frontline staff. ## What You’ll Find in the POS User Persona PDF Our free downloadable resource gives you a closer look at how Jennifer interacts with a POS system during a typical shift. Here’s what’s inside: * 💻 **Her level of technical knowledge** — and how that shapes her expectations * 🎯 **Goals she wants to achieve** — like quick order entry and having all orders in one integrated system * 😫 **Frustrations with current POS systems** — including confusing bill splitting and inability to change the order of ordered meals * 🕒 **A typical day in her life** — offering valuable context for **POS design** * 👩‍🍳 **Her appearance, attitude, and specific traits** — all rooted in real-world research This persona is especially useful if you're working on UX for POS, designing new interfaces, or evaluating how to better support restaurant staff in **modern POS systems**. ## Payment in POS Design: UI/UX Best Practices and Inspirations *Published: 2024-10-01 | Author: joanna-c | Tags: POS, design* *Source: https://brightinventions.pl/blog/payment-point-of-sale-design-ui-ux/index.md* **If you develop a [point of sale system for the hospitality](/projects/system-for-restaurants/) and retail industries, you're aware that your end users are busy. Whether they're waitstaff or shop assistants, they need to complete payment processes quickly. Every additional screen or unnecessary animation will slow them down, potentially leading to lost revenue for these businesses. Follow best POS UI design practices when designing payment features for hospitality and retail.** ## Include these practices for payment UI in POS design Before we dive into, let’s remember that our **end users are waitstaff, shop assistants, and hotel receptionists**. They work under significant stress and time pressure, managing as many clients as possible to drive revenue for the business. **POS design and technology should accelerate their processes**, not only improving efficiency but also enhancing customer satisfaction. ## Use animations for information purposes only Avoid purely decorative animations, as they can slow users down. Focus on including only informative animations that provide essential feedback, such as indicating when a payment is being processed.
![Animations in point of sale design](/images/use-animations-for-information-purposes-only.png "Animations in point of sale design")
## Include easily understandable icons with labels When presenting multiple options, such as payment methods, it's crucial to **include clear, intuitive icons** to minimize errors. To ensure accessibility, **pair these icons with labels**, making their meaning unmistakable.
![Point of sale design iconography](/images/include-easily-understandable-icons-with-labels.png "Point of sale design iconography")
## Establish button hierarchy in POS design **Emphasize the most frequently used buttons by making them larger and more prominent**, while less commonly used buttons should be smaller. This helps guide users toward the correct action efficiently. On the order management screen below, you’ll find several clickable options. However, **the most important action, “Continue,” is designed to stand out** due to its distinctive color and size, ensuring smooth navigation through the ordering process.
![Button hierarchy POS design](/images/establish-button-hierarchy.png "Button hierarchy POS design")
## Keep forms simple Some payment methods, like card payments, require filling out forms. To make this process intuitive, design fields in a way that simplifies data entry. **Best practices for form design include stacking fields vertically, placing labels directly above each field**. This layout aligns with the natural top-to-bottom way users scan information, whereas placing labels to the side forces them to shift their focus, slowing them down.
![Keep forms simple - POS design](/images/keep-forms-simple.png "Keep forms simple - POS design")
## Don’t make me think You might be familiar with the book “[Don’t Make Me Think](/blog/5-web-development-rules-from-dont-make-me-think-book/)”, which highlights usability practices based on the principle that interfaces should be so intuitive that users can navigate them effortlessly. This is especially important in **POS design** – you should **offer users clear options without making them overthink their actions**. For example, **when it comes to tipping, don’t force waitstaff to manually input an amount**. Instead, present them with popular tipping options while still allowing customization if needed.
![Don’t make me think](/images/don’t-make-them-think.png "Don’t make me think")
Another great example of the Don’t Make Me Think principle is **the design of split payment** in POS systems. **The underlying mechanism should handle all the calculations** for the users, while the interface remains as simple as possible. **Waitstaff should only be required to input information like the number of splits and payment methods**. As demonstrated, the end user simply provides the number of splits and payment methods, and the POS system guides them through the entire process seamlessly.
![Split payment design](/images/don’t-make-them-think-split-payment.png "Split payment design")
- - - The Point of Sale design was created by Aleksandra Zawisza, a Product Designer at Bright Inventions, a [POS software development company](/our-areas/pos-software-development/). ## Directories and Files Management in Tests *Published: 2025-04-10 | Author: radek-l | Tags: automation testing, unit-testing, nodejs, typescript* *Source: https://brightinventions.pl/blog/directories-and-files-management-in-tests/index.md* ## TL;DR 1. Create class `StaticTestFilesDirectory` with content provided below 2. Create class `RuntimeTestFilesDirectory` 3. Add `/**/runtime-test-files` to `.gitignore` 4. Write tests using the classes following examples below
![test management](/images/directories_files_test.png "test management")
## Intro When working with file-based tests in Node.js, things can get messy fast—especially if there’s no consistency in how test files are handled. You might start off by manually setting up folders or sprinkling file operations throughout `beforeEach` and `afterAll` blocks. Eventually, though, this becomes hard to maintain, prone to errors, and cluttered. Let’s fix that by introducing a standardized approach to managing test files and directories in your Node.js project using simple wrappers around the native `fs` and `path` modules. ## 🔍 Why It Matters In test suites that work with files—whether reading static assets or generating runtime outputs—common problems tend to creep in: * ❌ No consistent folder structure for test files * ❌ Test outputs accidentally committed because they weren’t ignored * ❌ Repetitive file-handling logic bloating test setup code * ❌ Confusion between static inputs and generated outputs Let’s solve these with two small utility classes. ## ✅ The Conventions To bring order to the chaos, let’s define two directory types: * **`static-test-files`**: for static assets checked into the repo * **`runtime-test-files`**: for runtime-generated files (**should be git-ignored**) These directories are managed using two classes: * `StaticTestFilesDirectory` * `RuntimeTestFilesDirectory` ## 🗂️ StaticTestFilesDirectory This is a lightweight helper for accessing read-only files stored in your test repo. Use this for input files that are part of your versioned test fixtures. ```typescript class StaticTestFilesDirectory { static defaultFolderName = 'static-test-files'; readonly directory: string; constructor(basePath: string, folder: string = StaticTestFilesDirectory.defaultFolderName) { this.directory = path.resolve(basePath, folder); } path(filePath: string): string { return path.resolve(this.directory, filePath); } readFile(filePath: string, options: BufferEncoding | { encoding: BufferEncoding; flag?: string }): string { return fs.readFileSync(this.path(filePath), options); } } ``` ### Example Test ```typescript describe('Static test file usage', () => { const staticTestDir = new StaticTestFilesDirectory(__dirname); it('returns the absolute path of a static file', () => { const absolutePath = staticTestDir.path('test-file.txt'); expect(absolutePath).toBe(path.resolve(__dirname, 'static-test-files', 'test-file.txt')); }); it('reads the contents of a static file', () => { const content = staticTestDir.readFile('test-file.txt', 'utf8'); expect(content).toBe('Static test file.'); }); }); ``` ## 🛠️ RuntimeTestFilesDirectory For tests that create temporary files during execution—like generated reports, downloads, or mocks—this class manages a dedicated folder that can be reset and cleared automatically. ```typescript export class RuntimeTestFilesDirectory { static defaultFolderName = 'runtime-test-files'; readonly directory: string; constructor(basePath: string, folder: string = RuntimeTestFilesDirectory.defaultFolderName) { this.directory = path.resolve(basePath, folder); } reset(): void { this.clear(); this.create(); } readFile(filePath: string, options: BufferEncoding | { encoding: BufferEncoding; flag?: string }): string { return fs.readFileSync(this.path(filePath), options); } writeFile(file: string, data: string | NodeJS.ArrayBufferView, options?: fs.WriteFileOptions): void { fs.writeFileSync(this.path(file), data, options); } create(): void { fs.mkdirSync(this.directory, { recursive: true }); } clear(): void { if (fs.existsSync(this.directory)) { fs.rmSync(this.directory, { recursive: true }); } } path(filePath: string): string { return path.resolve(this.directory, filePath); } } ``` ### Example test ```typescript describe('Runtime-generated test files', () => { const runtimeTestDir = new RuntimeTestFilesDirectory(__dirname); beforeAll(() => { runtimeTestDir.reset(); // Clear and recreate dir once per test run }); it('writes and reads a file', () => { const content = 'Runtime test file content'; runtimeTestDir.writeFile('file.txt', content); const saved = runtimeTestDir.readFile('file.txt', 'utf8'); expect(saved).toEqual(content); }); it('generates a file using external fs calls', () => { const filePath = runtimeTestDir.path('another-file.csv'); fs.writeFileSync(filePath, 'Name,LastName,Age\nRadek,Landowski,22'); const content = fs.readFileSync(filePath, 'utf8'); expect(content).toEqual('Name,LastName,Age\nRadek,Landowski,22'); }); }); ``` ## 🧼 Final Thoughts Using wrappers like `StaticTestFilesDirectory` and `RuntimeTestFilesDirectory` may feel like overkill at first—but once your test suite grows and you start juggling dozens of file-based tests, you’ll appreciate the clarity and consistency. Not only does this approach: * Reduce boilerplate * Improve file hygiene * Prevent accidental git commits of test artifacts …it also makes your tests easier to debug, understand, and maintain. Simple, clean, and effective. - - - 🧪 How do you handle test file management in your projects? Let me know—always looking to learn new patterns! ## Navigating Kotlin Module Naming Conflicts *Published: 2025-04-08 | Author: azabost | Tags: android, kotlin, gradle* *Source: https://brightinventions.pl/blog/kotlin-module-naming-conflicts/index.md* **Structuring multi-module projects often leads to wanting identical sub-directory names (like `feature1/foo` and `feature2/foo`). Historically, this caused build failures ([1](https://discuss.kotlinlang.org/t/dealing-with-kotlin-module-conflict-when-building-apk-for-project-with-non-unique-project-names/11247), [2](https://stackoverflow.com/questions/45232350/disable-meta-inf-generation-in-gradle-android-library-kotlin-project/45235642)) due to `.kotlin_module` file collisions. A common workaround was prefixing module names (e.g., `feature1/feature1Foo`), but this hurts readability and can cause issues with Windows' maximum path length. This post explains that the Android Gradle Plugin (AGP) *currently* mitigates this collision by default, making prefixing less necessary *for now*. We discuss why we've decided to stop prefixing, embracing cleaner names, and detail our contingency plans if the problem ever returns.** ## Setting the Scene: The Initial Challenge A few years ago, while structuring our multi-module Android project, we encountered a tricky issue related to Gradle module naming and directory structure. We wanted to organize related features under common parent directories, like this: ``` project-root/ - catalog/ - navigation/ # Gradle module name: :catalog:navigation - ... other modules related to "catalog" feature ... - payments/ - navigation/ # Gradle module name: :payments:navigation - ... other modules related to "payments" feature ... ``` However, this seemingly logical structure hit a snag. ## The `.kotlin_module` File Collision Problem The Kotlin Gradle plugin generates metadata files for each module, typically named `_debug.kotlin_module` or `_release.kotlin_module`. The problem was that the `` part only used the *last section* of the module's path (`navigation` in both cases above), ignoring the parent path (`catalog` or `payments`). This meant both modules generated files with the *exact same names* (e.g., `navigation_debug.kotlin_module`). When the Android Gradle Plugin (AGP) tried to package these files into the final APK, it resulted in a file collision error. ``` More than one file was found with OS independent path 'META-INF/navigation_release.kotlin_module' ``` At the time, these `.kotlin_module` files were understood to be potentially necessary for Kotlin reflection (via the `kotlin-reflect` API) to work correctly. Therefore, common workarounds for packaging conflicts, like using `pickFirst` packaging options or simply excluding these files entirely, seemed too risky. Even if *our* code didn't use reflection directly, we couldn't be certain that none of our third-party dependencies relied on it. ## Our Initial Workaround: Prefixing Module Names To avoid the conflict while preserving the (potentially required) `.kotlin_module` files, we adopted a module naming convention that included the parent directory name as a prefix: ``` project-root/ - catalog/ - catalogNavigation/ # Gradle module: :catalog:catalogNavigation - payments/ - paymentsNavigation/ # Gradle module: :payments:paymentsNavigation ``` This ensured unique module names (`catalogNavigation`, `paymentsNavigation`), leading to unique `.kotlin_module` file names (e.g., `catalogNavigation_debug.kotlin_module`, `paymentsNavigation_debug.kotlin_module`) and resolving the packaging conflict. **However, this prefixing approach had notable downsides:** 1. **Reduced Readability:** Module names like `catalogNavigation` are longer and arguably less intuitive than a simple `navigation` within the context of its parent `catalog` directory. This repetition can make the project structure feel slightly more cumbersome. 2. **Windows Path Length Limit Issues:** In deeply nested projects, combining long parent directory paths with these prefixed module directory names could easily exceed the default `MAX_PATH` (260 characters) [limit on Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation). This often prevented developers using Windows from successfully cloning the repository or building the project without manually enabling long path support in the Windows Registry or via Group Policy – a potentially annoying hurdle for contributors. ## Fast Forward: New Information Emerges Recently, through [discussions on relevant issue trackers](https://youtrack.jetbrains.com/issue/KT-9770/Allow-to-exclude-.kotlinclass-.kotlinmodule-other-.kotlin-files-from-packaging-to-android-APK) involving folks from Google and JetBrains, we learned something crucial: **the Android Gradle Plugin (AGP) now defaults to excluding `.kotlin_module` files during packaging.** The rationale seems to be that Kotlin isn't currently utilizing these files, and their future necessity is uncertain. This effectively means the original naming collision problem *doesn't currently exist*. However, there's a catch: if Kotlin *does* start relying on these files in the future, and AGP consequently stops excluding them, the original collision problem could reappear for everyone who isn't prefixing their modules. ## The Dilemma: To Prefix or Not To Prefix? This new information, combined with the known drawbacks of prefixing (readability and Windows path limits), presented us with a choice: 1. **Continue Prefixing:** Stick with our `catalogNavigation`, `paymentsNavigation` convention. It's safe against potential future issues but suffers from reduced readability and potential Windows path length problems. 2. **Stop Prefixing:** Revert to the more intuitive `navigation` module name within both `catalog` and `payments` directories. This improves readability and avoids path length issues but relies on Google and JetBrains finding a permanent solution *before* the problem potentially resurfaces. ## Our Decision and Contingency Plans Considering the current state of AGP and weighing the pros and cons, we decided to **stop prefixing** our module names and embrace the cleaner structure. Our reasoning is that the collision problem doesn't exist *today*, and might *never* come back. We prefer the improved clarity and the elimination of Windows path length concerns offered by the simpler naming convention. **However, we also have contingency plans.** If the `.kotlin_module` collision issue returns in the future, we have two main strategies to address it *without* renaming the actual directories: ### Plan A: Mapping Logical Module Names in `settings.gradle` We can rename the *logical Gradle module names* using the `settings.gradle(.kts)` file: ```kotlin // settings.gradle.kts // Keep the clean directory structure: catalog/navigation // But define a unique logical Gradle module path: :catalog:catalogNavigation include(":catalog:catalogNavigation") project(":catalog:catalogNavigation").projectDir = file("catalog/navigation") ``` **Pros:** * Keeps file system structure clean (`catalog/navigation`) and avoids Windows path limits. **Cons:** * Requires updating dependency declarations in `build.gradle(.kts)` files (e.g., change `implementation(project(":catalog:navigation")`) to `implementation(project(":catalog:catalogNavigation"))`). * Requires remembering the logical module path (`:catalog:catalogNavigation`) when running specific Gradle tasks (e.g., `./gradlew :catalog:catalogNavigation:assemble`) ### Plan B: Setting Kotlin's Module Name Alternatively, we can keep the Gradle module names consistent with the directory structure (`:catalog:navigation`) and directly control the name used for the `.kotlin_module` file via [compiler option](https://kotlinlang.org/api/kotlin-gradle-plugin/kotlin-gradle-plugin-api/org.jetbrains.kotlin.gradle.dsl/-kotlin-jvm-compiler-options/#130663460%2FProperties%2F1690289358) or [compiler argument](https://kotlinlang.org/docs/compiler-reference.html#module-name-name-jvm) in each affected module's `build.gradle(.kts)`: ```kotlin // In catalog/navigation/build.gradle.kts android { kotlinOptions { moduleName = "com.example.catalog.navigation" // or freeCompilerArgs += listOf("-module-name", "com.example.catalog.navigation") } } ``` **Pros:** * Keeps file system structure clean (`catalog/navigation`) and avoids Windows path limits. * Keeps Gradle module paths (`:catalog:navigation`) and dependency declarations (`implementation(project(":catalog:navigation"))`) intuitive and unchanged. * Gradle task invocation remains straightforward (`./gradlew :catalog:navigation:assemble`). **Cons:** * Requires adding specific `kotlinOptions` configuration to each module that could potentially conflict. Less centralized than the `settings.gradle` approach. We find the trade-offs of either plan acceptable. The potential future migration seems less disruptive than maintaining prefixed names indefinitely, especially since the need for this migration might never arise. ## Conclusion While the `.kotlin_module` file collision was a genuine issue in the past, changes in AGP's default behavior have currently mitigated it for Android development. We've opted for cleaner, non-prefixed module names. We accept the small risk that we might need to implement one of our contingency strategies in the future if the underlying conditions change. For now, we benefit from a more readable, logical, and friendly project structure. ## No Risk, No Fun or: How I Learned to Stop Worrying and Love the Risk Management *Published: 2020-08-05 | Author: kasia | Tags: risk management, agile, project management, leadership* *Source: https://brightinventions.pl/blog/no-risk-no-fun-or-how-i-learned-to-stop-worrying-and-love-the-risk-management/index.md* **I’ve been researching and writing about the [agile risk management](/blog/agile-risk-management/) for quite a few years now but mostly in relation to safety-critical software (for example [here](https://dl.acm.org/doi/10.1145/3234152.3234174) , [here](https://link.springer.com/chapter/10.1007%2F978-3-030-37534-8_4) and [here](https://journals.agh.edu.pl/csci/article/view/51) ). This time I wanted to address other types of projects, how it can work in practice and why the risk is not necessarily a bad thing.**
![agile risk management](/images/risk_management.png "agile risk management")
I started to write this blog post back in March, I already had the title and some notes. And then something unexpected ([but apparently still predictable](https://www.youtube.com/watch?v=6Af6b_wyiwI)) happened - a global pandemic. Suddenly, writing that if there’s no risk, then there’s no fun seemed inappropriate. Going out, ignoring the risks, was simply foolish and arrogant. We were all stuck in our homes, not sure about the actual threats, following the numbers, untangling expert advice from the conspiracy theories, trying to predict whether we’d make it to the summer at all. With live footage of human tragedies unfolding in different parts of the world, we looked out the window to see the trees in bloom and birds chirping, like nothing was happening. Was it really that dangerous? While it felt awkward to write candidly about the idea of risk a few months ago, I think now the timing couldn’t be better. Because now that we debate the risk at personal level, almost every day since March, maybe considering it also on a professional level would feel more natural. Because there’s always risk. Sometimes it’s unavoidable, sometimes, manageable, but it’s there. Pretending we don’t see it (or indeed, not seeing it at all) is a dangerous strategy. **But acknowledging the risk, making informed decisions and sometimes doing things anyway is where the fun begins.** ## Risk management The idea of managing the potential threats to a project is in no way a new topic. There is the golden standard (the [ISO 31000 standard](https://www.iso.org/obp/ui/#iso:std:iso:31000:ed-2:v1:en) - I have read it so you don’t have to) of [risk management](/blog/risk-management-in-healthcare/) that defines the following steps: 1. Establishing the context 2. Risk identification 3. Risk analysis 4. Risk evaluation 5. Risk treatment And on top of that, constant monitoring and review. As you can imagine, there’s a lot of processes, templates, guidelines and requirements connected with each step. Boring, yes, but that’s good. You wouldn’t want to fly a plane with an autopilot software delivered by someone who felt that risk evaluation should be fun. Or an incurable optimist just hoping for a happy path. Surely no one will ever use this weird flow that we rushed through QA because the client wanted it ready for a board meeting anyway, right? ## Context While not all of us work with safety-critical software, it doesn’t mean there are no threats associated. **Not every system needs a systematic, high brow risk policy but all would benefit from thinking about potential threats early on and monitoring them along the way.** Your team develops an app integrated with a payment system? Or maybe your system helps to [plan drug administration to the care home residents](/projects/emar-healthcare-solution/)? Depending on the domain you can choose how much attention should be devoted to risk management. In general * **Low risk apps** Examples are loyalty programs, tourist guides, simple games or weather reports. The apps that in case of malfunction will cause discomfort and users might be annoyed, but that’s it. If you work on such apps, there’s a high chance that you haven’t really put too much thought into the potential threats. And to be honest, there’s not much more work that should be done here. Focus on security, make checklists, write tests. Good advice can be found [here](https://owaspsamm.org/assessment/). * **Medium risk apps** These are the apps where you store some more delicate data, connected to health or privacy of the users or handling complex payments. The system that in case of malfunction can cause some serious financial problems or influence user’s wellbeing and health. * **High risk apps** The systems that take people to the moon or at least to the stratosphere and the ones that will save your life if you need a complicated surgery. The safety-critical creme de la creme. If you work in such an industry, a blog post would never be enough to cover all the issues so I won’t even try. Nevertheless, [here](https://www.springer.com/gp/book/9783319702643) and [here](https://arrow.tudublin.ie/cgi/viewcontent.cgi?article=1127&context=scschcomcon) you can find some interesting ideas. All that follows concerns these medium risk apps in an agile environment. Where it feels that filling in a risk matrix and xls spreadsheets will be awkward but still some degree of risk awareness is needed. You can use all of the suggested practices or just one, depending on the project’s needs. ## Risk identification That’s the step where you basically think about all the things that can go wrong. The more visions of impending doom, the merrier (in a twisted, risk oriented way), so a brainstorming technique works great here. Gather as many people engaged in the project as you can - especially the ones who always undermine any idea you come up with. Now’s their time to shine and you can actually appreciate it. When is the right time to organise such a meeting? If you’re using Scrum, such discussion could be held after at least the first version of Backlog is created, so that you have some idea about the functionality and the domain but not after the main architectural decisions have been made. When you have already thought about what you want the system to do, there comes the time to think about what you wouldn't want. Listing all of the users and roles can be a great start - much like with the user stories. Reverse user stories if you like. You can also start with the functionalities of the system. Actually, one of my favourite techniques are Hazard (or [Abuser](https://medium.com/@jimvdwaal/abuser-stories-thinking-like-a-hacker-ed7999b507c8)) stories. They can follow a pattern like: “As a result of < definite cause >, < uncertain event > may occur, which would lead to < effect on objective(s) >” ## For example: “As a result of a lost internet connection, data about the drugs dosage might not be refreshed for a long time, which would lead to wrong drug dispensation.” Or just follow the structure of the backlog items that you have in your project - more like anti-features. You will notice shared patterns between the hazards described this way. Some causes will appear more often than others, as will the unwanted effects. These are the elements you’ll need to pay more attention to. It’s a good idea to keep the list of hazards in the same tool that you use as your issue tracker. The goal is to store it somewhere people can actually see it. Since we use JIRA at Bright, I will refer to it as an example. It allows you to create multiple boards per project with different filters, so a Risk Board or something like this can be a good idea. You can use a customized issue type, like “Hazard” or “Risk factor” and filter it out only on your Risk Board. ## Risk analysis & evaluation Once you have your hazards listed, you need to take a step back and breathe deeply. It may seem like a lot of bad things can happen, it’s quite overwhelming. But obviously not all of the identified threats are as likely to happen or have the same consequences. Risk is defined as the probability that harm occurs multiplied by the severity of that harm - so a potentially life threatening situation that’s highly unlikely to happen can have less impact on the project than something far less dangerous that affects your system a few times a day. There’s even a matrix for [that](https://en.wikipedia.org/wiki/Risk_matrix), but any scale would do. Think about these two dimensions and based on that prioritise the hazards, High - Medium - Low would be enough. Another thing to consider is how these risks are introduced in the system. No one will actually implement Hazard Stories on purpose. What will be implemented though is the User Story connected with the Hazard Story. This is the crucial link, that should also be reflected in the issue tracker. For each hazard, there should be at least one feature which could unwillingly introduce it to the system. During implementation of this particular feature, we should be aware of the bad twin - the hazard task. If you’re using JIRA, it can be a good idea to even create some customized relations. The user stories can also have sub tasks dedicated just to overcome the hazard - connect them as well. They will be super useful at the QA stage. ## Risk treatment & monitoring There’s little value to a list of hazards if you’ll never look at it again. Treat the risk items as a part of your backlog, just with different purposes than the regular tasks. Think about them when planning sprints, check the connected hazards before moving a development task to Done. Adding “Check connected hazards” as a step to the [Definition of Done](/blog/definition-of-done/) is a good way to remind everyone about it and turn it into a habit. As I mentioned before, you can assign some development tasks to counteract the harm presented by the risk items. Sometimes you just need to add 2-Factor Authentication or handle an [offline mode](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/) to stay confident. Sometimes though, you look at a hazard and can do only as much as to stretch your arms helplessly and say “Yes, this can happen indeed”. There is an approach to reducing the risk called **ALARP - As Low As Reasonably Practicable**. Sometimes it would be too costly to do anything about a particular threat, or there are few options left anyway. It’s like with leaving your house these days - you can hide in the bunker and order all your groceries online, washing every product with 70% alcohol, risking insanity (and getting drunk from the fumes) or go out, wear a mask, sanitise your hands and accept the residual risk. The crucial part is to be honest with yourself and your team about the risks. Team members should feel comfortable to mention any concerns - only then you can manage the risk in a meaningful way and feel collectively responsible for the final result. **Knowing the risks, then reducing the ones we can and ALARPing the rest is in a way a definition of responsibility.** It’s not about avoiding any risk at all cost. You will never be 100% safe but that’s life. Wear a helmet and ride the bike, fasten your seatbelt and drive the car, encrypt the connection and let the users enjoy your great system. In the end, you’ll have to suck it and see. ## Completing the Void: Finding What's Missing in a Software Engineering Career *Published: 2025-04-04 | Author: sebastian-r | Tags: bright insights* *Source: https://brightinventions.pl/blog/ios-developer-career-story-sebastian/index.md* **Sebastian is a software engineer with over a decade of experience. Read about his journey through various areas of software development until he fully embraced native iOS. Discover his tips for successful software modernization, his approach to working in international teams, and more!**
![senior iOS develop](/images/brightstorysebastianrgrid.png "senior iOS develop")
## Was your career always related to iOS development? No, my career started in frontend and then backend development, but I didn’t really enjoy that. Afterward, **I worked for 4–5 years on hybrid applications** and eventually decided to learn Android development, before **finally switching to iOS**. ## Why did you have all these changes in your career direction? I was simply looking for ways to grow and develop myself. I spent quite a long time in the hybrid app development world, but **something always felt missing** – mainly in terms of functionality and performance. I often found myself needing to implement native components, which naturally led me toward native development. Also, I didn’t like the fact that sometimes you had to wait for crucial updates in the framework or plugins just to make your cross-platform app work properly. That was frustrating and limiting. ## You’ve been a software developer from the beginning of your career, but you didn’t study Computer Science, did you? That’s right – I chose **Automatics and Robotics** for my Bachelor’s studies to keep my horizons broad. I wanted to have the **flexibility to pursue different career paths**, especially those related to digitalization. In the end, programming spoke to me the most. I was **always drawn to coding**, even though the languages used in robotics were a bit outdated. I started exploring more modern programming languages in my free time, and that’s when I realized that software development was the direction I really wanted to follow.
![Christmas party vibes.](/images/christmas_party_sebastian.png "Christmas party vibes.")
Christmas party vibes.
## What are the biggest challenges for iOS developers right now? One is, naturally, the rapidly developing cross-platform solutions that are becoming more and more competitive, and it’s **getting harder to convince a client to invest in native development**. Another challenge, common for all programmers, is **learning how AI may support us** in daily work – catching up with all these tools and recommending some of them to clients. ## What AI tools do you use on a daily basis apart from Microsoft Copilot? I mostly work with **ChatGPT o3-mini-high** and experiment with **Apple Intelligence**. ## What are your responsibilities right now? For one of our clients, we’re **implementing a full redesign of the mobile application**, which also involves a complete **modernization** – we’re basically building a new app from scratch, while still **providing full support for users of the current version**. We’re introducing newer solutions, including switching from UIKit to SwiftUI. The client is very open to testing new solutions, which is great, but it’s also our responsibility to carefully evaluate whether adopting a trendy new technology is actually the right fit for our project. ## What is your advice for successful app modernization? It’s better to plan [app modernization](/our-areas/app-modernization/) with a clear **understanding of the broader business context** of the solution we’re about to rewrite. If we don’t have that perspective, we need to ask questions on the client’s side to better understand what exactly we’re changing. It goes far beyond just the code – **any software modernization can impact the entire digital business**.
![quote on app modernization](/images/sebastian_quote_modernization.png "quote on app modernization")
## You work with clients from across the globe. What is it like to work in multinational teams? **I enjoy working in inclusive teams** because each country brings a different perspective. I get the chance to learn more about other people’s habits, cultures, and even work techniques. Also, I don’t mind working with people in different time zones – for example, syncing with US time doesn’t bother me at all, although I understand why it can be challenging for some people. ## What differences between the Polish perspective and other countries have you noticed? I think one clear difference is our tendency in Poland to avoid speaking openly and proudly about what we've achieved at work. For many of us, once something is done, it feels obvious and not worth mentioning. But I’ve noticed, for example in American culture, that **they celebrate every step forward** – what we might see as a minor milestone can be seen as a significant success.
![quote on work culture](/images/sebastian_quote_work_culture.png "quote on work culture")
I think here in Poland, we should also try to look for more reasons to **appreciate what we do** – to recognize our own value and better appreciate our contributions to the project’s success. ## You’ve been a part of Bright Inventions for nearly 3 years. Any thoughts on these past years? I really enjoy working here. I appreciate the support I get from my colleagues and managers – they **encourage me to grow**. I also love the fact that I can truly influence the project I’m working on. It gives me the opportunity to look at it not only from a technical perspective but also from a **business point of view**. That’s a great aspect of my work, and it’s something that can’t be taken for granted as a programmer.
![teambuilding](/images/teambuilding_sailing.png "teambuilding")
At our team-building sailing retreat.
## Is it true that you worked as a lifeguard in the USA? Oh yes! I always wanted to visit the USA, but of course, you need money for that. When I was a student, some friends recommended a **program for working and traveling**. Since my wife and I could swim quite well (she’s actually much better than me), we thought we could work there as water lifeguards. We got in touch with a company in Poland that organized everything, we also completed the **American lifeguard course**, and eventually went to the US for 4 months during my fourth year of college. We worked for 3 months and then traveled across the States for a month. I have great memories from that time and still keep in touch with some of the people I met there.
![Visiting Zion National Park in the USA.](/images/us_trip.png "Visiting Zion National Park in the USA.")
Visiting Zion National Park in the USA.
## I heard that you like walking in the woods in the evening. What are you looking for there? 😉 Some adventures for me and my dog, Admin. 😄 ## The Truth About Keys and Re-Renders in React *Published: 2025-03-31 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/keys-and-re-renders-in-react/index.md* **Let’s explore a concept in React that is often misunderstood: *keys*. When rendering collections in React, developers frequently use the map function to iterate over items and generate components. However, React requires an additional step: specifying a unique key for each item in the collection. This requirement, often emphasized in React’s documentation (and reinforced by console warnings), is crucial for efficient rendering and maintaining component state across re-renders. To understand why keys are important and often misunderstood, let’s start from the basics.**
![](/images/react_keys_re-renders.png "")
## **How React reacts?** Every React component undergoes a series of lifecycle steps. To simplify, these steps can be categorized as: **initial rendering** (mount), **re-rendering** (update), and component **removal** (unmount). For now, we’ll focus on the first two phases. React handles these operations in three distinct steps: the **trigger step**, the **render step**, and the **commit step**. ### **Trigger step** The trigger step is the starting point for any re-render in React. It occurs whenever an update is necessary, such as when a **component’s state changes**, a **parent component re-renders**, or a **subscribed context value updates**. These actions signal React to check if any part of the component tree needs to be updated, prompting the process to move into the render step. ### **Render step** The render step marks the next step in React’s component lifecycle. It occurs during the initial mount and whenever updates are triggered (in the trigger step). During this phase, React performs **reconciliation**, a process driven by a **diffing algorithm** that utilizes both the **Virtual DOM** and the **React Fiber** architecture. Based on the comparison of the previous and updated representations of the component tree, React determines the component’s output, which is essentially the UI. For child components, React recursively invokes their render functions (or component logic in functional components) and those of their descendants to ensure the entire component tree is re-evaluated. ### **Commit step** Based on the diffing process, React updates only the necessary parts of the real DOM during the commit step. It’s important to note that just because a component’s render function is called, it doesn’t guarantee a DOM update for that component, as **rendering and DOM updates are separate processes**. Understanding this distinction is crucial for addressing a common myth, which I’ll explain in the next section. ## **Does keys prevent re-renders?** A common myth surrounding keys is the belief that: > Keys prevent re-renders of unchanged components Keys play a crucial role in helping React efficiently match elements between renders. While their function extends beyond this, we’ll focus on their role in DOM updates for simplicity. However, it’s important to note that **keys alone do not prevent re-renders**. React’s default behavior is to re-render all items in a collection whenever the parent component updates, even if the individual items remain unchanged  -  unless specific optimization techniques are applied. Let’s explore this with an example involving a **List** component and an **ListItem** component. When the List component’s state is updated (e.g. a new item is added), the **render** phase is **triggered**. During this phase, React determines what changes need to be applied to the real DOM. It does this by iterating through the List and its child components, invoking their render methods/component’s function execution. What happens to the existing *n* elements in the collection after adding a new item? According to the myth, they shouldn’t be re-rendered — but is that really true? Not quite. ### **Keys role in DOM updates** Keys help us identifies specific elements. The key point here is to follow the specific [rules for assigning keys](https://react.dev/learn/rendering-lists#rules-of-keys) in React to ensure they serve their purpose correctly and efficiently. Keys indeed plays non-directly role in performance optimization but not by avoiding re-renders. Let’s try it on a simple example ([also available on the playground](https://reactplayground.vercel.app/#N4IgLgziBcBmCGAbCBTANCAbrK1QEsA7AExQA8A6AK1xHwFsAHAewCcwACAQUcY9lbN6HAOQUA9D0bUIZEQB1CDFuw4AlFPADGnAUNGtNOhUqZtOwDlsPwwKNc2acAvv0HCRNnQFpiQ8VqI+CiEYCaKWsyEEJyRofBEKKwcALwcfloArvQhYBQA5ihgAKKIKDmhAEIAngCSxAAUno5hAJQRUTEcgk6pVjZ2Dk4NcWAJhEnthD15hiRJDYoc6kZ51pp2peW5i4TLyxraeQDKYKz4OgCyzKRoS-uEmYiId3v7hzoU67YoWxVgDSkU2WU1aIAwUhkZBgdDMqg+YDQHEsmVQpx+HFcemE8hAXjAuIA3IoOtFOFI+g1WqkAHzI+6GMCZVh7AA8ABl8F1xDTiYRnHzSV1OV00lTafS3nEugBtfB2egQJGoMC1BUQAC6fVRKHRdgaMvuy0s+GI0A4l1sAAsKKx4CQhOLnK99siOKbzZawDa7Q76E6XRwNa1BVLOpx4MRiGrypTqSk6cAjVZwxwJgB3GPCNIms0W622+1+f3UgXJlVZiANEbMuaq9XxukyigtrKsOuVpEZrPBvn7MtvBlFZl7Xau1nEfCYGnJ5asgBGmTAYCiHCiAGEgloANYpYCR6MK5w0rhR90K1niRfLqIzt7jp5312u4Dy8oQCj0eCMatv+iNjgOS5etY23FBqj3P8KFNVw-0go8OB5VpnFnQDxEfZNL0nad7hDRQByFTgRRA7MOAaE0FUxACkzDaJmDKChEGYfJFjoSi5lIVhcSRKDTTwwghyZFlAKCGlXwVaDiGcS9RL5AiJjIFROFIBAnnJXg+RAZxnCAA)) ```javascript import React, { useState } from "react"; const App = () => { return ; }; const List = () => { const [items, setItems] = useState([ { id: Math.random() }, { id: Math.random() }, ]); const addItem = () => { const newItem = { id: Math.random() }; setItems((currentItems) => [...currentItems, newItem]); }; return (
    {items.map((item) => )}
); }; const ListItem = ({ item }) => { console.log("item render", item.id); return
  • {item.id}
  • ; }; export default App; ``` Our setup consists of two components: **List**, which manages state changes, and **ListItem**, which represents a single element from the collection. During the initial render, the console output will look something like this: ``` item render 0.9271951880982141 item render 0.9720048278427091 ``` That seems pretty straightforward, right? Now, let's add a new item by clicking the **Add Item** button. According to the common belief, we should see just one additional log in the console. To make it clearer, let's first clear the console. Ready? Let’s give it a try: ``` // 1st (initial) render item render 0.9271951880982141 item render 0.9720048278427091 // 2nd render (re-render) item render 0.9271951880982141 item render 0.9720048278427091 item render 0.738685209572542 ``` That’s odd - we see **three** new logs (five in total if we count the initial two). But surprisingly, this is actually the expected behavior. So, how does React handle all these changes? As mentioned earlier, every state change triggers a re-render of the component that owns the state, along with all of its child components - in this case, both the **List** and all its **Item** components. Notice that even using keys doesn't prevent this. However, there’s a grain of truth in the idea: **keys help React efficiently manage updates to the real DOM**. **By identifying which items have changed, keys ensure only the new elements are added or updated in the DOM, leaving unchanged elements intact**. Let’s try it, this time focusing on DOM updates, not components re-renders. Open dev tools of your browser and find the structure which represents List component. The initial markup looks like this:
    ![Initial markup of list component](/images/zrzut-ekranu-2025-03-30-o-18.46.17.png "")
    Now, let’s add a new item. As you might notice, there's a slight blink that highlights the changes applied to the DOM — but only the newly added item gets highlighted.
    ![Newly added list item](/images/zrzut-ekranu-2025-03-30-o-18.47.15.png "")
    I've prepared a [playground](https://reactplayground.vercel.app/#N4IgLgziBcBmCGAbCBTANCAbrK1QEsA7AExQA8A6AK1xHwFsAHAewCcwACAQUcY9lbN6HAOQUA9D0bUIZEQB1CDFuw4AlFPADGnAUNGtNOhUqZtOwDlsPwwKNc2acAvv0HCRNnQFpiQ8VqI+CiEYCaKWsyEEJyRofBEKKwcALwcfloArvQhYBQA5ihgAKKIKDmhAEIAngCSxAAUno5hAJQRUTEcgk6pVjZ2Dk4NcWAJhEnthD15hiRJDYoc6kZ51pp2peW5i4TLyxraeQDKYKz4OgCyzKRoS-uEmYiId3v7hzoU67YoWxVgDSkU2WU1aIAwUhkZBgdDMqg+YDQHEsmVQpx+SNRv1gsBQOkxqA0sA4rj0wnkIC8YApAG5FB1opwpH0Gq1UgA+ZH3QxgTKsPYAHgAMvguuJ2XTCM5JQyuiKumlWRyuW84l0ANr4Oz0CBI1BgWraiAAXT6WPRdga6vuy0s+GI0A4l1sAAsKKx4CQhErnK99siOPbHc6wG6PV76D6-Rxja0ZarOpwgjEiWbCShYA1Hs84-SE4yOPBiMRDeUWWyUpzgDarImOBMAO6l4RpO0Op2u92evyRtnSmv65sQBojPlzA1Giuc9UUWdZVjjodIxvN2OS5b9wj3LHFHF4gFKysq-1qzjMABGqFYmCSfUbTsyYzA+CiAHlL0kb6wR-RH7YX9EU7Hv6HC-k+AEQBQsBsMU2guj+f7PlEQHVm8IG1tEzBlBQiDMPkiwgAAIq+lwPuBUTpEU+4oA6FJImB-7IeuIHOLmaEkmxNb4MSDTJmARJfGOuRsqh6EXleX4UOJn4oLxor8RmgkLrkSKiehVguvgiDEPKYCOmcmToDWG5sf6zh5v6PJ8nsh5VsZHDSdeSQUMQopxBMOissxG7Mb6HDqmuFndEU1kcLs-oCq5mDsvZArno+YAUVEADCQRaAA1ikwBFiW2rOOyXDFoG2oCuI8VgIlhAxexywCk8wWwFlfFEvl9m2lq5SQfQ8CMCOHX0EB4XqbVunNhw6UoNUWX9RQ9quP1015Rw4ptRwrStOZNUcKVTzVRF4hRXta2SpusqcKN2osnal2scqalqlhKA4XhBH9cF8ysHRxXlLNxCcW8Vn8ttQTssAM1zaVIMnfG5AqJwpAIE8TK8DSIDOM4QA) with an additional **[MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)** to help visualize this behavior more clearly. In the console, you'll see logs showing the re-rendering of all items (each item’s id is printed). However, when it comes to actual DOM mutations, only **one mutation** is detected — the insertion of the newly added item: ``` DOM Mutation detected: Mutation Record { addedNodes: NodeList [li] attributeName: null attributeNamespace: null nextSibling: null oldValue: null previousSibling: li removedNodes: NodeList [] target: ul type: "childList" [[Prototype]]: MutationRecord } ``` This distinction between React re-renders and real DOM changes is exactly what this example demonstrates. Is it possible to modify this default behavior and make only the newly added items re-render? The short answer is yes — there are techniques to achieve that. However, let's save those for another time. ## **Summary** React keys play a crucial role when working with dynamic lists by helping React accurately identify which items have changed, been added, or removed. This allows React to update the UI correctly during the **reconciliation** process. However, it's important to understand their true purpose: **keys do not prevent re-renders**. Instead, they help React maintain consistency and efficiently match elements between renders. - - - ##### Take a look at our earlier blog post debunking frontend myths: 1. [To ‘b’ or Not to ‘b’: The Semantic Status of HTML ‘b’ Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) 3. [JavaScript Types De-Objectified](/blog/javascript-types-deobjectified/) 4. [Eye on ‘i’ — Understanding ‘i’ as a Semantic Element](/blog/understanding-i-as-semantic-element/) 5. [Breaking Down the “alt” Attribute Myth in img Tag Best Practices](/blog/breaking-down-alt-attribute/) ## The Imago Trap in Recruitment - Why Chasing the Perfect Candidate or Company Can Backfire *Published: 2025-03-30 | Author: ula | Tags: business, leadership, recruitment* *Source: https://brightinventions.pl/blog/the-imago-trap-in-recruitment-why-chasing-the-perfect-candidate-or-company-can-backfire/index.md* In the world of talent acquisition, we often chase **an imago - the perfect vision of what could be.** Recruiters dream of the imago candidate, the one who fits perfectly into a role, bringing the right mix of skills, experience, and attitude. Candidates, on the other hand, search for their imago company - a place that aligns with their values, ambitions, and career goals. Like two puzzle pieces waiting to connect, both sides craft an ideal image in their minds. But the real magic happens not when perfection is found, but when expectations evolve, and a great match is built through shared vision and growth. After all, **the best hires aren’t just found - they are made.** **The word "imago" comes from Latin, meaning "image" or "ideal." But beyond language, it carries a deeper, more psychological weight. In [imago relationship therapy, pioneered by Harville Hendrix and Helen LaKelly Hunt](https://www.psychologytoday.com/intl/therapy-types/imago-relationship-therapy), it represents the unconscious blueprint of a partner—a reflection of the caregivers who shaped us in childhood.** According to this theory, we are drawn to romantic partners who echo both the strengths and wounds of our earliest relationships. It is as if, deep down, we seek to heal old patterns through new connections. Love, then is not just about finding someone, it is about recognizing the echoes of our past and learning how to shape a healthier future together. # **imago as a part of the recruitment cycle** In recruitment imago represents the idealized vision both employers and candidates create during the hiring process. The challenge lies in bridging the gap between the expectations and reality, turning ideal matches into real opportunities. 🔎 While crafting a job description, employers (often represented by recruiters) outline the qualifications and characteristics they are looking for in an ideal candidate. This description represents the "imago candidate" for the particular role. 🔎 During the screening process recruiters compare applicants' qualifications and experiences against the "imago candidate" profile to determine if they are a good match for the position. 🔎 During an interview hiring managers and recruiters may ask questions designed to assess how closely a candidate aligns with the "imago candidate" profile, including questions about skills, experience, and cultural fit. The final hiring decision is typically based on how closely a candidate matches the "imago candidate" and whether they are the best fit for the organization and the specific role. **It is important to note that the "imago candidate" concept represents an ideal or desired standard and may not always be fully achievable. In the context of an employer looking to fill a job vacancy, having a rigid “imago" can pose several risks and challenges.** # **drawbacks of rigidly chasing the ideal candidate’s image** 💣 It may hugely narrow talent pool, which can be particularly problematic in a competitive job market or for specialised roles where finding an exact match is challenging. 💣 It may cause overlooking candidates with transferable skills, diverse backgrounds, or unique perspectives that could bring fresh ideas and innovation to the organization. 💣 The extended time to hire can result in higher recruiting costs, including advertising expenses and the time and effort spent by recruitment/HR team on the search. 💣 What is more, if the ideal candidate profile is too unrealistic, there is a risk that the selected candidate may not fully meet those expectations. This can lead to dissatisfaction on both sides, as the candidate may struggle to meet unattainable standards and the employer may feel let down. **In reality recruitment should be rarely about finding a perfect match. It is about balancing priorities.** Employers and recruiters may focus on the most critical qualifications and competencies while remaining open to candidates who bring unique strengths, fresh perspectives, and unexpected value to the role. **The best hires often come from this blend of must haves and game changers.** # **imago in the candidate’s expectations**  Having an ideal image while looking for new cooperation opportunities is not only reserved for employers. It is also a common thing among applicants and prospects who want to face fresh career challenges. **The image of the "perfect" employer can significantly limit the number of job opportunities available to a candidate.** The job search process can become longer and more frustrating if you are holding out for an employer that precisely matches your imago. In some cases, candidates may even remain in unfulfilling or unsatisfying roles for an extended period while waiting for their ideal employer to come along, potentially missing out on opportunities for career advancement. **To mitigate these risks candidates may strike a balance between their ideal employer criteria and practical considerations.** ### **What can you do if you are a candidate?** * Prioritise core values that are most important to you. These might include company culture, work life balance, growth opportunities, or specific job responsibilities. Not everything is equally important. Decide what is your priority. * Be open to exploring opportunities with a range of companies including these that may not perfectly match your imago. Sometimes unexpected experiences can lead to rewarding career paths. * Conduct thorough research on potential employers to ensure they align with your core values and career goals. This can help you make informed decisions during the job search. * When you receive a job offer, think strategically. Focus on the aspects that are crucial to you while keeping focus on the expectations of your future employer. **The collaboration will make sense only when two sides understand each other’s expectations.** * Think of your work as a journey filled with ups, downs, and everything in between. Along the way you will come across different people, face unexpected challenges, and celebrate small (and big) wins. What truly matters is what you take from each experience and how you choose to see it. **You can focus on what went wrong or you can recognise the lessons, growth, and opportunities that came with it. In the end the glass is as full as you decide it to be.** * Don't let fear of imperfection stop you from pursuing opportunities. Focus on presenting your strengths, learning from feedback, and seeking roles where you can contribute and grow. It is about aligning your skills and aspirations with a role, not being the “perfect” fit from the outset. # **the costs of unrealistic imago**  The cost of expectations mismatch can be huge for both job seekers and companies. If a candidate secures a job with their ideal employer but later discovers that the reality does not match their expectations, it can lead to bitter disappointment. When employers hire candidates who lack the necessary skills, they may waste time, money, and other resources on recruitment, training, and onboarding. This can not only strain the organization's budget, byt also reduce productivity. 
    ![costs recruitment](/images/04-skills-mismatch-3.png "")
    Source: https://vervoe.com/skills-mismatch/ Let us not forget that **employees who feel they are not adequately prepared for their roles are more likely to leave their jobs, which leads to high turnover rates that can disrupt the workplace, increase recruitment costs, and lower employee morale.** Even if bridging the skills gap is possible, employers may need to invest in additional training and development programs. While training can be beneficial, it can be costly and time-consuming. To address the imago mismatch, it is essential for both employers and job seekers to communicate effectively and conduct thorough values and skills assessments during the recruitment process. # **what can you do as a recruiter to make the imago more realistic**  **1. Transparent job descriptions** - provide a detailed description of job roles and responsibilities, be specific about the skills and experience required, and include information about the company culture and team dynamics. **2. Showcase real employee stories** - share testimonials from current employees about their experiences e.g. a typical day at work, or show career path stories to highlight career progress within the company. Don’t sugarcoat it. Show your company as it really is, with all its ups and downs. Every workplace has its challenges, just like it has its wins. Authenticity builds trust, and people appreciate the real story, not a polished illusion. **3. Authentic visual content** - use real photos and videos from your workplace rather than stock images, share behind the scenes content to give potential candidates a glimpse of the work environment. **4. Take care of candidate’s experience** - keep transparent communication throughout the whole process. Keep candidates informed at every stage, set clear expectations, and most importantly, ask for their feedback. Understanding how they perceive the process helps you refine it and shows that you value their time and effort, even if they don’t end up joining your team. A well-managed hiring process is not about creating a perfect career page and filling roles, it is about building relationships. **5. Realistic expectations** - be honest about the challenges of the job as well as the rewards, provide a realistic view of work-life balance at your company. One of the biggest mistakes recruiters make is overselling the role, painting an idealised picture that does not match reality. If the job comes with tight deadlines or a steep learning curve, say so. If work-life balance varies by season or project, be clear about it. **Candidates appreciate honesty. It is better to have someone excited about the real job than someone disappointed by a broken promise.** **6. Engage with current employees** - regularly ask employees for feedback and implement changes in the job descriptions or recruitment proces based on their input. **7. Transparent compensation and benefits** - provide clear information about salary ranges and benefits, and highlight opportunities for career advancement and personal growth. Applying these tips can help shape a more authentic and realistic hiring vision, the one that truly reflects the company’s culture, values, and the kind of talent that thrives within it. # **summary - choose smarter** Being idealistic isn’t a bad thing, but we must balance it with the realities of our goals and the business expectations we face every day. Voltaire's famous words, *"The perfect is the enemy of the good,"* remind us that chasing perfection can hinder progress. Instead of striving for the ideal candidate or the perfect company, **perhaps the key lies in collaboration and helping to shape and nurture those qualities together.** Prioritize what truly matters. Mistakes happen - on both sides. A candidate might stumble in an interview, or an employer might realize too late that the job description does not fully capture what the role needs. What truly matters is learning from these moments and refining the process. For recruiters, it is about looking beyond a checklist and recognizing potential - the ability to adapt and grow within the company. For candidates, it is about seeing each experience as a stepping stone, understanding that the right fit is not always about perfection but about alignment and opportunity. **Momentum is key whether you are a recruiter refining the talent search or a candidate navigating your career path, the goal is progress, not flawlessness. In the end it is about finding the best match, not a perfect one.** ## Static Files vs. Dynamically Generated Files in Test Code *Published: 2025-03-27 | Author: radek-l | Tags: automation testing* *Source: https://brightinventions.pl/blog/static-files-vs-dynamically-generated-files-in-test-code/index.md* **In the previous article we've covered [basic guidelines of working with files in test automation](/blog/automated-tests-with-files-guidelines/). Today let's go deeper. At some point developers must decide whether to use static files stored in the repository or generate them dynamically during test execution. Each approach has its advantages and disadvantages. Let's explore both methods in detail.** ## Static Files Stored in Repository Static files are pre-created and stored in the repository, ie: * In `src/file-processing/test-fixtures` * `valid.csv, empty-file.csv, 100-rows.csv, missing-first-name-column.csv` ### Advantages of Static Files 1. **100% Compliant with Production Usage** – Users upload files through Web interface and you use the same files in your code - full match. 2. **Proper Domain Entity Representation** – Files are easily understandable by both technical and business stakeholders. 3. **Serves as Documentation** – Provides clear examples of supported file formats. 4. **Usable in Manual Testing and Demos** – Testers and demo users can easily use these files. 5. **Intuitive for Humans** – No need to interpret test code to understand file contents. 6. **Clearly Defines System Specification** – Quickly answers, "What kinds of files are supported in our system?" ### Disadvantages of Static Files 1. **Difficult to Maintain** – Modifying multiple files (e.g., adding a new column) is cumbersome. 2. **Editing Requires Dedicated Software** – XLSX files require Excel or a similar application. 3. **Poor Git Diff Readability** – Changes to binary files are not human-readable in version control. 4. **Not Compilation Aware** – Changes in system requirements (e.g., making a column required) do not trigger test updates. 5. **Risk of Outdated Test Files** – Without clear enforcement, files may not reflect schema changes. 6. **High Maintenance Overhead** – Complex schemas may require dozens of files for different test cases. ## Dynamically Generated Files During Test Execution Instead of storing test files in the repository, they can be generated on demand. Example code: ```typescript // valid.csv type HeaderType = [string, string, string, string] const header: HeaderType = ['First Name', 'Last Name', 'Age', 'Salary']; const rows = [ ['John', 'Doe', '30', '50000'], ['Jane', 'Smith', '25', '60000'], ['Alice', 'Johnson', '35', '70000'], ]; // createCSV function writes file to file system and returns its path const validFile: HeaderType = createCSV('valid.csv', header, rows); // missing-data.csv const header = ['First Name', 'Last Name', 'Age', 'Salary']; const rows = [ ['John', 'Doe', '30', ''], ['', 'Smith'], ['Alice', '', '35', '70000'], [] ]; const missingDataFile = createCSV('missing-data.csv', header, rows); ``` **\*HeaderType** is also used in production code which ensures compilation time safety of the files* ### Advantages of Dynamically Generated Files 1. **Compilation Aware** – Changes in data models automatically reflect in test cases, making your test files impossbile to desynchronize with application 2. **Type-Safe and Reliable** – When using with strongly typed languages it enforces correct structure using types and classes in compilation time 3. **Easy to Modify and Extend** – Developers can quickly add or modify test cases. 4. **Facilitates Randomized and Large Data Sets** – Useful for performance and uniqueness constraints. 5. **Integrates with Technical Endpoints** – Can be exposed as a test data API for manual testers. ### Disadvantages of Dynamically Generated Files 1. **Less Directly Compliant with Production Usage** – May not precisely mirror real-world files. Writing CSV and XLSX files to disk can be done in many standards and encodings. Often times the file created in Google Sheets, Numbers and node-xlsx library will differ in their behaviour in some nuances 2. **Harder to Communicate with Non-Technical Stakeholders** – You cannot take this peace of code and show it to your Product Owner to describe what your system accepts. It's too abstract and technical. 3. **Less Immediately Readable** – A static CSV file is easier to understand at a glance than CSV generation code. ## Conclusion Both static files and dynamically generated test files have their place in software testing. Static files provide clarity and domain compliance, while dynamic generation offers flexibility and maintainability. The best approach often depends on the complexity of the system, the frequency of changes, and the need for collaboration with business stakeholders. A hybrid approach—where core test cases use static files and more complex or frequently changing scenarios leverage dynamic generation—can offer the best of both worlds. More on that in future posts. ## Agile Risk Management: Risk Management Framework In Software Development *Published: 2025-03-24 | Author: kasia | Tags: HealthTech* *Source: https://brightinventions.pl/blog/agile-risk-management/index.md* **Risk management in Agile development is often overlooked or misunderstood, but it’s a crucial part of delivering high-quality and safe software products. In industries like [healthcare software development](/our-areas/healthcare-software-development/), where software is deeply integrated into medical devices and patient care, risk management becomes even more critical.** In this guide, I’ll walk you through an Agile approach to risk management, using Hazard Stories and a structured Risk Backlog, ensuring that risks are identified, tracked, and mitigated effectively. ## Establishing the Context: Why Agile Risk Management Matters Agile frameworks like Scrum and Kanban focus on **iterative development**, which means new features are added continuously. However, this also means that **new risks emerge throughout development**. A good example is an **eHealth application** where patients can access their drug dispensation schedules. If such an app fails, the consequences could be severe – from missed medication doses to incorrect drug administration. By embedding risk management into Agile workflows, teams can proactively address these challenges **without slowing down innovation**. ## Risk Management Framework: The Agile Way Risk management starts with **identifying potential hazards**. In Agile projects, this can be done in a **Risk Identification Meeting**, ideally **after the first version of the backlog** has been created. This ensures that teams have a clear idea of the product's functionality and domain **before major architectural decisions are made**. ### Hazard Stories: Capturing Risks Like User Stories One of the most effective Agile risk management techniques is **Hazard Stories**. These are structured similarly to User Stories but focus on identifying risks. #### Format of a Hazard Story: As a result of *definite cause*, *uncertain event* may occur, which would lead to *effect on objectives*. For example:

    As a result of a server outage, prescription data may not sync, which would lead to patients missing critical medication reminders.
    By writing hazard stories, teams can **clearly articulate risks**, making them easy to discuss, prioritize, and mitigate. ## Building a Risk Backlog: Structure and Ownership Once risks are identified, they need to be **tracked and managed**. This is where a **Risk Backlog** comes into play. Think of it as a lightweight **Risk Register**, tailored for Agile teams. ### What Goes Into a Risk Backlog? Example Risk Backlog Table for an eHealth App (Drug Dispensation Use Case) A Risk Backlog typically includes sections as: * Hazard Story * Risk Probability * Priority * Strategy * Owner * Product Backlog Task * State
    ![](/images/risk_backlog_orange.png "")
    ### Example 1 Hazard Story: As a result of failure to sync with backend, outdated medication plans may be shown, which would lead to patients taking incorrect dosages. Risk Probability: High Priority: High Strategy: Add sync retry logic and display last update timestamp Owner: DevOps & Backend Team Product Backlog Task: #SYNC-42 — Sync Error Handling State: In Progress ### Example 2 Hazard Story: As a result of unclear UI design, patients may misinterpret medication schedules, which would lead to incorrect administration of drugs. Risk Probability: Medium Priority: Medium Strategy: Redesign UI for clarity and run usability tests Owner: UX Team Product Backlog Task: #UX-21 — Schedule Redesign State: In Review ### Best Practices for Managing the Risk Backlog: * Store the backlog in the same tool as your issue tracker (e.g., JIRA) for visibility. * Assign a Risk Owner to each identified risk. * Regularly review and update the Risk Backlog as new hazards emerge. * Keep discussions open and transparent—risk management should be a shared responsibility. ## Evaluating and Mitigating Risks with Risk Matrix and ALARP Once risks are logged, they must be **analyzed and prioritized**. This is usually done using a **Risk Matrix**, which evaluates risks based on **likelihood and impact**. Once risks are logged, they must be **analyzed and prioritized**. This is usually done using a **Risk Matrix and the ALARP principle**, which evaluates risks based on **likelihood and impact**. ### What is a Risk Matrix? A **[Risk Matrix](https://en.wikipedia.org/wiki/Risk_matrix#:~:text=A%20risk%20matrix%20is%20a,the%20category%20of%20consequence%20severity.)** is a visual tool used to **assess and prioritize risks** by mapping them based on their **probability (likelihood of occurrence)** and **impact (severity of consequences)**. It helps teams focus on the most critical risks that require immediate attention while deprioritizing lower-impact ones. For example: * **High Probability + High Impact** → Critical risk requiring urgent action. * **Medium Probability + Medium Impact** → Tolerable risk that should be mitigated. * **Low Probability + Low Impact** → Low-priority risk that can be monitored. By using a Risk Matrix, teams can **quickly assess the severity of different risks** and make informed decisions on mitigation strategies. ### The ALARP Meaning A practical approach is to follow the **[ALARP](https://risktec.tuv.com/knowledge-bank/debunking-the-alarp-principle-four-myths-and-realities/) (As Low As Reasonably Practicable) principle**, which ensures that risks are reduced **without overburdening the team**. * **Unacceptable risks** (High probability + High impact) should be eliminated or significantly reduced. * **Tolerable risks** (Medium probability + Medium impact) should be mitigated. * **Broadly Acceptable Risk** (Low probability + Low impact) should be monitored but not necessarily acted upon immediately. By using ALARP, teams **avoid unnecessary over-engineering** while still addressing critical risks. ## File-Based Test Automation: Best Practices and Guidelines *Published: 2025-03-20 | Author: radek-l | Tags: unit tests, automation testing, QA* *Source: https://brightinventions.pl/blog/automated-tests-with-files-guidelines/index.md* **Test automation is a crucial aspect of modern software development, ensuring the reliability and stability of applications. For systems that rely heavily on file processing, adopting best practices for file-based test automation is essential. In this article, we will explore guidelines for effectively managing test automation with both static and dynamically generated file inputs.**
    ![File-Based Test Automation](/images/blog-automated-tests-with-files-guidelines.png "File-Based Test Automation")
    ## Balancing Static and Dynamic File Inputs One of the key considerations in file-based test automation is the balance between static and dynamically generated file inputs: * **75% of your test automation file input should be dynamically generated**, while the remaining 25% should be static files. (There is an upcoming blogpost on compile time safe files) * Static files offer **assurance and credibility** but can be difficult to maintain. * Dynamically generated files improve **developer experience (DX)** and encourage developers to write tests more efficiently. ## Well-Typed File Factories and Models Using well-defined file factories, models, and types is crucial: * Ensure your test data **adheres to the file processing specifications** of your system. * Leverage **static typing and compilation** to prevent issues before runtime. * Utilize structured file factories that allow flexibility while maintaining strict compliance with the system’s requirements. ## Test Pyramid and Static File Usage The **higher** a test is in the test pyramid, the **more** it should rely on static files: * QA teams and business stakeholders prefer discussing **domain-specific entities**, such as files, rather than abstract dynamic file creators. * For file-processing systems, **including static file examples in User Stories** enhances clarity and establishes clear expectations. ## Naming Conventions and Organization To maintain clarity and accessibility: * **Name static files descriptively** to reflect their contents and purpose. * Ensure static files are **easily accessible** to all team members and included in **User Stories and task definitions**. * If a User Story requires a file upload feature, the associated file should serve as a **natural acceptance criterion**. * Consider a **naming convention** for multi-tenant systems or specific clients: * `[tenant]-[valid|invalid]-[name].csv` (ie., `poland-valid-full-data.csv`, `poland-invalid-missing-age-column.csv`). ## Test Reporting and File Comparison Effective test reporting and validation methods should include: * **Including both static and dynamically generated files** in test reports for better debugging and traceability. * **Creating expected versions of output files** and comparing them in a way that aligns with human perception. * Instead of iterating over rows and columns in code, use **dedicated expected files** for comparison, making manual verification easier when needed. ## Managing Static and Dynamic Files To keep test automation organized: * **Clearly distinguish static files from dynamically generated ones** with appropriate naming conventions. * Store **dynamic files and test outputs in dedicated folders**, excluding them from version control (`.gitignore`). ## Conclusion File-based test automation plays a pivotal role in ensuring system reliability, particularly in file-processing applications. By balancing static and dynamic file inputs, maintaining structured file models, following naming conventions, and integrating files into test reporting, teams can build robust and maintainable test suites. These best practices not only enhance automation quality but also foster collaboration between development, QA, and business teams. ## Watch BrightDevTips: Bite-Sized Technical Knowledge in 60 Seconds *Published: 2025-03-11 | Author: sara-l | Tags: programming* *Source: https://brightinventions.pl/blog/watch-brightdevtips-bite-sized-technical-knowledge-in-60-seconds/index.md* For developers who value efficiency, we present BrightDevTips – a series of concise, under-one-minute video tutorials that deliver practical technical knowledge without the fluff.\ \ We break down complex technical concepts into actionable insights you can apply immediately. No lengthy introductions, no unnecessary theory – just practical, code-focused solutions you can implement right away. ## Recent Highlights From Our Collection Our growing library includes tutorials on: API and Integration Solutions * [Tutorial on generating API client code](https://youtu.be/LNK16t7eTsc?si=zX6WROOPv1pFdrbE) * [Guide on using mocking for development](https://youtu.be/K9bUzNxv9TU?si=SU_75oh8LVrOy1Tn) * [Tutorial on accelerating API development](https://youtu.be/SSCnijV3nxw?si=v8ZayLhF6CuSbEOU) * [Authentication setup tutorial](https://youtu.be/iJbNsfb8xqE?si=zfb3PZ-yW9Zvgcp3) * [Decoupling application from messaging systems](https://youtu.be/bIumJX11C44?si=JMm2j66OnheVh516) Cloud and Infrastructure * [Guide on integrating AWS credential management with development environments](https://youtu.be/QDPn3McA9QE?si=Tdyjy7jfGdDZYy6Q) * [Comparison of infrastructure-as-code approaches for AWS VPC](https://youtu.be/x4UKIutovUk?si=p2rNTGVXRBUZvNp4) Observability and Monitoring * [Log forwarding setup](https://youtu.be/kbhS_G7lQRk?si=cZKW3TzzLTjTfFAq) * [Distributed tracing implementation](https://youtu.be/hHssafgTm-A?si=6OGxBI09rmS3LvYj) * [Metrics collection tutorial](https://youtu.be/D1gbwxkN7A0?si=fIyO2V32ApI8QXMm) * [Log consolidation approach](https://youtu.be/sfYAJflotGw?si=nYTYB5BZsEOfojd2) * [Optimization techniques for telemetry](https://youtu.be/vmvEyqBmJEo?si=6amxZuL_hshVvp03) Development Technologies * [Overview of new JSON capabilities in Hibernate](https://youtu.be/SdYEjkGZUvY?si=I5dY6FqYzcVuYgfT) * [Extension methods tutorial](https://youtu.be/c7DDd0TK9Qk?si=9cqVPKvFHmPTvZ_i) * [Using containerized testing for Spring applications](https://youtu.be/57SPdiHwVSo?si=g6xet2hwfIHqmQOq) Mobile Development * [New screen handling capabilities](https://youtu.be/T-FbUBqqpYU?si=80rtywdqe7onJPbS) * [Full-screen UI implementation](https://youtu.be/1Rd1M4e27U8?si=-3zP9y9rxjnl-PSq) * [Mobile testing framework overview (Maestro)](https://youtu.be/wjg8DwGCAiw?si=ZW45uvU62_3cKXtx) * [Quick tip for stopping Android Studio from jumping between tabs during app runs](https://youtu.be/M-LMy-4UbgA?si=4fgE5AoXULU7U0P3) Developer Tools and Productivity * [Overview of built-in HTTP client functionality](https://youtu.be/dF5VuUfDdxM?si=VwnmzjiOEqwFk_44) * [Efficient code restructuring techniques](https://youtu.be/xdtd8lQYcU8?si=dAHaoWgT4Uh7mdWJ) * [Dependency management approach](https://youtu.be/sxaSOJDM2CI?si=ZJ34c27wIXt0VhE1) ## Join Our Community Subscribe to our BrightDevTips series on YouTube and never miss our latest technical insights and discover a more efficient way to approach your development tasks. [Check out our BrightDevTips tutorials.](https://youtube.com/playlist?list=PLXQKLMVoAz1TGkvgMLu86iEekp5rSQAlZ&si=xet43uvvw_MCvTac) ## Breaking Down the "alt" Attribute Myth in Tag Best Practices *Published: 2025-03-05 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/breaking-down-alt-attribute/index.md* **As frontend engineers, embracing Accessibility (A11y) is our commitment to ensuring that our websites are welcoming to individuals with various disabilities. In this article, I will delve into a crucial aspect of A11y — the utilization of techniques that facilitate a seamless experience for visually impaired users.**
    ![](/images/blogpost_blog__alt_image.png "")
    ## Introduction One widely discussed practice is employing the **alt** attribute for all **``** tags, a simple yet impactful method to enhance the accessibility score of our pages. However, as we explore this approach, we’ll uncover nuances and consider scenarios where this practice may not only be unnecessary but potentially disruptive for users relying on screen readers. ## The alt attribute The **alt** attribute serves a dual purpose. It acts as a fallback description in scenarios where an image fails to download or display correctly, and, crucially, contributes to **Accessibility** by providing screen readers with valuable descriptive content. Commonly, discussions about the **alt** attribute carry an additional assertion: that it is a required attribute (and should always contain a description). While the **alt** attribute definitely helps with web **accessibility**, we'll explore situations where its insistence might be misunderstood, challenging existing beliefs and helping create a more balanced view of its role in building an inclusive online experience. Our myth can be defined as follows: > The ‘alt’ attribute is required for the HTML `` tag
    ![Usage of the alt attribute and it's effect when image is broken](/images/alt-img.png "")
    In the attached image, the effective utilization of the **alt** attribute is clearly evident, providing a descriptive and helpful description for an image that, for various reasons, may not be visually displayed. As we delve deeper into the subsequent section of this article, our focus will shift toward **Accessibility**. Here, we'll examine scenarios where the improper use of the alt attribute may pose challenges for users navigating the page, underscoring the significance of thoughtful and considerate implementation to enhance the overall user experience. ## When to Embrace and When to Pause? While the **alt** attribute generally enhances our webpage by providing a description of images, it’s important to acknowledge that its use isn’t universal. There are instances where caution is advised. Specifically, when featuring images that complement the content, employing the **alt** attribute becomes crucial for delivering a meaningful description. This practice not only aligns with the right approach in web development but also ensures accessibility for users across various platforms, including web browsers and screen readers. ### Navigating Alt Attribute Omissions Conversely, there are instances where refraining from using the **alt** attribute is advisable, mainly to avoid potential disruptions. #### Decorative images One such scenario involves images that serve as mere embellishments rather than integral components of the page’s content. In essence, if an image is purely decorative and doesn’t contribute to a comprehensive understanding of the main content, omitting the **alt** attribute is a considered choice. Consider [MDN](https://developer.mozilla.org/) as an example. In the background, there’s a decorative image (specifically an ``, but it could be an ``). This image is non-essential for comprehending the presented content, rather, it serves as a visual addition. If any issues arise with displaying this image, there’s no imperative to provide a description such as “*decorative image*” or “*mandala*”. Importantly, users relying on screen readers will seamlessly bypass this non-essential image without any disruption to their exploration of the page, as the main content remains unaffected by its absence.
    ![MDN Homepage with mandala pattern in the background](/images/mdn.png "")
    #### Images associated with corresponding text Similarly, another scenario where using the **alt** attribute is discouraged involves images already associated with corresponding text. Taking a closer look at [Mozilla's page](https://www.mozilla.org/en-US/careers/listings/), specifically the **Products** menu with product/service options, each image (in this case, an `` tag) is accompanied by the respective product/service name. In such cases, providing an **alt** attribute for a potentially malfunctioning image becomes redundant. The adjacent text carries enough information, ensuring that even if the image fails to load, the content’s understanding remains intact. If the product icon is displayed without accompanying text, it is essential to provide an alt attribute for accessibility.
    ![Mozilla careers menu](/images/mozilla-careers.png "")
    #### Images with text, associated with corresponding text In more complex scenarios, such as when an image contains text (rather than being a simple icon), it may be possible to omit the alt attribute. This can be the case when the text is presented adjacent to the image in a way that screen readers can easily read, or when the text is purely decorative. See the example below for clarification:
    ![Image that shows example of image that doesn't require alt attribute](/images/firefox-question.png "")
    The text under the image matches the text on the image, making it easy to follow along without needing an extra alt attribute — no redundancy. #### Summary To sum up, you can skip the alt attribute in a few cases. First, for purely decorative images that add no meaningful content. Second, when images contain text that’s either decorative or already presented nearby. Third, you can also avoid it for redundant images, such as an icon next to a text that says the same thing. ### Alt Attribute Dilemma How should we approach the absence of the **alt** attribute? Is it advisable to omit it entirely or include an empty string? Remarkably, these two scenarios yield disparate outcomes. The recommended approach involves providing a meaningful **alt** attribute for instances where a fallback message is desired. In this case, screen readers will articulate the assigned value, and the browser will display the placeholder icon, contributing to an optimal accessibility experience. When the **alt** attribute is absent, a fallback is automatically provided in the form of a placeholder icon, ensuring visibility for broken images and the screen reader reading the **src** attribute as a fallback.  Conversely, employing an empty **alt** attribute (*alt=””,* which will be interpreted by Chrome dev tools as a just *‘alt’*) results in a `` tag with 0x0 dimensions, the absence of the placeholder icon, and no acknowledgment by the screen reader, effectively concealing the image’s existence. 
    ![Code snippet that highlights distinctions in the usage of the alt attribute in various cases](/images/code-snippet-alt.png "")
    Presented below is a table that highlights and summarizes the distinctions between the three approaches
    ![Table that highlights distinctions in the usage of the alt attribute in various cases](/images/alt-summary.png "")
    In conclusion, when addressing scenarios where the **alt** attribute is deemed unnecessary and potentially disruptive, opting for an empty string as the value proves to be the most advantageous choice. This decision benefits both the web browser by eliminating the broken image icon and any additional text, and screen readers seamlessly bypass the image without registering its presence. ## Hands-On Exploration: Experience it Yourself! Curious to witness the examples described earlier in action? Our focus will be creating a setup that allows us to experience these distinctions using a screen reader. To explore these differences, we’ll use the code snippet provided above ``` Alt attribute presentation Cat photo

    ``` To simulate a screen reader experience, we can utilize the “**Screen Reader**” Google Chrome extension (as well as built-in OS Voice Over), accessible [here](https://chromewebstore.google.com/detail/screen-reader/kgejglhpjiefppelpmljglcjbhoiplfn?hl=pl&utm_source=ext_sidebar).
    ![Screen Reader Google Chrome extension logo](/images/screen-reader-logo.png "")
    Now, simply open the HTML file in your browser and activate the extension. Once enabled, you’ll notice an orange border highlighting the currently focused element. In the backdrop, you’ll find the document’s title, “*Alt Attribute Presentation*”. The first focused element will be “*Cat Photo*”, where, due to a broken image path, the **alt** attribute will be read aloud. To navigate to the next element, use the shortcut `Ctrl + Cmd + Arrow Down` (on Mac), and you’ll hear the path for the image (“*path-to-image*”). Significantly, attempting to advance reveals that the scenario involving an empty string as the **alt** attribute value is not considered, a choice that proves beneficial in certain cases, as demonstrated earlier. ## Summary While incorporating the **alt** attribute is generally considered a best practice and is highly recommended, it’s crucial to engage in thoughtful consideration. We need to ask ourselves if the additional description truly enhances the accessibility (**A11y**) of our page. In certain scenarios, this extra information might prove troublesome for both screen readers and web browsers. Occasionally, it becomes essential to challenge the norm and prioritize the best possible experience for our visitors. Furthermore, mastering the ability to discern between various approaches to define the **alt** attribute allows us to choose the most fitting one for our specific case. - - - ##### [](https://brightinventions.pl/blog/javascript-types-deobjectified/#take-a-look-at-our-earlier-blog-post-debunking-frontend-myths)Take a look at our earlier blog post debunking frontend myths: 1. [To 'b' or Not to 'b': The Semantic Status of HTML 'b' Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) 3. [JavaScript Types De-Objectified](/blog/javascript-types-deobjectified/) 4. [Eye on 'i' - Understanding 'i' as a Semantic Element](/blog/understanding-i-as-semantic-element/) ## Walking 850km to Escape Programming: Michał’s Story of Burnout & Renewal *Published: 2025-03-05 | Author: michal-be | Tags: bright insights* *Source: https://brightinventions.pl/blog/software-developer-career-story-burnout-renewal/index.md* **Michał once tried to step away from software development, but he soon realized it was his true calling. Learn about his holistic approach to software, how he overcame job burnout, and what he looks for in candidates as a tech recruiter at Bright Inventions.**
    ![Fullstack developer career story](/images/brightstorymichalbgrid.png "Fullstack developer career story")
    ## Without giving it any thought, what’s closer to your heart: backend or frontend? It's hard to say, but if I had to choose, I’d go with the **backend**. But right now, I mostly work on frontend in my current project, so **my focus shifts from time to time**. I believe my responsibilities in backend will continue to grow. Nevertheless, I see software development as a whole – a holistic solution. I believe you can make better decisions on the frontend when you understand the backend.
    ![Quote on fullstack development](/images/michal_quote_fullstack.png "Quote on fullstack development")
    ## Can you provide an example of that? For instance, let's say we're working on software that stores a large amount of data in a very specific way. By understanding the acceptable response time for users to access this data, we can determine **during the design phase whether a certain feature is feasible or not**. If you're focused only on the frontend, adding advanced filters might seem like no issue. However, **if you understand the data layers behind those filters, you can suggest a better solution** for displaying filtered results in a way that minimizes frustration for users. These suggestions can be made as early as the design phase, helping us avoid major issues later in the development process. ## You recently became one of Bright Inventions' tech recruiters. What are your first impressions? My first impression is that I need to optimize my time slots because **it’s difficult not to go over schedule**. Since we are now recruiting fullstack developers, there is a lot to cover with each candidate. I planned around seven sections to discuss, and on paper, it made sense – I thought I would manage within the established time. However, the reality was different. Even though I have specific questions, **it’s easy to dive into discussions that go beyond the main points**. I have to control myself and ensure that I don’t extend the interview unnecessarily. ## What do you take into account while assessing a candidate? The first thing I assess is whether a candidate truly understands a given topic or is simply repeating memorized definitions. This is easy to verify by the way they describe it – **whether they explain it naturally or just recite predefined phrases**. I also like to discuss specific scenarios and ask when they would use certain abstractions to see if they can truly engage with the concept. Another crucial aspect for me is **whether a candidate can admit when they don’t know something**. Often, this is followed by a strong deduction process, where they actually work their way to the right answer. This is in contrast to someone who claims to know but then just talks without providing meaningful insight.
    ![Quote on candidate interview](/images/maciek_quote_candidate.png "Quote on candidate interview")
    I also appreciate when candidates **refer to their own experience** and provide real-life examples from their work. If they have a different opinion on a subject, that’s even better – it shows that they are capable of questioning things, which often comes from deeper experience and a broader perspective on the topic. ## How do you find yourself at Bright Inventions? I’m glad to be surrounded by a large number of specialists. Compared to my previous workplaces, where there was a wider variety of team members with different levels of experience and knowledge, **here the average level of experience is really high**. This gives me plenty of opportunities to learn from others and develop innovative ideas. I also appreciate that **we are trusted with a lot of freedom, but it comes with responsibility**. I think that’s the ultimate combination.
    ![Laser tag team building.](/images/teambuilding_laser_tag.png "Michał at a laser tag team-building event.")
    Michał at a laser tag team-building event.
    ## I heard that you had a solo pilgrimage to Santiago de Compostela. How did this experience affect you? I had taken part in **Camino the Santiago** pilgrimage before, but always in a larger group with my family and friends. This time, I decided to do it alone. Naturally, **I met many people along the way**, giving me multiple opportunities to interact with others, hear their stories, and understand their perspectives and values. I think that’s the best part of this experience – the chance to **connect with people from all over the world** and see how they perceive life. It allows you to gain a much-needed **fresh perspective**. ## Why did you decide to take this solo walk? I had just left my job at the time, so I finally had the opportunity to do it. When I left, **I was exhausted** – I needed space and time to breathe, to gain some distance. **I had been working too much** and giving a lot, but I realized that there are more important things in life and that I couldn’t continue like that. In the end, this pilgrimage showed me that **I actually missed my work**. Even though my initial goal was to escape from it, the further I walked, the more I realized how much I missed it. I just needed to come back in a different way – **establishing boundaries for myself** to maintain a healthy balance between work and life.
    ![Santiago de Compostela](/images/santiago_de_compostela.png "Arriving in Santiago de Compostela after walking 850km.")
    Arriving in Santiago de Compostela after walking 850km.
    ## What do you like to do after work? Sports. For as long as I can remember, I’ve always loved **racket sports** – tennis is my number one. I’m also passionate about **cooking**, which used to feel like a curse to me, but now I truly enjoy it. I **play the guitar**, and honestly, it’s something I can’t imagine my life without.
    ![Cooking](/images/cooking_michal_b.png "Cooking")
    ## Risk Management in Healthcare: 2025 Guide *Published: 2025-03-03 | Author: kasia | Tags: HealthTech* *Source: https://brightinventions.pl/blog/risk-management-in-healthcare/index.md* **In 2025, risk management in healthcare is more critical than ever. With the increasing reliance on digital health solutions, AI-driven diagnostics, and remote patient monitoring, the risks associated with healthcare software and operations have never been higher.** But what is risk management in healthcare? And how can healthcare organizations implement effective risk strategies to mitigate risks while staying agile? This guide explores the risk management definition in healthcare, risk analysis, key principles, and real-world examples of how healthcare facilities can enhance patient care, ensure **safety and compliance**, regulatory compliance, and data security. ## What is risk management in healthcare? At its core, risk management in healthcare refers to the process of identifying, assessing, and mitigating potential risks that could negatively impact patient care, healthcare providers, and organizations. **Enterprise risk management in healthcare** ensures that **risk management activities are conducted** systematically to prevent harm to patients, protect **recipients of healthcare**, and improve efficiency. A well-structured enterprise **risk management model** includes **processes to identify risks**, analyze their impact, and implement **action plans** for mitigation. **Healthcare risk management** is essential for protecting **patients out of the hospital**, minimizing **hospital-acquired conditions**, and addressing **operational risks occur** in medical settings. ### Key elements of risk management healthcare organizations must consider: * **Regulatory Compliance**: Adhering to ISO 31000, HIPAA, GDPR, and FDA requirements * **Patient Safety**: Reducing medical errors, misdiagnoses, and adverse events * **Cybersecurity**: Protecting electronic health records (EHRs) from data breaches. Implementing a **data backup system** and encryption protocols. * **Operational Risks**: Addressing **lack of training**, staffing shortages, and **capital equipment costs and interest rates**. ## Why Risk Management is Important to Healthcare Facilities In 2025, the **healthcare industry** faces evolving risks due to AI-powered diagnostics, telehealth, and IoT-connected devices. **Risk management is important** because it helps organizations prevent financial losses, ensure regulatory compliance, and support the **wellbeing of the workforce:** * **Compliance is Getting Stricter**: Regulatory bodies are tightening rules around patient data security and AI decision-making in healthcare. * **Cybersecurity Threats Are Rising**: Ransomware attacks on hospitals and healthcare software providers are increasing, putting patient data at risk. **Data backup system** implementations are also now essential due to increasing ransomware threats. * **Patient Safety Remains a Top Priority**: Errors in digital health applications can directly impact clinical outcomes, making risk management in healthcare essential. ## Without a strong risk management plan, healthcare facilities could face: * Legal penalties and fines for non-compliance. * Data breaches leading to loss of sensitive patient information. * Reputational damage that erodes patient trust. * Financial losses due to operational inefficiencies and malpractice lawsuits. Proactively implementing healthcare risk management strategies ensures facilities can prevent these risks and provide safer, more efficient care. ## Risk management strategies in healthcare To understand how risk management healthcare strategies work in practice, let’s look at real-world examples: 1. ### Implementing a Risk Backlog for Patient Safety **Challenge**: A hospital using an eHealth system noticed delays in updating drug distribution statuses prescription orders, leading to incorrect drug administration. **Solution**: By creating a Risk Backlog, the [healthcare software development](/our-areas/healthcare-software-development/) team tracked the root cause, implemented real-time alerts for delayed prescriptions, and reduced medication errors. 2. ### Securing Healthcare Data Against Cyber Threats **Challenge**: A telehealth platform experienced an attempted ransomware attack, risking patient records. **Solution**: The company adopted ISO 31000:2018 guidelines, conducted regular penetration testing, and encrypted all patient data, preventing future attacks. 3. ### Agile Risk Management in AI-Driven Diagnostics **Challenge**: An AI-based diagnostic tool had inconsistencies in detecting certain medical conditions. **Solution**: Developers introduced Hazard Stories in the Agile backlog, ensuring each AI decision was verified for accuracy before deployment. ## Risk Management in Healthcare Examples: Understanding Risk Levels Not all software carries the same level of risk. Some applications require extensive risk management, while others can function with minimal oversight. ### Low-Risk Apps (Risk assessment is usually less crucial) Examples of low-risk apps include: * Meditation apps. * Hydration reminder apps. * Habit tracking apps. These apps do not handle sensitive patient data or impact critical healthcare decisions. A malfunction in these apps might cause annoyance or inconvenience, but it won’t lead to harmful consequences for recipients of healthcare. For low-risk apps, basic security measures like data encryption, access control, and regular software updates are usually enough. However, developers should still follow best practices for secure coding and usability testing. ### Medium and High-Risk Apps (Managing risks is essential part of their development) * Medium-risk apps involve patient health data and complex payments (e.g., telemedicine platforms, appointment scheduling software). * High-risk apps include life-critical software, such as medical devices, AI-driven diagnostics, and surgical assistance tools. For these applications, risk assessment must be integrated into Agile workflows, with continuous monitoring, regulatory compliance, and security testing. **Risk management strategies** should align with the **organization’s risk culture**, ensuring **strategies can result** in improved compliance and efficiency. ## Final Thoughts: The Future of Risk Management in Healthcare As healthcare continues to evolve in 2025 and beyond, integrated risk management will remain a critical factor in delivering safe, efficient, and compliant care. With AI-driven diagnostics, digital health platforms, and remote monitoring solutions becoming the norm, organizations must adapt risk management strategies to match the rapid pace of innovation. As **healthcare is the practice** of improving patient outcomes, **integrated risk management** will be a cornerstone of the industry. The **practice of analyzing healthcare practices and processes** is critical to identifying and addressing **risks related** to digital transformation, cybersecurity, and regulatory shifts. With rapid technological advancements, organizations must ensure **processes to identify risks** remain adaptive and robust. **Healthcare organization’s activities** should incorporate **risk management teams** to create structured **action plans**, allowing institutions to **prevent financial losses**, reduce **liability risks**, and **prevent losses and optimize profitability**. By implementing **enterprise risk management models**, **risk management is important** to maintaining the **strategic value lies** in ensuring **organization’s risk appetite** aligns with long-term healthcare goals. Future healthcare systems will rely on proactive **ways to mitigate risks** while ensuring **similar compliance requirements** are met effectively. ## Risk Management in Healthcare [PDF]. Download Free Ebook *Published: 2025-02-20 | Author: kasia | Tags: HealthTech* *Source: https://brightinventions.pl/blog/healthcare-risk-management-ebook/index.md* **Ignoring risk doesn’t make it disappear—it only increases the chances of security breaches, compliance failures, and costly delays. That’s why I created "Risk Management in eHealth – The Agile Way", a free guide that helps healthcare software teams stay agile while maintaining safety and compliance.** ## What You’ll Learn About Risk Management in Healthcare: * How to integrate risk management into Agile development without slowing down. * The essentials of ISO 31000:2018 and why it matters in healthcare software. * How to use Hazard Stories and Risk Backlogs to identify and track risks. * The difference between low, medium, and high-risk apps—and what each requires. * Practical strategies to balance agility, compliance, and security in HealthTech. ## The author **[Kasia Łukasiewicz](https://www.linkedin.com/in/katarzyna-lukasiewicz/), Ph.D.,** Senior Project Manager at Bright Inventions A business analyst, project manager, and Agile expert with over a decade of experiencein software consulting and mentoring. She holds a Ph.D. for developing AgileSafe, a method for integrating Agile practices into safety-critical software development. A lecturer at Gdańsk University of Technology and active contributor to the Agile community. ## Guest authors **[Aahuti Rai](https://www.linkedin.com/in/aahutirai/)** Healthcare Innovation, NED & Advisor, Venture Partner & Connector **[Adam Brown, MD MBA](https://www.linkedin.com/in/adambrownmdmba/)** Founder @ABIG Health ## Breaking Barriers in Healthcare: Dr. Adam Brown on Interoperability and Business *Published: 2025-02-19 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/adam-brown-on-healthcare-interoperability/index.md* **[Dr. Adam Brown](https://www.linkedin.com/in/adambrownmdmba/)**, an emergency physician and entrepreneur, shares insights on his journey from medicine to business, emphasizing the importance of [healthcare software development](/our-areas/healthcare-software-development/) and policy impact. In this interview, he discusses challenges in bridging the gap between clinical practice and business, the significance of [interoperability in e-health](/blog/interoperability-in-healthtech-experts-insights/), and the future of [AI in healthcare](/blog/the-impact-of-ai-on-healthcare-hype-vs-reality/). He also offers advice for startups entering the US market and highlights key trends in the industry. ## **Can you briefly introduce yourself and your current role?** Sure. My name is Dr. Adam Brown. I'm a practicing physician, an emergency physician. And I wear a couple of different hats. I'm the founder of **[ABIG Health](https://www.abighealth.com/)**, which is a marketing and communications firm that works with healthcare companies in the US and abroad. I am also a chief medical officer of a company called Radiant Healthcare. In addition, I serve as a professor of practice at the University of North Carolina at Chapel Hill and a visiting professor at ESCP, a business school in Paris and London.
    ![adam brown](/images/baner_final.png "adam brown at the HLTH conference")
    *source: Adam's LinkedIn page* ## **Okay, impressive. What are some of the most significant challenges you faced during your journey from physician to business founder?** That's such a great question because it's hard for people to grasp that I would be a doctor and something else. They think that sometimes when I say I'm a physician, that's where their brain stops. And they only see me as seeing patients. **But what started happening is over time, I started getting more involved in the business aspect of healthcare because healthcare in the United States is 20% of our economy. And so you have to have people that understand healthcare and healthcare business.** And so I started proving that I understood business, operations, and strategy. The proof became the reality for people that, okay, Dr. Brown can be a physician but also a business person. It was a challenge. It took longer than expected. And still to this day, I have to continue to remind people that, yes, I'm a doctor, but I also have an MBA, and I'm a business school professor, not a medical school professor. So it's still a constant challenge. ## **OK, so how do you combine these two roles?** The nice thing about emergency medicine is that you don't have patients that follow you every day. I can work a shift or two, leave and have weeks off, and then come back and work another shift or two. The specialty is conducive to being more part-time. **I recognized a few years ago that being part-time was really what would sustain me more than being full-time as a physician.** I used to work full-time, but it was tough, and I started getting burnt out. So, I started looking for other ways to fill my cup. The other thing is I recognized there were a lot of ways to take care of patients beyond the bedside, which is a noble thing to do. Addressing healthcare problems on a large scale takes pulling together stakeholders from business, government, and the community. If I were just confined to the bedside, I wouldn't be able to solve some of those problems. ## **That should be my next question. What's your mission?** My mission is very simple. It's to impact the health of as many people as possible. While I'm in the emergency department, I may see 20 to 30 patients a day. But if I can help with a policy decision or work with a company impacting people's lives, then I'm now impacting lots of lives. For example, during the COVID pandemic, I was the National COVID Task Force Leader at my old company, doing television shows, radio interviews, and op-eds about how to protect people and keep them safe. **Being able to have that platform had the potential impact of millions. I wanted to take that experience and translate it into other forms of impact.** ## **It seems quite difficult. How do you stay motivated?** Seeing success and the effort of your work. One of the things that drives me is seeing that the work I've done has had a positive impact. Whether it's hearing from someone who's read my op-eds or doctors who say, "That resonates with me," or talking with my former and current students who say, "Dr. Brown, that was an amazing class." **We have to remember that our jobs and roles as leaders likely have more impact on healthcare than physicians.** The environment we create, the system we build, the benefits we use at our place of employment, and the policies we advocate for have a real impact on people's day-in and day-out lives. Encouraging business leaders to think empathically and recognize the health connections in their policies is key. It's encouraging to see former students say, "I took your course, learned from it, and now we're implementing it at my job.” ## **Can you say something about the Research Triangle?** Sure. In North Carolina, the Research Triangle is made up of three anchor universities: North Carolina State University, the University of North Carolina at Chapel Hill, and Duke University. The area is surrounded by these strong universities with excellent talent, research capabilities, and funding, making it a hub of innovation in the United States and abroad, especially in biotech and pharmaceuticals. At UNC, we started the Center for the Business of Health, where I'm the co-lead. We bring together physicians, nurses, public health practitioners, pharmacy practitioners, and business students and professors to solve healthcare problems. **The ability to pull together different stakeholders from various industries with a common goal of improving health is a significant strength**. We're tackling issues like the price of innovation, the implications of price on the healthcare workforce, and the future of the healthcare workforce. ## **I saw that you often mention interoperability. Why is it crucial in the e-health sector?** **Very simply, the ability for different systems to communicate has a profound impact on patients getting the right care.** One of the biggest challenges in the US is our disparate electronic healthcare systems (EHRs). Every hospital has a different system. Even though there are major EHR vendors with large market portions, communication between vendors can be challenging. This can lead to problems like patients getting the wrong medications or duplicative studies. Interoperability benefits patients by improving quality and reducing costs. However, some people have no operability at all—they lack access to digital platforms. There are huge disparities in healthcare in the US, often tied to education and financial ability, but there's also a digital component. Without broadband, phone, or computer access, integrating into healthcare systems is impossible.
    ![](/images/baner-adam.png "")
    ## **What is your most important advice for a startup or scale-up owner entering the US market?** First, understand the market. It sounds simple, but the buyers can be confusing. For example, some companies want to work with a healthcare system but need to be selling to a payer. Or they aim to work with physicians, not recognizing that about 80% of physician groups are employed by hospital systems or payers. Understanding the buyer and payer dynamics is crucial. The regulatory space is another challenge. Having FDA approval is not enough—you also need CMS and Medicaid approval to pay for your product or device. Without this, your product or service won't be implemented or used in the US.
    ![](/images/baner-adam-1-.png "")
    ## **And what about your free time? Apart from skiing in Austria, I suppose.** I work out every day. I'm a weightlifter and I also teach a spin class. ## **Spin class? So like SoulCycle?** Spinning. Exactly. I teach one class a week. ## **Oh my God, a lot of different tasks!** I'm very involved in politics as well. I work for political candidates as part of my impact efforts. I have a Great Dane, a big, massive 175-pound dog, who takes up a lot of my time. And I travel a lot too. The nice thing about digital platforms now, and what the pandemic has taught us, is that we can be more mobile in our meeting times. I've been able to have clients from all over the world and conduct meetings in different time zones. So that allows me to have time to cycle, teach spin classes, ski, and of course, continue being a doctor. ## **That's really impressive. Thank you for your time.** Well, thank you, it was a pleasure. ## Snapshot testing styled-components with Vitest *Published: 2025-02-14 | Author: bartosz | Tags: React, Vitest, styled-components, unit-testing* *Source: https://brightinventions.pl/blog/snapshot-testing-styled-components-with-vitest/index.md* When testing styled-components in Vitest, you might find the following limitation - the snapshots include only hashed class names, hiding the actual styles. When the styles change, the diff will show only a different hash value, without an indication of what actually changed. Moreover, these hashed class names are unstable and can change even when the component wasn't modified, simply because something else in the file has changed - for instance the position of the component in the file. ## Example of the issue For instance, let's use this styled component: ```tsx const Container = styled.div` background-color: red; ` ``` Vitest generates a snapshot that has no information about the style rules: ```jsx exports[`Container > should match snapshot 1`] = `
    ` ``` When the styles change, you'll get the following error: ```jsx - class="sc-KXCwU cThALf" + class="sc-KXCwU eyGbxi" ``` ## How Jest solved this problem The Jest community identified this issue and solved it with the `jest-styled-components` library. This library extends snapshots with the actual CSS rules. For example: ```jsx exports[`Container > should match snapshot 1`] = ` .c0 { background-color: red; }
    `; ``` When something change, you'll see the details in the output. The tests are stable now and will not fail due to a different hash value. ```jsx - Expected - 1 + Received + 1 .c0 { - background-color: red; + background-color: blue; } ``` ## Using Jest's serializer in Vitest While I couldn't find a similar library for Vitest, I came with the idea of using the serializer from `jest-styled-components` in Vitest. This way, we may achieve the same result. To use it, add `jest-styled-components` to the dev dependencies. Then, configure `expect` to use the serializer: ```typescript import { expect } from "vitest" import { styleSheetSerializer } from "jest-styled-components/serializer" expect.addSnapshotSerializer(styleSheetSerializer) ``` ## Where to add the configuration There are two places where you can add this code: 1. In the test file, before the tests are run. 2. In the global setup for the tests. To do this, you need to create a `vitest.config.ts` file in the root of the project and configure it to run the setup file before tests: ```typescript export default defineConfig({ test: { setupFiles: './src/setupTests.ts', }, }) ``` ## Final snapshot output Now, when you run the tests, the snapshot will contain the actual CSS rules: ```jsx exports[`Container > should match snapshot 1`] = ` .c0 { background-color: red; }
    `; ``` This way, the tests are stable and will not fail due to a different hash value anymore. ## Building Solutions, Not Just Software: The Story of Maciek’s Career *Published: 2025-02-13 | Author: maciej-s | Tags: bright insights* *Source: https://brightinventions.pl/blog/building-solutions-not-software-career-story/index.md* **Maciek is a software developer with over 20 years of experience, though his career beginnings couldn’t have been more unexpected. Discover how he landed his first job in IT, how he immerses himself in clients’ business domains, and how he challenges himself beyond work hours.**
    ![career story IT](/images/brightstorymaciejgrid.png "")
    ## How do you recall your programming beginnings? It was tough because I had to learn programming on the job. I graduated from Gdańsk University of Technology with a **degree in Electronics and Telecommunications**, so my studies weren’t directly related to software development. It was a very stressful period for me, and I remember it as an **intense learning experience**. From the very beginning of my first job, I worked on systems that had to function reliably – I didn’t have a transition period where I could ease in with internal projects. There was no time for that. The team was small, and I had to quickly **catch up and contribute right away**. ## Why did you decide to become a software developer despite having a completely different educational background? It was completely random. I wasn’t looking for a programming job – I was actually searching for something related to my studies. But one day, after leaving an office building where I had an interview, I ran into a friend who worked nearby. After finding out I was looking for work, **he encouraged me to apply at his company**. It turned out to be a programming job, and that’s how I got into software development **over 20 years ago**. ## You struck me as someone who enjoys diving into clients’ business domains. Why is that important to you? Perhaps it’s because software development was never my original career path, and the technical side of it has never been my primary focus. **What truly fascinates me is understanding how different industries operate** – often even more than the technical implementation itself.
    ![Quote](/images/maciej_quote_tech_skills.png "")
    Why? Because I see it as our mission as programmers. **No matter how advanced my technical skills are, they’re useless unless they solve real problems**. Code needs to have a purpose. Crafting code isn’t the main priority; delivering value through my work is. It also has to be simple to read so that my team members can easily work with it as well. **I’ve always been intrigued by the industries I’ve built software for** – how they function, how they use our tools, and whether our work truly makes their jobs easier. Do they actually need what we’re building? When you understand their domain, you can answer that difficult question. ## So, what are your methods for deeply understanding clients’ business domains? When you show genuine interest in what people do, they naturally open up and share details with you. If your attitude is, “My job is just to write code, I’m not responsible for anything else,” then your knowledge sources will be very limited. But **if you listen and ask questions, people will naturally start sharing more and more insights**. The key is to **seek contact and show curiosity – knowledge sharing will follow**. For me, it has always been natural to exchange knowledge, so I don’t follow a strict method. It all comes down to conversations; once you engage, the learning process happens organically. If you’re passionate about something, you’ll find a way to learn more about it. Curiosity is the key – it all starts there.
    ![At the Bright Inventions team retreat.](/images/maciej_team_retreat.png "At the Bright Inventions team retreat.")
    At the Bright Inventions team retreat.
    ## I’ve heard from some colleagues that starting a software product from scratch has many benefits. What is your take on that? I think I’m on the opposite side – I don’t find starting from scratch particularly appealing. At the beginning of a project, **there are so many possibilities and directions** to take that it can feel paralyzing. You’re unsure which technology to choose, and you need to go through a well-thought-out decision-making process. At the same time, you need a **high level of self-discipline to avoid getting lost in endless deliberations**.
    ![Quote](/images/maciek_quote_new_project.png "")
    There are so many “toys” on the market, and there’s always the temptation to try something new, but that can lead to poor outcomes. Naturally, when it comes to side projects, experimenting is fun and exciting. But when building a product for a client, **the real challenge is making crucial decisions without excessive delays**. Otherwise, there’s a risk of programmers getting caught up in endless debates about tech stacks while the client is still waiting for tangible results. For me, it’s easier to join an existing project that already has a structure – where some architectural and stack decisions have been made. **They don’t have to be perfect**; what matters is that I can focus more on the business domain and less on the technical aspects. ## You are part of the team building a solution for the shipping industry. What are the challenges and specific aspects of building software for logistics? What strikes me the most is finding the right **balance between strict rules and regulations and the flexibility** that this industry still requires within those constraints. For example, a client might expect all transportation details to be entered before a driver starts the journey. However, in reality, there are cases where this isn’t possible, and our system must be flexible enough to accommodate missing information that will be provided later. This kind of flexibility isn’t easy to maintain within a rigid set of rules in the code. Yet, **the challenge is to design software that can handle both structured compliance requirements and the dynamic, ever-changing nature of logistics**.
    ![During one of the team running workouts.](/images/maciej_team.png "During one of the team running workouts.")
    During one of the team running workouts.
    ## As one of the top Bright runners, share with us your running goals for 2025. This year, I am planning to participate in the **Backyard Ultra** for the first time. It’s a unique competition where all runners must complete a loop of nearly 7 km in under an hour – and then do it again, and again, **until only one person remains**. Essentially, it’s a race where you are mostly competing with yourself, and you never know how long it will last. The world record is over 100 loops! My personal goal is to complete at least 10 loops. It’s a huge challenge because this type of race can go on for days, with very few supporters. Unlike traditional races where you feel the energy of the crowd, in Backyard Ultra, **you run day and night, often alone**. Mentally adjusting to these conditions is tough and very different from other races. This race is also part of my preparation for **my ultimate goal in 2025 – running a 100 km mountain race**. Unlike Backyard Ultra, that will be a more traditional race with a defined start, finish line, and direct competition with others.
    ![After crossing the finish line Ultra Way in 2023. 💪](/images/maciej_finish_line.png "After crossing the finish line Ultra Way in 2023. 💪")
    After crossing the finish line Ultra-way in 2023 💪
    ## Do you see any similarities between long-distance running and software development? Oh yes! In both, so many things can happen – **you experience moments of euphoria when everything runs smoothly, and then there are tough crises**. But if you push through those difficult moments, you somehow find extra strength, just like your legs do in a long race. I think it's **similar when working on a long-term project**. There are always dull periods, and that's when some people start looking for other projects. Not everyone wants to go through the boring or challenging phases. We often justify it by saying we need a change for self-development, and while that might be a rationalization, sometimes we’re simply **chasing the excitement of something new**. I believe that if you push through these tough moments, something rewarding and exciting will eventually come – and with it, a deep sense of satisfaction. ## The Power of Intent: Why It Matters in Giving Feedback? *Published: 2025-02-12 | Author: ula | Tags: leadership, communication, feedback* *Source: https://brightinventions.pl/blog/the-power-of-intent-why-it-matters-in-giving-feedback/index.md* Giving feedback is an essential part of any workplace, relationship, or learning process. However, **the intention behind the feedback can dramatically impact its effectiveness.** When feedback is given with a positive, caring intention, it becomes a tool for growth, connection, and improvement. Whether you are providing guidance to a colleague, a team member, or even a friend, **the purpose of feedback should always be to support and encourage, rather than criticize or punish.** While approaching feedback, our minds has to be focused on care, constructive growth, and building stronger relationships. By ensuring our intention is positive, we foster a culture of mutual respect. ## **why do we need a clear intention in feedback?**  Effective communication, especially when giving feedback, is powered by the clarity of our intention. J**ust like a strong phone signal is essential for clear conversation, the intention behind our feedback says how well it resonates with others.** Many times, people assume they are communicating to connect and understand one another, but they might actually be doing so with different motives, such as: * asserting their own views, * educating or instructing, * assigning blame, * proving they are right. While these motives aren't inherently wrong, they can hinder true connection, trust, and mutual understanding in feedback process. When feedback comes from such intentions, it often triggers defensiveness, resistance, or even aggression, instead of inspiring growth or motivating positive change. **In any communication—especially in a feedback scenario—we bring our personal beliefs, experiences, and privileges. If these influences are used to impose one's own agenda without regard for the needs or perspective of the other person, it disrupts the balance of the relationship.** Rather than encouraging open dialogue or collaboration, this creates an environment where the other party may feel disempowered or disconnected. Clear and positive intention in feedback helps avoid these pitfalls, ensuring that the goal is not simply to be heard or validated, but to foster understanding and development.  ## **how to make your intention clear?** **To make your intention clear in feedback, it is essential to express your positive intent openly and directly.** Often, people can misinterpret feedback because the tone, body language, or delivery doesn’t align with the intended message. **By openly acknowledging that your goal is to help, support, or improve the situation, you ensure that the person receiving the feedback understands that it is coming from a place of care and a desire for collaboration, not from judgment or criticism.** **👉 Example:** *I want to share something that I think could help us work more efficiently together. My goal is to make our collaboration smoother and ensure we are both aligned in how we approach tasks.* **👉 Example:** *I’m sharing this because I value working with you, and I’m here to support you. Please feel free to let me know if there’s anything you think I could do differently to make our teamwork even better.* You can also (if applicable and true) start with some positive reinforcement to sets a constructive tone for the conversation. By recognizing what the person is doing well, you signal that the feedback is coming from a place of respect and appreciation, not criticism. **👉 Example:** *I really appreciate the effort you’ve put into meeting the project deadline; it shows your true engagement. I’d like to chat about a small adjustment that might make the process even more efficient.* The intention might be also expressed positively by engaging in an open dialogue. This fosters collaboration and ensures that you are interested in finding a mutual solution. **👉 Example:** *I’ve been thinking about how we can improve communication during the project planning phase. I’d love to hear your thoughts on how we can work together to make sure everything gets aligned more effectively.* To make your intention clear, be honest, transparent, and collaborative. **Being upfront about your desire to improve things not just for yourself but for everyone involved encourages the recipient to feel supported rather than criticized.** ## **intention in feedback based on NVC** While talking about intention it is hard not to mention its role in NVC communication that plays a huge role in healthy feedback focused environments. The role of intention in Nonviolent Communication (NVC) is crucial because it serves as the foundation for creating meaningful interactions. **Just like in feedback processing, in NVC  - communication is not just about the words we say, but also about the intention behind those words.** The primary aim is to foster connection and understanding rather than to persuade, judge, or demand. **The intention behind communication in NVC is to understand and be understood in a way that respects both parties' needs, feelings, and values.** By focusing on the intention to connect and collaborate, NVC enables speakers to go beyond defensive exchanges and build trust. When you are clear about your intention to communicate with compassion, you are more likely to foster positive interactions. **👉 Example:** Instead of saying, *You always interrupt me!* —which may communicate judgment or blame—an NVC approach guided by the intention of connection might sound like, *When I’m interrupted during our conversation, I feel frustrated and it makes it hard for me to fully express myself. I would like to hear more of your thoughts, and I wonder if we can take turns speaking to support each other.* In the feedback process based on NVC, a primary intention is to truly understand someone’s feelings and needs while expressing your own. The intentions is to give feedback without judgment or rushing to solve the issue, listen to understand. ## **summary** **Transparency in communicating your intention is not just about saying whatever comes to mind. The intention behind honesty is to communicate your feelings, needs, and desires openly, while being respectful of the other person’s perspective.** By being authentic, you reduce misunderstanding, ensuring that the feedback remains productive and clear. Feedback is a constructive and cooperative dialogue, the intention ensures that each party’s agency and autonomy are respected. The intention behind feedback should always be to increase mutual understanding and cooperation, not to win, argue, or compete. By being intentional, we ensure our words and actions align with our deeper goal of creating positive, open relationships. When we clarify our intentions—whether it’s for empathy, understanding, or shared growth—it helps cultivate a space for genuine, healthy dialogue, where mutual needs are considered, and all parties can engage constructively. ## Eye on 'i' - Understanding 'i' as a Semantic Element *Published: 2025-02-12 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/understanding-i-as-semantic-element/index.md* **[In one of my earlier articles](/blog/semantic-status-of-html-b-tag/), I discussed a common misconception about HTML, focusing on the true purpose of the `` tag. In this article, I’ll dive into another myth in the frontend development world, one that’s closely related to that previous discussion.**
    ![Understanding i as a Semantic Element](/images/blogpost_blog__i_tag.png "")
    ## The myth surrounding 'i' and semantics Similar to the misconceptions about the `` tag, there’s also a common misunderstanding surrounding the `` tag, which goes like this: > *The ‘i’ tag isn’t semantic, it just applies italic styling to text.* As with many myths, there’s a kernel of truth here. By default, the `` tag does apply italic styling to the text it wraps. Historically, that was indeed its primary purpose. According to [HTML4 Specs](https://www.w3.org/TR/html401/present/graphics.html#edef-I), role of the `` tag is specified as: > Renders as italic text style. and it is group under “Font style elements” (same as 'b' from one of the previous myths). The `` tag is often compared to ``, which is regarded as "`` with semantic meaning”. This comparison, while popular, isn’t entirely accurate. ## The truth of 'i's semantic role Nowadays, the `` tag has gained additional semantic meaning beyond its default styling behavior. According to the [current HTML specification](https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-i-element), the `` element represents text in an alternate voice or mood, or set apart to indicate a different quality, such as taxonomic names, technical terms, idioms, or transliterations. Here’s how the specification defines the `` element: > The `` element represents a span of text in an alternate voice or mood, or otherwise offset from the normal prose in a manner indicating a different quality of text, such as a taxonomic designation, a technical term, an idiomatic phrase from another language, transliteration, a thought, or a ship name in Western texts. In contrast, the `` tag—which is also displayed as italicized text by default - [conveys stress or emphasis on the content](https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-em-element), for example:\ `

    Do it now

    `\ This indicates that "now" should be read with added emphasis. ## Impact on accessibility Unfortunately, despite carrying semantic meaning, the `` element is still treated as plain text by many [popular accessibility tools](https://www.tpgi.com/screen-readers-support-for-text-level-html-semantics/). For instance, while Chrome DevTools identifies the `` element and labels it as "emphasis," it categorizes the `` element as "static text," placing it in the same category as a standard `

    ` element or a `` element.

    ![Difference between i and em tag in chrome dev tools](/images/i-tag-a11y.png "")
    ## Summary The `` tag, originally used for italic styling, now carries semantic meaning in modern HTML, indicating text in an alternate voice or mood, such as technical terms or idioms. While it differs from the `` tag, which denotes emphasis, accessibility tools still often treat `` as regular text, limiting its semantic impact. Understanding this distinction is crucial for better web development and accessibility practices. - - - ##### [](https://brightinventions.pl/blog/javascript-types-deobjectified/#take-a-look-at-our-earlier-blog-post-debunking-frontend-myths)Take a look at our earlier blog post debunking frontend myths: 1. [To 'b' or Not to 'b': The Semantic Status of HTML 'b' Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) 3. [JavaScript Types De-Objectified](/blog/javascript-types-deobjectified/) ## Surviving in the Era of Negative Thinking *Published: 2025-01-31 | Author: ula | Tags: leadership, business psychology* *Source: https://brightinventions.pl/blog/surviving-in-the-era-of-negative-thinking/index.md* In recent years, we have found ourselves navigating the era of extremes—swinging between intensely negative and relentlessly positive outlooks. On one side, we are overwhelmed by a constant stream of distressing news, business failures, and real-life challenges. On the other, our lives are flooded with curated images of success, glowing selfies, and uplifting quotes (I must admit I’m personally a big fan of the last one 😉). Some researchers warn of what’s been called the **"tyranny of positive thinking"**. This refers to the expectation—or even demand—for people to always exude positivity, often at the expense of acknowledging or processing negative emotions. The pressure to maintain a perpetual optimism can lead to stress, internal conflict, and a suppressed ability to confront genuine feelings. In the long run, this forced positivity can hinder emotional authenticity and hinder personal growth. While there are certainly times when positive thinking can do more harm than good, I remain a firm believer in its power to improve our lives—when used thoughtfully and balanced with a healthy dose of emotional honesty. ## **is defensive pessimism a bad thing?**  With a term like "pessimism" at its core, it’s easy to assume defensive pessimism is all about gloomy predictions. But take a closer look, and you’ll find **it’s more than just dwelling on what could go wrong—[it’s a strategic mindset that can be surprisingly useful](https://www.inc.com/wanda-thibodeaux/how-defensive-pessimism-can-help-you-do-better-at-work-in-life-according-to-science.html).** Defensive pessimism describes individuals who channel their anxiety or negative feelings into proactive planning. **Instead of being overwhelmed by worry, they envision worst-case scenarios in vivid detail and prepare solutions to tackle them.** This means brainstorming alternatives, considering potential obstacles, and taking preventative steps to minimize risks. You may tap into this approach unconsciously —like when you're nervous about forgetting an important report, so you pack it the night before or set reminders to avoid any last-minute chaos. In the context of teamwork, defensive pessimism can be also beneficial. **Team members who use this mindset might anticipate potential challenges in a project, identify weak spots in the plan, and proactively propose solutions.** This not only enhances individual preparedness but also boosts the team's ability to adapt to unforeseen issues. Far from being paralyzing, this kind of intentional planning turns anxiety into a motivator. Researchers have found that defensive pessimists can use their caution and concerns as fuel for better performance. By preparing thoroughly and staying ahead of potential pitfalls, they turn what might feel like a liability into a valuable asset—both in work and in team dynamics, ensuring smoother collaboration and minimizing disruptions. ## **stay afloat of negative news** There is no shortage of negative news in our daily consumption, and we all know that overeating has never been anything good. The same applies to the constant intake of negativity—whether through social media or workplace conversations. It’s crucial to set boundaries to understand how negative thinking might impact our personal and professional lives. **While it’s important to be ready to listen, act, and help when someone truly needs support, engaging with every complaint or negative post on Facebook, Instagram, or other platforms isn't productive or healthy.** Prevent your mind from staying in alert mode all the time. In the workplace, negativity can easily spread among team members, affecting morale and productivity. If you use social media, treat negative posts as red flags, a kind of warning. If you catch yourself in endless scrolling through critical comments, complaints, or negativity in your workplace chats or online—recognize how it impacts your mood, energy levels, and overall mindset. These are often reflections of someone feeling angry, disappointed, or frustrated, and they might be seeking attention or validation. Engaging in or absorbing this negativity can cloud your judgment, weaken teamwork, and lead to burnout. Instead of shifting your focus away from tasks or objectives that are meaningful, don’t allow the emotions of anonymous individuals or toxic work conversations to derail you. **As [David J. Polly’s “Law of the Garbage Truck”](https://academictips.org/blogs/the-law-of-the-garbage-truck/) suggests, we can protect our professional lives by choosing not to absorb the anger, resentment, or frustrations of others.** In any workplace, it’s essential to avoid hostile or harmful dialogues that can damage your mental and physical health, as well as affect team collaboration and overall harmony. ## **practice gratitude selectively** **Start counting your blessings in life—but don’t force yourself to feel grateful for everything.** In the workplace, [gratitude can boost morale, increase motivation, and create a positive atmosphere](https://www.forbes.com/sites/tracybrower/2021/01/03/gratitude-is-good-why-its-important-and-how-to-cultivate-it/?sh=49fe180e2a0f) within teams. However, **it’s important that this gratitude is genuine—when it feels obligatory or insincere, it may create more pressure than positivity, even leading to feelings of guilt.** If you find it difficult to express gratitude, don’t pressure yourself. Start small: reflect on what good happened to you on a specific workday. Maybe it was a meaningful conversation with a colleague or a small task you accomplished. These little victories can help shift your focus to the positive, allowing you to notice the good things in your daily routine.
    ![gratitude](/images/gratitude.png "gratitude")
    ###### Source: https://positivepsychology.com/neuroscience-of-gratitude/ In the professional setting, it's especially important to recognize why and how gratitude can enhance not just your emotional wellbeing, but your performance as well. The research from Sonja Lyubomirsky, a professor of psychology and expert in positive psychology, [reveals that gratitude contributes to both mental and physical health](https://grateful.org/resource/eight-ways/). **Expressing thanks at work—whether toward a colleague, manager, or team—can strengthen relationships, reduce stress, and foster a culture of collaboration.** Gratitude becomes a powerful tool in creating not just a more pleasant environment, but one that’s more productive and supportive, enhancing both [personal and professional growth](https://www.tandfonline.com/doi/full/10.1080/15358593.2017.1293836). ## **treat mistakes as a good lesson to learn**  Let us not fall into victimhood every time something does not follow according to our plan. There are many simple things happening every day in our life which are worth our appreciation. **Mistakes are inevitable—they're simply part of life. However, how we react to them can shape our growth and resilience.** Falling into a mindset of victimhood each time things don’t go as planned only intensifies feelings of helplessness.\ \ A study by Dr. Carol Dweck, a psychologist renowned for [her work on growth mindset, reveals that individuals who view mistakes as learning opportunities are more likely to improve their skills and adapt successfully.](https://www.psychologicalscience.org/observer/dweck-growth-mindsets) Those with a fixed mindset, on the other hand, often see failures as evidence of their shortcomings, which can lead to frustration and a lack of motivation to try again. On a practical level, everyday life is filled with small events that can shift our perspective. **Perhaps a missed deadline leads to reevaluating priorities and creating better time management strategies. Or maybe a disagreement with a colleague fosters a deeper understanding of communication dynamics in your team.** The key is finding the silver lining—not in an overly positive, dismissive way, but in an empowering one. **Instead of dwelling on what went wrong, ask: What can I learn from this? What could I do differently next time?** Mistakes then transform from roadblocks into stepping stones, shaping us into better problem solvers and more self-aware individuals. ## **let go of negative pearls of wisdom**  In the vast world of online discourse, I frequently come across so-called "pearls of wisdom" that are anything but “inspiring” statements like “Don’t trust people,” “Your teammates aren’t your friends,” or “Recruiters are clueless.” Really? Every time I see such negativity, I can’t help but wonder - why do people feel the need to spread this? It's like perpetuating the same tired stereotypes and generalizations over and over again. The truth is, every situation is unique. Each organization, team, boss, or colleague brings something different to the table. **Just because someone else had a negative experience and chose to vent online doesn’t mean their reality applies to yours. You might, in fact, be one of the many people who work in a healthy, supportive environment where teammates genuinely have each other’s backs and bosses are competent and fair.** And let me tell you—it’s not as rare as some corners of the internet might suggest. I firmly believe in being mindful of the kind of content we let into our lives. The negativity some people broadcast can act as an anchor, dragging us down. Instead, surround yourself with voices that inspire, motivate, and offer thoughtful perspectives. Seek out those who show compassion, optimism, and resilience—not those consumed by their inner critic or hurt egos. **A healthy, thriving work environment is not a unicorn. 🦄 It exists.** Let go of the cynicism and aim to build your own experience based on possibility and hope, not on someone else’s grudges. Focus on perspectives that uplift, not ones that limit your outlook. ## **positive thinking is like a muscle** Say hello to our great companions—[dopamine, serotonin, and yes, even our less beloved but significant friend, cortisol.](https://www.psychologytoday.com/intl/blog/living-forward/202304/how-your-thinking-affects-your-brain-chemistry) When negativity creeps in, it’s essential to have strategies at hand to shift your mindset. Whether through a favourite activity or intentionally fostering a positive thought, the goal is to steer away from spiralling into negativity. **Here’s the thing - positive thinking doesn’t come easily. It is like a muscle that needs consistent exercise.** It requires effort, new patterns, and a conscious shift in how you approach your thoughts. Don’t let one challenging situation dominate your mind and allow negative emotions to take root. At the same time, it’s important to recognize that having negative thoughts is entirely normal. [From an evolutionary perspective, our ancestors’ survival depended on staying alert to threats and potential dangers.](https://www.discovermagazine.com/health/fight-or-flight-why-our-caveman-brains-keep-getting-confused) **The issue isn’t that we have negative thoughts—it’s that we often mistake them for absolute truth** Learning to deal with intense negative emotions is a skill worth cultivating. Dr. Daniel Siegel offers a helpful technique called [“name it to tame it”](https://heartmindonline.org/resources/strong-emotions-name-it-to-tame-it) which is as simple as it is effective. When negative thoughts arise, naming them—calling out the story your mind is telling—can create distance and reduce their hold on you. This awareness enables you to step back and observe without being consumed. So, the next time negativity strikes, remember that developing positive thinking takes practice, and your brain is always ready for a workout.
    ![](/images/sorryforthedelayedresponse.png "positive thinking ")
    ###### **Source:** https://www.instagram.com/lizandmollie/ ## **summary** Don’t get me wrong—venting our frustrations from time to time can be a healthy release, helping to lower stress and bring our concerns into the light. Bottling up emotions is rarely beneficial. However, it seems that some people use negative thinking and negative talking not as a momentary release but as a tool for gaining attention or validating their unhappiness. It’s as if they’re trying to say, “If I’m unhappy, everyone else should be too.” **The world is undeniably full of challenges, setbacks, and traumas, and my intention isn’t to dismiss these realities. Instead, it’s about learning how to coexist with life’s difficulties without being constantly overwhelmed by negativity. Practicing positive thinking, much like exercising our bodies, builds resilience over time. Think of it as training a muscle—the more you use it, the stronger and more capable your mind becomes.** In an age where negativity saturates social media and beyond, it’s all too easy to get caught in the cycle of despair. But don’t let that define your perspective. Instead, focus on fostering positivity and building mental strength. After all, your peace of mind is far more valuable than indulging in an endless stream of complaints. So, can we survive the era of negativity while keeping our minds clear and strong? I believe we absolutely can—with intention, practice, and perspective. What about you? Do you see things through a darker lens or find the silver lining in tough situations? Is your glass half-empty or half-full? Where do you land on the spectrum? ## Do Patients Know Best? Insights from Mohammad Al-Ubaydli *Published: 2025-01-31 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/revolutionizing-health-with-technology-insights-from-mohammad-al-ubaydli/index.md* This interview took place during the last **[HLTH Conference Europe](https://europe.hlth.com/)**, where industry leaders gathered to discuss the future of [healthcare software development](/our-areas/healthcare-software-development/). In this conversation, Mohammad Al-Ubaydli, the CEO of a leading medical record software company - Patients Know Best - shares insights on their solution, the ethical considerations of digital health, and the inspiration behind their work. We also delve into the technical and regulatory challenges faced in this rapidly evolving field, as well as the exciting trends that are shaping the future of medtech and health tech. ## **Can you briefly introduce yourself and your solution?** My name is [Mohammad Al-Ubaydli](https://www.linkedin.com/in/idiopathic/). Our solution helps people understand their health better, particularly when they're sick. They can check their test results, know what to do if they get sicker, and learn how to avoid getting sicker. It reduces the number of visits to the doctor because people know what to do at home by themselves.
    ![patients know best](/images/screenshot-2025-01-31-at-14.52.35.png "Patients Know Best")
    *source: https://patientsknowbest.com/* ## **How does your company ensure the ethical side of the solution?** The first thing we do is ensure that the data and records are owned by the person. They ultimately decide when to share them. For instance, when you visit the doctor, the doctor gets the data automatically for your convenience. But it's your record, your information, and technically your property. We explain to our customers, who are healthcare providers, that this really works for everyone, including those who don't speak the first language. ## What inspired you to enter the digital health field? Medical school inspired me. I saw chaotic systems, and I wanted to help people. When I went to medical school, I was exposed to numerous problems, and I realized I could make a difference by creating software to manage health information better. ## But do you miss being a doctor? I do. It's a real privilege. Initially, I didn't want to be a doctor; I wanted to write software. But when I got into medical school, I really enjoyed being with patients. I ended up working for a year in a small town with few doctors, which was very rewarding. ## What drives your passion for this work, for being CEO of the largest medical record software? Seeing how much it helps patients and doctors drives my passion. Many doctors discover us because patients bring their test results, and the doctors are impressed with the organization and accessibility. Patients adore it, and I receive many messages about how it has positively impacted their lives.
    ![MOHAMMAD'S STORY](/images/screenshot-2025-01-31-at-14.56.15.png "MOHAMMAD'S STORY")
    source: https://patientsknowbest.com/about/ ## What technical challenges have you faced during your journey? Many, but one major challenge is processing large amounts of data quickly and efficiently. We constantly have to modernize our technology to meet high-quality standards at a low price, especially since we migrated all our data to FHIR, an international standard. ## How old is the solution? The company started in 2008. Last year, we rewrote the whole system to meet modern standards. ## What regulatory challenges have you faced? Regulation is an ongoing challenge. We operate in multiple countries, and each has its own requirements. For newer companies, it can be especially tough. We help others behind the scenes because their job today is harder than ours was two years ago. ## What is your most important advice for new startups? Be prepared for slow and low decisions. Investors may push for faster development, but the public sector is very price-sensitive and demands high quality at low costs. ## Where do you get inspiration for your work? Do you have any favorite podcasts or news sites? I like NPR in the US, especially a segment where a Guy Raz interviews founders and successful people. Their stories often start with struggles but end with success, which is inspiring. ## What do you do in your free time? Free time is for family and children. During COVID, I learned how to bike again, so I bike a lot. ## What trends do you see in the industry of medtech and health tech? Sensors excite me the most. For example, there's a company called POCDOC that does health checks with a single drop of blood. Companies are also using phone cameras to measure cholesterol levels through your skin, which is revolutionary. ## Thank you. ## Revolutionizing Patient Rehabilitation: An AI-Powered Path to Recovery *Published: 2025-01-16 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/revolutionizing-rehabilitation-an-ai-powered-path-to-recovery/index.md* **How is an innovative AI-driven solution revolutionizing patient rehabilitation by making it more accessible, efficient, and personalized? In this interview, [Silvia Raga](https://www.linkedin.com/in/silviaraga/) the CEO of DyCare shares insights into their groundbreaking digital rehabilitation platform, its impact on healthcare, and the challenges of bringing AI-powered solutions to market.** ### Could you briefly introduce yourself and describe your solution? At **[DyCare](https://www.linkedin.com/company/dycare/)**, we are reshaping the patient recovery path in rehabilitation with an AI-guided solution. We have developed Rehab, a digital rehabilitation platform for hospitals, insurance companies, and rehabilitation centers that delivers effective and personalized home rehabilitation. With our technology, professionals can design and prescribe personalized exercises using advanced monitoring tools. We utilize computer vision technology and artificial intelligence algorithms to ensure patients perform exercises correctly, monitoring their range of motion, speed, and other parameters to guarantee safety and effectiveness.
    ![Silvia Raga Dycare](/images/baner_silviahlth.png "Silvia Raga Dycare")
    ### Do you use Bluetooth devices? No, we only require the activation of the camera on a smartphone, PC, or tablet, combined with artificial intelligence. ### Is it a mobile app or a web app? It’s a web app. ### How will it change people's lives? With our solution, patients can perform safe rehabilitation anytime, anywhere, whenever they want, always supported by a professional. Professionals can remotely track patient progress, adjust routines, and monitor recovery in real time. This leads to better therapeutic outcomes, reduced recovery time, and added convenience for patients. ### Is it more accessible to people? Is it cheaper than visiting a clinic? Yes, it is more accessible and can be cheaper. The payer depends on the model. We work primarily with the public sector in Spain and, in some cases, with insurance companies. ### Is it also a solution for individuals? Can I download the app from the app store? Currently, no. Each time it’s used, a professional physiotherapist must assess the patient and set up their exercise program. ### Are you just in the Spanish market currently? We are present in Spain, Italy, and South America. ### Are you planning to expand into other markets in Europe or the US? Yes, we are analyzing these markets. After expanding in South America, we plan to enter the US market. ### What are the top technical challenges your company has faced? The primary challenge is ensuring clinical validation, as our technology is classified as a medical device. This is crucial to what we do. ### What value does AI provide for your users? AI, combined with computer vision, enables real-time feedback for patients. We refer to this as real-time intelligent detection of movement. AI solutions allow us to track progress and provide professionals with alerts and indicators to better manage patient care.
    ![dycare](/images/screenshot-2025-01-10-at-12.29.02.png "dycare")
    *source: https://www.dycare.com/en* ### What inspired you to develop this solution? It stemmed from a personal experience. Following an ankle injury, I attended 10 physiotherapy sessions but saw little improvement. When I asked the physiotherapist why, there was no objective data to measure my progress. This lack of data inspired me and my co-founder to create a solution to fill that gap. ### What trends do you see in health tech, apart from AI? AI is a key trend, but adoption is the next critical step. Lowering barriers to introducing these solutions is essential for achieving cost savings, increased productivity, and efficiency. ### What advice would you give to startups or scale-ups entering the Spanish market? The Spanish market can be complex, with a strong emphasis on pilot studies. My advice is to ensure these are paid pilot studies, even if the amount is small. This demonstrates commitment and value, helping you move toward a contract after proving the results. ### Are you planning to enter the Polish market? It’s not currently a priority, but it’s an interesting market. We’ve received positive feedback from Poland, where many people seek therapy. While there are similar solutions, they tend to focus on fitness rather than medical care. ### Thank you for your time. ## 3 Books That Can Help You Build Bright Company Culture *Published: 2022-03-06 | Author: ula | Tags: inspiration, business, company culture* *Source: https://brightinventions.pl/blog/3-books-that-can-help-you-build-bright-company-culture/index.md* I have come across many books in my life that helped me grow, both personally and professionally. I believe that books are a great source of knowledge and truth, and they have a unique ability to change people’s view completely. The more we read the more aware we become how much wisdom we are still lacking in our experience. At least that is how it works in my case.  Below I want to share my thoughts on three remarkable books that left a lasting impression on me. Each one carries a powerful and uplifting message, making them an excellent read for anyone passionate about shaping a strong and thriving company culture. These books explore the foundational elements of successful teams and offer practical advice on creating environments where people genuinely thrive. What’s especially compelling about these publications is how they challenge conventional approaches to teamwork, highlighting the importance of feedback, trust, responsibility, and appreciation. They present actionable insights and fresh perspectives that can shift the way we think about team dynamics and workplace collaboration. Whether you’re a leader looking to inspire your team, an HR professional seeking innovative ideas, or simply someone who wants to foster a more supportive and effective workplace, these books have something to offer. Dive in, and you may just find new ways to enhance your approach to building successful teams. ## **[Powerful: Building a Culture of Freedom and Responsibility,](https://pattymccord.com/book/) Patty McCord** Patty McCords wrote a book about creating the unique and high-performing culture based on her engagement at Netflix. I really enjoyed this read. The content is approachable and practical. As stated in the book, very few companies try new forms of leadership and probably that is why we can find the Netfilx culture inspiring and fresh with a people-centered approach where trust and responsibility play the main roles. The special place is devoted to feedback where employees share information openly, broadly and deliberately. You provide open, helpful, timely feedback to your colleagues no matter what role you have in the organisation. **Patty McCord shows that strong teams learn faster and work better if they can make giving and receiving feedback less stressful and a more normal part of work life.** Feedback is a continuous part of how people in the team communicate and work with one another. It is a large topic in the book. ![](../../static/images/powerful_quote.png "") Considering recruitment needs we have to hire people who can help us solve future problems and these who can support new people. That should be always our goal. You should be always looking for talents. **Being always on the lookout give you also an opportunity to really choose the people you need. What is more, we should not be afraid of saying goodbye to people who do not seem to fit the organisation culture and do not bring any business value.** Some people may say it is brutally honest vision, but at the same time it is very pragmatic and credible. Wise hiring is something every company should focus on.  Be open and honest, run discussions based on the facts, get right person to do right job, and treat people as the grown-ups - that is how I can sum up the book. Simple, but frequently forgotten rules.  And if you want to find out more about the Netflix culture, take a look [here.](https://jobs.netflix.com/culture)  ## **[Radical Candor: Be a Kick-Ass Boss Without Losing Your Humanity,](https://www.radicalcandor.com/the-book/) Kim Scott**  Some people say that the best summary of this book will be “care personally + challenge directly” as the cover image suggests. ***Radical Candor* is about treating everyone in the workplace as a human being first-and-foremost.** Kim Scott presents a number of personal examples and practices that shows the environment in which individuals and business can achieve great results together. It is the volume about giving and receiving honest feedback. You must deliver feedback - both the praise and the criticism, so that it leaves no room for ambiguity or misinterpretation. **You are not doing anybody a favour by not telling them when they do bad work.** If anything, it's better to be direct and give them the feedback than to protected their feelings just to stay friends. Radical candor is all about managing a full-feedback approach. Very important point is to avoid the fundamental attribution error - we should always focus on what someone did rather than who they are. The former is something the person can fix.  ![](../../static/images/radical_candor_quote.png "") Another key aspect of successful team Kim Scott mentions is the diversity. Your team cannot consist only of super-stars. We need **a healthy mix of different people**, but we should never forget about the highest performers in the end as it is too easy sometimes to focus too much on these employees who have a mediocre impact on your team’s success and need our support. Always remember about those who bring the most value to your organisation. And if you can see they start to perform worse, do not ignore it. This books is full of personal stories and anecdotes with a piece of good advice every aspiring manager may want to get. It is the book about the art of managing people and teams. It covers many aspects of day-to-day managing.  ## **[The Culture Code: The Secrets of Highly Successful Groups,](http://danielcoyle.com/the-culture-code/) Daniel Coyle** *The Culture Code* deciphers the secrets of highly successful groups like SEALS, Team Six, IDEO, San Antonio Spurs, Pixar, etc. According to Daniel Coyle you have to work 3 different skills to achieve the highest team performance. **You can see how the most successful team perceive obstacles, vulnerability and empathy.** Each chapter explores one skill at a time: building security, sharing vulnerability and establishing purpose.  Coyle emphasises that a strong culture sets up an environment where a team can deal with uncomfortable truth-telling and be candid with each other. When people make themselves vulnerable by sharing information about themselves, they build connections and makes it possible for everyone on the team to contribute. Loyalty and high quality working cultures only emerge when team members feel safe. ![](../../static/images/culture_code_quote_coyle.png "") But the book is not only about the team’s performance, it is also about the leader’s roles. T**he book shows how important is to question how your actions in everyday life impact the team you work with.** The richness of real-life stories and examples of amazing groups makes *The Culture Code* practical and at the same time inspiring. Honest and authentic leadership is required that listens and serves rather than talks and orders. One may say the book is full of old ideas and topics - and that is true. But at the same time these topics are urgent and relevant as ever. ## **Three books, one idea behind**  Although the examples in the books often draw from renowned companies like Google, Apple, Twitter, PIXAR, and other well-known Silicon Valley startups, the concepts and practices they discuss are universally applicable to most workplaces. **From my own experience, I’ve reached the same conclusion as the authors: the foundation of a successful team lies in fostering honest, trusting, and supportive relationships. These books focus on practical strategies to help you build that kind of culture within your team, no matter your organization’s size or industry.** ## Top Podcasts for 2025 from iOS Developer's Perspective *Published: 2022-05-05 | Author: tomasz-l | Tags: programming, iOS, growth* *Source: https://brightinventions.pl/blog/top-ios-podcasts-from-ios-developer-perspective/index.md* **Are you an iOS developer, or maybe a technology maniac with a bias for apple? Do you listen to podcasts (if not, then start 😉)? Here are my top picks for iOS and general tech related podcasts to listen to in 2025.** ![top iOS development podcasts](../../static/images/top-podcasts-from-ios-developer-perspective-cover.png) ## Best iOS development podcasts in 2025 Let me start with iOS focused ones. Those are high quality podcasts that vary in focus and topics from quite technical to totally informal. * [ATP - Accidental Tech Podcast](https://podcasts.apple.com/pl/podcast/accidental-tech-podcast/id617416468) My favorite podcast in this list. Marco Arment, Casey Liss and John Siracusa make you feel at home. I find this podcast entertaining and it fits almost all circumstances you can find yourself in, from focused listening, to playing in the background while driving your car. But you will need to get on quite a journey, because ATP is typically longer than two hours ; Topic range is very broad, typically somehow touches on or at least originates from apple related news, but you never know when John starts to have beeping issues in his house If you really love this podcast like me, you could support ATP by becoming a [member](https://atp.fm/join). *ATP* is released weekly, with additional members only content released ~monthly. * [Under the Radar](https://podcasts.apple.com/pl/podcast/under-the-radar/id1055685246) Podcast hosted by two indie developers: Marco Arment and David Smith. It is ~never~ usually not longer than 30 minutes and in this period a variety of topics connected to independent dev life are covered. You can hear about challenges during bigger refactors, supporting large numbers of customers, marketing your own products and many more. If you ever thought about going indie and starting your own project or are just curious then this is a must have! *Under the radar* is released bi-weekly. * [Stacktrace](https://podcasts.apple.com/pl/podcast/stacktrace/id1359435443) Hosted by John Sundell and Gui Rambo it is an informal podcast about life and technology from their perspective. It is rather a casual podcast but loose personal topics are intertwined with deeper insights into apple development. *Stacktrace* is released irregularly since 2024. * [App Stories](https://podcasts.apple.com/pl/podcast/appstories/id1227872143) Lightweight podcast about Apple plaftorm apps scene hosted by Federico Viticci and John Voorhees. If you want to be up to date with which apps are hot and worth checking then this the podcast for you. It is on my lost not only because of noteworthy updates, and app discoveries but mainly due to stories and people behind those apps. *App Stories* is released weekly. * [Swift by Sundell](https://podcasts.apple.com/pl/podcast/swift-by-sundell/id1267161825) For quite some time this was only my first pick for podcast for iOS developer. It is not only top notch in terms of quality, topics and guests, but was also the first iOS podcast I started listening to. Beware however, John and his guests go quite deep into technical topics, so it requires some focus. I find John’s podcast very informative and motivational. You can always learn from it, at least that you still need to learn a lot about [iOS development](/our-areas/mobile-app-development). Unfortunately John stopped releasing new episodes starting 2023, however I still think this is great mine of information. *Swift by Sundell* was released weekly till the end of 2022. ## Top tech podcasts in 2025 Of course you cannot live just on iOS podcasts, we need to have a richer diet in order to be healthy ;) This part is more about technology and business in a broader spectrum. * [The Vergecast](https://podcasts.apple.com/pl/podcast/the-vergecast/id430333725) You have probably heard about The Verge and this is their flagship podcast. It is hosted by its Editor-in-Chief Nilay Patel joined by Verge team members. They discuss tech news from the previous week in a light and very informal way. This will be the source of all the fresh stuff that happened in the tech industry, from new device releases to big court cases. *The Vergecast* is released twice a week with additional mini-series appearing irregularly. * [Decoder with Nilay Patel](https://podcasts.apple.com/pl/podcast/decoder-with-nilay-patel/id1011668648) Another production from The Verge. Nilay Patel talks about big ideas related to technology. Maybe listening to interviews with fat cats of the tech industry may sound boring but don’t get fooled by that. Every interview Nilay conducts is incredibly interesting and thoughtful. Tune in to get to know decision making frameworks and stories of various people in the tech industry. *Decoder* episodes can be expected at least once a week. * [Hard Fork](https://podcasts.apple.com/us/podcast/hard-fork/id1528594034) New York Times production hosted by Kevin Roose and Casey Newton. It is a show about the future that’s already here. They cover all of the hot technological topics in a fun and casual way. Topics in *Hard Fork* are quite similar and often intersecting with *The Vergecast* so you can choose your fighter or listen to both. *Hard Fork is released weekly* * [Land of the Giants](https://podcasts.apple.com/pl/podcast/land-of-the-giants/id1465767420) This one is a little bit different than others. It is produced by Vox and contains multiple seasons of mini series about tech giants. If you want to know the stories behind Apple or Netflix, then this is a very nice and convenient way to dive in. I totally encourage anyone in the tech industry to listen to those. There are currently 10 seasons covering tech giants like: Amazon, Netflix, Google, Apple, Facebook, Tesla or Disney. *Land of the Giants* episodes are released weekly for each of the seasons. * [Indie Hackers](https://podcasts.apple.com/pl/podcast/indie-hackers/id1206165808) Courtland Allen interviews Indie Hackers that got out of their comfort zones to start businesses and pursue dreams of independence. Is going Indie future of our industry? If yes, then better prepare soon. In those interviews you will hear about businesses of various sizes and origins. For example that it is possible to start very profitable tech business that revolves around… delivering cookies 😄 Mid 2022 Indie Hackers changed their format and Courtland is now joined by new host: his twin brother Channing. *Indie Hackers* was released weekly till mid of 2023. Do you have other tech podcasts that you love? Please share with me too! ## The Impact of AI on Healthcare: Hype vs. Reality *Published: 2025-01-10 | Author: agata | Tags: HealthTech, AI* *Source: https://brightinventions.pl/blog/the-impact-of-ai-on-healthcare-hype-vs-reality/index.md* Artificial Intelligence (AI) has generated significant buzz in [healthcare software services](/our-areas/healthcare-software-development/), named as a game-changer for diagnostics, treatment, and patient management. Insights gathered at **[the HLTH Europe conference](https://europe.hlth.com/)** reveal a new perspective: while AI's potential is immense, its readiness and ethical implications remain a matter of debate. ## **AI's Potential in Healthcare** AI’s ability to process large datasets offers promising advancements in diagnostics, personalized treatments, and patient engagement.**[ Dr. Adam Brown](https://www.linkedin.com/in/adambrownmdmba/)** emphasized the potential of AI in "**workforce enablement, reducing workload, and addressing back-office complexities.**" Similarly, Dr. **[Claudia Pastides](https://www.linkedin.com/in/claudiapastides/)** of **[Flo Health](https://flo.health/)** highlighted the role of AI in providing medically accurate, personalized insights to millions, particularly in underrepresented areas like women’s health. AI-driven tools are reshaping patient experiences, from guiding nutritional prescriptions, as **[Michal Kahan](https://www.linkedin.com/in/michal-kahan-a4735559/)** [described](https://brightinventions.pl/blog/nutrition-solution-anydish/#how-does-it-work), to facilitating remote rehabilitation through computer vision, as explained by **[Silvia Raga](https://www.linkedin.com/in/silviaraga/)** of **[DyCare.](https://www.dycare.com/en)**
    ![AI rehbilitation](/images/baner_silviahlth.png "Silvia Raga ")
    ## **Challenges: Data Security and Ethical Concerns** Despite its promise, AI adoption in healthcare is not without challenges. Concerns around data security and accessibility loom large. As [Dr. Mohammad Al-Ubaydli](https://www.linkedin.com/in/idiopathic/) noted, "**data must ultimately belong to the individual**," stressing the need for secure, patient-centric models. **[Michel Valstar](https://www.linkedin.com/in/michel-valstar-692b345/)** echoed similar sentiments, explaining that ethical implementation is critical, particularly in sensitive areas like mental health, **"I think that generative AI, large language models are not good enough yet to independently provide this. But as a tool, as a co-pilot tool to steer, to help human therapists, I think its a fantastic tool."** The disparity in AI accessibility also raises alarms. **[Dr. Brown](https://www.linkedin.com/in/adambrownmdmba/)** pointed out that "**struggling hospitals may continue relying on human capital while wealthier ones move forward with innovative AI solutions,**" highlighting the risk of a fragmented healthcare system. ## **Real-World Applications and Success Stories** Numerous successful applications of AI in healthcare were showcased at the conference: * **Diagnostics and Prevention**: **[Smarter Diagnostics](https://www.smarterdiagnostics.com/)** uses AI to detect early symptoms of orthopedic issues, promoting preventive care.
    ![smarter diagnostics](/images/screenshot-2025-01-10-at-12.27.03.png "")
    *source: https://www.smarterdiagnostics.com/* * **Rehabilitation**: **[DyCare’s](https://www.dycare.com/en)** AI-driven platform enables remote rehabilitation with real-time monitoring, providing both accessibility and efficiency.
    ![DyCare](/images/screenshot-2025-01-10-at-12.29.02.png "")
    *source: https://www.dycare.com/en* * **Mental Health**: **[Blueskeye AI](https://www.blueskeye.com/)** focuses on creating medically relevant face and voice analysis technologies designed to improve the future for as many people as possible. Their technologies are capable of analyzing facial muscle actions and face patterns, linking them to medical conditions such as depression or anxiety.
    ![blueskeyeAI](/images/screenshot-2025-01-10-at-12.25.55.png "")
    *source: https://www.blueskeye.com/* * **Nutrition**: **[Anydish](https://www.anydish.me/)** uses AI to analyze online recipes, index them by nutritional values, and enable health practitioners to create personalized nutritional plans. Patients access tailored recipes via the app.
    ![anydish](/images/screenshot-2024-10-11-at-13.27.46.png "")
    *source: https://www.anydish.me/* These examples underscore the transformative potential of AI when combined with ethical practices and human oversight. ## **A Future Full of Promise—and Caution** The healthcare industry is increasingly embracing AI, with trends pointing toward its integration in diagnostics and patient management. However, the sentiment at **HLTH Europe** was mixed, reflecting both optimism and caution. As **[Michel Valstar](https://www.linkedin.com/in/michel-valstar-692b345/)** summarized, "**Generative AI can be a fantastic tool for assisting human therapists, but it’s not ready to operate independently."** The road ahead for AI in healthcare involves striking a balance—leveraging its strengths while addressing its limitations. With careful implementation, AI has the potential to revolutionize healthcare, making it more efficient, equitable, and personalized. ### Conclusion AI is not a panacea, but when used responsibly, it can bridge critical gaps in healthcare delivery. As the **HLTH Europe conference** demonstrated, the focus must remain on collaboration between technology, professionals, and ethical frameworks to ensure AI’s impact is both meaningful and sustainable. **AI in healthcare is no longer a question of "if" but "how"—how to implement it thoughtfully, ethically, and effectively.** ## From Hamlet to Software: Jarek’s Journey to DevOps Engineering *Published: 2025-01-08 | Author: jarek | Tags: bright insights* *Source: https://brightinventions.pl/blog/career-journey-to-devops-engineering/index.md* **One day, Jarek decided to become an actor. Discover how his dream clashed with reality and how software development became his safety net. Learn about the one decision he regrets, what excites him about DevOps, and how learning to play the guitar reminds him of programming.**
    ![DevOps Engineer career story](/images/brightstoryjarekgrid.png "DevOps Engineer career story")
    ## I heard that you studied acting. Is that true? It’s partially true. I attended acting classes for a year conducted by a professional actress, and then I **tried to get into an acting college in Poland.** I managed to pass the first stage at the school in Cracow, but that was as far as I got. You know, there were 1,600 applicants for just 20 spots – the competition was definitely high. ## Have you always had a plan to become an actor? Actually, no. I was studying computer science at Wroclaw University of Technology, and during my third year, this thought popped into my head: **maybe I should try to become an actor**. I gave it a shot, but it didn’t work out for me. **I returned to computers, actually feeling happy and relieved**. That said, I recommend studying acting. During my classes, there was a **strong focus on psychology, empathy, and understanding what people go through every day**. However, the profession itself is extremely demanding. Like every aspiring actor, **I tried performing Hamlet. After just a week of immersing myself in the role, I started to resent women**, which is far from my usual emotions toward them. The role consumed me too much. I know we often think of actors as wealthy, successful people, but the reality is quite different. Most actors have low-paying, highly demanding jobs in theatres if they’re lucky. ## So you came back to college? I didn’t finish my studies because I was pursuing acting. I regret that now, but at the time, I felt this pressure to completely focus on acting. **All I kept hearing was that at 22, I was already too old, too "molded" to start in this profession**. If I could go back to those times, I’d tell myself: **“Hey, idiot, finish college first and then pursue this dream”**. ## Nevertheless, you ended up in software development. How did that happen? Since I was 18, I worked at a bank between my college semesters. That’s how **I landed a job as a company IT specialist, and it marked my first steps into the corporate world**. It gave me a lot of valuable experience – I learned how to collaborate with accountants, consultants, and other departments. **After I let go of my dream of acting, I was welcomed back there**. Later, I worked at another corporation in a shift-based job focused on backups. It was tough and not very exciting because no one expected us to solve anything; **it was just a ticket-driven job**. Then I moved to another corporation to work as an application administrator. Most of the tasks there were manual, and we couldn’t automate them. To be honest, **I’m a rather lazy person, and I don’t like repetitive work unless it’s absolutely necessary**.
    ![quote on programming](/images/jarek_quote_programming.png "quote on programming")
    That’s when I thought, "This might be it." I had learned some basics in college, had some experience, and really loved automation, so I decided to give DevOps a try. **I don’t think I have the patience to write code all day, but I enjoy scripting** – that’s enough for me. Sometimes, it allows me to escape the abstraction and focus on a screen with white numbers, which has helped me build patience. **When I was younger, I definitely wasn’t ready to become a programmer, but now, as a DevOps Engineer, I’m learning more and more in this field**. I got my first job as a DevOps engineer in a team that lacked sufficient know-how. It was hard to learn from others there. While you can learn a lot on your own, **no certificate or course can replace mentoring from an experienced colleague**. That was what I lacked in that role, but eventually, I found it here at Bright Inventions.
    ![quote on mentoring](/images/jarek_quote_mentoring.png "quote on mentoring")
    ## With your corporate experience, how do you find yourself at Bright Inventions? It’s great! **I really admire the pace at which things are managed here**. For example, I wanted to share information about a charity fund with the whole team, so I asked Ula if that was possible. She gave me approval in just two minutes. In the corporate world, I probably wouldn’t have received approval until after the fund’s deadline had passed. In terms of the technical aspect of my work, **the number of great experts here is truly impressive**. For me, as a relatively inexperienced DevOps specialist, it feels like being promoted to the top league. **I’m surrounded by people I can always approach to discuss technical matters, get another opinion, and receive valuable suggestions**. I also must say that the team retreats at Bright Inventions are the best I’ve ever experienced!
    ![team retreat](/images/jarek_team_retreat.png "Jarek celebrating with the winning team during a laser tag tournament at Bright Inventions’ retreat.")
    Jarek celebrating with the winning team during a laser tag tournament at Bright Inventions’ retreat.
    ## What were your biggest challenges as a DevOps Engineer? One of the challenges is **the need to constantly switch between technologies**. For example, do you need to know SQL as a DevOps engineer? Not usually – until you suddenly have to know everything about it! In this profession, **you have to quickly catch up on new technologies to effectively communicate with the people who use them daily**.
    ![quote on new technologies](/images/jarek_quote_new_technologies.png "quote on new technologies")
    As long as you don’t rest on your laurels or focus solely on maintenance, you’ll encounter plenty of challenges. **Adjusting to different conditions and learning new skills keeps the role exciting** for me. ## I know you play guitar. How’s that going? Guitar has always felt like a kind of fate for me. **Back in college, a friend played and gave me a guitar to try out**. I felt really good about it at the beginning and wanted to see how far I could take it.
    ![At Madame Tussauds.](/images/jarek_guitar.png "At Madame Tussauds with Jimi Hendrix.")
    At Madame Tussauds with Jimi Hendrix. 😉
    Recently, though, **I realized I’d been learning the wrong way for years. I wasn’t really playing – I was just reproducing songs**, without any understanding of what was happening underneath. Eventually, I hit a wall with songs that required more technical skills. I didn’t have any theoretical music knowledge, so now I’m trying to catch up, and I’m already starting to see results. I’d say that the basics are crucial – perhaps even the most important part. **Only when you have a strong foundation can you truly understand more advanced concepts. It’s similar to software development**, really. It’s also like learning a Spanish poem by heart – you might be able to recite it fluently, but that doesn’t mean you actually speak Spanish. ## 10 Point-of-Sale Trends for 2025 *Published: 2025-01-07 | Author: szymon-g | Tags: business* *Source: https://brightinventions.pl/blog/point-of-sale-trends/index.md* **From empowering customers in the checkout process to providing managers with tools to manage multiple devices, and even reducing the number of devices cluttering kitchens, hotels, and stores. Learn top technological pos system trends shaping the future of point-of-sale systems in hospitality and retail.**
    ![POS trends 2025](/images/pos_development_trends_blog_cover.png "POS trends 2025")
    ## Contents (POS software trends): [The continuous rise of QR code ordering as a response to restaurant staff shortages](/blog/point-of-sale-trends/#the-continuous-rise-of-qr-code-ordering-as-a-response-to-restaurant-staff-shortages) [Bill splitting in clients' hands during payment](/blog/point-of-sale-trends/#bill-splitting-in-clients-hands-during-payment) [Changing waitstaff and kitchen communication with the POS Kitchen Display System](/blog/point-of-sale-trends/#changing-waitstaff-and-kitchen-communication-with-the-pos-kitchen-display-system) [POS Hardware decluttering of restaurant, retail, and hotel counters](/blog/point-of-sale-trends/#pos-hardware-decluttering-of-restaurant-retail-and-hotel-counters) [Managing devices integrated with POS using MDM (Mobile Device Management)](/blog/point-of-sale-trends/#managing-devices-integrated-with-pos-using-mdm-mobile-device-management) [Adding work management features to the POS system](/blog/point-of-sale-trends/#adding-work-management-features-to-the-pos-system) [AI-powered POS: Using AI for analytics and inventory](/blog/point-of-sale-trends/#ai-powered-pos-using-ai-for-analytics-and-inventory) [Personalized coupon marketing based on POS system data](/blog/point-of-sale-trends/#personalized-coupon-marketing-based-on-pos-system-data) [Scan & go with your device](/blog/point-of-sale-trends/#scan--go-with-your-device) [The continuous rise of cloud-based Point of Sale systems](/blog/point-of-sale-trends/#the-continuous-rise-of-cloud-based-point-of-sale-systems) ## The continuous rise of QR code ordering as a response to restaurant staff shortages QR codes became popular in restaurants during the pandemic, initially serving primarily to present menus in a digital format. Years have come by and in 2024 many [restaurants still mostly use it to display the menu](https://www.uniqode.com/blog/qr-code-insights/restaurant-qr-code-usage-study).  Looking ahead, 2025 might mark a significant shift as the **hospitality industry begins to** **explore the broader potential of QR codes**. One notable application is **self-ordering**. Customers can scan a QR code with their mobile device, leading them to a mobile-friendly website where they can place orders. However, **QR codes shouldn’t completely replace staff interaction**. Customers still value a personalized touch and may expect to discuss their orders with waitstaff rather than being greeted solely by a QR code on the table. A [survey by investment bank William Blair](https://digitalcxo.com/article/consumers-tired-of-ordering-food-with-qr-codes/) highlights mixed opinions on QR code ordering. Over half of respondents indicated they enjoy using QR codes for ordering and payment at dining establishments:

    However, a significant portion of respondents (47%) expressed discomfort when it comes to using QR codes for tasks like accessing, ordering and making payments.
    Older users, in particular, are less receptive to the technology. The survey found that 65% of individuals over the age of 60 reported discomfort with QR codes. ## Bill splitting in clients' hands during payment It's been a POS trend growing up for years, widely seen also in 2024. Yet there is still a potential for bill split to grow. And we're not talking about separate mobile app enabling diners to share the bill, POS solution vendors should incorporate this option into their POS system. Therefore, in addition to QR code ordering, **restaurants can offer customers the ability to split their bills independently**. For instance, customers can scan a dedicated QR code to access their bill and divide costs among themselves. The split information is then sent directly to the POS system, enabling waitstaff to finalize mobile payment without manual calculations. This feature (and one of the key sales trends) simplifies bill splitting, significantly reducing the workload on already busy staff. Customers have full control over how they want to divide the bill, while the POS system handles the calculations, ensuring accurate amounts. **The waitstaff’s role is streamlined to simply collecting the split payments**. ## Changing waitstaff and kitchen communication with the POS Kitchen Display System Imagine a POS software centered around a **screen in the kitchen that instantly displays a new order** as soon as it's processed by the waitstaff, accompanied by a clear sound signal to notify busy kitchen staff. With just a swipe, kitchen staff can adjust the order or update its status, for example, from "In Preparation" to "Ready to Serve." This is the technology that should be a part of any advanced POS. Although this technology isn't new, many restaurants still rely on a traditional POS with printed kitchen receipts. **KDS doesn't have to fully replace these receipts**; in fact, they can still be invaluable in certain situations. For example, when the kitchen prepares multiple similar orders for different tables, printed kitchen receipts can still accompany the dishes, helping waitstaff quickly identify and deliver the correct meals. Get inspired by the global POS system that implemented the [Kitchen Display System](/projects/kitchen-display-system/) as one of its features. ## POS Hardware decluttering of restaurant, retail, and hotel counters The fact that modern point-of-sale software is connected to many devices is both a benefit and a challenge. For example, **taking care of multiple devices provided by different food delivery parties brings more responsibility to already busy waitstaff**. Building a custom point of sale allows all orders, whether from in-house dining, phone orders, delivery apps, or a white-label application, to be transferred into a single POS system. This means **waitstaff can view and manage all orders on one device**, aligning with the growing trend in POS implementation aimed at eliminating the unnecessary POS devices often provided by third-party systems such as Just Eat, Uber Eats or Deliveroo. Check the example of [POS and food delivery apps integration](/projects/pos-third-party-delivery/) which helped eliminate device declutter in restaurants. ## Managing devices integrated with POS using MDM (Mobile Device Management) Even if all food delivery orders are synced to a single device (especially in mobile POS systems), businesses still face the challenge of managing multiple hardware components, from tablets, terminals and printers to kiosks and even electronic scales in some cases. 2025 should be the year to simplify device management and therefore smooth business operations. One solution is for POS vendors to **develop custom MDM platforms**. These allow managers to ensure mobile [POS devices](/blog/what-are-point-of-sale-devices/) are running the latest software, maintain secure connections, and even block unauthorized websites. MDM protects devices from threats, streamlines updates and configurations, and ensures devices are used strictly for their intended purposes, making business operations more efficient and secure for small businesses and enterprises. ## Adding work management features to the POS system While it might seem like a simple to-do list, this tool is designed to help manage the busy tasks of waitstaff more effectively. **Modern POS systems should empower managers to create and assign critical tasks to specific employees**. For example, scheduling routine duties like cleaning fridge number 2 every Monday, ordering new packaging every Friday, or simple daily checks such as ensuring the bathrooms are clean every hour. **These tasks should be visible on waitstaff mobile devices**, allowing them to quickly mark tasks as completed. This keeps managers informed about progress in real-time.
    ![restaurant mobile devices](/images/restaurant_phone.jpg "restaurant mobile devices")
    ## AI-powered POS: Using AI for analytics and inventory With artificial intelligence in [custom POS software development](/our-areas/pos-software-development/), restaurants can **track customer preferences, predict demand, and optimize stock levels to reduce waste**. AI-powered analytics allow businesses to make **data-driven decisions about menu offerings, pricing, and loyalty programs** improving overall efficiency and customer experience. In inventory management, AI-driven POS systems help **monitor stock in real-time**, quickly informing about the need for ingredients reorder. ## Personalized coupon marketing based on POS system data By leveraging POS data linked to loyalty programs, **businesses can offer truly customized receipts**. These programs, which often connect a customer’s shopping history to their phone number or account, allow for personalized offers tailored to the customer’s preferences. For example, **using POS data analytics, you can present targeted discounts on items a customer is likely to purchase at the optimal time**. The key lies in delivering the right message at the right time. Similarly, **loyalty apps can go beyond offering general discounts** to present personalized deals that resonate with individual shoppers, thereby enhancing engagement and driving repeat purchases. ## Scan & go with your device Self-checkout kiosks have been one of the latest POS trends, growing for several years. According to [RBR Data Services](https://datos-insights.com/press-release/global-demand-for-self-ordering-kiosks-continues-to-soar/), **nearly 700,000 kiosks are expected to be installed worldwide by 2028**. McDonald's alone has already deployed more than 130,000 units. The trend continues to evolve, with **self-checkout systems becoming increasingly independent**. The latest innovation might even remove the need for dedicated self-checkout kiosks in stores or restaurants. Instead, customers can now use their own mobile devices to scan items and complete payments directly. Take [MishiPay](https://mishipay.com/) as an example – a company that might change the retail industry by developing **self-checkout solutions that are accessible directly on users' mobile devices**. ## The continuous rise of cloud-based Point of Sale systems While on-premise systems continue to dominate the restaurant POS market, cloud-based systems are the fastest-growing segment, with a projected compound annual growth rate (CAGR) of [9.2% through 2030](https://www.b2breviews.com/pos-statistics/). The global cloud POS market is expected to exceed $30 billion by 2031, reflecting nearly 25% growth since 2022. For POS vendors yet to offer cloud functionality, **migrating to the cloud should be a top priority in 2025**. Get inspired by a revamping story of a 30-year old [legacy restaurant POS](/projects/pos-legacy/). ## Which POS technology trends will change the restaurant industry, hospitality and retail? 2025 is expected to provide some clarity about the POS industry. Will cloud-based POS systems dominate the majority of the market? These systems offer unparalleled flexibility, allowing businesses to adapt quickly to changing market demands and customer expectations. Will mobile payment systems become even faster and more user-friendly, incorporating features like self-bill-splitting? **We can't wait to see all of these POS software trends in action**! ## Unlock Growth: Free Guide to Scaling a Healthcare Company [PDF Inside] *Published: 2024-02-27 | Author: izabela | Tags: HealthTech, business* *Source: https://brightinventions.pl/blog/scaling-healthcare-software-solution-guide/index.md* **The coming years, or even months, will be critical for healthcare startups & SMEs to carve out their path to successful scalability. Download our free guide, where we've compiled market reports, case studies, expert insights, tech trends, and more. Almost 100 pages for you!** ## What’s inside the guide for healthcare companies? Check the table of contents of the “Scale Your HealthTech Solution Successfully” guide: * HealthTech in post-recovery phase, * examples of HealthTech sectors to watch, * tech that drives scaling, * the power of data in HealthTech, * securing medical data when using LLM models, * the power of pivot, * coming back to your persona. Claim your copy now! ## How to Build MVP for Smart Packaging Solution in 2025 *Published: 2023-05-09 | Author: mateusz | Tags: business perspective, development, startup* *Source: https://brightinventions.pl/blog/how-to-build-mvp-for-smart-packaging-solution/index.md* **Do you plan to enter the smart packaging industry with your solution? With such a fast-developing industry time-to-market is the key. The best way is to build and launch MVP (Minimum Viable Product) and start gathering first users' feedback. What problems could smart packaging solve? What are MVP development stages? What tech should you implement in your MVP? Dive in!**
    ![smart packaging MVP](../../static/images/smart_packaging_blog_cover.png "undefined")
    - - - ## Table of contents [Smart packaging definition and market size](/blog/how-to-build-mvp-for-smart-packaging-solution/#smart-packaging-definition-and-market-size) [Why you should build MVP for Smart Packaging](/blog/how-to-build-mvp-for-smart-packaging-solution/#why-you-should-build-mvp-for-smart-packaging) [Top benefits of building an MVP for a smart packaging startup](/blog/how-to-build-mvp-for-smart-packaging-solution/#top-benefits-of-building-an-mvp-for-a-smart-packaging-startup) [Problems that smart packaging MVP can offer solutions for](/blog/how-to-build-mvp-for-smart-packaging-solution/#problems-that-smart-packaging-mvp-can-offer-solutions-for) [Examples of smart packaging solutions on the market](/blog/how-to-build-mvp-for-smart-packaging-solution/#examples-of-smart-packaging-solutions-on-the-market) [MVP development stages for a smart packaging solution](/blog/how-to-build-mvp-for-smart-packaging-solution/#mvp-development-stages-for-a-smart-packaging-solution) [Examples of technologies to implement in a smart packaging product](/blog/how-to-build-mvp-for-smart-packaging-solution/#examples-of-technologies-to-implement-in-a-smart-packaging-product) [What stack to use for smart packaging solution in 2025?](/blog/how-to-build-mvp-for-smart-packaging-solution/#what-stack-to-use-for-smart-packaging-solution-in-2025) - - - ## Smart packaging definition and market size **Smart packaging refers to packaging that is designed with advanced technologies** to provide additional features such as information, monitoring, and security. According to [Acumen Research and Consulting](https://www.globenewswire.com/en/news-release/2023/02/22/2612787/0/en/Active-Smart-and-Intelligent-Packaging-Market-Size-Growing-at-8-3-CAGR-Set-to-Reach-USD-29-4-Billion-By-2032.html#:~:text=The%20Global%20Active%2C%20Smart%20And%20Intelligent%20Packaging%20Market%20Size%20in,at%20a%20CAGR%20of%208.3%25), **The Global Smart Packaging Market Size in 2022 stood at USD 12.2 Billion and is set to reach USD 29.4 Billion by 2032**.
    ![The Global Smart Packaging Market Size](../../static/images/globe-image-global-active-smart-and-intelligent-packaging-ma.png "The Global Smart Packaging Market Size")
    **To provide a comparison, one market that has a similar size to the projected smart packaging market size is the global digital signage market**. According to a report by MarketsandMarkets, the global digital signage market size was estimated at USD 16.3 billion in 2021 and is projected to reach USD 27.8 billion by 2026, growing at a CAGR of 11.2% during the forecast period. ## Why you should build MVP for Smart Packaging When building an innovation you can never be sure if it adopts in the market. That’s why it is better to build a low-cost and fast MVP to minimize the risk of an unsuccessful investment.
    An MVP, short for a Minimum Viable Product, is a software product that includes only the essential features necessary for launching and obtaining initial feedback from early adopters. It serves as a starting point for further development based on the insights gained from early users.
    ## Top benefits of building an MVP for a smart packaging startup These are the benefits you should consider: ### Validate your idea MVP lets you **validate your assumptions about the target audience in a timely and low-cost manner**. If the MVP turns out not to be successful, you can quickly rethink your strategy and adjust it to meet users' expectations. When the MVP proves to be a success, then you know you are going in the right direction and can simply keep working. ### Reducing costs MVP is an investment in the base of your product. **Choosing to build only crucial features helps to reduce costs**. A low budget can actually be an advantage for startups. How come? It helps you rationally choose the key features of your solution. It motivates software developers to seek effective, low-cost solutions to any technical challenge. In the end, it protects startups from losing all their resources on a product that won’t attract users. ### Short time to market The smart packaging industry is rapidly evolving, and **building an MVP can help you stay ahead of the curve** by allowing you to quickly test new technologies and features. Building MVP is a matter of weeks, so you can really quickly show your product to the market. ### Iterative Development By building an MVP, **you can continually test and improve your product**, allowing you to adapt to changing market conditions and customer needs. This iterative development process can help you create a more robust and successful product in the long run. ## Problems that smart packaging MVP can offer solutions for Examples of problems smart packaging innovations can address: ### Supply chain inefficiency Smart packaging has the potential to **revolutionize the supply chain by providing real-time information about products' location, condition, and integrity**. By building an MVP, you can quickly demonstrate the value of your product to potential partners and investors in the logistics industry, helping to drive adoption and create a more efficient supply chain. ### Food and packaging waste Smart packaging can help **reduce waste by extending the shelf life of perishable goods and preventing product spoilage**. It also **helps to reduce plastic waste**. Single-use plastic containers, wrappings, etc. create unimaginable waste. By building an MVP, you can demonstrate the impact of your product on waste reduction, helping to position your startup as a leader in sustainability.
    ![Food and packaging waste](../../static/images/waste.png "Food and packaging waste")
    ### Lack of traceability and security Smart packaging can also **improve product traceability and security by providing a tamper-evident seal and tracking information throughout the supply chain**. By building an MVP, you can demonstrate the value of your product to potential partners and investors, helping to drive adoption and create a more secure supply chain. ## Examples of smart packaging solutions on the market Learn more about successful products that offer smart packaging: ### Relevo [Relevo](/projects/eco-friendly-app/) – a smart packaging solution that helps to limit food containers' plastic waste. ### Securikeitt [Securikeitt](https://www.securikett.com/en/our-solution/securitylabels-and-seals/) – security labels and seals securing products from tampering, counterfeiting and grey trade. ### Eupry [Eupry](https://eupry.com/temperature-mapping/temperature-mapping-kit/) – temperature mapping kit contains wireless data loggers and specialized mapping software. ## MVP development stages for a smart packaging solution Here are the typical MVP development stages. The final flow may vary depending on the project. ### Idea for MVP The idea doesn’t guarantee success. It’s only the first step. ;) It’s essential to verify whether the idea has business potential and a chance to stand in the market. It's also the perfect opportunity to set first goals that will help measure the app's success in the future. During this stage, you can try to consult your idea with a suitable MVP development company. Finally, it’s time to decide if you plan to get your own team to build the MVP or hire an MVP agency to take care of that.
    ![Idea for MVP](../../static/images/1_idea.png "Idea for MVP")
    ### MVP Prototyping (1-4 weeks) Validating the ideas' potential is followed by prototyping. The prototyping phase is when a product designer creates the first visual representation of the idea. The effect of close cooperation with a [product design team](/our-areas/product-design/) is prototypes. They are basic clickable mockups or wireframes without any backend. This stage helps to eliminate first mistakes and understand how the solution might work.
    ![MVP Prototyping](../../static/images/2_app_prototyping.png "MVP Prototyping")
    ### Building and launching the MVP (Minimum Viable Product) **(4-20 weeks)** According to the feedback received during the prototyping stage, the software development agency gathers the final requirements from the client and builds the minimal viable product. As you can see, you can launch an MVP in weeks and with marketing experts quickly start to gather users. Launched MVP is also a great conversation starter with investors. 😉 MVP is a cornerstone of your product. Based on it you keep developing it according to your users' feedback.
    ![Building and launching the MVP](../../static/images/3_mvp.png "Building and launching the MVP")
    ### Product Development & Maintenance based on MVP (Infinity – hopefully) The final stage is app development and maintenance. At this stage, a software development company or internal dev team regularly deploys new features to production. Every change in the product will affect your users. Thus, the priority for developers is to maintain the app's stability. All development updates should be tested in a staging environment. It’s a constant challenge of developing the product to give more and more satisfaction to the users. The crucial part of development, yet often neglected is analytics. You should monitor app performance, user behavior, and install and retention rates in the post-MVP phase to get to know your users as much it is possible.
    ![App development and maintenance](../../static/images/4_app_development_maintenance.png "App development and maintenance")
    ## Examples of technologies to implement in a smart packaging product MVP is all about launching a product with key features. So you shouldn’t implement too many time-consuming and expensive (to build) features at the beginning. However, we’d like to show you what innovations you might consider while building smart packaging solutions. ### QR Codes These codes are printed on the packaging and can be scanned by smartphones to provide information about the product, such as ingredients, nutritional information, and product origin. ### Near Field Communication (NFC) This technology uses radio frequency identification (RFID) to transmit data wirelessly between a tag embedded in the packaging and a reader. This allows for more extensive information about the product, including temperature and humidity data, to be transmitted. ### Time-Temperature Indicators (TTIs) These are small devices that are attached to packaging to monitor the temperature of perishable goods during transport and storage. They can provide an indication of whether the product has been subjected to temperature abuse and can help to prevent food waste. ### Intelligent Packaging This refers to packaging that is embedded with sensors and can communicate with other devices. For example, intelligent packaging could include a sensor that detects when a product has been opened and communicates with a smartphone app to provide recipes or serving suggestions. ### Active Packaging This type of packaging contains substances that can extend the shelf life of the product. For example, oxygen scavengers can be added to packaging to prevent spoilage. ### Anti-counterfeiting Technologies Smart packaging can include technologies such as holograms, QR codes, and RFID tags to help prevent counterfeit products from entering the supply chain. ### Augmented Reality This technology uses the camera on a smartphone or tablet to overlay digital information onto the packaging, providing additional information or interactive experiences for consumers. ### Printed Electronics This technology involves printing electronic components onto packaging materials, allowing for more advanced features such as temperature monitoring and product authentication. ## What stack to use for smart packaging solution in 2025? Based on our experience in developing software since 2012 we listed the stack your software team should work with in 2025. ### Web development: **Frontend**: TypeScript, React **Backend**: Node.js, PostgreSQL/Redis, NestJS, AWS ### Mobile development: Whether you decide to build native or hybrid applications (one app for both Google Play and AppStore), we will show you what stack you should consider. Remember that **you don’t need to build MVP for both systems (Android, iOS**). You can start with one app and launch it as MVP and then work on another. A hybrid approach is only recommended when you want to build a very simple solution. **Android development**: Jetpack Compose, Kotlin, Apollo GraphQL, WorkManager, Room, Hilt. **iOS development**: SwiftUI + UIKit, Swiftgen, Apollo GraphQL, CoreData, SwiftLint, SwiftFormat, Sourcery, Bitrise. **Hybrid app development**: React Native, TypeScript, mobx-state-tree **Project management & documentation**: Jira, Figma, Github, Notion, Miro, GitHub Actions **Product design**: Figma, Adobe, Miro ## Build and Run iOS App Tests with GitHub Actions – 2025 Tutorial with Example *Published: 2024-07-18 | Author: arturs | Tags: iOS, ci/cd, github actions, fastlane* *Source: https://brightinventions.pl/blog/ios-build-run-tests-github-actions/index.md* **In the first part of a tutorial we [configured fastlane and succeeded in running tests locally](/blog/building-running-ios-app-test-locally-fastlane/), right from our console, now it's time to make them fly, fly on GitHub!**
    ![GitHubActions + iOS](/images/background.jpg "GitHubActions + iOS")
    ## Creating a workflow file To make your project running on GitHub you need to create a yaml file that will be executed there. To do that, in your main project folder enter command **`mkdir .github  && cd .github`** This command creates GitHub directory and enters into it. **`mkdir workflows && cd workflows`** This one creates workflows directory, you can read more about it here: **[docs.github.com/en/actions/using-workflows/about-workflows](https://docs.github.com/en/actions/using-workflows/about-workflows)** Inside, create a workflow file. You can name it “build-test-ios.yml” ## Setting Up and Understanding Your Pipeline Now open the file that you just created and enter the code snippet that I added below. Don't be afraid if you don't fully get what's going on here - we will take it part by part down below ```ruby name: iOS build on: push: branches: - 'main' jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v3 - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: '15.3.0' - name: Set up ruby env uses: ruby/setup-ruby@v1 with: ruby-version: 3.3 bundler-cache: true - name: Build & test iOS binary run: bundle exec fastlane ios build_and_run_tests ``` Now let’s split it into small parts, so it will be easier to understand what our pipeline is doing. ```ruby on: push: branches: - 'main' workflow_dispatch: ``` This part decides about triggers that will start our workflow. To simplify implementation we want to listen to changes when they are pushed to a main branch. Second option that we created is manual trigger. You can read more about events that trigger workflows [here](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#push). ```ruby jobs: build: runs-on: macos-latest ``` We defined one job named “build” which will be runned on the latest available macOS on GitHub. You can check the list of GitHub runners [here](https://github.com/actions/runner-images). ```ruby steps: - uses: actions/checkout@v2 - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: latest-stable - name: Set up ruby env uses: ruby/setup-ruby@v1 with: ruby-version: 3.3 bundler-cache: true ``` Our tasks are defined by "steps"  Under each step we can link multiple actions with keyword “uses” ([reference](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses)). The actions we will need are as follows: 1. actions/checkout@v2 -  checks out our repository, so our workflow can use it  ([reference](https://github.com/actions/checkout)).  2. "maxim-lobanov/setup-xcode@v1" - selects the latest stable xcode to build our app on GitHub runner ([reference](https://github.com/maxim-lobanov/setup-xcode)). 3. ruby/setup-ruby@v1 - downloads a prebuilt ruby and adds it to the PATH  ([reference](https://github.com/ruby/setup-ruby)). ```ruby - name: Build & test iOS binary run: bundle exec fastlane ios build_and_run_tests ``` Runs on github runner lane that we defined in the first [article](https://brightinventions.pl/blog/building-running-ios-app-test-locally-fastlane/) Now commit and push your changes. It has to be done on the main branch as on this one we created branch policies. ## Seeing results of your work To see the result, go to your repository on GitHub and tap on the actions tab. Here you should see the pipeline that has started after you pushed your changes to the repository.
    ![GitHub Actions tab with result latest build](/images/github-workflow.png "GitHub Actions tab with result latest build")
    GitHub Actions tab with result latest build
    Congratulations, you just fired your first pipeline using GitHub Actions! This is the second part of the iOS CI/CD tutorial. In another articles you will learn: * [how to build and run iOS app tests locally with **Fastlane**](/blog/building-running-ios-app-test-locally-fastlane/); * how to upload your app to TestFlight with the usage of **GitHub Actions and Fastlane Match** (soon to be released). Don’t miss those tutorials! [Sign up for our newsletter and receive the articles in your inbox](https://bright-dev-newsletter.getresponsepages.com/). ## Upload iOS App to TestFlight with GitHub Actions and Fastlane Match – 2025 Tutorial with Example *Published: 2024-08-13 | Author: arturs | Tags: ios* *Source: https://brightinventions.pl/blog/ios-testflight-github-actions-fastlane-match/index.md* **In previous parts of a tutorial we were [building app and running tests locally with fastlane](https://brightinventions.pl/blog/building-running-ios-app-test-locally-fastlane/) and [building app and running tests with usage of GitHub Actions](https://brightinventions.pl/blog/ios-build-run-tests-github-actions/). Now our goal is to upload an app to TestFlight with usage of GitHub Actions and Fastlane Match!**
    ![](/images/github4.png "")
    Before we move on, you need to have an 1. Empty, private repository on GitHub where you will store your certificates and provisioning profiles generated by Fastlane Match.   2. Fastlane configured on your device, I described how to do it [here](https://brightinventions.pl/blog/building-running-ios-app-test-locally-fastlane/). 3. Apple developer account. Our goal is to improve the process of testing and distributing the app to customers. ## **Understanding Fastlane Match** Before diving into configuring Fastlane Match, let's first understand what it is and how it works. It's a Fastlane tool that makes it easier for your team to manage and share iOS and macOS certificates and provisioning profiles. It keeps everything secure in a Git repository, where you can track changes. This way, everyone uses the same credentials, which helps prevent issues in the code signing. ## **Configuring Fastlane Match** In console enter command **`fastlane match init`** After that you will need to select where you want to store your profiles and certificates. The most common option is git which we will use in this tutorial
    ![](/images/match-init.png "")
    Next step is to paste the url where we want to store your profiles.
    ![](/images/match-init-2.png "")
    You can check that in the folder a new file named “Matchfile” was created. When you open it, you can see that it stores configuration details for code signing. Let’s go line by line. ```ruby git_url("git@github.com:LinkToYourRepo.git") storage_mode("git") type("development") app_identifier(["your.app.identifier"]) ``` 1. Git url which we selected in previous step. 2. The storage mode you selected during the initial step of Fastlane Match setup. 3. Here, we specify the type of provisioning profile and certificate that Fastlane should manage, which can be: [appstore](https://developer.apple.com/help/account/manage-profiles/create-an-app-store-provisioning-profile/), [adhoc](https://developer.apple.com/help/account/manage-profiles/create-an-ad-hoc-provisioning-profile/) or [development](https://developer.apple.com/help/account/manage-profiles/create-a-development-provisioning-profile/).  4. An app identifier is a unique string that identifies your app, typically formatted as a reverse-domain name (e.g., com.example.myapp). Great, you have your matchfile configured! Our next goal is to run a fastlane match locally. ## **Running a Fastlane Match locally** In terminal enter command: `fastlane match` First, you need to set a passphrase for the Git repository. This is an additional layer of security: each of the files will be encrypted using openssl. Make sure to remember the password, as you'll need it when you run a match on a different machine. To set the passphrase to decrypt your profiles using an environment variable (and avoid the prompt) use MATCH_PASSWORD.
    ![](/images/match-password.png "")
    As a next step you will need to enter your Apple Developer account username which will be used to create certificates and profiles.
    ![](/images/match-username.png "")
    If your user is associated with more than one team, then you will need to specify on which team you want to create certificates. You'll need to enter your password here. If you have two-factor authentication (2FA) enabled, you can enter the 2FA code directly into the console. You might need to enter your username a few more times if match won’t be able to find code signing identity.  As a confirmation that everything went fine, you should see a message: ***All required keys, certificates and provisioning profiles are installed 🙌*** Great! With development profiles and certificates, you'll be able to install your app on your physical device. Now, let's do the same for App Store certificates and profiles, which are necessary for uploading your app to TestFlight. After generating profiles and certificates, an Xcode restart might be needed to make them visible inside it.
    ![](/images/profiles.jpg "")
    For that go back to Matchfile and change type to appstore. It should look like this: `type("appstore")` Save file, go back to terminal and once again enter `fastlane match` and do a setup once again. This time we created AppStore certificates and profiles. After finishing this step you can go to xcode and check that in the Signing and Capabilities tab no error is prompted. Congratulations! You've created all the metadata required for signing your application. ## **GitHub secrets** GitHub Secrets are encrypted variables in a repository or organization, used to securely pass sensitive information to GitHub Actions workflows, ensuring data like API keys and tokens are not exposed in the codebase. Let’s add the necessary data for the build agent to upload your app to TestFlight. To upload data as GitHub secrets follow steps from GIF below (Settings -> Secrets and variables -> Actions).
    ![](/images/2024-06-23-15.21.11.gif "")
    To make your CI/CD work you need to upload 5 things as GitHub Secrets. In brackets I entered names which I recommend to use, as this is what we will use in our workflow file. If you don’t know how to get these - don’t worry, below I described how you can get all of this data. 1. AppStoreConnect Issuer ID (ASC_ISSUER_ID) 2. AppStoreConnect key ID (ASC_KEY_ID) 3. AppStoreConnect key content (ASC_KEY_CONTEND 4. Match password (MATCH_PASSWORD) 5. Match git private key (MATCH_GIT_PRIVATE_KEY) ### **AppStoreConnect Issuer ID, Key ID & Key Content** To create an App Store Connect API key, log in to your account in App Store Connect, select the "Users and Access" tab, then select "Integrations" and then "App Store Connect Api" from the menu on the left. You should be able to create a new key by pressing the large blue + button You can find Issuer ID above blue + button. It is a unique identifier that represents your Apple Developer account and is used in conjunction with API keys to authenticate API requests.
    ![](/images/appstore-connect-api-key.png "")
    Provide its name and the access level you want to give it. The “developer” level will be sufficient.
    ![](/images/generate-api-key.png "")
    ### **Match password & match git authentication** 1. Match password - it’s a passphrase you entered as a first step after entering the “fastlane match” command. 2. Match git authentication - private part of SSH key that build agent will use to authenticate on certificates repository. If you don’t have one already you need to create a new SSH key (you can read how to do it [here](https://docs.tritondatacenter.com/public-cloud/getting-started/ssh-keys/generating-an-ssh-key-manually/manually-generating-your-ssh-key-in-mac-os-x)). ## **Workflow file** Now go to the yaml file that we created in a [previous article](https://brightinventions.pl/blog/ios-build-run-tests-github-actions/). You can find it in the directory “/pathToYourProject/.github/workflows”. If you don’t have it, you can create it in terminal by opening main project folder and entering command `mkdir .github  && cd .github && mkdir workflows && cd workflows` Inside, create a workflow file. You can name it “build-upload-ios.yml”Your workflow file should look like in this [gist](https://gist.github.com/Sulinskii/1959fa06095a03a5b588a0208ef65861). Below I divided it into smaller parts and described each of them. ```ruby name: iOS build & upload on: push: branches: - 'main' jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v2 - uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: latest-stable - name: Set up ruby env uses: ruby/setup-ruby@v1 with: ruby-version: 3.3 bundler-cache: true ``` This part was already described in a [previous article](https://brightinventions.pl/blog/ios-build-run-tests-github-actions/). Only the name of action has changed to “iOS build & upload” as it better describes what our pipeline will be doing. ```ruby name: Build & upload iOS binary run: bundle exec fastlane ios build_upload_testflight env: ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} MATCH_GIT_PRIVATE_KEY: ${{ secrets.MATCH_GIT_PRIVATE_KEY }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} ``` This step uploads the iOS app binary (IPA file) and dSYM file (it is a debugging file that contains symbol information to help interpret crash reports by mapping memory addresses back to the original source code) as artifacts. It uses the built-in actions/upload-artifact@v2 action to achieve this. The name parameter specifies the artifact name as "app-store ipa & dsyms", and the path parameter defines the locations of the IPA and dSYM files within the workspace to be uploaded. ## **Configuring Fastfile** Your fastfile should look like in this [gist](https://gist.github.com/Sulinskii/b103c61018e614cd75352165e637d049).\ The goal is to: * Load App Store Connect API key information from environment variables. * Load the API key. * Set up the CI environment. * Retrieve provisioning profiles and certificates using Fastlane Match. * Build the app. * Upload the app to TestFlight. Let’s split it into smaller parts. `platform :ios do` This begins a block of configurations and actions that are specific to the iOS platform. ```ruby before_all do ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "120" end ``` Here, we set FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT to 120 seconds. This configuration extends the timeout period for Fastlane when it interacts with Xcode's build processes. By setting it to 120 seconds, we're allowing extra time for Fastlane to retrieve build settings, which can be useful for larger projects that require more time to process. ```ruby desc "Load ASC API Key information to use in subsequent lanes" lane :load_asc_api_key do app_store_connect_api_key( key_id: ENV["ASC_KEY_ID"], issuer_id: ENV["ASC_ISSUER_ID"], key_content: ENV["ASC_KEY"], in_house: false ) end ``` This lane loads the App Store Connect API Key. It uses the built-in fastlane command “app_store_connect_api_key”. You can read more about it [here](https://docs.fastlane.tools/actions/app_store_connect_api_key/). * “key_id”, “issuer_id”, and “key_content” are read from environment variables. These values are necessary for authenticating with the App Store Connect API. * in_house: The App Store Connect API can't currently distinguish between App Store and Enterprise teams. To work around this, the "app_store_connect_api_key" action and Fastlane's API Key JSON format include an optional "in_house" key. This key may be required when using match or sigh. Now we have all elements that are required to build a top level lane which executes all of the steps. ```ruby desc "Build and upload to TestFlight" lane :build_upload_testflight do load_asc_api_key setup_ci match(type: 'appstore', verbose: true) build_app(scheme: "Your-scheme", verbose: true) upload_to_testflight end ``` In this lane, we bring together everything we've set up throughout the article. It invokes all the previously created lanes, builds the app, and uploads it to TestFlight. * load_asc_api_key - Calls the load_asc_api_key lane that we described above. Makes sure the API key is loaded. * setup_ci - Creates a temporary keychain specifically for use with match. Switches match to read only mode to not create new profiles/cert on CI. This temporary keychain is automatically removed at the end of the workflow. * match - Uses fastlane match to fetch the app's provisioning profiles and certificates. verbose: true enables detailed logging. * build_app - Builds the app using the specified scheme, with verbose logging enabled. Uses [gym](https://docs.fastlane.tools/actions/gym/) underneath  * upload_to_testflight - Uploads the new binary to TestFlight for distribution to testers.  **Congratulations! You have successfully uploaded your application to Testflight with usage of GitHub Actions! This was the third part of the iOS CI/CD tutorial. In another articles you will learn:** * [how to build and run iOS app tests locally with Fastlane](https://brightinventions.pl/blog/building-running-ios-app-test-locally-fastlane/); * [how to build an iOS app and run tests with the usage of GitHub Actions](https://brightinventions.pl/blog/ios-build-run-tests-github-actions/); ## Build and Run iOS App Tests Locally with Fastlane - 2025 Tutorial with Example *Published: 2024-07-11 | Author: arturs | Tags: iOS, Fastlane, ci/cd* *Source: https://brightinventions.pl/blog/building-running-ios-app-test-locally-fastlane/index.md* **Quick and reliable iOS application delivery is crucial and properly configured CI/CD pipelines can significantly aid in this process. Learn how to start your journey by building your app and running tests locally with Fastlane in 2025. Enjoy the part 1 of the step-by-step iOS CI/CD tutorial. More to come soon!**
    ![fastlane + ios](/images/ios_fastlane_in_text_update.png "")
    Before we start, you need to have an iOS project with at least one unit test. ## What is CI/CD and what can you gain from it? **Continuous Integration** (CI) is the practice of frequently integrating code changes into a shared repository, where automated builds and tests are run to detect issues at an early stage. **Continuous Delivery** (CD) extends this by automating the deployment of applications, ensuring that code can be reliably released at any time. What can you gain by this automation? * **Faster Time to Market:** Automating the build, test, and deployment processes allows for quicker and more frequent releases. * **Improved Code Quality:** Continuous integration ensures that code changes are automatically tested, leading to higher code quality and fewer bugs. * **Consistent Deployment:** Automating deployments reduces the risk of human error, ensuring consistency across environments. * **Tools integrations:** CI/CD allows you to integrate tools into your pipeline, such as SwiftLint, SonarQube, sending dSYMs to Firebase Crashlytics or Sentry for error monitoring.  ## How can you integrate CI/CD in iOS programming?  The most versatile, popular, and common free open-source tool to do so is Fastlane. It is an open-source automation tool designed to simplify and streamline the deployment process of mobile applications. It allows you to automate building, testing, and releasing apps and also gives you the possibility to easily manage app metadata like certificates and provisioning profiles for iOS projects.  **You can read more about it here: [fastlane.tools](https://fastlane.tools/)** There are a few ways to install Fastlane on your device, however, the most recommended one is the one using [bundler](https://bundler.io/). It will also allow us to easily integrate other tools in future - if needed.\ **[docs.fastlane.tools/getting-started/ios/setup](https://docs.fastlane.tools/getting-started/ios/setup/)** Great, you have just installed a tool that will allow you to build your first CI. Just to confirm everything works and is ready to go type: `fastlane -v` **If everything went OK, you should be able to see the details of the installed Fastlane.** ## **Fastlane setup** In the root folder of a project type this command: `fastlane init` during installation select the option “Manual setup - manually setup your project to automate your tasks (Option 4)” - for the purposes of this guide, we want to do the configuration ourselves.
    ![fastlane setup options](/images/fastlane-setup-options.png "Options for Fastlane setup")
    Options for Fastlane setup
    Now, you should see a new one named “fastlane” in the root folder. Inside there should be two files: * **Fastfile -** fastlane uses it to store the automation configuration. Within that, you’ll see different lanes. Each is there to automate different tasks, like screenshots, code signing, or publishing new releases. * **Appfile** - configuration file. Stores information about the Bundle ID of your app and your Apple Developer Portal username. For now, we don’t need to focus on it, if you want, you can read more about it [here](https://docs.fastlane.tools/advanced/Appfile/) ## **Building your first lane** Our goal is to build an application and run tests locally on your machine. Open fastfile and replace the existing lane with this code ```ruby desc "Build app and run tests" lane :build_and_run_tests do scan(devices: ["iPhone 15"]) end ``` We defined our custom lane named “build_and_run_tests” which underneath calls build-in lane “scan” ([docs.fastlane.tools/actions/scan](https://docs.fastlane.tools/actions/scan/)). The “desc” line provides a description for your lane, making it easier to understand its purpose.  You can replace “iPhone 15” with any device you want to use for your tests. If you omit this option, Fastlane will select the first available simulator. Additionally, there are many other parameters you can modify and choose from: [docs.fastlane.tools/actions/scan/#parameters](https://docs.fastlane.tools/actions/scan/#parameters) Congratulations! You just wrote your first lane - and with that, you've prepared everything to run your tests through a single command in the console! Now let's check if it works! Go to the root folder of your project and enter command: `fastlane build_and_run_tests` As the outcome you should see how many tests succeeded and how many failed.
    ![fastlane output](/images/fastlane-output.png "Example output of launching “fastlane build_and_run_tests” command")
    Example output of launching “fastlane build_and_run_tests” command
    This is the first part of the iOS CI/CD tutorial. In the next articles you will learn: * [how to build an iOS app and run tests with the usage of GitHub Actions](/blog/ios-build-run-tests-github-actions/); * how to upload your app to TestFlight with the usage of GitHub Actions and Fastlane Match (soon to be released). **\ Don’t miss those tutorials! [Sign up for our newsletter and receive the articles in your inbox](https://bright-dev-newsletter.getresponsepages.com/).** ## Building MVP for FemTech in 2025: Timeline, Stack, Security and More *Published: 2024-04-10 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/building-mvp-for-femtech/index.md* **Before you start building the MVP for your FemTech solution, there are several key areas you should be familiar with. In this guide, we'll cover the technical challenges, the technology stack, and security practices essential for planning your MVP journey.**
    ![FemTech MVP](../../static/images/femtech_mvp.png "FemTech MVP")
    There are several key technological aspects of FemTech that could significantly influence the success of your product. We delve deeply into FemTech in another one of our blog posts, which you are encouraged to explore here: [Understanding FemTech: Keys to Succeed with Your Software Solution for Women](/blog/keys-to-succeed-in-femtech/). However, in this article, we focus exclusively on [the development of a Minimum Viable Product (MVP)](/our-areas/mvp-development/), which is also a critical component of the software development process, especially in the context of FemTech. ## Benefits of MVP development in FemTech ### The fastest way to validate your idea is through MVP development Even with thorough user research and product workshops, pre-launch stages are mostly based on assumptions. An MVP will provide definitive feedback on whether your idea merits further investment of money and resources. ### Less financial risk Launching the first version of your solution cost-effectively—an MVP includes only essential features that offer unique value. This allows for a smaller investment and minimizes the potential financial risks associated with every [MVP development](/our-areas/mvp-development/). ### A first step towards scaling A well-executed MVP should serve as a solid foundation for future enhancements. ## MVP development process and timeline Every MVP development process is different, but we listed the typical MVP phases:
    ![MVP FemTech timeline](../../static/images/mvp_healthtech_timeline.png "MVP FemTech timeline")
    ### Ideation Perhaps it all begins with an idea, but the real work is just getting started. This is the time to assess the business potential of the idea, establish buyer personas, and identify market challengers. One of the most effective ways to do this is through [product workshops](/our-areas/product-workshops/), preferably conducted by a company that specializes in delivering MVPs for specific sectors. Do you plan to better understand your buyer persona? Check out the free [ICP + B2B Buyer Persona Workshop](https://miro.com/miroverse/b2b-buyer-persona-workshop-template/) template made by our team. ### Prototyping (1-4 weeks) This is the moment to visualize the idea, often in the form of basic clickable mockups. This stage helps every member of the development process – both business and technological sides – to ensure they are on the same page. It also enables the elimination of initial mistakes in the UI. ### Development and launch the MVP (4-20 weeks) The moment when the software team, whether in-house or outsourced, can develop the solution according to the plan, preferably in 2-week sprints. The MVP should showcase the key features but shouldn't be too advanced, allowing the development process to realistically last up to 20 months. ### Scaling (Infinity – hopefully) The post-MVP phase can be a critical moment for your FemTech startup. Finding the balance between delivering new features, as well as building credibility with a reliable and secure solution, is essential. Development and maintenance are crucial, and the rising number of users, which is indeed something to celebrate, might cause performance issues that every successful post-MVP product has to face at some point. Therefore, performance monitoring, adhering to security best practices, and a strong QA approach might be key to success. Along with a marketing campaign, of course. ## MVP stack to choose for your FemTech solution
    ![MVP stack](../../static/images/blog_post_tech_stack_mvp.png "MVP stack")
    **Web development**: JavaScript/TypeScript, React **Mobile development**: Swift (iOS), Kotlin (Android) **Hybrid mobile app development**: React Native, TypeScript, mobx-state-tree **Cloud development**: Amazon Web Services (AWS) / Microsoft Azure / Google Cloud, JavaScript/TypeScript, Node.js/NestJS ## Examples of technologies and best practices to implement in FemTech ### IoT with healthcare smart wearables enabling telemedicine and remote patient monitoring Femtech wearables offer numerous opportunities to support female patients on a daily basis. These devices range from those that assist with menstrual and fertility monitoring to cooling bracelets designed for women experiencing menopause, marking a new era for FemTech through wearables and the Internet of Things (IoT). The Internet of Things enables the connection of all devices with dedicated applications, allowing data collected by these devices to be quickly processed and verified by doctors. This significantly reduces the time required for diagnosis. [Read more about examples of IoT implementation](/blog/examples-of-the-internet-of-things-for-retail-healthcare-and-more-with-case-studies/). ### Data analytics & performance monitoring Before launching your MVP, consider setting up even a basic app performance monitoring system to ensure your solution operates as intended and to proactively prevent any potential performance issues. This is particularly crucial in the post-MVP phase when your solution begins to attract more users, which will serve as the real test of your infrastructure. Find out [how to set up app performance monitoring](/blog/healthcare-app-performance-monitoring/) with our tutorial. ### Security practices Securing your patients' data should always be a priority, even during MVP development. You can then start a proper secure software development cycle, incorporating all recommended security strategies and tools. In another blog post, [we've listed security practices you need to implement to build a secure and trustworthy solution](/blog/cyber-security-in-healthcare/). ## Key technology decisions to make at the MVP stage ### Native or hybrid mobile applications Building one hybrid solution for both app stores or a separate dedicated apps for Google Play and App Store? That is the question every mobile MVP owner has to face. We cover deeply the subject of [hybrid vs native mobile apps](/blog/mvp-tech-stack-what-startup-founder-should-know/#hybrid-or-native-mobile-app-that-is-the-question) in another article.
    ![hybrid vs native mobile development](../../static/images/infografika_hybrid_native.png "hybrid vs native mobile development")
    ### Choosing a cloud provider Cloud computing is crucial for medial data storage. In terms of cloud providers, you should choose the one your team is the most familiar with.

    Software engineer's perspective

    It is like driving on the left side of the street in England or Australia. It is just how they learned so they do it that way. At Bright Inventions we started with AWS so we stuck to it. I do not think that it would make a great technical difference if we used Azure or other cloud services instead of AWS. Looking from a business perspective it does not matter as well.
    Piotr Mionskowski, Head of Technology & Partner @bright inventions
    ### Implementing multi-module apps for Android Multi-module Android development represents a contemporary approach to structuring the architecture of Android applications. Unlike traditional, monolithic codebases, multi-module apps feature separated units of code within distinct modules. This structure enhances clarity, customization, and, consequently, the scalability of your Android solution. If you plan to develop an Android MVP, considering a multi-module solution is advisable. My colleague, an experienced Android developer dives into multi-module apps in another blog post, feel free to check it out: [Multi-Module Android Application – Why You Should Choose It for Your Business.](/blog/multi-module-android-app-why-you-should-choose-it-for-your-business/) ## Example of a successful FemTech MVP launch Read [the story of the app for pregnant women](/projects/pregnancy-app/) that was successfully released as MVP in Germany.
    ![pregnancy app](../../static/images/pregnancy_app_femtech.png "pregnancy app")
    ## What comes after the MVP launch? Launching an MVP in conjunction with a marketing campaign provides the ultimate validation of your idea. If the MVP attracts users, you can proceed with further iterations, gradually adding new features and proactively preparing for scaling. In some instances, the MVP may reveal that the application needs to pivot. Pivots aren’t something new in software development. You can read an inspiring [example of pivots by a HealthTech company – Decorte Future Industries](/blog/the-intriguing-tale-of-decorte-future-industries/). ## JavaScript Types De-Objectified *Published: 2024-12-18 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/javascript-types-deobjectified/index.md* **Some individuals mockingly claim that JavaScript lacks types. While it’s true that we don’t explicitly define types in our code, this doesn’t negate their existence. JavaScript operates as a dynamically typed language, where types are tied to values rather than variables, and are determined at runtime. Within our JavaScript applications, we work with various types of values. This dynamic nature of types often sparks one of the most popular myths in the frontend environment.**
    ![js types de-objectified](/images/blogpost_js_types.png "")
    ## The Myth of Everything as an Object While learning JavaScript, I’ve encountered at least once the phrase: > In JavaScript, everything is an object. I understand why people might say that, but unfortunately, it’s a misleading statement. In the following section of this article, I will provide a comprehensive explanation of this topic. We’ll delve into mechanisms like **Boxing** and explore why some individuals tend to perceive everything as an object. ## Understanding the Reality: A Closer Look at Primitive and Object Types JavaScript comprises two distinct types: [primitive types and object types](https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-ecmascript-language-types). ### Primitive Types Among these, there exist seven primitive types: **string**, **number**, **boolean**, **null**, **undefined**, **symbol**, and **bigint**. It’s crucial to note that none of these are object types, contrary to the myth. However operator **typeof** for null value returns **object** because, in JavaScript's early design, [null was assigned the same internal tag as objects (p.13)](https://dl.acm.org/doi/pdf/10.1145/3386327). This behavior originates from the very first implementation of JavaScript (called **Mocha**) and has remained unchanged since then to maintain compatibility with older code. #### Immutability Primitive types possess unique characteristics such as **immutability**; once assigned, their values cannot be changed directly, although a new value can be assigned to the variable (using **var** or **let** keyword). ``` let age = 30; age = 32; // we assign a new value to the variable "age", we do not change the previous one ``` We can further understand immutability by considering a string value, for instance, and attempting to alter one of its characters: ``` let name = "John" name[2] = "e" console.log(name) // John ``` #### No properties / methods Moreover, it’s important to note that primitive type values **lack methods (functions) and properties**, which can be puzzling. Attempting to access properties like “length” in the snippet below might seem perplexing. We’ll delve deeper into this concept shortly. However, for now, trust me, this code is absolutely correct: ``` let name = "John" console.log(name.length) // ??? ``` ### Object Type The simplest way to define object types is as “**anything that is not a primitive type**”. Arrays and functions are also considered object types. #### Contains properties / methods Objects are complex structures that contain **properties and methods**, defined as key-value pairs. We can access these properties using e.g. dot notation (object.property), as demonstrated below: ``` const person = { name: "Jack", sayHi(){ console.log("Hi!") } }; // object.property person.name // "Jack" // object.method person.sayHi() // "Hi!" ``` Previously, I mentioned that a **string** is a primitive type, yet I also attempted to use it as an object (by accessing the length property with *name.length*). Rest assured, everything will soon become clear. #### Mutability The next characteristic of object values is **mutability**, in contrast to primitive types, which are immutable. This means that we can modify the property values of our objects: ``` const person = { age: 30 } person.age = 31 console.log(person.age) // 31 ``` ## Boxing Now that we have a basic understanding of **objects** and **primitive types**, let’s revisit the **Boxing** mechanism I mentioned earlier. This mechanism explains why I attempted to access a property of a string, even though primitive types don’t have properties. The snippet is correct: ``` let name = "John" console.log(name.length) ``` But how does this work? **Boxing** is an **implicit** **mechanism**, meaning it occurs automatically without direct intervention. It’s responsible for encapsulating our primitive value within the corresponding object for that specific type. This operation is temporary, so we cannot directly access the created object; we can only interact with our primitive value. [When attempting to access properties or methods](https://262.ecma-international.org/10.0/index.html#sec-getv) of a primitive type like a string in JavaScript, the language automatically creates an object wrapper (such as a String object — using [toObject method](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-toobject)) to facilitate this access. For instance, when working with strings, JavaScript generates a String object, which grants access to properties like “length” through its prototype (String.prototype.length). It’s important to note that nearly every object in JavaScript, including representations of primitive types like String, is built upon the Object prototype (Object.prototype). This insight partially supports the concept that “everything in JavaScript is an object”, or more accurately, inherits from the Object type. ``` let name = "John" name.length; // Here new object will be created ``` ## Summary JavaScript’s types are a fundamental aspect of the language and entail complex mechanisms. While this can be confusing for individuals accustomed to statically-typed languages, it’s these intricacies that make JavaScript an incredibly dynamic language. Understanding the distinction between primitive and object types, as well as how they operate under the hood, is crucial for ensuring code predictability and functionality. - - - ##### Take a look at our earlier blog post debunking frontend myths: 1. [To 'b' or Not to 'b': The Semantic Status of HTML 'b' Tag](/blog/semantic-status-of-html-b-tag/) 2. [Understanding the Hoisting Behavior of let and const](/blog/let-const-hoisting/) ## Choosing MVP Tech Stack in 2025. What Startup Founder & CTO Should Know *Published: 2023-09-19 | Author: mateusz | Tags: business, startup, MVP* *Source: https://brightinventions.pl/blog/mvp-tech-stack-what-startup-founder-should-know/index.md* **Selecting a tech stack for your MVP should be a well-thought-out process. Every software product is different, so there isn’t one MVP stack cheat sheet for all of them. Let’s go through the most common decision-making factors while choosing technologies and languages for your digital product. Ultimately, check out the list of a typical tech stack for MVP in 2025.** - - - ## Table of contents [Choose only standardized software & tools](/blog/mvp-tech-stack-what-startup-founder-should-know/#choose-only-standardized-software--tools) [Choose a stack that your development team/MVP agency knows](/blog/mvp-tech-stack-what-startup-founder-should-know/#choose-a-stack-that-your-development-teammvp-agency-knows) [Hybrid or native mobile app? That is the question…](/blog/mvp-tech-stack-what-startup-founder-should-know/#hybrid-or-native-mobile-app-that-is-the-question) [Last but not least – mobile or Progressive Web App (PWA)?](/blog/mvp-tech-stack-what-startup-founder-should-know/#last-but-not-least--mobile-or-progressive-web-app-pwa) [MVP development stack 2025](/blog/mvp-tech-stack-what-startup-founder-should-know/#mvp-development-stack-2025) [Choose MVP stack wisely – book a free consultation](/blog/mvp-tech-stack-what-startup-founder-should-know/#choose-mvp-stack-wisely) - - - ## Choose only standardized software & tools Think twice before you agree to develop your MVP using a niche framework or unpopular programming languages and libraries. It may be a sign of a couple of potential issues in the future. One of the problems is moving the project to the in-house team or another software company. It will be **challenging to find developers and software agencies that are familiar with unpopular stack**. You would be forced to find experts with some very unpopular skills. That brings **extra costs to the table**. What’s more, niche tools and solutions usually **don’t have a community built around them**, so there will be not enough materials and docs that would help developers to faster find solutions for tech issues. As a result, it might slow down the development process. The easiest way to verify the popularity of languages and other tools is by reading the annual [Stack Overflow Developer Survey](https://survey.stackoverflow.co/2023). However, **it doesn’t mean that you should just choose the most popular tools/languages on the market**. Yet ensure that the stack you go with is well-known, with lots of resources and documentation that will support your developers. ## Choose a stack that your development team/MVP agency knows You shouldn't force a tech unknown to your team because it will slow down the MVP process and probably compromise the quality of the software they produce. You should **take developers' voices into account**. They will be working with the stack you eventually approve, so they should have a chance to at least express their opinion and show you why they recommend one tool over another. ## Don’t blindly follow trends. Choose the stack that suits your product When you build an MVP from scratch, there is a **huge temptation to use new trendy solutions**. For example, Apple’s SwiftUI. It is a framework that simplifies work for iOS developers. Yet it cannot be used in every situation as [explains Tomek Lizer](/blog/falling-in-love-with-programming-again-tomek-ios-developer/#if-you-had-to-start-an-ios-project-from-scratch-with-no-technological-debt-what-tools-would-you-use), a Senior iOS Developer at Bright Inventions:

    If it is a solution for a large group of users with a spectrum of Apple devices, then you can’t choose only Swift UI. No matter how trendy it is right now. Yet if the product targets a smaller group of tech-savvy users I would base it on Swift UI. Having in mind that it is still a young technology, you cannot cross off good old UIKit completely.
    Tomasz Lizer, Senior iOS Developer
    So remember to adjust trendy tools to your product and target group. ## Hybrid or native mobile app? That is the question…
    ![Mockups](../../static/images/food_tech_case_study_app.png "Mockups")
    In terms of mobile development, you must first decide whether to **build two separate native apps for iOS and Android or go for a cross-platform product**. The latter means one mobile app dedicated to both app stores. Hybrid apps are usually easier and faster to build and launch as MVPs. They might be the answer for startups with limited budgets. **It can be a reasonable option if you want to launch the MVP and validate your idea quickly**. However, **building a hybrid app means you add another layer to your code**. Having also in mind that **your app will never perform as well as the native one** because you have to make compromises to meet "the expectations of both systems". If you treat your MVP as a cornerstone of your solution, as we recommend, then in the long term, it might bring more problems than solutions to the table. However, as we said, **every MVP is different, so [native vs. hybrid app](/blog/native-app-development-vs-cross-platform/) is a discussion every startup founder or CTO has to conduct**. The outcome should come from a deep analysis of both sites. It’s worth adding that you can always start with one app for one store. **You don’t have to launch apps for iOS and Android at the same time**. That is what Instagram or Clubhouse did. They launched their app first on AppStore. ## Last but not least – mobile or Progressive Web App (PWA)? Maybe you don’t need to start with a mobile app. **There is a chance that at the beginning, you will only need a website that resembles a mobile application called Progressive Web App**. PWA can run on any device with a web browser. Although **some features will be limited compared to mobile apps** (e.g. Bluetooth, less accurate GSP, and no running in the background), PWA might be an option to consider. Especially for startup founders who want to build a simple solution accessible on many devices to quickly verify the idea’s potential. ## MVP development stack 2025 We took into account many factors influencing decision-making. Now it’s time to list the most typical MVP stack in 2025.
    ![MVP tech stack in 2025](../../static/images/blog_post_tech_stack_mvp.png "MVP tech stack in 2025")
    ### Web Development Stack for your MVP **JavaScript/TypeScript, React** Nowadays, JavaScript is your first-to-go language. If your development team or agency uses **TypeScript**, that’s even better because it optimizes the coding process. However, JS and TS will be nothing without the framework. There are several frameworks to consider: **React, Node.js, Angular** and more. **React has traditionally been a primary choice** for professional developers and remains a favorite. However, **Node.js has gained significant ground in 2024**. According to the [Stack Overflow 2024 Survey](https://survey.stackoverflow.co/2024/technology#most-popular-technologies-webframe-prof), almost 42% of developers have recently worked with React, while nearly 41% have worked with Node.js, narrowing the gap considerably. ### Mobile development stack for MVP * **Native app development: Swift (iOS), Kotlin (Android)** * **Hybrid app development: React Native / Flutter** If you go with native app development, then you should use languages recommended by Apple or Android. **Swift** is used for iOS app development and **Kotlin** for Android. If you opt for hybrid development, then you should decide between **React Native or Flutter**. The smartest way might be to choose the one that is more familiar to your development team or MVP agency. ### Cloud development **Amazon Web Services (AWS) / Microsoft Azure / Google Cloud** These are the top 3 cloud providers in the cloud market right now. Choose the one that is best known by your development team or the MVP agency plan to hire. That’s probably going to be AWS because it is the most popular provider based on the StackOverflow Survey. [Nearly 50% of professional developers use AWS](https://survey.stackoverflow.co/2024/technology#worked-with-vs-want-to-work-with-webframe-worked-want-prof). **Node.js, NestJS** **Node.js** is a backend technology that enables for example to build API that communicates with mobile or web. **Nest.js** is a framework for Node.js. ## Choose MVP stack wisely Selecting a programming tech stack is one of the most important decisions at the beginning of your tech startup journey. So do it wisely, with strong collaboration with your development team, whether it is an in-house team or a hired [MVP development agency](/our-areas/mvp-development/). ## Top 5 UI & UX Design Trends in 2025 *Published: 2024-12-12 | Author: aleksandra-zaw | Tags: design* *Source: https://brightinventions.pl/blog/ui-ux-design-trends/index.md* **Presenting the user experience trends shaping 2025 — from pushing the boundaries of minimalism to the real-life implementation of AI in the design process. With 2024 long forgotten, the future of UX design is here! UI and UX enthusiasts, are you ready for these exciting UX design trends?**
    ![UX trends 2025](/images/ux_trends_2025.png "UX trends 2025")
    ## Typography is the new 2025 UI storyteller In 2025, **minimalism will reach new extremes, with typography taking center stage**. Expect even more white space and creative typography: combining various fonts and basing the entire UI around the text. In some cases, typography might even overshadow illustrations, photos, and videos. **Typography is becoming self-sufficient content**. It's no longer just about providing information — now it's in charge of the entire storytelling process. **Check out examples of brands that are not afraid to put typography in the center:** [Festival Figuré.e #4](https://www.edition4.figure-e.com/)
    ![Festival Figuré](/images/festival_figure.png "UX trend: typography")
    [Motto branding agency](https://wearemotto.com/?ref=godly)
    ![Motto branding agency](/images/motto.png "Motto branding agency")
    ## Big jump into design motion Don’t expect a crazy UX rollercoaster on the UI front. Yes, there will be an even bigger push for motion and dynamic elements on websites and applications, but it means that **even more “conservative” brands will adopt motion** to show that their websites are breathing with full lungs (virtually, at least). **Microinteractions** **are at the center of this trend** — those little tweaks, jumps, and other design elements that help create a user-centered experience. What’s fascinating about it is **how perfectly it aligns with minimalism**. Just check it out for yourself! **Get inspired to design in motion with these websites:** [Mitchell Eaton, purposeful motion designer](https://mitchelleaton.com/)
    ![Mitchell Eaton](/images/mitchell_eaton.png "Mitchell Eaton")
    [Superpower healthcare platform](https://superpower.com/)
    ![Superpower](/images/superpower.png "Superpower")
    ## Throwing away top UX conventions Some websites will embrace this trend, primarily **those representing artistic brands that dare to venture into more extreme UI territories**. UX/UI designers working with these brands will officially toss aside the [“Don’t Make Me Think”](https://brightinventions.pl/blog/5-web-development-rules-from-dont-make-me-think-book/) rules, f**ocusing on one goal: surprising the user**. Forget template interfaces, UX best practices, and past design trends — **every means to an end is allowed**, even if that “end” results in a user interface that isn’t entirely clear. Keep in mind, though, that this UX trend isn’t for every UX designer. **Only edgy, artistic brands can afford to have fun with UI** and play a dangerous game with their users like that. The late months of 2025 will reveal whether these design decisions truly pay off. [Simmonds Ltd, an art direction studio](https://www.simmondsltd.com/)
    ![Simmonds](/images/simmonds_update.png "Simmonds")
    [Church, film editors congregation](https://edit.church/)
    ![Church, film editors congregation](/images/church.png "Church, film editors congregation")
    ## AI-Powered workflow management Naturally, there’s no escaping AI. Product designers will increasingly rely on artificial intelligence to support their daily work. This means the natural growth of AI plugins, and AI features in design tools. ### Figma AI plugins Plugins have always been a collaborative powerhouse in Figma, so we want to showcase some examples of plugins that are becoming essential in the daily workflow of product designers. **Examples of Figma AI plugging worth trying:** * **[Content Reel](https://www.figma.com/community/plugin/731627216655469013/content-reel)** Content Reel streamlines your design workflow by providing dynamic placeholder content. It allows you to quickly insert text, avatars, icons, and other elements directly into your designs. With customizable options and a simple interface, Content Reel helps designers maintain realistic mockups without spending time searching for filler content. * [Batch Styler](https://www.figma.com/community/plugin/818203235789864127/batch-styler) It allows you to apply and manage styles in bulk across your design projects. Whether you're working with text, colors, or effects, Batch Styler simplifies the process by letting you update multiple elements simultaneously. ### AI-powered wireframes At this moment, **AI is not yet capable of generating fully functional wireframes from scratch, but that could change in the coming months**. Additionally, copyright laws still need to catch up to clarify whether AI-generated wireframes can be used commercially without legal concerns. Despite these limitations, **AI-generated wireframes offer several benefits**. They can help **overcome the fear of a blank page**, providing product designers with a starting template to build upon. These wireframes also serve as **valuable tools for early-stage product testing**, making the creation of initial designs more cost-effective and efficient. **Check out an example of an AI-powered wireframe of a live sports score application:**
    ![AI-powered wireframe Figma](/images/ai_wireframe.png "AI-powered wireframe Figma")
    AI wireframes definitely have potential, but it’s still hard to say if we should be excited about that. Why? **AI-powered wireframes often tend to look too similar**. Do we really want all our websites and software products to share the same generic UI? We would still put our money on personalization. ### Figma's AI Features Beyond plugins, Figma offers built-in AI-powered features that streamline workflows. These tools help you save time and effort in various ways. **You can generate images, search for similar components across all your Figma pages, translate content, and more**. As we move into 2025, Figma is likely to introduce even more of these small yet powerful enhancements, making design faster than ever.
    ![Figma AI features](/images/figma_features.png "Figma AI features")
    ### AI for UX writing How often do you find yourself ready to dive into design, only to be stuck waiting for the copy? Soon, that frustration might be a thing of the past. AI is set to play a pivotal role in crafting copy for user interfaces. While still supervised by UX writers, it can generate text for multiple screens of applications or websites, ensuring consistency across the board. ## Gamification: an even bigger UX trend in 2025 User engagement through **gamification is well-known, especially in industries like sports and fitness technology or educational platforms**. Duolingo is a prime example. But what about other industries? Should they incorporate gamification into their design processes? Absolutely — product designers will need to do it! Gamification is a powerful tool to **personalize user experiences** and shape them in ways that build long-lasting bonds with users. **Examples of apps boldly embracing gamification:** [Plant Nanny](https://play.google.com/store/apps/details?id=com.fourdesire.plantnanny2&hl=en) A unique app that encourages users to stay hydrated by combining health tracking with gamification. Every glass of water you drink helps nurture and grow a virtual plant in the app. The plants thrive as you meet your hydration goals, offering a fun and visual incentive to maintain healthy habits. [Fortune City](https://sparkful.app/fortune-city) A creative finance management app that uses gamification to make budgeting fun and engaging. As you track your expenses, the app builds a thriving virtual city based on your financial habits. ## Are you excited about 2025 predictions? We are! 2025, don’t you dare bore us. 😎 ## The Ultimate Guide to HealthTech in 2025 *Published: 2024-02-01 | Author: izabela | Tags: HealthTech, design, AI* *Source: https://brightinventions.pl/blog/ultimate-guide-to-healthtech/index.md* **HealthTech, eHealth, Medtech, FemTech… whatever you call it, the connection between healthcare and technology has never been stronger. If you want to delve into the promising world of HealthTech, this guide is for you!**
    ![HealthTech guide](../../static/images/healthtech-guide.png "HealthTech guide")
    ## HealthTech and MedTech – recognizing the difference MedTech and Health Tech aren’t synonyms. This guide will focus mostly on HealthTech, still, it’s essential to understand the difference between these terms. ### HealthTech definition HealthTech (known as eHealth as well) is **the implementation of technology to improve healthcare delivery and [patient engagement](/blog/delivering-patient-engagement-platform/)**. It includes telemedicine, wearable health devices, and electronic health records, aiming to make healthcare more accessible and personalized. ### MedTech definition MedTech relates more to **medical devices** and diagnostic equipment used in healthcare. This includes pacemakers, MRI machines, and surgical tools, focusing on enhancing the quality of medical treatments and diagnostics. **MedTech companies must comply with various standards, such as ISO 13485**, which specifies requirements for a quality management system specific to the medical device industry. ## Areas of HealthTech with examples Explore some of the areas of HealthTech that are shaping modern healthcare. ### AI medical imaging A technology that uses artificial intelligence to enhance medical imaging processes, such as interpreting X-rays, MRIs, and CT scans, leading to faster and more accurate diagnoses. ### AI Chatbots AI-powered chatbots are interactive software applications that use artificial intelligence, particularly natural language processing, to understand and respond to human inquiries, providing information or assistance in various domains including customer service and healthcare. ### AI diagnostic The use of artificial intelligence in medical diagnostics involves AI algorithms analyzing medical data (like images, lab results, and clinical history) to assist in diagnosing diseases and conditions more accurately and efficiently. ### FemTech Technology focused on women's health, including reproductive health, menstrual cycle tracking, fertility solutions, and maternal healthcare. We cover FemTech in various resources: * Explore the diverse [world of FemTech with all its areas and innovators](/blog/femtech-key-areas-and-companies/). * Read more about [developing a successful FemTech solution](/blog/keys-to-succeed-in-femtech/). * Learn [how to build a successful FemTech MVP](/blog/building-mvp-for-femtech/). * Check an example of successful MVP launch of a [mobile app for pregnant women](/projects/pregnancy-app/).
    ![pregnant women](../../static/images/pregnant_women.png "pregnant women")
    ### Telemedicine / Telehealth Remote delivery of healthcare services, such as consultations and diagnoses, through telecommunications technology, often involving video conferencing: * **Remote Patient Monitoring (Remote Medical Care)** Technology that enables monitoring of patients outside of conventional clinical settings, such as in the home, using various devices to collect medical and health data. A crucial part of telemedicine is video consultations with physicians. Delve into a subject of [choosing the right video conferencing tool for healthcare](/blog/telehealth-video-conferencing-software/). ### Mental Health Tech Digital solutions aimed at improving mental health, such as: * **WebTherapy** Online therapy platforms offer mental health support through digital platforms, including video calls, messaging, and web-based treatment programs. Get inspired by the story of [Circles - an online group support platform](/projects/online-group-support/). * **Mental fitness apps & Mood tracking apps** Mobile applications designed to enhance mental well-being, often including activities like meditation, cognitive exercises, and stress management techniques. * **Digital Detox** Tools and programs that encourage reducing screen time and digital connectivity to improve mental and physical health. ### mHealth (mobile health) It refers to the practice of using mobile devices (smartphones, tablets) for health services and information, including health monitoring and patient education. ### Precision Medicine An approach to patient care that considers individual variability in genes, environment, and lifestyle to tailor treatments and interventions. ### Biohacking The practice of using technology and biology in tandem to optimize health, well-being, and physical and mental performance, often involves DIY biology and self-experimentation. ### Patient Engagement Apps Digital applications that aim to involve patients more actively in their healthcare, including tools for health tracking, appointment scheduling, and accessing medical information. It’s especially crucial in chronic disease management. Explore the [patient engagement app for Parkinson's patients](/projects/solution-for-parkinsons-patients/). Read more about developing patient engagement solutions: [How to Build Patient Engagement Technology that Will Truly Engage Patients.](/blog/delivering-patient-engagement-platform/) ### Techbio An emerging field at the intersection of technology and biology, focusing on using technological advancements to understand and engineer biological systems, often related to health and medicine. ## Innovations that will drive healthcare Technology has the power to change the daily lives of patients and medical staff in countless ways. We've listed the technologies that every HealthTech startup and enterprise should (at least) consider implementing. If you want to know what’s especially hot in tech for healthcare, read [Top Trends in HealthTech to Watch in 2025](/blog/top-trends-in-healthtech/)! ### Generative AI & Large Language Models Artificial intelligence enables us to learn from available content to produce new text, images, and other data. It gives lots of use cases for HealthTech: * supporting specialists in tracing tumors in medical imaging; * generating human-like text for clinical notes and healthcare documentation; * creating medical transcriptions; * virtual healthcare assistants (chatbots) streamline processes like appointment scheduling; * preventing care by analyzing data from wearables and detecting issues like high blood pressure, concerning EGG patterns, arrhythmias, and more. Read more about [Large Language Models (LLMs) for Healthcare](/blog/llms-healthcare-security/). Also, explore ai buzzwords and [understand the difference: Generative AI, Conversational AI, LLMs & SLMs](/blog/ai-buzzwords-definitions/).
    ![AI buzzwords](../../static/images/ai_buzzwords_landscape.png "AI buzzwords")
    ### Internet of Things & Bluetooth The Internet of Things (IoT) in healthcare refers to the network of medical devices and applications that communicate and exchange data due to an Internet and bluetooth connection. How IoT enhances healthcare: * enables patients to manage their condition by enabling real-time health monitoring, * helps doctors remotely monitor patients' condition 24 hours a day; * limits the costs of face-to-face examination; * provides analytics for disease prevention; * seamless data sharing among healthcare providers. Read an actual story of British startup offering remote patient monitoring with the [IoT system combined with certified bluetooth devices](/projects/remote-patient-monitoring/). ### Medical devices and wearables Devices that we have seen at doctors' offices – thanks to Bluetooth connections and dedicated applications – have turned into smart devices that have the power to save patients' lives daily. Pulse oximeters, Bluetooth thermometers, or stethoscopes are only examples of Bluetooth devices that are transforming healthcare. Now they can be used by patients at home to monitor their condition remotely. Delve into [bluetooth devices that have the power to change healthcare](/blog/bluetooth-devices-that-change-healthcare/).
    ![smartwatch](../../static/images/healthcare_wearable_devices.png "smartwatch")
    ## Compliance and certifications Managing medical data requires adherence to various local regulations. Compliance with legal and security standards is a crucial aspect of [risk management in healthcare](/blog/risk-management-in-healthcare/). Read our latest blog post to learn more. Here are examples of local laws to follow if you launch a product in that area or store patient data in that region/country. ### GDPR (EU) HealthTech companies operating within the European Union must adhere to the General Data Protection Regulation (GDPR), which sets high standards for the handling and protection of personal data, especially health-related data. ### NIS2 (EU) European Network and Information Security directive (NIS2) aims to achieve a higher level of cybersecurity for network and information systems in companies and organizations across EU. The deadline for EU Member States to transpose the NIS2 Directive into national law is 17 October 2024, and the laws must take effect from 18 October 2024. ### HIPAA (USA) The Health Insurance Portability and Accountability Act (HIPAA) is a United States law. The law sets standards for the protection of health information, ensuring that personal health data is properly handled by various entities, including healthcare providers, insurance companies, and their business associates. ### PIPEDA (Canada) The Personal Information Protection and Electronic Documents Act (PIPEDA) is a Canadian federal privacy law that governs how private sector organizations collect, use, and disclose personal information in the course of commercial business. It sets out principles for the protection of personal information, emphasizing consent, limited collection, accuracy, and accountability by organizations. ### GDPR (UK) Similar to the EU GDPR, the UK GDPR regulates the processing of personal data. It mandates data protection principles like data minimization, accuracy, and security. It also requires obtaining explicit consent for processing personal data and implementing data protection measures, including data encryption and breach notification. Read more about [security in healthcare](/blog/cyber-security-in-healthcare/), which is a crucial aspect of compliance with local laws. ## UX Design in HealthTech HealthTech and MedTech applications are usually comprehensive, massive systems dealing with tons of information. Patient's health history, prescribed medicine, vital sign metrics – all of this data is important for healthcare providers and must be well-designed in any system aiming to help them care for patients. That's why there are a few best practices for designing apps for healthcare: * **Data Management**: The design must effectively manage and display large amounts of information in an accessible manner. * **Information Prioritization**: Essential information should be prioritized and easily accessible, preferably on the main screen. * **Iconography**: Use of intuitive icons that convey information quickly and effectively. * **Color Coding**: Employ color coding to differentiate and highlight important data and functions. * **Functional Aesthetics**: The design should focus on functionality over aesthetics, meeting the practical needs of healthcare professionals. Fancy going deeper into product design for healthcare? Explore [UX design best practices in healthcare with a case study](/blog/ux-design-healthcare-medical-apps-case-study/).
    ![ux design for healthcare apps](../../static/images/design_for_ehealth_app_web_mockup.png "ux design for healthcare apps")
    ## eHealth companies worth watching If you want to look closely at some companies that are changing custom [healthcare software development](/our-areas/healthcare-software-development/), we listed some startups and larger organizations that are worth watching! **TeleHealth companies to watch**: [Camascope](https://www.camascope.com/), [MedKitDoc](https://medkitdoc.de/en), [Maven](https://www.mavenclinic.com/). **Medical Imaging AI companies**: [ContextVision](https://www.contextvision.com/), [Enlitic](https://enlitic.com/). **Online Support and Web Therapy Platforms**: [Circles](https://brightinventions.pl/projects/online-group-support/), [BetterHealth](https://www.betterhelp.com/), [TeenConsulting](https://www.teencounseling.com/), [Ritual](https://www.heyritual.com/). **AI-Powered Chatbots for Mental Health**: [Weabot Health](https://woebothealth.com/), [Limbic](https://limbic.ai/), [Ebb by Headspace.](https://www.headspace.com/ai-mental-health-companion) **AI in disease diagnostics companies to watch**: [Decorte Future Industries](https://decorte.co.uk/), [iCAD](https://www.icadmed.com/), [Emory University](https://medicalxpress.com/news/2023-08-ai-enables-earlier-diabetes-chest.html), [Eyenuk](https://www.eyenuk.com/en/), [AinnovaTech](https://www.ainnovatech.com/), [Cleerly](https://cleerlyhealth.com/), [AI Dermatologist](https://ai-derm.com/), [SkinVision.](https://www.skinvision.com/pl/) **Mindfulness and Relaxation Apps**: [HeadSpace](https://www.headspace.com/), [Calm](https://www.calm.com/), [Buddhify](https://buddhify.com/), [Aura.](https://www.aurahealth.io/) **Apps for Crisis Intervention**: [Suicide Safe](https://play.google.com/store/apps/details?id=gov.hhs.samhsa.app.spa&hl=en&gl=US), [Weabot Health.](https://woebothealth.com/) **Digital Detox Apps**: [ForestApp](https://www.forestapp.cc/), [Flipd.](https://www.flipdapp.co/) ## Fancy more HealthTech content? Get inspired by te best experts, resources and speakers in HealthTech industry: [Top Newsletters about Digital Health](/blog/top-newsletters-digital-health-healthtech/) [Top HealthTech Conferences to Attend in Europe in 2025](/blog/healthtech-conferences-europe/) [Top HealthTech Conferences to Attend in the USA in 2025](/blog/healthtech-conferences-usa/) [Top FemTech Conferences and Meetups in 2025](/blog/femtech-conferences-meetups/) ## Which hat should I wear today? How to make your team meetings more effective *Published: 2020-07-20 | Author: ula | Tags: brainstorming, leadership, teamwork* *Source: https://brightinventions.pl/blog/which-hat-should-i-wear-today-how-to-make-your-meetings-and-brainstorming-sessions-more-effective/index.md* There are[ lots of efficient brainstorming techniques for teams](https://www.wework.com/ideas/worklife/effective-brainstorming-techniques) such as visualisation-based method, step-ladder technique, mind mapping, rapid ideation and many others. All of them can create a large space from which to pull the best ideas and make your meetings successful, but today I would like to focus on one method that I have found really meaningful and effective - *The Six Thinking Hats* method by de Bono. I heard about [Edward de Bono](https://www.edwddebono.com/) a few years ago, but it wasn’t sooner than last year that I decided to dive into his thinking method for the first time. de Bono showed me what the effective thinking process may look like and how to make it more creative than ever. **His method prevents our minds from jumping directly to conclusions. Instead it guides us, lets us consider multiple options, and provides a sense of hope and freedom.** *The Six Thinking Hats* method gives a kind of instruction on how to request a certain type of thinking while seeking for a solution to our problem. The method can make a futile argument into a fruitful discussion. Typically, we tend to agree when someone shares our thoughts, and disagree when they don't, which often leads to conflicts, and the whole communication to stop. While using de Bono’s technique we have to take a particular stand in each stage of thinking process and get rid of emotional way of proving our case while still being able to express our emotions. **de Bono assumes that we are all capable to see different perspectives and he compares that to wearing different hats. We can put on one hat and take off another. We do not identify with hats themselves.** Each hat gives us just a different perspective on the problem we are discussing. All six hats have different colours and each colour presents a different perspective. Below I will try to give you a brief description of each of them. ## **WHITE HAT** While “wearing” a white thinking hat we should **collect neutral information and analyse the gathered data to reach a fact-based solution.** de Bono even says that when wearing the white hat thinkers imitate a computer which gives facts and figures when it asked. We use only precise data, number or reports. We have to find gaps and look for ways to fill them with appropriate information. **We have to be neutral and objective - white colour here identifies neutrality.** During meetings or brainstorm sessions you may wear a white hat or just ask someone else to put it on or take it off. You may find the following questions useful: *What do we know about this issue?* *What don’t we know about this issue?* *What can we learn from this situation?* *What information do we need to solve this problem?* *Are there potential existing solutions that we can use to solve this problem?* ## **RED HAT** The red hat is responsible for emotional thinking, feelings and a subjective perception. The red hat allows emotions to dominate. We should wear the red hat when we want our reactions flow freely and easily. **The red hat’s primary goal is to bring to the table ideas intuitively on the basis of personal feelings and hunches.** The red hat is very open-minded and seeks to identify and clarify other people’s feelings. It provides us with a convenient way to switch on or switch off our emotional mode in a way which is acceptable for the rest of the group. We do not have to justify our feelings or look for any logical assumptions. The questions that may help you think more effectively from a red hat’s perspective are: *What is my gut telling me about this solution?* *What are my feelings telling me about the choice I am about to make?* *Based on my feelings, is there a better way to go about this?* *Intuitively, is this the right solution to this problem?* ## **BLACK HAT** The black hat is used to expose flaws, potential weaknesses as well as dangers. The black hat according to de Bono is used by us the most often. **It is the hat of caution and carefulness.** It is essential to keep you from jumping headfirst into a possible disaster. **Sometimes the black hat is called a logical pessimist.** When putting on the black hat our goal is to be skeptical and focused on risks. It helps us decrease the chances of making a poor decision, but it shouldn’t prevent us from finding a good solution. It just allows us to use our critical ability to the fullest. Some black hat’s questions are: *Why something may not work?* *What are the risks?* *What are potential problems?* *How will people react?* *Will it be acceptable?* ## **YELLOW HAT** The yellow “thinking” hat is the opposite of the black hat. It helps to counterbalance the judgmental thinking of the pessimistic black hat and focuses on positive aspects of solutions. **While wearing the yellow hat we should turn on our insatiable curiosity and optimism.** It is the moment when we are real entrepreneurs who can see benefits that other people can’t. We can use our logic and experience, but we don’t have to resign from our dreams and hope. **We think positively about possible solutions and it motivates us to be more and more constructive.** The yellow hat thinker is about with positive assessment and making things happen. Effectiveness is the goal of yellow hat thinking. *How can I best approach this problem?* *How can I logically and realistically make this work?* *What positive outcomes could result from this action?* *What are the long-term benefits of this action?* ## **GREEN HAT** The green hat is the energy hat. Under the green hat we put forward new ideas. It encourages us to be even more creative. Our goal is to find new fresh solutions. It doesn’t have to involve logical thinking, the vital part is just the process of continual new concepts. **Let yourself have insane nonstandard ideas.** Sky is the limit. **The green hat is definitely the most creative part off the whole de Bono process. It produces loads of ideas and possibilities.** Sometimes you may even not have enough time to consider them all. With the green hat we demand an effort, we demand time for generating new ideas. *Where does it take me?* *How can we make it work?* *What are the alternatives?* *Can we do this in a different way?* *Is there any other explanations?* ## **BLUE HAT** The last but not least - the blue “thinking” hat. de Bono compares the blue hat to the orchestra conductor who makes sure that all the musicians do their best and everything what should be done is done at the right time. **The blue hat takes case of the purpose of a meeting.** If you are wearing the blue hat, you are an observer, a leader, a facilitator who keeps the discipline and checks if people stick to the relevant issues. **The blue hat thinker can comments on what other people observe and every now an then give an overview of what has been happening and what has been achieved.** While wearing the blue hat you control the thinking process and organise the thinking itself. You define the problem and determine the tasks which should be carried out through the discussion. *What is the main idea?* *What is the problem?* *What is your conclusion?* *What do we need to solve the problem?* *What should be our next step?* *What will we do next?* *What have we found out so far?* *The Six Thinking Hats* method helps explore the meeting's subject fully. It gives us a kind of roadmap that we can follow while searching for a solution. If there are different views and perspectives, we have the blue hat whose role is to lay out what is possible and not possible to make a final decision. The blue hat thinker defines a focus i.e the main task of your thinking session. **All people involved in the session go through the same process to make the final decision - they go through facts (white hat), feelings (red hat), pros (yellow hat), cons (black hat), new ideas (green hat).** We deal with each of these separately with no need for justification. de Bono’s method by the usage of hats simplifies the whole decision-making process and makes it more accessible and effective to everyone. The method is not only simple to understand, but also simple to use. If you find the method useful or just interesting, feel free to read on and check the links below with some practical examples: [https://www.storyboardthat.com/articles/b/six-thinking-hats-examples](https://www.storyboardthat.com/articles/b/six-thinking-hats-examples) [https://www.mindtools.com/pages/article/newTED_07.html](https://www.mindtools.com/pages/article/newTED_07.html) [https://study.com/academy/lesson/de-bonos-six-thinking-hats-summary-examples.html](https://study.com/academy/lesson/de-bonos-six-thinking-hats-summary-examples.html) Here you can find other effective brainstorming techniques that you can easily apply in your team meetings: [https://business.tutsplus.com/articles/top-brainstorming-techniques--cms-27181](https://business.tutsplus.com/articles/top-brainstorming-techniques--cms-27181) [https://blog.hubspot.com/marketing/creative-exercises-better-than-brainstorming](https://blog.hubspot.com/marketing/creative-exercises-better-than-brainstorming) To ensure everyone in the meeting understands its purpose, it's helpful to have a clear roadmap to guide the discussion. The roadmap you choose will depend on your goals, your team, and the desired outcome. Team meetings can be both enjoyable and productive—just remember to embrace the process of thinking and brainstorming. There’s nothing more powerful than seeing a group of people actively generating new ideas, eager to grow and enhance their critical thinking skills. ## A Product Designer Shaped by Architecture: Ola's Career Journey *Published: 2024-12-09 | Author: aleksandra-zaw | Tags: bright insights* *Source: https://brightinventions.pl/blog/architect-product-designer-career-story/index.md* **Ola decided it was time for a career change and made the pivot from architecture to product design. Explore her career journey, her decision to live in Porto, and her holistic approach to application redesign.**
    ![Career story product designer](/images/brightstoryolagrid.png "Career story product designer")
    ## How did you come to live in Porto? I spent some time in Spain during college and really enjoyed their relaxed attitude towards life. After graduating, **I had the opportunity to do an internship abroad through the Erasmus program, so I decided to explore Portugal this time**. I love Porto! Even though I’ve been living here for over three years, **I still discover new and interesting spots**. I never get bored – every day, I’m amazed by something new I find. ## What do you appreciate about living in Portugal, and what don’t you like? As I mentioned, I love the views and the fact that Porto has a lot of greenery, even in the city center where I live. **I grew up in a small town where my house was surrounded by forests and greenery, so Porto seems familiar and comforting**. Even though Porto is a relatively big city, it still feels like a small town.
    ![Strolling around Porto.](/images/ola_porto.png "Strolling around Porto.")
    Strolling around Porto.
    What I don’t like is the winter here. For people from Poland, it’s hard to understand how cold it can be. **Even though the temperature might seem mild – around 15 degrees Celsius – it’s the same temperature inside the buildings because there’s no central heating**. In Poland, we go from the cold outdoors to warm, heated apartments. Here, it feels very cold indoors, but thankfully the winter only lasts about three months. ## Is there a particular Polish dish you miss the most? The first thing that comes to mind is **pierogies**, though I’m not sure why – there’s actually a Slavic store nearby where I can buy them. But there’s one dish I really miss, and it’s **Hungarian potato pancake with goulash**. It's something I always eat when I'm back home in Poland. Despite the name, it’s actually a very popular Polish dish. Oh, and I also miss **chicken soup**! The chicken soup I’ve found in Porto doesn’t even come close to Polish chicken soup, which is really disappointing – especially when I want something comforting while I’m sick. ## You made a pivot from architecture to product design. Tell us more about it. After graduating with my Master's degree, **I went to Porto for an architecture internship, which turned into a full-time job**. I spent two years there. **After some time I felt that I needed a change**. One of the reasons was that I wanted a job that would give me the opportunity for hybrid work, but as an architect, that wasn't possible – you spend lots of time in the office and at construction sites. Then **I thought that product design was connected to my current experience**, and it could give me a chance to work from home. I was so happy to have a clear purpose. I meet many people who talk about changing industries but don't have any clue what they would like to do. ## Is architecture similar to product design in some regard? Some might think it's a stretch, but I believe that architecture and product design have a lot in common. **The systematic aspects of my profession and the fact that you always have to consider the people who will live in the buildings you design** – their comfort and needs – seem very similar to product design, where **users are also at the center**.
    ![Quote](/images/ola_quote_architecture.png "Quote")
    This connection was another reason for my career pivot. **I decided to leave my architecture job to dedicate my time to learning and taking courses**, and after a year, I secured a position in product design. During that time, **I was earning money as a tourist guide in Porto**, and I'll tell you that I earned more from tips than from my architecture job. It's not the best-paying industry, unfortunately.
    ![Free walking tour](/images/ola_tourist_guide.png "Ola, while guiding a free walking tour.")
    Ola, while guiding a free walking tour.
    **Being a guide helped me overcome a huge fear of mine: public speaking**. I was always terrified whenever I had to give a presentation. Exploring Porto with strangers and telling them about the city's architecture finally helped me overcome that fear. ## What is it like to work for a Polish company while living in Porto? How often do you visit the office in Gdańsk? **I try to visit the office every three months when we have a team retreat**. As soon as the event dates are announced, I immediately book my plane tickets. I enjoy working remotely, but at the same time, I value in-person interaction with my coworkers. I’ve noticed that at Bright Inventions, people often meet up after work, and I’d love to join those gatherings more often.
    ![Bright Inventions’ office](/images/ola_team_office.png "At the Bright Inventions’ office in Gdansk.")
    At the Bright Inventions’ office in Gdansk.
    ## You’ve been working on an application redesign for one of our clients. Can you tell us a little about the process? The plan wasn’t just to redesign the application but to **completely refresh the image of this particular startup**. The goal was to update the branding to align with current trends while **prioritizing a simpler and more intuitive experience for users**. The aesthetic aspect was secondary to usability. I started by creating a comprehensive brand guide with a holistic approach. This included **everything from the color palette and fonts to the entire visual identity of the brand**. Once that was established, I could shift my focus to **updating the app screens**.
    ![Quote on gamification](/images/ola_quote_gamification.png "Quote on gamification")
    One of the most interesting challenges was **incorporating gamification into the app**. Gamification is usually associated with fitness or educational apps, but this app falls outside of those categories. It was exciting to build a gamification system for an industry that doesn’t have many benchmarks for this kind of feature. The programmers will soon begin implementing the new design, and **I’m excited for users to experience not just the updated app but the refreshed brand as a whole**. ## What do you do after hours? **My hobby is trying new hobbies**! I make it a point to try something new at least once a month. Right now, I’m into **aerial yoga**. I always thought yoga might be too calm for me, but aerial yoga takes things to a whole new level – literally and metaphorically. You have to work on pivots and turnovers, so there’s no time for boredom. Apart from that, I **go to the gym** five times a week. I also love cooking, but that doesn’t necessarily mean I enjoy making everyday dinners. **I love experimenting and exploring in the kitchen**. And of course, **I love traveling** – though I guess that’s a common passion! I’m about to go on a trip of a lifetime to Asia, where I’ll visit India, Thailand, and Indonesia. I’m really looking forward to it! ## Conquering eHealth Bottlenecks: Insights from Aahuti Rai at HLTH Europe *Published: 2024-12-04 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/ehealth-bottlenecks-interview-aahuti-rai/index.md* **The HLTH Europe Conference in Amsterdam brought together some of the most innovative minds in digital health. Among them was [Aahuti Rai](https://www.linkedin.com/in/aahutirai/) - an inspiring figure working at the intersection of technology and healthcare transformation. Check out the interview exploring her journey, insights, and perspectives on the state and future of digital health.**
    ![Aahuti Rai](/images/screenshot-2024-12-06-at-11.14.26.png "Aahuti Rai at the HLTH conference")
    *[source: Aahuti Rai LI page](https://www.linkedin.com/posts/aahutirai_photos-from-hlth-europe-24-activity-7209819934971858944-jRr6?utm_source=share&utm_medium=member_desktop)* ## **Could you briefly describe yourself and your role?** I'm based in the UK but work across Europe. **I would describe my role as a connector in the digital health space.** Tangibly, I do advisory work, act as a venture partner with an impact fund, and hold several advisory roles in the ecosystem. I focus on supporting important collaborations and projects. For example, last year, I was part of a women’s health community in Basel, contributing to ideation and concept work. My daily work involves advising startups and scale-ups on commercialization, patient engagement, clinical acceptance, and adoption, alongside my investment activities. ## **What inspired you to enter the digital health field?** My background spans over 20 years across 14 industry sectors, including healthcare and life sciences. Initially, my work was sector-agnostic, running my own innovation consulting firm that helped clients like eBay, Amazon, and Specsavers leverage technology for large-scale transformation.\ **Healthcare has always been a passion of mine.** As I reached midlife, I began reflecting on focusing all my energy on healthcare, the sector I care about most. With support from my family, I stepped away from my consultancy business and dedicated a year to pro bono work in healthcare to determine where I could deliver the most value. By the end of that year, I realized the startup space was driving true innovation. This was pre-COVID, and while I knew the challenges of working with large public and private sector organizations, I saw the opportunity to make a difference. The decision wasn’t easy, but I’m glad I made it. There are significant bottlenecks and challenges in healthcare, but being part of solving those problems—building the road as we go—is deeply gratifying.
    ![aahuti_rai](/images/baner_aahuti-1-.png "")
    ## **What are the biggest tech challenges in digital health today?** The challenges aren’t so much in the technology itself; there’s been an incredible convergence of advancements. **The issue lies in healthcare’s readiness to adopt and implement these technologies.** The startup sector is often at the cutting edge, but healthcare remains entrenched in traditional systems, with silos, paper-based processes, and outdated tools like fax machines. **Technology offers transformative solutions, but culture change takes time.** COVID accelerated progress and funding, but the pace of technological innovation often outstrips the ability to shift mindsets, reconfigure care models, and engage stakeholders. For example, in systems like the NHS, managing resources and transforming care delivery is a massive challenge. ## What trends in digital health excite you the most? I’m less excited about specific technologies and more about their potential impact. **What excites me is how these tools can address overlooked areas of healthcare, tackle inequities, and improve understanding of previously neglected conditions or populations.** For instance, at this conference, someone showcased a[ device for rape prevention, providing immediate evidence of assault](https://www.linkedin.com/company/myenough/). It’s groundbreaking work that no large company or government is prioritizing. I’m also passionate about leveraging digital health and AI to close gaps in healthcare access and understanding. Startups excel at addressing these areas without immediate financial incentives, and that’s where the real innovation happens.
    ![hlth_conference](/images/frame-2608395-3-.png "")
    ## What are your impressions of the HLTH Europe Conference? The conference has been incredible. The quality of networking and the carefully curated topics and speakers are commendable. The organizers have clearly worked hard to bring the right people into this space. While there were some teething issues, which is expected for a conference of this size, the content, energy, and connections have been invaluable. It’s been an intense and exhausting experience, but also rewarding. I’d love to return next year. ## Thank you for this insightful conversation. I hope you get some well-deserved rest. Thank you! It’s been a pleasure speaking with you. ## Understanding the Hoisting Behavior of let and const *Published: 2024-11-26 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/let-const-hoisting/index.md* **[Following our discussion on Frontend gotchas](/blog/semantic-status-of-html-b-tag/) let’s delve into JavaScript's intricate behavior: hoisting. I’ll be shedding light on a prevalent myth surrounding this mechanism, particularly associated with the “let” and “const” keywords.**
    ![Understanding the Hoisting Behavior of let and const blogpost banner](/images/blogpost_let_const_hoisting.png "")
    ## **The myth: let and const are not hoisted** > **Hoisting** is a mechanism that relocates **variables declarations** (those declared using the “**var**” keyword) and **function declarations** to the top of their respective scope within the code. The traditional definition of **hoisting** often focuses on variables declared with the **var** keyword and **[functions declarations](https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#prod-HoistableDeclaration)** (entire function, including its body, is hoisted), leaving out the behavior of variables/constants declared using **let** and **const** (alongside various other JavaScript features like **classes**, although we’ll concentrate on variables/constants for clarity). This omission can lead to a misconception about hoisting. While it’s true that the hoisting mechanism isn’t experienced in the same way with **let** and **const** it doesn’t imply that it doesn’t exist for them. There’s a *grain of truth* behind this myth, highlighting a nuanced aspect of hoisting for these declarations. ### Is hoisting even real? It's important to emphasize that this **relocation** isn't a literal process. Instead, it acts as a mental model that helps us grasp how the **JavaScript engine** operates **before code execution**, particularly regarding variable and function declarations and their **memory allocation**. ## The truth behind hosting of let and const Within JavaScript, in tandem with variable hoisting, an auxiliary mechanism comes into play when a variable is declared using **var**. This mechanism, according to [ECMAScript docs](https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-variable-statement), in adherence to hoisting principles, **initializes** the variable with an **undefined** value: > A var statement declares variables that are scoped to the running execution context's VariableEnvironment. Var variables are created when their containing Environment Record is instantiated and are initialized to undefined when created Consequently, this initialization permits the utilization of the variable without triggering any errors. ``` console.log(a) // here we can access "a" variable var a = "abc"; // Console: undefined ``` ### Declaration and initialization Before we unravel the truth behind a common myth, let’s lay down definitions for two crucial operations: “**declaration**” and “**initialization**.” The **declaration** process marks the creation of variables/constants using keywords like **var**, **let**, or **const**, establishing their presence within a given scope. ``` var a; // declaration of variable "a" let b; // declaration of variable "b" const c; // this is not allowed - const has to be initialized with the value ``` The **initialization** is the phase where a value is assigned to a declared variable or constant. ``` var a; // declaration of variable "a" a = 1 // initialization of "a" with the value 1 let b; // declaration of variable "b" b = 2; // initialization of "b" with the value 2 const c = 3; // declaration of constant "c" with initialization with the value 3 ``` It’s important to note that while this section provides a foundational understanding of **declaration** and **initialization**, the intricate mechanisms behind these processes fall outside the scope of this article. ## Hoisting for let and const In the preceding section, we highlighted that variables defined with the **var** keyword are **hoisted** and **initialized** with an **undefined** value. But what about their counterparts, **let** and **const**? Variables and constants declared using **let** and **const** are indeed hoisted as well. This might seem surprising, so let’s clarify this with an example to address any potential confusion. Consider the scenario where an attempt is made to access not defined variable: ``` console.log(a) // Console: ERROR: ReferenceError: a is not defined ``` As you’ve noticed, the error encountered is a **ReferenceError** stating “**a is not defined**”. In the case of **var** declaration (*var a*), this error wouldn't persist (resulting in **undefined** output in the console). How would a similar scenario unfold with declarations using **let** and **const** keywords? ``` console.log(a) let a = "abc" // Console: ??? console.log(b) const b = "abc" // Console: ??? ``` As mentioned earlier, both **let** and **const** declarations are **hoisted** in JavaScript. However, attempting to access variables declared with these keywords before their initialization results in a **ReferenceError** (the same type as in the example above). The error message, “**Cannot access 'a' before initialization”** (or **“Cannot access ‘b’ before initialization”** for **const**), distinguishes this scenario from trying to access an entirely non-existent (**not defined**) variable. Given your understanding of the distinction between **declaration** and **initialization**, **hoisting** primarily involves shifting the **declaration** to the top of the **variable’s scope**. However, the error message often refers to “**initialization**”. To expand on the concept, it’s essential to note that both **var** and **let** variables are **implicitly initialized** with the **undefined** value, albeit unintentionally. Nevertheless, when attempting to access a **let** variable before its definition, this initialization mechanism doesn't occur, [ECMAScript docs](https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-let-and-const-declarations) describes it as: > let and const declarations define variables that are scoped to the running execution context's LexicalEnvironment. The variables are created when their containing Environment Record is instantiated but may not be accessed in any way until the variable's LexicalBinding is evaluated As highlighted earlier in the article, only **var** variables are initialized with the undefined value after the **hoisting** phase. ### Temporal Dead Zone The absence of the behavior involving **undefined** initialization during hoisting for **let** and **const** declarations leads to errors when attempting to hoist them. While hoisting moves the declarations of variables/constants to the top of their scope, accessing uninitialized variables/constants declared with **let** and **const** isn't possible. This behavior introduces what we refer to as the “**Temporal Dead Zone**”. It encapsulates the code block from the beginning of the scope (where the block defines the scope for **let** and **const**) until the point where the variable/constant is initialized. Entering this **Temporal Dead Zone** triggers the error we encountered earlier: “**Cannot access 'a' before initialization**". ## Summary The discussion on **hoisting** often revolves around **var** variables, often overlooking the nuanced behavior of **let** and **const**. Unlike **var** variables, which are **hoisted** and **initialized** with **undefined**, **let** and **const** variables/constants undergo **hoisting without initialization**. This leads to the **Temporal Dead Zone**, a crucial concept that underlies the myth that **let** and **const** are not hoisted. Claiming that **let** and **const** are not hoisted is a simplification  -  it’s a mental shortcut. In reality, we cannot use these variables/constants before their **declarations** not because they are not hoisted, but because they **lack initialization**. This is evident in the **ReferenceError** message: “**Cannot access ‘a’ before initialization**”. The **Temporal Dead Zone** is the key to understanding this behavior. - - - ##### Take a look at our earlier blog post debunking frontend myths: 1. [To 'b' or Not to 'b': The Semantic Status of HTML 'b' Tag](/blog/semantic-status-of-html-b-tag/) ## To 'b' or Not to 'b': The Semantic Status of HTML 'b' Tag *Published: 2024-11-19 | Author: rafal-op | Tags: frontend* *Source: https://brightinventions.pl/blog/semantic-status-of-html-b-tag/index.md* **In this article, I delve into the subtle differences between the `` and `` HTML tags. I highlight their shared ability to visually emphasize text while also underscoring their unique semantic implications. Despite their apparent visual resemblance, these tags diverge significantly in their semantic roles, which in turn affects accessibility, SEO, and best practices in web markup.**
    ![html tags](/images/blogpost_rafal_b_htlm.png "")
    ## Understanding semantic tag What is that “**semantic tag**” from the title? Semantic tags in **HTML** serve a specific purpose by encapsulating **meaningful information** about the content or structure of an element. They significantly boost **accessibility** (A11y) and search engine optimization (**SEO**), all while enhancing the readability of your code. ## The myth: 'b' Is Not About Meaning The myth revolves around the distinction between the `` tag, primarily used for styling text to be bold, and the `` tag, which conveys semantic meaning by indicating important content. You’ve likely heard that: > `` isn’t considered a semantic tag Alternatively, you might have heard: > `` is used for styling purposes to make text bold, while `` holds semantic significance, emphasizing important content There’s a misconception that `` lacks semantic significance, while `` holds a deeper meaning, creating confusion about their appropriate usage. It’s fascinating that if you inquire with ChatGPT about the differences between `` and `` tags, you’ll encounter the myth I’m referring to:
    ![ChatGPT description about differences between b and strong tags](/images/b-vs-strong.png "")
    Myths like this one often had some truth in the past. For instance, `` was indeed linked with “bold” styling without conveying any specific meaning. Even the HTML4 specification categorized it under “**Font style elements**” \[1], explicitly stating its rendering as bold text style: > B: Renders as bold text style. This association with mere visual styling persisted until the HTML5 standard was introduced, bringing changes to these interpretations. ## The truth behind 'b' versus 'strong' The evolution of HTML standards is fascinating. In the current HTML5 documentation, the `` tag resides within the “**Text level semantics**” section \[2], marking a significant shift from its previous association in HTML4. Similar to its HTML4 counterpart, browsers still apply additional styles to the `` element, rendering text bold as specified. However, in HTML5, `` carries a semantic meaning, emphasizing its intended usage for specific purposes rather than simply applying font weight \[3]. Even on MDN’s specification for the `` element, it’s referred to as “**The Bring Attention To**” element, \[4] highlighting its evolved role. It’s intriguing: both `` and `` can make the text bolder visually (but should not be used just to make text bold), yet they each carry distinct semantic meanings. At first impression, they may seem alike, but their semantics differ subtly, shaping their intended use in distinct ways. `` is not as impactful as `` according to HTML documentation, as it doesn’t inherently convey extra significance or importance. It’s suggested \[2] for instances like highlighting: > \[…] key words in a document abstract, product names in a review, actionable words in interactive text-driven software, or an article lede. A meaningful illustration of `` usage would be: `

    The primary colors are red, blue, and yellow.

    ` Here, no specific importance is attributed to the word “primary”  -  it is a **keyword**. On the contrary, `` emphasizes the **significance**, **gravity**, or **urgency** of a specific part within the text, without altering the overall meaning of the content itself \[5]: `

    Attention! All passengers must fasten their seatbelts during the flight.

    ` ## Impact on accessibility  As noted earlier, semantic tags are generally intended to improve **accessibility** (A11y), but the practical difference between `` and `` tags in this area is less significant than one might expect. While these tags have distinct semantic meanings - support for their unique purposes is not consistently implemented across all screen readers. As a result, in many cases, their behavior is identical \[6], functioning just like a standard text tag. To observe this firsthand, you can enable VoiceOver on your computer or install a screen reader extension in your browser to test how these tags are interpreted. This discrepancy between specification and real-world implementation reveals a gap that still exists in how accessibility tools handle semantic tags. ## Summary The rapid evolution of standards and specifications in various frontend technologies can be challenging to keep up with. It’s easy to miss subtle but impactful changes, especially when online resources offer conflicting information. I hope this article helped clarify the semantic differences between the `` and `` tags, highlighting the unique roles each one plays. ### References * **\[1] HTML4 'b' spec**\ https://www.w3.org/TR/html401/present/graphics.html#edef-B * **\[2] HTML5 'b' spec**\ https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-b-element * [](https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-b-element)**\[3] Using 'b' and 'i' elements**\ https://www.w3.org/International/questions/qa-b-and-i-tags * **\[4] 'b': The Bring Attention To element**\ https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b * **\[5] HTML5 strong spec**\ https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-strong-element * **\[6] Screen Readers support for text level HTML semantics**\ https://www.tpgi.com/screen-readers-support-for-text-level-html-semantics/ ## Bright Inventions Named a Trusted Engineering Partner in Polkadot’s Ecosystem *Published: 2024-11-18 | Author: izabela | Tags: bright insights* *Source: https://brightinventions.pl/blog/polkadot-delivery-partners/index.md* **The Decentralized Delivery Partners Program, funded by the Polkadot treasury, is an initiative designed to strengthen collaboration between builders and service providers within the Polkadot ecosystem.**
    After a rigorous screening process, we are proud to announce that **Bright Inventions has been included in the [Substrate Delivery Partners directory](https://github.com/blockdeep/delivery-partners)**. This recognition places us among a select group of expert engineering partners capable of building with the Polkadot SDK or setting up the infrastructure to run a chain. We’re honored that our expertise in Substrate [blockchain development](/our-areas/blockchain/) has been acknowledged, and we look forward to contributing to the growth of the Polkadot ecosystem. The program's initiator is BlockDeep Labs. Learn more about the Delivery Partners Program on [Block Deep Labs' blog](https://blog.blockdeep.io/launching-the-delivery-partners-directory-394a0dfad607). ## Breaking Barriers in Healthtech: Strategies for Navigating in 2025 *Published: 2024-11-18 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/healthtech-strategies/index.md* The Healthtech sector is driving a revolution in healthcare, reshaping how we deliver care, engage patients, and conduct medical research. From telemedicine to AI-powered diagnostics, these innovations hold the potential for better efficiency and patient outcomes. **Yet, as we look to 2025, significant barriers remain. This article explores key challenges and strategic insights gathered from industry experts at [HLTH Europe in Amsterdam](https://europe.hlth.com/),** offering a roadmap for navigating the complex landscape of Healthtech in the year ahead. ## **Regulatory Hurdles: Navigating Diverse Requirements Across Regions** One of the most significant challenges for Healthtech companies is **the complex web of regulatory requirements that vary by country—and sometimes even within regions of the same country.** Regulatory bodies like the U.S. Food and Drug Administration (FDA), the European Medicines Agency (EMA), and others have stringent guidelines for medical technologies. Navigating these regulations requires substantial legal expertise and resources.
    ![mohammad al ubaydli](/images/baner_mohammad.png "phin")
    ### Implications: * Time-Consuming Approval Processes: Lengthy approval times can delay the deployment of critical technologies. * Resource Intensive: Compliance demands significant investment in regulatory affairs teams and legal consultations. * Market Entry Barriers: Smaller start-ups may find it challenging to enter multiple markets due to regulatory complexities. ### Strategies for Overcoming Regulatory Hurdles: * Early Engagement: Engage with regulatory bodies early in the development process. * Global Harmonization Efforts: Advocate for international standards to simplify cross-border compliance. * Localized Expertise:Employ local regulatory experts to navigate regional requirements effectively. ## **Data Security and Privacy: Balancing Accessibility with Protection** In an era where data is a valuable asset, ensuring the security and privacy of patient information is paramount. Healthtech solutions often require the collection, storage, and transmission of sensitive health data, making them prime targets for cyberattacks. ### Challenges: * Compliance with Laws: Adhering to regulations like the Health Insurance Portability and Accountability Act (HIPAA) and the General Data Protection Regulation (GDPR). * Technological Vulnerabilities: Protecting against hacking, data breaches, and unauthorized access. * Patient Trust: Maintaining confidence among users that their data is secure. ### Mitigation Strategies: * Robust Encryption: Implement advanced encryption methods for data at rest and in transit. * Regular Audits: Conduct security audits and vulnerability assessments. * Access Controls: Utilize multi-factor authentication and strict access protocols. **Check another blog post to read more about [securing health data](/blog/cyber-security-in-healthcare/).** ## **Adoption Barriers: Convincing Stakeholders to Embrace New Technologies** Even the most innovative Healthtech solutions can falter if they fail to gain acceptance from healthcare providers and patients. Resistance can stem from a lack of understanding, fear of the unknown, or perceived threats to established workflows.
    ![aahuti rai](/images/baner_aahuti.png "healthcare stakeholders")
    ### Factors Contributing to Adoption Barriers: * Complexity of Technology: Steep learning curves can deter busy healthcare professionals. * Cost Concerns: High initial investment without immediate ROI can be a deterrent. * Skepticism: Doubts about the efficacy and reliability of new technologies. ### Approaches to Enhance Adoption: * Education and Training: Offer comprehensive training programs for users. * Demonstrate Value: Provide evidence of improved outcomes and efficiencies. * User-Friendly Design: Develop intuitive interfaces to ease the transition. ## **Interoperability Issues: Bridging the Communication Gap Between Systems** The lack of seamless communication between different health systems hinders the effective use of Healthtech solutions. Interoperability is crucial for ensuring that patient data flows efficiently across various platforms and care settings.
    ![fernando campos soares_interoperability](/images/baner_fernando-failure-2-.png "nuria_interoperability")
    ### Problems Arising from Interoperability Gaps: * Data Silos: Fragmented data can lead to incomplete patient records. * Inefficiencies: Duplicate tests and procedures increase healthcare costs. * Patient Safety Risks: Incomplete information can result in medical errors. ### **Solutions for Improved Interoperability:** * Adopt Standards: Utilize common data standards like HL7 and FHIR. * APIs and Integrations: Develop application programming interfaces that enable system compatibility. * Collaborative Efforts: Participate in industry consortiums focused on interoperability. ## **Funding and Investment: Securing Financial Support** Access to capital is a significant barrier, especially for start-ups aiming to disrupt the Healthtech space. Investors may be wary due to the high risks associated with regulatory hurdles and market adoption challenges. ### Investment Challenges: * High Development Costs: R&D in Healthtech can be expensive and time-consuming. * Uncertain ROI: The path to profitability may not be clear-cut. * Market Competition: A saturated market can deter investment. ### Strategies to Attract Funding: * Clear Value Proposition: Articulate how the technology addresses unmet needs. * Pilot Programs: Demonstrate success through small-scale implementations. * Strategic Partnerships: Collaborate with established healthcare entities to bolster credibility. ## Cultural Resistance: Overcoming Traditional Mindsets Healthcare is a field deeply rooted in tradition and established practices. Introducing new technologies often requires a cultural shift among providers and patients alike. ### Aspects of Cultural Resistance: * Trust in Human Judgment: Preference for human expertise over algorithms or AI. * Fear of Job Loss: Concerns that automation may replace human roles. * Patient Reluctance: Discomfort with virtual consultations or digital monitoring. ### Overcoming Cultural Barriers: * Stakeholder Engagement: Involve healthcare professionals in the development process. * Transparent Communication: Explain the benefits and limitations of technologies openly. * Gradual Implementation: Introduce changes incrementally to allow time for adaptation. ## **Conclusion** The Healthtech industry stands at the forefront of revolutionizing healthcare, offering solutions that could lead to more personalized, efficient, and accessible care. However, **to realize this potential, stakeholders must navigate a complex landscape of regulatory requirements, data security concerns, adoption hurdles, interoperability challenges, funding obstacles, and cultural resistance.** Addressing these issues requires a **multifaceted approach** that includes early and ongoing collaboration with regulatory bodies, robust cybersecurity measures, strategic efforts to encourage adoption, technical solutions for interoperability, innovative funding models, and initiatives to shift cultural perceptions. By proactively tackling these challenges, Healthtech companies can pave the way for a more connected and advanced healthcare system that benefits providers and patients alike. ## 7 sins of demotivation every manager & leader should be aware of *Published: 2020-05-07 | Author: ula | Tags: motivation, leadership, team management* *Source: https://brightinventions.pl/blog/7-sins-of-demotivation-every-manager-should-be-aware-of/index.md* Being a team manager today is a complex challenge. Your team likely consists of people with unique personalities, diverse life experiences, varied needs, and different perspectives. **Managing them effectively means fostering collaboration while being alert to potential issues that could escalate if left unaddressed.** Too often, we can see managers who view people as numbers, overlooking the value of real connections. Don’t be that manager—the one who has no time to listen, who disregards the importance of job satisfaction. **Instead, be the manager who understands what drives or hinders each individual on your team.** Recognize the warning signs of demotivation and its impact on team performance. Be the kind of manager who is fully aware of the "7 sins of demotivation" and works to create an environment where employees feel motivated and engaged. ## Sin 1: The lack of appreciation Not everyone needs daily recognition from their manager. In fact, there are some employees—though perhaps a minority—who prefer minimal social interaction at work and are content as long as their paycheck arrives on time. **However, we often overvalue financial motivators at work as most people seek more than just a paycheck, they put in significant effort and have a genuine need to feel valued for their contributions.** When a manager overlooks their hard work, it can lead to frustration, resentment, and ultimately demotivation. **In the book ["Drive"](https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805) Daniel Pink highlights that beyond financial rewards, people are motivated by three key factors: autonomy, mastery, and purpose.** When managers recognize and appreciate the contributions of their team, they tap into these deeper motivations, creating a more engaged and motivated workforce. Don’t be the manager who fails to acknowledge effort. Instead, foster an environment where employees feel seen, valued, and connected to a shared purpose, driving them to do their best work. ## Sin 2: The lack of sense The tasks we take on at work should always have purpose and meaning. When assigning additional, time-consuming responsibilities to team members, ensure they won’t detract from more critical priorities. Overloading employees with too many tasks can lead to frustration, burnout, and ultimately, demotivation. As Daniel Pink explains one of people's motivators is purpose. This idea of purpose as a core motivator is also explored in "[The Purpose Economy](https://leadershipspace.com.au/podcasts/aaron-hurst-on-leveraging-purpose-for-success/0)" by Aaron Hurst, who discusses how the pursuit of purpose, rather than just profit, is driving the modern workforce. Hurst argues that **people are increasingly looking for work that aligns with their values and provides a sense of fulfillment.** In a similar vein, Simon Sinek's ["Start with Why"](https://www.youtube.com/watch?v=2Ss78LfY3nE) emphasizes **the importance of understanding the "why" behind what we do, suggesting that when leaders and organizations clearly communicate their purpose, it inspires trust, loyalty, and dedication in their teams.** Th purpose of our work is seen not just as a nice-to-have, but as a key ingredient in building an engaged, motivated, and productive workforce. A good leader helps their team stay focused on meaningful work that aligns with these intrinsic drivers - delegate tasks clearly, provide guidance, and support your colleagues and employees in managing their time effectively. This not only improves productivity but also fosters a sense of fulfillment and engagement. ## Sin 3: The lack of respect Respect is the key element in every relation built on trust and mutual support. When respect is lacking and managers treat employees with disregard, it puts the entire team at risk and can lead to high turnover and poor morale. Genuine respect should be given equally to all team members, without favoritism. **If an employee's work needs improvement, [address it honestly and constructively](https://brightinventions.pl/blog/feedback-make-it-simple/)—but never at the expense of their dignity.** [Susan Fowler emphasizes that sustainable motivation arises when people feel connected, respected, and valued.](https://hbr.org/2014/11/what-maslows-hierarchy-wont-tell-you-about-motivation) **Relationships are essential to fostering this intrinsic motivation.** By respecting your team members, you’re not only acknowledging their worth but also nurturing a culture where people feel supported, engaged, and motivated to grow. Treating employees with respect builds stronger, more resilient teams who can trust one another and their leader. ## Sin 4: The lack of challenges Routine can be draining. While some people thrive on consistency and prefer a predictable workday, others find purpose in new challenges and opportunities for growth. **[Eric Berne’s Transactional Analysis ](https://changingminds.org/explanations/needs/berne_hungers.htm)highlights the human need for stimulation, a need that, when unmet, can lead to boredom, frustration, and even disengagement.** As a leader recognize the diverse needs of your team and harness their unique strengths. **Give those who crave new challenges the opportunities to innovate and develop their skills.** By effectively managing the talents and aspirations within your team, you foster a dynamic environment that keeps employees engaged and motivated—reducing the temptation for them to seek excitement and growth elsewhere. Be the manager who nurtures talent and provides the stimulation each individual needs to thrive. ## Sin 5: The lack of fair treatment Avoid favoritism—it’s one of the quickest ways to demotivate experienced employees. **[As a manager or leader don’t let personal preferences or “mind games” cloud your judgment.](https://brightinventions.pl/blog/10-most-common-psychological-games-at-work/)** Favoritism often leaves competent, ambitious team members feeling overlooked and undervalued, undermining their motivation and trust. Even if you naturally connect with certain employees more than others, all team members deserve fair and equal treatment. **Your employees don’t have to share your personal interests to earn your respect or support.** Avoid subtle biases and favoritism, and instead, create a workplace culture where each individual feels recognized and valued for their skills and contributions. Don’t let trivial differences or personal preferences erode team morale—lead with fairness and integrity, and watch your team’s motivation thrive. ## Sin 6: The lack of autonomy The lack of autonomy is one of the strongest demotivators in the workplace. When employees feel they have little control over their tasks or decisions, it can lead to frustration, disengagement, and a sense that their contributions don’t truly matter. **While autonomy is critical for motivation, it should also be balanced with clear structure and direction to help employees thrive.** In "Why Motivating People Doesn’t Work" Susan Fowler describes the importance of structure in fostering sustainable motivation. People need a framework that guides their efforts and provides clarity on goals and expectations. **Structure does not mean micromanagement, rather it is a supportive foundation that enables autonomy.** Good managers and leaders set clear goals and allows team members the freedom to determine how they achieve them, offering the best of both worlds. By providing structure that supports autonomy, you empower employees to take ownership of their work. ## Sin 7. The lack of positive vibes Good managers should care about the atmosphere at work. And what is even more important, good managers are motivated managers. People who can disperse negative vibes from their employees. The seventh sin of demotivation is a negative attitude, the negative attitude that may bring down the whole team. **If you have negative people in your team, take them aside and talk privately how they can improve their approach.** Everyone may have a bad day, but in the end it is the positive atmosphere people need. Understand the importance of a positive atmosphere at work. An optimistic and energized attitude is contagious. Dispel negativity within your team and recognize that a negative outlook can often drain the morale of everyone around. A negative attitude is the seventh “sin of demotivation” one that can quickly bring down the energy and productivity of the entire group. If you notice negative behavior in a team member, take a moment to connect with them privately, offering support and encouraging a shift in perspective. Everyone has challenging days, but fostering a positive work environment often relies on humor, laughter, and a healthy dose of lightheartedness. **[Research has shown that laughter at work not only reduces stress but also promotes teamwork and creativity.](https://hbr.org/2020/05/laughter-will-keep-your-team-connected-even-while-youre-apart)** In [Provocative Therapy](https://www.provocativetherapyexplained.com/) Frank Farrelly emphasizes using humor to encourage self-reflection, lighten moods, and challenge negativity in a playful, constructive way. **When managers and leaders bring laughter into the workplace, they create a space where employees feel uplifted and engaged, boosting resilience and making work a place where people truly enjoy spending their time.** 🧡 ## What do we want Everyone wants to feel that their work is meaningful and impactful. **It is crucial for team members to feel like they are an essential part of the company, connected to a purpose bigger than themselves.** Let us keep our teams informed about the company’s goals, mission, upcoming changes, new projects, and opportunities. Remember taht even if you play the role of managers or leader in the organisation, you are not the only leader here—each employee is the manager and leader of their own work and their own life. Every day, each company is driven forward by dozens of individuals whose dedication and efforts are key to its success. Show them their value. Emphasize the importance of their contributions and make sure they know just how vital they are to the bigger picture. Always. ## Unleashing Creativity: The Career Journey of Łukasz, an iOS Developer *Published: 2024-11-14 | Author: lukasz-n | Tags: bright story* *Source: https://brightinventions.pl/blog/lukasz-ios-developer-story/index.md* **Breakdancing, starting a band – Łukasz explored many creative outlets in his search for self-expression. Eventually, he discovered that programming was the best way to unleash his creativity. Dive into Łukasz’s career story and learn his secret pizza dough recipe.**
    ![iOS developer story](/images/brightstorylukaszgrid.png "iOS developer story")
    ## What was your path toward a career in software development? From a young age, I've always had a strong desire to create. Initially, I was really into breakdancing. For about two years, **I attended breakdancing classes and especially enjoyed the acrobatic aspects** – it felt like I was creating something through movement. Unfortunately, the classes were canceled, and since I lived in a small village, there weren't any other options to continue pursuing it. Still driven by my urge to create, I started a band in high school, though it didn’t last long, and to be honest, I wasn't the best musician. I taught myself to play the guitar, but it didn’t go as well as I’d hoped. In my senior year, **I discovered that programming could fulfill my creative needs**. I had dabbled in C++ when I was younger, and in elementary school, I even built an unofficial website for my school class. At that time, however, my first choice was to study mechatronics. Yet due to a mistake in my application, I wasn’t able to pursue it, and I ended up studying Computer Science instead. As it turns out, this "backup option" became my eventual career. ## You and Swift – was it love at first sight? Yes, absolutely. I first encountered Swift in college. **Having prior experience with C++ and Java, where the code often felt unclear and complicated, Swift was a breath of fresh air**. Its syntax was simple yet powerful, and it felt almost like writing a story. The ease and clarity of Swift really stood out to me, and I immediately enjoyed working with it. ## What used to be a challenge for you at work and isn’t anymore? I would say sharing my ideas. **I used to hold myself back, assuming that my suggestions might be silly** or that others had more knowledge on the subject. **Now, sharing ideas has become a natural part of my work**, and it's something I truly value.
    ![quote on sharing ideas](/images/lukasz_quote_sharing_ideas.png "quote on sharing ideas")
    ## How do you recall switching to SwiftUI? The switch wasn’t too challenging for me because, in college, I **had classes on the QT framework, which introduced me to the declarative approach to building views**. At the time, I struggled with it, but I eventually got the hang of it. That experience paid off later when I started learning SwiftUI, as I was already familiar with the paradigm. ## Are you in the process of switching from UIKit to SwiftUI in the project you're part of? Yes, I’m part of a team developing a [mobile app for a company in the construction industry](/projects/document-management-apps-construction/). The app was initially written using UIKit because, at the time, SwiftUI wasn’t production-ready. We waited about a year, and **after seeing significant progress in SwiftUI’s development, we began modernizing the app**.
    ![quote on Swift UI](/images/lukasz_quote_swiftui.png "quote on Swift UI")
    We started by writing one feature in SwiftUI, and the entire team was excited by the results, especially how much faster it was to build views. **Adding new modules with the same complexity took half the time compared to using UIKit**. While this improvement isn’t solely due to SwiftUI, I’d say it contributed about 50% to the increased efficiency. **Now, it’s hard to imagine using UIKit for view-building**, so we develop all new views in SwiftUI and gradually rewrite the older ones. ## Do you enjoy your cooperation with the client? Absolutely. I really appreciate our open communication and strong feedback culture. The client is very receptive to feedback and also provides their own, which **creates many opportunities for us to share different perspectives and grow as professionals**. For example, the product designer on the client’s side is very open to our input regarding design, allowing us to share our developer’s perspective. This kind of collaborative relationship with product designers isn’t always common in software development, so I especially value it. ## You’ve been working at Bright Inventions for almost 3 years. How do you assess this time? It's been great! **Even during my job interview with Ula and Mateusz, I felt we had a great connection**. The conversation flowed so well that we could have talked even longer, despite it already lasting about two hours! What I appreciate most about Bright Inventions is the **company’s strong sports culture**, which I quickly got into. Since joining, I’ve started running more regularly and going to the gym. Besides that, I’ve taken up climbing and finally started learning how to swim, something I’d wanted to do for years. I’m still not the best swimmer, but I’m making steady progress.
    ![climbing](/images/lukasz_climbing.png "climbing")
    Also, I really appreciate that at Bright Inventions, **I can simply focus on doing my work without having to deal with any office politics or mind games**. There’s none of that here, any communication is clear, honest, and drama-free. ## Okay, it's time to be serious. How often do you wash your car? Whenever I’m going on a longer trip, **I make sure to wash the car before I leave and then again right before I arrive** at my destination to clean off any dirt or dead insects. But to be honest, I don’t drive that often – I prefer walking around the city. **Poznań, where I live, is perfect for walking**. Aside from regular visits to the car wash, I also take my car to professionals about once a month for a thorough inside-and-out cleaning. ## I know you love cooking Italian. What’s your secret recipe for pizza dough? I thrive on chaos in the kitchen! While most cooks carefully measure ingredients and follow exact proportions, I like to experiment with different ratios and rising times. So, **my secret ingredient is chaos**. ## So you can’t replicate your dough, even if it turns out perfect? Yes, that’s the downside! But it also adds an extra fun factor because **I get to keep experimenting and surprising myself** with the results. ## Nuria: Advancing Healthcare Interoperability and Patient Engagement *Published: 2024-10-18 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/nuria-advancing-healthcare-interoperability-and-patient-engagement/index.md* \ In this interview, we explore the journey of [Nuria](https://nuria.com.br/) a health tech company based in Brazil, focused on transforming patient engagement and healthcare data integration. The founder -[ Fernando Soares Campos](https://www.linkedin.com/in/fernando-soares-b7a56755/) shares insights on **how their modular solutions are enhancing digital experiences for patients, streamlining data exchange across various healthcare sectors, and addressing the challenges of interoperability.** Additionally, the discussion covers the barriers to digital transformation in healthcare, strategies for educating stakeholders, and future trends in the health tech industry. The interview was done at the [HLTH Europe Conference in Amsterdam.](https://europe.hlth.com/) ## **Please describe yourself and your solution.** I'm Fernando Soares the founder and CEO of Nuria. Nuria is a health tech company based in Brazil. We have two main focuses. The first one is patient engagement. **We offer a complete B2B solution for hospitals, clinics, and labs so they can deliver a better digital journey for their patients, engaging them and bringing them closer digitally to their care.**  Our solution is modular, with five modules that hospitals, clinics, and labs can buy from us and offer to their patients to better their digital journey. The second focus is an integration and interoperability platform. This involves data exchange between hospitals, clinics, labs, and other healthcare solutions, health techs, payers, the pharma industry, and distributors. **Essentially, any player in healthcare that needs to automate a service or product, we connect them.** ## **How exactly is your solution helping people?** For the [patient engagement solution](/blog/delivering-patient-engagement-platform/), we deliver a better experience for patients. They don't have to call to schedule an appointment; we have online scheduling integrated with hospitals, clinics, and labs. Patients can confirm appointments through their phone, WhatsApp, or email. We have a check-in solution similar to airlines, offering a better digital experience. This means less time waiting to see the doctor, 24/7 online scheduling and confirmation, better check-in experiences, and modules that remind patients about their care, like scheduling regular checkups. **Last year, we impacted more than 12 million patients across Brazil with over 1,000 connected hospitals, clinics, and labs.** For the integration platform, we automate data exchange between more than 12 partners. The end users are usually doctors or patients. For example, the biggest online prescription health tech in Brazil connects through our system to EMRs in over 50 hospitals. When a doctor makes an online prescription, our platform integrates that prescription into the EMR, enhancing the data available to doctors. Another example is a digital solution for doctors in surgery rooms, recording how much medication is administered to each patient. **We integrate that data into the EMR, providing doctors with comprehensive patient information.** ## **As your company is heavily invested in interoperability, what barriers have you encountered during the journey?** We've encountered many barriers. When discussing data, interoperability, data quality, unstructured data, and structured data, challenges abound. **In Brazil, our biggest challenge is the mindset of healthcare leaders. Patients often need to opt in to share their data for better outcomes, and regulatory bodies and healthcare providers can be resistant to data exchange.** Payers and providers often operate independently, leaving patients caught in the middle. Changing this mindset requires educating stakeholders about the benefits of data sharing.
    ![](/images/baner_fernando-challenge.png "")
    ## **How did you manage to change the mindset of people in Brazil?** We're still in the education phase. When talking to managing directors of hospital groups, they often acknowledge the challenges of data exchange but don't prioritize investing in it. **Changing this mindset involves educating rather than selling, with a lot of content and discussions.** Healthcare changes are slow and require continuous effort. ## **Is Brazil the only market you're in?** Yes, currently we're only in Brazil. Brazil is a large market with about 50,000 healthcare units. We're connected to 1,000, so there's a lot of room for growth. Attending HLTH Europe allows us to benchmark and explore opportunities in Europe and Latin America. ## **How old is your solution?** We started back in 2012 with our first product, B2B online scheduling integrated with EMRs. By 2018, we developed what we called the patient's digital journey. In 2019, we launched the integration and interoperability platform. Last year, we rebranded the company, launched more modules, and our patient digital journey evolved into a patient engagement solution. Our integration platform has become a more robust interoperability and data exchange solution. ## **Have you modernized your solution? Have you encountered any barriers or challenges?** Yes, we constantly modernize our solution. From a product perspective, it's never 100% complete. We continuously evolve and invest in the product. **Data exchange requires high-tech development.** The more we integrate EMRs and partners, the more robust our solution becomes, handling over 130 million data points last year. ## **What inspired you to enter this field of e-health and medtech?** I've been an entrepreneur my whole life. **In 2009, I had to reschedule an appointment with my dad's friend, a doctor. I struggled to find his contact information and thought it would be easier to use an app to cancel the appointment.** At that time, there was nothing like that in Brazil. Inspired by the need for better patient digital experiences, I left my job and started Nuria to improve online scheduling and rescheduling. ## **Where do you get inspiration now? Any favorite podcasts or news sites?** I listen to [Morgan Housel's podcast](https://open.spotify.com/show/2l01lGyIh9xodneIV37dD3), which isn't healthcare-specific but offers insights into psychology, money psychology, and challenges. My dad is also a significant source of inspiration. He's been a CEO of large companies and has a lot of wisdom to share. I also belong to entrepreneurial groups, including health tech founder groups, where we share experiences and advice. ## **Do you have any advice for young entrepreneurs or startup owners?** **Founding a company isn't for everyone.** You need resilience, a strong purpose, and the willpower to persist through challenges. It's essential to fail fast, focus on solving problems rather than clinging to ideas, and bring good people on board. You can't do it alone.
    ![](/images/baner_fernando-failure-1-.png "")
    ## **What trends do you see in health tech and medtech, apart from AI?** Besides AI, **I believe healthcare needs to shift its priorities to focus more on patients.** While it's important to improve doctors' administrative work, we must prioritize the patient's overall experience and outcomes. The trend should be about integrating solutions that enhance the entire patient journey, not just isolated digital parts. We need to work together as an ecosystem to deliver better healthcare. ## **Thank you. That was insightful.** Thank you. ## Tailored Nutrition Solutions: The Anydish Healthcare App *Published: 2024-10-11 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/nutrition-solution-anydish/index.md* At [the HLTH Conference in Amsterdam](https://europe.hlth.com/) this June, Agata Bielówka spoke with [Michal Kahan](https://www.linkedin.com/in/michal-kahan-a4735559/), founder of [anydish](https://www.anydish.me/), about their innovative solution for health practitioners. Michal explained how the anydish app simplifies the use of disease-specific nutritional protocols, offering customizable, time-saving tools for healthcare professionals. A recent update to the platform includes a protocol tailored for patients on weight loss medications like Ozempic and Wegovy, addressing side effects such as unintended loss of lean body mass and essential vitamins. Kahan also shared insights into their technology, the challenges they face, and the trends driving personalized nutrition in healthcare. ## Can you briefly describe yourself and your solution? Our solution is for health providers. Health providers could be physicians, functional medicine practitioners, dieticians, or nutritional doctors or therapists. When they see a patient, review diagnostic test results, and consider complex medical situations, it becomes difficult to provide a truly personalized solution, especially when it comes to recipes and nutrition plans. **Our solution helps both the health practitioner and the patient.** ## **How does it work?** We have an AI that takes any online recipe from websites about healthy lifestyle, analyzes it, and indexes it by nutritional values and other criteria. Health practitioners use our web tool to build a nutritional prescription for their patients based on diagnostic test results or their own knowledge. Patients then download an app that provides them with personalized recipes matching their profile.
    ![anydish](/images/screenshot-2024-10-11-at-13.27.46.png "nutrition solution")
    source: [anydish.me](https://www.anydish.me/) ## **Are your users mostly individuals, but payers are practitioners?** Yes, we sell to health providers who offer it to their patients. They have a dashboard to build a nutritional prescription for each patient, and the patient adds their own preferences through the app. Practitioners often bundle the anydish cost into their service and up-sell it. ## **Where did the idea come from?** My business partner’s daughter was diagnosed with type 1 diabetes at a late age, which was a big change for their family. She found that existing diabetes-friendly recipes were chaotic and often incorrect. That's how we realized there was a problem to solve. **Our entire company believes in food as medicine.** ## **What are the top tech challenges you faced?** Supporting additional languages is a challenge. **We use AI and NLP technology, so we can't just use Google Translate**. We're working on adding language models (LLM) that will help support translation to other languages, among other improvements. We also are making our solution accessible and integrating it with diagnostic tests. ## **What markets are you in right now?** We're in the UK, the US, and other English-speaking countries. We're planning to expand to German-speaking countries next. ## **How does your company ensure medical credibility and accuracy?** We don't make our own recommendations. Practitioners sign off on the patient’s profile based on diagnostic tests or their own knowledge. We translate this into actionable, real food options using our technology.
    ![nutrition solution](/images/baner_final-quote-anydish.png "anydish")
    ## **Do you have any inspirational podcasts or news sites you follow?** We always look for websites about wellness. Our company nutritionist sorts them before we analyze them. We follow trends like GLP-1 usage for diabetes and weight loss and build solutions for those cases. ## **What do you do in your free time?** I like sports. I swim, jog, do pilates, and yoga. I also do ceramics once a week. ## **What trends do you see in the health industry?** GLP-1 usage and the increase in people with multiple diseases. A proper diet complements medication and makes it work better. The health industry is undergoing a transformative shift. Technology is playing a major role, with advancements in telehealth, AI for diagnostics, and wearable health trackers.  We're also seeing a rise in personalized medicine, tailoring treatments to individual needs. Preventative care is gaining importance, including the crucial role of personalized nutrition in overall health. One specific trend I find interesting is the increasing use of **GLP-1 medications** for managing chronic diseases. However, managing multiple chronic conditions (multimorbidity) is another growing concern. This is where personalized nutrition can be a valuable tool. By ensuring patients receive dietary plans that complement medication and address specific needs, we can potentially enhance overall health outcomes. ## **I appreciate your solution. Looking forward to seeing it in Poland. Thank you for your time.** Thank you. ## Managing Decimals in POS Bill Splitting for Restaurants *Published: 2024-10-07 | Author: izabela | Tags: POS* *Source: https://brightinventions.pl/blog/decimals-pos-bill-splitting-restaurants/index.md* **You might think that bill splitting in restaurants is straightforward – you just need to divide the bill among all customers. So, what's the challenge? Well, it comes down to something we might overlook: decimals. Just try splitting 10 pounds among three people. That's when decimals really come into play.**
    ![decimals payment programming](/images/pos_payment_decimals_blog_cupdate.png "decimals payment programming")
    Let's explore a scenario depicted in a mockup of a [bill split system we implemented for Just Eat POS](/projects/pos-bill-splitting/). ## Decimals in restaurant bill split case study Imagine three people deciding to share one pizza (presumably, they have light appetites). The total bill is £6.49. **Dividing £6.49 by three results in 2.16333333333...** Rounding it down to £2.16 might seem fair since each payment is equal, but then the total collected doesn't match the bill – there's a penny missing!
    ![Bill splitting UI](/images/split-payment_before.png "Bill splitting UI")
    No business wants to lose these pennies on a larger scale. On the other hand, rounding each payment up to £2.17 isn't a perfect solution either, as it results in an overpayment of 2 pence. As you can see, **decimals are important, in some cases, they can be a matter of life or death**. Yet that’s another, rather [tragic story about 28 soldiers](https://www-users.cse.umn.edu/~arnold/disasters/patriot.html) who died because decimals were, let's say, “neglected”. **So, what can we do about these “annoying” decimals in POS systems?** ## Rounding-up mechanism in bill splitting While developing a [bill-splitting feature for our UK-based point-of-sale (POS) system](/projects/pos-bill-splitting/), our team adheres to **specific rounding-up rules** when the total bill cannot be evenly divided. In cases like the one provided earlier (dividing £6.49 by three), **the last payment needs to include an extra penny**. This small adjustment ensures that the sum of the split payments matches the total amount of the bill.
    ![Bill splitting UI POS](/images/split-payment_pizza.png "Bill splitting UI POS")
    However, in some situations, **rounding may require adding more than one extra penny**. For example, consider splitting £9.35 into 3 separate payments. The result is £3.116666... In this scenario, two of the payments need to be rounded up to ensure the total matches the original amount:
    ![Bill splitting UI POS](/images/split-payment.png "Bill splitting UI POS")
    That's the business logic behind it but what about the code? ## How to represent decimals in payment software development When handling decimals in code for monetary values using **floating-point types** like `float` and `double` is highly discouraged due to their inherent imprecision. Here's why, and what alternatives should be used instead. ### Problems with float and double `Float` and `double` are designed to handle a wide range of values by approximating them, which can introduce rounding errors – a critical issue when dealing with money. Due to the way floating-point arithmetic works, numbers cannot always be stored exactly, leading to inaccuracies. For example, performing a calculation with float might result in values like 0.999999999 instead of 1. **This lack of precision makes float and double unsuitable for representing currency**. ### Recommended approaches for currency decimal coding * **Use integers** A common alternative is to represent monetary values in cents (or the smallest unit of the currency) using an integer type, such as `int` or `long`. For example, **instead of representing $10.99 as 10.99 with a float, it can be stored as 1099 cents with an integer type**. This avoids floating-point inaccuracies while still enabling exact arithmetic. * **Use arbitrary precision types** Many programming languages offer data types that handle decimals with greater precision. In **Java**, for instance, `BigDecimal` is a highly recommended option for monetary calculations, as it provides control over rounding and allows exact calculations without floating-point errors. Similarly, **Python**'s `Decimal` type offers a way to handle monetary values precisely. * **Control over rounding** Using types like `BigDecimal` or `Decimal` also gives software developers control over rounding behaviors, which is crucial for restaurant operations where rounding must comply with legal and business standards. ## Does your bill split cover all these scenarios? While building POS payment solutions for retail and hospitality you will deal with decimals. Ensure your solution covers a variety of mathematical scenarios related to features like bill splitting. Do you struggle with implementing payment features? **As [POS software development company](/our-areas/pos-software-development/), we’ve been handling POS scaling for over a decade.** **Contact us to discuss your solution!** ## Striking a Balance: Adam’s Journey Through Hybrid and Native App Development *Published: 2024-10-03 | Author: adam-k | Tags: bright story* *Source: https://brightinventions.pl/blog/journey-through-hybrid-and-native-app-development/index.md* **As a React Native Developer Adam gladly embraces the best of both worlds: hybrid and native app development. Discover how his knowledge of Kotlin enhances his cross-platform projects and the future he envisions for React Native. Learn how working on a mental health app has given his work a deeper sense of purpose. Dive into Adam’s career story!**
    ![Adam's career story](/images/brightstoryadamgrid.png "Adam's career story")
    ## Was your career focused on mobile development from the start? I started my career as a web developer, but at my first job, I unexpectedly joined a team that was working on a hybrid mobile application. My first tasks were related to [mobile development](/our-areas/mobile-app-development/), and **I quickly realized that I could build mobile apps using the web technologies** I was already familiar with. This experience really empowered me and got me hooked on mobile development, even though it had never crossed my mind before that I could build mobile apps. ## You specialize in React Native but also continue learning native technologies. Why is that? In my first job, I worked exclusively with React Native. However, after two years, I changed jobs and began working on a much more advanced mobile app. This app required native modules to handle hardware communication and geolocation. This necessity "forced" me to learn Kotlin, which opened up more opportunities to optimize our hybrid app. **Whenever we found that certain features couldn't be optimized with React Native alone, we turned to native technologies**, building those parts in Kotlin to achieve better results. I've also been learning Swift, though I haven't yet had the opportunity to work with it professionally.
    ![quote](/images/adam_quote_cross_platform.png "quote")
    I've encountered numerous hybrid applications that reached their efficiency limits, and turning to native tech was the only way to optimize certain features. So, **knowing both hybrid and native stacks is crucial, even if you specialize in cross-platform development**. ## What future do you foresee for hybrid technologies? I can mainly speak about React Native, as that's where most of my experience lies. **React Native has essentially conquered the market**, even though there's still no stable 1.0 version released. Despite this, it has become so popular and widely used in many mobile products that **it’s something developers need to embrace rather than avoid**. Meta does a good job developing it, typically releasing updates once a quarter. In recent years, there have been **significant updates to the framework's architecture**, making it easier to integrate hybrid with native modules.
    ![quote on React Native](/images/adam_quote_react_native.png "quote on React Native")
    Another **interesting development is Expo, which adds another layer of abstraction**, making it even easier to build an app. However, this also introduces more limitations. Still, for someone looking to release an app with a small budget, Expo allows a single developer to do so efficiently. **I don't believe React Native will ever completely replace native development**, but it does provide small startups with a chance to quickly [release an MVP](/our-areas/mvp-development/) in a cost-effective way. That said, I think it's crucial to educate startup owners that while choosing a hybrid solution might be cheaper initially, it could become costly in the long term when you need to rewrite the app or at least parts of it. Unfortunately, not every software company is transparent about this with their clients. **It's important to be aware that hybrid mobile development might not be as cost-effective as it seems at first**. Once your MVP proves successful, you might need to "pay some debts" to scale effectively. *Read more about [native app development vs cross-platform](/blog/native-app-development-vs-cross-platform/).* ## You work in a team developing a mental health application. How does this impact your daily work? Working on a [mental health solution](/projects/online-group-support/) has changed the way I approach my work. I now see my role from a broader perspective, recognizing that the app I help build supports people dealing with serious mental health challenges like grief, depression, and anxiety. For example, **we developed a feature that allows users to notify the appropriate organizations if they notice someone expressing suicidal thoughts during a chat conversation**. While the feature itself might not be technically groundbreaking, the potential to save lives makes it incredibly meaningful. Although my daily tasks haven’t changed – I still solve problems with code – I feel an added sense of purpose in what I do every day. ## What convinced you to join Bright Inventions? I was **positively surprised by the recruitment process**. It was the most professional one I’ve ever participated in, and at the same time, the most challenging. From the first conversations with the recruiter, I could already sense that the work culture was at a high level. During the technical interview, **I appreciated the emphasis on code quality**, which is also important to me. For someone like me who is passionate about programming writing high-quality code is crucial. Additionally, **I was drawn to the idea of collaborating with a client from the Middle East**. I’m interested in Middle Eastern and African cultures and I actually learn Arabic in my free time, so this opportunity aligned perfectly with my personal interests. I also appreciate that in our team, we have regular meetings where we discuss technical aspects, new trends and tools, and **make decisions about which features should be refactored and how**.
    ![Team retreat](/images/michal_team_retreat_christmas.png "During Christmas office party.")
    *
    *During Christmas office party.*
    * ## What do you do after hours? **Apart from learning Arabic, I enjoy swimming**. I used to participate in swimming competitions at school, but now I swim just for fun. I also enjoy attending sauna ceremonies conducted by sauna masters. In addition to that, **I love visiting lesser-known places in Poland**, such as less popular mountain trails, parks, and other hidden gems.
    ![A lake in Wielkopolska voivodeship. Adam’s private archive.](/images/wielkopolska_adam.png "A lake in Wielkopolska voivodeship. Adam’s private archive.")
    A lake in Wielkopolska voivodeship. Adam’s private archive.
    ## What underrated place in Poland can you recommend? I can recommend a place from my local area: **the highest peak in Wielkopolska, "Kobyla Góra"**. Although it's only about 200 meters above sea level, it's a great example of places in Wielkopolska that are close to nature. Even though this voivodeship isn't famous for tourist attractions such as mountains, parks, and castles, Wielkopolska remains an underrated gem worth exploring. ## What Are Point of Sale Devices? *Published: 2022-08-04 | Author: azabost | Tags: business, bluetooth, POS* *Source: https://brightinventions.pl/blog/what-are-point-of-sale-devices/index.md* **Integrations with retail devices is crucial part of every point-of-sale system. Learn about the types of equipment used in POS for hospitality and retail.** ![ePOS equipment](../../static/images/blog_post_cover_epos.png) ## What is an ePOS system? Point of Sale (POS) is the checkout for customers who purchase goods or services. It's the place to execute the payment. In this article, we focus on hardware solutions that are a part of modern POS for retail and restaurants. These are examples of retail hardware that we integrate with POS at Bright Inventions. **Discover common problems that POS developers face while [integrating hardware with point of sale systems](/projects/pos-devices-integration/).** ## What devices are part of the electronic Point of Sale System? ### POS Desktops: ![ePOS desktop](../../static/images/pos_desktop.png) * The core of ePOS systems - **double screen devices enabling managing orders in restaurants**. One screen is facing the customer to display the order. Another one is used by the cash employee to optimize the order and finalize the transaction. * Displays are only a part of it. ePOS desktops have built-in printers, cameras (normal and face recognition cameras), speakers, and NFC&MSR card readers. * **The core of ePOS are applications** developed entirely for retail purposes. Thanks to the app the employee creates an order, conducts the payment, and then the order is transferred to the kitchen with its own meal displaying system. * ePOS devices can work on Android and iOS systems as well. If you go for iOS, you just have to work with iPads. Android is an open-source OS. So many producers build devices for ePOS with Android. Global POS manufacturers are for example Sunmi, Anypos, or POS-X. ### Kitchen Display System (KDS): * It is **a digital way to display orders for kitchen staff**. KDS is just bigger screens placed in the kitchen. For Android, there is a variety of devices with different screen resolutions that could be used. When it comes to iOS, the biggest screen is the iPad 12,9". * **Kitchen staff can manage every order or only a particular meal that is a part of the order**. For example, they can change the statuses of the meals from “Processing'' to “Ready” which enables waiters and waitresses to be on top of things. They might as well reverse the status from “Ready” to “Processing” if needed. * KDS might also display notes regarding particular orders so the chef is well aware of any meal modifications by the clients. * KDS can have two modes: checker mode for admins where you can see every order. And location mode where the system displays orders matching specific sections of the kitchen. For example, if one section takes care solely of desserts, then their KDS displays only desserts from the whole order. * KDS systems can as well display colors that emphasize how long it’s been since the order was listed. Usually, the color code states that new orders might be marked with blue and delayed orders with yellow or even orange. Check how [kitchen display system development](/projects/kitchen-display-system/) changed daily operations in restaurants across UK and Israel. ### Payment terminal: ![payment terminal ePOS](../../static/images/payment_terminal.png) * That’s probably the retail device that every consumer knows. * **Terminals are integrated with ePOS devices to display the final price on the terminal** based on the order data from ePOS. Terminals can be connected locally, by Bluetooth, or via the internet (cloud). * The demand for cashless transactions is growing. For example, The European POS terminal market shipment accounted for 10.25 million units in 2020. [It is expected to reach 22.10 million by 2026](https://www.reportlinker.com/p06129760/Europe-POS-Terminal-Market-Growth-Trends-COVID-19-Impact-Forecasts.html). Therefore the market for cashless transaction tech is growing as well. Find out how we turned smartphones into terminals with [mobile payment app](/projects/credit-card-reader/). ### Electronic scale: ![electronic scale ePOS](../../static/images/electronic_scale.png) * We know the drill here as well. Consumers choose the product that they’ve just weighted. The scale reports the weight of the product. * **Modern scales have Bluetooth connections or are connected to the router with an ethernet cable**. In the latter case, they connect with the dedicated app with User Datagram Protocol (UDP). UDP is a widely used protocol for live video streaming or online games. ### Barcode scanner: ![Barcode scanner ePOS](../../static/images/baarcode_scanner.png) * Bluetooth wireless technology enables scanning barcodes on paper or screen. * Modern scanners make it possible to scan even damaged prints, and faulty or dirty codes. ### Magnetic stripe reader: * These devices read debit, credit, and loyalty cards. To be precise, they read information encoded in the magnetic stripe located on the plastic card. * An interesting fact is that magnetic stripes are likely to be globally replaced by chips and contactless payment which are considered more secure. In 2021 [Mastercard announced that magnetics stripes won’t be required in most markets since 2024](https://www.mastercard.com/news/perspectives/2021/magnetic-stripe/). ### Kiosk: * We can divide kiosks into retail and catering versions. * **Retail kiosks are screen devices enabling contactless payment**. Clients can scan goods and pay thanks to a built-in terminal to eventually receive a printed receipt. * A catering version of the device is often used in popular fast-food restaurants where every client can go to the restaurant and order a meal using the kiosk. Then the order is transferred to the kitchen. * Kiosks are known for simple interfaces dedicated to massive use. ### Printers: There are two types of printers often used in retail: **1. Label printer** The label printer is often built-in electronic scales. When you weigh the product, the printer prints the sticker with the barcode which can be scanned by a cashier. **2. Thermal printer** ![thermal printer ePOS](../../static/images/printer.png) The device that prints receipts. Thermal printers emit light to the paper that is photosensitive so it leaves the “marks” that we know as the list of our groceries and all the costs. ## How a Simple Pen Tablet Transformed My Work as a Software Engineer *Published: 2024-09-26 | Author: azabost | Tags: software development, self-development, programming* *Source: https://brightinventions.pl/blog/how-pen-tablet-changed-software-engineers-work/index.md* **A few months ago, I bought a basic pen tablet on a whim. It was really cheap — less than $100 — and I wasn’t entirely sure how it would fit into my day-to-day work as a software engineer, but it has since become a handy tool in my workflow. In this post, I’ll share how using a graphic tablet has changed the way I explain concepts, review work, and even rediscover a long-forgotten joy in drawing.** ## Natural and Intuitive Explaining complex software concepts often involves diagrams or sketches, whether it’s a system architecture or a specific flow of data. With a tablet, I can draw these ideas as if I’m standing at a whiteboard, but without being limited by physical space or needing access to a physical whiteboard. The pen makes drawing feel more intuitive than using a mouse or touchpad, allowing me to express ideas quickly and naturally.
    ![A photo of keyboard, mouse and a pen tablet](/images/mouse-keyboard-pen-tablet-1366.jpg "")
    _My current desk setup_
    ## Annotating With Ease When reviewing code or documentation, I often find myself needing to add a few visual notes, like highlighting key parts or showing how different components relate. With a tablet, I can take screenshots and easily mark them up with arrows, lines, or words without switching between different tools. The freedom to use the tablet like paper means I don’t have to toggle between different editing modes—it’s all there, waiting for me to draw what I need. It saves time and makes feedback more visual, which is often more effective than text alone. ## The Freedom of Pen and Paper, Digitally The act of drawing with a pen tablet almost feels like using real pen and paper, which brings a level of comfort and simplicity to digital work. It’s almost like sketching in a notebook but on a screen (and you can _undo_ if you make a mistake 😅). After some practice, the need to look at the screen instead of the tablet becomes second nature. What I love most is that this approach avoids the clunky back-and-forth that comes with traditional drawing tools, like needing to switch between pointer, line, and text modes. With the tablet, all the tools feel seamlessly integrated into the act of drawing itself. ## Rediscovering the Joy of Drawing Perhaps the most unexpected benefit of using the tablet is the simple pleasure of drawing. Even though I’m no artist, the physical act of creating something by hand—whether it’s a messy diagram or a simple sketch—has been incredibly freeing and joyful. It’s a reminder that creativity isn’t always about the outcome, but the process. ## Conclusion A pen tablet may seem like an unusual tool for a software engineer, but it has proven to be an essential part of my workflow. Whether I’m explaining a technical concept, reviewing a colleague’s work, or simply doodling for fun, the tablet has transformed how I communicate and work. ## Setting Up Logback Programmatically in Android *Published: 2024-09-24 | Author: azabost | Tags: android, kotlin, logging* *Source: https://brightinventions.pl/blog/setting-up-logback-programmatically-in-android/index.md* **In my previous blog post, [Choosing the Right Logging Library for Android](/blog/choosing-the-right-logging-library-for-android-app/), I discussed how I decided to use SLF4J alongside Logback for logging in Android apps. This post will take that foundation a step further by demonstrating how to configure Logback programmatically, ensuring that logs produced through the SLF4J API are properly sent to both Logcat and Firebase Crashlytics.** ## Why Not XML? While it's common to configure Logback using XML files in backend applications, in an Android app, programmatic configuration offers a more streamlined approach. Unlike in a backend environment, where XML configuration can enable features like hot-reloading or modular configuration files for different environments (e.g., dev, test, and production), these benefits are less relevant in the context of Android apps due to their lifecycle and constraints of the mobile environment. Therefore, configuring Logback directly in code allows for greater flexibility (e.g. more dynamic configuration with feature toggles or user consent), fewer dependencies (hence smaller APK size), and simpler integration with Android-specific components like Logcat and Firebase Crashlytics. ## The goal To keep this post short and digestible, I will show you a very basic setup that would let you see the logs in Logcat and in Crashlytics (provided that your app is already integrated with Firebase).
    ![A diagram showing that all the code in the app using SLF4J API is forwarded to Logback, which in turn sends the logs to Logcat appender and Crashlytics appender](/images/logback-logcat-crashlytics.png "")
    If you're new to SLF4J and wonder how Logback is hidden behind SLF4J APIs, I recommend reading the [SLF4J manual](https://www.slf4j.org/manual.html) first. ## First steps To configure Logback programmatically, you need to access the `LoggerContext` by casting SLF4J's `ILoggerFactory`. Since Logback may be initialized with some defaults, you should `stop()` it before changing the configuration: ```kotlin fun configureLogback() { val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext loggerContext.stop() } ``` ## Appenders To make Logback send logs to the actual destinations (like Logcat, Firebase, local files, you name it), you need Logback components called "appenders". There are a few appenders ready for reuse built into Logback, for example, a `FileAppender` can be used to write logs to local files. However, it should come as no surprise that Logback doesn't include the code necessary to send the logs to Android Logcat or to Firebase Crashlytics, because Logback is not an Android library and has no knowledge about Android APIs. (I assume you don't intend to use the Logback fork [logback-android](https://github.com/tony19/logback-android/) which I don't recommend for reasons mentioned in the [previous blog post](/blog/choosing-the-right-logging-library-for-android-app/).) *You can read more about appenders in [Logback documentation](https://logback.qos.ch/manual/appenders.html).* Let's see how easily we can integrate Logcat and Crashlytics logging into Logback. ### Logcat To create a custom appender, you should create a class that extends either `AppenderBase` or `UnsynchronizedAppenderBase` and override the `abstract protected void append(E eventObject)` method. Here's a working example of such an appender: ```kotlin class LogcatAppender( private val messageLayout: Layout, private val tagLayout: Layout, ) : UnsynchronizedAppenderBase() { public override fun append(eventObject: ILoggingEvent) { val logcatLevel = eventObject.level.toLogcatLevel() ?: return val tag = tagLayout.doLayout(eventObject) val message = messageLayout.doLayout(eventObject) // Note: you may want to put Log.println behind an interface to make this class testable Log.println(logcatLevel, tag, message) } } fun Level.toLogcatLevel() = when (levelInt) { Level.ALL_INT, Level.TRACE_INT -> Log.VERBOSE Level.DEBUG_INT -> Log.DEBUG Level.INFO_INT -> Log.INFO Level.WARN_INT -> Log.WARN Level.ERROR_INT -> Log.ERROR Level.OFF_INT -> null else -> null } ``` In the example above I also used another Logback component called `Layout` which I haven't explained yet. It's a measure to separate the message formatting from the appender's logic. I'm going to use Logback's `PatternLayout` to configure the formatting because it's very convenient and reduces the amount of code we need to write. Now, let me show you how to integrate Logback with this new `LogcatAppender`. First, let's add a function that creates `LogcatAppender` and the `PatternLayout`s: ```kotlin fun createLogcatAppender(loggerContext: LoggerContext): Appender { val tagLayout = PatternLayout().apply { context = loggerContext // %nopex prevents stacktraces from being printed in tags pattern = "%logger{0}%nopex" start() } val messageLayout = PatternLayout().apply { context = loggerContext pattern = "[%thread] %msg%n%exception" start() } return LogcatAppender(tagLayout = tagLayout, messageLayout = messageLayout).apply { context = loggerContext start() } } ``` The `tagLayout` above is used to format the tag passed to Logcat, which by convention consists of a class name. While `%logger` would print a fully qualified class name, `%logger{0}` will only print the simple name. `messageLayout` will print the thread name in square brackets followed by the message and the associated exception's stacktrace (if any) after a line separator. *Examine [Logback documentation](https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout) for more patterns. You can also write your own patterns, but I won't cover it in this post.* I added `%nopex` to the `tagLayout` because `PatternLayout` has a nasty feature that implicitly adds the stacktrace of the associated exception to its formatting result (examine `%exception` [documentation](https://logback.qos.ch/manual/layouts.html#ex) for more details). Obviously, we don't want a stacktrace in Logcat's tag. Alternatively, you could subclass `PatternLayout` to disable this behavior and then remove `%nopex` from the pattern: ```kotlin class NoImplicitExceptionsPatternLayout : PatternLayout() { init { setPostCompileProcessor(null) } } ``` Now, go back to the initial code where you obtained a `LoggerContext`. Use it to get the "root" logger and attach the new appender to it like this: ```kotlin val logcatAppender = createLogcatAppender(loggerContext) val rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME) rootLogger.addAppender(logcatAppender) ``` Since Logback [loggers are hierarchical](https://logback.qos.ch/manual/architecture.html), the appenders added to the root logger will be automatically inherited by all loggers e.g. `LoggerFactory.getLogger(Whatever::class.java)`. In short, it means that all logs will be forwarded to `LogcatAppender`. ### Crashlytics Similarly, you can create a `CrashlyticsAppender`: ```kotlin class CrashlyticsAppender( private val layout: Layout, private val logAllExceptions: Boolean, ) : AppenderBase() { override fun append(eventObject: ILoggingEvent) { // Note: you may want to put Firebase.crashlytics.log behind an interface to make this class testable Firebase.crashlytics.log(layout.doLayout(eventObject)) recordExceptionIfRequested(eventObject) } private fun recordExceptionIfRequested(eventObject: ILoggingEvent) { val throwable = (eventObject.throwableProxy as? ThrowableProxy)?.throwable if (logAllExceptions && throwable != null) { Firebase.crashlytics.recordException(throwable) } } } ``` The example above has an additional feature of reporting ["non-fatal" exceptions](https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#log-excepts) to Crashlytics whenever there is a throwable associated with a log event. You can delete the `logAllExceptions` flag and `recordExceptionIfRequested` if you don't need it. Now, you can create the appender with the desired message pattern: ```kotlin fun createCrashlyticsAppender(loggerContext: LoggerContext): Appender { val layout = PatternLayout().apply { context = loggerContext pattern = "[%level] [%logger{0}] [%thread] %msg%n%exception" start() } return CrashlyticsAppender(layout = layout, logAllExceptions = true).apply { context = loggerContext start() } } ``` And finally add it to the root logger: ```kotlin val crashlyticsAppender = createCrashlyticsAppender(loggerContext) rootLogger.addAppender(crashlyticsAppender) ``` ## Results Now, to test this setup, you only need to call `configureLogback()` somewhere (for example, in your `Application.onCreate()`) and add a few SLF4J usages such as: ```kotlin val logger = LoggerFactory.getLogger(MainActivity::class.java) // Somewhere else: logger.info("Clicked") // Somewhere else: logger.error( "Clicked", IllegalArgumentException("Test exception", IllegalStateException("Test cause")) ) ``` You should see the logs in Logcat and, once the logs get sent to Firebase (e.g. due to a crash), in Crashlytics. Here are a few screenshots from my demo app where I tested this setup:
    ![A screenshot of Logcat showing the expected logs](/images/logback-logcat-screenshot.png "")
    ![A screenshot of Crashlytics dashboard showing a non-fatal exception](/images/logback-crashlytics-dashboard-screenshot.png "")
    ![A screenshot of Crashlytics showing the expected logs attached to a crash](/images/logback-crashlytics-logs-screenshot.png "")
    You can find the complete code [here](https://github.com/azabost/android-logback-example/tree/basic-logcat-crashlytics). _I may add more examples to that repo in the future, so make sure to check out the `basic-logcat-crashlytics` branch that will contain the code related to this post only)._ ## Addendum The appenders' code above is incompatible with Logback's XML configuration feature. For example, I'm pretty sure the appenders should have no-argument constructors and public properties as shown in [this article](https://www.baeldung.com/custom-logback-appender). Since I don't intend to configure Logback via XML in Android apps, I decided not to dwell on that topic in this blog post to keep the code simpler. --- *Copyright notice:* *The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the [Creative Commons](https://creativecommons.org/licenses/by/3.0/) 3.0 Attribution License.* ## Choosing the Right Logging Library for Android App *Published: 2024-09-16 | Author: azabost | Tags: android, kotlin, logging* *Source: https://brightinventions.pl/blog/choosing-the-right-logging-library-for-android-app/index.md* **While choosing a logging library for an Android app, I explored multiple options, seeking a flexible solution that is highly configurable, supports multiple logging destinations, and can be dynamically configured at runtime. In this post, I'll share the factors that influenced my decision, some problems I encountered, and the solution I ended up with.** ## The requirements When selecting a logging solution for an Android app, several factors need to be considered to ensure it meets the specific requirements of both the platform and the project. Here are the key aspects I considered for the project I was working on (I'm fully aware your needs may be different): 1. **Android Compatibility**: The library must work on Android, which has certain Java-related limitations. Not all Java APIs are available (e.g. [System.Logger](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/System.Logger.html)), not everything works on low Android versions (such as Lollipop), and some standard logging libraries depend on features unsupported by Android. 2. **Testability**: The logging solution should not interfere with unit testing by requiring additional setup or mocks. Ideally, it should get out of the way, allowing tests to run without having to mock or provide stubs for the logging framework. However, it wouldn't hurt if I could enable some simplified logs in tests to facilitate troubleshooting when needed. 3. **Modularity**: The library should work well across a large codebase split into multiple modules, including non-Android modules (plain Kotlin modules). Also, I wouldn't like the whole codebase to become tightly coupled with the particular logging implementation. 4. **Multiple Logging Destinations**: It should support multiple logging destinations, such as Logcat, remote services (like Logstash, DataDog, or Crashlytics), and local files. I don't want to clutter my code with direct usages of all the APIs (e.g. `Firebase.crashlytics.log("message")`). A single log statement should do the job. 5. **Configuration Flexibility**: The library should offer a high degree of configuration flexibility to meet various needs. For example, I needed to: * configure different logging level thresholds for each destination; * configure different formats of log records for each destination; * handle some logs in a special manner * e.g. report a "non-fatal" error to Crashlytics whenever there's an exception associated with a log record. 6. **Runtime Configurability**: The framework should be configurable at runtime, allowing features such as logging destinations or logging level thresholds to be changed based on user choices, feature flags, or other dynamic conditions. 7. **Proven and Stable**: Last but not least, it would be ideal to use a well-established, battle-tested solution that does not compromise the app's stability or maintainability. Logging is crucial because if anything else in the app malfunctions, the logs are what I rely on to investigate the issue. If the logging system itself is unreliable, debugging other problems becomes significantly more difficult. Given these complex requirements, developing a custom logging solution seemed to be a huge maintenance burden so I decided to explore existing libraries. ## Why Not Use Timber? While Timber is a popular logging solution for Android, it doesn't meet my specific needs. For example, it has a direct dependency on the Android framework, making it unsuitable for use in non-Android modules. Even if there was a multiplatform variant of Timber, it wouldn't meet other criteria related to configuration flexibility. _Actually, the same can be said about the vast majority of logging libraries I reviewed._ ## Why Not Something New? I realize there are a lot of logging libraries out there. Some of them are multiplatform, which by definition means that I should be able to make them work in both Android and plain Kotlin modules. However, the solutions I found were either not as well-established as I wished for or not flexible enough. I hope to see Kotlin Multiplatform logging libraries receive more attention in the future. ## Considering JUL (java.util.logging) At some point, I seriously considered using `java.util.logging` (JUL), but after reading the documentation and several discussions (such as [this one](https://stackoverflow.com/questions/11359187/why-not-use-java-util-logging)) that made strong arguments in favor of SLF4J over JUL, I decided to focus on SLF4J. ## Exploring SLF4J and Its Backends I turned to SLF4J (Simple Logging Facade for Java), which I was already quite familiar with (thanks to our own, simple implementation: [slf4android](https://github.com/bright/slf4android)), but I needed to determine the most suitable backend (AKA "binding") for my needs. After some research, I found that the most flexible options were [Logback](https://logback.qos.ch/index.html) and [Log4j2](https://logging.apache.org/log4j/2.12.x/). While comparing their capabilities, I even learned about some awesome features I would get for free (such as Mapped Diagnostic Context) if only I could make them work in my project. By the way, using SLF4J brings more benefits, such as the ability to process logs created by other libraries, potentially giving even more context for troubleshooting production issues. I think this diagram explains it well:
    ![A diagram showing that both your code and libraries that you use in your app can use a single API (that is slf4j-api) which then delegates the logging to a particular backend (such as Logback or Log4j2)](/images/slf4j-diagram.png "")
    _There are certainly more benefits to using SLF4J, but I'm not going to cover all of them in this post._
    ![All your logs are belong to us](/images/all-your-logs.png "")
    ## Log4j2: A Dead End for Android Log4j2 initially seemed promising, especially when I learned about its [Kotlin-friendly API](https://logging.apache.org/log4j/kotlin/index.html), but I quickly ran into compatibility issues with Android. When I added the dependency, the build failed with the following error: ``` MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26): Lorg/apache/logging/log4j/util/ServiceLoaderUtil;callServiceLoader(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/Class;Ljava/lang/ClassLoader;Z)Ljava/lang/Iterable; ``` I discovered that Log4j2 requires Java 8 so I hoped that enabling [core library desugaring](https://developer.android.com/studio/write/java8-support) would solve the problem, but it turned out that these specific APIs are not supported below Android O. Since I couldn't increase the minimum Android API level to 26, I moved on to Logback. ## Logback: Initial Challenges At first, I encountered a similar issue with Logback: the latest versions require Java 11 and APIs unavailable on Android. This resulted in a runtime crash with the error: ``` java.lang.NoSuchMethodError: No virtual method getModule()Ljava/lang/Module; in class Ljava/lang/Class; or its super classes (declaration of 'java.lang.Class' appears in /apex/com.android.art/javalib/core-oj.jar) ``` I also found an [Android-specific fork of Logback](https://github.com/tony19/logback-android) that resolves some of these compatibility issues and provides features tailored for Android. However, this fork introduced several problems, such as: * **Lack of Clarity on Compatibility**: There is ambiguity regarding its compatibility with the classic Logback library; the versioning scheme was changed at some point without explanation. * **No Binary Compatibility**: The fork is not binary-compatible with the classic Logback library, which can make running unit tests for logging configuration on the JVM (that is, without [Robolectric](https://robolectric.org/)) either impossible or cumbersome ([issue reference](https://github.com/tony19/logback-android/issues/365)). * **Unoptimized ProGuard Rules**: I realized the current version contains [unoptimized ProGuard rules](https://github.com/tony19/logback-android/blob/d6ed2017fb87e30e8b32d794523ac29c24123c87/logback-android/consumer-rules.pro) that unnecessarily keep much more code than I needed (it almost completely disables code shrinking for the whole library). * **Limited Maintenance**: The author (a sole maintainer) seems to have limited time to address the existing problems, as noted in a [discussion thread](https://github.com/tony19/logback-android/discussions/329). ## The Solution: Logback 1.3.x Eventually, I discovered from the [Logback documentation](https://logback.qos.ch/dependencies.html) that the older `1.3.x` branch of Logback is compatible with Java 8 and appears to be maintained. After switching to this version, I made a few necessary adjustments, such as adding ProGuard rules: ```proguard # We don't use servlets in Android so R8 will erase that piece of # Logback from the release APK. We can safely ignore the warning # about a missing class. -dontwarn javax.servlet.ServletContainerInitializer # When Logback parses the log patterns such as "%msg" it looks # for the appropriate converters mapped to the keywords (such as "msg") # and instantiates them via reflection. Therefore, all the classes # which implement Converter interface must be kept in the release APK. -keep class * extends ch.qos.logback.core.pattern.Converter ``` and modifying packaging options: ```kotlin packaging.resources.excludes.add("META-INF/INDEX.LIST") ``` I also kept the desugaring enabled. With these changes, I successfully integrated SLF4J and Logback into my Android project, and it allowed me to cover all the requirements with ease. _For the record, [here's the link](https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.3.14) to the specific Logback dependency I used._ ## A Man Dancing with Code. Meet Piotr *Published: 2021-11-03 | Author: piotr | Tags: bright story, leadership* *Source: https://brightinventions.pl/blog/piotr-team-leader-technology-evangelist/index.md* **Piotr is a bright team leader. Some would say that he is our tech dad, always ready to assist you. He asks and asks questions to test your approach and as a result brings the best possible solution out of you! The clients' dream is to clone him but probably he is the only one who could figure that out. Meet Piotr, a programmer with over 15 years of experience who always remembers that behind every line of code there's a human.** ![Piotr Mionskowski – Team Leader at Bright Inventions](../../static/images/blogpost_brightstory_piotr_b3.png) ## From a junior to tech evangelist. How did it all begin? First ever language that I learned was Logo Komeniusz which was a typical programming language that was taught in Polish middle schools. Then at highschool I learned some Turbo Pascal. I probably would not be a developer if it had not been for my highschool IT teacher - Ryszard Szubartowski. He had unusual teaching methods. During our first or maybe second classes in high school he told us to resolve tasks that were meant for competitors of national IT championships. Many F grades were given then so obviously some parents were not happy with that. But for many of us, me included, these tasks were so inspiring that we just wanted to learn more about solving challenges using mathematics. Because that basically was IT for me then. **I loved proofs and logical deduction. I always loved to solve puzzles and the idea to build something virtual really spoke to me**. Then I figured out that this was something that I could do for a living. Therefore after graduating high school I went to Computer Studies at Gdańsk University of Technology. ## I noticed that your first Github commit was the game application Phutball – philosopher's football. Can you tell us more about it? [The Phutball project](https://github.com/miensol/Phutball) was a part of my master’s thesis. My thesis was in fact about mathematical chances to predict when various games end. Phutball is an example of the game that is hard to predict if your next move is going to be the winning one. It is easier to logically prove that in terms of games like chess, Go or checkers. ## When did you decide to find your first job as a programmer? Somewhere between my third and fourth year of studies I started to look for my first job in software development industry. Back then it was not easy to find one. I was at my first job for a short period of time and then I joined a corporation in Gdańsk. I met many experienced developers there who were following hot trends regarding project management, involving Agile which was not so popular in Poland back then. When I was starting not many people heard about test-driven development. Now it is common. First, I programmed in C# then I learned JavaScript, Ruby and Objective-C. It fastly became clear to me that **when you learn one paradygmat in programming then it is easy to use this knowledge to learn other languages in that paradygmat**. **I tried not only to focus on learning programming but also to understand how our components take place in the system architecture**. Now we call it microservices then it was called service-oriented architecture (SOA). After a few years I felt that I needed a change. It was hard to have influence on things working in a corporation. And I could see how much can be achieved in small teams so I wanted to join a smaller company. And that is how I came to [Bright Inventions](/). ![Piotr Mionskowski – Technology Evangelist at Bright Inventions](../../static/images/blogpost_www_brightstory_piotr_b2.png) ## You have around 35k total reputation on Stackoverflow. Only about 7k users are on your level. How did that happen? Really? It is actually hard to believe that I am in such a small group. I guess that after moving from C# to JS stack I was shocked how Java is vast compared to C#. Of course, there were libraries that helped to manage that. Yet **when I met Kotlin it seemed that this is a perfect combination of both systems**. Its compatibility with libraries and source code of Java was so high that as a result my productivity increased. It was much easier to write code in Kotlin than Java. Now this gap between both languages has been minimised. But then I thought that Kotlin was such a great option and yet still not many people knew it. So I dedicated my time to help people who wanted to know Kotlin. I tried to answer as many questions as I could about Kotlin on Stackoverflow. I think when it comes to [Stackoverflow](https://stackoverflow.com/users/155213/miensol) reputation you cannot cheat the system. You have to be systematic about it. Answer every possible question you know the answer to. And be patient enough to wait for your reputation to grow. ## What are your predictions on trends for software development for 2022? The main trend that I see is that **programmers are becoming more and more responsible for managing backend infrastructure or even setting up cloud services on their own**. Cloud providers modify their products to make them more accessible for developers. DevOps are not as necessary as they used to be. They are still needed naturally, but we used to ask them to do the configuration for us and now we can do it by ourselves. Another strong trend is **moving to higher and higher levels of abstraction in terms of developing backend systems in the runtime environment**. What I mean by that is using more and more [serverless technologies](/blog/why-you-should-go-serverless-with-your-apps/). Tools and frameworks we use make us use more functional programming. We can see that especially in frameworks like React or Compositional AI. ## Why do we work with AWS at Bright Inventions? When should we choose AWS or Azure? There is not a great story behind it. We use AWS because we know it. **🙂** It is like driving on the left side of the street in England or Australia. It is just how they learned so they do it that way. At Bright Inventions we started with AWS so we stuck to it. I do not think that it would make a great technical difference if we used Azure or other cloud services instead of AWS. Looking from a business perspective it does not matter as well. ## What best practices do you follow when writing a code? **We should write code keeping in mind people who are going to read it. First, we have to focus on the recipients of our code, not on efficiency or pace of writing it.** It comes from the fact that code is more often read than written. If you optimise it too early, you usually complicate it, which makes it more difficult to understand it. It is definitely something very difficult for developers. **It often might be hard to present in the code what we wanted to achieve**. For your programs it might be irrelevant – application does what you told it to do so it seems fine. You did your job. So, we often do not think if we could write it differently so our code would be better understood by humans. Thus if the next person comes and reads our code, they will understand what we wanted to do. Often we do not have time for that because the program works the way we wanted it to work so why should we bother? But in a longer perspective – we should care! You can see a value years from now. When someone new has to take a look at it after years to understand the reasons why this code was made, then we have an issue. Especially when we plan to develop our solution for years, then we have to write code for future readers. ![Piotr Mionskowski – Technology Evangelist at Bright Inventions](../../static/images/blogpost_www_brightstory_piotr_q2.png) ## Can everybody be a software developer? I think **everyone who wants to be a developer can become one**. I remember that when I started to learn I felt really frustrated. Now you have access to lots of materials, guides, tutorials and more. When I was starting there was not even Stack Overflow so imagine how long ago that was. 😉 I think now it is easier because there is access to this knowledge. It is up to you if you are motivated enough to go through this. If you want, you have every possibility to learn. Of course, you have to dedicate lots of your time to achieve your goals but I guess that is typical for many industries. You do not become a lawyer in 2 days. That is a process for programmers as well. You have to learn and train systematically. After some time it can give you lots of satisfaction when you finally feel the power to solve some problems in the virtual world. ## What projects you have worked on bring the best memories? **I always enjoyed projects that I truly believed in and felt that they solve real problems.** For example, when we were developing at Bright Inventions an [app supporting taking medicine](/projects/emar-healthcare-solution/) it was really interesting to understand older people's interaction with the phone. It gave me a unique perspective on our app users. ![Piotr Mionskowski – Team Leader at Bright Inventions](../../static/images/blogpost_www_brightstory_piotr_q1.png) When we were working on a system gathering data about discounts at stores we could also learn more about human shopping behavior. That was also very interesting. **Another interesting case is building an [EPOS system for restaurants](/projects/system-for-restaurants/)**. This is a software used for 8 hours a day by employees of restaurants. They completely rely on our work. It is not a lifestyle app that gives us pleasure but is necessary to do our work. In the case of ePOS systems, our priorities are stability and ensuring business processes even despite the obstacles like Internet connection disruptions. If Facebook does not work, we can go for a walk. **If the ePOS application does not work, we have a line of frustrated end users that cannot pay for their orders**. So, the level of stress is much higher. Also, we cannot do changes in the interface just like that. As I mentioned, our clients use it for 8 hours a day and have strong habits associated with the app like that. The user's memory is massive here. If you move one button, you can totally disturb their daily work. Every change on the product must be reasonable because it will affect your users. **Feeling the responsibility for users is a crucial part of our job as software developers**. ## What do you do after work? Recently I got into joinery. I took my first steps by building woodshed but I plan to build more. Like many people at Bright Inventions I love jogging. After work I also learn to stay up to date. I like to watch good movies as well. One that I recently enjoyed was “Fury” with Brad Pitt. It was not another movie about WW2. It brought a new perspective to the table. ## Don't let your mind steal your time *Published: 2018-11-18 | Author: ula | Tags: productivity, tips, procrastination* *Source: https://brightinventions.pl/blog/dont-let-your-mind-steal-your-time/index.md* Josh Billings, or if you prefer - Henry Wheeler Shaw, said once that "the greatest thief this world has ever produced is procrastination, and he is still at large". I am rather a well-organised person and I try not to delay anything. To be honest, there are rarely moments that I put off things that I have to do. I just do not like the feeling when there are some open task floating around in my mind. But I also know that many of us do not posses this inner drive, or just lose it at some point of our life. [ Procrastination can often make us miserable. It steals our time, money, and first of all satisfaction. ](https://www.psychologicalscience.org/observer/why-wait-the-science-behind-procrastination) ## how does procrastination work? Procrastination stems from various thoughts and habits, mainly because we anticipate not enjoying a task or fear we won’t do it well. This avoidance is often fueled by confusion, distraction, or fatigue. **Psychologists link procrastination to factors like low self-confidence, anxiety, lack of structure, and difficulty motivating oneself to tackle unpleasant tasks. Research also connects procrastination with rumination, where people become stuck in negative thought patterns.**
    ![procrastination](/images/1_9ce_8kqd8i60zfjwqqpnaa.gif "")
    ###### source: https://medium.com/@rathinamala23/the-psychology-of-procrastination-insights-and-solutions-806aa2e1250a Procrastination, while self-defeating, can serve a psychological purpose. For perfectionists, it shields them from fear of failure, judgment, and self-criticism. By focusing on less important tasks, like organizing or cleaning, procrastinators avoid the discomfort of unfinished work, though this often may lead to problems later. **Productive procrastination refers to engaging in other useful activities while intentionally delaying the main task at hand.** Why do we believe we'll follow through on tasks later? This is due to **affective forecasting,** where people often misjudge how they’ll feel in the future. **For instance, procrastinators might feel bad about not exercising today but convince themselves they’ll do it tomorrow, thereby avoiding immediate negative feelings while perpetuating the cycle.** Another key factor in chronic procrastination is present bias, which involves favoring immediate rewards over long-term benefits. Procrastinators often dive into the pleasurable activities in the short term, even at the expense of delaying important tasks. **This tendency to seek immediate gratification can perpetuate a cycle of procrastination, where the immediate rewards of putting off tasks overshadow the long-term advantages of completing them on time.** [Procrastination is a complex behavior studied by psychologists and researchers. ](https://www.arc.unsw.edu.au/blitz/read/The-Science-Behind-Procrastination)Understanding the neurological processes behind procrastination can also help us grasp why we procrastinate and how to overcome it, ultimately enhancing our productivity and well-being.
    ![procrastination dopamine](/images/procras_resum_en-768x446-1-e1649087572500.jpg "")
    ###### source: https://neuroquotient.com/en/procrastination-neuroscience-to-understand-and-overcome-it Dopamine, a brain neurotransmitter linked to the reward system, influences procrastination by driving motivation and reinforcement. Completing tasks triggers dopamine release, offering a sense of reward and satisfaction. Procrastinators often miss out on these immediate rewards by delaying tasks, leading to a cycle of seeking instant gratification from other activities that provide quicker dopamine boosts. **Always try to understand why you do not want to accomplish a particular task. Understanding real reasons behind your behaviour will make it much easier to approach the whole problem.** Sometimes we can create many stories in our mind that are far from the truth. Maybe a project we are working on is not so bad and complex as we think. Maybe we have enough time to do everything, but we are poor at organising our time. We are great storytellers. Think why you really don’t want to do something. ## what can we do not to let this powerful thief steal the greatness of our life? I usually have a schedule that I follow, sometimes I take advantage of a simple to-do-list (paper or online one), or **if I find myself running around putting out fires all day, I use [Eisenhower Matrix](https://todoist.com/productivity-methods/eisenhower-matrix).** But apart from that I apply also a few rules that help me stay focused and engaged. ⭐️ I try to do firstly tasks that may be not so enjoyable, but they still have to be done. In that way things that I really want to do are done later and become a kind of reward for doing hard stuff first. ⭐️ **Let us eliminate all possible distractions because if you want to be distracted, you will be distracted.** Scrolling social media, ad hoc responding to emails, checking all possible push notifications - when a difficult or tedious task comes, everything seems to be more important than that. Do not let procrastination pit-stops disturb your work. Switch them off and only after finishing a predetermined tasks check them out. ⭐️ Make sure you sleep well. Really! Fatigue and a lack of energy are the best friends of procrastination. How you can work on a demanding task as you have problems with getting up from a bed. ⭐️ Change your environment. Sometimes your desk is not the best place to focus on a difficult task. Different workplace may have a different effect on your productivity. Try what is good for you. I sometimes prefer working while sitting on a floor and I do not see anything weird about that. ⭐️ A little anxiety and adrenaline is ok. It is good when your deadlines are a bit strict. It helps us stay motivated and engaged instead of putting things off. Think what may happen if you do not complete your task on time. For me the feeling that I have not tried enough is the worst one. ⭐️ Be among people who inspire you. Spend time with people who trigger and motivate you. You will notice that even if you are a real bellyacher, you will stop complain at one point and burdensome tasks will become much easier. ⭐️ Tell people about your goals and clarify what your goals are indeed. Be sure they will ask about a current status of your work. ⭐️ Reward yourself. Yes, that is right. Plan a reward for yourself. Looking forward to a reward for completing a task can be genuinely motivating. Sure, I mean some small rewards like 15 minutes of reading your favourite blog or listening to a podcast you like. But remember that rewards are rewards - you should earn them. ⭐️ Last but not least, it is just good to always have a to-do-list with deadlines when a particular task has to be finished. It helps to prioritise what we should accomplish in the beginning. Always try to place the most demanding things first in your list. I know that it does not sound great, but believe me it really pays off. Which rule helps the most? In my view - each and every, but crucial is your self-awareness. Procrastination is all about being conscious of our actions. Apprehending why we do not want to do something may change everything. **It is not true that now it is not the best time for doing a task. We are making it "not the best time" because of hundreds of reasons. There will be never the best time to accomplish something.** Everything depends on our attitude. We can do whatever we want. We can also waste our time grumbling, hypothesising, idealising, strategising, but in the end it boils down to taking action. And if we do not take any action, nothing will happen. If you want to get something done, get grip on yourself, find the way and do it.
    ![funny procrastination](/images/447471994_989220133210240_2438864244480586667_n.jpg "")
    ## Preserving Unobfuscated Class Names in SLF4J Logs *Published: 2024-09-11 | Author: azabost | Tags: android, kotlin, logging, proguard* *Source: https://brightinventions.pl/blog/preserving-unobfuscated-class-names-in-slf4j-logs/index.md* **In this post, I'll share a problem I encountered while introducing the [SLF4J](https://www.slf4j.org/) and [Logback](https://logback.qos.ch/) into an existing Android project integrated with Logstash for remote logging. This setup was effective for monitoring and debugging, but the use of [code obfuscation](https://developer.android.com/build/shrink-code) tools like R8/ProGuard caused log messages to be hard to trace back to their source due to obfuscated class names. Here's how I solved this challenge and the trade-offs we considered.** ## Problem Overview The project was integrated with [Logstash](https://www.elastic.co/logstash) using a custom solution that sent log messages for analysis in [Kibana](https://www.elastic.co/kibana). When we introduced SLF4J as a logging facade, a specific issue arose: the Logstash integration had no mechanism to de-obfuscate the class names used in SLF4J loggers which appeared obfuscated in the log messages visible in Kibana, making it challenging to understand where the logs originated from. This made the logs less useful for debugging and monitoring production issues. ## Logging scenarios Since the project was entirely in Kotlin, we identified three main logging scenarios: 1. Logger as a property of a class. This approach is used in singletons or other classes with relatively few instances. Here’s an example: ```kotlin class MyClass { private val logger = LoggerFactory.getLogger(MyClass::class.java) } ``` 2. Logger as a property of a companion object. This method is most useful for classes that have many instances, such as `data class`, but can be used in other places too: ```kotlin data class SomeData(val id: String) { companion object { private val logger = LoggerFactory.getLogger(SomeData::class.java) } } ``` 3. Logger as a top-level property for top-level functions: ```kotlin private val logger = LoggerFactory.getLogger("com.example.SomeUtilities") fun doSomething() { logger.debug("Doing something") } ``` ## Alternative solutions considered To address the obfuscation issue, we considered two main approaches: ### Preserving original class names using R8/ProGuard rules The primary solution was to use custom ProGuard rules to prevent the obfuscation of class names specifically for the classes containing SLF4J logger instances. * Pros: This preserves the original class names in log messages, making them easier to trace back while allowing the rest of the code to remain obfuscated. * Cons: It does expose some class names, but only where logging is essential, which was deemed an acceptable trade-off in our context. ### Hardcoding logger names Alternatively, instead of passing a class to `LoggerFactory`, we could always hardcode the logger names. * Pros: This method would preserve the class name in the logs without exposing the actual class names directly in the obfuscated code. The hardcoded strings still expose the names, but it is somewhat harder for an attacker to figure out compared to directly keeping the original class names unobfuscated. * Cons: It would be cumbersome to maintain in a large codebase, introducing risks of typos and inconsistencies. After discussing both approaches with the team, we decided on a general rule: to use custom ProGuard rules to preserve the original names only for classes with SLF4J loggers. However, we decided to deviate from this rule in the specific scenario of top-level functions, where we chose to hardcode the names if needed. ## Custom ProGuard rules Here’s how I implemented the chosen solution: ```proguard # Don't obfuscate the names of classes containing a Logger. -keepclasseswithmembernames class * { org.slf4j.Logger *; } # Don't obfuscate the names of enclosing classes when their companion objects contain a Logger. -if class **$* { org.slf4j.Logger *; } -keepclasseswithmembernames class <1> ``` After applying these rules, I rebuilt the project and verified that the log messages in Kibana displayed the correct, unobfuscated class names. Additionally, I ran `dexdump` on the DEX files from the unzipped APK to confirm that everything else in the classes affected by the ProGuard rules remained properly obfuscated. I also compared the `mapping.txt` files generated before and after this addition to ensure there were no unwanted side effects from the new rules. ## Outcome and Benefits By applying these custom ProGuard rules, we achieved the following: * Readable Logs: Preserved original class names in log messages for better traceability during production issue investigations. * Controlled Exposure: Exposed only the necessary class names, minimizing the risk of reverse engineering. * Maintainability: This solution required fewer changes and was easier to maintain than hardcoding logger names. ## Conclusion When integrating SLF4J into an Android project with a remote logging setup (like Logstash), it's essential to balance readability, security, and maintainability. We found that preserving class names using ProGuard rules was the best solution for our needs, while hardcoding logger names for top-level functions was a suitable exception to our general approach. However, other teams might choose differently, depending on their project's specific requirements and constraints. ## Women’s Health Tech: Addressing Long-Ignored Needs *Published: 2024-09-06 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/women’s-health-tech-addressing-long-ignored-needs/index.md* **Do women need to be treated differently? This question is gaining attention. Despite years of striving for equal treatment, there's now a push to tailor approaches to women's specific needs. This isn't about preferential treatment, but empowering women to take charge of their own health.** **Studies show that women often downplay their symptoms and delay seeking medical care due to [cultural and psychological factors.](https://ajph.aphapublications.org/doi/full/10.2105/AJPH.94.12.2050) They prioritize their family's health over their own and face competing responsibilities like childcare and work. Many [normalize symptoms](https://psycnet.apa.org/record/2011-06885-005) related to menstruation, menopause, or mental health as a normal part of life rather than potential health issues. Additionally, [stigma, embarrassment, and the belief that they should manage these issues independently](https://www.nimh.nih.gov/about/organization/dar/stigma-and-discrimination-research-toolkit) further discourage them from seeking care.**
    ![claudia pastides flo](/images/baner_final-quote-claudia-wh.png "")
    Furthermore, [research shows significant differences in how male and female bodies respond to exercise, medical treatments, and supplements.](https://www.researchgate.net/publication/366890228_Advancing_feminist_innovation_in_sport_studies_A_transdisciplinary_dialogue_on_gender_health_and_wellbeing) Historically taboo topics like menopause, menstruation, and the postpartum period are crucial aspects of women's lives, yet they have been overlooked for too long. Thankfully, many initiatives are now **focusing on women's health.** This year’s [HLTH Europe Conference in Amsterdam](https://europe.hlth.com/) gave a special place for womens health related topics, localising the stage dedicated to female health related topics in the center of the conference area and naming it “Heart” stage. There were presented innovations like Discovering Hands, which empowers blind women while aiding in breast cancer detection, and Flo Health, which helps women understand their bodies better, are making significant impacts. The organizers of the conference didn’t miss tough topics like rape and sexual harrasement prevention.
    ![hlth europe conference](/images/frame-2608395-1-.png "")
    Many organizations today focus on women's health, including: * **[World Health Organization (WHO)](https://www.who.int/health-topics/women-s-health)**: Promotes global women's health, addressing reproductive health and gender-based violence. * **[Planned Parenthood](https://www.plannedparenthood.org)**: Provides reproductive health care and education in the U.S. and worldwide. * **[National Women's Health Network]()** (NWHN): Advocates for women's health policy and provides reliable health information. * [**Society for Women's Health Research** ](https://swhr.org)(SWHR): Improves women's health through research, advocacy, and education. * **FemTech Focus**: Advances global women's health through technology and startups. ## Things to consider while developing a FemTech product ### **1. Importance of accurate medical information** Accurate medical information is crucial in women's health, particularly when developing software products aimed at this demographic. Given the unique health challenges and conditions specific to women, such as menopause, reproductive health, and pregnancy, it's vital that the information provided through these platforms is precise, well-researched, and validated. This ensures that women can make informed decisions about their health and receive appropriate care and support. **Inaccuracies or generalizations can lead to misdiagnosis, inadequate treatment, and increased anxiety among users,** emphasizing the need for stringent accuracy in health-related software.
    ![claudia pastides on medical accuracy at flo](/images/baner_final-quote-claudia-wh-1-.png "")
    ### 2. **Addressing taboo topics like menopause and reproductive health** For years, discussions around these important life stages were avoided, yet they significantly impact women's health. Today, health tech is breaking these barriers by offering tools and platforms like [Flo](https://flo.health), [Clue](https://helloclue.com/), [Maven Clinic](https://www.mavenclinic.com), [Peppy Health](https://peppy.health), [Kindbody](https://kindbody.com) that empower women to manage their health proactively. These innovations provide accurate, personalized information and support, helping women make informed decisions about menopause, menstruation, and reproductive health without the constraints of past stigmas. This shift not only promotes better health outcomes but also **fosters a more inclusive dialogue about women's health needs.** ### 3. Patient engagement [Patient engagement](/blog/delivering-patient-engagement-platform/) is key in [**FemTech** applications](/blog/keys-to-succeed-in-femtech/), where **consistent interaction is naturally supported by the cyclical nature of women's health issues** like menstruation and menopause. To meet the specific needs of women, especially during significant life stages such as pregnancy and postpartum, FemTech apps must offer highly personalized experiences. Detailed **onboarding processes** can enhance this personalization, making users feel their unique health journeys are genuinely understood and catered to ([check out a story of a possible failure in an onboarding process in FemTech app](https://brightinventions.pl/blog/data-driven-development-femtech-app-onboarding/)). Moreover, **building trust** is essential, as women input sensitive and intimate data into these apps. **[FemTech wearables](https://news.abplive.com/technology/gadgets/femtech-how-innovation-in-wearables-is-shaping-future-of-female-health-wellness-garmin-1715208)** also play a critical role, offering daily support through devices that monitor menstrual cycles, fertility, and other health parameters. These devices not only foster daily interaction but also empower women to manage their health proactively, ensuring they receive the most accurate and relevant health information.
    ![aahuti rai on womens health](/images/baner_final-quote-aahhuti-3-.png "")
    **As we continue to advance in the field of women's health tech, it's clear that the focus on developing solutions tailored to the unique needs of women is not just a necessity but a priority. By addressing long-ignored needs and breaking down taboos around topics like menopause and reproductive health, we pave the way for more inclusive and effective healthcare.** **The efforts of various organizations and innovations in this space promise a future where women's health issues are no longer sidelined but are addressed with the attention and care they deserve.** ## Building Trust Through Code. Meet Dominik *Published: 2024-09-05 | Author: dominik-d | Tags: bright story* *Source: https://brightinventions.pl/blog/building-trust-through-code-dominik/index.md* **He left a successful career in civil engineering to join the world of software development, hoping that every new day would bring interesting problems to solve. He wasn’t disappointed! Discover what civil engineering and IT have in common, how software developers build trust with their code, and which book he recommends – though with a cautionary note. It’s time for the career story of Dominik, Senior Fullstack Developer at Bright Inventions.**
    ![Dominik story grid](/images/brightstorydominikdgrid.png "")
    ## When did you write your first "Hello world"? It was in high school, **in the early 2000s**. Our computer science teacher tried to teach us some programming. The classes inspired me to explore the subject at home, so I asked my dad if he had any resources because he was keen on computers. He gave me a rather thick book about Visual Basic, and I managed to create two applications that actually worked. In the meantime, I dabbled in creating simple websites, mostly blog templates, because back then, having a blog was a sign of being a respectable person on the internet. :) However, at some point, **I got bored of it and put programming on hold for another twelve years**. At some point, I even thought about applying to computer science studies, but my grades weren't sufficient, so I studied civil engineering instead and pursued a career in this field. ## How long did you work in civil engineering before joining the IT world? **I worked at a planning and design firm for 10 years**. However, after 9 years, I felt I had enough and needed a change. Since programming had always interested me, I decided to try to learn it on my own after hours. It was a risk, but fortunately, it paid off. At that time, **many people questioned why I would want to change my stable career, especially after turning 30**. I’m glad it turned out well for me. ## Do you miss civil engineering? Not at all. ## Okay, but did this previous career help you in software development? Yes, in some sense the principles are the same – **both civil engineering and software development are about problem-solving**. The difference is that as your expertise grows in construction, you accumulate solutions for problems you face, and are ready to tackle most of them. **In software development, even with years of experience, you can still encounter issues that will keep you on your toes for days**.
    ![quote](/images/dominik_quote_experience.png "")
    Also, having close contact with clients in civil engineering has been beneficial in software development, especially in terms of **negotiating skills** and **the ability to explain technical issues** to people without a technical background. ## So what are your tips for explaining to people without technical knowledge which software solution will be better? It depends on the issue, but usually, I try to present the problem from a business perspective. In some cases, **clients desire overly complicated features, which might lead to more errors needing later fixes**, thus increasing the software development workload that could have been allocated to other features. Therefore, **I always propose an alternative – a simpler solution, achieving the same goals, that will consume fewer resources and be less prone to bugs**. Highlighting the aspects of time and money helps non-technical stakeholders make informed decisions.
    ![During the Ehab Tribe Summit with the Bright Inventions team in Sweden.](/images/team_dominik_sweden.png "")
    *
    During the Ehab Tribe Summit with the Bright Inventions team in Sweden.
    * ## You are a part of the team developing a mental health solution. How does this influence your daily programming work? At first glance, code is just code to programmers, and it might not seem to matter what industry the app represents. However, with healthcare, it’s not that simple. **We focus much more on subjects such as privacy and anonymity**. When app users, who may be dealing with mental health issues like depression or anxiety, download the app, they need to trust it. They won't do this if the app is full of bugs, UI issues, and other problems. So, **everything we do either builds trust or risks destroying it**. This definitely distinguishes mental health solutions from other types of apps, like entertainment ones.
    ![quote](/images/dominik_quote_trust.png "")
    Feeling this responsibility, I really appreciate being part of the product development process, where **we work closely with the client to come up with solutions** that not only help scale the product but also maintain our users' trust. ## You joined Bright Inventions as a frontend developer, but you also have experience with the backend. Do you consider yourself a fullstack developer? When I decided to make a career switch, I initially chose frontend development because I had some experience in building websites. I understood HTML and CSS, which I thought would help me at the beginning. I also enjoyed the fact that with frontend development, you can quickly see the effects of your work. However, after concentrating solely on frontend for three years, it started to feel tedious, and I wanted to understand the development process more holistically. **It's the best situation when I get to build a feature from start to finish as a fullstack developer**. So, I would definitely consider myself a fullstack developer now – I wouldn't want to choose just one. Fullstack development is much more stimulating and offers more learning opportunities. ## You joined Bright Inventions almost 3 years ago. Do you enjoy working here? I'm happy working here. So far, **I've met only fantastic coworkers**. It’s also clear that Ula and other managers genuinely care about the employees’ overall well-being, ensuring that we have opportunities to continue developing.
    ![During office Christmas party.](/images/team_dominik_christmas.png "")
    *
    During office Christmas party.
    * ## I know you are a bookworm. What book would you recommend to programmers that isn't about programming? I highly recommend “**Thinking, Fast and Slow**” by Daniel Kahneman, though I must warn you – it might leave you second-guessing yourself! It’s a fascinating read that can quickly give you a sense of imposter syndrome. Once you delve into it, you realize how "weak" our brains can be, making it challenging to hold firm opinions because you become aware of how easily you might be misleading yourself. ## Exploring ESC/POS: Integrating Point of Sale Printers *Published: 2024-08-28 | Author: szymon-g | Tags: POS, development* *Source: https://brightinventions.pl/blog/esc-pos-integrating-point-of-sale-printers/index.md* **During [POS software development](/blog/pos-software-development-guide/) for our client, we encountered several unexpected challenges with POS printers that weren't fully addressed by the manufacturer's documentation. From understanding the basics of ESC/POS commands to implementing advanced features like adding a 'buzzer' function on printers that seemingly don't support it, this tutorial shows how to overcome various hurdles while integrating thermal printers with a POS system.**
    ![pos printer integrations](/images/pos_printer_integrations_blog_cover.png "")
    ## What is ESC/POS and what does it involve? ESC/POS (Epson Standard Code for Point of Sale) is a popularly used communication protocol designed by Epson. The main purpose is to improve the printing process of receipts. The protocol is based on sequences of commands that control the printer without the need for drivers or other configurations. This makes ESC/POS an efficient and flexible solution ## Why use ESC/POS at all? When developing a POS app, the decision to use esc/pos was immediate, we didn't even give it a second thought. Some pros of using esc/pos: * **Compatibility**\ The ESC/POS protocol is supported by the majority of commercially available fiscal printers. Therefore, regardless of the manufacturer, most printers will be compatible with our system.  * **Ease of integration**\ In legacy software, typically printers are connected to Windows via a cable and additional driver installation and management is required. In our new cloud-based approach, the mobile app can connect wirelessly directly to the printer by sending esc pos commands. This greatly simplifies the process of setting up and using printers. * **Technology-independent**\ ESC/POS is based on sending data to a specific port and IP regardless of the technology. This ensures that whether you are using Kotlin, Swift, Flutter or another technology each supports sending network data so it supports sending ESC/POS commands. ## ESC/POS documentation ### **What can we expect?** ESC/POS defines a standard for printing but documentation may vary depending on who manufactures the printing hardware. Even when you decide which manufacturer you will use there still may be some differences between the models. ### **Documentations - Epson**
    ![Documentations - Epson](/images/blog_epson_docs.png "")
    As you may assume the best [documentation](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/index.html) is provided by the protocol creators - Epson. All commands are neatly provided in specific categories. You even have step-by-step receipt printout [examples](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/receipt.html) which should cover most of the basic use cases. And last but not least - you have a [list](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/applicables.html) of printers that support a specific method. So if you have to deal with Epson devices - lucky you : )
    ![applicable printers](/images/blog_applicable_printers.png "")
    ### **Documentations - others** Other manufacturers provide (or do not) documentation that isn’t as good as Epson’s. The printers that were used on our project didn’t have any documentation regarding ESC/POS commands. They were mainly used as printers connected via USB so the manufacturer driver took care of all the communication and configuration. In our case, we were communicating with sockets via the local network and we were using mobile devices as a source of printing so we were solely depending on the ESC/POS standard. One documentation worth mentioning is [this](https://escpos.readthedocs.io/en/latest/home.html) one. It’s nicely formatted and includes all the basic commands that are used in most cases. ## ESC/POS commands ### **Test printout** This is a test printout that we have implemented in our app in order to check if defined fonts, margins, aligning work properly on a specific printer - it’s a must because of different device specifications and differences in ESC/POS interpretations that I’ve mentioned before. 
    ![ESC-POS commands](/images/blog_receipt.png "")
    Ok, so how does the printout look like in ESC/POS commands?\ Let’s go through a couple of the first lines of bytes that are being sent to the printer: * \[27, 64] - command initializing the printer [ESC @](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_atsign.html) * \[27, 83] - setting standard print mode [ESC S](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_cs.html) * \[27, 82, 7] - setting character set  [ESC R](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_cr.html)  * \[27, 116, 49] - setting code table [ESC t](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_lt.html)  * \[27, 36, 0, 0] - set absolute print positions [ESC $](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_dollarssign.html) * \[29, 76, 0, 0] - set left margin [GS L](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/gs_cl.html) * \[29, 87, 248, 1] - set printing area width  [GS W](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/gs_cw.html) * \[27, 36, 0, 0, 27, 97, 49, 28, 46, 27, 116, 49, 70, 111, 110, 116, 83, 105, 122, 101, 46, 115, 109, 97, 108, 108, 10] - finally a printing line that’s visible as a first line of the test print! * 27, 36, 0, 0 - again setting absolute position to 0 (we duplicate some of the commands just to be sure that each text line is configured correctly * 27, 97, 49 - center justification [ESC a](https://download4.epson.biz/sec_pubs/pos/reference_en/escpos/esc_la.html) * 27, 116, 49 - again setting code table * 70, 111, 110, 116, 83, 105, 122, 101, 46, 115, 109, 97, 108, 108, 10 - which converted to ASCII is “FontSize.small” ### **Fonts** Every ESC/POS printer has a predefined set of [fonts](https://escpos.readthedocs.io/en/latest/font_cmds.html#select-character-font-1b-4d-rel-phx). This may be different based on the printer specification.  In order to perfectly align your printouts you need to check your printer possibilities when it comes to print area width, DPI (dots per inch) and font configuration. In our project, we calculate how many characters we can fit in a row based on the chosen font, line spacing (which also can be configured) and margin (some printers have predefined physical margins that can’t be changed!).
    ![printable arena](/images/blog_print_area_width.png "")
    Source: [Pyramid docs](https://escpos.readthedocs.io/en/latest/layout.html?highlight=width#print-area-width-1d-57-rel) ## What if we need functionality that is not in the documentation? During one recent implementation, we encountered such a problem. Our client, a restaurant POS provider,  asked for the 'buzzer' functionality that was available in the old software. This is a sound signal usually at the end of a printout to inform the kitchen about a new order. The problem was that there was no mention of this functionality in the documentation for our printer model, even though other models had it. An internet search was also unsuccessful. However, we knew that the old system, running on Windows, was able to do this, which prompted us to investigate. We decided to analyze what exactly Windows sends to the printer when the sound signal is activated. We configured the printer and connected it to the Windows PC using an Ethernet cable. We installed the drivers and configured the printer to sound at the beginning and end of each printout.
    ![End Document Operation](/images/blog_end_document_operation.png "")
    We used Wireshark to monitor our network traffic, setting filters to only see traffic going from our computer to the printer. To simplify things we printed blank documents. After several tests with different volume and sound length settings, we noticed that each printout generated five network events. Of these, only one contained the data (payload) we were interested in.
    ![Network events](/images/blog_network_events.png "")
    This is what the data looked like in the right network package: `00000000000000000000000000000000000000001b633b011b401d45871d50b4b41d994245929a5601281b08051b08001d994245929a5601501b08051b08001d5642001b633b00` We converted this data into an array of numeric values (ints): `[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 99, 59, 1, 27, 64, 29, 69, 135, 29, 80, 180, 180, 29, 153, 66, 69, 146, 154, 86, 1, 10, 27, 8, 5, 27, 8, 0, 29, 153, 66, 69, 146, 154, 86, 1, 10, 27, 8, 10, 27, 8, 0, 29, 86, 66, 0, 27, 99, 59, 0]` Then we removed unnecessary zeros and split the data into individual ESC/POS commands: * `27, 99, 59, 1` * `27, 64, 29, 69, 135` * `29, 80, 180, 180` * `29, 153, 66, 69, 146, 154, 86, 1, 10` * `27, 8, 5` * `27, 8, 0` * `29, 153, 66, 69, 146, 154, 86, 1, 10` * `27, 8, 10` * `27, 8, 0` * `29, 86, 66, 0` * `27, 99, 59, 0` After analyzing this data, we discovered that a command is responsible for setting the volume: `29, 153, 66, 69, 146, 154, 86, 1, ` The command responsible for extracting the sound consists of two commands, one sets the value and the other resets it to zero: `27, 8, ` As you can see, even without direct documentation, it is possible to arrive at a solution to a problem using network analysis and a bit of reverse engineering. As a result, we were able to implement the 'buzzer' function to meet the customer's requirements. ## Revolutionizing Pain Relief with AI in Healthcare: An Interview with Guy Siman of Sensars *Published: 2024-08-26 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/revolutionizing-pain-relief-with-ai-an-interview-with-guy-siman-of-sensars/index.md* **Imagine a world where physical pain can be switched off in one medical procedure, without any side effects. Sounds like something from a science fiction movie? It’s not; it’s actually beginning to happen, thanks to [Sensars](https://www.sensars.com/), a startup based in Switzerland that is taking neurostimulation to another level. They're revolutionizing the field by directly interacting with peripheral nerves. [Guy Siman](https://www.linkedin.com/in/guy-siman-66bb1b1/), a founder of Sensars, shares his journey and insights behind this innovative solution in an interview with Agata Bielówka, conducted at the HLTH Europe conference in Amsterdam in June 2024.** ## Can you briefly introduce yourself and your solution? Yes, so my name is Guy Siman. I'm a co-founder and Chief Operating Officer at a medical device company called Sensars, based in Switzerland. We set out to treat chronic neuropathic pain, particularly in the foot, which affects over 2 million people each year worldwide that are intractable to medication and other solutions. We're doing this through neurostimulation, but not just any ordinary neurostimulation. We're transforming the way neurostimulation works. Instead of placing a lead next to a nerve, we safely inject microelectrodes inside a peripheral nerve.
    ![Guy Siman](/images/baner_guy_quote_update.png "")
    ## What inspired you to develop Sensars and focus on treating chronic pain? Chronic pain, especially distal pain like foot pain, affects a huge number of people worldwide and often goes untreated. One major cause is diabetic foot, which is personal to me because of my family's history with diabetes. This was a major incentive. It's a huge unmet need globally. While it's not my first company, it brings a lot of satisfaction to help people who have such needs. ## What makes your solution different from other similar solutions? The major difference is our approach to the nerve. Instead of stimulating from beside the nerve, we go inside the nerve with multiple microwires. This allows us to access the inside of almost any peripheral nerve. For treating pain, we target the sciatic nerve for the lower limb, but we can also target the vagus nerve for treating epilepsy, inflammation disorders, or obesity. This intimate access to the nerve allows us to selectively choose the fibers we want to stimulate, which is what differentiates us.
    ![Sensars Pain Treatment](/images/sensars-graphic-1-.png "Sensars Pain Treatment")
    source: https://www.sensars.com/ ## Is it just hardware or a combination of hardware and software? It's a combination. The hardware is the major innovation, but we also have software elements. We developed specific biomimetic algorithms that, combined with our access inside the nerve, generate stimulation parameters that emulate natural sensations. ## Is your technology on the market already? No, it's not on the market yet. We've done a proof of concept with extraordinary results—100% response rate, decreasing pain in all patients by over 50% and restoring their sensation. We're now transitioning this early prototype into a commercial-like prototype for the next steps of clinical trials. After these trials and regulatory approval, we will hit the market. ## Are you facing any regulatory issues or challenges? Challenges, yes, but no major issues. We are a class 3 or PMA route device. As long as we follow the guidelines and standards, we should be okay. ## What about technological challenges? We have de-risked many technological challenges using our earlier prototype. Developing small electrodes that go inside the nerve, stay there, and provide stable stimulation is a significant technological challenge that we need to continue proving. ## What trends do you see in health tech, apart from AI? Making healthcare more accessible, especially through remote care, is a major trend. This was boosted during COVID-19 and is maintaining momentum. We, too, are going to facilitate remote access and monitoring to the patients’ progress of treatment.
    ![Chronic Pain Treatment](/images/baner_guy_quote_proof_of_concept.png "Guy Siman Sensars")
    ## Is there any medtech or e-health solution you follow and appreciate? There are many, particularly in the field of neurostimulation. Interesting developments are happening around the brain and DBS (Deep Brain Stimulation), as well as mapping signals from the brain to improve wellness. ## Do you have a favorite podcast or news site you regularly follow? Yes, I regularly follow a podcast led by [Dr. Andrew Huberman](https://www.hubermanlab.com/) as well as [MedTech Talks & Device Talks](https://medtechmvp.com/media/medtech-talk-podcast), centered around medical devices. ## What do you do in your free time? I wish I had more free time! I spend as much time as possible with my family and kids to compensate for lost time when I am away. That's what I do the most. ## What are your future goals, personally and for your solution? For our solution, I want to follow through on this development and bring it to people because it's transformative. We're raising our seed round now, and we have good clinical data to support it. Personally, my goal is to get a pilot's license by the age of 50. ## That's impressive! Fingers crossed. Thank you for your time and enjoy the rest of the conference. Thank you. You too. \ \ [Sensars](https://www.sensars.com/) aims to offer a groundbreaking solution for millions suffering from chronic neuropathic pain. The potential impact on the medical field and patient care is immense. We are keeping our fingers crossed as Sensars progresses through clinical trials and moves toward market introduction. ## Advice for Healthcare Startup Owners from Industry Experts *Published: 2024-08-20 | Author: agata | Tags: HealthTech, startups, business, business perspective* *Source: https://brightinventions.pl/blog/advice-for-healthcare-startup-owners-from-industry-experts/index.md* **In the complex area of health tech, understanding the market and navigating regulatory challenges are crucial.**  **During the [HLTH Europe](https://europe.hlth.com/) conference in June 2024, experienced startup owners and industry experts gathered to discuss the most important health-tech issues and share their insights and experiences, offering perspectives on the future of healthcare, which could be a gold mine for startups entering this field.**
    ![](/images/baner_final-quote-fernando-3-.png "")
    ## Understanding the Market **Navigating the healthcare industry requires understanding its complexities. Knowing the key players and specific regulatory environments, whether in the diverse U.S. market or Spain's unique pilot study approach, is crucial. This knowledge helps craft effective strategies and successfully launch innovations** * “First, understand the market. It sounds simple, but the buyers can be confusing. For example, some companies want to work with a healthcare system but need to be selling to a payer. Or they aim to work with physicians, not recognizing that about 80% of physician groups are employed by hospital systems or payers. **Understanding the buyer and payer dynamics is crucial**. The regulatory space is another challenge. Having FDA approval is not enough—you also need CMS and Medicaid approval to pay for your product or device. Without this, your product or service won't be implemented or used in the US.” - **Dr. Adam Brown,** Founder @ ABIG HEALTH * "The U.S. healthcare system's complexity is pivotal to understand, as **different states have different regulations and market dynamics.**" — **Aahuti Rai**, Strategic Advisor and Venture Partner @ Four Points Consulting *  “The Spanish market is quite complicated. Everyone will ask you to start with a pilot study, which is important. My advice is to perform a paid pilot study, even if it's a small amount of money. This shows commitment and value. **Assess the results, demonstrate the technology's value, and then move to a contract**.” - **Silvia Raga,** CEO & Founder @ DyCare
    ![Silvia Raga DyCare](/images/quote_silvia.png "")
    * "I think that **now you have a unique opportunity in France to actually deploy your solution thanks to the reimbursement model that has been decided over the past two years**, especially in the remote monitoring field and now in the DTX field. And I think that France is investing in digital health solutions and is also trying to help healthcare professionals digitalize their practice by compensating the time they spend using those digital solutions. I think that digital solutions are going to become a must-have once healthcare professionals actually embrace those solutions. This is why I think that France is really in a unique position in Europe." - **Edouard Gasser,** Co-Founder & CEO @ Tilak Healthcare ## Navigating Regulatory Challenges **Healthcare is one of the most regulated industries. There are many legal regulations that health tech companies must follow, including obtaining approvals from relevant institutions and acquiring necessary certifications before entering the market.** * "Familiarize yourself with **FDA and CMS approvals** to ensure your product can be implemented and reimbursed in the U.S. market." — **Dr. Adam Brown** * "Be aware of regulatory differences across states and tailor your approach accordingly." — **Aahuti Rai** *  "The main challenge is ensuring **the clinical validation of our technology** since it's a medical device. This is the real challenge of what we do." - **Silvia Raga** ## Building Credibility and Trust **Trust is one of the most important things in healthcare. Your users need to know that the solution they are using is safe and based on legitimate knowledge.** * "Ensure **medical credibility** by involving practitioners and experts in your development process." — **Dr. Claudia Pastides,** Director of Medical Accuracy @ FLO Health * "For digital health solutions, **establish trust** by ensuring data security and compliance with privacy regulations." — **Dr. Claudia Pastides**
    ![Quote](/images/baner_final-quote-fernando-4-.png "")
    ## Adapting to Cultural and Mindset Shift **In the healthcare industry, adapting to cultural and mindset shifts is essential for integrating new technologies. Thoroughly considering the challenges of overcoming cultural resistance and strategies for engaging stakeholders is crucial when developing a new product.** * "Be prepared to **address cultural resistance** within healthcare systems, which often lag behind technological advancements." — **Aahuti Rai** * "In Brazil, our biggest challenge is the mindset of healthcare leaders. Patients often need to opt in to share their data for better outcomes, and regulatory bodies and **healthcare providers can be resistant to data exchange.** Payers and providers often operate independently, leaving patients caught in the middle. Changing this mindset requires educating stakeholders about the benefits of data sharing." - **Fernando Campos,** Founder & CEO @ Nuria * "Engage stakeholders effectively to foster acceptance and buy-in for new technologies." — **Aahuti Rai** ## Leveraging Interoperability **Interoperability, or the ability for health IT systems to talk to each other without needing a translator, is now recognized as a crucial ingredient for the smooth operation of future healthcare systems.** * "Focus on creating solutions that enhance interoperability between different healthcare systems and EHRs." — **Dr. Adam Brown** * "The ability for different systems to communicate has a profound impact on patients getting the right care." - **Dr. Adam Brown** * "Highlight the benefits of your solution in reducing redundancies and improving patient care through seamless data sharing." — **Dr. Adam Brown**
    ![Mohammad Al-Ubaydli](/images/quote_mohamad.png "")
    ## Strategic Adaptations and Mindsets for Success **In the fast-paced startup world, strategic adaptation and the right mindset are crucial for success. Being able to make slow, deliberate decisions, demonstrating resilience, and maintaining consistency are essential qualities for business owners.** * "Be prepared for **slow decisions** and price-sensitive public sectors. Investors may push for speed, but high quality at low costs is crucial." — **Mohammad Al Ubaydli,** Founder & CEO @ PHIN * "Move fast and **focus on solving one problem at a time**. If possible, sell your solution outside of medical device categorization to start generating revenue and gather real-world evidence quickly." — **Michel Valstar,** Co-Founder & CSO @ BLUESKEYE AI * "Founding a company requires resilience, purpose, and willpower to persist through challenges. **Embrace failure as a step towards success**, solve problems rather than clinging to ideas, and build a strong team." **— Fernando Campos** These expert-driven insights outline the best practices for developing a health tech product, offering a simpler path through this complex industry. Although challenging, this path rewards those who skillfully manage innovation, regulatory compliance, and market dynamics. ## Dr. Frank Hoffmann: Empowering Blind Women in Breast Cancer Detection | Healthcare *Published: 2024-08-16 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/dr_frank_hoffmann/index.md* **[Discovering Hands](https://www.discovering-hands.de/)** offers dual benefits: **it not only aids in early breast cancer detection but also empowers blind women, an often underestimated workforce in tumor detection.** Through this initiative, blind women gain meaningful employment, and breast cancer patients receive earlier diagnoses, making a significant impact. **[Dr. Frank Hoffmann](https://www.linkedin.com/in/frank-hoffmann-discovering-hands/)**, an experienced gynecologist and founder of this solution, shared the inspiration behind this unique program, the challenges of integrating it into healthcare systems, and the promising future of this life-saving initiative.\ \ *The interview was conducted by Agata Bielówka with Dr Frank Hoffmann, during the HLTH Europe conference in Amsterdam.*
    ![quote](/images/baner_final-quote-frank-4-.png "")
    ## **Can you briefly introduce yourself and your solution?** My name is Frank Hoffmann. I was trained as a gynecologist and obstetrician. I've been working in my own medical office in Duisburg, in the western part of Germany, for 30 years. **I was not very content with the quality of breast cancer early detection** I could offer to my patients because I could only spend one or two, maybe three minutes on it. So I was thinking about how I could improve the situation, and I found that blind and visually impaired women are a completely underestimated but perfect workforce to do the physical examination of the female breast to improve breast cancer early detection. ## **Thank you.** I developed a program to train visually impaired women. Nowadays, we run a social enterprise called Discovering Hands. Discovering Hands trains these women, who are the perfect tactile examiners. We also have scientific research on the results of their examinations. They find tumor sizes between six and eight millimeters. We, as doctors, find tumors between one and two centimeters. That makes a big difference because it's not the tumor inside the breast that is the killer; it's always the metastasizing cells sent out from there into the body. If you find it at the earliest possible stage, you will have a cure. In other cases, maybe not. ## **Yes, I have to say that I'm very impressed. I read some articles about your work. My father is also a gynecologist, and my grandmother died from breast cancer, so I am very impressed with your work. You already answered my next question: what inspired you to discover this solution? Do you have any friends that are blind, or how did you discover this?** I had some experience with the sensory awareness programs that were very common in the 80s. **I was always impressed by how much your own sensory qualities change when you close your eyes for a certain time**. On the other hand, I know that neural plasticity allows the brain to use information from different senses. Blind people can read Braille if they are trained, and we are not able to do that. This more differentiated sense of touch of visually impaired people is the key to improving the quality of the breast examinations they are able to deliver.
    ![discovering hands](/images/_u1a6316_630x354px.jpg "")
    source: https://www.discovering-hands.de/ ## **So it's a program to train blind women? Only women?** Yes, to be politically correct, blind people. But we haven't had any male candidates. I'm pretty sure that this is something women can offer to women. Even if most patients believe it would make a big difference if the MTE was male, I think the conversation would go another way. So, I'm a fan of something that can be offered from women to women. ## **And how does it work? Is it a full-time job for the people, or is it only a part-time job? Or is it like a hobby or something they do voluntarily?** No, they are trained and then they get employment by Discovering Hands. Not my company, I head the non-profit mother company, but we have an affiliate. This company, Discovering Hands GmbH, keeps all the contracts with the health insurances. We have 41 health insurances in Germany that cover the cost for the TBE, the tactile breast examination, done by MTEs, medical tactile examiners. They also hold the contracts with the MTEs, and they get support from the government, specifically the Landschaftsverband Rheinland, which partly pays their salary. ## **Okay, so the payer is partly the government and partly an insurance company?** No, partly the government and partly the Discovering Hands organization. They lend these MTEs to medical offices. Most doctors are not willing to employ MTEs full-time. They might only have one room available, and in that room, three times a week, a midwife might already be working, so they only offer two days of work. That was not very comfortable for the MTEs, and we have overcome this with the current organization. ## **Is part of the solution online, or is it just offline?** The examination is only offline, but in our training program, we have integrated a virtual classroom, which was very helpful during the COVID-19 pandemic. We could offer the training partly inside the academy and partly online. ## **What challenges have you faced during your journey with Discovering Hands?** First of all, finding supporters among health insurances. They were not willing to pay for something they didn't know. Even if the women are completely convinced that this is a better type of diagnosis for them. It was always the women who were our strongest supporters. They convinced their insurances, and the insurances recognized that so many women are very content with this tactile exam. It takes 40 to 60 minutes in a very calming and smooth atmosphere. The MTEs do it very precisely using the orientation stripes we have developed. They can ask all the questions they sometimes don't feel comfortable asking doctors. MTEs are more on the same level as the patients. ## **What trends do you see in health tech at the moment, apart from AI?** I think **it is necessary to find solutions based on technology because we don't have enough doctors and nurses.** On the other hand, **we need personal contact between a patient and a professional**. In this context, the completely underestimated workforce of blind people could be of great help, even if it's only covering part of breast cancer detection. If we only had mammary screening programs and nothing else, many women wouldn't undergo these programs because they associate them with dangerous radiation and painful scans. **In Germany, only about 54 to 57 percent of the women invited go to the screening**.
    ![quote](/images/baner_final-quote-frank-5-.png "")
    ## **Do you plan to expand your solution to other countries in Europe?** We are working on that because we have everything in place to train more women and set up a model that can work in other countries. We have had pilot projects in Switzerland, Austria, South America, Colombia, and Mexico. Now we are running **a big pilot project in India, which is promising because there are 60 million blind people in India and no real breast cancer detection program**. But at the moment, we don't have a dedicated team to advance this. We need investment and a partner, perhaps a healthcare provider or a hospital chain, to employ MTEs. Or it could be an investor. ## **What about NGOs like WHO or large companies or foundations that support such solutions?** We are in close contact with companies and foundations in Germany. However, we need people who can do this the proper way. Our team in Germany is not currently equipped to do that professionally. So, we would first like to build a new team under the umbrella of the Discovering Hands International organization. This could be very impactful for many players in the market. ## **A lot of work.** Yes, and it's not easy. I hope to find some interested people here, but so far, I haven't made any contact.\ **How many people do you have in your team?** We have 15 people running these two companies, the non-profit organization and the Discovering Hands GmbH. We have 43 MTEs working with us; 33 are directly employed by the company, and the others work in medical offices independently. It's still a small number, but we had COVID-19, inflation, and many people unwilling to invest in additional medical care programs. We have overcome these problems, but we had difficulties. ## **Maybe you should consider a digital solution like a mobile app to make the organization more willing to help you.** We are working on something like this. We want to bring the self-examination program we have developed to an app, which will **help people understand that self-examination is meaningful** and train them on how to do it properly. ## **That's great. Your work is really impressive. Thank you for your time. I hope you enjoy the conference and good luck with your project.** Thank you. I appreciate it. ## 5 Mistakes to Avoid in Restaurant POS Legacy Revamping *Published: 2024-08-12 | Author: joanna-c | Tags: business perspective, POS* *Source: https://brightinventions.pl/blog/restaurant-pos-legacy-revamping-mistakes/index.md* **Your POS (Point of Sale) system has earned you loyal restaurant clients over the years. However, supporting new devices, third-party payments or refreshing outdated UI has become increasingly challenging. You know the time for POS legacy modernization is coming, but how can you achieve a smooth transition for your users? Based on our experience in Point of Sale revamping, we will share the mistakes you should avoid during restaurant POS legacy modernization.**
    ![quote](/images/quote_joanna_pos_revamping.png "")
    ## Not prioritizing waitstaff feedback **Joanna Cieszyńska, Product Designer @ bright inventions:** When developing a POS system for waitstaff, it is crucial to consider their perspective. You shouldn't base your modernization solely on your internal vision of how the product should look. Instead, **rely on actual product design research techniques such as field studies, user shadowing, and adaptive interviews**. Waitstaff are a very specific group of tech users; they have their habits, workarounds, and might know your POS even better than you do, using it in ways you wouldn't imagine. **A notable example we discovered during adaptive interviews involved users who didn’t use table maps but instead added notes to distinguish clients**, such as “lady with a yellow umbrella.” As you can see, that's a very specific way to use POS software. Ensure that your modernization is based on such feedback, so the transition to the new POS will be smoother for your users.
    ![quote](/images/quote_ariane_pos_revamping.png "")
    ## Failing to balance perfection with progress **Ariane Hinz, Project Manager @ bright inventions:** In some cases, we tend to strive for perfection in our software, continually fine-tuning features and processes. However, at some point, **product owners should shift their focus from perfecting what users already love to further scaling the product**. Don't take this the wrong way – optimizing is always a key part of software development. But it's also important to **move forward and grow the product**. Focusing too much on already well-implemented parts of the system can slow down your scaling efforts. As an example, let’s consider a highly appreciated feature by waitstaff: split payment. If initial feedback after the launch confirms that the feature is easy to use, fast, and helps avoid mistakes even when restaurant clients use different payment methods, then we can gladly build on it and implement already proven best practices while developing other features.
    ![quote](/images/quote_szymon_pos_features_flexibility.png "")
    ## Lack of adaptable features **Szymon Gęsicki, Flutter Developer @ bright inventions:** Some POS providers aim to address specific restaurant problems by offering unique, tailored features. While this individual approach is praiseworthy, **it is crucial to build features that are flexible and adaptable for other restaurants as well**. The ideal scenario is to create features that can be enabled or disabled according to every restaurant's needs. **A great example is tailored prints for kitchen, accounting, or management**. Restaurants may have different needs regarding the type of receipts and fiscal documents they want to generate. It’s wise to keep this flexible so the **restaurant staff can adjust exactly what prints they need, rather than assuming everyone requires the same type of documents by default**.
    ![quote](/images/quote_szymon_pos_revamping.png "")
    ## Forgetting to support older hardware **Szymon Gęsicki, Flutter Developer @ bright inventions:** I bet every software development team loves to create POS applications only for modern desktops, tablets, and smartphones. Unfortunately, in many cases, restaurants still operate on older hardware, making it more challenging to integrate new POS systems and ensure high performance for users. From the moment you start planning POS modernization, **you should conduct research with your clients to determine what devices they use**. You can also **check your users' device parameters in analytics tools like Google Analytics 4** (assuming you have set up the analytics properly, which unfortunately is often neglected in legacy systems). Ensure that your system supports these devices or, if possible, provide them with modern hardware compatible with your software.
    ![quote](/images/quote_joanna_pos_design.png "")
    ## Neglecting usability in POS redesign **Joanna Cieszyńska, Product Designer @ bright inventions:** POS systems are designed to help waitstaff manage orders within seconds, not to showcase intricate interaction designs or long animations. While it's important not to swing to the other extreme – animations that provide essential feedback, such as indicating that a payment is being processed, are still necessary – it’s crucial to **skip purely decorative animations**. Every extra second they add will slow the user down and complicate their already stressful work. Modernization is the perfect moment to **redesign the POS based on user feedback**. This involves addressing specific needs, such as the ability to quickly change the order flow (restaurant clients sometimes start with the main dish and then mention the appetizers and desserts). A UI that helps to easily modify the order of meals is crucial for waitstaff. Another important aspect is **eliminating pain points**, such as unclear color coding of meal categories or the lack of distinction between beverages in cans and bottles. As you can see, waitstaff needs can be very specific – these are just a couple of examples our team had to address during POS legacy modernization. **The goal is to create software that is truly usable, rather than just producing beautiful mockups appreciated on Behance or Dribbble**. Such designs are unlikely to stand a chance in the chaotic environment of a real restaurant. ## Are you considering your POS upgrade? Check out our approach towards POS modernization. Read the story of [30 years old restaurant POS system](https://brightinventions.pl/projects/pos-legacy/) that our team revamped. ## 9 Signs Your Restaurant POS Legacy Needs Modernization *Published: 2024-08-05 | Author: mateuszg | Tags: business strategy, POS* *Source: https://brightinventions.pl/blog/signs-pos-legacy-needs-modernization/index.md* **From risky cloud migration to the constant struggle of supporting various devices, 3rd party payments, and multiple food delivery platforms… Does your POS (Point of Sale) development team fight with any of these challenges? Perhaps it’s time for your restaurant POS legacy to be revamped. Answer these questions to find out!**
    ![legacy POS revamping](/images/pos_revamping_signs_blog_update.png "legacy POS revamping")
    ## Do you face difficulties in integrating food delivery platforms with your POS? **Multiple tablets for multiple food delivery platforms…** That’s the nightmare of many restaurant staff. [POS integration](/blog/pos-integration/) with all external providers and unifying them into a system accessible on one device is possible! Yet is your POS capable of offering that? ## Is your POS based solely on desktop devices? Modern POS is often a **combined system of desktop and mobile handheld devices** e.g. tablet & smartphone terminals, or portable card readers. Can a variety of devices be integrated into your POS? ## Is your POS on-premise although you wish for cloud migration? Do you still manage servers on your own, at the same time considering a move to cloud-based services to reduce costs? **The age of your system can significantly complicate migration efforts**. Revamping your POS system could be a strategic move towards a more budget-friendly migration. By updating your technology, you can avoid compatibility issues with cloud platforms and legacy technologies, and minimize any downtime that could affect your customers. ## Do you face the challenge of the rising number of payment terminals? The number of devices, especially payment terminals is growing and your legacy has limitations related to the number of terminals it can support. **Do you constantly look for workarounds to deal with this challenge, feeling pressure from your clients**? ## Do you support various payment options, including loyalty cards? You might be operating in a market with a strong culture of loyalty programs, yet find that **your legacy POS system struggles to accommodate the evolving loyalty solutions** offered by various business partners. ## Do you struggle with acquiring new clients and keeping current ones? Have you received **feedback from prospects and actual clients that your legacy system is outdated**, lacking the user experience and features compared to the competition? ## Is it hard to find software developers who can handle the technologies your POS system uses? Is your POS **based on technologies that are not popular anymore or haven’t been upgraded for years** (such as Visual Basic)? Is **onboarding new developers lengthy and difficult** due to a lot of “tribal knowledge” residing within individual employees or simply missing? ## How often do you have to put the fires in production? **How frequently do you address critical issues in production**, such as payment processing failures, orders not reaching the kitchen, or features like bill sorting and modifications not working, forcing you to prioritize these urgent fixes? Also, **are your developers hesitant to make changes in production** due to insufficient automated testing and a lack of comprehensive system knowledge? ## Last but not least… Is your POS legacy system as old as some of the developers working on it? 😉 Are you continuing to develop a system that's been decades in the making? **Is it finally time to build the new version** and ensure (with backward compatibility) a smooth transition for your clients? - - - How many times did you nod? If you feel that POS modernization is your fate but understandably are apprehensive about the process, **check out our approach to software revamping**. **Read [the story of 30-year-old legacy POS system](/projects/pos-legacy/) that our team revamped**. [![POS legacy modernization case study](/images/preview_case_study_pos_revamp.png)](/projects/pos-legacy/) ## Claudia Pastides on Leading Innovation at FLO Health, a New FemTech Unicorn *Published: 2024-07-31 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/interview-claudia-pastides-flo-health/index.md* **In an insightful conversation that took place at the [HLTH Europe](https://europe.hlth.com/) conference in Amsterdam, Dr Claudia Pastides, Director of Medical Accuracy at [FLO Health](https://flo.health/), discusses the innovative journey of FLO Health which led to the recent impressive $200M Series C funding led by General Atlantic. This significant financial milestone propels FLO into the ranks of femtech unicorns, reinforcing its commitment to advancing women's health globally.** ## Can you briefly introduce yourself and your solution? Yeah, so I'm Claudia Pastides. I'm the Director of Medical Accuracy at Flo Health. **Flo Health is the most popular women's health app globally**. We support women during their entire reproductive lives, from first period to menopause. The app provides curated cycle and ovulation tracking, personalized health insights, expert tips, and a fully closed community for women to share their questions and concerns. One thing that really sets us apart from other players in the space is our commitment to privacy and security. ## What inspired you to enter this market and develop this solution? Yes, so I am a doctor by background. I worked as a family doctor for many years and was always very interested in women's health. I was fascinated by the idea of producing high-quality educational content that could be shared with millions, potentially even billions, of women around the world on topics like reproductive health and hormones. Flo approached me to work for them, and I joined as the Medical Director. **My role is to ensure that everything we create in the app is accurate, safe, and medically credible**.
    ![claudia pastides flo](/images/baner_final-quote-claudia-1-.png "")
    ## Are you still a doctor? I'm not seeing patients anymore. I stopped actually a few years ago. ## Do you miss that? You know, sometimes yes and sometimes no. While I loved the one-on-one connection and making a difference for individuals, **I realized that at Flo, I can create features or content that impact many more people**. So, I feel very fulfilled in this role. ## What do you think has been the key to maintaining such high user engagement and retention? I think it's a combination of things. The app is well-designed, user-friendly, visually appealing, and engaging, which keeps people coming back. **Since periods are a monthly occurrence for many women, there's natural user engagement**. We also put a lot of effort into medical accuracy and credibility, ensuring that users trust the information provided. **We balance being safe, credible, and medical with being fun, engaging, and attractive**. This middle ground sets us apart. ## Can you say a bit more about this medical credibility? As I understand it, that's your role to ensure that. Yes, absolutely. **Everything we do involves a doctor from the very beginning**. When we develop a new feature or integrate artificial intelligence, a doctor is always involved to bring medical credibility and accuracy to every conversation. We are involved from the start, sign everything off at the end, and contribute throughout the process. **I manage a team of doctors and scientists, and we work with over 120 medical experts worldwide**. We ensure everything we do is as accurate, safe, and credible as possible because we are dealing with health, specifically women's health. ## What about law regulations? Have you faced any challenges due to regulations in different countries? **Flo has a legal and compliance team that handles regulatory matters across different countries**. They proactively manage any potential challenges related to health regulations to ensure our operations remain fully compliant. We haven't faced any challenges to date thanks to our team's due diligence. ## Privacy features are increasingly important these days. Flo's Anonymous Mode is particularly crucial for users. Could you explain what this feature is about? Yeah, **Anonymous Mode allows users to use the app without any identifiable information being linked to their account, such as their NAME or email address**. It was already in development when the US Supreme Court ruled to overturn Roe v. Wade, but in the wake of that ruling, some users expressed concerns about how their health data might be used by third parties, such as official requests for apps like Flo to share pregnancy data with law enforcement. We believe our users should feel in control and secure when using our app, so we launched Anonymous Mode right away. **If Flo were to ever receive an official request to identify an Anonymous Mode user by name or email, it wouldn't be possible to satisfy that request**. Our users have been very appreciative of this offering and it's since won multiple awards including TIME Best Invention, Fast Company ## Do you have any favorite podcasts or news sites where you get inspiration for your work? We create our own resources at Flo. We have a marketing and a science digest, where we compile the latest research and advancements in women's health and technology. **Personally, I like James Somauroo’s SomX podcast; it's very insightful**. ## What do you do in your free time, if you have any? I have three children, so there's not much free time, but I make time for activities I love. I enjoy playing tennis, doing Pilates, running, and sewing. **I started sewing during COVID** and now make dresses and other items.
    ![claudia pastides flo](/images/baner_final-quote-claudia.png "")
    ## What trends do you see in health tech, apart from AI? Apart from AI, which is still in its early stages, **I think there's a growing focus on women's health**. Women's health has been under-researched and neglected for a long time, but there's increasing recognition that it's a global issue. I see more tech solutions being developed for women's health, especially around taboo topics like menopause. ## That's great. Thank you so much for your time. Thank you!\ \ The interview was conducted by Agata Bielówka with Dr Claudia Pastides, the Director of Medical Accuracy at FLO Health, during the HLTH Europe conference in Amsterdam. ## Tech Trends in Healthcare: Industry Experts' Perspectives *Published: 2024-07-23 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/tech-trends-in-healthcare-experts-perspectives/index.md* **The recent [HLTH Europe](https://europe.hlth.com/) conference served as a platform for leading voices in healthcare technology to share insights and debate the future of the industry. Here's a deeper look at the transformative trends highlighted by these experts, which are shaping the next generation of healthcare.** ## 1. Digital transformation as a catalyst The digital transformation of healthcare continues to accelerate, driven by the need for more integrated systems. **Aahuti Rai,** Strategic Advisor and Venture Partner at Four Points Consulting, [emphasized that the challenge lies not in the capabilities of technology but in our readiness to adopt](/blog/ehealth-bottlenecks-interview-aahuti-rai/) and integrate these advancements effectively into daily healthcare practices. ## 2. The imperative of interoperability [Interoperability](/blog/interoperability-in-healthtech-experts-insights/) remains a critical focus, with **Dr Adam Brown** from ABIG HEALTH [pointing out its role in enhancing patient care](/blog/challenges-opportunities-digital-health-experts/#4-interoperability) through error reduction and efficient data exchange. Seamless connectivity between different health systems is essential for the next steps in healthcare evolution. ## 3. Advancements in women’s health tech Attention to women's health tech is growing, filling gaps in historically under-served areas. **Dr** **Claudia Pastides** from FLO [noted the increasing number of digital solutions aimed at improving women's health](/blog/interview-claudia-pastides-flo-health/), a trend that promises better understanding and support for women’s health issues.
    ![women's health ](/images/baner_claudia_femtech.png "")
    ## 4. The rise of remote care Remote care technologies are reshaping where and how care is delivered. **Łukasz Krasnopolski,** Founder and CEO at Higo Sense, explained how new devices are enabling comprehensive health assessments from the home, expanding access to healthcare services, especially in remote and underserved areas. ## 5. Innovations in pain management and diagnostic AI **Guy Siman,** Co-Founder and COO at Sensars, [discussed their approach to chronic pain management through neurostimulation](/blog/revolutionizing-pain-relief-with-ai-an-interview-with-guy-siman-of-sensars/), tailored for individual needs. Concurrently, AI's role in diagnostics is expanding, with **Bartosz Borucki,** CEO at Smarter Diagnostics, highlighting its use in detecting early signs of orthopedic conditions, signaling a shift towards proactive healthcare. ## 6. Prioritizing patient-centric experiences The digital journey of patients is becoming a core focus, enhancing how they engage with healthcare systems. **Fernando Campos Soares** from Nuria, [shared how his platform is making health data management more accessible and patient-friendly](/blog/nuria-advancing-healthcare-interoperability-and-patient-engagement/), emphasizing patient autonomy over their health records.
    ![enhancing the entire patient journey](/images/baner_fernando_trends_interoperability.png "")
    ## 7. Ethical data management **Mohammad Al-Ubaydli,** Founder and CEO at PHIN, stressed the ethical management of health data, ensuring patients retain ownership and control over their personal health information. This practice not only supports patient autonomy but also builds trust by making health data management transparent and consent-based.
    ![private healthcare information network](/images/baner_mohammad_medical_data_records.png "")
    ## 8. Predictive analytics and personalized medicine The use of big data and predictive analytics is forging paths towards personalized medicine, where treatments are precisely tailored to individual genetic and lifestyle factors. This approach is set to transform healthcare from reactive to anticipatory, focusing on prevention rather than just treatment. ## Conclusion The **HLTH conference** highlighted a dynamic shift towards more sophisticated, patient-centric, and ethically managed healthcare systems. As industry experts keep innovating, the healthcare sector is on the brink of a major change, ready to provide unmatched personalized care and greater control to patients. ## 51 Reasons Why We Love Working at Bright Inventions *Published: 2021-12-13 | Author: izabela | Tags: inspiration, teamwork, bright insights* *Source: https://brightinventions.pl/blog/43-reasons-why-we-love-working-at-bright-inventions-2021-edition/index.md* **We have decided to stop for a moment and think about our bright culture. We asked people to answer a simple yet meaningful question – Why do you work at Bright Inventions? Our bright team submitted their answers and let me be clear – the participation was voluntary. No one was forced and never will be to write some puff pieces.**
    ![Bright Inventions team](/images/collage_reasons_to_work.png "Bright Inventions team")
    [In 2019 we also asked the team why they work at Bright.](/blog/31-reasons-why-we-love-working-at-Bright-Inventions/) Back then our team consisted of around 20 members. Now we have over 80 people on board! Thus it is time for new perspectives. ## Why do you work at Bright Inventions? 1. You are quickly recognized and valued for a job well done. 2. Because of the trust and flexibility we're given. 3. Transparency and the absence of workplace politics. 4. The culture of knowledge sharing. 5. Building products that are used and appreciated by users. 6. The mature process of software development. The team is highly skilled and experienced. We focus 100% on quality. 7. We are partners to our clients and bring something more to the table than lines of code. 8. People treat each other with respect and you can feel that they do work that really gives them satisfaction. 9. People around me are super excited about what they do. 10. I experience constant self-development: professional and personal as well. 11. People inspire me to grow. 12. A clear path to self-development. 13. No-corporation atmosphere. 14. Hybrid work. 15. Working on international projects with clients from countries like Israel, the UK, the USA or Germany. 16. Multiple celebrations and great team retreats. 17. The project I work on is meaningful and gives possibilities to develop myself. 18. Stability and security – during the pandemic the team grew twice. 19. Nothing is forced here. You don’t feel the pressure to spend time with the team, but you actually just want to know the people because they are kind and helpful. 20. Taking care of the employees. 21. Great atmosphere in the office, everyone is friendly and you feel like a part of the family. 22. You can get a ton of help not only regarding your work. You can get advice about taxes, buying an apartment, a bike or how to do Crossfit. People are just open to help and to share knowledge. 23. Human approach – your teammates understand that you can sometimes feel under the weather, have a sleepless night with your child or simply have a bad day. And they will offer you nothing but support. 24. Coffee talks – regular talks to just discuss things worth sharing. 25. I like having an influence on what technology I use. 26. English classes. 27. Autonomy, no micromanagement. 28. Direct contact with clients. 29. I have challenges that I want to take up. 30. Competitive salary. 31. Friendly atmosphere – we meet after work because we want to. 32. Training together – yoga, swimming, jogging and MTB together not only to spend time with each other but to stay healthy and in shape. 33. We have after-work retreats that are actually employee initiatives like hackathons, running races, Board Game Fridays or a chess tournament. 34. Abilities to work on more than one project or change a project. A great option to prevent burnout which is a common issue in the software development sector. 35. Down to earth people, even senior developers or partners. 36. Work-life balance. The management knows that people need to relax after work and that working isn’t anyone’s whole life. 37. Flexibility. 38. Transparent communication within the team. 39. Even though I've been working here for 1 month, it feels like I've been working here forever (in a good way). 40. Big impact on the projects. 41. Kudos culture. I just feel appreciation and like to appreciate others. 42. Office library with books about software development, UX and marketing. 43. Bright lunches. 44. Flat structure. 45. Sharing is caring and here it is not just a phrase, that is a way of work. 46. The management crew is very competent and flexible in terms of employer-employee relations. 47. Internal workshops about AWS, UX, Kotlin and more. 48. Mentoring opportunities. 49. Positive attitude. 50. Openness. 51. Kind people around me. Just like that. Kudos for the whole Bright Team for sharing these insights. ## Why You Should Hire a Software Agency Based in Gdansk (Poland) *Published: 2023-08-03 | Author: izabela | Tags: business* *Source: https://brightinventions.pl/blog/hiring-software-development-agency-based-in-gdansk/index.md* **Looking for a software development agency based in Poland? Consider choosing a software company from Gdańsk. Why? Unlock Gdańsk's tech potential and find out why it might be a perfect place for you to create digital solutions.**
    ![Bright Inventions team in Gdansk](../../static/images/gdansk_team.png "Bright Inventions team in Gdansk")
    **Contents** [Great geo-localization and flight connections](/blog/hiring-software-development-agency-based-in-gdansk/#great-geo-localization-and-flight-connections) [The opportunity to see face-to-face](/blog/hiring-software-development-agency-based-in-gdansk/#the-opportunity-to-see-face-to-face) [Collaboration-friendly time zone](/blog/hiring-software-development-agency-based-in-gdansk/#collaboration-friendly-time-zone) [One of the top Polish technology universities is in Gdansk](/blog/hiring-software-development-agency-based-in-gdansk/#one-of-the-top-polish-technology-universities-is-in-gdansk) [Gdansk is full of programming talents](/blog/hiring-software-development-agency-based-in-gdansk/#gdansk-is-full-of-programming-talents) [](/blog/hiring-software-development-agency-based-in-gdansk/#gdansk-is-full-of-programming-talents)[Gdansk hosts infoShare – the biggest tech and startup event in CEE](/blog/hiring-software-development-agency-based-in-gdansk/#gdansk-hosts-infoshare--the-biggest-tech-and-startup-event-in-cee) [Studies show that people who live in Gdansk are one of the happiest in Poland ☺️](/blog/hiring-software-development-agency-based-in-gdansk/#studies-show-that-people-who-live-in-gdansk-are-one-of-the-happiest-in-poland-%EF%B8%8F) [Combine your business trip with pleasure](/blog/hiring-software-development-agency-based-in-gdansk/#combine-your-business-trip-with-pleasure) [See you in Gdansk? 😉](/blog/hiring-software-development-agency-based-in-gdansk/#see-you-in-gdansk-) ## Great geo-localization and flight connections You can fly to over 20 countries from Gdańsk Airport ([data](https://www.airport.gdansk.pl/lotnisko/aktualnosci/80-polaczen-do-24-krajow-n2234.html) from March 2023). Thanks to the Gdańsk's great localization in the center of Europe, flying to some cities like Copenhagen, Oslo, and Munich takes even less than two hours. What’s more Gdańsk Airport has [the most direct flights to Scandinavia](https://www.airport.gdansk.pl/lotnisko/aktualnosci/od-kwietnia-nowe-polaczenia-z-gdanska-do-skandynawii--n1706.html) (among Polish airports) including connections to **Tromso, Trondheim, Alesund, Turku, Stockholm, Oslo, Goteburg Vaxjo, Malmo, Billund**, and more. It’s worth mentioning that the Helsinki-Gdansk flights will be back in 2024 according to the [airport website](https://www.airport.gdansk.pl/lotnisko/aktualnosci/wroca-loty-z-gdanska-do-helsinek--n2251.html). The Gdańsk Airport is located about 20 minutes from the center of the city by car (getting to the Bright Inventions office from the airport is even quicker).
    ![Gdansk airport flight connections](../../static/images/blog_post_airport_gdansk.png "Gdansk airport flight connections")
    Source: [Gdansk Airport website](https://www.airport.gdansk.pl/flight-information/where-we-fly-p3.html)
    Additionally, you can reach the city comfortably by train from Berlin. ## The opportunity to see face-to-face Working day by day in a distributed team has proven effective, yet from time to time, you might need to meet the people you work with daily in an offline setting. That’s why Gdańsk is a great place to have a software development team located, as you can reach the city in only a few hours from across Europe. Or the team can come to you. This is especially useful for [product workshops](/our-areas/product-workshops/) that kick off most software development projects. These are the workshops that can benefit from face-to-face interactions. Software agency members can visit you to conduct these workshops. For example, we visited our client, a renowned humanitarian agency in Rome, to conduct product workshops for the team. ## Collaboration-friendly time zone Poland is in **Central European Time (CET)** which makes it possible to organize **daily online meetings** with client representatives from **European countries**, as well as **Israel** or even the **USA**. Examples of time differences: 🇵🇱 Poland – 🇩🇪 Germany: no time difference 🇵🇱 Poland – 🇳🇴 Norway: no time difference 🇵🇱 Poland – 🇬🇧 the UK: 1-hour time difference 🇵🇱 Poland – 🇮🇱 Israel: 1-hour time difference 🇵🇱 Poland – 🇺🇸 New York: 6-hours time difference At Bright Inventions we successfully collaborate with clients from the listed countries. ## One of the top Polish technology universities is in Gdansk Based on the 2023 Perspektywy Report *[Universities of Technology 2023](https://2023.ranking.perspektywy.org/ranking/university-ranking/ranking-by-university-type/universities-of-technology)* **Gdansk University of Technology was ranked third among universities of technologies in Poland** (following universities in Warsaw and Krakow). Lots of Bright Inventions team members graduated from Gdansk University of Technology including our co-founders Daniel Makurat and Michał Łukasiewicz. Our project manager Kasia Łukasiewicz is also a lecturer at the Gdansk University of Technology’s Informatics department.
    ![Gdansk University of Technology](../../static/images/blog_post_gdansk_tech_university.png "Gdansk University of Technology")
    Source: [Gdansk University of Technology's website](https://pg.edu.pl/dzial-promocji/marka-pg/galeria-zdjec)
    It’s worth mentioning that graduates of the Gdansk University of Technology created [text-to-speech Ivona](https://pg.edu.pl/aktualnosci/2021-04/chcemy-dac-polakom-milion-dodatkowych-lat-zycia-w-zdrowiu-rozmowa-z-lukaszem). Their solution eventually helped to build the famous Alexa. ## Gdansk is full of programming talents Over 500 people graduated in [2022](https://cdn.files.pg.edu.pl/main/Dzia%C5%82%20Kszta%C5%82cenia/Statystyki/Liczba%20absolwent%C3%B3w%20stan%20na%20dzie%C5%84%2031.12.2022.pdf) from the Faculty of Electronics, Telecommunications, and Informatics of Gdansk University of Technology. Naturally, that is not the only college in Gdansk offering informatics studies. The official [news portal of Gdańsk](https://www.gdansk.pl/wiadomosci/Armia-18-tysiecy-programistow-Czy-Gdansk-jest-zaglebiem-branzy-IT-w-Polsce-Invest-in-Pomerania-Marcin-Grzegory-BSS-biurowce,a,224885) says that **in Gdansk works around 18 000 programmers**. That’s why Gdansk is a place where true tech giants choose to operate including Amazon, Intel, and IBM. ## Gdansk hosts infoShare – the biggest tech and startup event in CEE [infoShare](https://infoshare.pl/conference/) brings over 6 thousand attendees, 150 speakers, and over 500 startups. The first edition of the event was organized in 2007. infoShare brings to Gdansk speakers representing companies like IBM, Linux, Oracle, Intel and more.
    ![infoShare 2023](../../static/images/blog_post_infoshare.png "Pictures from infoShare 2023")
    Pictures from infoShare 2023
    ## Studies show that people who live in Gdansk are one of the happiest in Poland ☺️ Gdańsk citizens are one of the happiest in Poland according to studies conducted between 2021-2022 by [Otodom and ThinkCo](https://www.thefirstnews.com/article/gdynia-happiest-place-in-poland-says-new-report-revealing-countrys-most-and-least-satisfied-cities-32304). Only a nearby city Gdynia had the highest level of citizen’s happiness.
    ![The level of happiness by Otodom and ThinkCo](../../static/images/blog_post_gdansk_happiness.png "The level of happiness")
    The level of happiness by Otodom and ThinkCo
    One of the reasons might be the fact that **Gdansk offers opportunities to grow professionally as well as to pursue other passions**. Gdańsk, situated next to Baltic See, gives a chance for water activities like kite surfing, sup, sailing, and more. With hundreds of kilometers of bike routes and lots of green spaces, the city lets you truly rest after work. As a result, it helps to establish a work-life balance among employees [crucial for maintaining happiness](https://www.researchgate.net/publication/299741273_The_Relationship_Between_Work-Life_Balance_and_Happiness_From_the_Perspectives_of_Generation_X_and_Y). ## Combine your business trip with pleasure Gdansk is a great city to experience beach sunsets, sailing, historical sightseeing, and much more. Check out the [places to visit in the city recommended by our team](/blog/things-to-see-in-gdansk/)!
    ![Gdansk - things to see](/images/gdansk_sailing.png "Gdansk - things to see")
    ## See you in Gdańsk? 😉 We hope that you have unlocked the potential Gdańsk has. If you are looking for a software agency based in Gdansk, reach out to our team. ## Top Newsletters about Digital Health *Published: 2024-02-16 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/top-newsletters-digital-health-healthtech/index.md* **Discover viable sources of news about HealthTech and MedTech. These newsletters are worth finding a place in your inbox.**
    ![newsletters technology in healthcare](../../static/images/digital_health_newsletters.png "newsletters technology in healthcare")
    ## Hospitalogy A newsletter focusing on the financial aspects and future trends in large healthcare systems and payers. Powered by: Blake Madden, Founder & Creator of Hospitalogy Subscribe: [](https://www.linkedin.com/newsletters/the-future-of-digital-health-6501324601757442048/)[](https://www.linkedin.com/in/blakecmadden/)[hospitalogy.com](https://hospitalogy.com/) ## Healthcare Huddle A newsletter created by a physician for health professionals explaining complex healthcare topics. Powered by: Jared Dashevsky, MD, Founder of Healthcare Huddle newsletter Subscribe: [healthcarehuddle.com](https://www.healthcarehuddle.com/) ## Fierce Healthcare A comprehensive news source covering various aspects of the healthcare industry from healthcare legislation, EMR systems, HIPAA, interoperability to risk management, and more. Powered by: Fierce Healthcarenews portal Subscribe: [](https://www.healthcarehuddle.com/)[fiercehealthcare.com](https://fiercehealthcare.questexinfo.com/loading.do?omedasite=HC_full&_gl=1*4xpr71*_gcl_au*MzAxMDI0ODU0LjE3MjEwNDY2NjQ.*_ga*NjYxNDk2NDQ1LjE3MjEwNDY2NjQ.*_ga_RMX1PXZZZZ*MTcyMTA0NjY2NC4xLjEuMTcyMTA0Njc5OS41OS4wLjA) ## Axios Vitals A newsletter offering updates and insights into the latest healthcare news. Powered by: Axios news portal Subscribe: [axios.com/newsletters](https://www.axios.com/newsletters) ## Stat News An extensive news source providing in-depth reporting on health, medicine, biotech, pharma, and science. Powered by: Stat News healthcare news portal Subscribe: [statnews.com/signup/](https://www.statnews.com/signup/) ## The Future of Digital Health An insightful newsletter touching on how new technologies can transform digital health. Powered by: Bertalan Meskó, MD, PhD, Director of The Medical Futurist Institute Subscribe: [linkedin.com/newsletters/the-future-of-digital-health](https://www.linkedin.com/newsletters/the-future-of-digital-health-6501324601757442048/) ## MedTech Pulse Full of interesting stats, insights, and projections, MedTech Pulse brings innovations in medicine in a very accessible manner. Powered by: CeramTec Subscribe: [medtechpulse.com](https://www.medtechpulse.com/) ## FemTech Insider The newsletter covers industry news in FemTech, from impressive startup funding raises to tech breakthroughs in female technology. Powered by: FemTech Insider Subscribe: [femtechinsider.com/newsletter](https://femtechinsider.com/newsletter/) ## The Secret Sauce Another newsletter that presents all the technology in healthcare nuances, yet with a focus on enhancing patient care and empathy in healthcare. Powered by: Kris Mulcahy, Director of Business Development and Innovation at Brightisle Subscribe: [linkedin.com/pulse/ai-healthcare-personalizing-patient-care-digital-age-kris-mulcahy](https://www.linkedin.com/pulse/ai-healthcare-personalizing-patient-care-digital-age-kris-mulcahy-iyr5e/?trackingId=%2FI5K%2FtuVTiaImPWXOV%2BvPQ%3D%3D) ## Out-Of-Pocket A simple and funny newsletter explaining the healthcare industry. Sometimes that’s all you need in your mailbox. Powered by: Nikhil Krishnan Subscribe: [outofpocket.health](https://www.outofpocket.health/) ## Rock Weekly Great insights into recent innovations, funds and market statistics. Powered by: Rock Health Subscribe: [rockhealth.com](https://rockhealth.com/rock-weekly/?mc_cid=004ea2384f&mc_eid=fbb3bdc963) ## Healthtech Pigeon News bites from the digital health world, sprinkled with industry events and job opportunities. Powered by: SomX Subscribe: [healthtechpigeon.com](https://www.healthtechpigeon.com/) - - - What newsletters do you recommend? Let us know in the comments below! ## Top Challenges and Opportunities in Digital Health – Experts Insights Shared at the HLTH Conference *Published: 2024-07-10 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/challenges-opportunities-digital-health-experts/index.md* **At the recent HLTH Conference in Amsterdam, industry leaders and experts gathered to discuss the most pressing challenges and exciting opportunities in digital health innovation. From technological readiness and regulatory hurdles to the transformative potential of AI and preventive healthcare, the conversations highlighted the fast-evolving landscape of digital health and medtech. Check out the insights shared at the conference to understand the current state and the future of healthcare innovation.** ## **Top Challenges**
    ![quote](/images/baner_final-quote-fernando-1-.png "quote")
    ### 1. Technological advancements vs. readiness of healthcare systems

    The challenge is not the technology but the readiness to embrace and implement it, especially in healthcare, where things are still quite archaic. There are places that still use fax machines and lots of paper-pushing. There are silos and fragmentation in processes and administration.
    Aahuti Rai, Strategic Advisor, Venture Partner @ Four Points Consulting
    ### 2. Importance of cultural change and mindset shifts

    When discussing data, interoperability, data quality, unstructured data, and structured data, challenges abound. In Brazil, our biggest challenge is the mindset of healthcare leaders. Patients often need to opt in to share their data for better outcomes, and regulatory bodies and healthcare providers can be resistant to data exchange.
    Fernando Campos Soares, Founder & CEO @ Nuria
    ### 3. Regulatory and market understanding

    The regulatory space is another challenge. Having FDA approval is not enough—you also need CMS and Medicaid approval to pay for your product or device. Without this, your product or service won't be implemented or used in the US.
    Dr Adam Brown, Founder @ ABIG Health
    ### 4. Interoperability

    One of the biggest challenges in the US is our disparate electronic healthcare systems (EHRs). Every hospital has a different system. Even though there are major EHR vendors with large market portions, communication between vendors can be challenging.
    Dr Adam Brown, Founder @ ABIG Health
    ### 5. Ensuring Data Privacy and Security

    Anonymous Mode in Flo allows users to use the app without any identifiable information being linked to their account, such as their NAME or email address. It was already in development when the US Supreme Court ruled to overturn Roe v. Wade, but in the wake of that ruling, some users expressed concerns about how their health data might be used by third parties, such as official requests for apps like Flo to share pregnancy data with law enforcement. We believe our users should feel in control and secure when using our app, so we launched Anonymous Mode right away.
    Dr Claudia Pastides, Medical Director @ Flo
    ## Top Opportunities
    ![](/images/baner_final-quote-frank-3-.png "")
    ### 1. AI and biomarkers as a digital health tool

    Another theme I'm passionate about is understanding conditions and populations we've never been able to before, addressing huge inequities in healthcare, and developing so much more understanding through digital health and AI. It’s about focusing on things that get overlooked because there's no immediate financial incentive, and that's where the startup sector shines.
    Aahuti Rai, Strategic Advisor, Venture Partner @ Four Points Consulting

    We think that generative AI, large language models are not good enough yet to independently provide this (mental health treatment). But as a tool, as a co-pilot tool to steer, to help human therapists, I think it's a fantastic tool.
    Michel Valstar, CSO & Co-Founder @ Blueskeye AI

    I believe we will continue the trend of more generalization in AI. We will see more integration of different data sources and more comprehensive models that can draw general conclusions from diverse information. This will be particularly important in healthcare, where integrating historical patient data, environmental data, and other sources will be crucial for effective diagnostics and treatment.
    Bartosz Borucki, CEO @ Smarter Diagnostics
    ### 2. Patient engagement and experience

    Our solution is modular, with five modules that hospitals, clinics, and labs can buy from us and offer to their patients to better their digital journey. The second focus is an integration and interoperability platform. This involves data exchange between hospitals, clinics, labs, and other healthcare solutions, health techs, payers, the pharma industry, and distributors. Essentially, any player in healthcare that needs to automate a service or product, we connect them.
    Fernando Campos Soares, Founder & CEO @ Nuria
    ### 3. Focusing on preventive healthcare

    My favorite trend is preventive healthcare. We are working on this at Smarter Diagnostics because we believe it is the future of healthcare. The term 'healthcare' is misleading because it often deals with diseases rather than health. We need to change this paradigm to truly focus on health.
    Bartosz Borucki, CEO @ Smarter Diagnostics
    ### 4. Innovative collaboration and ecosystem development

    The ability to pull together different stakeholders from various industries with a common goal of improving health is a significant strength. We're tackling issues like the price of innovation, the implications of price on the healthcare workforce, and the future of the healthcare workforce.
    Dr Adam Brown, Founder @ ABIG Health
    ### 5. Empowering the disabled

    I developed a program to train visually impaired women. Nowadays, we run a social enterprise called Discovering Hands. Discovering Hands trains these women, who are the perfect tactile examiners. We also have scientific research on the results of their examinations. They find tumor sizes between six and eight millimeters. We, as doctors, find tumors between one and two centimeters. That makes a big difference because it's not the tumor inside the breast that is the killer; it's always the metastasizing cells sent out from there into the body. If you find it at the earliest possible stage, you will have a cure. In other cases, maybe not.
    Dr Frank Hoffmann, CEO & Founder @ Discovering Hands
    \ As we steer towards the future of digital health, the insights from these experts light the path forward. \ \ By addressing the challenges and seizing the opportunities, we can transform healthcare into a more efficient, inclusive, and innovative field. The question remains: are we ready to embrace the change and drive the future of healthtech? The journey ahead requires not only technological advancements but also a collective effort to reshape our approach to healthcare, ensuring better outcomes for all. ## From Chance to Passion: A Software Tester’s Story *Published: 2024-07-09 | Author: michal-d | Tags: bright story* *Source: https://brightinventions.pl/blog/software-tester-story-michal/index.md* **It’s not a typical tale about a career switch to a quality assurance specialist. Michał didn't plan to be a software tester; he was surprised by it yet couldn’t have embraced it better. Read his career story, learn what he’s eager to know about candidates during interviews as a recruiter, and discover how important hardware testing is in his job.**
    ![software tester's career story](/images/brightstorymichaldgrid.png "software tester's career story")
    ## How did your software tester career kick off? It was a total coincidence and a decision that wasn’t made by me. To give you a bigger picture, **I studied Management Engineering**, and as I approached graduation, I planned to become a business analyst or scrum master. I eventually landed a business analyst internship at a corporation in Gdańsk. Super excited about that, **I arrived on the first day only to be informed that there was a change of plans. It would be a software testing internship after all**. ## How did you react to that? I was a bit surprised. Maybe back then, I wasn’t assertive enough, so I didn’t oppose the change. However, **I quickly started getting interesting tasks and soon found myself enjoying this new role**. ## What surprised you in a software tester role? At first, the fact that it even exists! I mean, I was aware of the role in software development, but I never really thought about its purpose in the whole process. **I was certainly surprised by the amount of repetitive work related to it**. While some might find it boring, I somehow enjoy it. Of course, QA is not the only role that involves repetitive tasks; other professions, including programmers, also have to deal with that challenge. ## Is manual testing a profession that’s about to become extinct? Absolutely not. **Both manual and automated testing have different responsibilities and complement each other**. Automated tests are mostly about regression tests and repetitive tasks, while manual testing focuses on new functionalities and exploratory testing. ## Okay, but what about AI? Will it replace testers? Based on my experience, I don’t see that happening. I think that **there will actually be a greater need for testers to verify AI results**.
    ![AI vs software testers quote](/images/michald_quote_ai.png "AI vs software testers quote")
    ## How did you land at Bright Inventions? It's all thanks to Łukasz, whom I have known for years. He works at Bright Inventions and had been convincing me for years to apply. **For a long time, I thought I couldn't possibly meet the requirements to join the company**. Obviously, **I now regret that hesitation because I really enjoy working here**.
    ![During a team retreat.](/images/michal_team_retreat.png "During a team retreat.")
    During a team retreat.
    ## At Bright Inventions, you test software and its integrations with hardware. Tell us more about it. Yes, **all my desk drawers are full of different devices, cables, trackers, and more**. While working at Bright Inventions, I had the opportunity to be part of various projects, including testing a POS application with multiple devices such as printers, terminals, and POS monitors. Currently, **I am part of a team developing an IoT solution based on a network of bluetooth trackers which is mostly used for device tracking**. The number of usages is almost limitless and it can serve in healthcare, supply chains, or cold delivery chains for example. **Working with Bluetooth is very specific and differs significantly from testing web or typical mobile apps**. It's a truly developmental experience because you must anticipate many factors, such as the impact of wireless headphones connected to a phone on the entire application's operation. It also allows me to conduct some tests outdoors, providing a welcome break from sitting in front of the computer all the time.
    ![testing with bluetooth quote](/images/michald_quote_bluetooth.png "testing with bluetooth quote")
    ## As a tech recruiter, what do you expect from candidates? **I seek people who truly understand what they say they do**. Sometimes, when you learn from a tutorial, you might grasp a framework like Cypress for test automation but not fully understand what automation is all about. I also look for **people who know how to work with software developers** because it can be quite challenging. That’s why soft skills are essential. I usually ask candidates about their experience with cooperation with developers **checking their proactivity, assertiveness, and empathy**. ## What is your after-hours hobby? Since I was a child, **I've always enjoyed assembling Lego**.
    ![Family Lego assembling.](/images/lego_michald.png "Family Lego assembling.")
    Family Lego assembling.
    Now that I have a three-year-old, I can go to the store and pretend that the Lego is only for him. I mostly buy Lego City sets – my son is excited about all the vehicles, and I get to assemble the bricks. It's a win-win! ## How Data-Driven Development Saved a Successful FemTech App Onboarding From a Failure *Published: 2024-01-24 | Author: mateusz | Tags: business, HealthTech, design* *Source: https://brightinventions.pl/blog/data-driven-development-femtech-app-onboarding/index.md* **An 80% onboarding conversion rate for a mobile app is generally a successful metric. However, particularly in the world of software development, everything can be optimized. Or maybe not? Follow the story of how the pursuit of optimization, based solely on assumptions, nearly destroyed the successful onboarding of a FemTech app, and discover how we prevented this using the power of data!**
    ![FemTech app onboarding](../../static/images/pregnancy_app_femtech.png "FemTech app onboarding")
    ## The hypothesis: simplifying onboarding to increase the app sign-up rate While scaling the mobile application offering nutrition and fitness recommendations for pregnant women, we focused on key elements that would help attract more soon-to-be moms. One of the aspects was the quality of the app's onboarding process. The pregnancy app in question had, at that time, an **onboarding process containing 8 steps, divergently helping the app to customize the experience for its expecting women**. So, there weren't only the typical login screens, but the females also answered a bunch of questions such as: * name, * fitness and exercise preferences, * food preferences, * allergies. Although **the onboarding conversion rate was 80%, our client – a Germany-based FemTech startup – questioned whether the detailed onboarding process might deter users from signing up**. We jointly decided to validate this hypothesis. ## The validation: confronting assumptions with data For testing purposes, **we shortened the onboarding process from 8 to 3 steps**, focusing on login, name, and accepting terms, while omitting questions about fitness, food preferences, and other specifics related to pregnancy. What was the outcome? **The app onboarding conversion rate plummeted from 80% to 50%**. How were we able to verify that? Naturally, **thanks to data-driven development which is a process of creating software based on data-driven decisions**. This approach couldn't take place without **analytics tools measuring user actions**. We install these at the early stage of every app we develop. In most scenarios (the pregnancy app included), we install a few different analytics tools to have the opportunity to compare data from various sources and ensure its accuracy. After noticing the initial drop in the onboarding rate, our first step was to verify that there wasn't any crucial bug preventing women from completing the onboarding process. Once we eliminated that possibility, we waited to collect meaningful data. **After analyzing the numbers, we decided with the client to revert to the previous onboarding method. Subsequently, the app onboarding rate returned to 80%**. Imagine making these crucial changes without data-driven development relying only on our feelings or assumptions. **The numbers provided by analytical tools were quite straightforward and quickly helped us verify the hypothesis** and come back to the onboarding that attracted more moms-to-be. **Watch the video to get more onboarding insights from [Mateusz Klimczak](https://www.linkedin.com/in/klimczak-mateusz/), Partner & Head of Delivery @ bright inventions:** ## Key Points to Remember While Designing App Onboarding for Pregnancy Apps ### Confront general best practices 👊 The shorter the onboarding, the better. You might have read that a few times. In the case of applications targeting specific users (like pregnant women), **a longer onboarding process might yield a higher completion rate**. This approach makes women feel cared for and understood by the app creators. ### Show that you know your audience with a personalized approach 👐 More detailed onboarding gives the impression that **the app experience will be truly personalized**. This is particularly crucial in developing FemTech solutions tailored to meet the unique needs of women navigating pregnancy and the postpartum stage. ### Use onboarding to start to build the bond with users 🤝 Thoughtfully designed onboarding is **a crucial first step in forging a long-term bond with women** in the very unique moment of their lives. This is one of the first user interactions, and building a bond and trust from this moment is essential. ### Testing ideas is crucial, but final validation should always be data-driven 🫵 Assumptions should never be a driving force of any change in software development. **Always base your decision on data**. If you are not sure what metric to measure and what analytics tools you should install, check our [mobile app metrics cheat sheet](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/). ## Are you ready to discuss your app's onboarding? Looking for ways to optimize your app onboarding with data-driven development? Contact us to [set up a free consultation in 48 hours](/start-project/).
    [![let's talk](/images/contact_mateusz_0.75.png)](/start-project/)
    ## HLTH Amsterdam 2024 - Was it Worth Attending the eHealth Event? *Published: 2024-07-02 | Author: agata | Tags: HealthTech* *Source: https://brightinventions.pl/blog/hlth-amsterdam-2024-summary/index.md* **[HLTH](https://europe.hlth.com/?utm_source=brightinventions.pl&utm_medium=referral&utm_campaign=2024_blog_summary), the largest health information and technology event in the USA, has now expanded to Europe, choosing Amsterdam for its strong transport links, English proficiency, and attractive amenities. Let's examine whether this European version lived up to its reputation.**
    ![HLTH Europe 2024](/images/hlth-blogpost-cover.png "HLTH Europe 2024")
    ## Organisational aspects The event **was planned to be the biggest health innovation event in Europe**. While I don't have the exact figures, in my opinion, it was undoubtedly one of the best events focused on this topic. The venue was well-designed, featuring seven stages for keynotes and discussions, a medium-sized space for exhibitors, and a nice seating for work, networking, or relaxation. There was also a dedicated space for meetings. **A useful feature was the event's app**, which assisted with networking, program navigation, site orientation, and participant connections. Impressively, the app functioned well, which is IMHO a novelty in the world of conference apps. The additional events, such as boat trips, walking tours, yoga sessions, beach parties, and concerts, were exceptional. The selection of speakers and topics was top-notch.\ \ Well, the additional attractions were great, but was the substantive level up to par?
    ![hlth](/images/frame-2608395.png "")
    ## Business value, covered topics & networking The organizers chose often-neglected topics like taboos, significant e-health/medtech challenges, and important innovations, creating a program that was engaging, educational, and thought-provoking. **Positioning the women's health stage at the center** and naming it "the Heart Stage" was a strategic move, emphasizing the importance of this topic. The organizers deserve applause for **highlighting solutions related to pressing issues**, such as the "Enough" stand developed by Katie White, who is on a mission to deter rape. Discussions at the Heart Stage focused on women's health needs, highlighting how women often neglect their own health and are hesitant to discuss it. This makes it crucial to address women's health as a priority.  Panels also covered menopause, menstrual, and maternal care, which are considered important for future innovations. The Heart Stage hosted LGBTQ-related discussions as well. The conference didn't shy away from topics like **the use of psychedelic drugs in mental health treatments**.  Interoperability was another significant theme, discussed both in presentations and informally. As **[MD MBA Adam Brown](https://www.linkedin.com/in/adambrownmdmba/)** noted, achieving interoperability is essential for realizing the goals of value-based care by improving quality, reducing costs, and enhancing access.

    Having a system that's able to communicate even across vendors has a benefit to a patient. It's hard to get to a place in health care that we are truly exercising the goals or realizing the goals of value-based care where we're improving quality and reducing costs and improving access without interoperability of our digital systems. And so that's one of the big challenges.
    Adam Brown, MD MBA, Founder @ ABIG Health
    AI was a hot topic but didn't dominate the exhibitor space or presentation stages, which is often the case at this and last year's conferences. **[Aahuti Rai's](https://www.linkedin.com/in/meetaahutirai/)** remark is a good summary of the event’s approach to AI:

    I'm not really so buzzed about specific technologies. It's more about how you put them to use and make them relevant for people. For me, it's never been about the actual technology, it's about what the technology enables.
    Aahuti Rai, Strategic Advisor & Venture Partner @ Four Points Consulting Ltd
    The pre-conference day, "Day 0," included **workshops focused on specific European digital health markets**, providing valuable insights into the legal and regulatory challenges and differences across countries. This day was especially beneficial for startups and scale-ups planning to expand their products. The event also delved into the role of internet influencers and social media in patient education, questioning the balance between promoting healthy lifestyles and proposing unrealistic beauty standards. ## The area to improve And now a few words of criticism. As much as **networking is definitely the strongest aspect of the event**, the organizers should improve the organization of meetings so that in the next edition, participants can make the most of it, reducing the time and stress of finding their interlocutors.
    ![hlth_networking](/images/frame-2608396.png "")
    In summary, HLTH Europe was an invaluable networking hub filled with discussions addressing digital health needs and challenges. It's an essential venue for anyone looking to inspire and address challenges in their health tech solutions. **And it was definitely worth attending**. ## Recruiting Like a Pro: 5 Marketing Tips for Smarter Hiring *Published: 2024-06-30 | Author: ula | Tags: leadership, recruitment, HR* *Source: https://brightinventions.pl/blog/5-things-recruiters-can-learn-from-marketers/index.md* You have probably heard about recruitment marketing – the process of attracting top talent by promoting your organization’s brand using various marketing methods and tools. In fact, marketing elements are present throughout the entire recruitment cycle, often adding significant value to the candidate experience. My background in marketing allowed me to uncover the synergies between marketing strategies and effective talent acquisition practices many years ago. Marketing skills can be incredibly beneficial in both your role as a recruiter and your organization's recruitment processes. Being an effective recruiter involves many of the same skills that talented marketers possess. ## 1. Lifelong learning Being a lifelong learner is something that I have always believed in. The pace of change in the market is high, especially in IT sector. Great marketers have a desire to deepen their knowledge about marketing trends and industries they work in. They change together with the market to offer their clients the best quality experience. 

 As a recruiter you should be up-to-date with recruitment and marketing trends. Probably you will use social media on daily basis either to contact your candidates or just to increase your brand/organisation/client awareness among your target group. Choose learning tools which work best for you: read business books or blogs, subscribe to newsletters, listen to podcasts, watch webinars, take part in workshops, do courses, join a study group. There are many ways to grow.

 What I find especially exciting in marketing field is learning by experiments. I am not saying you should all the time reinvent the wheel, but to some extend it is advisable. **Perform some tests to gain new insights or data. You can alter the copy or graphics in your recruitment posts, try out new job boards or look for new channels to reach your target group. Learn, experiment and achieve better and better results.** ## 2. Analytical thinking And it all brings us here. Experimenting and learning without analysing the effects would be pointless. In marketing I have always worked with data. I am comfortable with metrics and I usually know how to interpret them. Imho in recruitment area it should be the same. As a recruiter your goal is to meet the organisation’s goals. Y**ou have to look beyond isolated application and identify which metrics may help you reach the expected results in a given time.** Knowing how to use some analytical tools is just step one though. In fact, this tool tool can be sometimes your Excel or Google sheets table. Do not forget that there is much more than the tools. There are multiple factors that may affect how effective your recruitment process is. It is crucial to know how each and every variable influences your performance and ho to use these dat to make the best hiring decisions.
    ![recruitment metrics](/images/recruiting-metrics-updated.webp "")
    ###### Source: https://www.aihr.com/blog/recruiting-metrics Sometimes this variable can be the type of role you are recruiting for, vacancy you have to fill, and the number of specialists available on the market that may differ depending on the position. Another time your variable may be the seasonality that can affect your planning. There are some months which are considered to be the best ones for hiring new employees. Check on your own which period of the year works best for you and your organisation. You should also keep in mind industry fluctuations and economic situation. Analysing all these data can help you optimise your recruitment actions and understand the market trends. **Look for patterns and road blocks that may help you run the recruitment process in the long term. Do not only analyse the data considering your own processes but also pay attention to the industry itself and your competitors. You should be able to see whether they affect the position of you offer in the market.** ## 3. Creativity and innovation A good marketer knows that creativity and innovation can come from almost anywhere and anyone - from friends, partners, clients, colleagues at work, surroundings, nature, even random incidents. All these can give us a fresh view on a product or service we want to deliver. While working in recruitment you will have to be active at least on one or a few social media platforms, especially these where your target group can be found. Social media sites let you upload photos and videos that may attract your followers’ attention. However, only text can become boring for the audience. And a good idea might be involving some visual aspects. These might be pictures infographics or videos that make your written content stand out. You don't need a graphic designer for that - you can create visual content using free tools or modifying available templates. **Think outside the box - think why the role you are recruiting for is unique, how the job offer can help to develop your candidate’s skills etc. Think about your target group and show them things they are interested in in the formula that can grab their attention.** Invest in media to attract, inform, and delight your target groups when they are most open to your content. Invest in continuous exploration of new ideas to stay fresh with candidates. ## 4. Strategic thinking Strategic thinking is one of major strengths of talented marketers and it begins with seeing questions before seeing solutions. Marketers who think strategically focus on how they can help their customers solve some problems. The final outcome is of course connected with getting a sale, but strategical thinkers focus more on getting to know their customers first and creating some long-term relationship with them. When the sale is done the customers have to feel that it is what they really expect or need.
    ![strategic thinking recruitment](/images/screenshot-2024-06-30-at-19.30.37.png "")
    ###### Source: https://betterprogramming.pub/how-to-develop-your-strategic-thinking-skills-and-stay-ahead-d52612b4254d The same applies to recruiters. You should not perceive a recruitment process as a pure transaction. **You should put both candidate’s and employer’s needs at the forefront of your decision. Rather than just selling the job offer your focus should be on what can be done to solve both sides’ problems.** Look at your target group and the challengers they are facing. You need the ability to see things from a broader perspective. **Do not see recruiting as filling the vacancy, but more as an evolving process that has to bring the real value to the business and applicants.** ## 5. Knowing your “product” well Good markers have usually a great knowledge about products they sell. They understand the details, features, facts and benefits of using a product their company is selling. They also know how their product meets customers’ needs in comparison to the competitor’s products. How do they utilise three product knowledge? By presenting the product to potential customers, answering their questions and providing guidance and support to these who have some issues. The broad knowledge of the products lets them negotiate and closed deals based on the organisational as well as customers’ expectations. If you are a recruiter, dig deep in the domain you work in. Finance, retail, logistics, health, tech - understand the industry and the role candidate are applying for. **The knowledge about the role is your product knowledge. It's important to understand the duties, risks, values, and benefits of the role. Knowing what the daily job entails will help you communicate effectively and empathize with those involved.** Focus on your applicants expectations and how the role they applied for may help them grow and develop in the sort or long-term. Your applicants are somehow your customers. And what the best way to understand the product? Try it out on your own or talk with people who use it. Probably in the recruiting world it would be hard to try out every job but you can always talk with professionals who do it and will help you discover strengths and weakness or advantages and disadvantages you should be aware of. **Get feedback as often as you can. Learn from experts and keep up to date with industry trends.** ## The passion of explorer, researcher, creator … Look for inspiration everywhere. As a recruiter you do not have to follow only pure HR trends or best practices. Truth is that you can find some interesting approaches in completely different industries. **Considerable ingenuity, creativity and curiosity are the qualities highly desired in this role. Grow horizontally and expand what you know by reading books, learning concepts, etc. about the professions and sectors around you.** Take as much as you can from the marketing field as well, but try not to limit yourself to the area you work in on daily basis. ## Using OpenAI Assistant v2 API to Build Your Own Knowledge Base Chatbot in 5 min *Published: 2024-06-24 | Author: rafal h | Tags: AI, OpenAI, GPT, Assistant, RAG* *Source: https://brightinventions.pl/blog/how-to-build-gpt-assistant-v2/index.md*
    ![GPT assistant](../../static/images/GPT_assistant_v2.png "")
    **Some time ago, I created a [blog post](/blog/how-to-build-gpt-assistant/) on how to build your own chatbot using OpenAI's Assistant API in its v1 Beta. Since then, OpenAI has introduced v2 Beta [updates](https://platform.openai.com/docs/assistants/whats-new), and [GPT-4o](https://openai.com/index/hello-gpt-4o/) has been released. Let's delve into these developments to see how they can enhance our capabilities.** ## Assistant v2 API Updates OpenAI has introduced some cool new features in the v2 API that we can leverage for our bots: - **Improved file retrieval & parsing** - We can now import more knowledge files, parallelize them, and use them more efficiently than before. The notion of `vector stores` has been introduced, which allows for more efficient file searches. - **More granularity in user control** - We can adjust the temperature for bot outputs (to control creativity), change the Top P setting, which affects bot diversity, and set the maximum number of tokens to control spending. - **New models** - In addition to using fine-tuned models in the v2 API, we also have the option to use OpenAI's flagship model, GPT-4o. [GPT-4o is twice as fast and twice as cheap compared to GPT-4 Turbo](https://community.openai.com/t/announcing-gpt-4o-in-the-api/744700), although it is still [10x more expensive](https://openai.com/api/pricing/) than `GPT-3.5-turbo-0125` but is worth considering if you need more power for your use case. ## How to Create an Assistant? If you followed my [blog post](/blog/how-to-build-gpt-assistant/) and created a v1 bot via Playground, you should be able to easily migrate to v2 using the new API version. If you are starting from scratch, you need to create an OpenAI account and load it with resources. Then, head over to the [assistant tab](https://platform.openai.com/assistants) and click on the `Create` button. First, enter the name of your assistant. Follow the provided instructions and select a model depending on your use case and the balance between "intelligence" and the number of queries your bot will handle (knowledge size, potential user count, etc.). In the retrieval part of the menu, add files that will be your external knowledge fed into the chatbot. For this tutorial, we will go with default file storage settings.
    ![File storage settings](../../static/images/how-to-build-gpt-assistant-v2/files.png "")
    ## GPT Assistant Use Case For this example, I will be using our Bright Inventions webpage data as knowledge for our chatbot. I created the `Bright assistant`, a helpful bot for employees to gather more information about the company without needing to scan the entire webpage. The use cases are unlimited - for instance, you could create a chatbot for potential customers to streamline the process of verifying the company’s experience and portfolio, or a customer support chatbot to feed in company FAQ knowledge. The site is hosted on [GitHub](https://github.com/bright/new-www), and the relevant knowledge is located within markdown [files](https://github.com/bright/new-www/tree/gatsby/content/our-areas). By manipulating files, I created `our-areas.txt`, a collection of all markdown posts from the [our-areas folder](https://github.com/bright/new-www/tree/gatsby/content/our-areas), and `our_projects.txt`, a text file containing all merged markdown files from the [projects folder](https://github.com/bright/new-www/tree/gatsby/content/projects). I uploaded them to my assistant and added them as knowledge.
    ![Knowledge store](../../static/images/how-to-build-gpt-assistant-v2/knowledge.png "")
    I added instructions for how the bot should behave, what knowledge was fed to it, and how the files are structured inside. I selected the `gpt-3.5-turbo-0125` model for a good balance between accuracy and costs and set the temperature to the minimum to ensure the bot is not too creative.
    ![Own assistant](../../static/images/how-to-build-gpt-assistant-v2/bright_assistant.png "")
    When I created my assistant, I started to test it via the playground by asking for knowledge available from the data:
    ![Own assistant response](../../static/images/how-to-build-gpt-assistant-v2/chatbot.png "")
    Hope you enjoy the tutorial! If you created a bot with the v1 version, make sure to upgrade to v2 and check out its improved performance. You will likely save some money on queries and make the reasoning more efficient. ## How to Reduce Telemetry Data Produced by Your App *Published: 2024-06-24 | Author: maciej-n | Tags: opentelemetry, monitoring, observability, infrastructure* *Source: https://brightinventions.pl/blog/how-to-reduce-telemetry-data-produced-by-your-app/index.md* In previous articles, we discussed how to connect your application to Grafana using OpenTelemetry: https://brightinventions.pl/blog/how-to-improve-your-app-observability-easily-with-grafana-and-opentelemetry https://grafana.com/blog/2023/10/30/how-to-integrate-a-spring-boot-app-with-grafana-using-opentelemetry-standards While observability and monitoring are crucial throughout the lifecycle of a production application, budget constraints at the beginning of a project often prevent us from affording additional costs for monitoring tool subscriptions. In such cases, focusing on storing only essential data is vital. Fortunately, Grafana Cloud offers a free plan for small teams. However, when sending all telemetry data gathered by OpenTelemetry auto-instrumentation, we can quickly reach the free tier limit, especially with metrics. ## So what can we do about it? In this article, we will discuss several methods to reduce the amount of telemetry data produced by your application. ### Identify unnecessary metrics The first step is to review all metrics produced by your application and determine if you are using them (or plan to use them in the future). Grafana provides a tool called Cardinality Management to review metrics production. It can be found at `{myaccount}.grafana.net` -> Home -> Dashboards -> GrafanaCloud -> Cardinality Management - 1 - Overview. ![](https://lh7-us.googleusercontent.com/docsz/AD_4nXd36NuLm3953N-AllvX4X5gWHIud2gzBjNGR5q7ubUQjZA-OILL6rlT3SmQyp32c1QuuJA2v7VoXXw14ptOLS6XNHwKYGfDJGXBx3m-4JkCUOf-7ya_CB2haF1dKN4pogMJWF5073sgLch334TY9l2OmDmc?key=SAsVSNF7tYs-3QAXxC5B1w) For example, in Java auto-instrumentation for Spring Boot applications, we have two very similar metrics: * `http.server.requests` * `http.server.request.duration` The first metric is provided by Spring Boot, and the second one by OpenTelemetry. There is no reason to keep both since they essentially provide the same information. I decided to keep the one provided by OpenTelemetry and drop the other using the [filter processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/filterprocessor) in my opentelemetry-collector-contrib: ```yaml metrics: exclude: match_type: strict metric_names: - http.server.requests ``` ### Identify unnecessary labels If you need to retain the rest of your metrics but their series count is too high, Grafana suggests removing some labels to reduce cardinality. The second part of the Cardinality Management dashboard lists the “Top labels by value count”. In my case, the biggest issue was with the http.server.duration (later changed to http.server.request.duration) metric. To keep only essential labels, you can aggregate labels using the [metricstransform processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/metricstransformprocessor): ```yaml metricstransform/aggregate_http_server_request_duration_labels: transforms: - include: http.server.request.duration action: update operations: - action: aggregate_labels label_set: [ deploy.environment, service.name, http.method, http.status_code, http.route, instance, user_agent.original ] aggregation_type: sum ``` ### Histogram view customization Even after aggregating the labels, the http.server.request.duration metric continued to produce an excessive number of active series, primarily due to the buckets used for grouping request duration times. ![](https://lh7-us.googleusercontent.com/docsz/AD_4nXduuuETQjGCV2fccwvkvwZrXFoAs8hwJTBWpyU6iUYbWbljAfO2zWwQQA9_uIdb1o2pu7dIkJvrjxC0Qe6dsodj7be-kNBtBNQPT3myasJ-hvcVhtpiFx8yXsB3SnIxfA7ys9zmmtfufrgJbCmynpWlnd8a?key=SAsVSNF7tYs-3QAXxC5B1w) We used a custom view for HTTP metrics histograms to set our custom bucket boundaries. We added the file metrics_view_config.yaml: ```yaml - selector: instrument_type: HISTOGRAM instrument_name: http.* view: aggregation: explicit_bucket_histogram aggregation_args: bucket_boundaries: [0.05, 0.25, 1.0] ``` And set the environment variable: OTEL_EXPERIMENTAL_METRICS_VIEW_CONFIG=opentelemetry/metrics_view_config.yaml For JavaScript/TypeScript instrumentation, the custom boundaries may be set in NodeSDK: ```typescript const sdk = new opentelemetry.NodeSDK({    traceExporter: traceExporter,    metricReader: metricReader,    views: [        new View({            aggregation: new ExplicitBucketHistogramAggregation([50, 250, 1000]),            instrumentType: 'HISTOGRAM',            instrumentName: 'http.*'        })],    sampler: sampler,    resource: resource, }) ``` ### Reduce the number of traces Even before your application’s traffic becomes significant, it may produce many traces. To reduce the number of traces sent to storage, you can apply the [tail_sampling processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor): ```yaml tail_sampling: decision_wait: 10s num_traces: 100 policies: [ { name: errors-policy, type: status_code, status_code: { status_codes: [ ERROR ] }, }, { name: minimal_latency_policy, type: latency, latency: { threshold_ms: 200 } }, { name: randomized-policy, type: probabilistic, probabilistic: { sampling_percentage: 5 }, } ] ``` Policy Analysis: * errors-policy: Retains traces where the status code indicates an error, ensuring error traces are always sampled for further analysis. * minimal_latency_policy: Retains traces where the latency is below 200 milliseconds, capturing minimal latency traces for performance optimization. * randomized-policy: Retains a random sample of 5% of all traces, providing a general overview of the system's performance and behavior. The tail_sampling processor evaluates traces based on these three policies, capturing all error traces, traces with minimal latency, and a random 5% of all traces. It waits 10 seconds to gather complete trace data and processes up to 100 traces at a time. Full Example of collector-config.yml: ```yaml extensions: basicauth/grafana_cloud_tempo: client_auth: username: "${TEMPO_USER}" password: "${TEMPO_PASSWORD}" basicauth/grafana_cloud_prometheus: client_auth: username: "${PROM_USER}" password: "${PROM_PASSWORD}" basicauth/grafana_cloud_loki: client_auth: username: "${LOKI_USER}" password: "${LOKI_PASSWORD}" health_check: endpoint: 0.0.0.0:${HEALTHCHECK_PORT} receivers: otlp: protocols: http: endpoint: 0.0.0.0:${HTTP_PORT} processors: batch: tail_sampling: decision_wait: 10s num_traces: 100 policies: [ { name: errors-policy, type: status_code, status_code: { status_codes: [ ERROR ] }, }, { name: minimal_latency_policy, type: latency, latency: { threshold_ms: 200 } }, { name: randomized-policy, type: probabilistic, probabilistic: { sampling_percentage: 5 }, } ] resource/loki-labels: attributes: - action: insert key: loki.resource.labels value: service.name, deploy.environment filter/drop_springboot_metrics: metrics: exclude: match_type: strict metric_names: - http.server.requests transform/add_resource_attributes_as_metric_attributes: error_mode: ignore metric_statements: - context: datapoint statements: - set(attributes["deploy.environment"], resource.attributes["deploy.environment"]) - set(attributes["service.name"], resource.attributes["service.name"]) - set(attributes["instance"], resource.attributes["instance"]) metricstransform/aggregate_http_server_request_duration_labels: transforms: - include: http.server.request.duration action: update operations: - action: aggregate_labels label_set: [ deploy.environment, service.name, http.method, http.status_code, http.route, instance, user_agent.original ] aggregation_type: sum - include: http.server.duration # old metric name from java-agent-1.27.0 action: update operations: - action: aggregate_labels label_set: [ deploy.environment, service.name, http.method, http.status_code, http.route, instance, user_agent.original ] aggregation_type: sum exporters: otlp/grafana_cloud_traces: endpoint: "${TEMPO_ENDPOINT}" auth: authenticator: basicauth/grafana_cloud_tempo prometheusremotewrite/grafana_cloud_metrics: endpoint: "${PROM_ENDPOINT}" add_metric_suffixes: false auth: authenticator: basicauth/grafana_cloud_prometheus loki/grafana_cloud_logs: endpoint: "${LOKI_ENDPOINT}" default_labels_enabled: job: true exporter: true auth: authenticator: basicauth/grafana_cloud_loki logging: verbosity: detailed prometheus: endpoint: "0.0.0.0:8889" add_metric_suffixes: false service: telemetry: logs: level: info extensions: [health_check, basicauth/grafana_cloud_tempo, basicauth/grafana_cloud_prometheus, basicauth/grafana_cloud_loki] pipelines: traces: receivers: [otlp] processors: [batch, tail_sampling] exporters: [otlp/grafana_cloud_traces] metrics: receivers: [ otlp ] processors: [ batch, filter/drop_springboot_metrics, transform/add_resource_attributes_as_metric_attributes, metricstransform/aggregate_http_server_request_duration_labels ] exporters: [ prometheusremotewrite/grafana_cloud_metrics, prometheus ] logs: receivers: [ otlp ] processors: [ batch, resource/loki-labels ] exporters: [ loki/grafana_cloud_logs, logging ] ``` By following these steps, you can effectively reduce the telemetry data produced by your application, staying within the limits of Grafana Cloud's free plan while maintaining essential observability. ![](https://lh7-us.googleusercontent.com/docsz/AD_4nXfa-36n8nMvYawaI31ExVkK5Ekcew8HvIP4F0MwcFkBuoKB-YiOPyaedkCCGLuv7AqEhHbpl3NVOgypMqdz4KVUBJqo6I8GW9J5F7CUKZFCFcNXioZNB_RZoVHg9sl8rA-8ALA-rd8oXb8Sd2cP67pyyy8z?key=SAsVSNF7tYs-3QAXxC5B1w) ## Summary This article outlines various methods to reduce the amount of telemetry data produced by your application, focusing on essential metrics, eliminating unnecessary labels, customizing histogram views, and reducing the number of traces. By implementing these strategies, you can optimize your telemetry data and make efficient use of Grafana Cloud's resources without incurring additional costs. These practices are confirmed by multiple reliable sources from Grafana’s own documentation and related expert articles. ## 30th Anniversary of Nielsen’s Heuristics - Real Life Examples in Transport Management System *Published: 2024-06-13 | Author: joanna-c | Tags: design* *Source: https://brightinventions.pl/blog/nielsen-heuristics-examples/index.md* 30 years ago, one of the pioneers of UX, Jakob Nielsen introduced 10 usability heuristics, which now have become the general rules of thumb when it comes to designing digital products with better user experience. What are the now iconic heuristics? How do we apply these principles when designing products? Let me show you.
    ![30th Anniversary of Nielsen’s Heuristics](/images/nielsen_cover.png "30th Anniversary of Nielsen’s Heuristics")
    ## 1. Visibility of the system status > The design should always keep users informed about what is going on, through appropriate feedback within a reasonable amount of time. To achieve that we need to make sure the system communicates every action the user takes. We shouldn’t leave them without any feedback. Let’s take a look at the TMS app: 
    ![A toast with text "Offer no longer available"](/images/screenshot-2024-06-13-at-11.48.28.png "")
    We’re explaining to users who clicked on an offer, which has expired, why they cannot go further in the system with it, by showing a toast for a few seconds with appropriate information. ## 2. Match between the system and the real world > The design should speak the users' language. Use words, phrases, and concepts familiar to the user, rather than internal jargon. Follow real-world conventions, making information appear in a natural and logical order. Icons that inform about the status of the car, such as loading, unloading and en route. They’re clear, have one meaning and correspond to the users’ mental model. 
    ![car icons](/images/screenshot-2024-06-13-at-11.50.36.png "")
    ## 3. User Control and Freedom > Users often perform actions by mistake. They need a clearly marked "emergency exit" to leave the unwanted action without having to go through an extended process. Clear navigation and an accessible back button are always available. This allows users to exit whenever they want to and freely navigate through the whole application.
    ![screen from the TMS app](/images/going_back.png "")
    ## 4. Consistency and Standards > Users should not have to wonder whether different words, situations, or actions mean the same thing. Follow platform and industry conventions. No matter what the button's purpose, the pattern of the state, whether they’re disabled or focused, should always stay the same. That way, whenever the user interacts with it, they know what’s going on and it enhances the learnability aspect of the system. 
    ![buttons in the design system](/images/screenshot-2024-06-12-at-15.21.06.png "")
    ## 5. Error Prevention > Good error messages are important, but the best designs carefully prevent problems from occurring in the first place. Either eliminate error-prone conditions, or check for them and present users with a confirmation option before they commit to the action. Before performing a significant action that could have an effect on other instances, always confirm with the user. There’s always a possibility that the user clicked on it by mistake. What then? 
    ![](/images/pop-up.png "")
    ## 6. Recognition Rather than Recall > Minimize the user's memory load by making elements, actions, and options visible. The user should not have to remember information from one part of the interface to another. Information required to use the design (e.g. field labels or menu items) should be visible or easily retrievable when needed. In the case of TMS application, when it comes to field labels - they are visible all the time. Let’s imagine a scenario in which you, as the user, are filling out a form. You swiftly move from one field to another, you click on another field and all of a sudden someone needs your help, they’re shouting your name, asking you questions and once they’re done, you have to take a minute to remember what field you were on, since you had already clicked on the field, the placeholder is gone. But thanks to the floating label, you don’t need to think about it, you already know what you’re supposed to type in. 
    ![](/images/screenshot-2024-06-12-at-14.33.39.png "")
    ![](/images/screenshot-2024-06-12-at-14.33.21.png "")
    ## 7. Flexibility and Efficiency of Use > Shortcuts — hidden from novice users — may speed up the interaction for the expert user so that the design can cater to both inexperienced and experienced users. Allow users to tailor frequent actions. Those users who are more experienced might want to narrow down the offers to specific ones. In this case, filters and sorting will help reduce the amount of offers and show the ones that are wanted. 
    ![](/images/screenshot-2024-06-13-at-12.06.26.png "")
    ## 8. Aesthetic and Minimalist Design > Interfaces should not contain information that is irrelevant or rarely needed. Every extra unit of information in an interface competes with the relevant units of information and diminishes their relative visibility. Hierarchy of information is crucial here. It helps to avoid visual clutter and reduce cognitive load.
    ![add carrier](/images/add-external-carrier-2.png "")
    ## 9. Help Users Recognize, Diagnose, and Recover from Errors > Error messages should be expressed in plain language (no error codes), precisely indicate the problem, and constructively suggest a solution. The user knows that they need to insert the correct date in the appropriate format. The message is clear, the date format is given, so that there’s no doubt about what should be corrected. 
    ![date UI](/images/screenshot-2024-06-13-at-12.08.39.png "")
    ## 10. Help and Documentation > It’s best if the system doesn’t need any additional explanation. However, it may be necessary to provide documentation to help users understand how to complete their tasks. In such cases, a hover interaction on the information icon explaining what the shortcuts might mean for the new users is always available by the “suggested car” label. 
    ![label](/images/tms_smaller_mockup.png "")
    \ As you can see, 30 years have passed since Nielsen introduced the guidelines of creating a user-friendly interface, however they’re still very much true. It’s likely that they will apply for the future UI. The question is whether (or how much) will they adjust to new technologies?  You can find out more about heuristics here: [nngroup.com/articles/ten-usability-heuristics](https://www.nngroup.com/articles/ten-usability-heuristics/) ## Let’s Meet at HLTH Europe and Spread the Word About Your Company *Published: 2024-04-08 | Author: izabela | Tags: HealthTech, bright insights* *Source: https://brightinventions.pl/blog/hlth-europe-conference/index.md* **From June 17-20 in Amsterdam, HLTH Europe will bring together key decision-makers across providers, payers, government, pharma, startups, investors, and health tech. This is the last chance to join the event. Do you want to spread the word about your solution? As an HLTH Europe media partner, we’d love to share your startup story. Let’s meet in Amsterdam!**
    ![HLTH Europe](../../static/images/hlth_europe_blog_post.png "HLTH Europe")
    ## Meet with our team and share your story Agata and Mateusz will represent Bright Inventions at HLTH Europe. As a media partner, we plan to meet as many HealthTech companies as possible and share their stories. **Connect with Agata and Mateusz to grab a coffee during the event and discuss your healthcare solution**. [Connect on LinkedIn with Agata](https://www.linkedin.com/in/agata-piwko-269077b5/) [Connect on LinkedIn with Mateusz](https://www.linkedin.com/in/klimczak-mateusz/)
    ![Bright Inventions at HLTH Europe](/images/hlth_amsterdam_blog_cover.png "Bright Inventions at HLTH Europe")
    ## Register with a discount Haven’t you registered for the conference yet? Join 3,500+ health leaders from over 50 countries. Also, take a part in sessions with over 280 industry leaders taking the HLTH stage. **We’ve got a discount code for you! Save €150 on your ticket with this code: HE24_BI150. [Register now](https://europe.hlth.com/?utm_source=brightinventions.pl&utm_medium=referral&utm_campaign=blog_post)!**
    ![HLTH Europe](../../static/images/bright-inventions-co-marketing-partner-email-header-1920-x-1080-px-2-.jpg "HLTH Europe")
    ## HLTH Europe 2024 speakers Over 250 speakers will take to the HLTH Europe stage. They represent companies and organizations like the WHO, Mayo Clinic, Google Health, Roche, Bayer, Uber, AWS, NHS England, and more! Check the full list of [2024 Speakers - HLTH Europe](https://europe.hlth.com/speakers?utm_source=brightinventions.pl&utm_medium=referral&utm_campaign=blog_post). **See you in Amsterdam!** ## Blooming Teams, the Sustainable Agile Way *Published: 2024-06-11 | Author: kasia | Tags: Agile, agile mindset, project management, leadership* *Source: https://brightinventions.pl/blog/blooming-teams-the-sustainable-agile-way/index.md* I like to think that the role of a Scrum Master is similar to that of a gardener. Your responsibility is to **ensure that what you care for has the best environment to grow, in a shape and direction that is both beneficial and sustainable**. It’s a wholesome vision and one that always reminds me of what’s most important in an Agile project. There are more parallels between nature and project management than you might think. The laws of nature surround us in our everyday lives, and the work environment is no different. ## Forest Succession A comparison of process change to forest succession is an idea introduced to me by [Esther Derby](https://estherderby.com/) during the [ScanAgile 2024 conference](https://www.scan-agile.org/previous/scanagile-2024/program-2024/) in Helsinki, and it resonated deeply. Simply put, **a forest does not appear overnight**. First, the soil needs preparation, followed by the appearance of small shrubs, and so on. The trees will not grow immediately; all these steps are necessary. It’s a process. One cannot simply plant a forest on any soil and expect a lush explosion of greenery the next day.
    ![](/images/pexels-lauripoldre-20630040.jpg "")
    This incremental perspective aligns well with the Agile approach. **You work incrementally, adapting and tweaking things as you go, maturing over time**. This applies to building a company culture or forming a team within a project. As an Agile leader, you observe and build processes step by step, in a sequence that delivers better results over time. ## Weeds The unwanted guests in the garden often spread most easily. That’s the unfairness of life, I guess. Unfortunately, **bad habits do not require the same amount of care to thrive as good ones**. This also applies to project practices. Weeds could be weak tests, pointless meetings, or code reviews that are just mindless “OKs”—all behaviors that undermine team agreements and trust. Fortunately, in Scrum, we have a gardener—the Scrum Master—whose main role is to care for the well-being of the team and its processes. They should spot the weeds and address them before they overgrow the patch. ## Shade and Sun Some plants thrive in the sun, while others grow best in the shade. **The same environment will not work equally well for everyone**.
    ![](/images/pexels-greggalasimage-2092828.jpg "")
    One of the gardener’s tasks is to understand what each plant needs and ensure they provide the right resources at the right place and time. The same applies to the project team—each person is unique, which means there is no miraculous recipe for great team cooperation. Constant observation and care are key. ## Biodiversity Even if a forest seems to consist only of tall trees and chirping birds, every little aspect is crucial. The tiny bugs are just as necessary as the huge bears. Teams made up only of outspoken leaders, even though they might look good on paper, rarely work together effectively. **In the project ecosystem, balance is needed just as it is in nature.**
    ![](/images/pexels-pixabay-248342.jpg "")
    Additionally, when people work only with like-minded team members, they lose valuable opportunities for learning from each other. Not sure about the real forest, with bears and bugs learning from each other, but that might be interesting to observe. ## Make Space for Things to Grow In a crowded patch, it’s hard for all plants to grow harmoniously. The fastest-growing plants can take over and crowd out the others. Similarly, in today’s packed projects, you cannot expect additional processes to fit in easily by themselves. **If you want a given practice or technique to happen, plan a slot for it**. If you’d like to introduce some QA testing, it should be clearly incorporated into the process, with dedicated timing in the task flow, and taken into account when estimating. It’s not enough to say, “Let’s do it.” Throwing expectations at teams without accommodating for the change will not improve the chances of success. If you want a plant to grow vertically, place a pole. **If you want a change to take place in a given direction, ensure there is actual space in that direction**. ## The Soil **Company culture and its values build the soil**—the environment in which we can all grow or slowly wilt. Do you want a thriving environment? As Esther Derby pointed out in her ScanAgile presentation, do not focus only on hiring the best people. Work on the soil—the company environment—as well.
    ![](/images/pexels-binyaminmellish-169523.jpg "")
    I think that this point of view represents the way we work at Bright Inventions. **The values, communication, culture and feedback allow people to grow together and stick together.** Recruitment of great talents is not enough, we do not meet as final versions of ourselves. It takes dedication and care to build a thriving environment and I greatly appreciate what we create every day at Bright. That said, just as with plants and soils, not every soil will benefit every plant. Some, however, are more fertile than others, and that’s always a good start. ## Sustainability **Agile means a sustainable approach.** One that focuses on delivering quickly, yes, but with a long-term goal in mind. We’re not there yet with the product, but we want to get your feedback to improve in the next steps. All this embracing change and building increments—it’s worth it only if there will be next steps, ones in which we incorporate the feedback and grow.
    ![](/images/pexels-anete-lusina-6331046.jpg "")
    Agile also means focusing on people, as they are the ones who need the product and the ones who work on the product. Finding a harmonious way to develop solutions and operate an organization needs to be sustainable, so why not draw inspiration from the queen of sustainability—Mother Nature? ## Is Your App Healthy? Unlock Performance Monitoring for HealthTech *Published: 2024-03-13 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/healthcare-app-performance-monitoring/index.md* **Every software product eventually reaches a point where closely monitoring its condition becomes essential. The sooner you start monitoring your product, the better the outcomes for your business will be. Let us guide you through implementing application performance monitoring for your eHealth solution, including a technical tutorial and performance metrics cheat sheet.**
    ![application performance monitoring](../../static/images/healthcare_app_performance_monitoring.png "application performance monitoring")
    ## What is app performance monitoring and what does it bring to the HealthTech table **Performance monitoring involves regularly checking the "vital signs" of your application** to keep an eye on its performance, which is especially crucial as the number of users increases. **Every company with a growing product faces the challenge of scaling its infrastructure in line with the increasing number of users**. Performance monitoring is a great tool to handle this challenge proactively. ### Example of performing monitoring use case in eHealth Imagine an app designed to remind your users about taking medication or joining a video consultation with a doctor. However, the notification meant to prompt these actions isn't sent. **How can you actually realize that the notifications don't work?** It's difficult to notice when something doesn't happen. Yet, **with app performance monitoring, you can track every feature, including sending notifications**. This way, you'll quickly know when any part of the app doesn't function as intended. ## The best moment to set up performance monitoring Ideally, you should establish basic performance monitoring before launching your product to measure key metrics and verify that your solution functions correctly. Unfortunately, p**erformance monitoring often becomes a tool companies turn to only after experiencing performance issues**, especially those related to an increasing number of users. By this point, **it might be too late to restore trust among your end-users who might have been frustrated by the app’s performance issues**. Starting early with performance monitoring can help you prevent such situations by identifying and addressing potential issues before they impact the user experience. ## Powerful advantages of application performance monitoring ### Faster reaction times You no longer have to wait for your clients to inform you of a problem with your system. **You can even detect symptoms of potential issues before they occur**. If you notice that certain parts of the app are starting to slow down, you can proactively investigate the cause before it begins to impact your users. ### Better scalability planning Performance monitoring provides the data needed to make data-driven decisions about when and how to scale. For example, **it allows you to precisely identify peak usage periods that require additional resources to maintain optimal performance**. ### Fast track to machine learning Performance metrics are numerical values that enable quick automation with machine learning. **AI can learn from the provided data and detect issues that are invisible to the human eye**. Some tools, like [Grafana Cloud even offer ML](https://grafana.com/docs/grafana-cloud/alerting-and-irm/machine-learning/) monitoring out of the box. ## Setting up app performance monitoring – tutorial & tools It is a common misconception that implementing performance monitoring is time-consuming and therefore costly. **In reality, an experienced software development team might implement standard performance monitoring even within a day**. If you lack performance monitoring experts on your team, you can either hire a software development agency to establish monitoring or acquire the knowledge internally. Common standards are extensively discussed within the community, making it easy to set up basic monitoring with a handful of tutorials. **Our performance monitoring team has prepared a guide for setting up performance monitoring using the OpenTelemetry standard** – an open-source solution for implementing monitoring across your applications. OpenTelemetry provides a unified set of APIs, libraries, agents, and instrumentation that allow you to collect, process, and export telemetry data (metrics, logs, and traces) for analysis. **Follow our tutorials:** * [performance monitoring setup with TypeScript](/blog/how-to-improve-your-app-observability-easily-with-grafana-and-opentelemetry/), * [performance monitoring setup with Java](https://grafana.com/blog/2023/10/30/how-to-integrate-a-spring-boot-app-with-grafana-using-opentelemetry-standards/). ## Key app performance monitoring metrics to measure \[a cheat sheet] In data analysis, the question always arises: **what should you actually measure, and which metrics are crucial to your business?** Certainly, not all data is necessary; **having too many metrics can cause chaos** rather than help you reach valuable conclusions. We've listed the most common app performance metrics so that you can choose the ones best suited to your solution. ### Endpoints response time It measures the time it takes for an application or system to respond to a user's request for a specific feature or function. ### Response from external services It tracks the time it takes for an application to receive a response after requesting an external service or API e.g. external medical providers. ### Throughput The number of transactions a system can handle over a specific period. This is crucial for applications with high user volumes, such as patient portals. ### Error rates The frequency of errors occurring in the system. This includes data corruption, transaction failures, or any anomalies affecting data quality and accuracy. ### Access Control Violations Monitoring unauthorized access attempts or policy violations. ### Resource Utilization Monitoring of CPU, memory, storage, and network usage to prevent bottlenecks and ensure optimal performance. **Or just save this infographic:**
    ![app performance monitoring metrics](../../static/images/app_performance_monitoring_metrics_update_blog.png "Design template by Emmanuel Iwegbue")
    Design template by [Emmanuel Iwegbue](https://www.figma.com/community/file/1331537825284408926). ## Do you want to discuss performance monitoring for your solution? Just [book a free consultation](/start-project/). Our experts will guide you through any scalability challenges.
    [![let's talk](/images/contact_mateusz_0.75.png)](/start-project/)
    ## Tasting Coffee, Coding AI. Meet Rafał – A Fullstack Developer *Published: 2024-05-28 | Author: izabela | Tags: bright story* *Source: https://brightinventions.pl/blog/coffee-ai-rafal-fullstack/index.md* **Check out Rafał’s journey to becoming an [AI development](/our-areas/ai-software-development/) specialist and discover which niche still hasn’t been addressed by AI. Also, learn how to explore coffee taste with just one sip.**
    ![fullstack developer's story](/images/brightstoryrafalwgrid.png "fullstack developer's story")
    ## Your passion for new technology started when you built your computer at 13. Tell us more about that experience. I dreamt about having a better computer than the one I had at home. I wanted to build a computer from scratch, and **I managed to assemble most of the parts with some help from my parents**. I had to read tech documentation, and that’s how it all started. Years later, I still read the documentation. 🙂 When I had this computer, I got deep into the gaming community. **I started creating simple webpages based on CMS platforms like WordPress**. Then I began **building game servers**. Those were times when game creators were more open to the community; you could add lots of mods and run your own servers. You could even earn some money from it. Then, in technical school, I followed my passion for informatics and explored web development and basic frontend skills. I went to college to study Applied Computer Science, and that’s when programming truly began for me. **Studies forced me to learn some older languages like C++**, yet I quickly started to appreciate that. **Knowing these “clunky” languages made it easier to switch to other technologies and enjoy their simplicity**. Obviously, my studies didn’t give me all the knowledge I needed, especially regarding working in a team with Git and CI/CD tools. ## How did your and Bright Inventions’ paths cross? It was 2 years ago when I was working at a software development agency, but my project ended and I was devastated because I enjoyed working with that team. **Eventually, Agata (a recruiter) reached out to me on LinkedIn**. It wasn’t anything new, but her message stood out because **she was very transparent about the company, projects, and clients I could work for**. That’s not always the case when you talk to recruiters. Also, at Bright Inventions, I had the chance to work with a tech stack I was keen on, including Node.js and NestJS. **I actually wanted to join Bright Inventions after the initial screening with Agata. I was already super excited about this job opportunity.**
    ![team retreat](/images/rafal_team_retreat.png "A team retreat in the center of Gdansk.")
    A team retreat in the center of Gdansk.
    ## You are one of our AI development specialists. What was your research process and how did you gain knowledge about AI? The entire AI research group at Bright Inventions focused on **exploring large language models (LLMs) and frameworks, along with concrete solutions such as building vector databases and using them with embeddings, to tailor AI to specific use cases**. This exploration led us to discover LangChain. **LangChain has extensive documentation**, which has been incredibly helpful. We also read numerous blog posts, watched various videos, and listened to podcasts, although we found that this content quickly needed to be updated. **Therefore, documentation has proven to be the best source of information**. While other content was useful, it primarily served a supporting role in our research process. ## What is the skillset for a software developer who wants to specialize in AI implementation? **Knowing Python is key**, as it leads the way in languages used for AI development. **Understanding prompt engineering is also important**. You need to read extensively about how models accept prompts, how they analyze them, and how to construct effective prompts. Additionally, it's crucial to **understand what various models can truly offer**. Understanding how models work and knowing the various models available on the market is essential for choosing the right one for our use case, especially when we have a strict budget. Fortunately, there are **tools like PromptFoo that can help us assess the costs our solution will generate**. ## What is more effective and affordable for a company that wants to implement generative AI: model training or enhancing prompt engineering? I recommend prompt engineering. Model training requires more expertise, which increases the budget and resources needed. Additionally, often you have to pay extra for a model that allows for training. Usually, **creating a new prompt with a wider context to generate better results is less expensive compared to model training**. It's not only about prompt engineering though. Building vector databases can also be more affordable than training models.
    ![quote](/images/rafal_quote_prompt_new.png "quote")
    ## What trends do you see in the implementation of generative AI? I’ve noticed a need that still hasn’t been fully addressed by generative AI. **We still lack models that recognize specific items from pictures or understand voice prompts**. Using written prompts is quite common, yet what about other options? I think the [medtech industry will benefit from image recognition models](/blog/top-trends-in-healthtech/#advanced-implementations-of-generative-ai-in-healthcare), for example, for medical imaging. AI can support lung cancer diagnostics based on thousands of X-ray images. This is just one of many possible utilizations.
    ![quote](/images/rafal_quote_ai.png "quote")
    ## What are the differences between LLMs and SLMs? Are SLMs a serious alternative to LLMs? Small Language Models (SLMs) are supposed to be trained on less amount of data, therefore, they require fewer computational resources compared to LLMs. *[Read more about [LLMs, SLMs, and all those AI buzzwords](/blog/ai-buzzwords-definitions/).]* Yet, that’s a theory. We have tested SLMs on laptops for personal use, and their responses to simple questions were usually correct. However, when the questions became more complex, these models made mistakes. **Given the high cost of launching SLMs, it’s not an investment that generates the desired returns, especially compared to models offered by OpenAI API**. With OpenAI, we don’t need to set up our infrastructure; we only pay for the actual requests we make. In terms of SLMs, there have been situations where some models were not accessible through providers like AWS and Azure, **meaning you have to set up and manage the infrastructure and bear all associated costs**. Therefore, I would consider whether SLMs are the right models, as they might not deliver the expected results.
    ![travelling](/images/rafal_travelling.png "travelling")
    ## I know you are a coffee aficionado. What coffee do you drink and what acidity do you prefer? It's actually fascinating because it's hard to drink the same coffee twice since even filters can change the taste of the coffee. I enjoy very acidic coffee, but only when it’s brewed with a drip method. I don’t like to drink a straight espresso; for me, espresso serves as a base for milk coffees like cappuccino or flat white. When it comes to black coffee, it has to be brewed with a drip method. ## What coffee brand do you recommend? I support a local business and buy coffee from a roastery in Łódź called Coffeehood. They offer specialty coffee, which means it has been rated as high quality during a coffee cupping. ## Are you attending coffee cuppings? Tell us more about those. Yes! These are coffee tastings where a coffee shop presents eight different types of coffee from various roasteries around the world. **The goal is to assess the coffee from many different perspectives**. First, you judge the **sensory aspects: the smell and aromas you can detect**. Then, you **take a first sip to evaluate its taste, structure, and how oily or bitter it is**. The first sip is crucial but it can be challenging as your taste buds aren’t as clear as they were at the beginning of the event. But exploring new coffee tastes is worth it! ## Things to See in Gdansk (Local Software Developers’ Perspective) *Published: 2024-05-14 | Author: izabela | Tags: bright insights* *Source: https://brightinventions.pl/blog/things-to-see-in-gdansk/index.md* **As a [software development studio based in Gdańsk](/our-areas/gdansk-software-company/), our team not only creates software here but also spends free time exploring the city. Many of us are Gdańsk enthusiasts, so we’d like to share some of our favorite spots from a local perspective. These are some of the best places in Gdańsk to sightsee, relax, run, sail, and much more.** ## Brzeźno Beach Brzeźno Beach is perfect for relaxation and recreation. Here, you can enjoy barbecues, play volleyball, or engage in beach yoga. It's also home to a pier, ideal for a leisurely stroll or watching the sunset.
    ![Gdansk Brzezno beach](/images/gdansk_brzezno_beach.png "Gdansk Brzezno beach")
    ## Old Town from Motlawa’s point of view The heart of Gdańsk is its Old Town, a breathtaking area with architecturally stunning buildings nestled along the Motława River. It’s an excellent place for kayaking or dragon boat racing. 😉
    ![Gdansk Motlawa, Old Town](/images/gdansk_motlawa.png "Gdansk Motlawa, Old Town")
    ## Oliwa forest It’s where our team often engages in mountain biking (MTB) or team retreats. The forest is perfect for exploring nature and engaging in team-building activities, providing a refreshing break from the city’s bustle.
    ![Gdansk, Oliwa forest](/images/gdansk_forest_oliwa.png "Gdansk, Oliwa forest")
    ## Explore Gdańsk’s coast from the boat Embark on a maritime journey along the stunning coast of Gdańsk. Get close to some of Gdańsk’s most iconic and historically significant sites including Westerplatte, shipyard cranes, and more.
    ![Gdansk, sailing](/images/gdansk_sailing.png "Gdansk, sailing")
    ## Post-shipyard cultural center Historically significant shipyard areas of the city have been revitalized, transforming into vibrant hubs of art, cuisine, and leisure. Visit streets like Narzędziowa, Popiełuszki, and Elektryków to see these dynamic changes yourself.
    ![Gdansk, shipyard](/images/gdansk_shipyard-post.png "Gdansk, shipyard")
    ## Let's meet for a coffee in Gdańsk **Finally, if you want to meet the best software development studio from Gdańsk, [contact us to meet for a coffee](/our-areas/gdansk-software-company/). Hope to see you in Gdańsk soon!**
    ![Bright Inventions team](/images/gdansk_meetup_cofee.png "Bright Inventions team")
    ## Unblocking the Main Thread: Refactoring from Sync to Async in JavaScript *Published: 2024-05-13 | Author: szymon-ch | Tags: JavaScript, web development, performance* *Source: https://brightinventions.pl/blog/refactoring-from-sync-to-async-in-javascript/index.md* **Synchronous work in JavaScript often presents itself as a single, uninterrupted task that must be completed before the next operation can proceed. However, one key characteristic of synchronous work is its potential divisibility: it can typically be broken down into numerous smaller tasks, each requiring less time to execute individually. We'll leverage this characteristic to our advantage, splitting the workload into manageable chunks.** By doing so, we can unblock the main thread and return to the next task later on, allowing it to progress incrementally until it's completed in its entirety. This approach not only prevents the main thread from becoming overwhelmed but also ensures that critical operations can proceed without unnecessary delay.
    ![refactoring](/images/refactoring.png "refactoring")
    ## The impact on the performance of synchronous processing Let's break down a typical scenario where we have a large array and want to process each element. ```tsx // Define a function to process a single element synchronously function processElementSynchronously(element: number): void { // Perform computation for the element // Example: Some heavy computation here console.log(`Processing element ${element}`); } // Define a function to process the array synchronously function processArraySynchronously(array: number[]): void { for (let i = 0; i < array.length; i++) { processElementSynchronously(array[i]); } } // Example usage: Process an array of numbers synchronously const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; processArraySynchronously(numbers); ``` In the synchronous version of our example, we iterate over each element of the array and process it synchronously using the **`processElementSynchronously`** function. While this approach may seem straightforward, it can have detrimental effects on the performance and responsiveness of our application. **Processing the array synchronously means that each element is processed one after the other, blocking the main thread until all elements have been processed**. What does this mean for users? They can't do anything with your app. To them, **it looks like the app is stuck**. That's not good, right? You may consider marking our **`processElementSynchronously`** function with the **`async`** keyword, assuming it will operate asynchronously. While this is true, the catch is that **we're merely deferring execution, which still occurs on the main thread, thereby causing blocking**. You might also think about employing a Web Worker and shifting our workload there. However, **not all tasks are suitable for execution within a worker**. Workers lack access to the DOM, preventing any manipulation. If your task involves interacting with the DOM, it must be executed on the main thread. Consider React, for example. It doesn't utilize Web Workers yet manages to prevent thread blocking. How does it achieve this? ## Breaking down tasks and introducing asynchronicity The key here is to **break down the work into smaller tasks and defer their execution**. This way we ensure that **the main thread remains unblocked**, providing a smoother user experience. We'll achieve this by splitting the array into individual elements and processing each element separately using **`setTimeout`**. ```tsx // Define a function to process a single element function processElement(element: number): void { // Perform computation for the element // Example: Some heavy computation here console.log(`Processing element ${element}`); } // Define a function to process the array asynchronously function processArrayAsync(array: number[], index: number): void { // Check if there are elements left in the array if (index < array.length) { // Process the current element processElement(array[index]); // Schedule the processing of the next element after a delay using setTimeout window.setTimeout(() => { processArrayAsync(array, index + 1); }, 0); } } // Example usage: Process an array of numbers asynchronously const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; processArrayAsync(numbers, 0); ``` In this simplified code sample, we define a function **`processArrayAsync`** that takes an array and an index as parameters. Inside this function, we process each element of the array one by one using **`setTimeout`**. This allows each element to be processed asynchronously, giving the main thread time to handle other tasks and maintain responsiveness It's important to note that even when we provide a timeout of 0 milliseconds, [the browser may delay the execution slightly](https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html). To mitigate this effect and ensure that the main thread still remains unblocked, **we can introduce a deadline of 40 milliseconds**. This allows more work to be completed swiftly without noticeably impacting the user experience. ```tsx // Define a function to process a single element function processElement(element: number): void { // Perform computation for the element // Example: Some heavy computation here console.log(`Processing element ${element}`); } // Define a function to process the array asynchronously with a deadline function processArrayAsyncWithDeadline(array: number[], index: number): void { const deadline = 40; // Set a deadline of 40 milliseconds const startTime = window.performance.now(); // Get the start time // Process the elements of the array within the deadline while (index < array.length && window.performance.now() - startTime < deadline) { processElement(array[index]); index++; } // Check if there are remaining elements to process if (index < array.length) { // Schedule the processing of the remaining elements after a delay using setTimeout window.setTimeout(() => { processArrayAsyncWithDeadline(array, index); }, 0); } } // Example usage: Process an array of numbers asynchronously with a deadline const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; processArrayAsyncWithDeadline(numbers, 0); ``` In this code sample, we define a function **`processArrayAsyncWithDeadline`** that takes an array and an index as parameters. Inside this function, we use a while loop to process elements of the array within a deadline of 40 milliseconds. We continuously check the elapsed time using `window.performance.now()` **to ensure that we don't exceed the deadline. If the deadline is not met, we schedule the processing of the remaining elements using** `setTimeout` to allow the main thread to handle other tasks and maintain responsiveness. While this approach ensures that our tasks don't exceed a specific time limit, it's crucial to understand that the **browser's workload can vary**. There may be other tasks competing for resources in the queue, making it challenging to guarantee that the browser will always have 40 milliseconds available to execute our work. ## What about setImmediate? In the past, developers often favored **`setImmediate`** over **`setTimeout(func, 0)`** for scheduling immediate tasks. The **`setImmediate`** function provided a more efficient means of executing code immediately after the current task completed, without the artificial delay of zero milliseconds seen with **`setTimeout`**. However, with recent updates to browser environments, **`setImmediate`** is no longer supported. This leaves developers seeking alternatives to replicate its behavior. One such solution involves leveraging the **`MessageChannel`** API as a substitute, providing a way to emulate the immediate task execution previously offered by **`setImmediate`**. ```tsx // Shim for setImmediate using MessageChannel function setImmediate(callback: () => void): void { const channel = new MessageChannel(); channel.port1.onmessage = callback; channel.port2.postMessage(undefined); } setImmediate(() => { console.log("This task is executed immediately in the next tick."); }); ``` This workaround not only g**uarantees immediate execution but also circumvents the 4ms minimum delay imposed by browsers on** **`setTimeout`**. It's even employed internally by [React for scheduling work.](https://github.com/facebook/react/blob/2c022b847ed2171c59d37db9f71b394e0082ae3f/packages/scheduler/src/forks/Scheduler.js#L532) ## No need to hurry? Wait for idle time For less critical tasks, we can utilize a new API called **`requestIdleCallback`**. This API allows us to schedule work to be executed during idle periods when the browser's main thread is not busy with other high-priority tasks. By leveraging **`requestIdleCallback`**, **we can ensure that our less important tasks are executed efficiently without impacting the overall performance of the application**. Let's explore how we can implement this alternative approach. ```tsx // Define a function to process a single element function processElement(element: number): void { // Perform computation for the element // Example: Some heavy computation here console.log(`Processing element ${element}`); } // Define a function to process the array asynchronously with requestIdleCallback function processArrayAsyncWithRequestIdleCallback(array: number[], index: number): void { // Schedule the processing of the array elements using requestIdleCallback window.requestIdleCallback((deadline) => { // Process the elements of the array until the deadline is reached while (index < array.length && deadline.timeRemaining() > 0) { processElement(array[index]); index++; } // Check if there are remaining elements to process if (index < array.length) { // Schedule the processing of the remaining elements in the next idle period processArrayAsyncWithRequestIdleCallback(array, index); } }); } // Example usage: Process an array of numbers asynchronously with requestIdleCallback const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; processArrayAsyncWithRequestIdleCallback(numbers, 0); ``` In this code sample, we define a function **`processArrayAsyncWithRequestIdleCallback`** that takes an array and an index as parameters. Inside this function, we schedule the processing of the array elements using **`requestIdleCallback`**. **`requestIdleCallback`** is a browser API that allows us to perform work during idle periods when the browser's main thread is not busy with other tasks. When we pass a callback function to **`requestIdleCallback`**, the browser invokes it during an idle period, providing a **`deadline`** object as an argument. This **`deadline`** object contains information about how much time is left until the next frame is committed. Within the callback function, we use a **`while`** loop to process array elements until the deadline is reached or there are no more elements left to process. We check the remaining time using the **`deadline.timeRemaining()`** method, which returns the amount of time (in milliseconds) left until the deadline. This allows us to use the available time in the most efficient way, ensuring that our tasks are executed without blocking the main thread for extended periods. If there are remaining elements to process, we schedule the processing of the next batch of elements in the next idle period. **We need to consider the scenario where the browser might be overwhelmed with tasks**, leading to our **`requestIdleCallback`** not being executed. In such cases, **we can provide a timeout value** to ensure that our callback gets executed even if the browser is too busy to handle it immediately. ```tsx // Define a function to process a single element function processElement(element: number): void { // Perform computation for the element // Example: Some heavy computation here console.log(`Processing element ${element}`); } // Define a function to process the array asynchronously with requestIdleCallback function processArrayAsyncWithRequestIdleCallback(array: number[], index: number): void { // Schedule the processing of the array elements using requestIdleCallback window.requestIdleCallback((deadline) => { const now = window.performance.now(); // Process the elements of the array until the deadline is reached while (index < array.length && (deadline.timeRemaining() > 0 || (deadline.didTimeout && window.performance.now() - start < 40))) { processElement(array[index]); index++; } // Check if there are remaining elements to process if (index < array.length) { // Schedule the processing of the remaining elements in the next idle period processArrayAsyncWithRequestIdleCallback(array, index); } }); } // Example usage: Process an array of numbers asynchronously with requestIdleCallback const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; processArrayAsyncWithRequestIdleCallback(numbers, 0); ``` During the execution of **`requestIdleCallback`**, if the timeout specified in the options object is reached before the callback is executed, **`deadline.didTimeout`** will be set to **`true`**, indicating that the callback has indeed timed out. By incorporating this check into our while loop condition, we ensure that the loop terminates if either the deadline is met or the callback times out. If the callback times out, **`deadline.timeRemaining()`** will return 0, but **`deadline.didTimeout`** will be **`true`**, allowing us to gracefully handle the timeout scenario. We also incorporate additional limit, similar to the one used before, to still split work into smaller parts. ## Conclusion In this blog post, we've witnessed how traditional synchronous tasks can monopolize the main thread, resulting in sluggish performance and unresponsive interfaces. However, we've discovered an escape hatch, allowing us to **convert synchronous workflows into asynchronous ones, enabling the browser to manage additional tasks such as user interaction events**. Initially, we employed **`setTimeout`** with a 40ms deadline. Later, we transitioned to using **`setImmediate`** through the **`MessageChannel`** shim, which enabled us to bypass the 4ms clamp. While this approach is effective for urgent tasks, it may not be the optimal choice for non-urgent work that can be deferred until the browser is free. Fortunately, a novel solution presents itself in the form of the **`requestIdleCallback`** API. This tool enables us to **schedule tasks during periods of browser inactivity and precisely measure available processing time and determine when to return control back to the browser**. Moreover, in instances of browser overload, the timeout parameter offers a means to enforce execution after a specified delay. By adopting these strategies, we can enhance the user experience of our web applications, optimizing performance and responsiveness. Happy coding! ## Adding PrivacyInfo to Your iOS App *Published: 2024-05-08 | Author: fjablonski | Tags: ios, mobiledev, mobile, mobile development* *Source: https://brightinventions.pl/blog/adding-privacyinfo-to-your-ios-app/index.md* **Read a tutorial on how to add a Privacy Manifest to your codebase, which has been required by Apple since the beginning of May 2024.**
    ![](/images/privacy_info_ios.png "")
    Starting from May 1, Apple demands the addition of a Privacy Manifest to your codebase. This file provides an explanation why your app is using 'SDKs that require a privacy manifest and signature'. Find more info [here](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files). ## **Do I have to take action?** If you received an email from AppStoreConnect containing the phrase: > ITMS-91053: Missing API declaration Then you are among the lucky ones who have to add it. Thankfully, this email will also include every *NSPrivacyAccessedAPITypes* that you need to incorporate, like the mysterious-sounding *NSPrivacyAccessedAPICategoryFileTimestamp* ## **Let’s dive in** To add PrivacyInfo.xcprivacy (which is a regular .plist file), first click on your project in the Project Navigator. ![](https://lh7-us.googleusercontent.com/PuixoEkbPgWrXfCseMQ5FAYLu-qjJ-8VNKocFyCK4dTA8Krc6TgOUQC_m8vGCIxMvLrx9wUw5JtGSJ5tJ-IhYHhMO9lL8fY6W4aI0oplYmvpfRTDm3roamLa7LTQg2gFcvHjw64XIAJ4To3SNCheChQ) And then on File -> New -> File…  Search for Privacy ![](https://lh7-us.googleusercontent.com/WKMaDUuJuS4ITfudLZ42WLiDcJY4YdA0oDN8Tkpj7hm3Nw-kLBVOPXSNYk9Gu4V05zELrvf5CK7Qn7oiQIB5SeoQQ8a0elIHt59Ft7MPrXnNYay5nVWHHaSZzpY4Pw4HyoAcklgqyLTKGSiJBaA7sSU) Then add it to your main target. Keep in mind that the path matters! Apple is really strict about where you place this file. You can find more information [here](https://developer.apple.com/documentation/bundleresources/placing_content_in_a_bundle). If you're using Tuist or XcodeGen, don't forget to add this new file to your configuration as well :). ![](https://lh7-us.googleusercontent.com/BAD9_podCYU8FwWanvcN0hAyN_F-AXXGIzi-g9uIITLw0zqvNvVVjebMzuIqV0PV-wHfUtUAYkkErpQhT5WTG1xgHltE43HJxakTukAiN2h-3AZVFhZyiW98sXkrEqqgXuUcbyhRpCB3hSVF7ToRTn0) Or if you are using Tuist version 4.10+ you can use the dedicated struct example [here](https://github.com/tuist/tuist/blob/main/fixtures/ios_app_with_privacy_manifest/Project.swift).  ## **Explain yourself** In my case, I had to add an explanation about the usage of creationDate for files, so I'll use it as an example. A list of APIs which require an explanation along with their respective justification codes can be found [here](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api). For now, you don't need to add an explanation for using a specific API. You just have to type the code. In my case, it was DDA9.1. Then, my file looked as follows. ![](https://lh7-us.googleusercontent.com/uCrFxa88yywu4ffvQSfyRRljopNtcqWCWLn4v3j6nAs-OTIMMoJRXzv1YN6O6Rr2lshUDwOZ8MP4ySfeH1WgYcDohiRaex1I0494yW4mUGMH3O1cuLTQP2oirPJPdwkerjosf8pNLlTWDclDWvY_DIk) And a bit more self-exploratory xml version ![](https://lh7-us.googleusercontent.com/4FQFE9B2rfIKN4GHYB1i5kq8RWOcwPY5FnS3HKvad9zPszt3jAOQKR4aFHoyFNld-WbTWWp2HAOv9VsJvWVw27XCrNAkIQ_7t7hLACB9CeBAU1yIg9wencGuiV--v7oUqQWQVIFFpSXOTfAOTFuUGJ4) And that's all, folks! Read through each explanation carefully (even though it's written in a difficult legal language), and choose the one that best describes your usage. If you have more questions, feel free to contact me :). If you want to get automated reports regarding your app compliance, you should try **[compliance management software](https://myappmonitor.com/features/app-store-compliance)**. ## Let’s Meet for a Coffee at Infoshare *Published: 2024-05-08 | Author: izabela | Tags: bright insights* *Source: https://brightinventions.pl/blog/lets-meet-at-infoshare/index.md* **Are you attending the Infoshare conference in Gdańsk? Join our team for a coffee there! Plus, discover what we're most excited about this year's event.**
    ![infoshare](/images/infoshare2023.png "infoshare")
    As a [Gdańsk-based software development studio](/our-areas/gdansk-software-company/), we've always valued the fact that Infoshare – the biggest tech and startup event in Central and Eastern Europe – takes place in Gdańsk. The 2024 edition of the event will be held on May 22-23 at AmberExpo. Once again, our team is looking forward to attending. Curious about what's on our bucket list for the event? ## Networking We can't wait to meet other innovators coming to Gdańsk for Infoshare, particularly representatives from tech startups and MSEs. We're eager to learn about your solutions or ideas for applications.
    ![Bright Inventions team](/images/mateusz_michal_ula_team.png "Bright Inventions team")
    [Daniel Makurat](https://www.linkedin.com/in/daniel-makurat-b7b5a026/) (Co-founder) and [Mateusz Klimczak](https://www.linkedin.com/in/klimczak-mateusz/) (Partner & Head of Delivery) from our team will be at infoShare and are open to discussing your solutions and sharing our software development insights with founders, CTOs, POs, and other tech leaders. If you’d like to discuss your ideas over coffee (tea is also fine 😉), feel free to contact Daniel or Mateusz on LinkedIn. 👉 [Find Daniel on LinkedIn](https://www.linkedin.com/in/daniel-makurat-b7b5a026/) 👉 [Find Mateusz on LinkedIn](https://www.linkedin.com/in/klimczak-mateusz/) ## Speeches Four dev-oriented stages as well as a datamass and leaders stages will be places where for sure you’ll find our team. Here are the examples of speeches we are particularly curious about: * **Breaking Barriers: The Art of (Free) Gamified Security Training** | Joseph Katsioloudes, GitHub * **Data as the Lifeblood of an Organization: Be Careful What You Wish For** | Jim Allen, Stealth Startup * **Why Tech Leaders Should Think Like Poker Players** | Adam Bartkiewicz, Digital Ocean Ventures * **AI in Psychiatry: How to Make an LLM Justify Its Decisions Like a Specialist?** | Zofia Smoleń, mindmatch.pl * **Lessons learned while bootstrapping to $15MLN ARR** | Kazik Piętka, Surfer Are you coming to Infoshare? Hope to see you there! ## Clutch Recognizes bright inventions as one of the Game-Changing IoT Companies in Poland *Published: 2024-05-02 | Author: izabela | Tags: bright insights* *Source: https://brightinventions.pl/blog/game-changing-iot-company/index.md* **There are thousands of opportunities online, you just have to know where to look! One of the best things that the digital world has to offer is software solutions. These new technologies have been helping companies and businesses build new products and services that find amazing success in their respective industries! If you want to learn more about the processes of software development, then let bright inventions help you today.**
    ![Clutch and Bright Inventions](/images/clutch_in_article.jpg "Clutch and Bright Inventions")
    Founded in 2012, Bright Inventions is a Gdansk, Poland-based software consultancy firm. Numerous clients from the UK, Germany, Netherlands, Norway, Israel, and other countries have expressed their gratitude for our proficiency in mobile, web, blockchain, and IOT technologies. We take pleasure in assisting our clients through every stage of the software delivery process, from ideation to requirements elicitation, visual design, project management, software development, quality assurance, and maintenance. We currently have over 70 software development specialists on staff. Projects we work on frequently develop into large, extremely profitable endeavors in the end, both technically and commercially. As a matter of fact, **bright inventions has been recently named one of the most-reviewed game-changing [Internet of Things Companies in Poland](http://clutch.co/pl/developers/internet-of-things?utm_source=directory&utm_medium=blog&utm_campaign=surgical) by none other than Clutch**! Clutch is a B2B ratings and reviews platform based in Washington, DC. They evaluate technology service and solutions companies based on the quality of work, thought leadership, and client reviews. A rapidly expanding startup, Clutch has become the go-to resource in the agency space. With that being said, we would like to highlight some of the best reviews from you guys on our Clutch profile to help you celebrate this recognition! Here are some of the best ones:

    They were committed to building the ideal product for our customers

    We’re very satisfied with the product that Bright Inventions delivered. Both versions of the app were developed according to our needs. We’re planning further cooperation with their team to add new features and services. They were committed to building the ideal product for our customers. Also, their attention to detail and scrutiny when dealing with technical challenges is noteworthy. We were pleased with their proactive approach and their genuine desire to see the success of the platform. They were constantly looking for ways to improve, and ensured that we had proper tracking tools and no potential scalability issues.
    Adam Pachucki, Head of Product at Finebite

    Working with Bright Inventions is always a pleasure

    For us as an agency, the project was a good showcase for future clients in the health industry. Working with Bright Inventions is always a pleasure. The people involved are friendly and to the point. They’re also pragmatic, constructive, and punctual. Their team is fast, friendly, effective, proactive, and able to deliver on time.
    Kira Nezu, Project Manager at AppAdvisors GmbH
    Let’s talk about your project idea! [Drop us a line today](/start-project/). \--- The article was written by Clutch editorial team. ## A Backend Developer or an Artist? Meet Tomasz *Published: 2024-04-29 | Author: tomasz-sch | Tags: bright story* *Source: https://brightinventions.pl/blog/backend-developer-artist-tomasz/index.md* **He has been captivated by programming for a long time, but that didn't stop him from navigating a career in system networking. Learn about Tomasz's career journey, the challenges he faces as a tech lead, and the paths for self-growth as a backend developer that he charts.**
    ![Tomasz's career story](/images/brightstorytomaszsgridupdate.png "Tomasz's career story")
    ## How did your adventure with programming begin? It began in gimnazjum (Polish middle school) during Computer Science classes. Though I feel the classes could have been conducted better, they planted the seed for my technical studies. Later, **in high school, I ensured that this was the path I wanted to follow**. I enjoyed writing little programs in Turbo Pascal; **I loved the feeling of bringing something to life with my code**, even if it was just a simple calculator. I felt like an artist. I still do actually. Then, I pursued Automatic Control and Robotics studies at the Gdansk University of Technology, where I first encountered Java. ## And you became a software developer? Not quite. 😉 Although I completed a year-long internship as a Java developer, **I eventually shifted toward system networking**. This was related to my Master's studies at the Department of Computer Communications, so I decided to pursue this direction. **I started working at a large corporation, managing extensive networks and servers** that, for example, facilitated real-time trading. I worked there for almost four years and learned a great deal about network administration, but I also gained valuable insights into soft skills.
    ![Quote](/images/tomaszs_skills_quote.png "Quote")
    **While technical skills are fundamental to the job, I learned how crucial soft skills are as well**. Improving my communication with colleagues, managers, and importantly, clients became a significant part of my learning. I still use that knowledge daily. ## However, at some point, you made the transition to software engineering. After about two years, the job started to feel too repetitive for me. **I began looking for ways to optimize the work by writing scripts and applications that made the processes more efficient**. In doing so, I gradually found myself returning to programming, reigniting the passion I had for it previously. I started working on some side projects after work and also helped my younger friends who were still students. In programming, there is always something new; every day brings a new challenge, and that drove me. So, eventually, **I decided to leave my stable job and senior position, accepting a role as a junior software developer with a salary cut in half**. Starting from scratch was a challenge, but I'm deeply grateful for the wealth of network administration experience I gained over the years. **I believe it's a great asset to understand computing and to possess strong soft skills**. Finally, a year later, I landed a job at Bright Inventions as a backend developer. ## Could you share your recollections of the recruitment process at Bright Inventions? The recruitment process was friendly, open, and smooth. **I enjoyed a talk with Ula as well as a longer technical discussion with Piotr**. In the meantime, I had to complete a technical task. Even though there were some specific requirements and preferred technologies, I still felt **I had the freedom to solve the issue in the way I thought was best**. Eventually, I joined Bright Inventions, and my adventure with the company has now continued for over three years.
    ![Valentine’s Day at the office.](/images/tomasz_valentine-s_day.png "Valentine’s Day at the office.")
    Valentine’s Day at the office.
    ## After more than 3 years, how do you feel about working at Bright Inventions? I appreciate that at Bright Inventions, you are quickly recognized and valued for a job well done. I've always been extremely professional about my work and my duties, and **it's rewarding to see that recognized and appreciated swiftly**. I value the trust and flexibility we're given; keeping in mind that I can still reach out to a colleague or any manager and receive the help I need. Also, **after years in a corporate environment, I cherish the fact that I don't have dozens of managers above me**. ## You recently became a tech lead. What has this role taught you so far? Since becoming a tech lead a couple of months ago, I've already learned a great deal, particularly about **working closely with the client and understanding the business side of the project**. I feel a strong responsibility for the technical direction of the solution, **suggesting implementations, features, and general product-wise directions**. Another significant aspect is **managing the distributed software development team**. I've come to believe that **in order to deliver better software, the team must form a strong bond**. They need to feel connected to communicate freely, share experiences and issues, and exchange knowledge. This is something I strive to foster within the team, showing them that they can rely on each other. **Even if they are responsible for different parts of the solution, they should stay in touch with other team members to gain unique insights and perspectives**.
    ![Quote](/images/tomaszs_team_quote.png "Quote")
    Also, as a tech lead, **I'm still learning how to communicate with other groups involved in the telemedicine solution we develop, such as doctors**. They approach us with various issues and technical questions, and my role is to explain everything clearly and understandably. This is important in all walks of life. For instance, I would prefer to visit a doctor who can explain my medical condition to me in an understandable way, rather than leaving me anxious and clueless. ## As mentioned, you are a part of a team crafting a telemedicine solution. What are the key challenges in this domain? Our project focuses not only on profit but primarily on helping people which is immensely rewarding. **We are creating a solution dedicated to individuals who lack access to healthcare**, including physical doctor's appointments. Even in European countries like Germany, there are regions far from big cities where access to doctors is not readily available. Telemedicine, with remote patient monitoring, enables the collection of patient vitals through devices. These records can then be transferred to a **doctor who, based on the data and video consultations with a patient, can initiate data-based treatment** – even if a physician is hundreds of kilometers away from the patient. **One of the key challenges in this domain is securing medical data**. Any data breach, especially for a startup, could potentially be catastrophic. ## So how do you handle medical data security? We adhere to HIPAA, GDPR, and TÜV requirements, which encompass **hundreds of pages of specifications**. The foundational practice is, of course, **data encryption, access keys, secure environments, and secret leak detection**. Apart from that, **access management** is strictly controlled, and staff members outside the EU are not permitted to access sensitive data. Another important aspect is **log auditing** to monitor user activity. A crucial part of the project is **maintaining backward compatibility** **for mobile apps**, which presents its own set of challenges. We can't simply rewrite a part of the app because we need to support older versions of the application to keep it as accessible and inclusive as possible. Another security aspect is proactive documentation. **Disaster recovery (DR) for application or data access if required in case the application is down**. Incidents like these can occur, so I strongly believe in being prepared for any scenario. This way, when something happens, we don't panic; we simply follow the established procedures and minimize downtime. ## How can a backend developer chart a path for self-growth to stay ahead in the field? The path to self-growth as a backend developer depends largely on what aspect of programming you're most passionate about. One option is **transitioning into fullstack development**. I considered this myself, but I don't have a strong design intuition, and I feel it wouldn't be as satisfying for me. However, the frontend does have the significant advantage of allowing you to quickly see the results of your work. Another option is **leaning towards infrastructure**. As more companies move to the cloud, I believe that backend developers should have at least basic knowledge of network administration, or perhaps even more in-depth. I know that we can rely on DevOps Engineers, but a backend developer with strong ops knowledge is a valuable asset. Such developers can not only write code but also understand how the application operates from a networking perspective after it's deployed. Additionally, issues in the app are often across both code and infrastructure, and having a holistic perspective helps solve them. Finally, you can follow my path, which involves **managing the team**. However, this requires strong soft skills and empathy. You must understand that everyone is different; anyone can have a bad day or even a bad week at work, and you still need to support them, sometimes even acting as a buffer for the entire team. Also, when a screw-up occurs, you as a tech lead are always responsible. Another challenge is task delegation – it's difficult to learn to finally trust that someone else will take care of it. ## What do you enjoy doing after work? Sports, sports, sports. 💪 **I spend a lot of time at the gym, training for Runmageddons, practicing tennis, and kickboxing, and I also love to indulge in winter swimming in the Baltic Sea**. After spending 8-10 hours a day at a desk, I feel the urge to hit the gym, lifting weights while listening to my favorite music or podcasts. **It's a great retreat for my brain and, obviously, beneficial for my body**. Unfortunately, the winter swimming season is over right now in Poland, but that doesn't stop me from starting my day with a cold shower. 🙂
    ![winter swimming](/images/winter_swimming.png "winter swimming")
    Tomek and Magda, from the Bright Inventions team, winter swimming in the Baltic Sea.
    ## Spring Tests with TestContainers *Published: 2024-03-05 | Author: maciej-n | Tags: backend* *Source: https://brightinventions.pl/blog/spring-tests-with-testcontainers/index.md* **In the world of software development, making sure our apps are up to scratch before they go live is crucial. But here's the catch: testing them in a way that mirrors what happens in the production may not be so straightforward. That's where TestContainers come into the picture. It’s a handy library that lets us bring in real databases, web browsers, and more, all within Docker containers managed through code, to make our tests as close to a real-life environment as possible.**
    ![Spring test](../../static/images/frame-45.png "Spring test")
    ## From simulation to a real environment Back in the day, we'd often rely on simulated services or in-memory databases for testing, which was okay but could be better. They just couldn't fully mimic the complexities of real-life scenarios. This mismatch could lead to apps breaking down in the real world even though they passed all tests with flying colors. We couldn't test persistence to ensure, that our data meets all DB constraints. TestContainers help us dodge this bullet by letting us test with the actual tools and services our app will interact with, but in a safe, controlled environment. ## Enhanced testing In this article, we’re diving into how to integrate TestContainers into Spring integration tests, a powerful framework widely used in Java/Kotlin applications for enterprise-level development. Spring’s inherent complexity, combined with the need for consistent and reliable testing, makes the integration of TestContainers particularly beneficial. We are also going to use the `java-test-fixtures` plugin to create reusable Spring annotation, which will be used to set up Postgres test container for our domain module’s tests. ## What is TestContainers? TestContainers is an open-source set of libraries that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. It simplifies the process of creating unit and integration tests by providing a programmable environment that is both controlled and isolated. This is particularly useful for testing database interactions, message queues, web applications, and other services that are typically complex to set up and manage for testing purposes. You can read more about TestContainers in [the official documentation](https://testcontainers.com). ## What is TestFixtures? testFixtures in the context of software development is a concept related to testing, particularly automated testing. Test fixtures are a set of preconditions or inputs that are used to consistently test a piece of software. The testFixtures Gradle plugin is a feature in Gradle, a popular build automation tool, designed to facilitate the sharing of code and resources between the main source set and the test source set in a project. This plugin is particularly useful in Java and other JVM-based projects. ## Example As the example, we reused the code prepared by us for the article [How to integrate a Spring Boot app with Grafana using OpenTelemetry standards](https://grafana.com/blog/2023/10/30/how-to-integrate-a-spring-boot-app-with-grafana-using-opentelemetry-standards). ## Project structure We have modified the project structure as presented below: ``` spring-observability-bootstrap ├── appointment │ ├── main │ └── test ├── database │ ├── main │ ├── test │ └── testFixtures └── src ├── main └── test ``` We extracted :database module, so the database configuration is separated from the business logic. From now on, if we want to use the database in a new module, we can just add a dependency to the :database module: ```kotlin implementation(project(":database")) ``` All dependencies required to configure the Postgres database were moved to the `:database` module. We also created a new `:appointment` module, containing business logic responsible for the appointments management feature. This is the module, which we are going to add our integration tests into. ## Problem Most Spring + TestContainers tutorials show you how to integrate TestContainers with JUnit, but in most cases, you also have a framework, that runs your tests, like Spring in our case. In case of Spring, these tutorials instruct you to create an abstract test class and extend all your Database test classes with this abstract class to run test containers, which is not the best practice as the “Composition over inheritance” rule says. What most of these tutorials are showing you is the way to: 1. Start Spring context 2. Start TestContainer 3. Inject TestContainer configuration into Spring context. This may be problematic for a couple of reasons: * Spring may require running services before starting the Spring Context * Some Spring Beans, like liquibase or flyway, need Datasource before being instantiated, so we would like to have the database running before the Spring context starts. * Reusable containers * Starting a new docker container takes time. If you create a container field in your test classes and annotate it with @Container, as integration with JUnit suggests, then you are starting a new container for each test class * Non-compliance with the “Composition over inheritance” * Some tutorials suggest sharing container object between classes by the use of base abstract class. But what if we want to start 2 different test containers for one test class? For example Postgres as Database and Redis as cache? Do we need to create another abstract class extending from `PostgresTestContainerTest` called `PostgresAndRedisTestContainerTest`? And if we need only Redis, we create a third one only for Redis? It’s not a good approach. * Reusable Spring Context * Even if you optimize your tests to share containers by base classes, this does not mean, that these tests will share Spring Context. Starting a new Spring Context is also time-consuming for bigger projects. It may be also a good approach to configure your tests(or at least groups of tests) to share Spring Context. ## Solution Luclky, we came up with the solution, that may solve all of these problems! What we can do instead is pre-configure Spring Context to set up TestContainers during the Spring Context initialization phase. We are going to use the `@ContextConfiguration` annotation. It requires passing initializer extending `ApplicationContextInitializer`. Our `PostgresTestContainersInitializer` looks like this: ```kotlin class PostgresTestContainersInitializer : ApplicationContextInitializer { override fun initialize(applicationContext: ConfigurableApplicationContext) { val postgresSqlContainer = PostgreSQLContainer("postgres:15.4") postgresSqlContainer.start() // should shut down container on context close applicationContext.beanFactory.registerSingleton("postgresSqlContainer", postgresSqlContainer) TestPropertyValues.of( mapOf( "spring.datasource.url" to postgresSqlContainer.jdbcUrl, "spring.datasource.username" to postgresSqlContainer.username, "spring.datasource.password" to postgresSqlContainer.password, ) ).applyTo(applicationContext) } } ``` The overridden `initialize()` method does 3 things: * Create PostgresSQL Container: * A `PostgresSQLContainer` object named `postgresSqlContainer` is created using the image `postgres:15.4`. This step initializes a `PostgresSQL` container using the specified Docker image. * The `start()` method is called on the postgresSqlContainer object to start the container. * Register Container in `ApplicationContext`: * The `PostgresSQL` container is registered as a singleton bean in the Spring application context. This allows the container to be managed and accessed within the Spring application. * Should shut down container on context close * Set Database Properties: * `TestPropertyValues` is used to set various properties related to the database. These properties include the database URL (`jdbcUrl`), `username`, and `password`. These values are retrieved from the postgresSqlContainer object. * The `applyTo()` method applies these properties to the applicationContext. This ensures that the Spring application can connect to the PostgreSQL database running in the Docker container using these properties. Then we can annotate our Spring Test classes with annotation: `@ContextConfiguration(initializers = [PostgresTestContainersInitializer::class])` If we want to keep it pretty, we can create our custom annotation over `@ContextConfiguration`: ```kotlin @ContextConfiguration(initializers = [PostgresTestContainersInitializer::class]) annotation class PostgresTestContainer ``` And use it like this: ```kotlin @SpringBootTest @PostgresTestContainer internal class AppointmentServiceTest { ... } ``` That’s it! Now you only need this one `PostgresTestContainer` annotation, to run Postgres TestContainer for your Spring Test. You can access the full code in our [example repository](https://gitlab.com/bright.dev/spring-observability-bootstrap). ## Introduction to IoT in Healthcare: Insights, Use Cases, Challenges and Benefits *Published: 2024-04-18 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/guide-to-iot-in-healthcare/index.md* **The Internet of Things will be one of the key technologies supporting the digital transformation of healthcare. Dive into IoT for healthcare, explore IoMT devices, and meet companies already taking crucial steps in implementing IoT in the daily care of patients.**
    ![IoT devices healthcare](/images/iot_introduction_dall_e.png "IoT devices healthcare")
    ## Contents [Internet of Things in healthcare: the definition and example](/blog/guide-to-iot-in-healthcare/#internet-of-things-in-healthcare-the-definition-and-example) [IoT in the healthcare market overview](/blog/guide-to-iot-in-healthcare/#iot-in-the-healthcare-market-overview) [Top challenges in developing IoT solutions in healthcare](/blog/guide-to-iot-in-healthcare/#top-challenges-in-developing-iot-solutions-in-healthcare) [Use cases & examples of IoT in healthcare](/blog/guide-to-iot-in-healthcare/#use-cases--examples-of-iot-in-healthcare) [IoT devices - examples](/blog/guide-to-iot-in-healthcare/#iot-devices---examples) [Are you planning to develop IoT for healthcare?](/blog/guide-to-iot-in-healthcare/#are-you-planning-to-develop-iot-for-healthcare) ## Internet of Things in healthcare: the definition and example The Internet of Things (IoT) in healthcare refers to the network of medical devices and applications that communicate and exchange data due to an Internet and bluetooth connection.
    ![IoT in healthcare devices](/images/iot_in_healthcare.png "IoT in healthcare devices")
    For example, smart healthcare devices such as thermometers, spirometers and pulse oximeters might create a healthcare IoT network that measures patients' vital signs and processes them in a special app. Now, the app could send data to a designated doctor who can immediately verify the state of a patient. ## IoT in the healthcare market overview According to [IoT in Healthcare Market](https://www.marketsandmarkets.com/Market-Reports/iot-healthcare-market-160082804.html), the global IoT in Healthcare market size is projected to grow from USD 127.7 billion in 2023 to USD 289.2 billion by 2028.
    ![IoT in the healthcare market overview](/images/iot_healthcare_market_stats.png "IoT in the healthcare market overview")
    ## Top challenges in developing IoT solutions in healthcare ### Data security and privacy Before you craft your IoT network, you need to implement security protocols and ensure secure data storage & sharing. Using a cloud provider for data storage can speed up your process of adhering to HIPAA or GDPR. ### Integration of devices’ SDKs Some software teams face the challenge of integrating various healthcare devices with distinct Software Development Kits (SDKs) into a cohesive system. As a system owner, you need to be aware that designing a unified system might take more time than you initially assumed. ### Poor internet coverage Medical systems should not be solely dependent on an internet connection, particularly when developing IoT solutions for remote patient monitoring. Interruptions in the storage and sharing of data can have serious implications for patient health. A viable solution is an offline mode, allowing data to be stored locally and synchronized automatically once the connection is reestablished. Read our [guide to offline-first applications](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/). ## Use cases & examples of IoT in healthcare ### Telemedicine & Remote Patient Monitoring IoT enables continuous patient monitoring through wearable devices and other health sensors. This can significantly improve patient care by providing real-time data on vital signs like heart rate, blood pressure, and glucose levels. Remote monitoring is particularly valuable for managing chronic conditions and for elderly care, reducing the need for frequent hospital visits. **Companies that do already do it: Oracle Health, Meditech** ### Electronic Health Records IoT enhances EHR systems by providing richer, real-time data that improves the quality of care, operational efficiency, and patient outcomes in healthcare settings. EHR systems can use data collected from IoT devices to perform predictive analytics, identifying potential health issues before they become serious. **Companies already implementing it: MedKitDoc, Camascope,** ### Wearable Health Monitors Devices like fitness bands and other wearable health trackers allow continuous monitoring of patients' vital signs such as heart rate, blood pressure, and oxygen levels. These devices can alert patients and doctors to potential health issues before they require acute care. **Companies already implementing it: Fitbit, Garmin** ### Smart Hospitals IoT devices are used in hospitals to enhance patient care and optimize operations. For example, smart beds can detect when they're occupied and when a patient is attempting to get up. IoT can also track the location of medical equipment, like wheelchairs or defibrillators, improving asset utilization and reducing costs. **Companies already implementing it: GE Healthcare, Siemens Healthineers** ### Personalized Medicine IoT can analyze data from various sources to tailor medical treatment to individual patients. This can involve adjusting medication based on how a patient's body reacts, which can be monitored through smart devices. **Companies already implementing it: IBM Watson Health, 23andMe** ### Ingestible Sensors These tiny electronic devices are swallowed by patients and can collect data from within the body to diagnose and monitor digestive tract issues, medication adherence, and more. **Companies already implementing it: Proteus Digital Health, CapsoVision** ### Fall Detection For elderly patients, sensors can detect changes in posture or abrupt movements that indicate a fall, automatically alerting healthcare providers and family members. **Companies already implementing it: Apple, Philips Lifeline** ### Connected Inhalers For patients with asthma or chronic obstructive pulmonary disease (COPD), connected inhalers can track usage, monitor the patient's condition, and determine if the patient is using their inhaler correctly. **Companies already implementing it: Propeller Health, Teva Pharmaceuticals** ### Smart Home Care Smart home technologies can help patients with disabilities or the elderly live independently. This includes voice-activated devices, motion sensors, and other monitoring technologies that help ensure safety and provide alerts to caregivers when needed. **Companies already implementing it: Google Nest, Alexa** ### Supply Chain Management In healthcare facilities, IoT can be used for tracking inventory levels of medical supplies and automatically reordering when stock is low. This helps in ensuring that essential items are always available and can also help in tracking the usage rates of various supplies for better management. **Companies already implementing it: SAP, Oracle** ### Telehealth and Virtual Visits Although not exclusively an IoT application, telehealth often integrates IoT devices for better patient outcomes during virtual visits. Data collected through patient monitors can be transmitted during a telehealth session, giving healthcare providers a better understanding of the patient’s current health status. **Companies already implementing it: Teladoc Health, Amwell** ## IoT devices - examples IoT network in healthcare is also called The Internet of Medical Things (IoMT). It refers to a connected infrastructure of medical devices, software applications, and health systems and services. Let’s assess IoMT potential in geriatric healthcare.
    ![IoT geriatric healthcare](/images/iot_geriatric_healthcare.png "IoT geriatric healthcare")
    Source: [nature.com](https://www.nature.com/articles/s41591-023-02391-8/figures/2) Devices and sensors such as cardiac monitors, fall-detection sensors, smart socks, digital mirrors, smart shoes, and assistive robots enable 24-hour care and remote patient monitoring. A physician or caregiver can monitor all the health data in real-time and respond with tailored treatment. Discover more [health smart devices that are transforming healthcare](/blog/bluetooth-devices-that-change-healthcare/). ## Are you planning to develop IoT for healthcare? As an [IoT development company](/our-areas/iot-development/), we have helped our clients leverage Internet of Things technology. If you want to discuss your solution, [book a free consultation with our IoT experts](/start-project/). - - - Blog cover: DALL·E ## Why Do Users Uninstall Healthcare Apps? Insights and Solutions *Published: 2024-04-17 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/app-uninstall-healthcare/index.md* **Are healthcare mobile app users more likely to uninstall your app compared to others? How can you keep your users engaged and committed to your solution? Protect your healthcare app from the risks of user abandonment by implementing 6 [mobile app development](/our-areas/mobile-app-development/) practices.**
    ![healthare app uninstallation](/images/mhealth_app_uninstallation.png "healthare app uninstallation")
    App downloads are definitely one of the key success metrics to track when [developing a mobile health application](/our-areas/healthcare-software-development/) (mHealth). However, app downloads don’t provide the full picture. They should be complemented with the uninstallation rate. A [survey](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8872344/) from 2022 shows that around half of the users of a healthcare mobile app will uninstall it within the next 30 days.
    ![app uninstall data](/images/mhealth_uninstall_data.png "app uninstall data")
    Although these numbers might alarm app owners, it's useful to consider some benchmarks. [The uninstall rate for Android apps generally falls between 40-50%](https://www.appsflyer.com/resources/reports/app-uninstall-benchmarks/). In this context, **healthcare apps don’t seem to deviate from the trend**. This is simply the nature of the app lifecycle. As noted in an article, more than half of all apps installed are uninstalled within 30 days of download.
    ![AppsFlyer](/images/app_uninstall_trend_android.png "AppsFlyer")
    Source: [AppsFlyer](https://www.appsflyer.com/resources/reports/app-uninstall-benchmarks/) **So, is there anything we can do to reduce the user abandonment rate? Let’s explore the top solutions to prevent users from uninstalling your app.** ## 1. User-Focused Marketing Campaign It all starts way before the app installation. You plan a marketing budget for user acquisition, but do you truly understand your target group? If you target the campaign to the wrong users, they will install the app, realize it’s not for them, and uninstall it – yet you will still have to foot the bill for acquiring them. Verify your marketing campaign with your marketing team to ensure you're reaching the right target group. **If you feel like you still need to refine your user persona, check out our [free workshop template](https://miro.com/miroverse/b2b-buyer-persona-workshop-template/)**. It will assist you and your marketing and sales teams in this process. ## 2. Personalized onboarding In mobile health apps, **the onboarding process should emphasize personalized treatment for your users and show that you care about them**. This is particularly important if your mHealth app is designed to assist users with chronic conditions that affect their everyday lives or significant life events such as pregnancy, postpartum, or menopause. **Explore [the case study of a FemTech app](/blog/data-driven-development-femtech-app-onboarding/) where simplifying and depersonalizing the onboarding process actually decreased the completion rate**. First interactions with the app are also crucial, as users admitted in the survey that they install several apps, compare them, and then keep only the best one:
    ![mHealth App Abandonment](/images/mhealth_app_abandonment.jpg "mHealth App Abandonment")
    ## 3. Decisions based on data, not assumptions This point ties directly into the previous one. **Before launching your app, you should install analytics tools** – ideally more than one for data comparison – to observe how users interact with the app, including during onboarding and with crucial features. Only then will you truly understand how your solution performs and be able to respond accordingly. This approach is known as data-driven development, and we strongly encourage you to introduce it to your software development team. **These are examples of metrics you should measure:**
    ![success metrics mobile app](/images/metrics-cheat-sheet_logo.png "success metrics mobile app")
    Also, read more about these [mobile app success metrics and analytical tools](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/) that will help you measure them. ## 4. Inclusive AI for healthcare Another key reason for mHealth app uninstallation is that the app is 'not easy to use'. To address this, an inclusive UI can naturally attract users to your solution by immediately demonstrating the value of the mHealth app. Understanding the user persona is again a key! **Before any mockups are developed, it’s wise to organize [product workshops](/our-areas/product-workshops/) with your team to understand the end-users, benchmark your solutions against others, and establish core design principles**. ### A case study: An App for Individuals with Parkinson’s Disease Designing an app for individuals suffering from Parkinson’s can be particularly challenging, as **it must cater to users experiencing tremors and other movement disorders**. Additionally, some users may be less tech-savvy. From the outset, it is crucial to design a UI that minimizes the potential for errors and, if an incorrect input does occur, easily allows the user to correct it. **If you want to read more about developing a [mobile solution for People with Parkinson's Disease](/projects/solution-for-parkinsons-patients/), read the case study!** Also, if you are looking for more UX and UI best practices for healthcare, check this article on [UX Design for Healthcare and Medical Apps Case Study](/blog/ux-design-healthcare-medical-apps-case-study/). ## 5. Minimizing users' frustrations with app performance monitoring Patients don't want to be your guinea pigs. It’s your responsibility to ensure the app performs properly. **You should proactively monitor any performance issues, which is only possible with app performance monitoring tools**. If you don't have performance monitoring implemented, c**heck out our technical tutorial on how to set up [app performance monitoring for healthcare](/blog/healthcare-app-performance-monitoring/)**. Performance monitoring in healthcare offers numerous opportunities to identify potential issues in your solution before they frustrate your users:
    ![health app performance monitoring metrics](/images/app_performance_monitoring_metrics_update_blog.png "health app performance monitoring metrics")
    ## 6. Patient engagement and gamification for better motivation One of the main reasons mobile health users uninstall the app is due to boredom or loss of motivation. This is mostly applicable to lifestyle and fitness apps.
    ![motivation](/images/mhealth_uninstall_blog_motivation.png "motivation")

    Gamification in mHealth apps

    In gamification context, some identified themes were linked to various motivational affordances (game elements) in mHealth apps. The motivational affordances identified in this study include leader boards, challenges, levels, connection (relatedness), achievement, feedback, prompting, and tracking. An important factor was that most respondents who use non-gamified mHealth apps stated that motivation significantly affects their adherence. Hence, introducing game-like features can increase the prospect of adoption and continued use of fitness apps.
    User Engagement and Abandonment of mHealth: A Cross-Sectional Survey
    This data suggests that if your app's goal is to engage users, **you should consider integrating gamification features, possibly even in the MVP phase**. These features are likely to be key components of your solution and a critical factor in its success. If you want to delve deeper into [patient engagement and gamification](/blog/delivering-patient-engagement-platform/), read our blog post on the subject. ## Why Emotions Are Crucial in Feedback Processing? *Published: 2024-04-11 | Author: ula | Tags: leadership, feedback, communication* *Source: https://brightinventions.pl/blog/why-emotions-are-crucial-in-feedback-processing/index.md* In a scientific context, emotions are [a complex behavioural phenomena that involves multiple levels of neural and chemical integration.](https://psycnet.apa.org/record/1951-07758-022) In simpler terms, we can say that emotions are an instinctive way of alerting us to significant events. They arise involuntarily and unexpectedly. We don't choose to experience them, they simply happen to us spontaneously. [Emotions, both basic and complex, may have an emotional tone that can be either positive (e.g. joy, contentment, sadness) or negative (e.g. disgust, frustration, happiness). ](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5397534/)**Research indicates that emotions can yield both positive and negative outcomes simultaneously, sometimes leading to conflicting consequences.** While certain emotions are typically viewed as positive and desirable, such as happiness, studies have unveiled potential downsides to these emotions. Both "positive" and "negative" emotions have yet their place in our lives and can serve different functions. Negative feelings may seem challenging, but they serve as a signal that something isn't right and help us understand our needs. **In any feedback process emotions play a significant role regardless of whether you are a feedback giver or a receiver. They can engage individuals in your messages more effectively. They capture attention and foster a deeper understanding of the message, leading to better results.** Let us now dive into emotional landscape bit deeper and discover the true potential that lies behind it. ## how many emotions do we have? Different theories offer varying perspectives on how to categorize emotions and how many emotions we can recognise. Some propose the existence of eight fundamental emotions, while others argue for a more extensive range. According to [the discrete emotion theory](https://psychology.fandom.com/wiki/Discrete_emotion_theory), the Differential Emotions Scale recognises 12 separate emotions. However, [the recent research from the University of California, Berkeley, reveals a more extensive spectrum of emotions, pinpointing 27 distinct categories](https://greatergood.berkeley.edu/article/item/how_many_different_human_emotions_are_there). This comprehensive analysis involved the study of thousands of individuals, scrutinizing their reactions to a variety of stimuli, such as videos, music, and diverse situations, to identify genuinely unique emotional categories. What is interesting, **Paul Ekman, an American psychologist and professor emeritus at the University of California, [discovered that emotions such as joy, anger, disgust, sadness, fear, and surprise (and later added contempt) are universally recognised across different cultures](https://www.paulekman.com/universal-emotions/).** In his research he used short stories and images of emotional faces to understand the universality of emotional expression, developed later into the Facial Action Coding System. On the other hand, **Robert Plutchik, a psychologist specializing in emotions, developed [the wheel of emotions](https://www.6seconds.org/2022/03/13/plutchik-wheel-emotions/?gad_source=1), which comprises eight basic emotions: joy, sadness, trust, disgust, fear, anger, surprise, and anticipation.** According to Plutchik, these basic emotions can combine to create complex emotions, such as love (a combination of trust and joy) or embarrassment (a combination of fear and surprise). The model illustrates how emotions function, defining their placement on the wheel, which indicates their intensity and opposites. Half of these emotions are considered positive, and the other half are considered negative. They are perceived as opposites of each other.





    ![wheel of emotions](../../static/images/plutchik-wheel.svg.png "Source: https://commons.wikimedia.org/wiki/File:Plutchik-wheel.svg")
    ###### Source: https://commons.wikimedia.org/wiki/File:Plutchik-wheel_es.svg For instance, joy is opposite to sadness, surprise is contrary to impatience, trust opposes disgust, and anger is opposite to fear. Plutchik elaborated on each emotion in detail and divided them into primary, secondary, and tertiary subgroups. His model describes a fascinating relationship between emotions, their intensity, and polarization. In Plutchik's model, the intensity of emotions is high when they are located at the center of the wheel and decreases as the distance from the center increases. Furthermore, Plutchik's Wheel of Emotions demonstrates that basic emotions can combine to form more complex emotions. **In fact, our capacity for diverse emotional encounters is dependent on the size of our emotional vocabulary.** Reflect on your personal encounters – it's often exasperating when you struggle to articulate your emotions effectively. You might opt for the readily available term: “I’m angry at you." Yet if you pause for a moment and scan your mental library of emotions, you might uncover a richer assortment of words to convey your sentiments: hurt, undermined, insulted, neglected, or provoked. ## why do we need emotions in feedback process Emotions play a crucial role in feedback processing for several reasons:

 ### 🚀 Motivation Emotions like enthusiasm or satisfaction can motivate individuals to continue their current behaviours or make improvements. Conversely, emotions like disappointment or frustration can prompt them to address areas of concern.

 ### 🧠 Memory and Learning Emotions can enhance memory and learning. Feedback received with some emotional reinforcement is more likely to be remembered, making it easier to implement changes or take action based on the feedback.

 ### 🤝 Engagement Emotionally charged feedback can engage individuals more effectively. It captures their attention and fosters a deeper understanding of the message. ### 🏞 Perspective Emotions can help you see feedback in a broader context. Positive emotions can encourage you to recognise strengths, while negative emotions can prompt you to see areas that require improvement.

 ### 🗣Communication Emotions can influence how feedback is delivered and received. Effective feedback should consider the emotional state of the recipient to ensure it is well-received and acted upon. ## how can I use emotions in feedback process When used effectively, emotions can largely enhance the feedback communication process. **But instead of making other people guess your emotions, it is much easier to tell about them.** If you are the feedback giver, you should particularly be aware of the emotions you are going to inform about. **[Don’t be emotional](https://brightinventions.pl/blog/8-mistakes-you-make-while-giving-constructive-feedback/), but talk about emotions you have been experiencing.** Take a look at three examples of feedback message according to **FECE (Facts, Emotions, Consequences, Expectations) Feedback Model by Jurgen Appelo** that involve information about emotions: 
 ### 1. Situation: Your colleague helped you resolve a critical bug just before a project deadline.🥳
 **Facts:** "You provided a quick solution for the bug just before the project deadline." **Emotions**: "I felt relieved and grateful for your quick response." **Consequences:** "This greatly contributed to the successful project completion and saved us time and stress." **Expectations:** "I look forward to doing some next project with you. Teamwork makes the dreamwork. Great job!" ### 2. Situation: Your colleague's frequent tardiness is causing delays in the project.😰
 **Facts:** "I've noticed that you've been late for several meetings and project milestones." **Emotions:** "I'm concerned and annoyed at the same time because it has become a recurring issue." **Consequences:** "This delay affects our project's timeline and team productivity in a negative way.” **Expectations**: “It would be great if we can talk about that and resolve this issue to improve yours and at the same time our team's performance."

 ### 3. Situation: Your colleague failed to communicate about a roadblock which led to misunderstandings.😓 **Facts:** “I want to understand why yesterday you didn’t communicate at daily meeting that you were having some roadblock in your task.” **Emotions:** “I am a bit disappointed and confused by this situation." **Consequences:** “As this leads both to misunderstanding with our client and delay of the delivering the whole feature.” **Expectations:** "I want us to establish a better process for sharing roadblocks and challenges to prevent such issues in the future. Do you have any ideas how we can work on this or how can I help you with that?" Using the above feedback messages incorporate facts, consequences and expectations, but there is also space for expressing emotions so that the whole meaning is much clearer to the recipient. **Emotions add a human touch to your feedback.** Recognising and addressing emotions acknowledges that we are not just interacting with robotic entities but with fellow humans who have feelings. **Emotions also help explain the impact of the behaviour or situation on the giver of feedback. Sharing emotions can lead to a better understanding of the feedback's significance and why it matters. They make feedback more genuine and authentic.** ## summary 
 In the realm of feedback, emotions are the bridge that connects us on our journey toward growth and understanding. They infuse our words with empathy, our intentions with sincerity, and our actions with purpose. As we navigate the intricate landscape of human interactions, let us not forget about the power emotions wield in the feedback process. **Next time you find yourself offering or receiving feedback, consider the emotional undercurrents at play. Acknowledge them, embrace them, and allow them to be your compass in building stronger, more empathetic relationships.** In doing so, we can create a world where feedback isn't just about pointing out flaws or celebrating successes but about the true connections we forge and the collective progress we achieve. The path to better feedback is a journey worth embarking upon, hand in hand, with our emotions as our guides. ## Understanding the Difference: Generative AI, Conversational AI, LLMs & SLMs *Published: 2024-04-11 | Author: izabela | Tags: AI* *Source: https://brightinventions.pl/blog/ai-buzzwords-definitions/index.md* **A single title packed with many concepts and abbreviations – don't worry, we'll explain everything and help you navigate through the complex world of AI. Our concise guide includes examples of real implementations to illustrate these technologies in action.** Google Trends reveals that Generative AI is the most discussed buzzword:
    ![Google Trends](../../static/images/ai_buzzwords_google_trends.png "Google Trends")
    It makes sense since Generative AI represents the broadest category. It encompasses all AI systems designed to generate new content that could plausibly have been created by a human.
    ![AI definitions](../../static/images/ai_buzzwords_landscape.png "AI definitions")
    ## Understanding Generative AI Generative AI is designed to create new content or data that resembles authentic, human-generated material. These systems can produce a wide variety of outputs, including text, images, music, and even video, based on the patterns and structures they have learned from their training data. ### Example of Generative AI – Own Knowledge Base Chatbot Do you have tons of content regarding your product or solution? You can transform them into a chatbot assisting your customers and alleviating some burden from the support team. Or maybe you want to use the chatbot internally to support your marketing and sales in content generation based on the content you already have on your website. That’s the case of the chatbot our team has developed internally. Our internal chatbots process information on our webpage, including hundreds of blog posts, providing the fastest access to content generated by dozens of people over a decade. The preview below shows the real use case of our chatbot (with PlugBear):
    ![Own Knowledge Base Chatbot](../../static/images/chatbot_bright_inventions.png "Own Knowledge Base Chatbot")
    It’s easier than you might think to set up a basic chatbot based on your knowledge. My colleague, Rafał Hofman, has prepared a tutorial on [how to create your own knowledge-based chatbot in just 5 minutes](/blog/how-to-build-gpt-assistant/). This guide provides all the essential information you need to set up your chatbot, thereby integrating Generative AI (with OpenAI) into your operations. ## Large Language Models and Small Language Models Language Models are specific types of Generative AI that focus on processing and generating text. ### Large Language Models (LLMs) LLMs understand, generate, and process natural language text. These models are trained on vast amounts of textual data, enabling them to comprehend context, generate coherent and relevant text, and perform various language-based tasks such as translation, summarization, and question-answering. Read more about the technical aspects of building LLM applications: [Build LLM application with RAG](/blog/build-llm-application-with-rag-langchain/) ### Small Language Models (SLMs) SMLs serve the same purpose as Large Language Models (LLMs), yet they are trained on a smaller amount of data. Therefore, they require significantly fewer computational resources compared to LLMs. Despite their smaller size, SLMs aim to maintain a high level of performance on various natural language processing tasks, including text generation, classification, and translation. Choosing SLMs can make your application more accessible on a broader spectrum of devices, or even enable offline functionality. ### Example of language models in use – Duolingo

    Explain My Answer

    Explain My Answer offers learners the chance to learn more about their response in a lesson (whether their answer was correct or incorrect!) By tapping a button after certain exercise types, learners can enter a chat with Duo to get a simple explanation on why their answer was right or wrong, and ask for examples or further clarification.
    Duolingo Blog
    ![Duolingo](../../static/images/duolingo_explain_my_answer.png "Duolingo")
    Source: [Duolingo blog](https://blog.duolingo.com/duolingo-max/) ## Conversational AI – definition Finally, Conversational AI is an application of AI technologies, often leveraging LLMs, SLMs, or a combination of different AI models, to simulate human-like conversations. By using natural language processing (NLP), machine learning, and sometimes speech recognition technologies it results in understanding, processing, and responding to human language in a way that is both meaningful and contextually relevant. Conversational AI enables computers to simulate human-like conversations. This encompasses a range of applications, including chatbots, voice assistants, and interactive voice response (IVR) systems. ### Example of Conversational AI – Weabot (mental health chatbot)

    Woebot

    Woebot is the evidence-based, AI-powered digital companion at the heart of our platform that delivers personalized, in-the-moment support through chat-based conversations and techniques. Woebot is the world’s first relational agent to create a bond with people that is comparable to that achieved by human therapists.* Woebot digitizes concepts based on Cognitive Behavioral Therapy and is informed by the way clinicians move through a session.
    woebothealth.com
    ![Woebot](../../static/images/woebot_mockup_ai.png "Woebot")
    ## AI buzzwords – a cheat sheet
    ![AI buzzwords cheat sheet](../../static/images/ai_buzzwords_cheat_sheet.png "AI buzzwords cheat sheet")
    ## How to Choose the Right Video Conferencing Tool for Healthcare *Published: 2024-04-09 | Author: blazej-d | Tags: HealthTech* *Source: https://brightinventions.pl/blog/telehealth-video-conferencing-software/index.md* **In December 2024, Twilio will decommission its video API, posing a significant challenge for HealthTech companies, particularly those specializing in telemedicine, as they now need to find an alternative video conferencing provider. To assist in this transition, we've prepared a guide on selecting the right provider for your telehealth solutions.**
    ![telehealth video conferencing tools](../../static/images/telemedicine_video_conferencing_tool.png "telehealth video conferencing tools")
    ## What will you find in this article? * [Possible options you have when deciding on conferencing providers.](/blog/telehealth-video-conferencing-software/#what-options-do-you-have-when-deciding-on-a-telehealth-video-provider) * [A software developer's perspective on what’s important when choosing a provider.](/blog/telehealth-video-conferencing-software/#engineers-perspective-on-video-telehealth-videoconferencing-solutions) * [What to look for when choosing a solution dedicated for healthcare.](/blog/telehealth-video-conferencing-software/#what-options-do-you-have-when-deciding-on-a-telehealth-video-provider) * [What video conferencing providers are available and the most popular in 2024.](/blog/telehealth-video-conferencing-software/#video-conferencing-tools-available-to-healthcare-providers-in-2024) This year started with some of our clients asking us to help explore the possibilities of shifting from one of the major video providers [Twilio that will decommission its video API by the end of 2024](https://www.twilio.com/en-us/changelog/programmable-video-eol-notice). This has put a lot of stress on some organizations, forcing them to act fast and look for a substitute. The mentioned provider highlights ZOOM as a potential replacement, but given the backlash of the 2020 data breach, and constant phishing attacks performed in ZOOM’s direction it’s hard to be 100% confident about its stability and safety. In all fairness, ZOOM has done a lot of work to improve their safety and no major breach has happened since 2020, but being one of the leaders always puts you in the “hacker spotlight”. **In this article, we will provide key information you need to make an educated decision when choosing a video conferencing tool**. ## What options do you have when deciding on a telehealth video provider? An honest answer to a question about the best video provider solution for your venture is as you might already know is: it depends. There are both business and technical factors that need to be taken into consideration and the decision must be a calculated one. We can only provide you with the spectrum of options that are at your disposal. So here they are. ### 1. Build your own native solution Integrating native video conferencing into your telehealth application can seem highly effective. This method offers a lot of flexibility and room for customization, it ensures full control over the user experience. But “with great power comes great responsibility”. Building a video conferencing tool is a startup in itself. This approach is best for companies with big budgets, definitely not an option for startups on VC funding. Yes, it offers a lot of flexibility and opens the door for new monetization methods but it also leaves YOU to adjust and comply with all regulations and place all the risk that comes with it in your hands. So not only is it a huge expense but also extra time-consuming when applying to get all the certificates. ### 2. Look for open-source software Open-source solutions are usually a “smart choice”. It leaves you some room for customization but takes the load of building the solution's core feature. Usually, I recommend it to startups as a first choice when they are already after the MVP stage. It requires some budget to build but in time the benefits start to show with time. However, they are not GDPR or HIPAA compliant by default. Take “Jitsy”, one of the more popular open-source video providers which we have integrated in the past. Even if it does not store conversation contents by default, it does process personal data to operate and store browsing data and conversation metadata in logs. Although it implements client-server encryption it does not implement end-to-end encryption between clients, so it has to be properly configured, to be GDPR compliant. In other words, you can implement the solution in a compliant way, but it does not mitigate the “legal’ risk to a third party. ### 3. Leverage existing compliant software providers This is probably the most popular road that founders take when incorporating a video conferencing solution into their telehealth venture. It’s the most risk-averse option. But just like with the discontinuation of the API that we mentioned at the begining, choosing an external provider might prove irritating in the future. They offer all the basic features like calendar integrations, screen sharing, chat, or document sharing. Also, they have a seemingly low entry barrier because the only challenge is to integrate via a ready-made API. For all those founders lacking the engineering resources this is a good way to start. Of course with those solutions, there is not much room for flexibility and you become dependent on external factors. At the same time alongside the ease of integration comes a lack of risk in regards to GDPR or HIPAA compliance but also the bills will get higher when more users join your platform. In time, when your venture scales and reaches more users the monthly cost of supporting this solution will start to grow. It’s up to you to decide when or if there is a need to change. Balance out the development cost with monthly support and if those two meet within a few years, it's probably a good idea to look for alternatives. But when starting, this is the way to go. ## Engineers' perspective on video telehealth videoconferencing solutions If an engineer could choose a video conferencing tool to integrate what would they look for? I’ve been talking with our team trying to get their point of view. Here are a few elements that we decided to highlight. ### 1. Technology alignment Before you make a business decision, double-check with the engineers if the tech stack aligns. For example, If most of your users connect via mobile, and the tech stack that is used on your platform is React Native, verify if the tools you have chosen will be easy to integrate with this technology. On top of that, verify which devices the chosen solution supports. ### 2. Documentation Before choosing a solution, highlight all the options you have on the table to your engineers and allow them to verify how specific the documentation is. The better this is prepared the less problems you will have when integrating it. A poorly prepared API documentation can have huge effects on the time consumed during the integration process. ### 3. Support levels Remember when choosing a third-party option you are placing yourself at their mercy during downtime. Be sure that they are offering good quality support because many times your engineers will have their hands tied when trying to solve problems. ## Telemedicine video conferencing tools checklist To summarize, allow me to present a checklist of elements to look out for when choosing a provider. 1. Remember that HIPAA does not equal GDPR and tools compliant with one do not necessarily comply with the other. 2. Look at the pricing plans, but also search for the small print. Solutions might only seem cheap at the start but once you: * Need 24-hour support * Want unlimited data * Want unlimited call time * Want to add multiple callers The bill will start to grow. 3. Does the solution offer support for both web and mobile technologies? 4. Check if they have a developers' forum. This can act as an extra safety valve for your engineers, if the support will be slow to respond and a problem that occurs is critical, a developers forum might save the day. (nice to have) 5. Verify the opinions on industry directories. 6. Verify the video quality. Practitioners need to be able to spot any changes in general presence or skin tone. Full HD should be enough. 7. Tech documentation. Before you decide, ask your engineers for their opinion on each solution and if the available specifications are understandable and up to date.

    good to know: Web Real-time communication (WebRTC)

    With WebRTC, you can add real-time communication capabilities to your application that works on top of an open standard. It supports video, voice, and generic data to be sent between peers, allowing developers to build powerful voice- and video-communication solutions. The technology is available on all modern browsers as well as on native clients for all major platforms

    good to know: SDK vs API

    APIs are used to communicate between different applications, whilst an SDK is a tool kit to build applications and features. In most cases, an SDK application will contain an API — or even multiple APIs depending on the purpose of the software.
    8. Feature suggestions. * chat and messaging; * screen sharing; * security and encryption protocols; * recording; * scheduling; * file sharing; * virtual waiting room. ## Video conferencing tools available to healthcare providers in 2024 *Please note that we are not affiliated with any of the mentioned providers. This comparison is made to help you out by mentioning the providers' “Google” and “G2” search results places as the most popular. The information provided in the below table is gathered from the official websites of these solutions.* ### doxy.me GDPR: Yes HIPAA: Yes Pricing starts from 35 USD (free plan available) [doxy.me/en/pricing/](https://doxy.me/en/pricing/) **Worth mentioning:** * HD video and audio for an optimal experience. * Works directly in popular browsers without any downloads, plugins, or installations. * Identified by Clemson University research as the easiest telemedicine platform. * Personalization options with text, pictures, and videos for an engaging patient waiting experience. * Automatic tracking of each session's date, time, and duration for effortless record-keeping. * Accessible from almost anywhere using a mobile browser for flexible patient consultations. ### Zoom for healthcare GDPR: Yes (only paid plans) HIPAA: Yes (only paid plans) Pricing starts from 149.90 USD /year/user https://zoom.us/pricing/healthcare/ **Worth mentioning:** * Meetings up to 30 hours per meeting * 100 Attendees per meeting * Whiteboard Basic * Team Chat * Mail & Calendar Client & Service * Cloud Storage 5GB ### Stream GDPR: Yes HIPAA: Yes (only in enterprise plan) Pricing: Pay as you Go available [getstream.io/pricing/](https://getstream.io/pricing/#features) **Worth mentioning:** * Flexible video quality for an optimal experience. * Healthcare chat experience with SOC2, ISO 27001, GDPR. * Enterprise grade uptime & performance + 99.999% uptime SLA available. * Official Dolby.io partner for best in class video/audio calls. * All the modern messaging essentials your users expect. Threads, replies, reactions, typing indicators and read state. * Easy Integration * Build chat using a combination of low-level API access and complete client-side SDKs to meet your needs. ### GoTo GDPR: Yes HIPAA: Yes Pricing: starting from 12 USD /user/month [goto.com/pricing/](https://www.goto.com/pricing/meeting) **Worth mentioning:** * Meeting locks and password protections create waiting rooms for patients just like an in-person practice. * Video-based telehealth offers patients a convenient, safe option on any device, without sacrificing privacy. * HIPAA-ready features and settings are pre-configured to provide the most comprehensive security. * GoTo Resolve is an all-in-one IT management suite purpose-built for today's IT support challenges. * 99,999% uptime * Good variety of supported integrations. ### Google Meet GDPR: Yes (under BAA) HIPAA: Yes (under BAA) But… “Customers are responsible for … ensuring that they use Google services in compliance with HIPAA.” Pricing: Google workspace pricing plans [workspace.google.com/pricing](https://workspace.google.com/pricing.html) **Worth mentioning:** * Google Meet offers high-definition video and clear audio quality, * Users can share their screens with others. * Google Meet allows you to record meetings * Real-time captioning is available * Integration with Google Workspace - Calendar, Gmail, and Google Drive, simplifying scheduling and document sharing. * End-to-End Encryption * Live Polls and Q&A ### Microsoft Teams GDPR: Yes HIPAA: Yes Pricing: MS 365 pricing plans [microsoft.com/en-us/microsoft-teams/healthcare-solutions](https://www.microsoft.com/en-us/microsoft-teams/healthcare-solutions) **Worth mentioning:** * Tumor boards Use a virtual environment to admit and diagnose patients, start treatment, and review test results. * Team coordination and collaboration across shared devices while adhering to compliance needs.​ * Knowledge and content sharing by hosting grand rounds to eliminate technology barriers. * Virtual classes for prospective patients that cover a variety of topics.​ * Team huddles​ Address industry challenges related to patient care, safety, technology, equipment, process, and supplies. ### Whereby GDPR: Yes HIPAA: Yes Pricing: Pay as you Go available [whereby.com/information/embedded/pricing](https://whereby.com/information/embedded/pricing) **Worth mentioning:** * Thanks to SDK with React hooks, you can fully customize the UI virtual classroom experiences for students and teachers * Embedded and Meetings plans * Support, tutorial and full documentation available * No app or software download required ### Webex by CISCO GDPR: Yes HIPAA: Yes Pricing: 14.50 USD/ month/user [pricing.webex.com/us/en/hybrid-work/meetings/](https://pricing.webex.com/us/en/hybrid-work/meetings/) [](https://pricing.webex.com/us/en/hybrid-work/meetings/)**Worth mentioning:** * Strong AI focus and a dynamic ecosystem with incoming new features. * Enables clinicians to send x-rays, treatment information, and screen recordings. * Interactive patient experiences with new channels such as RCS and Apple Messages for Business. * Personalize patient experiences with custom buttons, carousels, list pickers, and video. I hope you found something valuable in this article and the information shared can help you choose the video conferencing tool that is the right one for you and your organization. Also please keep in mind that we are neither favoring any mentioned tools nor trying to dissuade you from any other providers available on the market but not mentioned here. Thanks for reading! ## 3 Tech Challenges to Face When You Build a Mental Health App *Published: 2022-09-09 | Author: dawid-cz | Tags: HealthTech* *Source: https://brightinventions.pl/blog/3-tech-challenges-to-face-when-you-build-mental-health-app/index.md* **Building a mental health app differs from other software products. Are you planning to hire a software agency to develop your app for emotional support? Make sure that you know the technical challenges you and your team will likely face.** Numbers aren’t optimistic. [WHO](https://www.who.int/news-room/fact-sheets/detail/depression) estimated that **280 million people around the world suffer from depression**. Putting that in perspective – it’s around 80% of the population of the USA. Moreover, at least **[25% of people](https://www2.deloitte.com/content/dam/insights/us/articles/glob114104_future-of-behavioral-health/GLOB114104_Future-of-behavioral-health.pdf) will experience behavioral illness**. *More of that was covered in our blog post about [the future of healthcare software](https://brightinventions.pl/blog/healthcare-software-development-not-a-future/).* Probably no public health system will be able to respond to those needs. Therefore **the number of mental health applications will be increasing**. As software developers specializing in building apps for depression, anxiety, and other mental disorders we have distinguished **3 challenges that every emotional support app team will likely face**.
    ![Software developers Bright Inventions](../../static/images/blog_dawid_dominik_slawek.png "Software developers Bright Inventions")
    ## Data security and privacy **Dominik, Frontend Developer at Bright Inventions:** Privacy of personal information has always been a serious topic in [software development](/our-areas/custom-software-development). Yet it is especially important in the case of data connected to personal health. Every **data leak is a potential complete loss of trust in a company**.
    ![Dominik's quote on data leak](../../static/images/dominik_quote_mental_app.png "Dominik's quote")
    Moreover, it can be extra catastrophic when taking into account the fact that in many countries **health information privacy is protected by law**. There are also challenges regarding **anonymity**. Not every user wants to share everything about themselves with other users. We might need their first and last name for payment purposes but they rather not be mentioned by real names inside the app. Another thing to keep in mind is if we accept **payments with credit cards**. What will the credit card statement show? Some users might not be willing to share information that they’re using a mental health help with people who have access to their credit card statement – a spouse or parents. *Read our guide on [security practices for healthcare apps](/blog/cyber-security-in-healthcare/) that you can implement to ensure your app trustworthy and credibility.* ## Never losing users' trust **Dawid, Fullstack Developer at Bright Inventions:** In terms of mental apps, there are many ways to lose users' trust. Examples have just been presented by Dominik in the previous paragraphs. Losing users’ trust is the worst scenario in most businesses. However, in terms of mental health apps – there can be no way back from that. Your **users' trust is the guarantee of this business's success**. Let’s take as an example the hypothetical app that offers online group therapy sessions for people who deal with similar issues such as depression, eating disorders, or addiction. Not only do users share with you your personal data but also by joining the app inform you about their private struggles. Crucial personal data are at stake here. ### What can we do to maintain their trust: * **Logging and tracking events** This may seem a bit odd in terms of maintaining the user’s trust, but **by knowing how a user is using our application and being able to track what she or he was doing, we can improve user experience**, and have an easier way to reproduce some faulty paths. *App performance monitoring is a perfect solution to proactively react to any performance issues before they start to frustrate your users. You can set up a basic monitoring with our guide: [Unlock Performance Monitoring for HealthTech](/blog/healthcare-app-performance-monitoring/).* * **Being transparent about the data we collect and our privacy policy** We should **be open about the data we collect about the users**. You can be even obliged to do so for example in the European Union countries. There’s really no need to hide the fact that we are gonna use their e-mail for some marketing purposes. But please, give the user a way to sign off it, nothing may annoy them as constant spam on their e-mail inbox. * **Ensuring easy access to support** **Providing various methods so the user can reach support easier if he/she is in need**. Support contact information hidden between thousand of subpages is one of the worst things I can think of. By showing users a clear indication of where they should click, either by some chat widget or highlighted link, we show that we care about them and that they matter. Thus we build a bond between the brand and the customers.
    ![Dawid's quote on support contact info](../../static/images/dawid_quote_mental_app.png "Dawid's quote")
    ## Designing inclusive UI **Sławek, Fullstack Developer at Bright Inventions:** A clear, uncomplicated graphical user interface is one of the key factors of mental health applications. It is not so difficult to imagine that **even tech-savvy users might have issues with the app especially being overwhelmed with their personal issues**. It is also important to remember that users won’t expect advanced animations, complex features, or modern designs. They will focus on receiving the help they need.
    ![Slawek's quote on mental health app users](../../static/images/slawek_quote_mental_app.png "Slawek's quote")
    Overcomplicated design can even be an obstacle for less technical users to receive the professional help they look for. **[Accessibility](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibility) is something that has just started to get awareness** throughout the software development community. Now it is a must-have to take under consideration various groups of users. Our users can be visually impaired or have other disabilities that make their experience with the app totally different than we could ever expect. The mental health app, especially, should be adjusted to the needs of the larger possible number of people. ## Meet Bright Recruitment Team *Published: 2022-07-28 | Author: ula | Tags: bright insights, recruitment* *Source: https://brightinventions.pl/blog/meet-bright-recruitment-team/index.md* Recruiting success is not necessarily a measure of the volume of candidates obtained. Successful recruiting teams are able to quickly identify the candidates that are most likely to make a positive impact on an organization. It requires much more than looking beyond a candidate’s credentials. Today we would like to present to you our bright recruiters - Agata, Paulina, Sara and Ula who on daily basis take care of our recruiting process and talk with dozens of candidates to check if our company is a unique and desirable place for them. We asked them a few questions so that you can get to know them a bit better. ![](../../static/images/brightdev.png) ## How do you recall your own recruitment process at Bright Inventions? **Agata:** I remember my recruitment process really good - not only because of that I was hired. :) From the very beginning Ula presented the steps of the entire recruitment process in detail, thanks to which I knew what happened next. That was really helpful. When it comes to the interview, it was very pleasant because it was a real conversation and not Q&A. (It surprised me.) **Paulina:** I recall it as engaging, but with very positive impressions after all. From the very beginning, I felt that I was actively listened to, and my honest, transparent and sometimes unconventional answers were met with respect and full understanding. It was this kind of process I would want to offer to candidates as a recruiter myself. It gave me additional confidence that the role I was applying for was aligned with my own life values. **Ula:** It was very smooth, concise and positive. I had an interview with Michał and Daniel, the founders of Bright Inventions. I think we got on well from a few first minutes. They were super friendly, engaged and enthusiastic. I had done some research of the brand before we met, so I had a list of things I would like to implement if I would be hired. \ \ **Sara:** That process was very surprising for me - I remember the girls (my recruitment process was conducted by Ula and Agata) really wanted to get to know me. Questions were constructed in a way that allowed me to share my attitude and way of thinking. I had no experience in recruitment or IT, and I did not know the answers to so many questions (that's how I remember it :p). I recall that during the interview, I had the thought that there was no way for me to get this job, but at the same time, I had a really good time with Ula and Agata. I felt respected. :)
    ![Sara Bright Recruiter](../../static/images/sara_rekru_team.jpg "Sara Bright Recruiter")
    ## Why did you decide to join Bright Team? **Agata:** I applied for the position of junior recruitment specialist. I felt good energy and professional approach during the interview so my first thought was that Bright is the right place for me to take the first steps in my career. Moreover, people on Bright social media also looked positive and this visible sport spirit - I realised immediately that it is a great place for me.\ \ **Paulina:** From the very beginning of my career, I felt that the role of a recruiter is not just a stereotypical testing of a candidate's skills with an inherent element of stress. I know from my own experience how uncomfortable and, most importantly, how unprofessional and disrespectful it is. When I got to know the values of Bright Team, I felt that in such environment I could be simply myself and fulfill my beliefs. The recruitment meeting with Ula - my former recruiter and current leader - was just a real confirmation of my assumptions. **Ula:** The brand was not recognisable that time. I needed space where I could use my skills and people who would trust my intuition. I had a lot of ideas, I met interesting people during the interview and realised I had a chance to create something valuable almost from scratch. I am always saying that Bright Inventions was almost like a blank page and I really wanted to colour that page.\ \ **Sara:** To be honest - it was by accident. My plan for 2023 was to prepare for a recruiter role and maybe (if I was lucky) land a recruiter job by the end of the year. My target was an IT company. However, I didn't have time to start preparing. :D I stumbled upon a job offer for a Junior Recruitment Specialist and thought, 'Why not? I'll give it a try.' So I did, and in early January 2023, I got the job. When I got this job, I realized how much I fit in here.
    ![Agata Bright Recruiter](../../static/images/agata_rekru_team.jpg "Agata Bright Recruiter")
    ## Why did you choose a recruiter's path career? **Agata:** I like the fact that thanks to my work I can meet many interesting and ambitious people. I always wanted to be in a place where I would have a real impact on the development of myself, the company, and be able to contribute to the professional development of others. I think that thank to being a recruiter I will get it.  :)\ \ **Paulina:** The role of a recruiter is related to my psychology background. The academic experience directed my skills and mindset as analytical and human-centered, which was only a formal confirmation of my prior self cognition. I have always found myself in the role of an active listener and it has given me pure joy and satisfaction. As additional confirmation of this hypothesis, I noticed in my callers a sense of listening, often a relief. I recognized this fact as my strength and decided to use it in my professional career. :) **Ula:** I think this role somehow chose me. I was perusing the career of marketing specialist, translator and tutor when after a few years recruitment appeared in my life. After entering this field I realised I had some skills that I hadn't perceived as anything unique before. At first I decided to focus on employer branding and recruitment marketing and then discovered my real interest into recruitment area. Now I am 3 in 1 . :) \ \ **Sara:** Short story - I had a feeling that this was my career path. I wanted a job where I could use my personal skills, psychological knowledge, and be close to people. That's it. :) ![Paulina Recruiting Team ](../../static/images/paulina_rekru_team.jpg) ## What do you like most about your job? **Agata:** I like the moment when new people, after a few weeks of work, say that they are satisfied and happy where they are. It motivates me a lot to work harder, and new employee’s contentment is such like a reward for me. :) **Paulina:** While many single aspects come to my mind, the biggest gratitude I feel when I know or observe from a candidate's behavior that he/she simply feels comfortable in my presence, that feels listened to and treated with due respect. I feel best when I know that my candidate made a bond with me, got an added value from the hiring process, and felt that he or she and his/her story was unique and one of a kind for me.  **Ula:** The fact that I can meet dozens of interesting people and help them find a good place for their development. And the fact that I am learning all the time. Every person is a new experience. The structure of the recruitment process is well-defined, but people are not defined at all. You can ask the same questions, but every time you get different answers. Every person that I meet teaches me something new. \ \ **Sara:** I think there isn't just one thing I like the most. Basically, I enjoy the diversity of my responsibilities. For sure screenings and interviews are one of my favourite parts. I enjoy talking with people, and fortunately, in my role, I have many opportunities to do so. On the other hand, I also like the sourcing process - listening to loud, rhythmic music and searching for passive candidates can be very relaxing for me. Additionally, I enjoy writing - in my role, I write feedback, LinkedIn posts, and blog posts. The balance between all of these aspects makes my job really pleasant and satisfying. ![Ula Recruiting Team ](../../static/images/ula_rekru_team-1-.jpg) ## Is there any (memorable, non-standard) recruitment experience you remember till today? **Agata:** I can give an example of the conversation before the whole recruitment process. One of my candidates could not call me because he was on holiday, so I told him that we could go back to the conversation after his trip and wished him a good rest. I also added that he would send some photos from the holidays (that was a joke). The funny thing was that I got a few pictures a week of this trip ex. sunset or sea. That was so nice, and I was really surprised.\ \ **Paulina:** There would be a bit of that, but the first story that comes to my mind is a pandemic interview with a developer who was wearing sunglasses, a short-sleeved shirt with holiday flowers and an exotic-oceanic backdrop at Google Meet the entire time. :) **Ula:** A lot of them. I usually remember quite well all the processes I have run. For sure there have been things that surprised me such as candidates disappearing suddenly during an online meeting. :D But I think the most memorable for me are situations when people share their feelings with me and I can get to know them as real human beings not only as professionals. \ \ **Sara:** There are moments like that - these are my favorite screenings when I feel people’s vibe and I sense that the person could be my mate. But I also have one funny moment - I remember that once I wished 'Niech Wam ziemia lekką będzie' to a super cool candidate who had just gotten married. It means ‘Rest theirs souls’, but it sounded so nice to me, and I had no idea of its true meaning.
    ![inspiration recruitment quote ](../../static/images/agata_rekru_team_quote.png "inspiration recruitment quote ")
    ## What is your advice for potential applicants? **Agata:** Firstly - be yourself. Secondly - take the recruitment process seriously. Book enough time and sit in a quiet place where you can talk freely. Thirdly - be honest. We are very transparent with you - be like that with us.  **Paulina:** Get to know the real you:) Tell me straight to the point what is in your soul, what you need, what you want to change in your life - I'm here to listen to you. All these elements are extremely important to me, because thanks to them you allow me to verify whether the role we are talking about is able to meet your expectations. Recruitment is a two-way transaction, so don't be afraid to ask me anything - I'm here to make sure that you can learn as much as possible about all aspects of working in our team, so that I as a recruiter can be sure that you are confident and ready to take on a new challenge. Also, if you feel like joking with me and having a little fun, I'll be more than happy to! After all, we are talking about something super cool, which is working together every day, so let's get to know each other as regular people too!;) **Ula:** Ask as many questions as you can from the very beginning. You should be sure that the offer you are going to accept is the one that will make you happy. Do not look at the job offers only through the prism of salary ranges. Money is important, but there are some other key aspects worth keeping in mind - your future team, project, level of independence and responsibility, even tech stack. Ask about them. \ \ Choose wisely and be honest with us and with yourself. \ \ **Sara:** Trust us, we're on the same team. ;) We want you to feel as comfortable as possible when sharing your knowledge and experience with us. We understand that the recruitment process can be stressful and may affect the outcome of sharing your knowledge and experience. However, please remember that our goal is to understand your knowledge and experience as thoroughly as possible. Even if this particular position doesn't work out, we remain open to future cooperation. ![inspiration recruitment quote ](../../static/images/paulina_rekru_team_quote.png) ## How do you learn? How do you stay up-to-date with IT industry? **Agata:** Mostly, I am looking for information about IT Recruitment. I participate in webinars, read blogs, and listen to podcasts. I also watch tutorial videos for developers to get closer to these topics and learn more about technologies and programming languages. **Paulina:** In addition to the strictly HR knowledge contained in webinars, blogs, authority profiles on LinkedIn, industry books, or conferences, I try to expand my knowledge in the area of daily developers' work. So I read Uncle Bob, talk to developers, participate in initiatives for developers both inside and outside of my team, ask my teammates (and my husband;)) silly technical questions - summing up, try to be close and immerse myself in the specifics of this profession, learn about the daily challenges in the programming world as much as I can.\ \ **Ula:** By reading business and psychological books, listening to HR podcasts and talking with people. :) If it comes to functional programming knowledge I have a great team here who is always supportive and able to explain even the most complex programming issues. It is enough to ask and you are provided with all the information you need. **Sara:** For me, the best way to learn is by talking, asking questions, and repeating things. I also enjoy listening to (and being part of) technical conversations - fortunately, I have technical people around me, which is very helpful for understanding what programming is about. I've even tried writing some code to see things from a developer's perspective. ![](../../static/images/ula-_rekru_team_quote.png) ## Do you have any motto that you really like? **Agata:** *Letting go also becomes a habit.* It always motivates me to undertake even difficult things and not postpone anything until later. **Paulina:** *One man by nature is just as good as any other* (J.J. Rousseau) and *I’m not telling you it’s going to be easy, I’m telling you it’s going to be worth it.* ​​(Art Williams) **Ula:** It is not a good question for me as I have at least a few, e.g. *Hope for the best, there is no point in hoping for the worst.* (Stanisław Lem), *Alone we can do so little, together we can do so much.* (Helen Keller), *It is literally true that you can succeed best and quickest by helping others to succeed. (Napoleon Hill). And I also really like Socrate's* The secret of happiness, you see, is not found in seeking more, but in developing the capacity to enjoy less. *Now you know why I call myself #ulacoelho. 🙈😉* **Sara:** *'Let people be people'* - that motto came to me. It is very universal. Our behavior is connected with our motives and always has a reason (or reasons). And my role (as a human) is not to judge, but to try to understand. It helps me remember that all of us have our own perspectives, feelings, and needs. And I respect that. It is extremely important to be open to differences, especially if we do not understand them. Openness is the key. :)
    ![inspiration recruitment quote ](../../static/images/sara_rekru_team_quote.jpg "inspiration recruitment quote ")
    That is the end for today. Stay tuned! If you would like to ask Agata, Paulina, Sara or Ula any questions, leave a comment below. ## 13 Companies Driving FemTech *Published: 2024-04-02 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/femtech-key-areas-and-companies/index.md* **FemTech spans a wide range of vital areas, from reproductive health, aging to mental well-being. In this article, we explore 13 companies harnessing technology to improve women’s lives across diverse healthcare and wellness domains.** ## Areas of FemTech
    ![FemTech key areas](../../static/images/femtech_key_areas.png "FemTech key areas")
    ### Reproductive health This area includes technologies related to menstruation, contraception, fertility solutions, pregnancy, and nursing care. Apps that track menstrual cycles and fertility windows fall into this category, as do technologies assisting with in vitro fertilization (IVF) and other fertility treatments. [Clue](https://helloclue.com/about-clue) offers a health app for tracking menstrual and fertility cycles, providing women with accurate predictions and insights into their reproductive health​​. [Flo Health](https://flo.health/) has developed a widely-used app for period and ovulation tracking, leveraging AI to offer personalized insights and support for female health​​. ### Pregnancy and postpartum care Technologies and services designed to support women before, during, and after childbirth. This can include prenatal and postnatal care apps, wearable devices monitoring maternal and fetal health, and platforms offering support and resources for new mothers. [Keleya](https://keleya.de/en/pregnancy-app/) offers a large selection of pregnancy workouts, yoga & expert knowledge tailored to the needs of pregnant women. [LEIA Health](https://www.leia.health/en) helps to track women's well-being after giving birth including postpartum depression and pelvic floor tests, recovery plans, sleep, feeding and exercising recommendations. ### General healthcare This encompasses a broader range of health issues, including prevention, treatment, and wellness. It includes platforms for women-specific health conditions like polycystic ovary syndrome (PCOS), breast cancer and endometriosis, as well as apps and wearables focused on general fitness, nutrition, and mental health tailored to women's needs. [Gennev](https://www.gennev.com/) provides a telehealth menopause clinic, offering consultations with doctors and dietitians alongside education and menopause treatment​​. [DeepLook Medical](https://www.deeplookmedical.com/) empowers radiologists with a cutting-edge software tool to improve the visualization and efficiency of medical imaging, even in dense breast tissue. ### Sexual health Solutions and platforms dedicated to sexual education, sexual health, and wellness, including STD prevention and treatment, sexual dysfunction solutions, and products enhancing sexual well-being. [Tabu](https://www.heytabu.com/) focuses on sexual wellness, starting with products aimed at women in peri- to post-menopause, addressing the connection between sex and overall well-being​​. ### Menopause Products and services focused on health issues related to aging in women, including menopause management. This can involve hormone replacement therapy (HRT) management apps, products for managing symptoms of menopause, and platforms offering advice and community support. [XbyX](https://www.xbyx.com/) offers a digital platform with plant-based products and educational content to help women navigate menopause with ease​​. [Astinno](https://www.gracecooling.com/) is developing Grace, an automated smart cooling bracelet designed to help women experiencing hot flushes during menopause​​. ### Aging Menopause is often associated with the aging of females, yet reaching a certain age is related to many conditions that should also be addressed by tech companies. Osteoporosis, dementia, weight gain, and urinary incontinence are only a few of the conditions. [Oviva Therapeutics](https://www.ovivatx.com/) focuses on developing innovative therapeutics aimed at improving ovarian function to extend the healthspan of women [INNOVO](https://www.myinnovo.com/) offers a non-invasive, FDA-cleared solution for treating stress urinary incontinence in women. ### Breastfeeding and nursing Technology solutions designed to support breastfeeding mothers, including lactation apps, smart breast pumps, and devices for monitoring milk supply and feeding schedules. [LactApp](https://lactapp.com/) provides personalized support for breastfeeding and motherhood, integrating professional healthcare services via an app​​. ### Mental health Platforms and apps focused on mental health issues, offering services such as counseling, therapy, and support groups tailored specifically for women and the unique challenges they may face. [AtEase](https://mentalhealthatease.com/) is an inclusive mental health platform by Lilac Insights that caters to women (cis-women & transwomen) and non-binary individuals (gender identities that are outside the binary of man & woman) with different stories. Ready to explore FemTech further? Read our blog post on how [technology can help you build a unique experience for your female users](/blog/keys-to-succeed-in-femtech/)? ## Understanding FemTech: Keys to Succeed with Your Software Solution for Women *Published: 2024-03-27 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/keys-to-succeed-in-femtech/index.md* **FemTech means technology for women. It is as simple as that, yet it embraces so many layers, and responsibilities. As a [healthcare software development company](/our-areas/healthcare-software-development/), we may not have all the answers to your business challenges, but we're here to guide you on how to smartly leverage technology. Let us show you how tech can help you enhance your solution and – more importantly – relations with your female users.**
    ![Women](../../static/images/femtech_blog_cover.png "Women")
    ## Empathy and data-driven development \[use case: app onboarding for pregnant women] What’s best for FemTech users? Short, easy-to-complete onboarding, or perhaps a long but very personalized one? The answer might surprise you. Short onboarding is often a key to success, especially in lifestyle applications, but this might not be the case in applications related to health. From the first interactions with your FemTech app, it's crucial to demonstrate the willingness to understand women perspective without making assumptions. **Well-designed onboarding will convey this approach to your female users right from their very first interactions**. No matter what onboarding strategy you will choose **you should always analyze its performance by measuring the completion rate** as a part of data-driven development. Read more about [how data-driven development saved the onboarding of FemTech app for moms-to-be](/blog/data-driven-development-femtech-app-onboarding/). ## Building trust with security \[guide to security audit included] Patients don't want to share their health data with health tech companies. It's hard to blame them. Day by day, we hear about cyber attacks targeted at healthcare companies. At the same time, **security practices aren't some mystery knowledge**. You can **quickly conduct even an internal security audit with the tools that we list in our [security guide for healthcare](/blog/cyber-security-in-healthcare/)**.
    ![security for healthtech](../../static/images/security_healthcare.jpg "security for healthtech")
    ## Ensuring credibility with app performance monitoring \[tutorial and metrics included] User frustrations related to your application may be painful for you in the future. Yet, there is quite an easy way to prevent it. **Implement app monitoring from the very beginning (or as soon as possible) to monitor any app performance issues before your female users even experience them**. There are many crucial metrics you should measure:
    ![app performance monitoring](../../static/images/app_performance_monitoring_metrics_update_blog.png "app performance monitoring")
    A basic app performance monitoring can be set up even within a day. For more information on this go to our another blog post deeply covering [eHealth app performance monitoring](/blog/healthcare-app-performance-monitoring/). ## Inclusive product design \[UX/UI best practices included] UX/UI design must tame any complexities and immediately **show the value of your solution**, otherwise patients and physicians won’t be keen to use it. Your design should offer a personal approach and enhance smooth navigation for women of different age groups and levels of tech-savviness. [Check how we approached a product design for a complex healthcare solution](/blog/ux-design-healthcare-medical-apps-case-study/).
    ![UX design best practices](../../static/images/femtech_ux_design.png "UX design best practices")
    ## Offline-first application \[examples] Depending on your FemTech solution, **implementing an offline mode might be necessary to enable users to take crucial actions within the app, even without internet access**. This feature is particularly important for apps designed to track vital signs, menstrual cycles, or breastfeeding experiences, ensuring accessibility even with unreliable internet connectivity. Additionally, for remote patient monitoring, offline mode allows for the tracking of vital signs with medical devices, with data synchronization with doctors as soon as internet access is restored. Offline mode can significantly enhance your solution, but it's important to first assess whether your product truly benefits from this feature. [Read more about offline-first applications](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/). ## Incorporate medical devices and wearables \[example] This includes the development of medical devices and diagnostics specifically designed for female anatomy or conditions. Examples include advanced mammography devices, pelvic floor exercisers, and devices for non-invasive gynecological treatments. [Glooma](https://glooma.pt/en) introduces SenseGlove, a breast self-examination device, enhances traditional breast exams by linking to a mobile app for reminders and recommendations​​.
    ![Glooma website](../../static/images/glooma.png "Glooma website")
    Source: [glooma.pt](https://glooma.pt/en) In many cases, telemedicine cannot exist without medical devices creating IoT systems that enable the tracking of patients’ vitals and allow physicians to monitor them in real-time. **One of the greatest tech challenges is integrating various devices with often different SDKs into one unified system**. To build truly unified system the best way is contact [IoT development company](/our-areas/iot-development/) that has experience in building IoT, especially for healthcare. ## Last but not least – change your mindset from client-centric to patient-centric In FemTech, it's crucial not to see your 'users' merely as clients. Instead, foster a mindset among your team and within yourself to treat 'users' as patients with specific issues and needs. Recognize them as females, mothers, sisters, daughters, wives, girlfriends, and more – but never just users or clients. ## The Bright Disputes Showcase *Published: 2024-03-26 | Author: krystian | Tags: blockchain* *Source: https://brightinventions.pl/blog/the-bright-disputes-showcase/index.md* **In the ever-evolving world of blockchain technology, decentralized applications (dApps) are making significant strides, particularly in legal agreements and dispute resolution. Among these innovations, Bright Disputes stands out as a transformative solution for conflict resolution on Substrate-based blockchains, leveraging the capabilities of smart contracts.**
    ![bright dispute](../../static/images/bright_dispute_cover_blog.png "bright dispute")
    ## Understanding Decentralized Applications (dApps) Decentralized applications, or dApps, are an integral part of the blockchain ecosystem, offering enhanced security, transparency, and user autonomy. Unlike traditional applications, dApps run on a peer-to-peer network of computers, making them immune to single points of failure and offering a new level of user trust and interaction. ## The Role of Bright Disputes in Blockchain Conflict Resolution Bright Dispute Showcase serves as a demonstration tool, designed to help users understand the intricacies of Bright Disputes. Utilizing a Command Line Interface (CLI), the application showcases the step-by-step process of a dispute resolution, from initiation to conclusion, using predefined user accounts. It illustrates the dispute resolution process: * Initiating a dispute involves specifying the defendant's public key and case details, followed by creating the dispute. * Users can observe the CLI commands used at each stage, enhancing their understanding of the application's functionality. * The process involves multiple stages, including defendant confirmation, jury selection, and voting phases. * Juror anonymity is maintained during voting, and private keys play a critical role in the process. * The resolution of the dispute occurs when a majority decision is reached, followed by the distribution of token deposits among the successful party's jurors and the judge. ## Navigating the Bright Disputes Showcase Interface This section delves into the various aspects of the application's interface, highlighting its user-friendly features and the seamless integration of key functionalities. The application interface consists of several views, the first of which is a list of disputes. On this page, users can view all created disputes, their statuses, the public keys of the authors, and the defendants. Users have the option to view details of each dispute or delete them. It's worth noting the dropdown in the top right corner, which allows for the selection of predefined users. Below the application logo, there's a counter of registered jurors, alongside buttons for registering and deregistering users from the jury pool. There is also a button for creating new disputes, leading to the creation form.
    ![bright dispute mockup](../../static/images/bright_dispute_mockup1.png "bright dispute mockup")
    The dispute creation form in the "Bright Dispute Showcase" is a straightforward interface featuring just three fields and a submit button. Users can conveniently select the defendant's public key from a list of predefined users.
    ![bright dispute mockup](../../static/images/bright_dispute_mockup2.png "bright dispute mockup")
    To view the details of a dispute, one must click the "show" button, which leads to the details page. Here, users can learn about the case descriptions of both parties - the owner and the defendant. In the center of the screen, there's information about the current state of the dispute and the next steps. At relevant stages of the trial, lists of jurors, blocked jurors, the judge, the voting round number, the status, and the verdict are available. The page features seven action buttons that become active depending on the user account context and the trial stage. All user accounts are clickable, facilitating switching between them. Icons next to user accounts, such as a thumbs-up (role acceptance) or a voting urn (cast vote), indicate completed actions. Hovering over an icon displays the status description. To return to the main page, simply click on the application logo.
    ![bright dispute mockup](../../static/images/bright_dispute_mockup3.png "bright dispute mockup")
    This comprehensive overview of the interface underlines the application's commitment to user-centric design and functionality. With its intuitive navigation, clear visual cues, the interface not only simplifies the process of dispute resolution but also enhances user engagement and understanding. ## Conclusions Bright Disputes marks a significant leap forward in blockchain-based dispute resolution. In this context, Bright Disputes Showcase serves an educational and demonstrative purpose, encouraging users to explore it. This feature is a valuable tool for understanding the detailed process of dispute resolution in the Bright Disputes program and for learning how to use its Command Line Interface (CLI). ## Securing Health Data: Best Practices for Building Trustworthy Healthcare Apps *Published: 2024-03-25 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/cyber-security-in-healthcare/index.md* **With this tutorial, you'll receive step-by-step instructions on how to conduct an internal security audit of your healthcare software, along with a list of dozens of tools to assist you in the process. Most of these tools offer free trials, allowing you to quickly test them and then decide if they're the right asset for your team.**
    ![security in healthcare](../../static/images/healthcare_security_cover.png "security in healthcare")
    Only [14% of patients](https://rockhealth.com/insights/the-new-era-of-consumer-engagement-insights-from-rock-healths-ninth-annual-consumer-adoption-survey/?mc_cid=1d086c1225&mc_eid=fbb3bdc963) want to share their health data with HealthTech companies, and their willingness fades year by year (in 2020 22% of patients opted for sharing their healthcare data).
    ![Rock Health](../../static/images/4-willing-to-share-all-entities.png "Rock Health")
    Source: \[Rock Health](https://rockhealth.com/insights/the-new-era-of-consumer-engagement-insights-from-rock-healths-ninth-annual-consumer-adoption-survey/?mc_cid=1d086c1225&mc_eid=fbb3bdc963)
    Can you blame patients? Just visit the TechCrunch healthcare section to see countless stories about data leaks, hacks, and more. Why should patients trust healthcare tech companies with their data? Unfortunately, even if you aim to implement top security practices, you are facing the same mistrust issues as part of the industry. So, how can you build trust among your users? Secure product is the right answer. Let’s discuss security measures you should incorporate in your HealthTech company.
    ![techcrunch](../../static/images/techcrunch_healthcare.png "techcrunch")
    Source: \[techcrunch.com](https://techcrunch.com/tag/healthcare/)
    ## Audit your software and start Secure Software Development Life Cycle You should implement dozens of security tactics that will audit your software internally and kick off your Secure Software Development Life Cycle (SSDLC).
    ![securing health data infographics](../../static/images/security_healthcare.jpg "securing health data infographics")
    ### Adhering to OWASP best practices The security bible for many is the set of security checklists OWASP provides. Begin by making sure your software team adheres to OWASP security resources. Methodically progress through every top OWASP checklist and verify with your software team that you have implemented these recommendations. 👉 [The list of OWASP resources](/blog/top-owasp-resources-to-follow/) ## Static Application Security Testing (SAST) Static Application Security Testing (SAST), using dedicated SAST tools, will scan your app's code and alert you to any vulnerabilities, such as SQL injections, outdated algorithms, or strings that could be potential passwords. 👉 [The list of SAST tools to consider](/blog/examples-of-sast-tools-for-app-security/). ## Dynamic Application Security Testing (DAST) DAST tools often provide the ability to proxy requests, record them, tamper with them, replay them, inject parameters, build a site map by crawling, and more. 👉 [The list of DAST tools to consider](/blog/examples-of-dast-tools-for-app-security/). ## Track dependencies Dependency tracking tools assist in identifying outdated or vulnerable dependencies in our code e.g. libraries, frameworks, plugins, or other software modules that a project relies on to function. Track dependencies tools support effective code modernization by automatically highlighting places that should be updated. 👉 [The list of dependency-tracking tools to consider](/blog/examples-of-dependency-tracking-tools-for-app-security/). ## Detect secret leaks Detecting secret leaks involves identifying instances where sensitive information, such as passwords, API keys, secret tokens, or private keys, have been unintentionally exposed in places they shouldn't be like public repositories, open documentation, or log files. There are tools and practices designed to prevent and detect these leaks. 👉 [The list of secret leaks detecting tools to consider](/blog/secret-leak-detection-tools-to-consider-for-your-app-security/). ## Infrastructure reconnaissance Infrastructure reconnaissance tools allow businesses to scan their infrastructure for vulnerabilities, including outdated software versions, open ports, and misconfigured security headers. 👉 [The list of infrastructure reconnaissance tools to consider](/blog/infrastructure-reconnaissance-tools-for-your-app-security). ## Adhere to local data protection laws Use GDPR & HIPPA-compliant software for medical data processing. By signing up for a cloud provider you might get access to HIPPA-compliant architecture to process medical data. It’s the fastest way to achieve HIPPA or GDPR compliance.

    As one can read on AWS website

    AWS enables covered entities and their business associates subject to the U.S. Health Insurance Portability and Accountability Act of 1996 (HIPAA) to use the secure AWS environment to process, maintain, and store protected health information.
    Source: https://aws.amazon.com/compliance/hipaa-compliance/
    What’s more, the cloud enables data backup and disaster recovery, ensuring that HealthTech organizations can quickly recover from data loss events and maintain continuity of care without the need for extensive on-site data storage facilities. ## Utilize managed identity services Cloud providers offer various tools to help you manage users' sensitive data securely. One such tool is AWS Cognito, designed to securely add user sign-up, sign-in, and access control to web and mobile applications. AWS Cognito encrypts user data, supports multi-factor authentication to add a level of security, and helps detect unusual sign-in activities. [Read more on AWS](https://docs.aws.amazon.com/cognito/latest/developerguide/managing-users.html). Naturally, you can create own customized solutions to manage user data; however, there is a higher risk of incorrect implementation, and you need to remember to update the software on your own. Don’t reinvent the wheel seems like a smarter approach in this case. Bright Inventions' team primarily works with AWS tools; therefore, we are showcasing examples from Amazon's suite of services. Although providers like Google Cloud or Microsoft Azure also offer tools designed to comply with major security standards and certifications. ## Maintain separation of concerts Don’t store sensitive data in one place. You make the work for attackers simpler. Each encrypted database should be stored in a different physical location provided by cloud providers. One database can store patients' private data (name, age, social security number, etc.), while another should store medical information. Therefore, the risk of leaking data from both databases is much lower. What’s more, keep your staging and production sites in separate networks with different authorization levels limiting the number of users gaining the access.

    How we introduced this tactic while building a mobile app for people with Parkinson’s

    Given its healthcare nature, the app stored sensitive medical data on patients’ health, including information on pain and tremors, as well as data on very specific side effects, such as sexual drive levels and gambling propensity. One of the security tactics we implemented was breaking down the encrypted database into two – each stored in a different AWS services’ physical location. The first database stored basic user data, such as name or email address. The second database kept sensitive medical information, including medication intake or physical symptoms and side effects. Through this decision, we minimized the chance that, in the event of a data breach, the attacking party would be able to access all the information. Therefore, even in the case of a data breach, the risk of matching symptoms to specific patients' names is low.
    Mateusz Klimczak, Partner & Head of Delivery at bright inventions
    ## Utilize LLM's securely LLMs are at the forefront of the AI revolution in healthcare. Discover what steps you need to take to ensure your LLM solution is secure and compliant with HIPAA or GDPR, in case you use OpenAI solutions. Good news! The OpenAI API is eligible for GDPR and HIPAA compliance under a few stipulations. Delve into [LLMs for healthcare](/blog/llms-healthcare-security/) in another blog post. ## What You Can’t See Still Hurts: Crafting Tech for Patients with Invisible Diseases *Published: 2024-03-21 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/technology-for-invisible-diseases/index.md* **Invisible diseases represent a vast group of patient disorders. Developing software for people suffering from them requires an extra empathetic approach to deliver a truly user-centric experience. Are you prepared to create a credible and trustworthy solution? Read our article to find out!**
    ![Tech for Patients with Invisible Diseases](../../static/images/invisible_diseases_blog.png "Tech for Patients with Invisible Diseases")
    **People with invisible diseases often navigate their lives, both private and professional, while managing their conditions**. These conditions are typically chronic, remaining with them for longer periods, even though their symptoms may not be visible to others. Invisible diseases include **mental health issues**, **neurodiverse conditions** like ADHD and autism, **chronic pain and fatigue conditions** such as fibromyalgia, as well as **autoimmune disorders** like multiple sclerosis (MS) and lupus. ## Patient-centric approach in healthcare software solutions Developing [HealthTech](/blog/ultimate-guide-to-healthtech/) solutions for patients with invisible diseases may require **additional effort to achieve a patient-centric/user-centric approach**. ### Throughout the process of understanding your users, it's essential to consider several factors: 1. **Your users may be very secretive about their disease.** Understanding the privacy concerns and stigma associated with invisible diseases is crucial in building trust and ensuring user comfort.

    Breaking down the encrypted database

    One of the security tactics we implemented was breaking down the encrypted database into two – each stored in a different AWS services’ physical location. The first database stored basic user data, such as name or email address. The second database kept sensitive medical information, including medication intake or physical symptoms and side effects. Through this decision, we minimized the chance that, in the event of a data breach, the attacking party would be able to access all the information. Therefore, even in the case of a data breach, the risk of matching symptoms to specific patients' names is low.
    Mateusz Klimczak, Partner & Head of Delivery at Bright Inventions
    Read more about building [an app for people with Parkinson’s](/projects/solution-for-parkinsons-patients/). 2. **People with invisible diseases may be distrustful, including towards technology.** Initially, they might approach your app with a degree of skepticism, making the onboarding process more critical than ever. Crafting an engaging, reassuring, and personalized onboarding experience is key to overcoming initial mistrust. Delve into building [empathic app onboarding](/blog/data-driven-development-femtech-app-onboarding/) with our other blog post. 3. **Despite users' skepticism, they might still turn to technology to help manage their disease.** This indicates a need for solutions that are not only secure but also intuitive and genuinely useful in navigating the complexities of their condition. One of the examples of software that needs to engage users with simple and empathic design is yet again a [solution for patients suffering from Parkinson’s](/projects/solution-for-parkinsons-patients/):

    Inclusive and empathic UX/UI design

    From the beginning, we understood that the key element of the solution must have been inclusive and empathic UX/UI design. The app had to be friendly in use for patients suffering from tremors or other movement disorders. Also, as the elderly constitute the majority of patients suffering from Parkinson’s, the challenge was to deliver a legible, highly intuitive interface that would minimize the chances of mistakes. If an accidental input were to take place, though, the interface also needed to allow the option to undo the action.
    Mateusz Klimczak, Partner & Head of Delivery at Bright Inventions
    4. **Some taboos might be a reality for people with particular health disorders.** Approaching sensitive topics with empathy and care can help in creating a solution that feels inclusive and supportive. Also, don’t be afraid to include a fun factor even in the most unconventional circumstances. ZOE app serves as a prime example of a healthcare solution that approaches taboos with humor for a meaningful cause. The creators of the ZOE app were not afraid to address bowel movements - a topic essential to every human being's health, yet rather avoided in conversation.
    ![ZOE](../../static/images/zoe.png "ZOE")
    ZOE with their outside-of-the-box messaging was able to convince 142,768 people in the United Kingdom to take part in the survey. Explore insightful results of the “[The Big Poo Review](https://zoe.com/learn/fascinating-insights-from-the-big-poo-review)”. 5. **Your users shouldn’t be your guinea pigs because they will quickly lose trust in your solution.** Implement tech trends with extra caution. A great example of this is introducing currently hot AI-based solutions.

    Approaching AI in mental health methodically

    Generative AI is something I am currently responsible for while working on a mental health care application. While developing a solution supporting people's mental well-being, we need to approach this methodically. The last thing we want is to launch an AI solution that ends up discouraging people who are seeking mental health support, for example, by being ununderstandable by a bot. That's why we are currently focusing on creating various proofs of concept to determine which areas of the application can truly be enhanced with AI. Before we even begin testing them with users, we need to identify clear signs of the value that AI can deliver. The AI-based solutions must be primarily trustworthy for our mental health app users.
    Sławek Kopaczewski, Fullstack Developer at Bright Inventions
    ## Examples of features to incorporate in applications for people with invisible diseases When developing applications for individuals with invisible diseases, it's essential to focus on features that address their unique needs while fostering engagement and support: ### Gamification and engaging features Introduce elements that motivate users to manage their disease daily. These could include reward systems, progress tracking, and interactive educational content. Explore our other blog post on [patient engagement solutions](/blog/delivering-patient-engagement-platform/).
    ![eHealth app mockup](../../static/images/ehealth_app_mockup.png "eHealth app mockup")
    ### Support group and community finder Help users connect with support groups or communities facing similar challenges. This feature can offer emotional support and practical advice, making users feel less isolated. ### Accessible information on clinical data and programs People with invisible diseases (especially chronically ill) often hold hope for new scientific discoveries that could improve or save their lives. However, access to clinical research data is usually restricted, and the material is often written in specialized language. Summarizing current medical progress in straightforward language can be a crucial feature, providing hope and information in an accessible format. ## Deliver empathetic solution Remember, what you can't see might still hurt. So, while delivering solutions for patients with invisible diseases, don't treat them merely as users, but as people who might have been waiting for years for aid that would support them at difficult times. You owe them an empathetic solution because your 'users' truly deserve it. ## Decades in Programming Guided by Intuition. Meet Tomasz *Published: 2024-03-19 | Author: tomasz-k | Tags: bright story* *Source: https://brightinventions.pl/blog/decades-in-programming-tomasz/index.md* **Dive into the career story of Tomasz, whose journey to programming began in the 80s. Find out what was the first programming language that Tomasz learned. Discover his Tech Lead approach and explore how his programming expertise crossed paths with… welding.**
    ![Tomasz's career story](../../static/images/brightstorytomaszkcollage.png "Tomasz's career story")
    ## Could you describe your journey into programming? It began a long time ago, **back in the 1980s**. At that time, **I only had access to 8-bit computers**. I highly enjoyed playing computer games then, but what intrigued me even more was understanding the mechanics behind them. This curiosity led me to **start programming, initially in BASIC**. However, I didn’t think at the time that it would become my future profession. I had many other interests, including radio. I was part of a radio club where we got to work with computers, which was a significant deal during the twilight of communism in Poland. The experience of working with hardware and electronics was truly captivating. In the 1990s, I worked as a graphic designer, creating posters and other printed materials. As the company I worked at began to expand its portfolio to include web development, I **seized the opportunity to learn Perl and PHP (version 2.0 at the time) as well as Linux**. That marked the start of my career in software development. ## What happened after that? After that I worked for a small software development company in Poznań, then, I entered a corporate phase, working for global enterprises. I **had an opportunity to spend a month in Silicon Valley, in a building that is now the headquarters of Facebook**. It was on the same campus where **I met legends like James Gosling**, the creator of Java. Back then, it was easy to bump into him in the cafeteria. Later I even got a chance to live in the U.S for 18 months as an Oracle employee. I worked at its American headquarters. Back then **I spent lots of time at Hacker Dojo – one of the most famous coworking spaces where numerous Silicon Valley unicorns were born**. Eventually, I left the corporate world but I still cooperated closely with enterprises as a business partner by **starting my company and employing a few people to digitize clients' processes**. One noteworthy project we undertook was the digitalization of welding processes. **We developed an IoT system that modernized welding operations for a chemical engineering company**. ## Welding and programming? How come? It might seem like an unlikely combination at first. Indeed, when we embarked on this project, my knowledge of welding was as basic as most people's. Welding, particularly for critical structures like ships, and fuel tanks demands extensive documentation due to the legal responsibilities shouldered by the individuals involved. **A mistake in the welding process can potentially compromise the integrity of a ship or a tank, posing a direct threat to lives**. **We developed software integrated with various devices and sensors to measure critical factors** such as temperature, ambient conditions, and weld intensity to **ensure the highest quality of welding**. This approach was significantly more efficient than the previously used ultrasonography for weld inspection. Thanks to the comprehensive data our system collected, **the welding team could definitively demonstrate compliance with all requirements**.
    ![ Wearing a welding helmet.](../../static/images/tomasz_welding.png " Wearing a welding helmet.")
    *
    Wearing a welding helmet.
    * Our role encompassed **integrating hardware** delivered by another company into our system, **developing the firmware, selecting appropriate sensors, and delivering software** that unified these components into a cohesive IoT solution. ## How did you learn the welding domain? It might surprise you that there are numerous types of welding, and **our solution was specifically tailored for Metal Inert Gas (MIG) welding**. I remember **diving into a thick book on the subject** to grasp the complexities involved. Apart from that, **I visited the client’s R&D center and had access to their experts at any moment**. Additionally, **I attended various conferences for the welding community**, where I met many individuals who were deeply passionate about welding. These enthusiasts could discuss the images of welds for hours. While every industry has its 'fanatics', encountering such dedicated people was genuinely intriguing. ## From the corporation world to a smaller company like Bright Inventions. How do you find yourself here? I appreciate the absence of a corporate vibe here. With around 80 people on board, the company is the perfect size for me – not too small, not too big. **Everyone possesses high-quality skills and expertise**. I love how **every team member feels responsible for their project and even for the whole company**. The atmosphere is something I truly enjoy. Although **I work mostly remotely from Poznań, whenever I attend team retreats in Gdańsk, I feel well taken care of by teammates** who always make me feel welcome.
    ![During a team retreat.](../../static/images/malgosia_team_retreat_forest.png "During a team retreat.")
    *
    During a team retreat.
    * ## Having spent decades in the IT industry, what experiences do you consider the most valuable? Every time I ventured into a new technology, it felt like encountering something magnificent; I definitely have relished the experience of discovering new tech. However, **the greatest experience by far was meeting diverse people and learning how to collaborate with them**.
    ![Quote](../../static/images/tomaszk_quote_people.png "Quote")
    Although I consider myself an introvert who masks it well, there was a point in my career when I became a team manager. Consequently, one of my responsibilities involved dealing with aspects of psychology in the workplace. Initially, **I made the mistake of trying to solve people's problems with my own prescriptions**. I attempted to offer advice based on my experiences, which was rather naive. At that time, I didn't understand much about human relations. **I thought that since I didn't have a particular problem, I could provide a magical recipe to solve others' issues**, believing my insights would make the world a better place. This approach was fundamentally flawed. I couldn't possibly understand other people's struggles thoroughly, and I definitely didn't have a monopoly solution to complex human issues. ## As a tech lead at Bright Inventions, what is the most important aspect of this role? I think that the ability to view the product from a distance and see the whole picture is invaluable. **I strive to consider both the domain and business perspectives, with a key focus on ensuring that the architecture evolves alongside the product**. This approach makes the software easier to maintain. Thus, the primary rule is to **avoid creating technological debt, paving the way for a smoother future product growth**. ## How to find the balance between tech ambitions and business requirements? I believe **I have an intuition that guides me in determining when to persuade a client to follow our recommended path, and when to step back**, recognizing that the client may lack the resources or willingness to proceed. It's crucial to choose our ‘battles’ wisely. **Given that our clients trust us, when we emphasize the necessity of certain implementations, they are likely to listen**. However, it's equally important to ensure that the development schedule is followed. This means that we must deliver value even if it occasionally requires postponing some code modernizations. **Clients are primarily focused on the product's growth rather than perfect code**. Therefore, addressing technical debt cannot always be our top priority.
    ![Quote](../../static/images/tomaszk_quote_perfect_code.png "Quote")
    ## How do you handle the diversity of opinion in the team in terms of choosing solution A or B? When it comes to choosing between solutions, we engage in debate. If I hold a particular view, I'll take a side. **I believe that to advocate for a solution, one must be able to convincingly explain its merits**; it's insufficient to prefer an option just because it's personally favored. The whole team must weigh the pros and cons together, presenting our arguments to reach a final decision. If we're uncertain about the best choice, we opt for the 'lesser evil'. **I find beauty in this process of argumentation, as every team member is encouraged to share their perspective**. ## What do you do after hours? First and foremost, I am a father to two daughters, and I dedicate most of my free time to them. Aside from family time, **I try to find moments for running, and I've recently delved into music production**. Specifically, **I'm exploring DAWless music creation**, which involves making electronic music without a computer, using synthesizers instead. In January, I made my stage debut, improvising live at a club in Poznań. While I'm quite new to this, it's incredibly thrilling.
    ![Right before the running race.](../../static/images/tomasz_running.png "Right before the running race.")
    *
    Right before the running race.
    * ## How to Build Patient Engagement Technology that Will Truly Engage Patients *Published: 2024-03-11 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/delivering-patient-engagement-platform/index.md* **The digital patient engagement market is growing rapidly, and its potential is even greater. However, this does not mean that any generic solution will succeed. Based on our experience in [healthcare software development](/our-areas/healthcare-software-development/), we have prepared a guide on how to build a successful patient engagement solution.**
    ![Patient engagement solution](../../static/images/phone_patient.png "Patient engagement solution")
    ## First, be empathic Don't scroll down, because you feel it's obvious. Is it, though? Do you treat your current or future app users merely as clients? This mindset might be suitable for retail, fintech, or other sectors, but not in digital health. HealthTech businesses must be strongly founded on a mission; otherwise, they probably won't survive. Your users aren't just users. They are real people with real-life struggles, often forced to manage chronic diseases all their lives. **If you don’t try to understand your users’ experience, you won’t build a product that will be appealing to them**. ## Start from workshops to scrutinize your idea and target groups You might have an idea for an eHealth solution, but that's not even the first step to succeeding in healthcare software development. You should attend **product discovery workshops that will help you understand your potential customers**. Learn more about [product discovery workshops](/our-areas/product-workshops/). ## Validate your idea and business approach with an MVP **A Minimum Viable Product (MVP) is the most efficient way to validate your idea**. In a cost-effective and timely manner, you can launch the first version of your product with key features to receive vital feedback from end-users. Before the launch, you should set up analytics metrics to measure your goals. Check out our MVP success metrics cheat sheet:
    ![MVP success metrics](../../static/images/mvp_success_metrics-cheat_sheet.png "MVP success metrics")
    If you want to delve into MVP development, we’ve got lots of other resources for you! ## Create simple design UX design is a crucial factor in ensuring a successful user experience for your solution. Depending on your end users, **you might need to design for older people less familiar with technology, who might be skeptical about your solution**. The design must immediately demonstrate value, enable smooth navigation, and manage the handling of vast amounts of information, which is often the case for eHealth apps. If you want to delve into product design, read more about [designing healthcare solutions](/blog/ux-design-healthcare-medical-apps-case-study/). ## Evaluate your app onboarding Most software solution faces a crucial challenge: designing the onboarding process to increase the number of registered and (already) engaged users. Our experience, especially in healthcare software development, suggests creating a longer onboarding process to demonstrate your commitment to users and tailor the app to their personal experiences. Examine the story of the [FemTech pregnant women engagement app](/blog/data-driven-development-femtech-app-onboarding/) whose shortened onboarding process led to a decrease in the number of completions. ## Implement gamification features Healthcare is not a joke, yet in many cases, you can turn health management into fun. Here are several examples of gamification features used in patient engagement platforms: * **Points System**: Patients earn points for completing health-related tasks, such as taking medication on time, logging daily activities, or completing a series of exercises. These points can track progress or be used to unlock rewards. * **Badges and Achievements**: Similar to points, badges are awarded for milestones or achievements, such as reaching a step goal, completing all daily tasks, or maintaining a streak of medication adherence. These badges serve as visual symbols of accomplishment. * **Progress Tracking and Visualization**: By visualizing progress through charts, graphs, or virtual journeys, users can see how far they've come and what goals they're approaching. This visual progress can be incredibly motivating. * **Challenges and Quests**: Setting up specific challenges or quests for users to complete can make the process of achieving health goals more engaging. Challenges could range from walking a certain number of steps in a day to completing a week's worth of healthy eating. * **Personalized Goals and Adaptation**: Some apps adapt to the user's behavior and performance, setting increasingly challenging but achievable goals based on their progress. This personalized approach keeps users engaged without overwhelming them. * **Reward Systems**: Incentives like discounts, gift cards, or tangible rewards for reaching health milestones or maintaining consistent use of the app. These rewards can significantly enhance user engagement and commitment to health goals. ## Use technologies that will support your growth The stack and technologies you choose, even at the MVP phase, might influence your product development for years to come. Here are examples of things to consider by CTO, Product Owner, or startup founder: * **Choosing between building mobile native applications or hybrid**: Delve into this choice in our other blog post regarding [native apps vs cross-platform](/blog/native-app-development-vs-cross-platform/). * **Implementing performance monitoring**: This type of monitoring becomes especially crucial during the scaling phase, where you want to monitor capacity, any feature blockages, etc. Only then can you foresee issues before they affect your users! * **Leveraging cloud computing for scalability**: Cloud computing offers cost-effective scaling of your product. Using providers like AWS also aids in adhering to HIPAA or GDPR, which is crucial for many healthcare solutions. ## Build credibility with the right software Trust is crucial in eHealth solutions, especially when we consider engagement software that can assist chronically ill patients throughout their lives. Therefore, when choosing an app that might be a crucial tool every day, they need to feel the product is credible. By implementing performance monitoring, as mentioned earlier, you can avoid large performance issues, thereby sparing users any frustrations. Yet, there are other technical steps to take to build credibility: * **Adhering to laws**: while storing medical data, you must follow top security standards to comply with HIPAA, GDPR, or other regional laws. Security standards aren't supposed to be followed just to comply with the law, but foremost to take care of users' data. Any data breach could be disastrous for your credibility, so always prioritize security. * **Code modernization**: don't let technological debt slow your growth. Especially during the scalability phase, dedicate some sprints to code modernization, updating libraries, and other activities that will improve your code and enhance security. * **Quality assurance**: There comes a time when a balanced number of manual and automated tests must support product development. This approach will reduce the number of issues in your product, leading to fewer instances of user dissatisfaction. ## Verify the best engagement channels Study shows that in-app messaging boasts a remarkable [75% open rate](https://reckless.agency/websites/email-vs-push-notifications-vs-in-app-messaging-which-has-the-highest-engagement-2/), significantly surpassing other communication methods and nearly tripling the effectiveness of push notifications. **While in-app messaging is highly effective at engaging active users within the app, enhancing their experience and encouraging specific actions, it's crucial not to overlook the importance of push notifications and traditional emails**. Push notifications and emails are especially valuable for re-engaging users, drawing them back into the app, and maintaining their engagement over time. Initially, **explore all potential engagement channels**, then use data-driven analysis to identify the most effective ones. Following this, you can optimize the frequency of notifications, emails, etc., based on insights from this data. All these activities should be supported by rigorous **A/B testing** – for example, sending variations of notification text or different email subject lines to distinct groups to analyze open rates. ## Example of patient engagement solution Read the story about crafting a personal [digital diary for patients suffering from Parkinson’s disease](/projects/solution-for-parkinsons-patients/). The app lets users record their symptoms and track the intake of prescribed drugs.
    ![app for patients with parkinson](../../static/images/app_for_parkinson_patients2.png "app for patients with parkinson")
    ## Why is digital engagement important The technological revolution in healthcare is built on several fundamental pillars, with both medical professionals and patients playing crucial roles. For it to be effective, both groups must actively participate. This is especially vital in the realm of chronic disease management where medics won't achieve anything without patients' engagement. Through technology, **patients are empowered to take control of their health. However, they must be willing to embrace the power that technology gives them**. Let’s build the technology that will be a patient engagement tool, not a burden! ## Temperament Insights for Effective Recruiting: What Recruiters Need to Know? *Published: 2024-03-08 | Author: sara-l | Tags: recruitment, bright insights* *Source: https://brightinventions.pl/blog/temperament-insights-for-effective-recruiting-what-recruiters-need-to-know/index.md* If you have ever asked yourself some of the following questions, I would like to share with you the possible answer for them.  * Why do some people like to work from the office and others from home? * Why will some employees care about fuckup or corrective (often called the negative) feedback and others won’t? * Why are only some able to immediately deal with a crisis situation? * Why are only some of us able to endure hardships and discomforts and are able to function well under high levels of stress? * Why do some employees like changing work environments, and others prefer stability and predictability? * How do individual preferences for receiving recognition and rewards impact job satisfaction and performance in the workplace? One of possible answers for these questions is - it all depends on individual differences in the area of temperament.
    ![people; diversity; team](../../static/images/temperament-blogpost-cover-photo.png "")
    ## **Temperament in the workplace dynamics** There are a few theories about temperament. Each of them touches similar features of human behavior. I would like to focus on one of the simplest in my opinion - The Regulative Theory of Temperament (RTT) made by Jan Strelau. According to [RTT](https://www.sciencedirect.com/science/article/abs/pii/019188699500159X), temperament is involved in regulating the relationship between humans and their outside world. That means that **temperament affects how someone understands and interprets things, how they react to various situations, plan their life, what decisions they make and how a person functions at work**. I believe that all of these areas in which temperament is involved are extremely interesting, but in this blogpost I would like to focus on the connection between temperament and work.  ## **What dimensions of temperament are distinguished in Strelau’s theory?**  The responses to the initial questions in the article point to various dimensions of temperament. According to RTT, we distinguish: * Sensory sensitivity - an ability to react to sensory stimuli of low stimulative value.  * Emotional reactivity - a tendency to react intensively to emotion-generating stimuli, expressed in high emotional sensitivity and in low emotional endurance. The emotional reactivity affects emotional resilience; behavior in difficult moments; effectiveness of actions taken during high stress; frequency of feeling emotional tension. * Endurance - an ability to react adequately in situations demanding long-lasting or high stimulative activity and under intensive external stimulation. * Activity - a tendency to undertake behavior of high stimulative value or to supply by means of behavior strong stimulation from the surroundings. * Briskness - a tendency to react quickly, to keep up a high tempo of performing activities, and to shift easily in response to changes in the surroundings from one behavior (reaction) to another. It influences the pace of response to stimuli; the pace at which activities are performed; the level of vigor. * Perseverance - a tendency to continue and to repeat behavior after cessation of stimuli (situations) evoking this behavior. It influences the approach to the events that affect us (low level causes a tendency to quickly forget decisions and experiences made and high level causes a tendency to analyze events and decisions already made in detail, as well as frequent return of thoughts to the past); focus on the loss (high level), or quick acceptance of the loss (low level); repetition of the same stress behavior.  We can interpret each of these components as a spectrum. They are related to each other and exert mutual influence. Each of them has an influence on our behavior. ## **Why are they so important?**  Because every role in a company is different. And we, as recruiters, should be able to find the match. **We should have a strong understanding and respect for people's capabilities**. We, as recruiters, often know the environment of the company, the specific tasks of the role, the difficulties that a new person will have to face, and also often we know other people from the team. A candidate has only a job offer, maybe a little more information from the recruiter, social media/website and their visions of the vacancy and company. So we, as recruiters, should be very attentive during the process, because from our conclusions comes the result of the process, which means - who we choose. We are more familiar with the company and the role than the candidate, so **we must be able to assess as accurately as possible whether the candidate will feel comfortable in that particular position**. For instance, can they handle the stress that is inherent in the role? Or will they become bored with the repetitiveness of tasks in that specific environment? It is our responsibility to investigate these aspects. The recruiter's responsibility in this context is twofold. On one hand, they are accountable for finding the best fit for a particular position, and on the other hand, they are responsible for ensuring that the organization and the position are suitable for the candidate. To prevent later disappointments on either side, beyond assessing the candidate's qualifications and approach, it's essential to consider that their temperament traits can influence both their job satisfaction and performance in a given role. **A stellar employee in one environment may struggle in a different setting**. Of course, we can also phrase it differently - **an excellent work environment for one employee may be a suboptimal one for another person.** ## **Is it possible to change our temperament?** Well, according to Strelau - yes. Temperament traits are relatively stable, but they can change. But, it is a long-term process because genes play a huge role here, as well as the years in which our environment has influenced our temperament. ### **Summary** During the recruitment process, the recruiter is responsible for the company's time and financial investment in the procedure, as well as the candidate's time and engagement. Therefore, let's not underestimate the significance of temperament in the recruitment process, as the awareness of temperament differences can only help us. ## The Power and Purpose of Team Building Initiatives *Published: 2024-03-07 | Author: agata-m | Tags: teamwork, bright insights* *Source: https://brightinventions.pl/blog/the-power-and-purpose-of-team-building-initiatives/index.md* Team building is a form of integration that provides team members with the opportunity to collaboratively perform various tasks. However, what matters in these activities is mutual cooperation, the possibility of discussion, overcoming challenges, and, above all, having fun together. Thanks to this, the team has a chance to get to know each other better, engage in conversations beyond the office environment, and build relationships. Teamwork is one of five core values at Bright Inventions. We constantly make sure that thanks to the team building events our team integrates, gets to know each other better and, as a result, works better together and copes with the minor and major problems that may arise in everyday work. It also helps us to be closer in remote work times. ## **Team building at Bright Inventions** The main glue that binds our team together are the integrations. Twice a year we organise core team building initiatives at Bright integrations (June and December), which always consist of two parts. The first part of team-building adventure is about facing different challenges together, and doing some group tasks. We are always randomly assigned to a group and can thus get to know people with whom we do not have the opportunity to work on a daily basis. It is a great opportunity to exchange ideas, experiences and support each other in carrying out tasks. And what are these tasks? Well, it varies:  * we sailed yachts and worked together to operate the yacht,
    ![Bright Yachts](../../static/images/rectangle-8-copy-8.png "")
    * we kayaked (in double kayaks, so we had to help each other ;)) or worked together on a dragon boat race,
    ![Bright Dragon Boat](../../static/images/rectangle-8-copy-7.png "")
    *  te took part in outdoor games - we were navigating some places on the map and solved,
    ![Bright Forest](../../static/images/rectangle-8-copy-6.png "")
    * we were on go-kart races,
    ![Bright Go-karts](../../static/images/rectangle-8-copy-5.png "")
    * and many more including some artistic workshops.
    ![Bright Art](../../static/images/rectangle-8-copy-4.png "")
    As you can see our values as teamwork and positive attitude are really close to us at integrations. :)\ \ After our team-building activities, we usually gather at a local restaurant to eat something delicious and have fun.  But it's not just about food. It's a time to relax, share laughter, and strengthen the bonds we've built throughout the day.
    ![Bright Team](../../static/images/rectangle-8-copy-3.png "")
    ## The unique brilliance of Bright Christmas One of the most anticipated meetings is always Bright Christmas. How does it differ from the rest? Of course, first we have the team-building part (this year we painted pictures together), then dinner and afterwards and afterwards we have an opportunity to reflect on the entire year. We even have a special team knowledge quiz and the awards for the most engaging blog post and the most popular post on our blog, determined by the number of views.
    ![Bright Christmas ](../../static/images/rectangle-8-copy-2.png "")
    ![Tomek, Iza and Ula - Bright Christmas](../../static/images/rectangle-8-copy.png "")
    In addition, people who have been with us for the magical two years also receive a gift, which is heavily personalised. :) With this, we want to emphasise our gratitude towards our teammates who try to create the Bright Team with us on a daily basis.
    ![Patryk - Bright Christmas](../../static/images/rectangle-8.png "")
    ## Project team building events What else besides the integrations of the whole team? Project outings, of course. :) Such an initiative also works and is popular with us. It's good to get out and chat with people from the F2F team especially in the age of remote working. Relationships are revived and strengthened and more than once we hear that it is more pleasant to work together afterwards. To sum up, fostering such integrative initiatives not only strengthens company culture and enhances team collaboration but also plays a pivotal role in boosting employee engagement. By facilitating open communication channels and fostering teamwork, these activities contribute significantly to the overall rising productivity and engagement. As a result, investing in such team-building events can yield substantial benefits for both the employees and the organisation as a whole, ultimately leading to a more motivated and cooperative team. ## Debugging production CDK Node.js app with AWS Fargate *Published: 2024-03-06 | Author: rafal h | Tags: ECS, AWS, Node.js, Debugging, Fargate* *Source: https://brightinventions.pl/blog/fargate-ecs-debug/index.md*
    ![ECS Node.js Fargate Debug created by Dalle3](../../static/images/fargate-debug.png "")
    **Recently my colleague wrote a blog post on how to create a [cheap Node.js Fargate service](/blog/aws-cdk-cheap-ecs-fargate/). Imagine that after some time of happy running, you investigate that something is not clearing memory or the task suddenly exits with an error. You analyze the log and metrics, but the issue seems to be deeper, and you have to get your hands dirty. For such cases, a great option to [debug](https://nodejs.org/en/learn/getting-started/debugging) the Node.js service is with inspector. In this tutorial I will show you how to utilize it with CDK deployed Node.js app on AWS Fargate using AWS ECS Exec and AWS SSM port forwarding.** ## Node.js debugging Node.js inspector [debugging](https://nodejs.org/en/learn/getting-started/debugging) with `--inspect` flag might show you potential problems with the event loop or where is the memory leak you are looking for. It personally helped me many times. If you are interested about the details and how to look for problems, you can see a great video of it in action with one of the [core contributors](https://www.youtube.com/watch?v=vkys6Wk-jYk&ab_channel=AdventuresinNodeland-MatteoCollina) of Node.js. ## Remote Node.js debugging Ok, so you are armored with cool knowledge about Node.js debugging now. You say, “Great! Let’s run inspector and check it out.” Not so fast—your service is running in a remote environment. It means that you somehow have to expose a remote debugger to your local inspector environment. Sometimes, it is not necessary as you might be able to spot the problem when running the process locally. But what if the problem only appears when some particular thing happens on a remote? Traditionally, you could just expose the inspected port via [SSH local forwarding](https://nodejs.org/en/learn/getting-started/debugging#enabling-remote-debugging-scenarios). But what if you are running Fargate and you are not able to SSH to underlying machine? Let’s find out! ## Checking if your task is eligible for ECS exec Ok, so your task is running. What shall you do next? You will use a combination of [AWS ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) and [AWS SSM port forwarding](https://aws.amazon.com/blogs/mt/use-port-forwarding-in-aws-systems-manager-session-manager-to-connect-to-remote-hosts/) to forward the debugger port to the local machine. AWS has an official [GitHub repo](https://github.com/aws-containers/amazon-ecs-exec-checker) with a script by which you can check if your task allows for AWS exec. Using the infrastructure described [before](/blog/aws-cdk-cheap-ecs-fargate/), you should configure AWS CLI and execute ```bash ./check-ecs-exec.sh cluster-id task-id ``` in our case ```bash ./check-ecs-exec.sh BrightCheapEcsFargateStack-ClusterEB0386A7-PQVGdDDGFxS4 70d6a6e5606b4cf5ad413821326bd765 ``` As per the output, task is missing some of the required things for exec execution: ```bash Exec Enabled for Task | NO ``` ```bash Task Role Permissions ssmmessages:CreateControlChannel: implicitDeny ssmmessages:CreateDataChannel: implicitDeny ssmmessages:OpenControlChannel: implicitDeny ssmmessages:OpenDataChannel: implicitDeny ``` [The Readme](https://github.com/aws-containers/amazon-ecs-exec-checker) of the project provides directions on how to fix the potential issues you might have. It might be connected either to your IAM user, ECS task role permissions, or configuration. For the [repo](https://github.com/bright/bright-cheap-ecs-fargate-https) you are using, the only two things that you needed to add are: ```typescript enableExecuteCommand: true ``` to `FargateService` in CDK definition and changing container command to expose debugger ```typescript command: ['npx', '--node-options=--inspect', 'http-server'] ``` Upon CDK deployment you will see that required `ssmmessages` permissions are added automatically. When you will rerun the [script](https://github.com/aws-containers/amazon-ecs-exec-checker) I will see that all controls are green or yellow. That means that we can connect to our task using AWS exec! ## Connecting to Fargate ECS task To do it, you need to know `cluster-name`, `task-id` and `runtime-id` of the task first. You can get those by running ``` bash aws ecs describe-tasks \ --cluster cluster-id \ --task task-id ``` in our case ``` bash aws ecs describe-tasks \ --cluster BrightCheapEcsFargateStack-ClusterEB0386A7-PQVGdDDGFxS4 \ --task 70d6a6e5606b4cf5ad413821326bd765 ``` Runtime ID in above case is `70d6a6e5606b4cf5ad413821326bd765-2750272591` so we can run the following: ```bash aws ssm start-session \ --target ecs:BrightCheapEcsFargateStack-ClusterEB0386A7-PQVGdDDGFxS4_70d6a6e5606b4cf5ad413821326bd765_70d6a6e5606b4cf5ad413821326bd765-2750272591 \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["9229"], "localPortNumber":["9229"]}' ``` Where target is a string that consists of `ecs:__`. Port `9229` is the default port for Node.js inspector. If all is ok, as a response you will get ```bash Starting session with SessionId: rafal.hofman@brightinventions.pl-06148b47c2f094b19 Port 9229 opened for sessionId rafal.hofman@brightinventions.pl-06148b47c2f094b19. Waiting for connections... Connection accepted for the session [rafal.hofman@brightinventions.pl-06148b47c2f094b19] ``` ## Running local inspector with remote ECS target After the successful connection you can go to inspector in Chrome browser (chrome://inspect). You can see there the remote target connection you just enabled, forwarded to your local port of 9229
    ![Remote target port forwarding](../../static/images/fargate-debug-2.png "")
    Upon connection, you can see logs from the Node.js process and can go ahead with debugging.
    ![Logs of service](../../static/images/fargate-debug-3.png "")
    ![Heap dump of the process](../../static/images/fargate-debug-4.png "")
    As you can see, the process is pretty straightforward. You do not have to expose your `--inspect` process port publicly, but can safely use AWS SSM port forwarding. What is important, the task can have a private IP, and you can still access it! If needed, you can also use AWS exec to bin/bash to the container. Remember to remove enableExecuteCommand when you are done. Happy coding & debugging! ## 7 Ways to Improve Website Messaging for Healthcare Tech Companies *Published: 2024-03-04 | Author: blazej-d | Tags: HealthTech* *Source: https://brightinventions.pl/blog/how-to-improve-your-website-messaging/index.md* **In this article you'll find the best advice on boosting your HealthTech Startups marketing stats.** And you implement it instantly without a budget.
    ![website](../../static/images/website_messaging.png "website")
    In the last 3 months I was exploring the [healthcare software development](/our-areas/healthcare-software-development/) landscape. Searching for ones worth mentioning and trying to gather statistics and market research for improving our messaging and hoping to find clients of course. My first point of contact was always the website, as it normally is these days. One element that stood out is that out of more than 300 pages I analyzed only 15-20% offered messaging that made me understand what the company actually does. Most of the times it took me a minimum of 5 minutes to fill in the excel column titled “solution summary”.  Of course I eventually was able to make conclusions about the solution but I had to, your clients or investors won’t. Like it or not we have the attention span of a goldfish when it comes to internet surfing and if you make clients search for the information most of them will just exit the website. The best you can do with your website is be precise and answer 2 most basic questions: * **What is the solution you are offering** * **What outcome it provides** Healthcare technology is a peculiar segment of business. Here more than anywhere else the focus should be on your users/patients, therefore empathy is truly a skill. So lead with empathy at every step of your journey. Here is what you can do to improve your website messaging and help users understand how you can help them. ## **\#1 Understand your segment and audience** Define who you are messaging to and what pains and gains you want to address. Work on your buyer personas and ideal customer profile. ## **\#2 Stand out by being concise and easy to understand - Michael Seibel, Y-combinator** There really is no value in using fancy and flamboyant wording in your messaging. If you are a startup, clear messaging is much more valuable than fancy copywriting. Fancy copywriting often leads to messaging debt. ## **\#3 Keep a simple website structure** Choose a messaging strategy: brand + product + use case. Lead with a HERO section, then define the problem, next show the solution and present the added value. ## **\#4 Understand your segment and position in it** Leading with the outcome is often treated as an industry standard adapted from B2C. But that is not always the case, especially in B2B and brands just trying to break through. 

    Selling with benefits not the features is a good strategy when everybody knows what the product is.
    Anthony Pierry
    THIS IS THE PRODUCT     vs     THIS IS THE OUTCOME This is the outcome           This is the product ## **\#5 Never let the competition choose the battle site** – **Gen G. Patton** There are 4 areas you can fight in: 1. Price (example in tip #7) 2. Quality/better product 3. Distribution channels 4. Identifying a underserved segment ## **\#6 Be humble** Position yourself for the next 6 months, not years. When you are a startup pitching your vision is a bad strategy. ![](https://lh7-us.googleusercontent.com/jUCqq0MwxDzJnyNnNalNRI5IBuaRvJOw8U5eHBDE4RAlwup2BITfxnugmPD3Mn2P1L3KtJiJEz3AiVGyze9t8TqkbkEboUYvgGrc219hmz83RNg0rSa9sp57YCFJlNqt3UtERPlQcwfWsJjkOUekgAc) ## **\#7 Your messaging affects your positioning** – **Artem Chetverikov**  Gong vs Fireflies  ![](https://lh7-us.googleusercontent.com/ZFLswODngIk4JNXDwheTJVygjFiICNFGSbtTJ7X9IHaV0QHaHsjhGxHPs4Sdr-3U8_eu1pIb3YyoJn3bLWSM8wIwkBA6WHCpHIoPD4SqVDwTkIaQ_bh0JKNsqMlkemcGwi53wypyBYlu3UJ7L39BGc0)![](https://lh7-us.googleusercontent.com/7EyUpoHpCYwEWQjOGP5RjdGRATb3t2fMIPjb0Gjs9w63Vtr8O9HrwxBXxMeMtJMCTaO3-Sm6UvSQt5cq2LA_FFabW10bSMhUk4uEi_PqnV778SaUCOPQrD669RZP9MVlffq4Va3iHepp3xn_s_46xH0) Gong = video recording + transcription + calendar integration + repository + AI prompts = $1,400 per seat. Fireflies = video recording + transcription + calendar integration + repository + AI prompts = $228 per seat Position for the audience with the biggest budget and the most effective use case. A Hospital or enterprise buyer, focused on statistics and operating in high volume budgets will be in the position to spend $1,500 per user, whereas a small clinic trying to improve efficiency will not. Remember we are always happy to help you out, even via free consultation. The only think you have to do is [say "hello" first](/start-project/). ## HIPAA Compliant LLM for Healthcare: Is It Secure? *Published: 2024-02-29 | Author: rafal h | Tags: HealthTech, AI* *Source: https://brightinventions.pl/blog/llms-healthcare-security/index.md* **LLMs are at the forefront of the AI revolution in healthcare. However, there are ongoing concerns about the security of medical data used to generate content with LLMs. Discover what steps you need to take to ensure your HIPAA compliant LLM solution is secure and compliant with GDPR, especially if you use OpenAI solutions.**
    ![LLMs healthcare](../../static/images/llms_healthcare.png "LLMs healthcare")
    ## What are LLMs? Large Language Models (LLMs) are a type of artificial intelligence model designed to understand, generate, and interact with human language at a large scale. LLMs are trained on vast amounts of text data, enabling them to learn language patterns, grammar, facts about the world, and even writing styles. This training allows them to perform a wide range of language-based tasks including text generation, translation, summarization, question answering, and conversation. ## **How can LLMs be used in healthcare (a use case)** [Viz.ai](https://www.viz.ai/) uses LLM to support medics in faster diagnostics. Their AI-powered care coordination solution leverages advanced, FDA-cleared algorithms to analyze medical imaging data, including CT scans, EKGs, echocardiograms and more, providing real-time insights and automated assessments to accelerate diagnosis and treatment.
    ![viz.ai](../../static/images/viz_ai.png "viz.ai")
    Source: Viz.ai webpage ## Securing medical data when using LLMs (**HIPAA** compliant LLM) Is using one of the most popular LLM providers – OpenAI – secure? You should always consult with a legal professional since every situation is unique. However, generally speaking, OpenAI API is eligible for GDPR and offers **HIPAA compliant LLM**. What does this actually mean? You can use OpenAI to build LLMs that learn from medical data. However, you need to be aware of the following aspects: ### How to prevent training from your data If you decide to use Chat GPT offering, you have to use business products offered by OpenAI such as ChatGPT Team or ChatGPT Enterprise because only these plans ensure no training from your data. So obviously a free version of ChatGPT is not an option. To be HIPPA eligible you need to use API to ask for zero data retention. ### 30 days data retention OpenAI may retain API inputs and outputs for up to 30 days. After 30 days, API inputs and outputs are removed from their systems, unless the OpenAI is legally required to retain them. ### Zero data retentions (ZDR) are eligible for some endpoints You can chat with support to enable ZDR in eligible endpoints. [The list of endpoints is accessible on the OpenAI page](https://platform.openai.com/docs/models/how-we-use-your-data). ### ZDR doesn't refer to images It’s important to know that only text data are GDPR and HIPAA-compliant. Avoid importing scans, or images because OpenAI can store them. ### Business Associate Agreement (BAA) [OpenAI enables the signing of Business Associate Agreements (BAA)](https://help.openai.com/en/articles/8660679-how-can-i-get-a-business-associate-agreement-baa-with-openai) in support of customers’ compliance with HIPAA. Keep in mind that only endpoints that are eligible for zero retention are covered by the BAA. If you want to delve into the OpenAI privacy policy, read the article that will navigate you through the [OpenAI ChatGPT Team & Enterprise privacy terms](https://brightinventions.pl/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/). ## 5 Things that Distinguish Healthcare Software Development *Published: 2021-08-09 | Author: izabela | Tags: HealthTech* *Source: https://brightinventions.pl/blog/5-things-that-distinguish-health-app-development-from-others/index.md* **What makes [healthcare software development ](/our-areas/healthcare-software-development/)special? Find out 5 unique factors of HealthTech.** ## What are healthcare applications? Health apps are a part of digital healthcare transformation that affects the future of global healthcare. **Health apps support patients and medical staff in managing their daily duties and tasks.** They often help patients manage their chronic disease and support nurses and doctors in their daily work. They are important tools which can really facilitate people’s life and health habits, but we have to keep in mind that compared to medical apps they don’t **have an ability to directly influence the patient’s medical state**. ![healthcare app](../../static/images/healthcare_in_post5.png) ## Healthcare and medical apps – understanding the difference Although this article focuses on healthcare apps, we should establish the main differences between healthcare and medical apps. Healthcare and medical software both support the well-being of the patient and the efficiency of medical workers. However, **medical apps have a bigger influence on patients’ state or life** in some cases. A great example may be medical apps that manage the heart pacemakers. Any problem with the software may directly affect the user’s / patient’s life. That is why, **medical apps have to be certified and approved by the national authorities**. ## 5 factors that make healthcare app development unique Although – compared to medical software development – the pressure is lower, healthcare startups still have to take these factors into consideration: ### 1. App security ‘Hold on! Security is important in every case’, some would say. And that’s true. However, the consequences of the data breach of a health app that stores medical information are often bigger. In terms of health apps, **security bugs can result in leaking fragile information regarding the state of patients, their health history or taken medicine**. The stake is simply higher than when it comes to, for example, developing apps that help you find the right restaurant. ### 2. Offline mode If you think that offline mode is so not 2023, then you may be surprised. Health apps need to be treated a little bit differently. For example, when you plan to build an app for hospital doctors which shows the medical history of their patients, you need to make sure that they have access to the data at every time in every possible place around the whole hospital. **Doctors cannot risk the patients’ safety using an app that wouldn’t operate without the internet**. The data has to be synchronised as soon as users have an internet connection. **Apps with offline mode are often referred as [offline-first applications](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/) – click to read another blog pst about them.** ### 3. Greater risk behind every update Every change in production is a challenge and comes with a risk of how it affects users. In terms of healthcare app development, it is again more complex. **Any software update cannot negatively affect the app functionality because we are talking about the software that provides a medical history of patience**. Doctors need to have access to this data all the time. ### 4. More pressure on code review Again, code reviewing is important for every app development. However, when it comes to health solutions the stake is often higher. That is why **the members of any [healthcare software development team](/blog/how-to-develop-a-healthcare-app-startup-owner-perspective) are usually experienced developers** who know how to test their code and understand the importance of code reviewing. Also, the development team **should include QA engineers**. ### 5. It’s not about beauty here Health apps should be simple for users. Although simplicity is definitely a trend in product design during health app development it should be taken even into the next level. **When you create an app that is supposed to check a patient's blood pressure, your product should be simple**. In contrast to entertaining or lifestyle apps you don’t need many fancy designs that attract users. An app for blood pressure checking has to eliminate every distraction even if it means that it is not very attractive for the human eye. **Read our another blog post if want to explore the topic of [UX design for healthcare and medical apps](/blog/ux-design-healthcare-medical-apps-case-study/).** ## How to Build Own Knowledge Base GPT Assistant in 5 Minutes *Published: 2024-02-22 | Author: rafal h | Tags: AI, OpenAI, GPT, Assistant, RAG* *Source: https://brightinventions.pl/blog/how-to-build-gpt-assistant/index.md*
    ![GPT assistant](../../static/images/GPT_assistant.png "")
    **UPDATE 🔈 Recently OpenAI has introduced v2 Beta updates. Go to a brand new tutorial to [learn how to use OpenAI Assistant v2 API to build your own knowledge base chatbot in 5 min](/blog/how-to-build-gpt-assistant-v2/).** **Imagine you want to create a bot with an internal company wiki or bot that will help your customers navigate via your page. Traditionally, you could do it with the [RAG approach](/blog/build-llm-application-with-rag-langchain/). Since last 4 months, you have the option to create a custom GPT if you are a GPT Plus subscriber. The problem with this approach is that the bot is only accessible to other Plus subscribers. Additionally, you are bound to Chat GPT data privacy which I was writing in [this](/blog/openai-chatgpt-free-plus-privacy-policies-explained/) post. I will show you how to use API and create your own GPT Assistant. Firstly, you will not be limited to Plus GPT subscribers. Secondly, you will most likely have better out-of-the-box data control via API than the ChatGPT interface.** ## What is a GPT assistant? [GPT assistant API](https://platform.openai.com/docs/assistants/overview) was introduced at [OpenAI Dev Day](https://devday.openai.com/). Instead of just using chat completions OpenAI allows you to enable code interpreter (which is executing Python snippets) and uploading of external knowledge which is used by it. ## Is GPT assistant for me? As you will see, GPT assistants allow low-barrier entry to chat with own knowledge. Normally, due to the context window limit, you would need to create embeddings and use vector database and RAG in general. Your use case might not require zero data retention which is super specific (I was writing about it in the [post](/blog/openai-api-privacy-policies-explained/)), so GPT assistant might be good enough for you, especially to test some PoC and save time. Note: Assitant API is still in [BETA](https://community.openai.com/t/assistants-api-token-usage-and-pricing-breakdown-clarification/508410/10), meaning that it might cost some money and be less performant than classic RAG approach. I suggest using API with `GPT-3.5-turbo-0125` model which is the newest and cheapest from OpenAI offerings. What we get in exchange is a very quick time to market value. So bear this in mind for your use case! So, is Assistant API for you? As always, it depends and you are the one to decide. ## How to create an assistant? You have to create an OpenAI account and load it up with resources. When you do head over to the [assistant tab](https://platform.openai.com/assistants). Click on the `Create` button. Following side menu will open:
    ![Own assistant menu](../../static/images/how-to-build-gpt-assistant/own_knowledge_chatbot.png "")
    First, enter the name of your assistant. Then you proceed with instructions from the assistant. Next, you select the model. Select it depending on your use case and the ratio of how “intelligent” the bot should be to the number of queries it will do (knowledge size, potential users count etc). I suggest going with `GPT-3.5-turbo-0125` at the beginning. In the retrieval part of the menu add files that will be your external knowledge fed into the chatbot. For the limits of the file, on the OpenAI page, we can read that:

    You can attach a maximum of 20 files per Assistant, and they can be at most 512 MB each. The size of all the files uploaded by your organization should not exceed 100 GB. You can request an increase in this storage limit using our help center. In addition to the 512 MB file size limit, each file can only contain 2,000,000 tokens. Assistant or Message creation will fail if any attached files exceed the token limit.
    [OpenAI docs](https://platform.openai.com/docs/assistants/how-it-works/creating-assistants)
    [On supported files page](https://platform.openai.com/docs/assistants/tools/supported-files) you can find what file extensions are supported. For the pricing of the assistant you can read more [on pricing page](https://openai.com/pricing). If you are interested what is happening under the hood, you can read up [community discussion](https://community.openai.com/t/where-does-gpt-assistant-store-the-embeddings/506167) how and where embedings are stored. ## GPT assistant use case As a use case, I will be using our Bright Inventions web page data as knowledge for our chatbot. For the sake of example, I will create `Bright assistant` - helpful bot for employees to gather more information about the company so they will not need to scan the whole webpage. Use cases may be unlimited though - you can, for example, create chatbot for potential customers to streamline their process of verifying the company’s experience and portfolio. You can also create customer support chatbot for your page and feed in company faq knowledge. The site is hosted on [GitHub](https://github.com/bright/new-www) and knowledge that is interesting for me is located within markdown [files](https://github.com/bright/new-www/tree/gatsby/content/our-areas). By using file manipulations, I created one file that consists of `our-areas.txt` and `our_projects.txt`. `our-areas.txt` is collection of all markdown posts from [our-areas folder](https://github.com/bright/new-www/tree/gatsby/content/our-areas). `our_projects.txt` is txt file containing all merged markdown files from [projects folder](https://github.com/bright/new-www/tree/gatsby/content/projects). I loaded them up to my assistant. I added instructions for the bot how it should behave, what knowledge was fed to him, and how the files are structured inside. Next up, I selected `gpt-3.5-turbo-0125` model to have good balance between accuracy and costs.
    ![Own assistant menu](../../static/images/how-to-build-gpt-assistant/bright_assistant.png "")
    When I created my assistant I started to test it via the playground by asking knowledge available from data:
    ![Own assistant menu](../../static/images/how-to-build-gpt-assistant/chatbot.png "")
    As you can see, if your knowledge database is big, building chatbots for your company to access them is a good idea. It might limit the time needed for the newcomers or potential customers to get some information. What is important to note is that one should place only public, non-critical information in the bot. There are ways you can force unprotected assistants to return files/information it has access to. When you will create assistant you can easily connect it to your Slack (via for example no-code [Zapier](https://zapier.com/)) or create external chat bot project (like [Open-Custom-GPT](https://github.com/SamurAIGPT/Open-Custom-GPT)). OpenAI is making easiear and easier every day to disrupt the market with AI. Publishing Assistant API is a good example of that. Hope you will find it useful for your use case! ## From Dreaming of Firefighting to Extinguishing Software Fires. Meet Sławek *Published: 2024-02-20 | Author: slawek | Tags: bright story* *Source: https://brightinventions.pl/blog/dreaming-of-firefighting-extinguishing-software-fires/index.md* **For all his adolescence, Sławek wanted to be a firefighter. One unfortunate exam day changed his life and steered him towards software development. Now, Sławek is an experienced fullstack developer who embraces numerous changes faced daily at work.**
    ![Fullstack developer carer story](../../static/images/brightstoryslawek_grid.png "Fullstack developer carer story")
    Source: private archive and [Lotto Triathlon Energy Gniewino 2023 by Gdyński Fotograf](https://www.facebook.com/media/set/?vanity=100094453642738&set=a.126192140539240) ## Why did you want to become a programmer? It might come as a surprise to you, but it was never a dream of mine. Throughout my life, **I aspired to be a firefighter**. Every choice I made regarding my education, and even how I spent my free time (such as joining a youth firefighter team), was aimed at gaining admission to the State Fire Service College. After completing the Polish Matura exam (the final high school exam), I took the entrance exams for the firefighting college. A deep understanding of mathematics, physics, and chemistry is required, along with physical fitness. Unfortunately, **I didn’t get in because my physical fitness level wasn't up to par on the day of the exam**. Receiving these unexpected results left me with just a few days to decide on my next steps. If I wanted to pursue higher education elsewhere, I needed to apply quickly. **Since I had always enjoyed physics and math, I decided to study Computer Science**. ## Are you still considering a career as a firefighter? I thought about it a lot during my first years as a programmer. Now, **this thought crosses my mind from time to time**, but I don't believe it will ever happen. ## Tell us about your recruitment journey to Bright Inventions. I heard it was quite a bumpy road. 😉 I remember visiting the Bright Inventions website and instantly feeling a strong desire to be part of the team. I had a tough technical interview with Piotr, followed by another with Ula focusing on my soft skills and English proficiency. **The feedback, after the interview, was that my technical and soft skills were satisfactory, but I needed to work on my English**. **Accepting this challenge, I immediately signed up for English classes** and attended them three times a week. To my surprise, **Ula didn't forget about me; she reached out after 6 months** to ask if I wanted to redo the interview. This time, my interaction was solely with Ula, concentrating on my English skills. **Finally, I managed to join Bright Inventions**. ## Are you excited about the AI revolution? For sure, Generative AI is something I am currently responsible for in the project I'm working on. We develop a mental health care application, so we need to approach this methodically. **The last thing we want is to launch an AI solution that ends up discouraging people who are seeking mental health support**, for example, by being ununderstandable by a bot.
    ![Quote about AI](../../static/images/slawek_quote_ai.png "Quote about AI")
    That's why we are currently focusing on creating various proofs of concept to determine which areas of the application can truly be enhanced with AI. Before we even begin testing them with users, **we need to identify clear signs of the value that AI can deliver**. The AI-based solutions must be primarily trustworthy for our mental health app users. ## How important is communication with business at your work? While working with a startup communication with the business side is crucial. Before I joined Bright Inventions, I had a completely different mindset. Here, I learned that **not every problem should be solved with code. The best code is the one that was never written because you don't have to maintain it**. I think every developer is an advisor as well. Business representatives often seek support from developers; they want to know if they should invest in a particular feature. They don't just expect you to code; **they need your guidance on how to allocate funds in product development, so it won't be wasted**.
    ![Quote about code](../../static/images/slawek_quote_code.png "Quote about code")
    When you work with startups, you also need to understand that things change fast. **You shouldn't build a strong attachment to your code**. The feature you are working on might be canceled before you even launch it in production. ## You seem cool about it. Have you always embraced the change? Not at all. It was a long road for me, working with a startup was a crucial step. At Bright Inventions, **we focus more on finding solutions to solve our client’s problems rather than on the code or technology we use**. Obviously, you need experience to build that mindset and to be able to advise your clients. ## What is your main advice on how to understand clients’ expectations? My main advice is to **ask clients as many questions as needed**. It often turns out that through the course of questioning, the client gains a better understanding of what they truly need. Together, we can then decide if an idea is worth developing at this very early stage, potentially saving a significant amount of budget. ## Having been on the same project at Bright Inventions for over three years, what keeps your interest alive and how do you stay motivated? Working with startups brings a lot of challenges; **I never do the same thing every day**. Now, I get to work with AI, which offers the opportunity to delve into new areas of software development. In a startup, every day can present a different 'fire to put out.' And I don’t mean a massive bug on production. **It often involves a spontaneous idea that we need to implement right now**. So, there's no space to be bored here. ## You’ve been a part of Bright Inventions for over 3 years. What do you like about the company? I appreciate that, despite working remotely, the atmosphere at the company is very friendly and welcoming. The managers are highly accessible, allowing me to ask questions at any time, and any problems are resolved promptly. **I also value transparency and the absence of workplace politics**. We focus solely on our tasks and project challenges, with no toxic mind games. What’s great about Bright Inventions is **the emphasis on knowledge sharing**. Even when we are very busy, we always find time to meet and discuss technological novelties and share new learnings. ## What do you do after hours? I've always led an active lifestyle. **Upon joining Bright Inventions, I participated in company workouts led by the pro triathlete Bartosz Banach**. He, along with Michał, inspired me to take up triathlon, and I quickly became fascinated with it. So, usually, I start my day with a workout, then work, and after work, I take a nap and have another workout. That's about 10 to 12 workouts a week.
    ![Duathlon](../../static/images/duatlon.png "Duathlon")
    Source: [Duathlon Szczecinek / Szczecinecka 5-tka](https://www.facebook.com/photo/?fbid=191659660288084&set=pcb.191661143621269) ## Biking, swimming, or running – which one is closest to your heart? It used to be biking, but now I’d say biking and swimming are at the same level. 🙂 Multiple injuries have recently stopped me from reaching my goals. **Hopefully, this year I will spread my wings**. ## The Intriguing Tale of Decorte Future Industries | HealthTech story *Published: 2024-02-14 | Author: blazej-d | Tags: HealthTech* *Source: https://brightinventions.pl/blog/the-intriguing-tale-of-decorte-future-industries/index.md* **From the sewing rooms of fashion to the corridors of healthcare. A story of data-driven pivots.**
    ![pivot](../../static/images/pivot_healthcare_blog.png "pivot")
    As a project analyst, I've borne witness to numerous pivots firsthand. In my early days in software, I often grappled with self-doubt when confronted with the necessity to pivot alongside startup visionaries. Questions plagued my mind: "Am I faltering in my analyses? Am I doing a good job?" However, as my experience grew, with each pivot encountered, I gleaned a profound insight: the ability to discern the need for a pivot is not a mark of failure, but rather a testament to adaptability and foresight. Consider the story of YouTube, a digital behemoth. The brainchild of Chad Hurley, Steve Chen, and Jawed Karim started as a dating website, and just like many startups, things didn't go very well for them. The small user base that the service had initially became even smaller, and they started uploading videos that didn't match the actual context of the website. This is when Karim and other founders realized that the online service wasn't utilized to its maximum potential;  “YouTube could be something more rather than just a dating website.” The idea behind the pivot from a dating site to a generic video provider has a rather amusing origin as well. Back in 2004, the video streaming options available to the users weren't any good. Karim couldn't find the infamous video of Janet Jackson's wardrobe malfunction from the Super Bowl anywhere online or any footage from the 2004 Indian Ocean tsunami. That is the origin story of YouTube, as we know it today. I could go on listing countless similar stories like that: Android, Flickr, Shopify, Slack... But none of them would even come close to the dynamics behind the story of Deorte Future Industries led by an exciting Young entrepreneur - Dr Roeland P.-J. E. Decorte ![](https://lh7-us.googleusercontent.com/fY2FgX3kk2OTi9NZE3hb2jHDuFsAv8MUZ_v2UPLkLw6mQePzQCzMMVgk4et3EsLCFl-GiucfbrsMnj8_I1INbs_t9ohIG9AJA-yFFl1f_X7zBmxhMPp29LtrZHVwhLub2NCKbjr4Kil7dWy3xTtIxpg) ## EVERY GOOD STORY NEEDS A HERO The story of Dr Decorte is an uncanny mix of data and intuition. His persona is one of those founders who from the very beginning seem to be tailor-made for the challenge. An ambassador who makes you feel welcome in his presence with a talent for public speaking and visible charisma. Features that make him a perfect Evangelist for any idea and a perfect salesman. These features play a crucial role in what’s to come.  Our rendezvous with Dr. Decorte traces back to a BBC documentary from 2019. A Cambridge student at the time, he endeavored to tackle the scourge of textile waste through groundbreaking technological innovations facilitating adaptive clothing. In a scene immortalized within the documentary, Dr. Decorte pitches his vision to the discerning members of Cambridge Business Angels, with Peter Cowley's sage query echoing resoundingly “Is there something investible there?  Certainly, the people are, but is there a business in this investment?” Fast forward to 2024, and Decorte Future Industries has created an AI-powered engine extracting heath data from microphones called Sonus. What happened in those 4 years? ## A BORING STORY IS NOT WORTH THE IN In the initial stages, operating as a lone entrepreneur, Dr. Decorte managed to capture the attention and eventually secured the endorsement of the UK Ministry of Defence and the UK government. Despite the initial alignment with Defense interests, Decorte strategically shifted its focus exclusively toward health tech. With remarkable swiftness, the company started assembling a world-class team. ![](https://lh7-us.googleusercontent.com/Kto4J4ngyJo91dVdaPbvD8PcIiJkl2-1OMzq338xM_gin2adYYaFKaRX88G0u1TNKJ8bds6THKYF0k-_Kd2YqrBdYRPuhGtlLHQRNwQH6Kb7oAlzeV5iYPhF5Sh2WR9WQ2HOfZT2PN_9J7r54N-BAoA) The pandemic played a crucial role in the story. The year 2020 marked a breakthrough moment as the UK government invested in Decorte Future Industries. Showing that the potential can reach far beyond the first assumptions and facilitating two successive testing phases through its innovation grants arm. Simultaneously, Decorte earned a coveted spot among the 10 selected companies for Techstars' London accelerator program. Substantial investments followed from Techstars, along with contributions from many notable figures. Over two years following the completion of his doctoral studies, the visionary founder embarked on an intensive journey. During this period, he not only conceptualized but also meticulously engineered the company's pioneering technology. Groundbreaking innovation that comprised AI controls and a biometric sensor architecture seamlessly integrated into an exoskeleton, paving the way for novel, cost-effective, and efficient methods of acquiring biometric data from the human body. Another significant milestone was achieved in December 2021 when the company recorded an impressive 99.6% accuracy rate in extracting heart data using its AI from audio, compared to the gold standard method of simultaneous ECG data collection. In 2022, Decorte successfully concluded its $1.6 million pre-seed funding round, securing support from venture funds based in London and Silicon Valley. The subsequent years, 2022 and 2023, witnessed strategic collaborations with Apollo Hospitals, the AM Foundation, and various clinics in the US and EU. These partnerships facilitated comprehensive clinical studies, resulting in the acquisition of a world-class dataset and the expansion of Decorte's technological capabilities. 2023, Decorte Future Industries uses groundbreaking artificial intelligence to extract health data from sound. Its Sonus Engine analyses a diverse range of health metrics in real time through sound captured directly from any standard microphone. This allows early identification of inconsistencies in the body’s systems that can prevent — or assist clinicians in pre-diagnosing — conditions such as cardiovascular disease, respiratory problems, depression, and anxiety. ## THIS IS JUST THE BEGINNING As artificial intelligence continues to transform all industries, Decorte stands out amid the hype through the simplicity of its proposition — using AI to extract and interpret health data from sound. It provides the only way to connect your body to the digital world, opening up vast possibilities for innovation, disease prevention, and a greater understanding of human health via an “Internet-of-Bodies” concept. > “...what direction do we set for the next 100 years of tech? The reality is that the direction that we set at this early stage, especially for AI will have long-term implications. It’s easy to forget just how fast can things move after a major technological shift like the one we’re currently experiencing…so it’s difficult to underestimate just how transformative AI can be.  > > It’s naive to assume we’ll get it right the first time. We need to find the courage to consistently reconfigure and constantly question ourselves and the direction in which we’re building” > > R.D. on the AI revolution - “ Adapt or die: Data-driven pivots as key to product-market fit | COGX 2023 “ ![](https://lh7-us.googleusercontent.com/anWPukBfCg71-gT5W2fMub-oYvud0FhAohhyCtvw-uCip9rn97B4E7Kz_mEROfc-9IgAd5BYEAzyFPMEfJBMKNlDxphVkhzefZYIvqMwzTpho1wv1KjgC2En92Mhj79ZCb2GIgruhubM3gcmZ0Ah4Bc) The founder himself became a well-established figure on the UK’s AI scene becoming one of its strongest promotors. Delivering Keynote speeches at countless events being awarded a Young Business Of The Year 2023 award and often quoted as an expert in the UK Press including the Financial Times. And that’s just the beginning I’m sure. The momentum continues into 2024, with investments from the biggest names on the market. Decorte stands in strategic partnerships with tech giants Microsoft and Google, with an ambitious goal to see its technology integrated into 3 billion smartphones by 2027.  The compelling narrative of Dr. Roeland P.-J. E. Decorte and Decorte Future Industries unfolds as a captivating saga of innovation, strategic pivots, and influential partnerships propelling the company towards a future of unparalleled success. Let this story act as motivation to push forward and think outside the box. Each tech founder needs to have his mind open to the changes in his economic environment and try to connect the dots that seem far-fetched or counterintuitive at first. Pivoting is not a sign of failure, but rather a sign of resilience.  **Lastly, let this comment from Dr. Decorte serve as a roadsign for all those founders facing a need to pivot:** *I think the need to pivot is indeed most often identified through analyzing the data, and, as with any strategic decision, (informed) intuition does play a very significant part in figuring out the direction in which to then pivot.* *Beyond making sure that founders remain open to and aware of, all the ways in which the data fed back by R&D and consumers can be interpreted, I believe founders should also remain open to and cognisant of all the ways in which their core technology can be deployed. Especially the ways that are radically different from how they, or others in their field, are currently deploying that technology. Because there’s always the possibility that a better way of deploying your technology is out there, and becoming religious about the form rather than the function of your startup is setting it up for failure.* *Put in other words, while trying to solve a problem or pursuing a mission, execution is everything, which is exactly why you shouldn’t get stuck in one way of executing and then put on blinders, but rather should constantly re-evaluate and assess whether your way of execution is still the most effective one.* ## Azure OpenAI Service Privacy Policies Explained *Published: 2024-02-09 | Author: rafal h | Tags: AI, Azure, LLM, OpenAI* *Source: https://brightinventions.pl/blog/azure-openai-service-privacy-policies-explained/index.md*
    ![OpenAI privacy](../../static/images/open_ai_privacy_4.png "")
    In my last blog post I have been exploring [OpenAI API service](/blog/openai-api-privacy-policies-explained/). As have said, OpenAI API guarantees the best data control and privacy within all their offerings. When considering Open API for integration, Azure OpenAI is often mentioned. Some say that we have better privacy controls with Azure OpenAI when building Enterprise solutions. Is that true? Let’s dive into Azure Open AI Privacy Policy. ## Azure Service Trust Portal Similar to the [OpenAI Trust Portal](https://trust.openai.com/), we have an information page of Microsoft about [privacy and compliance with different regulations](https://servicetrust.microsoft.com/). If you plan to research privacy and data protection within Azure, I think it is a good place to start. ## OpenAI Azure Service Even though OpenAI is a separate company, Azure still offers OpenAI Azure service. What is important to note is that although the services are controlled by Microsoft, they do not interact with each other:
    The Azure OpenAI Service is fully controlled by Microsoft; Microsoft hosts the OpenAI models in Microsoft’s Azure environment and the Service does NOT interact with any services operated by OpenAI (e.g. ChatGPT, or the OpenAI API).
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    OpenAI and Azure have established a [partnership](https://openai.com/blog/openai-and-microsoft-extend-partnership), so probably that is the reason why Azure OpenAI Service offering exists. Azure ensures that our data aren’t accessible to Open AI or 3rd parties
    Your prompts (inputs) and completions (outputs), your embeddings, and your training data: are NOT available to other customers. are NOT available to OpenAI. are NOT used to improve OpenAI models. are NOT used to improve any Microsoft or 3rd party products or services. are NOT used for automatically improving Azure OpenAI models for your use in your resource (The models are stateless, unless you explicitly fine-tune models with your training data). Your fine-tuned Azure OpenAI models are available exclusively for your use.
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    **Shortly, it means that our data is not used to train models.** Similar to OpenAI, we have 30 days data retention policy:
    To detect and mitigate abuse, Azure OpenAI stores all prompts and generated content securely for up to thirty (30) days. (No prompts or completions are stored if the customer is approved for and elects to configure abuse monitoring off, as described below.)
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    Also, when it comes to who can access this data we receive info that only authorized Microsoft employees have access:
    The human reviewers are authorized Microsoft employees who access the data via point wise queries using request IDs, Secure Access Workstations (SAWs), and Just-In-Time (JIT) request approval granted by team managers. For Azure OpenAI Service deployed in the European Economic Area, the authorized Microsoft employees are located in the European Economic Area.
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    In Azure, similar to OpenAI, you also are eligible for zero data retention:
    To address these concerns, Microsoft allows customers who meet additional Limited Access eligibility criteria and attest to specific use cases to apply to modify the Azure OpenAI content management features by completing this form.
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    What is different compared to OpenAI Api service is that with Azure you can control underlying network resources and privacy:
    Being on Azure, it comes along with many additional functionalities like Network Isolation, Azure AD based Authentication/Authorization, Billing, etc.
    [Microsoft Q&A](https://learn.microsoft.com/en-us/answers/questions/1396203/is-there-a-difference-between-openai-chatgpt-enter)
    The data you send is not shared with OpenAI, you stay within the borders of one vendor, so if you are already using Azure services these are valid points to consider to stay with them
    … are NOT available to OpenAI.
    [Microsoft OpenAI service privacy](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)
    Under this link we can see [compliance of Azure Services as of December 2023.](https://servicetrust.microsoft.com/DocumentPage/7adf2d9e-d7b5-4e71-bad8-713e6a183cf3)
    ![Azure OpenAI service compliance](../../static/images/azure-openai-service-privacy-policies-explained/azure-openai-service-compliance.png "")
    As you can see, there is more compliance offerings mentioned compared tor OpenAI - we can see ISO or PCI compliance which also might be important for your use case. Also, Azure OpenAI has FedRAMP High and DoD IL2 compliance which make it eligible for use with US government apps.
    ![Azure OpenAI service Fedramp](../../static/images/azure-openai-service-privacy-policies-explained/azure-openai-service-fedramp.png "")
    For GDPR compliance, when doing the research, it was not fully clear if the solution was compliant or not. Generally, Microsoft employees say that regarding GDPR compliance:
    Microsoft takes data privacy and security very seriously, and has implemented measures to ensure that personally identifiable information (PII) is not shared with OpenAI during the usage of Azure OpenAI Service. And I completely understand your concern regarding GDPR and privacy compliance. Microsoft takes data privacy seriously, and Azure services, including OpenAI, are designed to adhere to GDPR regulations.
    [Microsoft Q&A](https://learn.microsoft.com/en-us/answers/questions/1339718/is-the-azure-open-api-in-compliance-with-gdpr-regu)
    In another thread though, we can read that Azure OpenAI cannot be used with any personal data (GDPR):
    I got confirmation from Microsoft Support that Azure OpenAI is a Preview and therefore the exclusion clause in the Microsoft Products and Services Data Protection Addendum applies. This means that Azure OpenAI cannot be used with any personal data (GDPR) as the necessary compliance requirements for DPAs are not fulfilled.
    [Microsoft Q&A](https://learn.microsoft.com/en-us/answers/questions/1361952/does-azure-openai-fall-under-the-dpa)
    In the FAQs page of one of the 3rd party services using Azure OpenAI, we can read about GDPR as well:
    Is the usage of AI by 360L GDPR-compliant? Yes. We are using Microsoft Azure Open AI technology, Microsoft Azure is already one of our sub-processors and it's GDPR compliant. The use of its Open AI services does not alter the contract and Data Protection Agreement (DPA) provisions we have in place.
    [360 learning Q&A](https://support.360learning.com/hc/en-us/articles/17562881836564-AI-data-usage-protection-and-privacy)
    So somehow it might suggest that it is possible to get GDPR compliant with Azure OpenAI service. I could not find any specific, clear information about GDPR compliance on Azure resources though. What is interesting, the Microsoft Copilot offering (which is also another Azure service using AI & LLM under the hood) states that it is GDPR compliant:
    Microsoft Copilot for Microsoft 365 is compliant with our existing privacy, security, and compliance commitments to Microsoft 365 commercial customers, including the General Data Protection Regulation (GDPR) and European Union (EU) Data Boundary. Your control over your data is reinforced by Microsoft's commitment to comply with broadly applicable privacy laws, such as the GDPR, and privacy standards, such as ISO/IEC 27018, the world’s first international code of practice for cloud privacy.
    [Microsoft 365 copilot](https://learn.microsoft.com/en-us/microsoft-365-copilot/microsoft-365-copilot-privacy)
    Last but not least, in contrary to OpenAI on Azure you can select which region LLM is hosted in. It is important for some countries' compliance. A list of all regions that are eligible is [here](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#model-summary-table-and-region-availability). This was the last blog post of my series. We have gone through most of the OpenAI offerings and analyzed Azure OpenAI service offerings. That includes [ChatGPT Free, Plus](/blog/openai-chatgpt-free-plus-privacy-policies-explained/), [Team, Enterprise](/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/), [Open AI API](/blog/openai-api-privacy-policies-explained/) and Azure OpenAI service offerings. What is important is to always adjust the technology used for your use case. Hopefully, my blog posts helped you a little in understanding how data is handled with the most popular LLM offering in the market. This is important as more and more apps, employers, companies, etc. will use AI to disrupt the world. **Read more blog posts about OpenAI Privacy Policy:** [OpenAI ChatGPT Free & Plus Privacy Policies Explained](/blog/openai-chatgpt-free-plus-privacy-policies-explained/) [OpenAI ChatGPT Team & Enterprise Privacy Terms Explained](/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/) [OpenAI API Privacy Policies Explained](/blog/openai-api-privacy-policies-explained/) ## Tuckman Model - Teambuilding Stages You Should Know *Published: 2024-02-07 | Author: ula | Tags: team building, leadership* *Source: https://brightinventions.pl/blog/tuckman-model-teambuilding-stages/index.md* What is your definition of a team? Have your ever thought what are the components and traits of a good harmonious well-performing team?  According to Oxford dictionary a team is: 1. a group of people who play a particular game or sport against another group of people, 2. a group of people who work together at a particular job,  3. two or more animals that are used together to pull a cart, etc. The second definition is fair enough if we think about teams in general, but for sure is not enough when we think about good teams. **In *Leaders Eat Last: Why Some Teams Pull Together and Others Don't,* Simon Sinek emphasizes that creating a strong team culture involves trust, purpose, values, empathy, and collaboration.** By focusing on these elements we can build high-performing teams that are capable of achieving great things. Yet the way to get there is not always the easy one. Why? ## **the main challenges in creating teams** Building and maintaining a successful team can be rewarding, but it also comes with its share of challenges. **Among the most common problems the organisation may encounter we can find:**  * Unclear communication that leads to misunderstandings and a lack of cohesion among team members. * Ineffective leadership, whether it's a lack of direction, micromanagement, or an inability to inspire and motivate, can negatively impact team morale and performance. * Differences in personalities, work styles, and opinions leading to conflicts that hinder collaboration and decision-making. * Lack of trust. * Lack of diversity in terms of skills, backgrounds, or perspectives which results in generation of creative solutions and inclusive environments. * Resistance of team members to changes i.e. new processes, technologies, or ways of working.  * Insufficient development that hinders the ability to perform effectively and contribute to the team's success.  * Failing to recognise and reward team members' efforts and achievements leading to decreased motivation and job satisfaction. * For virtual or remote teams, challenges may include communication barriers, feelings of isolation, and difficulty in coordinating tasks. ## **Tuckman’s model**  Some of the above mentioned challenges appear in a particular stage of the team creation that are well-described in “Tuckman’s Model” - the model presents **the stages of group development proposed by psychologist [Bruce Tuckman](https://en.wikipedia.org/wiki/Bruce_Tuckman) in 1965.**   Tuckman’s model describes the natural progression of a group or team as they work together towards achieving their goals. The stages are characterized by different dynamics and challenges that teams experience. **The original model consisted of four stages, but later, a fifth stage was added: forming, storming, norming, performing, and adjourning.** Learn about the five phases by watching how the Fellowship of the Ring gets together. 😉 It is important to note that teams may not always progress through these stages in a linear manner. I have witnessed that nonlinearity at least a few times during my career. But what is more interesting, **teams might move back and forth between stages, particularly if new members join the team or if the team faces significant changes or challenges.** Additionally, not all teams will experience every stage, especially if they are short-term or project-based. ## **Stages of team development by Tuckman** ### 1. FORMING **🤩** In this initial stage, team members come together, get to know each other, and begin to understand the goals and tasks ahead. **There is often a sense of excitement and anticipation, but also uncertainty about roles and responsibilities. Team members may be polite and avoid conflict as they establish a sense of belonging.** ### 2. STORMING ⚡️⚡️⚡️ As team members start working closely together, differences in opinions, personalities, and work styles may lead to conflicts and power struggles. **It is common for tensions to arise during this stage as individuals vie for influence and position within the team.** Effective communication and conflict resolution skills are essential to move past this stage. ### 3. NORMING 🪴 During this stage, team members begin to resolve conflicts, establish norms, and develop a sense of cohesion. **Trust and collaboration grow, leading to better communication and a shared understanding of goals and roles.** Team members might begin to support each other and cooperate to achieve common objectives. 
    ![tuckman model](../../static/images/tuckman-management30.jpeg "")
    ###### Source: https://management30.com/blog/tuckman-model ### 4. PERFORMING 🎉 At this stage, the team has developed a strong sense of unity and synergy. **Team members are comfortable with their roles and responsibilities and work together effectively to achieve the team's goals.** Creativity, problem-solving, and high levels of productivity characterise this stage. ### 5. ADJOURNING (or MOURNING)⚰️ In this final stage, the team's project or goal has been accomplished, and the team is disbanded or transitions to a new phase. **Team members may experience a mix of emotions, including satisfaction with their achievements and sadness about the team coming to an end.** Reflection and acknowledgment of the team's accomplishments are important during this stage. ## **Leader’s support during team development stages**  As you can see each stage comes with its own challenges and dynamics.[ Leaders play a crucial role in supporting teams through each of these stages.](https://www.thecoachingtoolscompany.com/get-your-team-performing-beautifully-with-this-powerful-group-development-model/) First of all, if you are a leader/manager you have to **create a safe and welcoming atmosphere for team members to introduce themselves, get to know each other, and understand the team's purpose** - especially if you your team is under a forming stage. Try also to **clearly define the roles and responsibilities** to ensure everyone is on the same page and understands what is expected from them. During storming stage your leader's or manager’s role may resemble much more of **a conflict solver position**. **You will have to address conflicts that arise within the team, encourage open communication and guide discussions toward resolution.** Remember that if conflicts escalate, you will have to intervene as a mediator to ensure issues are handled constructively and the team relationships are not negatively impacted. **You will also become a facilitator that helps the team establish ground rules and norms for communication, decision-making, and conflict resolution.** Acknowledge the progress the team has made in resolving conflicts and working together effectively. Don’t forget about highlighting the strengths and contributions of each team member.
    ![solving conflicts ](../../static/images/screenshot-2024-02-07-at-14.56.01.png "")
    ###### Source: https://oazaacademy.com/best-strategies-for-conflict-resolution-that-actually-work **During performing stage your leader’s and managers’s role may turn into mentoring**. Usually, your main goal would be providing autonomy to your team to make decisions and take ownership of their tasks. You should also support their growth opportunities and encourage the team to reflect on its processes and outcomes, and facilitate discussions on how to improve further. Sometimes leaders and managers have to learn how to delegate more responsibilities on this stage among team member to highlight their strengths and potentials.  If your team reaches the adjourning (or mourning) phase, **remember to recognise the achievements of each and every member as the project or task comes to an end.** If it is possible, you can even organise a celebration or reflection session to acknowledge the team's successes as well as discuss future opportunities for collaboration. **Last but not least, always provide feedback that can help team members in their future endeavours.** ## **summary - make Tuckman's model one of your friends** **Throughout all the Tuckman’s team development stages, effective communication, active listening, empathy, and adaptability are key traits to exhibit**. As I said before it is worth keeping in mind that **these stages are not always linear or separate, and you might cycle through them multiple times**.  If you are a leader or manager, your goal should be to guide and support the team's development through all the stages, so that it will positively impact the team's performance and cohesion. If you are not a a leader or manager, your goal should be supporting your colleagues and yourself on each of these stages. **Being aware of the different stages the team goes through may help you understand each team members better and reduce frustration and anxiety that may arise.** You also might be able to work through differences and find resolutions, leading to stronger relationships and better problem-solving. We have to remember that **we as people, and teams in general, are not static and we usually change as new challenges arise**. You can use Tuckman model as a tool for ongoing assessment and improvement for yourself and people around you. For me it provides a really good roadmap for team development and fostering collaboration. Don't treat it as an oracle, but rather a point for reflection and guideline for further optimisation. ## OpenAI API Privacy Policies Explained *Published: 2024-02-02 | Author: rafal h | Tags: AI, OpenAI API, LLM, HIPPA, ZDR, GDPR* *Source: https://brightinventions.pl/blog/openai-api-privacy-policies-explained/index.md*
    ![OpenAI privacy](../../static/images/open_ai_privacy_3.png "")
    **In my last blog post we have been [tackling privacy when using ChatGPT Team and Enterprise plan](/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/). Today, we will discuss privacy for a product that will be used with a majority of OpenAI integrations. It will be OpenAI API. Compared to already described products it has the best privacy controls which I will dive into.** ## OpenAI Trust Portal I have already mentioned it my other blog posts, but it’s worth to remind it. [This](https://trust.openai.com/) is your go-to place for privacy and security when it comes to OpenAI. Upon this page, we can see that OpenAI is CCPA, GDPR, SOC2 and SOC3 compliant. You can download or request security papers from OpenAI. You can see the status of their infrastructure, all privacy policies, PII usage, data processing agreement or terms of service. It’s highly recommended to start your privacy journey here! ## OpenAI Enterprise Privacy Throughout your privacy journey, you should also visit [Enterprise Privacy portal](https://openai.com/enterprise-privacy). It gives you more insight into how your data is used if you choose OpenAI API. ## OpenAI API To interact with OpenAI API you have to create an account (different than for ChatGPT, those are two different services) and attach payment. After it, you can start to interact with Playground or create API keys and integrate it with your app. The first thing to mention is that OpenAI API doesn’t train from business data:
    We do not train on your business data (data from ChatGPT Team, ChatGPT Enterprise, or our API Platform)
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    The playground is simply a wrapper for API and it will not be used for training:
    API and Playground requests will not be used to train our models.
    [Community portal](https://community.openai.com/t/what-terms-of-service-privacy-policy-apply-to-playground/136036/10)
    So what about data storage?
    OpenAI may securely retain API inputs and outputs for up to 30 days to provide the services and to identify abuse. After 30 days, API inputs and outputs are removed from our systems, unless we are legally required to retain them. You can also request zero data retention (ZDR) for eligible endpoints if you have a qualifying use-case. For details on data handling, visit our Platform Docs page.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Same as other OpenAI services we do have 30 days mentioned. What is new here, is ZDR - zero data retention. We are eligible for it when using API routes: `/v1/chat/completions` (except image inputs), `/v1/embeddings` and `/v1/completions`. For `/v1/audio/transcriptions`, `/v1/audio/translations`, `/v1/moderations` ZDR is enabled by default. You can chat with support to enable ZDR in eligible endpoints. What does it mean for us, software developers? When we are building our apps via eg. Langchain and using OpenAI embeddings (check the [blog post](/blog/build-llm-application-with-rag-langchain/) of my colleague Paweł Polak on how to do it), we can steer out from data retention by OpenAI if using certain endpoints. This is important if we want to make our solution HIPPA-compliant. You can read more about it in the next paragraphs.
    ![ZDR endpoints policy](../../static/images/openai-api-privacy-policies-explained/endpoints_openai.png "")
    *ZDR endpoints example. For full list please refer to [OpenAI docs](https://platform.openai.com/docs/models/how-we-use-your-data)* Who can store the data if it is retained?
    Our access to API business data stored on our systems is limited to (1) authorized employees that require access for engineering support, investigating potential platform abuse, and legal compliance and (2) specialized third-party contractors who are bound by confidentiality and security obligations, solely to review for abuse and misuse.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    What is worth mentioning, if you upload files via `/v1/files` or using `/v1/assistants`, the default retention of data is:
    Until deleted by customer
    [OpenAI docs](https://platform.openai.com/docs/models/how-we-use-your-data)
    Regarding compliance, for GDPR OpenAI can execute:
    Data Processing Addendum (DPA) with customers for their use of ChatGPT Team, ChatGPT Enterprise, and the API in support of their compliance with GDPR and other privacy laws
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    In case of SOC2:
    Our API Platform has been audited and certified for SOC 2 Type 2 compliance
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Apart from those, by having ZDR possibility we are eligible for HIPAA compliance:
    We are able to sign Business Associate Agreements (BAA) in support of customers’ compliance with the Health Insurance Portability and Accountability Act (HIPAA). Please reach out to our sales team if you require a BAA.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    There might be exceptions here for your use case though:
    only endpoints that are eligible for zero retention are covered by the BAA. You can see a list of those endpoints.
    [OpenAI Help portal](https://help.openai.com/en/articles/8660679-how-can-i-get-a-business-associate-agreement-baa-with-openai)
    With OpenAI API, you have also the possibility to finetune the model. What about data privacy in that case?
    Yes, you can adapt certain models to specific tasks by fine-tuning them with your own prompt-completion pairs. Your fine-tuned models are for your use alone and never served to or shared with other customers or used to train other models. Data submitted to fine-tune a model is retained until the customer deletes the files.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    What it means is that upon fine-tuning the model, your fine-tuned model is only for your use case and data remains there unless you delete it. Last but not least, what is also important to mention is that
    OpenAI encrypts all data at rest (AES-256) and in transit (TLS 1.2+), and uses strict access controls to limit who can access data.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    As we can see, OpenAI API guarantees the best data control and privacy within all its offerings. **Read more blog posts about OpenAI Privacy Policy:** [OpenAI ChatGPT Free & Plus Privacy Policies Explained](/blog/openai-chatgpt-free-plus-privacy-policies-explained/) [OpenAI ChatGPT Team & Enterprise Privacy Terms Explained](/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/) [Azure OpenAI Service Privacy Policies Explained](/blog/azure-openai-service-privacy-policies-explained/) ## Build LLM application with RAG (LangChain v0.1.0) *Published: 2024-01-30 | Author: pawel-p | Tags: AI, RAG, langchain* *Source: https://brightinventions.pl/blog/build-llm-application-with-rag-langchain/index.md* **Let’s build a simple LLM application in Python using the LangChain library as well as RAG and embedding techniques. Follow our step-by-step tutorial published after the new release of LangChain 0.1.0 in January 2024.**
    ![Cover photo](../../static/images/python_langchain.png "")
    In previous blog posts, we have described [how the embeddings](https://brightinventions.pl/blog/understanding-embeddings-a-short-guide-with-an-example/) work and [what the RAG technique is](https://brightinventions.pl/blog/retrieval-augmented-generation-in-machine-learning/). If you need to catch up with some basics, read the articles. Are you ready? Now it’s time to turn theory into practice! ## **How to build an LLM application from scratch** **We will build a simple LLM application in Python using the LangChain library. LangChain is a popular library that makes building such applications very easy.** **Our RAG application will expand an LLM's knowledge using private data.** In this case, it will be a **PDF file containing some text.**  It's also possible to achieve a similar goal by using OpenAI agents and expanding their knowledge base with specific files by uploading them to OpenAI's servers for a designated agent. However, this method entails storing our confidential data with OpenAI's servers, which may not always align with our privacy preferences. My colleague – Rafał Hofman – wrote [a great article about data privacy in OpenAI services.](https://brightinventions.pl/blog/openai-chatgpt-free-plus-privacy-policies-explained/) As the file for expanding knowledge, we will use an article about 'ReAct', titled '[ReAct: Synergizing Reasoning and Acting in Language Models](https://arxiv.org/abs/2210.03629)'. This article discusses a research project that integrates decision-making and reasoning skills in large language models. ### 1. Prerequisites At the very beginning, we must install all required modules, that our application will use. Let’s write this command in the terminal in the project directory ```shell pip install langchain-community==0.0.11 pypdf==3.17.4 langchain==0.1.0 python-dotenv==1.0.0 langchain-openai==0.0.2.post1 faiss-cpu==1.7.4 tiktoken==0.5.2 langchainhub==0.1.14 ``` Let's create a ‘data’ directory and place the PDF file in it.  We must also create a main.py file in the project directory, where we will store the whole code of our application. In the main.py file, we will create main() function which will store the logic. The file will look like this: ```python def main(): print("Hello World!") if __name__ == "__main__": main() ``` Great! Let's move on to the implementation of logic now.  ### 2. Load the PDF file into the application We will use a document loader provided by LangChain called PyPDFLoader.  ```python from langchain_community.document_loaders import PyPDFLoader pdf_path = "./data/2210.03629.pdf" def main(): loader = PyPDFLoader(file_path=pdf_path) documents = loader.load() print(documents) if __name__ == "__main__": main() ``` First, we should **create an instance of the PyPDFLoader object** where we pass the path to our file. The next step is to simply **call the load function on this object** and save the loaded file in the documents variable. It will be an array consisting of Document objects, where each of these objects is a representation of one page of our file. The print() function should output an array similar to this: ``` [Document(page_content='[...]', metadata={'source': pdf_path, page: 1}), Document(page_content='[...]', metadata={'source': pdf_path, page: 2}), ...] ``` ### 3. Splitting document into smaller chunks We don’t want to send a whole document as a context with our query to the LLM. Why? It was more detailedly described in the [article about the RAG](https://brightinventions.pl/blog/retrieval-augmented-generation-in-machine-learning/). **To split the document, we will use a class provided by LangChain called CharacterTextSplitter**, which we can import from the langchain library: ```python from langchain.text_splitter import CharacterTextSplitter ``` Then we can create an instance of it and **call the split_documents() function**, passing our loaded documents as a parameter. ```python def main(): loader = PyPDFLoader(file_path=pdf_path) documents = loader.load() text_splitter = CharacterTextSplitter( chunk_size=1000, chunk_overlap=50, separator="\n" ) docs = text_splitter.split_documents(documents) ``` Let's briefly describe what's going on here. First, we are creating a CharacterTextSplitter object, which takes several parameters: * **chunk_size** - defines the maximum size of a single chunk measured in tokens. * **chunk_overlap** - defines the size of overlap between chunks. This helps to preserve the meaning of the split text by ensuring that chunks are not split in a way that would distort their meaning. * **separator** - defines the separator that will be used to delineate our chunks. In the docs variable, we will get an array of Document objects - the same as from the load() function of the PyPDFLoader class. But this time, this array will contain more elements because we have split them. ### 4. Prepare environment variables and API Key to store it there ​​The next step will be **converting these chunks into numeric vectors and storing them in a vector database.** This process is called [embeddings](https://brightinventions.pl/blog/understanding-embeddings-a-short-guide-with-an-example/), and there is also a blog post about it, so we won't go into detail about it now. For the embeddings process, **we need an external embeddings model.** We will use OpenAI embeddings for this purpose. To do that, we have to generate an OpenAI API key. \ But before that, we have to create a .env file where we will store this key. Now, we need to create an account on the [platform.openai.com/docs/overview](https://platform.openai.com/docs/overview) page.  Afterward, we should generate an API key on the [platform.openai.com/api-keys](https://platform.openai.com/api-keys) page by creating a new secret key. Copy the secret key and paste it into the .env file like this: ``` OPENAI_API_KEY=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 ``` This key will be deleted before the publication of this post, so you will be not able to use it. Okay, let’s load environment variables into our project by importing the load_dotenv function: ```python from dotenv import load_dotenv ``` And call it at the very beginning of the main function: ```python def main(): load_dotenv() loader = PyPDFLoader(file_path=pdf_path) documents = loader.load() text_splitter = CharacterTextSplitter( chunk_size=1000, chunk_overlap=50, separator="\n" ) docs = text_splitter.split_documents(documents) ``` ### 5. Implementing the embedding process At first, we have to import OpenAIEmbeddings class: ```python from langchain_openai import OpenAIEmbeddings ``` Then we should create an instance of this class. Let’s assign it to the 'embeddings' variable like this: ```python embeddings = OpenAIEmbeddings() ``` ### 6. Setting up local vector database - FAISS Awesome! We have loaded and prepared our file, and we have also created an object instance for the embeddings model. **We are now ready to transform our chunks into numeric vectors and save them in a vector database.** We will keep all our data locally using the FAISS vector database. Facebook AI Similarity Search (Faiss) is a tool designed by Facebook AI for effective similarity search and clustering of dense vectors.  First, we need to import the FAISS instance: ```python from langchain_community.vectorstores.faiss import FAISS ``` And implement the process of converting and saving embeddings: ```python def main(): load_dotenv() loader = PyPDFLoader(file_path=pdf_path) documents = loader.load() text_splitter = CharacterTextSplitter( chunk_size=1000, chunk_overlap=50, separator="\n" ) docs = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(docs, embeddings) vectorstore.save_local("vector_db") ``` We have added two lines to our code. The first line takes our split chunks (docs) and the embeddings model to convert the chunks from text to numeric vectors. After that, we are saving the converted data locally in the 'vector_db' directory. ### 7. Creating a prompt For preparing a prompt we will use a 'langchain' hub. We will pull a prompt called 'langchain-ai/retrieval-qa-chat' from there. This prompt is specially designed for our case, allowing us to ask the model about things from the provided context. Under the hood, the prompt looks like this: ``` Answer any use questions based solely on the context below: {context} ``` You can check it here - https://smith.langchain.com/ in the hub section, but you will have to create an account for that. Let’s import a hub from the 'langchain' library: ```python from langchain import hub ``` Then, simply use the 'pull()' function to retrieve this prompt from the hub and store it in a variable: ```python retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") ``` ### 8. Setting up a large language model Great. The next thing **we'll need is a large language model** - in our case, it will be one of the OpenAI models. Again, we need an OpenAI key but we have already set up it along with the embeddings, so we don't need to do it again. Let's go ahead and import the model: ```python from langchain_openai import ChatOpenAI, OpenAIEmbeddings ``` And assign it to a variable in our main function: ```python llm = ChatOpenAI() ``` ### 9. Retrieve context data from the database Okay, we have finished preparing the vector database, embeddings, and LLM (large language model). Now, **we need to connect everything using chains.** We will need two types of chains provided by 'langchain' for that.   The first one is the 'create_stuff_documents_chain,' which we need to import from the 'langchain' library: ```python from langchain.chains.combine_documents import create_stuff_documents_chain ``` Next, pass our large language model (LLM) and prompt to it. ```python combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt) ``` This function returns an LCEL Runnable object, which requires a context parameter. Running it will look like this: ```python combine_docs_chain.invoke({"context": docs, "input": "What is REACT in machine learning meaning?"}) ``` ### 10. Retrieve only the relevant data as a context Generally, it will work, but in this situation, we will pass all chunks - the entire document - as the context. In our case, where the file has 33 pages, **this context is too large,** and we will probably encounter an error like this: ```python openai.BadRequestError: Error code: 400 - {'error': {'message': "This model's maximum context length is 4097 tokens. However, your messages resulted in 33846 tokens. Please reduce the length of the messages.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}} ``` **To fix that, we need to pass only the information related to our query as the context.** We will achieve this by combining this chain with another one, which will retrieve only the chunks important to us from the database and automatically add them as context to the prompt.   Let's import that chain from the 'langchain' library: ```python from langchain.chains import create_retrieval_chain ``` First, we need to prepare our database as a retriever, which will enable semantic search for the chunks that are relevant to our query. ```python retriever = FAISS.load_local("vector_db", embeddings).as_retriever() ``` So, we load our directory where we store the chunks converted to vectors and pass it to an embeddings function. In the end, we return it as a retriever.   Now, we can combine our chains: ```python retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain) ``` Under the hood, it will retrieve relevant chunks from the database and add them to our prompt as context. All we have to do now is **invoke this chain with our query as an input parameter:** ```python response = retrieval_chain.invoke({"input": "What is REACT in machine learning meaning?"}) ``` As a response, we will receive an object with three variables: * **input** - our query; * **context** - an array of documents (chunks) that we have passed as context to the prompt; * **answer** - the answer to our query generated by the large language model (LLM). Let’s print out the "answer" property: ```python print(response["answer"]) ``` Our printed answer looks as follows: > In the context provided, ReAct refers to an approach or methodology used in machine learning. It stands for "Reasoning + Acting" and aims to integrate decision-making and reasoning capabilities into a large language model. ReAct allows the model to interact with external sources, such as knowledge bases or environments, to gather additional information and improve its task-solving abilities. It has been applied to various language and decision-making tasks, demonstrating effectiveness over state-of-the-art baselines and improved interpretability and trustworthiness. Looks pretty nice :)  ### 10. You’ve made it! Our LLM app is ready We have extended the knowledge base of the LLM model with data from a .pdf file. The model is now able to answer our questions based on the context that we have provided in the prompt. Final code: ```python from dotenv import load_dotenv from langchain import hub from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import CharacterTextSplitter from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores.faiss import FAISS pdf_path = "./data/2210.03629.pdf" def main(): load_dotenv() loader = PyPDFLoader(file_path=pdf_path) documents = loader.load() text_splitter = CharacterTextSplitter( chunk_size=1000, chunk_overlap=50, separator="\n" ) docs = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(docs, embeddings) vectorstore.save_local("vector_db") retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") llm = ChatOpenAI() combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt) retriever = FAISS.load_local("vector_db", embeddings).as_retriever() retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain) response = retrieval_chain.invoke( {"input": "What is REACT in machine learning meaning?"} ) print(response["answer"]) if __name__ == "__main__": main() ``` ## Diving into Alternative Marketplaces Coming with iOS 17.4 *Published: 2024-01-29 | Author: michal-was | Tags: apple, iOS, ios, app store* *Source: https://brightinventions.pl/blog/diving-into-alternative-marketplaces-coming-with-ios-17-4/index.md* **Apple is forced by the EU to introduce the ability to install apps by alternative marketplaces other than AppStore. What does it mean for iOS developers and app owners? In this article, I will cover the main tech and business requirements to set up your marketplace.**
    ![iOS alternative marketplace app](../../static/images/ios_alternative_marketplace_blog_cover.png "")
    Source: https://developer.apple.com/documentation/appdistribution/creating-an-alternative-app-marketplace The directive, called the **Digital Markets Act (DMA)**, which **will be effective in March 2024**, implies on Apple some major changes, the most important ones are: * make it possible to install apps by the alternative marketplace; * allow external payment providers; * allow users to use alternative browser engines. **This article covers the first of the implications, which is alternative marketplaces.**
    ![Sideloading for iOS](../../static/images/altstore.png "")
    Source: https://twitter.com/altstoreio/status/1750598337533747445 ## What is an alternative marketplace? Currently, iOS allows users to install apps from AppStore, Testflight or by Enterprise and MDM programs. **Alternative marketplace will be a completely new method of installing apps in iOS, but Apple doesn’t just open iOS for installing any app from any source known i.e. as sideloading.** **To install an app from an alternative marketplace, users will have to first install an alternative marketplace app developed by an entitled marketplace developer**. After installing the marketplace app, they will be able to browse and install apps from it like they currently do through the AppStore app. To become a marketplace developer, **multiple requirements need to be met**. A developer needs to accept new business terms, request the “Alternative App Marketplace Entitlement (EU)” and meet multiple criteria required by Apple. One of these requirements is providing “a stand-by letter of credit from an A-rated (or equivalent by S&P, Fitch, or Moody’s) financial Institution of €1,000,000 to establish adequate financial means in order to guarantee support for your developers and users”. See: https://developer.apple.com/support/alternative-app-marketplace-in-the-eu/ & https://developer.apple.com/support/dma-and-apps-in-the-eu/#ios-app-eu Considering that you will meet all the requirements and Apple will agree to grant you such entitlement, the rest of the work is building a marketplace app and providing apps for it.
    ![Installing alternative marketplace app](../../static/images/apple_doc_mockups_ios.png "")
    Source: https://developer.apple.com/documentation/appdistribution/creating-an-alternative-app-marketplace#Distribute-the-marketplace-app-on-the-web ## Submitting apps for alternative marketplaces To distribute an app through an alternative marketplace, **app developers will still need to submit them through AppStore connect**. It will be required to pass a new review called “Notarization for iOS apps” that will check “platform integrity and protecting users”. Notarization for iOS apps will focus on Functionality, Safety, Security, Privacy and Accuracy. Apple doesn’t mention that apps must comply with the “Human Interface Guideline”. Apps distributed on the AppStore will still need to meet Apple’s high standards and pass the normal review. See: https://developer.apple.com/support/dma-and-apps-in-the-eu/#notarization-for-ios-apps After passing notarization, **developers will need to obtain a security token from the marketplace owner to make their app available in a specific marketplace**. It will be possible to make one binary available in the AppStore and multiple alternative marketplaces. App developers will be able to branch their code based on the installation (AppStore / TestFlight / Enterprise / Alternative Marketplace). It’s important to note that **iPad-only apps can’t be distributed through an alternative marketplace**, they need to support the iPhone too. ## Building an alternative marketplace To set up a marketplace you will need to provide: * marketplace webpage for letting people download the marketplace app; * webserver for storing app data received from AppStore Connect and facilitating a secure app installation by communicating with iOS; * dedicated iOS marketplace app.
    ![Apple doc](../../static/images/apple_doc.png "")
    source: https://developer.apple.com/documentation/appdistribution/creating-an-alternative-app-marketplace **Marketplace iOS apps will be a new type of app that will be distributed by external webpage**. A special URL scheme will be used to perform an iOS app installation and that’s the only way of distributing and installing it. Although the app will be distributed over an external webpage, **it will be required to do a setup with AppStore connect to obtain an “alternative distribution package”**. The process repeats with any update to the marketplace app, but can be automated with webhooks. ## MarketplaceKit iOS 17.4 introduces a new framework called [MarketplaceKit](https://developer.apple.com/documentation/marketplacekit/) that will allow creation a marketplace app. It provides tools for requesting an installation of apps distributed over your marketplace, performing updates, restoring and retrieving licenses. At a glance, the new API consists of: * `AppLibrary` - the essential class to manage the installation and discovery of marketplace-hosted apps. See: https://developer.apple.com/documentation/marketplacekit/applibrary * `App License Delivery SDK` - for vending licenses from your webserver and handle DRM * ​​`MarketplaceExtension` - “An extension that facilitates authentication, installation, and launching a marketplace with deep links.” See: https://developer.apple.com/documentation/marketplacekit/marketplaceextension * `Marketplacekit/ActionButton` - a special button for performing the actual installation to ensure that the process of installation was initiated by the marketplace app. Apps using `MarketplaceKit` will need a special entitlement com.apple.developer.marketplace.app-installation without adding it, **iOS ignores calls to some parts of new API.** The new API looks pretty straightforward, the developer will need to build an UI and call specific methods to list available apps, and request installs or updates. The rest will be handled by the iOS operating system along with webserver provided by the marketplace owner. More details about SDK can be found in the `MarketplaceKit` documentation https://developer.apple.com/documentation/marketplacekit
    ![Alternative Markeplace App installing an app](../../static/images/apple_doc_mockup_app_install.png "")
    Source: https://developer.apple.com/documentation/appdistribution/creating-an-alternative-app-marketplace `MarketplaceKit` is also useful for app developers that want to distribute their apps over multiple marketplaces. It also allows app developers to branch their apps based on the marketplace it was installed by. > Use MarketplaceKit app distributor’s static current property to determine the installation source. See: https://developer.apple.com/documentation/appdistribution/distributing-your-app-on-an-alternative-marketplace#Branch-your-code-base-depending-on-the-installation ## What does alternative marketplace mean for iOS developers Theoretically, benefits are lower or zero commission from alternative marketplace owners and a simplified review process. We don’t know how strict Apple will be regarding the review and the commission will depend on the marketplace developer. The downside will be an obviously lower user base covering only users in the EU that will install alternative marketplace app. It's also worth mentioning that developers who choose to agree to the new business terms will have to pay a Core Technology - "€0.50 for each first annual install over one million in the past 12 months" see more here https://developer.apple.com/support/core-technology-fee/ Although the technical side doesn’t look complicated, **the business requirements for creating an alternative marketplace are high**. Becoming an entitled marketplace developer requires meeting some strict requirements. **Due to the requirement of providing a stand-by letter for €1,000,000, this process will be reserved only for big players that can afford this.** Some companies have already announced that they will create their own marketplace apps. Despite some heavy criticism from Tim Sweeney, CEO of Epic Games, he mentioned that they will push to launch their Epic Games Store.
    AltStore also announced that they’ve already started working on their marketplace:
    I hope that some companies will be able to meet all the requirements and we will see alternative marketplaces soon. It’s a great new opportunity for apps breaking AppStore rules or the ones not willing to pay regular commissions to Apple. ## Join Tomasz Stachlewski and Grzegorz Kalwig at AWS Tricity Meetup *Published: 2024-01-29 | Author: izabela | Tags: update, AWS* *Source: https://brightinventions.pl/blog/join-aws-tricity-meetup-february/index.md* **Sign up for the free AWS Meetup powered by Bright Inventions and get in-depth insights into cybersecurity and serverless with our top-notch speakers. Let's meet in Gdańsk at Starter Incubator on February 15. The first speech starts at 6 PM, so don’t miss it!** ## AWS Tricity Meeting agenda 17.45-18.00 Registration & Intro 👋 **18.00-18.45 Presentation by Grzegorz Kalwig 💪, DevOps Engineer, Unity Group** **Topic: Controlling the Customer Footprint in the Service of Security** In today's world, cybersecurity is constantly evolving to meet increasing challenges and new threats. During the presentation, we will trace the history of an attack targeted at an e-commerce system. Grzegorz will share his experiences in resolving this situation. 18:45 - 18:55 Q&A Session 🗣️ 18:55 - 19:00 Refreshment Break ☕️ **19:00-20:00 Presentation by Tomasz Stachlewski 😎, Head of Technology for EMEA CEE, AWS** **Topic: Serverless Data Analysis - What's Buzzing in the Grass** In this session, we will explore various methods of serverless data analysis in the cloud. We will discuss distributed analytics within the Big Data ecosystem and the EMR Serverless service, orchestration with AWS Step Functions, and conclude with serverless analysis using the Athena service. If time permits, we will leverage the capabilities of GenerativeAI to help us discover collected data. All this without slides! 20:00 - 20:10 Q&A Session 🗣️ 20:10 Pizza & Networking 🍕👫 ## Meet the speakers ### Grzegorz Kalwig, DevOps Engineer, Unity Group
    ![Grzegorz Kalwig AWS Tricity Meeting](../../static/images/grzegorz_kalwig_aws.png "Grzegorz Kalwig AWS Tricity Meeting")
    DevOps Engineer with 13 years of experience in the IT industry. He has extensive experience in the field of telecommunications networks and DevOps. Currently specializes in public cloud AWS and Kubernetes, implementing projects for the e-commerce industry. Certified AWS DevOps Professional and Security Specialty. Throughout his career, he has implemented solutions for public services such as the Ministry of National Defense, police, ambulance, and fire brigade, which included creating infrastructure and software. As CTO, he also worked on creating a secure data center for the Navy's training base. A board game collector and a fan of fantasy and RPGs (real-life, not computer games), often taking the role of the Game Master. He can also be found at conventions as part of the Game Masters initiative. ### Tomasz Stachlewski, Head of Technology for EMEA CEE, AWS
    ![Tomasz Stachlewski AWS Tricity Meeting](../../static/images/tomasz_stachlewski_aws.png "Tomasz Stachlewski AWS Tricity Meeting")
    Tomasz Stachlewski is a Head of Technology for EMEA CEE region at Amazon Web Services, where he helps companies of all sizes (from startups to enterprises) in their Cloud journey. He provides guidelines for creating cloud solutions that deliver the most value to his customers, and help take their IT to the next level. He is a big believer in innovative technology such as serverless architecture, which allows organizations to accelerate their digital transformation. Before joining Amazon, he worked at LOT Polish Airlines, where he architected their first cloud projects, IBM and at Accenture. ## OpenAI ChatGPT Team & Enterprise Privacy Terms Explained *Published: 2024-01-25 | Author: rafal h | Tags: AI, ChatGPT, OpenAI, LLM, privacy, security* *Source: https://brightinventions.pl/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/index.md* **Recently OpenAI introduced new business plans: ChatGPT Team and Enterprise. Which plan gives you more control over data retention? Which one might comply with the security regulations in your company? Let’s delve into the OpenAI privacy terms to find answers!**
    ![OpenAI privacy](../../static/images/open_ai_privacy_2.png "")
    In my last [blog post](/blog/openai-chatgpt-free-plus-privacy-policies-explained/) we have been tackling privacy terms when using basic, individual ChatGPT Free & Plus subscriptions. The control of the privacy there is quite limited but taking several precautions, as mentioned in the blog post, might be enough for you. **If you need a bigger control over your data retention, I will present ChatGPT solutions for business: ChatGPT Team and Enterprise.** ## OpenAI Trust Portal I have already mentioned it in the last post but it’s worth reminding. **[OpenAI Trust portal](https://trust.openai.com/) is your go-to place for privacy and security when it comes to OpenAI.** Upon this page, we can see that OpenAI is CCPA, GDPR, SOC2, and SOC3 compliant (OpenAI, not ChatGPT - note the difference). Here you can download or request security papers from OpenAI. You can see the status of their infrastructure, all privacy policies, PII usage, data processing agreement, or terms of service. Highly recommended to start your privacy journey here! ## OpenAI Enterprise Privacy Another interesting place to visit is **[Enterprise Privacy portal](https://openai.com/enterprise-privacy)**. It gives you more **insight into how your data is used if you choose an enterprise/business way of interacting with ChatGPT**. ## ChatGPT Team Privacy and Data Security It’s a recently introduced ChatGPT solution for small businesses. It is slightly **more pricey than ChatGPT Plus** and it requires at least two licenses. **It adds extra features like higher message caps and the possibility to create and share custom GPTs with the rest of the workspace.** From a privacy point of view, the most important thing is that **OpenAI doesn’t train on our data with this plan:**
    We do not train on your business data (data from ChatGPT Team, ChatGPT Enterprise, or our API Platform)
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    We do not use your ChatGPT Team, ChatGPT Enterprise, or API data, inputs, and outputs for training our models.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    That means that Team data is excluded from training by default. As opposed to individual subscriptions for ChatGPT we have an opt-in model here. Also, when using the Team plan, **we have Admin console and Admin roles**. As we can read in the policy:
    Workspace admins have control over workspaces and access
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    **Data is stored for 30 days after deleting from the system**. End users from our team are in control of how long conversations are retained:
    Each of your end users controls whether their conversations are retained. Any deleted or unsaved conversations are removed from our systems within 30 days, unless we are legally required to retain them. Note that retention enables features like conversation history, and shorter retention periods may compromise product experience.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    **Now, when our data is stored, who can see it?** Here’s an OpenAI explanation:
    Within your organization, only end users can view their conversations. Workspace admins have control over workspaces and access. Our access to conversations stored on our systems is limited to (1) authorized employees that require access for engineering support, investigating potential platform abuse, and legal compliance and (2) specialized third-party contractors who are bound by confidentiality and security obligations, solely to review for abuse and misuse
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    When it comes to **compliance with the product**, we can see it's still **a working process**:
    SOC 2 compliance coming soon
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    For GDPR
    we are able to execute a Data Processing Addendum (DPA) with customers for their use of ChatGPT Team, ChatGPT Enterprise, and the API in support of their compliance with GDPR and other privacy laws. Please complete our DPA form to execute a DPA with OpenAI.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    ## ChatGPT Enterprise Privacy and Data Security ChatGPT Enterprise is designed with larger organizations in mind for utilizing ChatGPT. You have to ask support to get individual quota about the pricing and you are obliged to buy multiple licenses. Apart from extra functionalities like **unlimited GPT-4 queries**, there are also some additional privacy features to discuss. Apart from what is available in the Team plan, the **workspace admins have control of data retention**:
    You control how long your data is retained (ChatGPT Enterprise)
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Your workspace admins control how long your data is retained. Any deleted conversations are removed from our systems within 30 days, unless we are legally required to retain them. Note that retention enables features like conversation history, and shorter retention periods may compromise product experience
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Having the admin’s control over data retention is a huge difference compared to the Team plan where
    Each of your end users controls whether their conversations are retained.
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    For compliance, same as the Team plan we are **eligible for GDPR compliance but it is already SOC 2 compliant:**
    ChatGPT Enterprise has been audited and certified for SOC 2 Type 1 compliance (Type 2 coming soon).
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Also, we have a **SAML SSO authentication option:**
    Enterprise-level authentication through SAML SSO (ChatGPT Enterprise and API)
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    For both enterprise plans, there is information that
    Data encryption at rest (AES-256) and in transit (TLS 1.2+)
    [Enterprise Privacy portal](https://openai.com/enterprise-privacy)
    Hopefully, this post has given you some insights into privacy in ChatGPT Team and Enterprise and its opt-in model. We’ve analyzed services designed for business. **In another blog post, I dived into the last enterprise solution proposed by OpenAI**. This is OpenAI API which grants the best possibilities when it comes to data control & privacy. I **compared it with Azure OpenAI** service which is a common alternative when using API. **Read more blog posts about OpenAI Privacy Policy:** [OpenAI ChatGPT Free & Plus Privacy Policies Explained](/blog/openai-chatgpt-free-plus-privacy-policies-explained/) [OpenAI API Privacy Policies Explained](/blog/openai-api-privacy-policies-explained/) [Azure OpenAI Service Privacy Policies Explained](/blog/azure-openai-service-privacy-policies-explained/) ## Bright Inventions Recognized in Forbes Diamonds 2024 *Published: 2024-01-25 | Author: ula | Tags: bright insights, company update* *Source: https://brightinventions.pl/blog/bright-inventions-recognized-in-forbes-diamonds-2024/index.md* We are happy and proud to announce that our company has been recognised in the[ **Forbes Diamonds 2024**](https://www.forbes.pl/diamenty/wizytowki/2024/bright-inventions/k961016) ranking. **Big shoutout to the positive, responsible, and flexible people who create our Bright Team - you make this organisation what it is. 🧡** We would not have come this far without each and every one of you! This recognition solidifies our position among **Poland's fastest-growing companies**. We value the ongoing, steady growth and progress we have achieved across all aspects of our business. **Our strategic approach not only supports sustainable expansion but also fuels ongoing initiatives to build [a unique company culture based on the values we all share](https://brightinventions.pl/about-us/#core-values).** None of this would be possible without the resolute determination and commitment of our entire team. 
    ![bright team 2024](../../static/images/collage-bright-team-2024.jpg "")
    ## About Forbes Diamonds The Forbes Diamond stands as a prestigious accolade for the most dynamically evolving private companies in Poland. Collaboratively curated by the Forbes editorial team and Dun & Bradstreet Poland, the list of "Diamonds" comprises companies that have experienced the most rapid increase in value over the last three years. To earn the Forbes Diamond, companies must demonstrate a positive financial outcome, with a cooperation risk factor higher than 4, as evaluated by the Dun & Bradstreet Poland rating. ## Our bright DNA Since the founding of the company in 2012 we have already implemented dozens of innovative projects, ranging from monitoring athletes' activities, smart home solutions, payment systems, logistics support tools, to emergency notification systems assisting in handling emergency hotline calls in critical situations. **However, Bright Inventions, apart from innovative and reliable solutions, is above all about creative individuals and long-term relationships.** For many years, a clear and dynamic work culture has been shaping here, breaking the mould of traditional tech companies. **Bright Inventions is, above all, a team – not a random group of engineers but a community of true enthusiasts collaborating for many years.** **The values like responsibility, flexibility, a positive approach, and a strong customer focus accompany team members in every aspect of the company's operations, from recruitment activities and project management to client communication.** ## Our strategic focus We have extensive experience in [modernizing and rescuing systems](/our-areas/app-modernization/) that are not compatible with user needs or market demands. **It happens that we take on endangered projects facing imminent issues of instability and performance.** Information systems created by our team straightforwardly deliver advanced functionalities to users. Providing high-quality services and cultivating long-term relationships with clients pays off in trust and long-term collaboration.  We believe that every challenge is an opportunity to innovate and learn. Join us on this exciting journey towards a future where technology not only meets but exceeds expectations. Together we can create software that really matters in the today's world. For detailed information about the awards, visit **[Forbes Diamonds 2024](https://www.forbes.pl/diamenty-forbesa-2024).** ## OpenAI ChatGPT Free & Plus Privacy Policies Explained *Published: 2024-01-23 | Author: rafal h | Tags: AI, ChatGPT, OpenAI, LLM, privacy, security* *Source: https://brightinventions.pl/blog/openai-chatgpt-free-plus-privacy-policies-explained/index.md* **Have you ever wondered how to stop OpenAI from learning from your data while keeping the history of your chats? We’ve got the solution for that! As our apps are gaining superpowers by integrating and using OpenAI features we should stop for a moment and think about the privacy of various solutions. Hopefully, this blog post will help you make smart decisions and allay doubts. If you just want to understand the basic privacy rules of OpenAI solutions, this article is also for you.**
    ![OpenAI privacy](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/open_ai_privacy.png "")
    It is the start of 2024. You might remember that we had a [blog post](https://brightinventions.pl/blog/software-development-trends/) about development trends for 2023 - one of them was about GPT. Frankly speaking, this was quite a good prediction - GPT’s and OpenAI are taking the world. There are more and more use cases for LLM’s in the apps we create every day - summary of the text, similarity check or sentiment analysis. We have started to use them for chatbots, virtual copilots or assistants to ease our everyday lives. LLM field of development is moving at a very fast pace, giving out new exciting features every day. Every day, new LLM solutions are deployed, both closed source like Bard from Google (with PaLM and Gemini), Claude from Anthropic and open source like LLama from Meta or Mistral. Still, LLMs are often associated with OpenAI company. That might be due to the fact that their solution was first in the market, they tend to have developed unbeatable GPT-4 (which competition claims (or not?) to overrun) and easy, straightforward access to API. They are also backed up by Mircosoft gigant, both in founding and infrastructure. Generally speaking, OpenAI is a default “goto” address for anybody who would like to use LLM or integrate it into his app. Having that in mind, **I will describe most of the relevant OpenAI solutions from the least private to the most private ones**. Please note though that in the end if your use case is a complicated one you should consult a lawyer and OpenAI yourself :). ## OpenAI Trust Portal **[This](https://trust.openai.com/) is your go-to place for privacy and security when it comes to OpenAI**. Upon this page, we can see that OpenAI is CCPA, GDPR, SOC2 and SOC3 compliant (OpenAI not ChatGPT - please note the difference). You can download or request security papers from OpenAI. You can see the status of their infrastructure, all privacy policies, PII usage, data processing agreement or terms of service. It’s highly recommended to start your privacy journey here! ## ChatGPT Free Privacy and Data Security With the free version of ChatGPT via web panel, you can use GPT-3.5 chats. Also, recently it should allow you to use Whisper API via iOS and Android WebApps. **By default, it keeps a history of your chats**. ChatGPT web has an opt-out model of data processing which you submit. On their page we can read
    When you use our non-API consumer services ChatGPT or Labs, we may use the data you provide us to improve our models.
    [OpenAI trust portal](https://trust.openai.com/?itemName=data_privacy&source=click)
    that simply means that data you submit can be used to train the model. If you wonder how the data you provide is stored/processed later they say,
    We remove any personally identifiable information from data we intend to use to improve model performance. We also only use a small sampling of data per customer for our efforts to improve model performance.
    [OpenAI trust portal](https://trust.openai.com/?itemName=data_privacy&source=click)
    You can opt out of this behavior in the settings of your ChatGPT profile:
    ![ChatGpt history training](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/ChatGPT_history_training.png "")
    *Opt-out from model training* What is important to mention is that:
    This setting does not sync across browsers or devices. You will have to disable chat & history on each device/browser.
    [OpenAI help portal](https://help.openai.com/en/articles/7730893-data-controls-faq)
    The downside of this approach is that **you will not have access to the history of your chats. Another option to opt out but keeping the history saved is**:
    In the meantime, you can opt out from our use of your data to improve our services by filling out this form. Once you submit the form, new conversations will not be used to train our models.
    [OpenAI help portal](https://help.openai.com/en/articles/7730893-data-controls-faq)
    On [this](https://privacy.openai.com/) page you can make a privacy request for your account. What is worth mentioning, is that when you submit a request and it is accepted, nothing changes from a UI/UX perspective in your account - you have still the possibility to toggle chat history & training but it is not doing anything as you have already opted-out from data processing.
    ![OpenAI message when you opt out from training](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/OpenAI_support_message.png "")
    *Successfully opted-out message from support*
    ![ChatGpt history training](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/OpenAI_settings.png "")
    *Account settings* As you can see, even though I opted out of training the data it is still visible in the UI (but actually data is not used for training). A conversation with the support team has confirmed it:
    ![Support conversation about training](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/OpenAI_support_response.png "")
    *Support conversation* Also important fact is that upon submitting the request you:
    understand that this request applies moving forward and does not apply to data that was previously disassociated from my account
    so this request is in force only for future data. In the end, when you opt-out of model training with your data and:
    When chat history is disabled, we will retain new conversations for 30 days and review them only when needed to monitor for abuse, before permanently deleting.
    [OpenAI help portal](https://help.openai.com/en/articles/7730893-data-controls-faq)
    This is the maximum we can do here as the zero data policy (which we will talk about later) does not apply here.
    Note that this data policy does not apply to OpenAI's non-API consumer services like ChatGPT or DALL·E Labs.
    [OpenAI moderation](https://platform.openai.com/docs/models/moderation)
    Most probably, during these 30 days it is viewed either by:
    A limited number of authorized OpenAI personnel, as well as trusted service providers that are subject to confidentiality and security obligations, may access user content only as needed for these reasons: (1) investigating abuse or a security incident; (2) to provide support to you if you reach out to us with questions about your account; (3) to handle legal matters; or (4) to improve model performance (unless you have opted out). Access to content is subject to technical access controls and limited only to authorized personnel on a need-to-know basis.
    [OpenAI help portal](https://help.openai.com/en/articles/7039943-data-usage-for-consumer-services-faq)
    An additional question is - how long my data is stored when I opt-out from data training and I do not disable history? Here’s the info that OpenAI provides on a matter:
    Deleted chats are hard deleted from our systems within 30 days, unless they have been de-identified and disassociated from your account. If you have not opted out, we may use these de-identified chats for training to improve model performance.
    [OpenAI help portal](https://help.openai.com/en/articles/8809935-how-chat-retention-works-in-chatgpt)
    You have option to toggle delete all chats from preferences of your account. Also, you delete all of data by simply deleting the account. In dialog when deleting account we can see:
    Your data will be deleted within 30 days, except we may retain a limited set of data for longer where required or permitted by law.
    [OpenAI help portal](https://help.openai.com/en/articles/6378407-how-to-delete-your-account)
    !\[ChatGpt history training](../../static/images/openai-chatgpt-free-plus-privacy-policies-explained/OpenAI_delete_account.png "")
    \*Delete account prompt\* ## ChatGPT Plus Privacy and Data Security Compared to ChatGPT Free, with ChatGPT Plus you can use GPT-4, create DALEE3 images, search with Bing or recently create & use your own GPTs. Apart from all the information provided for ChatGPT Free which applies here, what is important to mention is your own ChatGPT retention. As mentioned, **you have a possibility to create your GPT with data knowledge of files with your selection**. As noted in OpenAI community portal, when you create your own GPT, by default:
    Use conversation data in your GPT to improve our models.
    [OpenAI community](https://community.openai.com/t/data-privacy-for-latest-features-gpts-and-assistants/493023/4)
    is selected. It is unclear if the option of opt-out mentioned in the GPT Free section overrides this selection or not, so if you do not wish to share the data, simply deselect the option. Also, for the files uploaded via UI input prompt or knowledge for custom GPT we can see that:
    Files processed via ADA / Document Analysis, and when chatting with a custom GPT (not uploaded as knowledge in GPT config): Retained for 3 hours. Images processed via Vision and Files uploaded as knowledge to custom GPT: Retained indefinitely.
    [OpenAI help portal](https://help.openai.com/en/articles/8555545-file-uploads-faq)
    Hopefully this post has given you some insights on privacy in ChatGPT Free and Plus and its opt-out model. If you want to dive into enterprise solutions proposed by OpenAI, read our another blog post about recently introduced ChatGPT Teams and ChatGPT Enterprise plans. Both of those solutions give us better privacy controls than when using individual subscriptions. **Read more blog posts about OpenAI Privacy Policy:** [OpenAI ChatGPT Team & Enterprise Privacy Terms Explained](/blog/openai-chatgpt-team-enterprise-privacy-policies-explained/) [OpenAI API Privacy Policies Explained](/blog/openai-api-privacy-policies-explained/) [Azure OpenAI Service Privacy Policies Explained](/blog/azure-openai-service-privacy-policies-explained/) ## Retrieval Augmented Generation (RAG) in Machine Learning Explained *Published: 2024-01-22 | Author: pawel-p | Tags: AI, Embeddings, machine learning, Retrieval Augmented Generation, RAG* *Source: https://brightinventions.pl/blog/retrieval-augmented-generation-in-machine-learning/index.md* **Imagine that your company has access to a powerful AI tool that can process vast amounts of data and extract significant conclusions, identify key information, and effectively summarize it. Such capabilities could significantly enhance the efficiency of your employees' work, allowing them to focus on the most valuable aspects of their job, rather than on time-consuming data processing. In this context, Retrieval Augmented Generation (RAG) opens new perspectives. RAG allows for the integration of AI models with specific, internal data of your company, enabling not only processing but also intelligent interpretation and utilization of this knowledge. In this article, we will explore how to accomplish this.**
    ![Retrieval Augmented Generation (RAG) in Machine Learning](../../static/images/rag_blog_cover.png "")
    ## Retrieval Augmented Generation (RAG) definition **RAG** is a technique that allows expanding the knowledge of the pre-trained language model with real-time information retrieval from a large database of documents.   The basic prompt schema for querying a machine learning model looks like this:
    ![Simple query prompt scheme with LLM answer](../../static/images/rag1.png "")
    In this situation, we ask the machine learning model about the capital of Poland. This is general knowledge, and our model has no problems with the answer. ## Going deeper with Retrieval Augmented Generation in machine learning Fancy to go deeper with this simple example? Let's say we would like to have a machine learning model that can answer questions about the plot of our original, never-published 300-page book titled 'My Story,' the only source of which is a .pdf file on our private laptop. Therefore, there is no chance that the model came into contact with this book during training, nor is there any chance it could find any information about it elsewhere. If we asked the learning model about this story, the model could not answer it. This is how it would look:
    ![Query prompt scheme without required context ](../../static/images/rag2.png "")
    In such a situation, **Retrieval Augmented Generation (RAG) comes to the rescue.** We can simply expand the knowledge of the machine learning model by adding contextual information to the prompt. In theory, it would look as follows:
    ![Simplified query prompt + RAG scheme](../../static/images/rag3.png "")
    In theory, it would work. The model receives our query along with the entire book, so it now knows the story and can answer our query. However, **there is a practical problem with this solution.** The number of tokens that we can use with one prompt is limited. For example, **for ChatGPT-4, this limit is 8192 tokens; even for GPT-4 Turbo, the limit is 128,000 tokens.** Let's assume that one page of our book has an average of 500 words. 300 pages times 500 words equals 150,000 words in the entire book. We should remember that the number of used tokens consists of the prompt query, prompt context, and the machine learning model's answer.
    ![Token consumption formula](../../static/images/rag4.png "")
    This amounts to 150,000 tokens for the context alone. By adding the prompt query and the machine learning model's answer, the total will be even higher. Even if sending such a prompt were possible, it would simply be a waste of resources and money. We don’t need the entire context of the book to answer our queries. **It seems obvious that we need to divide our book into chunks,** and for the context of the prompt, attach only those chunks that are relevant to our question. Dividing the text into chunks is a simple task, **but how do we determine which parts are necessary to get the answer to our query?** Here, the technique of representing text as numerical vectors, known as embeddings, comes to the rescue. There is another blog post where you can learn more details about [how embeddings work](/blog/understanding-embeddings-a-short-guide-with-an-example/). For now, it's enough to understand that **embedding is a technique that converts text into numerical vectors, which retain the meaning of the converted sentence.** Depending on the sentence's meaning, these vectors are positioned at specific locations in the vector space. So, now we know that before running our prompt, we have to first prepare the data (the book in our case) by dividing it into chunks, converting them into numeric vectors with the embedding technique, and saving them in a vector database. This process looks like this:
    ![Conversion scheme from pdf to vector database](../../static/images/rag5.png "")
    Great! We have prepared our data so that we can easily find exactly the parts of the book that are useful for our query. With this knowledge and the data prepared, let's start the process of obtaining answers from the machine learning model once again. The image below describes all the steps undertaken during this process.
    ![The whole RAG process scheme](../../static/images/rag6.png "")
    ## Finding the Balance in Software Testing and Life. Meet Małgosia *Published: 2024-01-19 | Author: malgorzata-z | Tags: bright story, bright insights* *Source: https://brightinventions.pl/blog/finding-balance-in-software-testing-and-life-malgosia/index.md* **Nearly 9 years ago, Małgosia decided to transition into QA engineering, long before it became a trend. Once she discovered her passion for automated testing, there was no turning back. Now, she thrives on tackling daily challenges, from balancing the right test coverage to building robust relationships with developers. Dive into Małgosia's career story to explore her journey!**
    ![QA Engineer career story](../../static/images/brightstorymalgosiacollage.png "QA Engineer career story")
    I think I was among the first people who tried switching to software development before it became popular. At that time (about 9 years ago), I didn't know any success stories of such a transition; in fact, I had only heard about failures. But I still wanted to give it a try. So, I committed fully to this new path — **I quit my job and dedicated my time to learning every day**. Initially, my goal was to become a software developer. After two months of intensive learning, I began job hunting. I even received a software developer job offer. However, during this period, **I started writing my first automated tests, and it completely captivated me**. **I found immense enjoyment in it**. As a result, I turned down the software developer job and instead sought out a QA position. **Fortunately, I found a place where I could engage in writing automated tests right from the start**. ## I assume that back then there weren’t many software testers in the teams? Oh yes, **I was the only tester in the team**. There was another tester in the company where I worked but I didn't know many other QA Engineers back then. Obviously, **the situation is quite different now**. ## What aspects of the QA job give you the most satisfaction? What drives me in my QA role is the unique set of challenges each project presents, **pushing me to constantly rethink testing and automation strategies**. Every project offers the **opportunity to find the perfect balance between manual and automated testing** and to select the right types of tests that are easy to maintain, credible, and reliable. Throughout my career, I've encountered the mindset that 'we don’t have time to write automated tests,' but in reality, automation actually saves time. When we're not required to test everything manually, the quality of the product usually improves. Reaching this point in a project is incredibly satisfying. 🙂 ## What is your recipe for successful cooperation with programmers? **It’s a continuous learning process because throughout your career, you work with various people, each with different personalities**. Everyone has their own priorities in projects, and sometimes it can be challenging to persuade someone to see things from your perspective and to focus on your priorities. What I’ve learned recently is that people can interpret your words differently. For instance, if I say something in a meeting, 2 out of 3 people might understand it in a way that's completely different from what I intended. Therefore, **it’s crucial to work on balancing your words and ensuring clear communication**. *Read Małgosia’s and Michał’s blog posts on [successful dev-QA relations](/blog/communication-challenges-faced-by-developers-and-testers/).*
    ![Małgosia's quote on communication](../../static/images/malgosia_quote_communication.png "Małgosia's quote on communication")
    ## How do you react when a developer says 'It’s not a bug, it’s a feature'? I haven't heard that phrase much lately. It seemed more common among developers who were just starting in the industry. However, if I encounter that statement, **the first thing I do is to verify if it actually is a feature**. This is quite straightforward - you can always compare the current product with earlier versions. **If I still believe it's a bug, I'll present my arguments and then listen to the developer's perspective. We then discuss and work towards a solution together**. In situations like this, **[empathy](/blog/three-dimensions-of-empathy/) is crucial — understanding the developer's viewpoint, listening to their arguments, and trying to grasp why they might see things differently**. If I'm convinced that something could compromise the quality of the product, I'll stand firm in my position. Yet if it turns out that my assessment was incorrect, I'll certainly let it go. ## What types of automated tests do you value the most? **I value API tests the most due to their stability, accuracy, speed, cost-effectiveness, and broad applicability**. They **provide a sense of security**, which I believe is crucial for every QA Engineer. Of course, UI tests are essential too, but they serve a different purpose and can be somewhat 'flaky'. They often fail in the pipeline, not necessarily due to bugs. This inconsistency makes them less reliable in terms of providing a sense of security, so it's harder to trust them as compared to API tests.
    ![Małgosia's quote on AP tests](../../static/images/malgosia_quote_api_tests.png "Małgosia's quote on AP tests")
    ## There is an ongoing recruitment process for QA Engineer at Bright Inventions. What advice could you give to candidates? In my opinion, **the ideal candidate should be adaptable to changes and various project dynamics**, because at Bright Inventions, we are flexible and strive to adjust to the specific needs of our clients and projects. **This person also needs to have a strong desire to develop as a tester, be eager to learn, and be prepared to work with different people and personalities**. So, I guess they should also be **open to speaking their mind and sharing their ideas and knowledge**.
    ![During a team retreat in the center of Gdańsk.](../../static/images/malgosia_team_retreat.png "During a team retreat in the center of Gdańsk.")
    *
    During a team retreat in the center of Gdańsk.
    * ## And how do you recall your recruitment process at Bright Inventions? I wasn't actually planning to change my job. **When Agata approached me on LinkedIn, I responded as I usually did — politely declining with a thank you**. However, her response to my decline piqued my interest. **I won't give away her secret methods, but she somehow managed to convince me to attend an interview**, and eventually, I ended up joining the team here.
    ![Another team retreat. :)](../../static/images/malgosia_team_retreat_forest.png "Another team retreat. :)")
    *
    Another team retreat. :)
    * ## How do you spend your spare time? I spend it actively, for sure. **I'm really into running. I've always enjoyed it but never had someone to share this passion with until I joined the running workouts at Bright Inventions**. Thanks to our trainer, [Bartosz Banach](https://bartoszbanach.pl/), and his coaching, I was able to finish a marathon.
    ![Małgosia and Filip from Bright Inventions at a running event.](../../static/images/running.png "Małgosia and Filip from Bright Inventions at a running event.")
    *
    Małgosia and Filip from Bright Inventions at a running event.
    * **I'm also quite a health lifestyle enthusiast**. I love reading about nutrition, diets, self-care, and more. I aim to spend my free time actively and meaningfully, so I don't use Netflix, and I generally avoid watching TV series or movies. ## Not at all? Well, maybe sometimes. 😄 I just need to control myself because once I start a series, I tend to binge-watch it right away. So, I prefer not to start watching anything at all... ## Understanding Embeddings: A Short Guide with an Example *Published: 2024-01-16 | Author: pawel-p | Tags: AI, Embeddings* *Source: https://brightinventions.pl/blog/understanding-embeddings-a-short-guide-with-an-example/index.md* **Embeddings are an invisible, yet important part of many technologies we encounter. From internet search engines, through recommendation systems and advertisement personalization, to advanced analyses of images, videos, and technologies for speech and sound recognition – embeddings play a key role everywhere. In this article, we will explain how embeddings work and how they facilitate, and enrich our daily experiences with technology.**
    ![Embedding explained](../../static/images/embeddings_blog_cover.png "Embedding explained")
    As I mentioned above, vector embeddings are a popular technique to represent information in a format (typically as a vector of numerical values) that can be easily processed by algorithms, especially deep learning models. This ‘information’ can be text, pictures, video, and audio.\ \ For example, the conversion of the word 'dog' into a numerical vector representation could look like this:
    ![embeddings convert process](../../static/images/embeddings_model.png "embeddings convert process")
    ## What is the embedding dimension? **A crucial factor in determining the quality and effectiveness of the embedding is the embedding dimension. Generally, the term 'dimensionality of word embedding' refers to the total count of dimensions used to define a word's vector representation.** This number is usually established during the development of the word embedding and indicates how many distinct features are included in the vector representation of the word. For text embeddings, these vectors are constructed in a way that captures the semantic meaning of the text. This ensures that words or sentences conveying similar meanings are close to each other in the embedded space, often referred to as a vector space. ## What does that mean? Here’s a simple example Let's say we have a space with only two dimensions - \[x, y], where x represents sex and y represents activity.
    ![embeddings dimensional space](../../static/images/embeddings_dimension_example.png "embeddings dimensional space")
    \ Now, for example, by asking the question 'Who is walking?' the embeddings will search for vectors that include the 'Walk' sentence in the y dimension.
    ![embeddings dimensional space with similarity comprasion](../../static/images/embeddings_dimension_vector_example.png "embeddings dimensional space with similarity comprasion")
    We can observe that the sentence "Walk" is associated with a woman, a man, a boy, and a girl. This means that all of them are walking. And thus, we get our answer: A woman, a man, a boy, and a girl are walking.   Remember, this is a very simplified example with only two dimensions of meaning. In reality, the more such dimensions there are, the better our embedding is at guessing the meanings of saved sentences as words or phrases. ## Ready for more embedding tutorials? Delve deeper into various applications of embedding in AI: [Retrieval Augmented Generation (RAG) in Machine Learning Explained](/blog/retrieval-augmented-generation-in-machine-learning/) More to come! ## Introducing LangChain Agents: 2024 Tutorial with Example *Published: 2024-01-11 | Author: rafal-w | Tags: langchain, python, AI* *Source: https://brightinventions.pl/blog/introducing-langchain-agents-tutorial-with-example/index.md* **Discover the ultimate guide to LangChain agents. This tutorial, published following the release of LangChain 0.1.0 in January 2024, is your key to creating your first agent with Python. Stay ahead with this up-to-the-minute resource and start your LLM development journey now.**
    ![Langchain agents](../../static/images/langchain_agents_blog.png "")
    ## What is LangChain agent? **The idea behind the agent in LangChain is to utilize a language model along with a sequence of actions to take**. The agent is using a reasoning engine to determine which actions to take to get a result. Agents are crucial for handling tasks ranging from simple automated responses to complex, context-aware interactions. For example, you may have an agent integrated with Google Search, Wikipedia and OpenAI LLM. With given agent tools, they can search for results in Google, then use retrieved context in Wikipedia tool to find detailed information and expand the context. Bear in mind that **you have to put clearly defined instructions to make sure that the agent will invoke tools in a proper order**. The illustration presents the example of agent and his components:
    ![Agent with all components](../../static/images/llm_agents.png "Agent with all components")
    ## Boosting your agent You may be wondering, ‘Why I cannot use simple LLM to get my questions answered?’ There might be situations, where used LLM model has old data or you have to provide some internal data (and use [embedding](/blog/understanding-embeddings-a-short-guide-with-an-example/) to find similarity).  **Explore these examples of features that can boost your agent:** **1. Web search tool** You can easily add different types of web search as an available action to your agent. It might be Google Search, Tavily Search, DuckDuckGo and many others. **2. Embedding search in vector database** You can create a tool from retriever and describe it as you need, so the agent will use this tool to get some kind of data doing e.g. similarity check and embedding model. **3. Doing some actions** Your agent can be multipurpose one. For example, it might be searching for some kind of information on the internet, doing the reasoning step, and after all invoking action to create a Jira issue. **4. API integration tool** There are many API integration done for the LangChain framework, all you need to do is take the API key, install the package and attach the tool to the agent. **5. Custom tool** You can write your own tool, refer to the documentation to see how to do it. It might be integration with your internal API, your document system, and many others! ## LangChain Agent vs. Chain Besides having agents, LangChain also supports the idea of a Chain. **Chain is a subsequence of actions to take, always in a hardcoded manner.** This is the crucial difference between an agent and a chain. While in the agent, the reasoning model may choose other actions (from given tools) to fetch specific data, the chain will always take the same path that we have chosen. **Advantages of agents compared to chains:** 1. Based on the description of tools, the agent decides which tool should be used to get relevant information. 2. Agent takes actions and takes the context of the given result to e.g. search for other information in other resources (like for example Google Search and Wikipedia). 3. The agent checks the results and repeats the process to get the desired data. ## The main goal of using agents When you’re building your own AI LangChain solution, you need to be aware if using an agent is the way you want to go.  If your use case is always based on the same flow and strategy, for example: 1. First step: web search. 2. Second step: internal vector database text embedding. 3. Reasoning. Then you might consider using chains instead of agents. Agent cost is unpredictable because some questions might be answered directly after e.g. call to one tool, while others might use a comprehensive set of tools to do proper reasoning. If your use case is based on determining things from different sources (called tools), then an agent seems to be a great solution. On the other hand, one agent type uses a single tool to divide a complex query into simpler ones, so that might also be another criterion for deciding whether to use chain or agent.
    ![LangChain agent loop](../../static/images/llm_agents_loop.png "")
    ## LangChain Agent types LangChain categorizes agents based on several dimensions: \- model type; \- support for chat history; \- multi-input tools; \- parallel function calling; \- required model parameters. It is important to choose the option that fits to your use case: **1. OpenAI functions**  There are certain models fine-tuned where input is a bit different than usual. There are special functions that can be called and the role of this agent is to determine when it should be invoked. This agent is designed to work with this kind of OpenAI model. It supports chat history. **2. OpenAI tools**  This agent is designed to work with OpenAI tools, so its role is to interact and determine whether to use e.g. image generation tool or another built-in one. The main difference between OpenAI function is the fact that the function is trying to find the best fitting algorithm/part of an algorithm to do better reasoning, while OpenAI tool is about built-in tools like image generation, and executing code. It supports chat history. **3. XML Agent**  There are models, where reasoning/writing XML is on a very advanced level (a good example is Anthropic Claude's model). If you're operating on XML files, that might be the right one to be considered. It supports chat history. **4. JSON Chat Agent** Several LLMs available in the market are particularly handy when it comes to reading JSON. JSON is also a very common standard of some e.g. entity representation. If you're building some kind of integration that operates on JSON files and the model is supporting it, you can try to use this agent. It supports chat history. **5. Structured chat**  Intended for multi-input tools. It supports chat history. **6. ReAct agent** Made for simple models (LLM - not conversational). It supports chat history. **7. Self-ask with search** This kind of agent supports only one tool as an input. The main goal is to divide your query into smaller ones, use tools to get the answer, and then combine it into a full answer to your question. This kind of agent doesn’t support chat history. ## Tools Tools are the main components of agents that perform individual tasks. It may be web search, vector database search, or any other action. You can choose from many complete tools done by the community or write your own. LangChain also features a highly useful capability to create tools from retrievers:  ```python tool = create_retriever_tool( retriever, name="companies_database", description="Useful when you need to find information about company." ) ``` Where retriever might be created from Chroma in-memory database: ```python retriever = Chroma.from_documents(documents_list, embedding_function).as_retriever() ``` It is very important to create a good description of retriever tool like in this example because agent step decision mechanism is based on that. If your description is missing or incomplete, it might result in skipping the action taken by the agent. It’s worth mentioning that the tool name should be also unique. ## Toolkits Toolkits are the combination of tools with predefined actions that can be used in our agent. Usually, they're assembled to the specific domain. There are different examples: \- **CSV** agent toolkit to operate on \`CSV\` files (read, write), \- **Github** agent toolkit that has implemented different operations on Github, e.g. creating new issues, creating new pull requests, and so on. Compared to the tools, toolkits have an implementation of several actions. ## Creating your first LangChain agent Prerequisites: * Tavily API token * OpenAI API token * Python v3.11 * Pip packages: langchain (at least v0.1.0), openai, wikipedia, langchain-community, tavily-python, langchainhub, langchain-openai, python-dotenv First, install pip packages: ```shell ! pip install langchain==0.1.0 wikipedia==1.4.0 langchain-community=0.0.10 tavily-python==0.3.0 langchainhub==0.1.14 langchain-openai==0.0.2 openai==1.7.0 python-dotenv==1.0.0 ``` At this point you have to choose: * LLM that you wanted to use (e.g. ChatOpenAI); * agent type (more on that is covered in agent types section); * tools. Now you can combine everything: ```python from dotenv import load_dotenv from langchain import hub from langchain.agents import AgentExecutor, create_openai_functions_agent, load_tools from langchain.tools.tavily_search import TavilySearchResults from langchain.utilities.tavily_search import TavilySearchAPIWrapper from langchain_openai import ChatOpenAI load_dotenv() def get_function_tools(): search = TavilySearchAPIWrapper() tavily_tool = TavilySearchResults(api_wrapper=search) tools = [ tavily_tool ] tools.extend(load_tools(['wikipedia'])) return tools def init_action(): llm = ChatOpenAI(model="gpt-4", temperature=0.1) prompt = hub.pull("hwchase17/openai-functions-agent") tools = get_function_tools() agent = create_openai_functions_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) agent_executor.invoke({"input": "Who is the owner of Tesla company? Let me know details about owner."}) init_action() ``` Dotenv file should have following envs: ```dotenv TAVILY_API_KEY= OPENAI_API_KEY= ``` Example answer using above agent configuration: > Elon Musk is the owner of Tesla, Inc. He is a businessman and investor who is also the founder, chairman, CEO, and chief technology officer of SpaceX. He is also an angel investor, CEO, product architect, and former chairman of Tesla, Inc. He is also the owner, chairman, and CTO of X Corp., founder of the Boring Company and xAI, co-founder of Neuralink and OpenAI, and president of the Musk Foundation. > > Elon Musk was born on June 28, 1971, in Pretoria, South Africa. He immigrated to Canada at age 18, acquiring citizenship through his Canadian-born mother. He later attended Queen's University at Kingston in Canada and the University of Pennsylvania, where he received bachelor's degrees in economics and physics. He moved to California in 1995 to attend Stanford University but dropped out after two days to co-found the online city guide software company Zip2 with his brother Kimbal. > > Musk became an early investor in electric vehicle manufacturer Tesla Motors, Inc. (now Tesla, Inc.) in 2004. He became its chairman and product architect, assuming the position of CEO in 2008. In 2006, Musk helped create SolarCity, a solar-energy company that was acquired by Tesla in 2016 and became Tesla Energy. > > Musk is known for his polarizing views and has been criticized for making unscientific and misleading statements. In 2018, the U.S. Securities and Exchange Commission (SEC) sued him for falsely tweeting that he had secured funding for a private takeover of Tesla. To settle the case, Musk stepped down as the chairman of Tesla and paid a $20 million fine. > > As of December 2023, he is the wealthiest person in the world, with an estimated net worth of US$232 billion according to the Bloomberg Billionaires Index, and $254 billion according to Forbes, primarily from his ownership stakes in Tesla and SpaceX. ## Agent Executor From LangChain **v0.1.0** version, the recommended way of creating new agents is to use AgentExecutor. You can easily define your executor by passing agents and tools. The old way of using **initialize_agent** is marked as deprecated from **v0.1.0** version. ```python agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) ``` ## Defining prompt LangChain **v0.1.0** version provided a new approach of initializing agents. Instead of using **initialize_agent**, we have to use a clearly defined method for every type. There is an additional parameter called `prompt`. We can use the default prompt (you can refer to the [documentation](https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent#create-agent) to see a prompt for every agent). Example of default prompt for OpenAI functions agent: ```python prompt = hub.pull("hwchase17/openai-functions-agent") ``` If you’re not planning to override the default prompt - provide a default one accordingly. ## Ready to build your custom agent in LangChain? I believe you are! In case you have any questions, just let me know in the comments. Hungry for more LangChain tutorials? [Build LLM application in Python using LangChain and RAG](/blog/build-llm-application-with-rag-langchain/). ## Dispute Resolution Solution in Blockchain with Bright Disputes *Published: 2024-01-10 | Author: kasia | Tags: rust, blockchain, Substrate* *Source: https://brightinventions.pl/blog/dispute-resolution-solution-in-blockchain-with-bright-disputes/index.md* **In the innovative world of blockchain technology, smart contracts are revolutionizing how we think about legal agreements and dispute resolution. Bright Disputes is a decentralized application (dApp) designed to address and resolve conflicts on Substrate-based blockchains. Let's delve into how this solution, encapsulated in smart contract code written in the programming language Ink!, promises to bring fairness and privacy to the forefront of digital disagreements.** ### **Understanding the Participants** In the realm of Bright Disputes, there are several key roles: * Owner: This is the individual who initiates a dispute. * Contractor: The party involved in the dispute, typically against whom the dispute is raised. * Judge: The entity responsible for tallying votes. * Jury: Those who vote in the dispute, supporting one side or the other. The process begins when an Owner raises a dispute, naming a Contractor to participate. Both parties are required to provide their perspectives on the conflict and pay the necessary fees to proceed. This initiates the dispute resolution process in earnest.
    ![BrightDisputesGeneral](../../static/images/brightdisputes2.png "BrightDisputesGeneral")
    ### Appointing the Arbiters A Judge and Jury are then randomly selected by the smart contract from a pool of candidates. They are tasked with assessing the case impartially. To confirm their roles, both Judge and Jury must place an escrow—a security deposit of sorts, ensuring they take their duties seriously. ### The Voting Phase After confirmation, the Jury votes in secrecy. Their votes are encrypted, ensuring that only the Judge can decrypt and count them. This phase is critical and relies on [zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)](/blog/zk-snarks-in-substrate-part-1/) to maintain the privacy of the voting process. ### Reaching a Verdict The Judge counts the votes and determines if there is a decisive majority (at least 70%). If not, the voting round is repeated with an increased by 2 Jury size. Throughout this process, the votes remain confidential, upholding the integrity of the system. ### Ensuring Fairness and Honesty To maintain honesty, zk-SNARKs are employed once more to prove the accuracy of the Judge's vote counting. This technology is pivotal, particularly when votes are too close to call, and rounds need to be repeated. ### Rewarding Justice Once a verdict is reached, the Judge and those Juries who were in the majority receive a portion of the dispute pool as compensation for their service. Conversely, Juries who found themselves in the minority are penalized by forfeiting their escrows. This not only rewards consensus but also discourages frivolous or dishonest voting. ### Integration with Job Advertising Platforms Bright Disputes is not just a theoretical construct but has practical applications. It can be seamlessly integrated with job advertising platforms like SubFunds, allowing for disputes to be raised and resolved within the ecosystem where contractors and clients interact. This was illustrated in the use case involving Bob (the job advertiser), Alice (the contractor), and Charlie (the judge).
    ![Integration with Job Advertising Platforms](../../static/images/brightdisputes1.png "Integration with Job Advertising Platforms")
    ### The Technical Prowess of Bright Disputes From a development standpoint, the most intriguing aspect of Bright Disputes is the implementation of zk-SNARKs within the Substrate framework. The privacy this technology affords is paramount in ensuring that Jury votes remain encrypted and that the Judge's integrity is beyond reproach. ### User Interaction with Bright Disputes For those involved, interacting with Bright Disputes is made user-friendly through a command-line interface (CLI) and the Polkadot.js dApp. This ensures that all parties, regardless of their technical expertise, can participate in the dispute resolution process. ### Conclusion Bright Disputes stands as a testament to blockchain's potential in addressing complex challenges like dispute resolution. By leveraging the transparency and immutability of blockchain with the privacy of zk-SNARKs, Bright Disputes offers a secure, fair, and confidential platform for resolving disputes in the digital age. ## Breaking Free: 10 Workplace Mind Games You Should Quit Now *Published: 2024-01-05 | Author: ula | Tags: communication, psychology, leadership* *Source: https://brightinventions.pl/blog/10-most-common-psychological-games-at-work/index.md* People put masks every day. They play games in private life and at work. They portray roles that span the spectrum from positive and constructive to negative and detrimental. At the workplace, it is a stage where we take on various roles—be such as all-knowing leader, the unyielding boss, the amiable manager, the considerate colleague, and many more. **We wear masks to appear more professional, gain appreciation, prevent offense, remain diplomatic, or shield ourselves.** Mind games often involve deception and manipulation, leading to a breakdown of trust among team members. Trust is crucial for effective collaboration, and when it is compromised, it undermines the foundation of teamwork. Leaders or team members playing mind games may show favoritism, creating divisions within the team. People are less likely to collaborate effectively when they perceive hidden agendas or ulterior motives. This hinders the free flow of ideas and the willingness to work together toward common goals. Addressing mind games requires proactive measures such as promoting open communication, fostering a culture of trust, and providing conflict resolution mechanisms. **But first of all it requites recognition and self-awareness. As the complexity arises when we lose sight of our true selves beneath the masks, when manipulation takes precedence over authenticity, and when we want to win at all costs.** ## **why do we play?** **We play games to win. Usually people play mind games to win emotions.** Depending on the game they play they can win both positive and negative reactions. ### Among the most common “winnings” there can found: * improving own self-esteem at the expense of others,  * the humiliation of people you work with,  * causing unjustified guilt,  * justifying anger and unacceptable behaviours,  * maintaining self-image by ignoring someone’s feelings,  * getting praise you don’t deserve,   * feeding on popularity and other people’s attention.  The misfortune of the winning is that it often involves arousing negative feelings in others. ## **how did it start?** Probably the first person who wrote about playing psychological games by people was [Eric Berne ](https://www.itaaworld.org/eric-berne-founder) who is also the creator of transactional analysis. **Berne said that the reason why people play games is obtaining some kind of pay-off.** This pay-off might be both positive and negative external stimuli or reaction such as gesture, talk, emoticon etc. It can be  obtained either in face to face contact or online in a digital world. We just want to be important. We just want to be noticed. In fact, people have been always playing games - to win battles, to compete, to get promoted, but also to cooperate or build thrust. But the problem appears when we do not get what we want, when we don't get positive reactions we would feed on negative ones. **One of the first game everyone has played in life is drama triangle.** [The drama triangle](https://www.youtube.com/watch?v=E_XSeUYa0-8&t=104s) is a psychological model proposed by Stephen B. Karpman. **In the drama triangle we have three personas: victim, persecutor and rescuer - we can take the roles interchangeably depending on the circumstances.** You put a particular mask depending on the context you find yourself in. You are not always a victim or rescuer or persecutor. Your role changes.  
    ![drama triangle ](../../static/images/drama-triangle.webp "")
    ###### Source: [https://www.susannejegge.com/en/2019/05/29/drama-triangle-part-2](https://www.susannejegge.com/en/2019/05/29/drama-triangle-part-2/) Despite its potential risks and limitations - as the model implies a passive stance for individuals within the roles seen as acting out predetermined patterns - the drama triangle can be also used to gain insights about dysfunctional behaviours both in private and professional situations. If you want to use it, please be cautious to avoid any fixed judgements.  ## **most common psychological games at work 🔎** Very often psychological games in the workplace refer to interactions that involve hidden agendas, manipulation, power dynamics, and other subtle psychological tactics. The most common ones which I have observed and which can occur in many organisations are presented below. ### 1. The blame game It involves shifting blame or responsibility on others to avoid taking accountability for one's actions. **Blaming others help people protect their self-esteem. It allows them to maintain a positive self-image by casting themselves as the victim or the innocent party in a situation.** In fact we have a natural tendency to blame other people or circumstances when things go wrong. This inclinations is driven by **[the fundamental attribution bias](https://www.betterup.com/blog/fundamental-attribution-error)**. We tend to believe that what people do is a reflection of who they are, rather than considering there might be other factors affecting their behaviour. **Some individuals may resort to blaming others because they lack effective communication skills.** They may not know how to express their feelings or concerns in a constructive manner and instead resort to blame as a way of communicating their frustrations. ### 2. Scapegoating Similar as in the blame game scapegoating is **a psychological defense mechanism of denial through projecting responsibility and blame on others.** It happens mostly when someone blames a specific individual or group at work for larger issues or failures within the organization to divert attention from the real causes. ### 3. Office gossiping Spreading rumours or negative information about colleagues or clients is also **a type of psychological game, usually played to create tension and manipulate social dynamics.** Those who possess insider information or spread rumours may feel a sense of influence over others. Sometimes the person who spreads rumours plays also the role of victim from the drama triangle.  **In competitive workplaces, employees may engage in gossip to undermine or discredit their colleagues.** This can be driven by feelings of insecurity or a desire to gain a competitive advantage. We have to note that while gossiping may serve some entertainment and informational functions for people, in most cases it has negative consequences and leads to misunderstandings, conflicts, and a toxic work environment. ### 4.Passive-aggressive behaviour **When you indirectly express hostility or disagreement through subtle actions, sarcasm, or backhanded compliments you also play the game.** In this way you avoid honest and open communication of what you really want to achieve. Passive-aggressive behaviours in the workplace can manifest in various ways. Among the most common ones we can find:  😵‍💫 consistently delaying tasks or assignments without a valid reason, leading to missed deadlines and negatively affecting team productivity,  😵‍💫 offering compliments that are actually disguised criticism or sarcasm, 😵‍💫 sabotaging projects by withholding information, resources, or assistance,  😵‍💫 withholding information or updates with colleagues or team members, even when it's necessary for their work, 😵‍💫 undermining decisions made by other team members or management by expressing doubt, skepticism, or pessimism, which can erode trust and morale,  😵‍💫 complaining frequently about work-related issues without taking constructive action to address or resolve them, 😵‍💫 reacting defensively or dismissively to constructive feedback, making it challenging for others to provide input or suggestions, 😵‍💫 excluding certain colleagues or team members from meetings, discussions, or social activities as a form of passive-aggressive punishment. ### 5. Credit stealing Every now and then you can watch **people taking credit for someone else's work or ideas to enhance their own reputation**. I believe that many of them are doing that subconsciously. The sad truth behind it is that the credit stealing game is diminishing contribution of others a lot and in consequence makes them feel demotivated and annoyed. **Why do people hog credits? As in any game - to win.** Some have a strong desire for recognition and praise, and they take credit for others' work to boost their status and reputation within the organization. Some fear the consequences of making mistakes and they take credit for work they didn't do to avoid being associated with any potential failures or shortcomings. In some cases, individuals simply have a lack of ethical principles and are willing to engage in deceptive behaviors to achieve their goals or maintain their image. **In any form credit stealing is detrimental to the workplace relations, trust and morale. It can damage the best collaboration.**
    ![credit stealing](../../static/images/creadit-stealing-quote.png "")
    💡 **If you are not sure if you are a credit hogger, you can do a simple exercise proposed by Marshal Goldsmith in the article [Do You Work With a Credit Hog?](https://www.entrepreneur.com/growing-a-business/do-you-work-with-a-credit-hog/242380)** **published in *Entrepreneur* a few years ago.** Still very relevant.  ### 6. Playing favourites The game is played mainly by leaders, managers or bosses, but it also functions among co-workers. It can take form of assigning lighter workloads, interesting projects, or opportunities for skill development to favored individuals. Or it may be connected with promoting or giving career advancement opportunities primarily based on personal relationships rather than merit or qualifications. **In teams it may result in forming exclusive cliques or social circles where favored colleagues are included, and others feel left out or isolated.**
    ![playing favourites](../../static/images/favouritism.png "")
    **Favourism can also happen unintentionally as a cognitive bias powered by shared interests, personalities or backgrounds (more you can read [here](https://brightinventions.pl/blog/cognitive-bias-how-it-affects-our-hiring-decisions/)).**  Showing preferential treatment to certain team members while excluding or marginalising others always leads to divisions and resentment. 💡 If you experience favouritism in your team, remember you can always ask for constructive feedback from your manager on your performance. This shows your commitment to improvement and may help counteract any negative perceptions. ### 7. Micromanaging For some it might be surprising to find micromanagement here, but it is also a type of psychological game. **When you excessively monitor and control other people’s work, frequently you want to show your dominance or create a sense of dependency.** With a strong need for control micromanagers feel that things may go wrong without their direct oversight. **Their fear may result from a desire for perfection, lack of trust based on past experiences, mistakes or just insecurity of the own expertise.** In general, people who love micro managing believe that their involvement is essential for achieving positive results. On the other hand, we should not forget that micromanagers may be also under significant pressure to meet deadlines or achieve results. This pressure can make them more controlling as they try to ensure that everything goes according to plan. **Some of them may also lack the skills or knowledge to effectively delegate tasks or they are just new in the managerial world and they may micromanage until they gain more experience and self-assurance.** **One thing known for sure is that uncontrollable micromanagement can stifle employee autonomy, hinder creativity, and damage morale.** Employees often prefer a more hands-off approach from their managers. First of all, it allows them to take ownership of their work and feel reponsible for what they do. **Instead of micromanagement develop microencouragement in your team.** ❤️ ### 8. Martyrdom Kim Scott wrote [a very interesting article about navigating a work martyr culture](http://6%20Tips%20for%20Navigating%20a%20Work%20Martyr%20Culture), which main features are **working long hours, taking on excessive responsibilities, and portraying oneself as indispensable to gain recognition or manipulate sympathy. Work martyrs want to feel important and want to feel noticed. It is, however, essential to be aware of the fact that** leaving the martyr’s zone is not always easy for a person who is experiencing that.\*\* If in your case being a work matryr is connected with taking on your plate more than you can eat, you can try out the hints below: ✅ Learn to say ‘no’ to certain projects or activities, especially ones that are low stakes and take you off focusing on your priorities. You have to start asking yourself what kind of impact each of the has on you. ✅ Stop taking on other people’s feelings and setting boundaries. You can see and identify someone’s feelings without having to fix them or make them better. ✅ Share responsibility with others especially if you want them to grow. ✅ Stop micromanaging. ✅ [Take time off.](https://thecontextofthings.com/2016/08/20/work-martyr/) It pays off. 😉
    ![time off](../../static/images/holiday-time.png "")
    ###### Source: https://thecontextofthings.com/2016/08/20/work-martyr/ ### 9. Fear mongering Mostly present in the media, but we can also experience that at work. **[Fear mongering is a form of manipulation by exaggerating potential negative outcomes, rumours or consequences to influence decisions or actions of others.](https://www.forbes.com/sites/lizryan/2017/03/07/ten-unmistakable-signs-of-a-fear-based-workplace)** If you feel that fear mongering is present in your team, you can always try to take some step to mitigate it. **First of all, try to stay informed and be aware of the information being circulated and critically assess its accuracy and relevance.** Ensure you have reliable sources of information within the organization - not gossips. Regardless of your role (you don’t have to be a leader or manager to do that) - encourage open and transparent communication within your team so that people around you will feel comfortable sharing concerns and ideas without fear of retribution. What is also really valuable is challenging unsubstantiated claims. **If you next time encounter fear-mongering or baseless rumors, calmly and respectfully challenge them with facts and evidence. And if you see that fear-mongering originates from a lack of communication or unclear directives from leadership, seek clarification from higher-ups.** There is always something you can do to take the lead in implementing changes or improvements in the workplace.  ### 10. Psychological projection [It is a defence mechanism where individuals attribute their own undesirable traits, thoughts, or feelings to someone else.](https://personalitygrowth.com/what-is-psychological-projection/) That is why, it is said that people around us are a perfect mirror of our inner relationship with ourselves. [The psychological projection can manifest in various ways in the workplace. ](https://helpfulprofessor.com/psychological-projection-examples/)You can find there almost any games presented above such as blaming others (in psychological projection someone who is unwilling to accept responsibility for their mistakes may project their own errors onto coworkers), gossiping (it can be a form of projection, as individuals may project their own insecurities or frustrations onto others leading to rumours), micromanagement (leaders who struggles with trust issues may project their need for control onto their team resulting in micromanagement).   **[The other popular examples are:](https://brightside.me/articles/why-a-person-may-project-their-insecurities-onto-others-and-how-to-prevent-them-from-hurting-you-802645/)**  * judging co-workers (an employee who struggles with feelings of inadequacy might project their insecurities onto colleagues unfairly judging or criticizing their work),  * assuming that your team members have ulterior motives, even when there's no evidence to support such claims (for example, assuming a colleague is trying to sabotage your career),  * attributing your own emotions (misinterpreting colleagues' reactions and assuming they feel the same way),  * projecting your own insecurities onto colleagues, doubting their competence because your feel insecure about your abilities, * and many others.  ## **what can you do to stop playing games at work?** Our life is full of nonobjective facts, in fact it is full of beliefs which are not true. We use these beliefs to interpret the reality around us. **You have to be aware that when one thought appears in your mind and you believe it to be true - it becomes a belief. This belief will affect your behaviour. When you accept one belief as true, you will be doing everything to make it true.** It's important to recognize that playing any type of psychological game is generally connected with our beliefs, it is unproductive and can harm relationships, personal growth, and problem-solving. **Healthy communication, self-reflection, and accountability are better ways to address issues and conflicts than putting masks.**  Stopping psychological games at work requires a combination of individual and organisational efforts. Some strategies you can take up are: 👍 Increasing self-awareness by recognising your own behaviors and the impact they may have on others. 👍 Reflecting on your motivations and intentions in workplace interactions. 👍 Encouraging open and honest communication. 👍 Addressing issues directly and with empathy rather than resorting to passive-aggressive behaviours. 👍 Resolving conflicts in a constructive and transparent manner. 👍 Acknowledging and appreciating positive behaviors based on collaboration and support. 👍 Establishing regular feedback mechanisms. 👍 Stop gosspining, blaming and credit stealing. 👍 Raising awareness about the impact of psychological games.😉 **If you are aware that a game is happening, you can always refuse to play.** Stay mindful of what you do and focus on the goal of your work or organisational goals. **I personally cannot prevent other people from playing games, or attempting to hook me into their games. But I can refuse to play. When a player’s hook fails to catch me, the game is effectively broken.** Some game players simply go away in search of another player to hook. Others become upset when the game doesn’t turn out as they hoped. 💡 Now think for a moment about your own life. Which games are you playing at work? Are they really worth your time and energy? We should strive to know ourselves and learn to accept and manage our thoughts and feelings. It is not as anyone else would have us interpret them, **the key is to break the patterns.** ## Using AWS Cognito with NestJS *Published: 2020-01-04 | Author: patryk | Tags: aws, cognito, backend, nestjs, nodejs* *Source: https://brightinventions.pl/blog/using-cognito-with-nest-js/index.md* **AWS Cognito simplified the authentication, authorization and user management for you. In this post I will try to present how we can use this authentication service with your mobile app, website, and manage users.** [Download repository with Nestjs AWS Cognito example](https://github.com/bright/nestjs-aws-cognito) ## Initial work To get started with AWS Cognito we need to create a user pool. The user pool is a container that AWS Cognito uses to manage and hold users identify.\ \  In my case I don’t have any user pools, so I’m going to create one.
    ![create a user pool](../../static/images/image1.png "undefined")
    Here you are given two options to select from, let's select *Review defaults*. Make sure to provide a pool name as well. Next, we need to create an app client. The app client is the client that our NestJS server will be communicating with. Make sure to tick Enable sign-in API for server-based authentication for our NodeJS server access Cognito user pool for authentication. App clients can be created after the generation of user pools as well. So, if you forget to add an app client when the creation of the user pool - do not worry, you can create a new one again.
    ![AWS](../../static/images/image3.png "undefined")
    We leave `Generate client secret` unchecked as it is required for library we will use. Per `amazon-cognito-identity-js` documentation:
    When creating the App, the generate client secret box must be unchecked because the JavaScript SDK doesn't support apps that have a client secret.
    After successfully creating Pool and Client, copy `Pool Id` and `App Client Id` as we will need it for configuration.
    ![AWS](../../static/images/image2.png "undefined")
    *Pool Id*
    ![undefined](../../static/images/image4.png "undefined")
    *App Client Id* ## Creating TypeScript NestJS Server Ok, once we have completed the first part of the post which was creating a User Pool in Amazon Cognito, we can switch to creating the NestJS server which will use the Amazon Cognito user pool to authenticate users. The easiest way to set up the environment is to run commands to initialize the Nest app and allow us to install the required packages. I describe using npm to install packages, including the Nest CLI. Install the CLI globally using the `npm install -g` command (see the note above for details about global installs). So, we are adding the Nest CLI package globally: ```text npm install -g @nestjs/cli ``` To create, build and run a new basic Nest project in the development mode, go to the folder that should be the parent of your new project, and run the following commands: ```text nest new simple-app cd simple-app npm run start:dev ``` In your browser open `http://localhost:3000` to see a new application running. The app will automatically recompile and reload when you change any of the source files. ## Implement authentication We are going to implement three functions in our NodeJS server application that authenticate the user: * Sign in * Sign up * Token Validation (bonus, as an Authentication middleware) For each function we will need separate API endpoints in our server as well. Let’s create an `auth.controller` to handle incoming requests. For that purpose we are going to use *NestCLI* to generate the `auth.module`, `auth.controller` and `auth.service`. ```text nest generate module auth nest generate controller auth nest generate service auth ``` The Nest CLI automatically will generate the auth folder with files and add it to the existing app module. The next step is to add a package to help us reach the Cognito SDK which will be going to be used for requests to Cognito API `npm install amazon-cognito-identity-js --save` Let's start by implementing `auth.service.ts` ```typescript import { Injectable } from '@nestjs/common'; import { AuthenticationDetails, CognitoUser, CognitoUserAttribute, CognitoUserPool, } from 'amazon-cognito-identity-js'; import { ConfigService } from '@nestjs/config'; import { RegisterRequestDto } from './dto/register.request.dto'; import { AuthenticateRequestDto } from './dto/authenticate.request.dto'; @Injectable() export class AuthService { private userPool: CognitoUserPool; constructor(private configService: ConfigService) { this.userPool = new CognitoUserPool({ UserPoolId: this.configService.get('AWS_COGNITO_USER_POOL_ID'), ClientId: this.configService.get('AWS_COGNITO_CLIENT_ID'), }); } async register(authRegisterRequest: RegisterRequestDto) { const { name, email, password } = authRegisterRequest; return new Promise((resolve, reject) => { return this.userPool.signUp( name, password, [new CognitoUserAttribute({ Name: 'email', Value: email })], null, (err, result) => { if (!result) { reject(err); } else { resolve(result.user); } }, ); }); } async authenticate(user: AuthenticateRequestDto) { const { name, password } = user; const authenticationDetails = new AuthenticationDetails({ Username: name, Password: password, }); const userData = { Username: name, Pool: this.userPool, }; const newUser = new CognitoUser(userData); return new Promise((resolve, reject) => { return newUser.authenticateUser(authenticationDetails, { onSuccess: (result) => { resolve(result); }, onFailure: (err) => { reject(err); }, }); }); } } ``` Let's now import the following functions in our `auth.controller` which will receive the request and handle it. ```typescript import { BadRequestException, Body, Controller, Post } from '@nestjs/common'; import { AuthService } from './auth.service'; import { AuthenticateRequestDto } from './dto/authenticate.request.dto'; import { RegisterRequestDto } from './dto/register.request.dto'; @Controller('auth') export class AuthController { constructor(private readonly authService: AuthService) {} @Post('register') async register(@Body() registerRequest: RegisterRequestDto) { try { return await this.authService.register(registerRequest); } catch (e) { throw new BadRequestException(e.message); } } @Post('authenticate') async authenticate(@Body() authenticateRequest: AuthenticateRequestDto) { try { return await this.authService.authenticate(authenticateRequest); } catch (e) { throw new BadRequestException(e.message); } } } ``` I have added two endpoints: * register - API endpoint to register user * authenticate - API endpoint to authenticate user ###### Please note that in Cognito we add requirements according to which password should have at least 8 characters, in my example, I have added some validation at the dto level. Our Dto's interface declaration looks like: `register.request.dto.ts` ```typescript import { IsEmail, IsString, Matches, MinLength } from 'class-validator'; export class RegisterRequestDto { @IsString() name: string; @IsEmail() email: string; @IsString() @MinLength(8) @Matches(/[a-z]/) @Matches(/[A-Z]/) @Matches(/[0-9]/) password: string; } ``` `authenticate.request.dto.ts` ```typescript import { IsString } from 'class-validator'; export class AuthenticateRequestDto { @IsString() name: string; @IsString() password: string; } ``` ## Bonus: Token Validation For token validation we are going to use extra features from *NestJS*. For this purpose we are using *Guards*. We are going to start from install required packages: ```text npm i --save @nestjs/jwt @nestjs/passport passport passport-jwt jwks-rsa ``` The following code extends the `PassportStrategy` package and grabs the Bearer token from the headers and pass it to the function validate. We use `jwks-rsa` to confirm a token with JWKS signing from AWS. ```typescript import { ExtractJwt, Strategy } from 'passport-jwt'; import { PassportStrategy } from '@nestjs/passport'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { passportJwtSecret } from 'jwks-rsa'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor(private readonly configService: ConfigService) { super({ secretOrKeyProvider: passportJwtSecret({ cache: true, rateLimit: true, jwksRequestsPerMinute: 3, jwksUri: `https://cognito-idp.${configService.get( 'AWS_REGION', )}.amazonaws.com/${configService.get( 'AWS_COGNITO_USER_POOL_ID', )}/.well-known/jwks.json`, }), jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), audience: configService.get('AWS_COGNITO_CLIENT_ID'), issuer: `https://cognito-idp.${configService.get( 'AWS_REGION', )}.amazonaws.com/${configService.get('AWS_COGNITO_USER_POOL_ID')}`, algorithms: ['RS256'], }); } public async validate(payload: any) { return !!payload.email; } } ``` In case you want to check the decoded jwt you can check [this](https://jwt.io/) out. More about verifying JWT in Cognito User Pool you can find [here.](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html) When you want to use the *Authentication Guard*. Guards have a single responsibility. They determine whether a given request will be handled by the route handler or not, depending on certain conditions (like permissions, roles, ACLs, etc.) present at run-time. This is often referred to as authorization. Authorization (and its cousin, authentication, with which it usually collaborates) has typically been handled by middleware in traditional Express applications. Middleware is a fine choice for authentication, since things like token validation and attaching properties to the request object are not strongly connected with a particular route context (and its metadata). We need to use [AuthGuard](https://docs.nestjs.com/guards) and use Decorator *@UseGuards(AuthGuard)*. More about decorators you can find [here](https://docs.nestjs.com/custom-decorators). [](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html)For that we created simple “alias” for our JWT Auth Guard: `jwt.guard.ts` ```typescript import { Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Injectable() export default class JwtAuthenticationGuard extends AuthGuard('jwt') {} ``` ## It’s showtime! The above code is a minimalistic version for NestJS authentication using Cognito User Pools. Now it's time for doing some tests. ### 1. Register I used *Postman* to send the request. In *@Body* I included email, password, name. A created successful response will contain: ![AWS](../../static/images/using-cognito-with-nest-js/register.png "") Then we can check also in our app in Cognito that the User has been created: ![AWS](../../static/images/using-cognito-with-nest-js/registered_cognito.png "") ### 2. Authenticate Again, in @Body I sent the required password and the user field. If I prepare the correct data, I will receive the user payload: ![AWS](../../static/images/using-cognito-with-nest-js/login.png "") ### 3. Validation For the test purposes I have added the *Guard* for the demo route. If I don't include the *Authorization* header with a token, the server will throw `UnauthorizedException` and in the client I will receive: ```json { "statusCode": 401, "error": "Unauthorized" } ``` When we add in a proper format the token `bearer {token}` (notice that `ExtractJwt.fromAuthHeaderAsBearerToken()`  expects **bearer** not **Bearer**) the Guard which will determine that the token is valid or not, and will allow the route to handle the request. ## Summary I think that more and more developers will use the IaaS (infrastructure as a service) and move logic outside the backend. What is great, in AWS you can also move all the logic with verifying the JWT to *LAMBDA* which can be triggered before sign-up and authentication (we can customize these workflows in the user pool settings). Cognito is a great service from AWS. I use it always when I have an opportunity to do it. [Full repository with code you can find on our Github.](https://github.com/bright/nestjs-aws-cognito/)

    We are looking for backend developers (TS, Node.js)

    Join our team and work on projects such as the Ethereum blockchain platform, accounting software, or web therapy applications.
    - - - The article was written by Patryk Huzarski in 2020 and later updated by Wojciech Kałębasiak. ## 2023 Wrapped: 8 Business (and Life) Lessons *Published: 2023-12-28 | Author: agata | Tags: inspiration, business, self-development* *Source: https://brightinventions.pl/blog/2023-8-business-and-life-lessons/index.md* My teammate, Błażej, recently [shared on his LinkedIn](https://www.linkedin.com/posts/blazej-dziuk_lets-hope-that-joining-a-bright-team-of-activity-7146093107284017152-SuJJ?utm_source=share&utm_medium=member_desktop) some wisdom about millennials dreaming of pubs and restaurants, while Gen Z sets their sights on IT startups. 😉 As a former restaurant owner turned IT representative, let me share some life and business lessons that the recent year (and a few before it, let's be real) has taught me. ## **Lesson 1: Cut the Clutter** Identify the tasks that truly matter; it's like Marie Kondo-ing your schedule. Overcommitting leads to stress and burnout. **Prioritize, declutter, and achieve better results**—this applies not only to your tasks but also to your relationships with people. Simple math: more energy on fewer things equals better results. ## **Lesson 2: Set a Goal**
    ![seneca quote](../../static/images/blog-seneca.png "")
    **"If a man does not know to which port he is sailing, no wind is favourable."** - Seneca. This is one of my favourite quotes. Clear goals are like a GPS for your business but also a personal life. ## **Lesson 3: Do Not Rush** Haste makes waste, (my favourable “pośpiech poniża” in Polish) both in life and business. **Rushed products and unplanned restaurant menus lead to dissatisfaction.** Bugs in your app just to meet a deadline? That's a no-go zone. ## **Lesson 4: Make a Plan** Creating a plan nurtures a specific mindset, preparing you to tackle potential challenges and **refining your self-efficacy—a psychological asset**. Albert Bandura's self-efficacy theory centers on the belief in one's ability to succeed in specific situations or tasks. Be ready to have a plan B because life surprises. \ If self-doubt tends to sneak in, dive deeper into [Bandura's theory](https://educational-innovation.sydney.edu.au/news/pdfs/Bandura%201977.pdf) or jump into [its key insights](https://www.psychologytoday.com/intl/blog/click-here-for-happiness/202209/5-ways-to-boost-self-efficacy).
    ![Bandura self-efficiacy theory](../../static/images/banduras-self-efficacy-theory.jpg "")
    ## **Lesson 5: Drop an Anchor** Feeling off? Reflect. **The anchoring bias** is a cognitive bias where individuals heavily rely on the first piece of information they encounter when making decisions or judgments. This initial information acts as an 'anchor' and influences subsequent thoughts and evaluations, even if the anchor is unrelated or arbitrary. If you are feeling anxious and dissatisfied about your current situation, **reflect on what could have gone wrong but didn't.** Reflect on what went right, develop a positive mindset, and sail smoothly. ## **Lesson 6: Give Your Ideas a Reality Check** Back in 1950, it took almost 50 years for medical know-how to double up. Fast forward to 1980, and it squeezed down to 7 years. By 2010, we're talking a mere 3 and a half years. **Loads of examples show that sticking to old rules can cost big money** (RIP BlackBerry). And this isn't just a business thing—it spills over into our personal lives too. ## **Lesson 7: Step out of Your Comfort Zone**
    ![out of comfort zone](../../static/images/leonardo.jpeg "")
    I've said it before in my [previous blogpost](https://brightinventions.pl/blog/stepping-out-of-your-comfort-zone/?utm_source=blog&utm_campaign=newblog) and I'll say it again: **get uncomfortable sometimes.** That's where the magic happens. ## **Lesson 8: Don't Deny Yourself Because of a Failure** Mistakes happen. Learn, transform, and keep going. **Life is about growth, not perfection.** So, whether you're dreaming of coding the next big thing, developing an international company or running the coziest pub in town, these lessons might be a part of your recipe for success. 🚀
    ![winston churchill quote](../../static/images/winstonchurchill1.jpg "")
    \ \ *Sources:*\ *https://dailystoic.com/stoic-quotes/* *Think Again: The Power of Knowing What You Don't Know (2021) [Adam Grant](https://www.amazon.com/Adam-Grant/e/B00ATUAAWE/ref=dp_byline_cont_book_1)*  *https://educational-innovation.sydney.edu.au/news/pdfs/Bandura%201977.pdf* *https://www.psychologytoday.com/intl/blog/click-here-for-happiness/202209/5-ways-to-boost-self-efficacy* *https://www.berkeleywellbeing.com/self-efficacy.html* *https://hbr.org/2022/08/dont-let-anchoring-bias-weigh-down-your-judgment* ## How Can You Develop Your Skills While Working at Bright Inventions? *Published: 2023-12-28 | Author: agata-m | Tags: recruitment, selfdevelopment, bright insights* *Source: https://brightinventions.pl/blog/how-can-you-develop-your-skills-while-working-at-bright-inventions/index.md* At Bright Inventions, it is very important for us to continuously develop and keep up with hot tech trends. As some of you may have noticed, we have quite a few knowledge-sharing initiatives that we share outside Bright, such as webinars and workshops. Additionally, we also have a lot of initiatives contributing to our development internally.  If you are curious about what these are and how you can develop after joining our bright team, I invite you to keep reading. ## Learning budget This is a form of benefit that every employee can take advantage of. It is a pool of money (currently 2k PLN) that each team member can spend during the year on selected courses, conferences or workshops. There is also an opportunity to co-finance a selected learning initiative if the cost exceeds the limit. ## Bright library  Each of us can order a book we would like to read - the book related to our further development. These books are 100% funded by the organisation and go into our company library. Everyone can borrow a book, read it at home, and return it afterwards. ## Bright development time  Once a month, we can spend 8 hours to implementing ideas that benefit both: us and the company. It's a great opportunity to develop our skills by improving company products, creating libraries, optimizing business and project processes, or conducting workshops for teams. This allows us to expand our knowledge, gain valuable experience, and contribute to increasing the company's efficiency. ## Pair programming This is the opportunity to work together with another developer on code or to solve problems that bother/block us. ## Mentoring programme  Each of us can take part in a mentoring programme. We have both technology-related mentoring paths to choose from and these related to project management or communication. You choose the area which you would like to go through and a mentor supports you. Mentor and mentee meet usually once a month for an hour-long meeting during which they tackle the topic. **How do we explore the new topic?** It could be in any form ex. It can be pair programming, creating presentations, role playing or reviewing. It is entirely up to us. **How long does such a programme last?** This also depends on us and our needs. We agree on this individually with the mentor. ## Coffee talks A teammate has been to some cool conference, or maybe has learned something totally new or game-changing in a project? Great! They can let people in the team know about it, organise a short 20-minute meeting and share what they have learned. ## Blogging time  As you may have noticed we have quite an active blog. :) We really enjoy sharing our ideas and thoughts and what is more, each of us can set aside two hours a week to write a blog post. The topic of the blogpost has to be related to what we do on daily basisi ot more broadly to our industry. ## Internal devs meetings  Web and mobile developers unite! Every fortnight our developers get together for an internal devs meeting where they discuss news in their technology field for an hour. ## English lessons We have the opportunity to participate in free English classes with a professional teacher to improve our language skills. ## Feedback 1:1s Apart from the above we have also regular feedback 1:1 meetings with our managers or team leaders, which are a great occasion to exchange ideas and learn. Depending on the needs the frequency of meetings may change. The main goal is to talk through current issue and plan further steps of development. As you can see, there are quite a lot of learning initiatives and self-development opportunities in our organisation. Knowledge sharing is just a part of our Bright DNA. We have many opportunities to be able to grow and it depends on our which one we choose. If you too would like to join our team and be able to share knowledge inside or outside the organisation, take a look at our [job offers](https://brightinventions.pl/career/) and apply! :) ## First steps with AWS Bedrock *Published: 2023-12-17 | Author: piotr | Tags: aws, aws-cdk, AI, Bedrock* *Source: https://brightinventions.pl/blog/aws-cdk-bedrock-basics/index.md* AI is taking over the world. At Bright Inventions, we've already helped several clients with generative AI. In this blog post, we'll see how to use aws-cdk to create a simple API that responds to prompts. ## Request Bedrock model access If you haven't used Bedrock before, the first step is to request model access. You can do so in [AWS Console > Bedrock Model > access page](https://eu-central-1.console.aws.amazon.com/bedrock/home?region=eu-central-1#/modelaccess): ![bedrock-request-model-access.png](../../static/images/bedrock-request-model-access.png "Request model access") For Claude and Claude Instant models describe your use case briefly. ## Define your AWS Lambda function with aws-cdk Declaring an AWS Lambda function with aws-cdk is straightforward. Our function needs to invoke Bedrock models, hence appropriate IAM permissions are necessary. For simplicity, we'll use AWS Lambda Function URLs with authentication type NONE. You should use that only for evaluation purposes. ```typescript export class BrightBedrockSimpleStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const lambdaPrompt = new NodejsFunction(this, 'lambda', { architecture: Architecture.ARM_64, timeout: Duration.seconds(30), entry: path.join(process.cwd(), 'lib', 'bedrock-client', 'simple-api.lambda.ts'), }) lambdaPrompt.addToRolePolicy(new PolicyStatement({ actions: ['bedrock:InvokeModel'], resources: ['*'] })) const functionUrl = lambdaPrompt.addFunctionUrl({ authType: FunctionUrlAuthType.NONE }); new CfnOutput(this, 'function-url', { value: functionUrl.url }); } } ``` ## Invoking Bedrock amazon.titan-text-express-v1 Bedrock provides multiple models. The models differ not only in terms of their capabilities but also in their API. For starters, let's use Titan Text Express. ```typescript export const handler: APIGatewayProxyHandlerV2 = async (event, context) => { const body = event.body! const response = await bedrock.send(new InvokeModelCommand({ body: JSON.stringify({ inputText: body, }), contentType: 'application/json', modelId: "amazon.titan-text-express-v1" })); const modelResponseJson = response.body.transformToString(); return { statusCode: response.$metadata.httpStatusCode ?? 500, headers: { 'Content-Type': response.contentType }, body: modelResponseJson } } ``` After we deploy the code, we can invoke our function and ask basic questions, e.g. ```shell curl -s -X POST --location "https://${YOUR_LAMBDA_ID}.lambda-url.eu-central-1.on.aws" \ -H "Content-Type: text/plain" \ -d 'Which country has the highest GDP?' | jq { "inputTextTokenCount": 7, "results": [ { "tokenCount": 34, "outputText": "\nThe country that has the highest GDP is the United States. Its total GDP is $23.07 trillion in terms of purchasing power parity (PPP).", "completionReason": "FINISH" } ] } ``` ## Titan Text Express configuration We can control and tweak some the aspects of how the model responds to our prompts. For example, for Titan Text Express we can configure: - temperature: Float value to control randomness in the response (0 to 1, default 0). Lower values decrease randomness. - topP: Float value to control the diversity of options (0 to 1, default 1). Lower values ignore less probable options. - maxTokenCount: Integer specifying the maximum number of tokens in the generated response (0 to 8,000, default 512). - stopSequences: Array of strings indicating where the model should stop generating text. Use the pipe character (|) to separate different sequences (up to 20 characters). Let's modify our lambda to allow controlling the parameters. ```typescript const response = await bedrock.send(new InvokeModelCommand({ body: JSON.stringify({ inputText: body, textGenerationConfig: { temperature: parseFloat(event.queryStringParameters?.temperature ?? '') || undefined, topP: parseFloat(event.queryStringParameters?.topP ?? '') || undefined, maxTokenCount: parseInt(event.queryStringParameters?.maxTokenCount ?? '') || undefined, } }), contentType: 'application/json', modelId: "amazon.titan-text-express-v1" })); ``` After deploying, we can control the model parameters through query string parameters: ```shell curl -X POST --location "https://${YOUR_LAMBDA_ID}.lambda-url.eu-central-1.on.aws?temperature=0.9" \ -H "Content-Type: text/plain" \ -d 'What is the country that has the most freedom of speech in the world?' { "inputTextTokenCount": 15, "results": [ { "tokenCount": 28, "outputText": "\n\"The United States has the most freedom of speech in the world, according to the 2022 Freedom House Index.\" ", "completionReason": "FINISH" } ] } ``` The results will be more elaborate if we change `topP`. ```shell curl -X POST --location "https://${YOUR_LAMBDA_ID}.lambda-url.eu-central-1.on.aws?temperature=0.9&topP=0.1" \ -H "Content-Type: text/plain" \ -d 'What is the country that has the most freedom of speech in the world?' { "inputTextTokenCount": 15, "results": [ { "tokenCount": 51, "outputText": "\n\"The United States is considered the country that has the most freedom of speech in the world. This freedom is protected by the First Amendment of the U.S. Constitution, which guarantees the right to freedom of expression, assembly, and religion.\" ", "completionReason": "FINISH" } ] } ``` ## Summary As you see, it is straightforward to get started with AWS Bedrock. The full example of this blog post is available in [GitHub repo](https://github.com/bright/bright-aws-cdk-bedrock). ## Cheapest ECS Fargate service with HTTPS *Published: 2023-12-15 | Author: piotr | Tags: aws, aws-cdk* *Source: https://brightinventions.pl/blog/aws-cdk-cheap-ecs-fargate/index.md* There's plenty of ways to run a docker image in AWS. Custom EC2 images, ElasticBeanstalk, ECS Classic and Fargate and finally EKS. We have a lot of articles and guidelines for production best practices. However, not all workloads require the same levels of resiliency, security or robustness. Sometimes, all we want is an easy and economical way to run a webserver. In this article, you'll find how to run a web service in ECS Fargate cheaply using aws-cdk: ## Network For most custom workloads in AWS, we need VPC. Creating one with aws-cdk takes few lines of code. However, to reduce costs, we need to make sure that we have no Nat Gateways: ```typescript const vpc = new Vpc(this, 'Vpc', { natGateways: 0 // $30 a month }) ``` Each NAT Gateway instance costs around $30 a month. When we run multiple services in a single VPC, the cost will be minuscule in comparison. However, when we run a single service, that's a major portion of the total. ## Fargate service Without NAT Gateways for our workloads to be able to talk to the internet, they have to be in a public subnet and have a public IP address. To save additional money, we'll use FARGATE_SPOT capacity provider. This offers a variable rate, up to 70% discount vs on demand instances. ```typescript const task = new FargateTaskDefinition(this, 'task') const service = new FargateService(this, 'Service', { cluster: new Cluster(this, 'Cluster', { vpc }), assignPublicIp: true, vpcSubnets: { subnetType: SubnetType.PUBLIC }, taskDefinition: task, capacityProviderStrategies: [{ capacityProvider: 'FARGATE_SPOT', // 70% discount weight: 1 }] }); ``` ## Example workload A web service usually accepts HTTP traffic on a specified port. Let's use http-server for demonstration purposes: ```typescript const backend = task.addContainer('backend', { image: ContainerImage.fromRegistry("node:20-alpine"), command: ['npx', 'http-server'], workingDirectory: '/srv', portMappings: [{ containerPort: 8080 }] }) ``` Note that our container name in the task is `backend`. We also expose port `8080` to other containers running in the task. ## HTTPS is a must these days We should never expose any web service without HTTPS. In a typical setup, we would either use an AWS Load Balancer or AWS API Gateway. The cost of ALB is roughly $16 a month. API gateway would be cheaper. However, it would add complexity to our solution. Let's use [Caddy](https://caddyserver.com/) which can act as reverse-proxy with automatic HTTPS coverage. ```typescript const hostedZone = HostedZone.fromLookup(this, 'tutorial.bright.dev', { domainName: 'tutorial.bright.dev' }); const baseUrl = new URL(`https://cheap-ecs-fargate.${hostedZone.zoneName}`); task.addContainer('caddy', { image: ContainerImage.fromRegistry('caddy:2-alpine'), command: [ 'caddy', 'reverse-proxy', '--from', baseUrl.hostname, '--to', '127.0.0.1:8080' ], portMappings: [{ containerPort: 80 }, { containerPort: 443 }], }).addContainerDependencies({ container: backend, condition: ContainerDependencyCondition.START }) ``` As you can see, we configure caddy container to reverse-proxy traffic to our web service. The caddy container will also listen on both HTTP and HTTPS ports. ## Expose services publicly Finally, for our service to be reachable from the internet, we need to configure DNS to point to our task instance public ip. However, given that we use a spot instance, which can and will often be replaced by AWS, we should automatically update our DNS entry whenever the task is restarted. Thankfully, there's a construct `@raykrueger/cdk-fargate-public-dns` available that will do it for us: ```typescript service.connections.allowFromAnyIpv4(Port.tcp(80), 'Http') service.connections.allowFromAnyIpv4(Port.tcp(443), 'Https') new PublicIPSupport(this, 'PublicIPSupport', { cluster, service, dnsConfig: { domainName: baseUrl.hostname, hostzedZone: hostedZone.hostedZoneId } }) ``` ## Summary The above setup is not suited for the majority of production use. However, for non-production isolated use, it can significantly reduce your monthly bill: ![ecs-cheap](../../static/images/ecs-cost.png "Comparison for regular vs cheap setup") The full example can be found in [GitHub repository](https://github.com/bright/bright-cheap-ecs-fargate-https). ## Google Sign In with Cognito and Nest.js *Published: 2023-12-13 | Author: piotr | Tags: aws, aws-cdk* *Source: https://brightinventions.pl/blog/aws-cdk-cognito-google-sign-in-nest-js/index.md* If you want to implement Google sign-in, also called Google federation, and combine it with using AWS Cognito this blog post if for you. We'll use aws-cdk combined with Nest.js to achieve that. ## Setup At Bright, we often keep infrastructure code next to application code. Thus let's start with creating: * Nest.js backend project ```shell nest new backend ``` * aws-cdk infrastructure project ```shell mkdir infrastrucutre (cd infrastrucutre && npx cdk@2 init --language=typescript) ``` ## Cognito UserPool Cognito `UserPool` represents our users' directory. You can think of it as the repository of of user accounts. ```typescript export class CognitoGoogleAuthNestJs extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const userPool = new UserPool(this, 'users', { selfSignUpEnabled: true, signInAliases: { email: true } }); const userPoolDomain = userPool.addDomain('backend', { cognitoDomain: { domainPrefix: "tutorial-bright" } }); new CfnOutput(this, 'user-pool-domain-uri', { value: userPoolDomain.baseUrl() }) } } ``` ## Setup Google API credentials We need to enable Cognito to talk with Google APIs. In our Google Cloud Platform project, let's enable OAuth consent screen: ![gcp-oauth-api-consent-screen.png](../../static/images/gcp-oauth-api-consent-screen.png) Next configure application name and a domain of the oauth handling endpoints. AWS Cognito provides us with those [endpoints](https://docs.aws.amazon.com/cognito/latest/developerguide/federation-endpoints.html): ![gcp-authorized-domain.png](../../static/images/gcp-authorized-domain.png) Remember that until your application is published, you can only use it with test users. You'll be able to add test users while configuring OAuth consent screen. Finally, create an oauth client id using the web application type: ![gcp-oauth-client.png](../../static/images/gcp-oauth-client.png) Finally, you need to configure Authorized redirect URIs to point to AWS Cognito IDP response [endpoint](https://docs.aws.amazon.com/cognito/latest/developerguide/federation-endpoints.html) that will be in the form of: `https://${domainPrefix}.auth.${region}.amazoncognito.com/oauth2/idpresponse` ![gcp-oauth-redirect-uris.png](../../static/images/gcp-oauth-redirect-uris.png) Download the oauth client credentials JSON file. We should not store the client credentials in our source code. Let's use AWS Secret Manager for that: ```shell aws secretsmanager create-secret \ --name cognito-google-oauth-credentials \ --secret-string "$(jq '.web' < ~/Downloads/client_secret.apps.googleusercontent.com.json)" ``` The `jq '.web' ...` extract the nested `web` attribute content. This is required as you can't reference nested values in AWS Secret Manager. ## Configure OAuth clients We need to instruct Cognito to be able to communicate with Google as the Identity Provider: ```typescript const clientCredentials = Secret.fromSecretNameV2(this, 'google-client-credentials', 'cognito-google-oauth-credentials') userPool.registerIdentityProvider(new UserPoolIdentityProviderGoogle(this, "Google", { userPool, clientId: clientCredentials.secretValueFromJson("client_id").unsafeUnwrap(), clientSecret: clientCredentials.secretValueFromJson("client_secret").unsafeUnwrap(), // Email scope is required, otherwise we'll not get it scopes: ["email"], attributeMapping: { email: ProviderAttribute.GOOGLE_EMAIL, }, })); ``` Finally, we need to tell Cognito where to take the end user for after authentication. The callback url will be the url of our Nest.js backend. ```typescript const hostedZone = HostedZone.fromLookup(this, 'tutorial.bright.dev', { domainName: 'tutorial.bright.dev' }); const baseNestJsUrl = new URL(`https://nestj-google-cognito.${hostedZone.zoneName}`); const callbackUrl = new URL("/auth/callback", baseNestJsUrl) const userPoolClient = userPool.addClient('nest.js', { generateSecret: true, supportedIdentityProviders: [UserPoolClientIdentityProvider.GOOGLE], oAuth: { callbackUrls: [callbackUrl], }, }); // workaround for https://github.com/aws/aws-cdk/issues/15692 userPoolClient.node.addDependency(identityProviderGoogle) ``` ## Handle Cognito sign-in callback in Nest.js After Cognito federates with Google OpenId Connect Provider, it passes the control to our application. In essence, it is the [Authorization code grant with PKCE](https://datatracker.ietf.org/doc/html/rfc7636). Our application will receive a `code` that it has to exchange for Access Token, Id Token and Refresh Token using Cognito APIs. If your backend should automatically redirect unauthenticated API clients to OAuth authorize endpoint, then use [passport-oauth2](https://www.passportjs.org/packages/passport-oauth2/). To make our example more transparent, we invoke the token endpoint manually: ```typescript @Controller() export class AuthController { constructor(private readonly configService: ConfigService) { } @Get("/auth/callback") async signIn(@Query('code') authorizationCode: string) { const clientId = this.configService.getOrThrow('OAUTH_CLIENT_ID') const clientSecret = this.configService.getOrThrow('OAUTH_CLIENT_SECRET') const authorizationEncoded = Buffer.from(`${clientId}:${clientSecret}`).toString("base64"); const authParams = new URLSearchParams(Object.entries({ client_id: clientId, code: authorizationCode, grant_type: "authorization_code", redirect_uri: this.configService.getOrThrow('OAUTH_CALLBACK_URL'), })); const tokenUrl = `${this.configService.getOrThrow('OAUTH_AUTHORIZATION_SERVER_URL')}/oauth2/token?` + authParams; const tokenData = await (await fetch(tokenUrl, { method: 'POST', headers: { Authorization: `Basic ${authorizationEncoded}`, "Content-Type": "application/x-www-form-urlencoded", }, })).json(); // tokenData has id_token, access_token and refresh_token } } ``` At the end of the sign-in flow our application we have `IdToken`, `AccessToken` and `RefreshToken`. What we do at this stage depends on our needs. For example, we can: * start a cookie-based session * return `AccessToken` to frontend * init user account configuration that do not fit into AWS Cognito ## Combine Cognito with Passport Nest.js Passport is often used in Node.js backends to deal with authentication. The [passport-oauth2](https://www.passportjs.org/packages/passport-oauth2/) extension provides an easy way to integrate with standard OAuth flows. Here's how to use it in Nest.js: ```typescript @Controller() export class AuthController { constructor(private readonly configService: ConfigService) { } @UseGuards(AuthGuard('oauth')) @Get("/auth/callback") async signInPassport(@Req() req: Express.AuthenticatedRequest) { // req.user has id_token, access_token and refresh_token } } // register in AppModule @Injectable() export class NestPassportOAuthStrategy extends PassportStrategy(OAuth2Strategy) { constructor(configService: ConfigService) { super({ clientID: configService.getOrThrow('OAUTH_CLIENT_ID'), clientSecret: configService.getOrThrow('OAUTH_CLIENT_SECRET'), authorizationURL: `${configService.getOrThrow('OAUTH_AUTHORIZATION_SERVER_URL')}/oauth2/authorize`, tokenURL: `${configService.getOrThrow('OAUTH_AUTHORIZATION_SERVER_URL')}/oauth2/token`, callbackURL: configService.getOrThrow('OAUTH_CALLBACK_URL') } as OAuth2Strategy.StrategyOptions, (accessToken, refreshToken, results, profile, verified) => { console.log('verified', { accessToken, refreshToken, results, profile, verified }) }); } } ``` ## Provide users with login URL With AWS Cognito we can use hosted pages. However, we often need to have a full control over the UI of our application.\ In such a case, we can craft a special URL that will trigger the sign in flow. Here's how to create the URL that will trigger login with Google flow: ```typescript const baseAuthUrl = this.configService.getOrThrow('OAUTH_AUTHORIZATION_SERVER_URL') const clientId = this.configService.getOrThrow('OAUTH_CLIENT_ID') const loginViaGoogleUrl = `${baseAuthUrl}/oauth2/authorize?${new URLSearchParams(Object.entries({ client_id: clientId, identity_provider: 'Google', response_type: 'code', redirect_uri: this.configService.getOrThrow('OAUTH_CALLBACK_URL') }))}` ``` The URL will look as follows: ```text https://{cognitoDomainPrefix}.auth.{awsRegion}.amazoncognito.com/oauth2/authorize?client_id={cognitoClientId}&identity_provider=Google&response_type=code&redirect_uri={yourApplicationCallbackUrl} ``` Please bear in mind that the `client_id` parameter is one retrieved from `userPoolClient` and not from Google project API credentials. ## ECS Task Definition I'll spare you the details on how to run the Nest.js application in ECS. That's a topic for a separate blog post.\ However, there are a couple of important configuration options that you need to provide for the above snippets to work: ```typescript const backend = task.addContainer('backend', { image: ContainerImage.fromDockerImageAsset(new DockerImageAsset(this, 'backend-image', { directory: path.join(process.cwd(), '..', 'backend') })), environment: { PORT: '3000', OAUTH_CLIENT_ID: userPoolClient.userPoolClientId, OAUTH_CLIENT_SECRET: userPoolClient.userPoolClientSecret.unsafeUnwrap(), OAUTH_AUTHORIZATION_SERVER_URL: userPoolDomain.baseUrl(), OAUTH_CALLBACK_URL: callbackUrl.toString(), }, portMappings: [{ containerPort: 3000 }], logging: LogDriver.awsLogs({ streamPrefix: "backend", logGroup: logGroup }) }); ``` ## Summary The full code of the above setup is available in [GitHub](https://github.com/bright/bright-cognito-google-nest/). In our example, AWS Cognito performs OpenID Connect exchange with Google. Our Nest.js application code only receives information from Cognito. We can easily integrate new identity providers e.g. Facebook and our backend application code would still work. ## Data Deduplication in Python with RecordLinkage *Published: 2023-11-29 | Author: patryk sz | Tags: python, deduplication, recordlinkage, pandas, machine learning* *Source: https://brightinventions.pl/blog/data-deduplication-in-python-with-recordlinkage/index.md* **Supervised Duplicate Detection with RecordLinkage and Pandas: A Febrl Dataset Tutorial** ## Introduction Duplicate detection is a critical process in data preprocessing, especially when dealing with large datasets. Duplicate records can skew analyses and impact the accuracy of machine learning models. In this tutorial, we explore data deduplication using Python's RecordLinkage package, paired with Pandas for data manipulation. This approach is particularly valuable in contexts like customer database management, where duplicate entries can result in inefficient marketing and customer service strategies. ## Setting Up the Environment with Miniconda Ensure your environment is correctly set up using Miniconda: 1. **Install Miniconda**: Download and install Miniconda from [here](https://docs.conda.io/en/latest/miniconda.html). 2. **Create and Activate a New Conda Environment**: ```bash conda create --name deduplication python=3.8 conda activate deduplication ``` 3. **Install Required Packages**: ```bash conda install -c conda-forge recordlinkage pandas ``` - - - ## Step 1: Loading the Febrl Dataset Utilize the RecordLinkage package to load the Febrl dataset, a synthetic dataset typical of what you might find in a customer database. This dataset contains duplicates and is structured with comprehensive personal details: ```python import pandas as pd import recordlinkage df_a, df_b = recordlinkage.datasets.load_febrl4() ``` ### Exploring the Dataset Examine the dataset to understand its structure, which includes names, addresses, and other personal information: ```python print(df_a.head()) ``` **Example Output:** ```markdown | rec_id | given_name | surname | street_number | address_1 | address_2 | suburb | postcode | state | date_of_birth | soc_sec_id | |--------------|------------|----------|---------------|------------------|-----------------|----------------|----------|-------|---------------|------------| | rec-1070-org | michaela | neumann | 8 | stanley street | miami | winston hills | 4223 | nsw | 19151111 | 5304218 | | rec-1016-org | courtney | painter | 12 | pinkerton circuit| bega flats | richlands | 4560 | vic | 19161214 | 4066625 | | rec-4405-org | charles | green | 38 | salkauskas crescent | kela | dapto | 4566 | nsw | 19480930 | 4365168 | | rec-1288-org | vanessa | parr | 905 | macquoid place | broadbridge manor | south grafton | 2135 | sa | 19951119 | 9239102 | | rec-3585-org | mikayla | malloney | 37 | randwick road | avalind | hoppers crossing| 4552 | vic | 19860208 | 7207688 | ``` This Markdown table showcases the first few entries from the Febrl dataset `df_a`. It includes various fields like `given_name`, `surname`, `address_1`, and `date_of_birth`, providing a detailed view of the data structure used in the deduplication process. ## Step 2: Data Preprocessing Data preprocessing is a critical step in ensuring the quality of your deduplication efforts. The objective here is to clean and standardize your data, making it suitable for comparison. This involves addressing missing values, normalizing data formats, and potentially converting data types for consistency. In the code snippet, we replace all missing values with empty strings in both datasets (`df_a` and `df_b`). This uniform approach to missing data ensures that comparisons are not skewed by null values. ```python df_a.fillna('', inplace=True) df_b.fillna('', inplace=True) ``` ## Step 3: Indexing Indexing is the process of creating candidate links between records, which might refer to the same entity. This step is crucial as it sets the stage for how records will be compared. While `indexer.full()` creates a comprehensive index by comparing every record in one dataset (`df_a`) with every record in another (`df_b`), this method can be computationally expensive, especially for large datasets. An efficient alternative is to use a blocking method, such as `indexer.block("given_name")`. This approach significantly reduces the number of comparisons, thus speeding up the process. ### Understanding Block Indexing: Block indexing works by grouping records based on a specific attribute and only comparing records within the same group. In our example, we use: ```python indexer = recordlinkage.Index() indexer.block("given_name") candidate_links = indexer.index(df_a, df_b) ``` Here’s how it works: * **Blocking by Given Name**: By invoking `indexer.block("given_name")`, the RecordLinkage indexer will group records from both `df_a` and `df_b` based on the `given_name` attribute. Essentially, it creates blocks of records where the given names are the same. * **Reduced Comparisons**: Comparisons are only made between records within these blocks. For instance, a record with the given name 'John' in `df_a` will only be compared to records with the given name 'John' in `df_b`. * **Efficiency**: This focused approach significantly reduces the total number of comparisons needed. It's particularly effective in datasets where a high proportion of records can be excluded from comparison based on a single attribute. **When to Use Block Indexing**: * **Large Datasets**: Ideal for large datasets where full indexing might be impractical due to computational constraints. * **High-Quality Key Attribute**: Most effective when there’s a reliable key attribute (like 'given_name') that can accurately group potential matches. **Trade-Offs**: * **Risk of Missing Matches**: If the key attribute used for blocking has inconsistencies (like typos in names), potential matches might be missed. * **Choosing the Right Attribute**: The effectiveness of blocking depends on choosing an attribute that can effectively discriminate between matches and non-matches. In summary, using `indexer.block("given_name")` offers an efficient way to perform indexing in duplicate detection tasks, especially when dealing with large datasets or seeking to optimize computational resources. It's a strategic choice in scenarios where the selected blocking attribute is reliable and consistent across the dataset. ## Step 4: Comparing Records Comparing records is the heart of the deduplication process. This step involves applying various algorithms to measure similarities between record pairs. These comparisons yield a set of features indicating the level of similarity between each pair of records. ```python compare_cl = recordlinkage.Compare() compare_cl.exact('given_name', 'given_name', label='given_name') compare_cl.string('surname', 'surname', method='jarowinkler', threshold=0.85, label='surname') compare_cl.exact("date_of_birth", "date_of_birth", label="date_of_birth") compare_cl.exact("suburb", "suburb", label="suburb") compare_cl.exact("state", "state", label="state") compare_cl.string("address_1", "address_1", threshold=0.85, label="address_1") features = compare_cl.compute(candidate_links, df_a, df_b) ``` **Example Output:** ```markdown | rec_id_1 | rec_id_2 | given_name | surname | |--------------|--------------|------------|---------| | rec-1070-org | rec-282-org | 1 | 0 | | rec-1070-org | rec-1685-org | 1 | 0 | | rec-1070-org | rec-1056-org | 1 | 0 | | rec-1070-org | rec-1216-org | 1 | 0 | | rec-1070-org | rec-1508-org | 1 | 0 | ``` ## Step 5: Classifying Matches The classification step involves analyzing the comparison features to distinguish between matches and non-matches. A common approach is to set a threshold for the sum of comparison scores. Pairs scoring above this threshold are considered matches. ```python matches = features[features.sum(axis=1) > 3] print(matches) ``` **Example Output:** ```markdown | rec_id_1 | rec_id_2 | given_name | surname | |--------------|--------------|------------|---------| | rec-1070-org | rec-5114-org | 1 | 1 | | rec-1070-org | rec-3403-org | 1 | 1 | | rec-1016-org | rec-1936-org | 1 | 1 | ``` ## Complete code ```python import pandas as pd import recordlinkage from recordlinkage.datasets import load_febrl4 from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report # Load the Febrl dataset df_a, df_b = load_febrl4() # Data Preprocessing df_a.fillna('', inplace=True) df_b.fillna('', inplace=True) # Indexing - Create candidate links between records indexer = recordlinkage.Index() indexer.block("given_name") candidate_links = indexer.index(df_a, df_b) # Comparing Records compare_cl = recordlinkage.Compare() compare_cl.exact('given_name', 'given_name', label='given_name') compare_cl.string('surname', 'surname', method='jarowinkler', threshold=0.85, label='surname') compare_cl.exact("date_of_birth", "date_of_birth", label="date_of_birth") compare_cl.exact("suburb", "suburb", label="suburb") compare_cl.exact("state", "state", label="state") compare_cl.string("address_1", "address_1", threshold=0.85, label="address_1") # Classifying Matches features = compare_cl.compute(candidate_links, df_a, df_b) # Analyzing the Results with Pandas matches = features[features.sum(axis=1) > 3] # Display the first few entries of the dataset and matched records print("First few entries of df_a:") print(df_a.head()) print("\nMatched Records:") print(matches.head()) print("\nNumber of matched records:") print(len(matches)) ``` ## Summary Supervised duplicate detection using the RecordLinkage package in Python is a powerful method for identifying duplicate records in datasets. This approach is particularly valuable in scenarios where maintaining a single, accurate record for each entity is crucial, such as in customer databases, medical records, and other similar applications. By following the steps of preprocessing, indexing, comparing, classifying, and analyzing, we can effectively identify and handle duplicate entries, leading to cleaner, more reliable datasets for further analysis or model training. ## The Best Authentication Methods for Your App (Decision Tree) *Published: 2023-11-28 | Author: piotr | Tags: business, development* *Source: https://brightinventions.pl/blog/authentication-methods-for-app-decision-tree/index.md* **Download our free ebook with an authentication method decision tree. We've taken into account user experience, regulatory requirements, privacy concerns, and security when selecting an authentication method for an application.** ## The decision tree included in our free ebook divides decision factors into 6 questions: Here are examples of the questions: * Are there specific regulatory or compliance requirements? * What is the sensitivity of the application or data? * Does the application support multiple platforms and devices? Dive into the first question with this sample:
    ![authentication method decision tree](../../static/images/blog_post_decision_tree_new.png "authentication method decision tree")
    According to your answers, we prepared the proper recommendations. Download the free ebook to have the whole picture and streamline your sign-in process. ## Use WorkManager Mindfully and Don’t Make These Mistakes *Published: 2023-11-24 | Author: szymek | Tags: Android, Kotlin, Hilt, WorkManager* *Source: https://brightinventions.pl/blog/make-workmanager-safe/index.md* **WorkManager is a powerful tool, but with great power comes great responsibility. Is it always completely safe to use? In this article, we will discuss a few potentially dangerous situations related to WorkManager. We will focus on the inconsistency of Workers, which can be edited or removed over time.**
    ![mind the gap](../../static/images/mind_the_gap.png "mind the gap")
    ## **Custom WorkerFactory and @AssistedInject** Let's face it, nowadays injecting dependencies into a [Worker](https://developer.android.com/reference/androidx/work/Worker) class is common and nearly inevitable. Our background work often requires sending a request using e.g. Retrofit service, saving something in the database using *Dao* or simply separating logic from Worker. It would be great if we could inject these dependencies directly into the Worker. Without dependency injection, Workers would not be so powerful. WorkManager creates Workers on its own by default. It expects the Worker to have a constructor with two parameters (Context and [WorkerParameters](https://developer.android.com/reference/androidx/work/WorkerParameters)). So how do we provide our dependencies there? ### How to inject dependencies using Dagger 2 One of the most common practices is to create a custom [WorkerFactory](https://developer.android.com/reference/androidx/work/WorkerFactory) and [@AssistedInject.](https://dagger.dev/dev-guide/assisted-injection.html) Once we prepare our Assisted factories, we can create workers on our own using WorkerFactory. Here is a sample: ```kotlin class CustomWorkerFactory @Inject constructor( private val workerFactories: Map, @JvmSuppressWildcards MyWorkerAssistedFactory> ) : WorkerFactory() { override fun createWorker( appContext: Context, workerClassName: String, workerParameters: WorkerParameters ): ListenableWorker? { return workerFactories.entries .find { Class.forName(workerClassName).isAssignableFrom(it.key) } ?.value ?.create(appContext, workerParameters) } } ``` It assumes that we are able to inject our custom-assisted factories, which will help us create Workers using only Context and WorkerParameters. For providing such factories, [please see Assisted Injection documentation](https://dagger.dev/dev-guide/assisted-injection.html). This code works fine, however there is one issue with it. If you rename, move or delete the Worker’s class and you had a work request scheduled for the class before modification, then the `Class.forName(workerClassName)` is going to throw `ClassNotFoundException`. It’s because WorkManager stores class names in its local database and it doesn’t track class modifications. Once WorkManager saves a particular class name, it’s going to stay in the database until the associated request is completed. Here is a sample scenario showing how this situation can happen: 1. Create `SyncDataWorker` class and install the app 2. Turn off Wi-Fi and cellular data 3. Schedule a work request with the constraint of having a network available 4. Modify `SyncDataWorker` class to `SyncWorker` and install the app 5. Turn on Wifi or cellular data and wait for the Worker to start work 6. If work is not scheduled, please use the following ADB command to debug WorkManager and see if the WorkRequest is enqueued: `adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "your.package.name"` 7. The app should crash soon with the `ClassNotFoundException` In order to fix this issue we can simply wrap the `Class.forName(workerClassName)` invocation with a try-catch statement: ```kotlin class SafeWorkerFactory @Inject constructor( private val workerFactories: Map, @JvmSuppressWildcards MyWorkerAssistedFactory> ) : WorkerFactory() { override fun createWorker( appContext: Context, workerClassName: String, workerParameters: WorkerParameters ): ListenableWorker? = try { workerFactories.entries .find { Class.forName(workerClassName).isAssignableFrom(it.key) } ?.value ?.create(appContext, workerParameters) } catch (e: ClassNotFoundException) { println("Class not found thrown!!!") e.printStackTrace() null } } ``` Now if there was some deprecated class name in the WorkManager’s storage, we won’t encounter a crash due to ClassNotFoundException being thrown. Of course, the request won’t execute, but we’ll talk about it further in this blog. ### How to inject dependencies using Hilt Hilt made it all easier for you. In order to use it for the WorkManager configurations you need to add the following dependency to your project: ```kotlin implementation("androidx.hilt:hilt-work:") ``` It provides an already existing safe `HiltWorkerFactory` ready to be used. This factory also uses `Class.forName` to get the Worker class by its name, but it’s wrapped with a try-catch statement already. This factory is ready to be injected out of the box once you add Hilt dependency - you don’t need to provide it on your own. It works together with `@HiltWorker` annotation which you should add over your `Worker` class.\ It looks more or less like this: ```kotlin @HiltAndroidApp class SafeWorkManagerApp : Application(), Configuration.Provider { @Inject lateinit var hiltWorkerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration(): Configuration { return Configuration.Builder() .setWorkerFactory(hiltWorkerFactory) .build() } } @HiltWorker class SyncDataWorker( context: Context, workerParameters: WorkerParameters, @Assisted someOtherDependencyProvidedByHilt: SomeOtherDependencyProvidedByHilt ): Worker(context, workerParameters) { override fun doWork(): Result { // define work and return Result } } ``` Having this code, you’re ready to go. You can use WorkManager and enqueue work requests with assisted injection. ## **Any other dangers?** Well, we are covered in terms of catching `ClassNotFoundException`, but is it completely safe? Well... It depends! Imagine an `OfflinePaymentWorker` that is supposed to synchronise offline payments with your backend. Now, you requested a work request for this Worker and it hasn’t completed yet. Then if you e.g. change the name of the Worker from `OfflinePaymentWorker` to `SyncOfflinePaymentsWorker` and install the app, you won’t sync outstanding work requests, because our safe factories would return `null` instead of an actual Worker. You could lose critical data about the payments. That’s why you have to be always mindful about the Worker changes you introduce. Just keep in mind that WorkManager can store some incomplete work requests in it’s storage and modifying your Worker class might make them impossible to execute. ### **What to do to prevent losing your data?** Well, there are many approaches you can take. The most obvious one is to keep the old Worker and adjust only the logic - don’t delete it, move it or change the name. The downside of it, is that once you introduce a critical data sync Worker, it probably going to stay with you forever because theoretically, you are never sure if every task in the field has been executed or not. There are other approaches as well, here is the last one that I am going to present. Instead of relying on WorkManager to store your data in a work request, you could store the critical data in your own storage like SharedPreferences or SQLite database. In other words instead of doing this: ```kotlin fun enqueueWork() { val request = OneTimeWorkRequestBuilder() .setInputData( workDataOf( "data1" to "value1", "data2" to "value2", ) ).build() WorkManager.getInstance(this) .beginUniqueWork(..., request) .enqueue() } class SyncDataWorker( appContext: Context, workerParams: WorkerParameters ) : Worker(appContext, workerParams) { override fun doWork(): Result { val data1 = inputData.getString("data1") ?: return Result.failure() val data2 = inputData.getString("data2") ?: return Result.failure() // some logic to synchronise data return Result.success() } } ``` you could store the `data1` and `data2` values in SQLite Database as a single row representing a work that has to be executed and then create a Worker that would synchronise all of the remaining data from the database: ```kotlin fun enqueueWork() { val syncDataRequest = OneTimeWorkRequestBuilder() .build() WorkManager.getInstance(this) .beginUniqueWork(..., syncDataRequest) .enqueue() } @HiltWorker class SyncDataWorker( appContext: Context, workerParams: WorkerParameters, @Assisted syncDataDao: SyncDataDao ) : Worker(appContext, workerParams) { override fun doWork(): Result { val allDataToSynchronise = syncDataDao.getAll() allDataToSynchronize.forEach { // some logic to synchronise data } return Result.success() } } ``` This way you won’t lose critical data if you modify or remove your Worker class. You would still have it in your database and you would be able to synchronise it in one way or another. ## **Summary** We have to be mindful of our Workers and make sure that modifying or removing them is not going to cause some issues for our business. What else do you do to keep WorkManager work safe? Share in the comments! ## An Ode to Product Mindset and Developers Who Know How to Ride a Bike *Published: 2020-10-06 | Author: kasia | Tags: product mindset, product thinking, agile, agile mindset* *Source: https://brightinventions.pl/blog/an-ode-to-product-mindset-and-developers-who-know-how-to-ride-a-bike/index.md* Companies mostly work “in projects” these days. It’s basically a shortcut for a team of people focused on a shared goal for some specific time. We are used to terms like “project success” or “project management”. No wonder people care about their projects and everything that comes with it - success or failure, deadlines and tasks. This is what the days consist of - *projects*. Ideally, from time to time, we take a deep breath and go through the whole system, thinking how our current task fits in the context. Thinking about *the product*. Sometimes though, we might lose ourselves in the day to day work, focusing on delivering a project and forgetting why exactly we have this whole thing going on. And it would be just such a shame - **developers are much more than just highly skilled workers, they are creators**. We just sometimes forget about it.
    ![Cycling](../../static/images/blogpost_bike.png "Cycling")
    ## The Jira trap I already [expressed my (complicated) love for Jira before](/blog/how-we-use-jira-at-bright). Using issue tracking tools can make your everyday life easier and more manageable. I would never advocate not using one. But… Jira is exactly this - a task focused tool. It enables breaking the big requirements down into epics, then user stories, then tasks or even subtasks. In essence, this is a trusted method of decomposing a bigger problem into smaller ones. More atomic issues are easier to control and deliver. Seems like a reasonable thing to do. As long as you keep in mind that the small issue is a part of a bigger whole and this wholeness is what you are all after. That’s when Jira’s ability to decompose comes as a double edged sword. **As much as it supports a top-down planning, it’s not just as easy to build the bigger picture bottom-up again**. How often do you actually read an epic? Or even use one? Maybe no one was reading it anyway and you all decided to skip them? Because the road from a task concerning a change in an endpoint - to the epic about making reservations in a system sometimes seems so long, that many people might not feel like walking it more than once. But agile revision of the backlog does not only concern the development tasks - even more importantly, it requires reflection on epics and user stories as well. ## Creating software The focus on small steps is totally fine at the beginning of your career. It’s the same as learning how to ride a bike. You focus on small elements first, which pedal to push now or how to turn with the handlebar. Then you concentrate on the fact of riding itself and not falling down (too often). But after a while, you are able to choose a road and destination, focus on where you are getting to and maybe also enjoy the views. That’s what happens when you lift your head from the code and try to see what’s around you, what is the reason behind writing this specific piece of code. If you do that, you might actually have a say about where you are going to and which road to choose. Agile approach expects you to do it more often, one time analysis at the beginning of the project will not be enough. Check the road you’re on frequently and adjust it if necessary. **Without a perspective and context, it’s hard to have a sense of direction**. If you try making agile-like changes with a waterfall mindset you can end up in a state of child-like confusion. It’s a trap both for developers and managing figures - a whirlwind of acceptance criteria, statuses and looming deadlines can suck in everyone equally.
    ![Cycling](../../static/images/bike_photo_blog.png "Cycling")
    ## What a user wants, what a user needs By definition, understanding a user’s needs is a domain of someone in the project who identifies the requirements and manages the product backlog. It’s great to have someone dedicated just for getting these right. But it’s not enough. It’s one of the reasons behind the [agile manifesto](https://agilemanifesto.org/) - the necessity to understand the user’s needs by the whole team. The simple fact is that it is not possible to make a good product without understanding what it’s for. But funnily enough, **it is possible to write good code without such understanding**. A beautiful, clean code. Just… with no real purpose. As much as the code quality is very important, it will be just a buried piece of gold if no one wants to use it. No matter how tasty the wedding cake if you decide to deliver it at the funeral. It’s important to aim at being a good developer and to improve the quality of your code. But choosing the right solutions based on the product’s and user’s needs is where being great begins. ## Delivering products, not projects When a client approaches us, she or him rarely asks us to deliver *a project*. What a client is interested in is *the product* and its value. The artifacts of a project - a task board, burndown charts, meeting notes are there to support us on the road to the actual product. If a Sprint review meeting ends up being **a presentation of the issue progress on the board accompanied by some charts, it only shows a project progress. What is really of value is the system itself** - what features are done in this particular version? How do they work? No matter how many tasks have been moved to Done, in the end the increment should bring the expected value and the client should be able to verify it somehow. A system that’s just a pile of unconnected screens and functionalities, even prettiest and cleanest ones, presents very little or no value at all. ## Bring the spark back Let me bring up one more thing to the table. **The actual pleasure and excitement that comes from creating something**. Not just a button or an endpoint, but a whole solution, as a team. You don’t need to carve in wood or stone to be considered a creator - you create systems. I think it’s easy to forget between one git push and another that **writing software is really an art of creation**. There was nothing, emptiness of dev/null and then, line by line, something appears and works, is used by actual people who potentially find it helpful or fun. Moving tasks to Done, ticking them one by one is as satisfying as any To Do list but seeing the bigger picture and how the button you added actually works for people - that can be really fulfilling. **You just need to lift your eyes from the handlebar**, as soon as you’re ready. Look mum, no hands!
    ![Bright Inventions' team](../../static/images/2_galeria_bright_inventions.jpg "Bright Inventions' team")
    ## Before you set off for the adventure As much as with biking the progress from unsteady pedalling to smooth journeys happens pretty fast and is easily noticeable, it can be more tricky when it comes to software development. It may take years and be more gradual. **So how do you know whether you’re really lifting your head from the code?** You may ask yourself a few simple questions 1. Do I know the actual use case for the piece of code I’m working on right now? What’s the main business value to the client here? 2. Do I know what my team mates are currently working on? 3. How do I react when a pivot in a newly introduced feature is needed? Can I embrace the change coming after client's feedback?  4. What would I do if I felt that the acceptance criteria in my task are lacking or not aligned with other parts of the system? Would I notice this? Would I propose a solution to deliver the feature or follow acceptance criteria to be done with my task? Every project is different and of course the business perspective is not always accessible to the developers (or in fact project managers as well). However, **your mindset is your own personal power and asset**. Building a product focused attitude is a great value that will stay with you longer than your current project. ## Where to go next If you're still unsure about the whole product mindset thing or you'd like to dig deeper into the subject, I prepared a small and subjective list of some interesting and fun sources: * A straightforward summary of the topic in [this Your Daily Scrum podcast episode](https://www.scrum.org/resources/blog/yds-difference-between-project-and-product-mindset) * A comprehensive overview of the organisations transformation from project mindset to the more product focused one in "Project to Product" by Mik Kersten (or start with one of his public speeches, like this [one](https://youtu.be/hrjvbTlirnk?si=bK8dVy26E3-G5eWH) * Fascinating insight into users’ perspective and motivations in "User Friendly" by Cliff Kuang & Robert Fabricant or in "The Design of Everyday Things" by Don Norman  * An interesting concept of product engineers - developers with a great product thinking in [a video](https://youtu.be/OCP_HEhvIqM?si=rUZ3MQ-zRmhUNZ_E) by Sherif Mansour * For exploring mechanisms behind successful product management - "Product Leadership" by Richard Banfield, Martin Eriksson & Nate Walkingshaw * Bonus source - [Kent Beck’s newsletter](https://tidyfirst.substack.com/) with lots of code related ideas, but his main goal now is to “Help Geeks Feel Safe In The World” so plenty of soft skills and product related content as well. It's all just Agile in the end :) - - - Listen to BrightDevTalks podcast on Spotify. Kasia and Ula from Bright Inventions take cycling to the next level. Podcast is recorded in Polish. ## Embracing Tech and Business Side of Software Development. Meet Piotr *Published: 2023-11-14 | Author: piotr_r | Tags: bright insights, bright story, growth* *Source: https://brightinventions.pl/blog/tech-business-side-software-development-piotr/index.md* **Piotr is an experienced entrepreneur and Android Developer who always brings much more than lines of code. His broad perspective helps to truly create the software that matters. Explore how his passion for music led him to Android development. Also, find out how sports activities transformed his life and work.**
    ![Android developer career story](../../static/images/brightstorypiotrcollage.png "Android developer career story")
    ## Before you joined Bright Inventions you were an entrepreneur. Tell us more about your business. The company I co-founded was providing **digital signage solutions**. In practice, we owned a nationwide screen network, used as an information and advertisement tool. Our top product was a digital signage network in the health sector. My business partner was responsible for advertising, while **I was handling the technology side of the business**. ## Did your business eventually direct you toward Android development? Answering that question isn't straightforward. To begin, I should mention that **I am a sound engineer by profession**. I graduated from Gdansk University of Technology. Despite taking on some work at a Musical Theatre in Gdynia and in a recording studio, I found that it wasn't a promising career path for me. I decided to pivot. I've always loved computers - as a teenager, I was building websites with HTML and PHP, so programming wasn't unfamiliar to me. **My interest was sparked by Android development when I realized how easily it synced with my other passion – playing drums**. Smartphones have accelerometers and track motions like shaking, tilting, and swinging. I read on the internet about a guy who used that to build an app that simulates drums. Being a drummer myself, this intrigued me, so **I decided to develop an app that turned my phone into a drumstick**. It was incredibly satisfying and fun. Later, I took several courses on Android development. Eventually, my company received an order to build an Android app for a bank, providing me with the opportunity to work on a commercial project.
    ![Bright dev after hours](../../static/images/piotr_bright_passion-2-.png "Bright dev after hours")
    Bright dev after hours
    ## How did you land in Bright Inventions? I sold my business and chose to freelance for a while and work on my own apps. In the end, freelancing wasn't the perfect solution for me, as I love to work in a team, so I began searching for a full-time job. I recall coming across a job offer from Bright Inventions on a job board, but I didn't apply at that time. Soon after that, **I heard wonderful things about Bright Inventions (and Ula in particular)** from a friend, so I decided to submit my application. This happened over four years ago. 🙂 Now I cannot imagine another career path for me. ## How would you sum up these 4 years at Bright Inventions? I can say that it has been a period of rapid and profound learning. I don't just mean technical knowledge, but I've also deeply dived into the business aspects of software development. **It's remarkable how quickly I gained a substantial amount of trust**. During my second month here, I already experienced a sense of freedom combined with responsibility. I have always been a person who ensures meeting all deadlines and who self-imposes a goal-oriented working model. It's wonderful that the team at Bright Inventions quickly recognized that and almost immediately placed their trust in me.
    ![Piotr's quote](../../static/images/piotr_quote_responsibility_bright.png "Piotr's quote")
    ## What are the biggest challenges you faced during these last 4 years? One of them occurred shortly after I joined Bright Inventions. I became a part of a highly rewarding project that aimed to **build a solution for humanitarian aid**. It felt amazing to build software that impacts and improves people’s lives. However, it wasn't easy. I had to learn a lot of new things quickly. **It was the first time I worked on integrating peripheral devices and implemented biometric authentication methods**. Another challenge was quite satisfying too. **My colleagues and I had the opportunity to build the entire architecture from scratch for a new Android app** we were supposed to create for our client. We were trusted to choose the right technologies. We aimed to implement everything new that Android had to offer, including Jetpack Compose and multi-module architecture. **We spent several months establishing the right architecture, but it was worth it**. Sometimes, when you opt for the newest technologies, you may face challenges due to their immaturity. In this case, we tackled the challenge smartly, making decisions that now contribute to the project's smooth functionality. Adding new features to this app is a pleasure, not only from my experience but also from the experiences of other developers who were part of this project. ## Having owned a business, does it help you with daily interactions with our clients? Absolutely! Having been an entrepreneur for over 10 years has provided me with a great deal of empathy for our clients. I have a deeper understanding of certain business processes, and **I particularly enjoy projects with challenges because they not only pique my interest but also drive me**. The longer the journey, the more satisfying it is to reach the destination, don’t you think? I always try to embrace the process and understand both sides.
    ![Piotr's quote](../../static/images/piotr_quote_client.png "Piotr's quote")
    ## I'm aware that sports have become a crucial part of your life. Tell us what you train and why. It all began when the pandemic struck in 2020. **Bright Inventions' founders, Daniel and Michał, offered us a new work benefit – free workouts led by a professional triathlete, [Bartosz Banach](https://bartoszbanach.pl/)**. It was a life-changing moment for me, especially during the pandemic when we were forced to stay home, and being active definitely helped me get through it. We could choose from running, mountain biking (MTB), and swimming workouts. I started to attend MTB and running workouts. Biking has certainly become an integral part of my life. Before 2020, I cycled like most people – occasionally. Now, I ride 200 to 400 kilometers a month. In addition to cycling, I run, do yoga, take long walks, and go to the gym. **Let me share my Garmin stats for October 2023:** * 351 kilometers of cycling, * 108 kilometers of active strolling, * 96 kilometers of running, * 3 hours of yoga.
    ![Yoga at Bright Inventions](../../static/images/yoga_bright_inventions.png "Yoga at Bright Inventions")
    Friday yoga at Bright Inventions’ office
    ## What have sports brought to your life? Discipline, without a doubt. Regardless of the weather, I have to stick to my training routine. It has certainly changed me. **Sports also help clear the mind**. This is something I've heard from many people at Bright Inventions. When I'm struggling with a task, what do I do? I shut off my computer and go for a walk or a workout. When I return, I often have new ideas for solving my challenges. ## Why is Spain your regular vacation spot?
    ![Spain](../../static/images/piotr_passion_spain.png "Exploring Spain on the bike")
    Exploring Spain on the bike
    **I’ve always been in awe of Spanish culture, language, and cuisine**. The fact that the Spanish language is relatively easy to learn fascinated me. I started learning it in college, and having a roommate from Spain for a while helped me a lot. Spain is a **perfect destination for MTB enthusiasts**. The country offers breathtaking views, and its mountainous terrain ensures you'll face some challenges along the way. Mountain biking entails hard work, and I love it. Combining it with stunning scenery, delicious food, and the company of friends, it’s the ideal holiday for me. ## The Role of Performance Budgets in Modern Frontend Development *Published: 2023-11-10 | Author: szymon-ch | Tags: frontend, layered architecture, performance* *Source: https://brightinventions.pl/blog/role-of-performance-budgets-in-modern-frontend-development/index.md* **Performance is a vital component of a good user experience, and we have learned it affects business metrics. In other words, an application that doesn't perform well will cost you greatly. How can one ensure that performance will remain at acceptable levels? To achieve a goal, you must first define it. That's when performance budgets come into play.**
    ![Performance budget](../../static/images/blog_performance_budget.png "Performance budget")
    ## Budgets to rescue **A performance budget is a limit that all developers agree not to exceed in any circumstances**. Basically, you can treat it like a monthly financial budget. If you want to make something stand out, then you will probably have to let something else go. It's fluid - depending on the business requirements for this month, you can decide to adjust it. For example, you can reduce the number of images in exchange for additional JavaScript being shipped. **Budgeting is not only about the size of images, scripts, and other resources. This principle may also be applied to metrics like FCP (First Contentful Paint), TTI (Time To Interactive), or scores reported by tools like Lighthouse**. Having budgets defined for your application may spark a discussion about performance and get everyone on your team on the same page. They make designers limit high-resolution images and fonts until they are absolutely necessary. On the other hand, **software engineers may easily evaluate the performance of different libraries and frameworks and compare them based on their influence on budgets**. ## Choosing metrics ### Quantity-based metrics Rules based on this type of metrics are the easiest to establish and enforce. They are **based on raw values like the weight of JavaScript files, the number of HTTP requests, fonts, or images**. However, they may not reflect the user experience correctly. ### Milestone timings In order to keep the user experience at an acceptable level, it may be better to **focus on time-based metrics like Time to Interactive or First Contentful Paint**. You can also define your metrics depending on what is the most important action from the perspective of your users. It's also possible to combine multiple milestones together to even better describe the path of a user in the application. ### Rule-based metrics **These metrics use performance scores calculated by tools like Lighthouse**, which you can use as guidelines. What's even better, such tools provide hints on how to make your application perform better. ## Defining a budget There is no way to provide a universal set of rules that will make sense for every application. However, **there are some good defaults to start with**: * under 5 seconds Time to Interactive, * under 170 KB of critical-path resources. **The best thing you can do is to analyze your competition and see how they perform**. Then in the worst-case scenario, you will match them and provide a similar experience to your users. On the other hand, you may enforce lower limits and outperform them - it's up to you and your team. It's worth mentioning **budgets should be unambiguous**. There is no use in a rule saying: "our home page must load and get interactive in less than 5 seconds on a slow device." What's a slow device? Three-year high-end device or maybe a $100 smartphone released 5 years ago? I recommend doing a short research and using an exact model instead. There may be **a different set of budgets enforced for different kinds of pages** in your application. It's usually crucial for your home page to load as quickly as possible, but users may wait a little more for other screens. It's not the easiest task to define a reasonable budget. Check out [performancebudget.io](https://performancebudget.io/), which will serve as a visual aid with presets for different network speeds. ## Making sure your team stays within budgets There are many tools to choose from when it comes to enforcing budgeting in your application. It all depends on the time you want to spend on research and configuration. The most basic one is **[bundlesize](https://github.com/siddharthkp/bundlesize), which will check if your bundle stays within reasonable boundaries**. This way, engineers in your team won't be able to merge any pull requests that contain additional imports of expensive libraries. If you want to make sure that your builds stay green in the Lighthouse audits, then **you should familiarize yourself with [lighthouse-ci](https://github.com/GoogleChrome/lighthouse-ci)**. It makes it possible to **run audits in your CI pipeline and define rules that should never be broken**. To name one, you can say that your application is meant to score over 90 points in every audit, and then your CI will fail when any score drops below the threshold. What's even better is that it's possible to limit asset size or make assertions on your custom metrics. It's a versatile tool, a must-have for every web developer. It's worth mentioning that [Webpack](https://webpack.js.org/) is also capable of enforcing asset size limits. In its default configuration, this bundler will display a warning in the console if some scripts or images are too large. However, you can reconfigure it to throw an error instead. Consult [its documentation](https://webpack.js.org/configuration/performance/) to learn how to enable this feature. ## Discussing budgets with decision-makers We all have been here. You are working hard to ensure your application loads and can be used quickly, but then there comes this one meeting, and you see you will have to completely redesign the home page and put tons of images and other visual elements on it. You are aware that it will have a huge impact on the load time, and so you try to minimize losses, but they don't want to listen to you. It's a fact that there is a constant struggle going on between stakeholders and engineers. We often tend to disagree or even don't understand each other. **It's likely common that non-engineering members of your team are not aware of the performance consequences of their decisions. That's not their job. It's up to us to explain and present it to them in the clearest way possible.** With budgets in place, you can say that bringing this additional carousel of images will make us miss the 5-second deadline for page load. That's something easily understandable for everyone. Moreover, having those limits in place allows you to move the discussion back in time to the design stage. This will save you a lot of time, which you will be able to spend on something else.
    ![Discussion](../../static/images/discussion_photo_blog.png "Discussion")
    ## We have to go over the budget! Congratulations - you have enforced a strict budget in your application, and it has already prevented several changes that would degrade performance by accident. However, as products tend to grow over time, you have been adding more and more features to yours, and now **you cannot do it anymore because your budget is exhausted**. What should you do? **You have to compromise. You can either:** * get back to previously added features and optimize them, * decide to remove some feature to make place for a new one (or postpone interactivity with it), * completely abandon your idea and don't ship another feature. As with a financial budget, when you go over the limit, then you have to reduce spending on leisure and move funds to bills instead. The same principle applies here. That's why **it's so important to have both engineers, designers, and stakeholders on the same page**. We all have to cooperate to answer the question and provide the best possible experience. In conclusion, **performance budgets are an invaluable tool** for ensuring that your application consistently delivers a top-notch user experience. By setting clear limits and guidelines for metrics, such as Time to Interactive and resource sizes, you can keep your team aligned and focused on optimizing performance from the design stage itself. These budgets also facilitate productive discussions with stakeholders, helping them understand the trade-offs between features and performance. However, it's essential to **remain flexible and be ready to compromise** when you inevitably reach the limits of your budget. **Remember that it's a collaborative effort involving engineers, designers, and decision-makers** to provide the best possible user experience and maintain a healthy performance balance in your application. ## UX Design for Custom Transport Management Software [Case Study] *Published: 2023-11-07 | Author: joanna-c | Tags: design, UX, UI* *Source: https://brightinventions.pl/blog/ux-design-transport-management-software-case-study/index.md* **How to design transportation management software? What are the challenges and best practices to follow? Let us answer all the questions with a case study!**
    ![UX Transport Management System](../../static/images/tms_ux_cover.png "UX Transport Management System")
    The client has reached out to us to build [customized software for freight forwarders](https://brightinventions.pl/projects/transportation-management-system/) to speed up and eventually automate the process of finding suitable transport orders and matching them with the right drivers. **As a result of our work, it takes 3-5 seconds to analyze the route per order, saving a total of 300 h per employee a year**. However, **that’s just the one challenge of that job. Another was a product design** which aim was to support users and help them navigate smoothly through the app. Drawing from our experience in [product design](/our-areas/product-design/) for this project, we want to share our insights on creating products tailored to the shipping industry.
    ![Transport Management System](../../static/images/tms_social_preview.png "Transport Management System")
    ## Challenges for transportation management system design ### Information Architecture * **Designing a data-heavy** solution in the most possible accessible and readable way. * Designing **how to display as much data as possible** on one screen without overwhelming users. ### Deep understanding of the domain * Building work management software requires **a true understanding of a particular industry**. * Also, it might turn out that **your design instincts go opposite to end users' needs**. ## UX persona of the transport management solutions In this case, **end users are freight forwarders who expect fast, precise and simple solutions that will speed up their work**. They don’t want beautiful design, images, and animations which might result in slowing the app’s performance. They can’t deal with any distractions as well. They expect the tools that will assist them in matching transport jobs with the right cars and couriers.
    ![UX persona transport system management](../../static/images/tms_persona.png "UX persona transport system management")
    **What he says** "I wonder if a driver has enough time to unload, so I could add another load for him?" **What he thinks** “It’s not affordable to take this offer.” “Weak offer, but I have to make mileage." **What he does:** * takes orders from clients and plans the entire route for the driver, * ensures that all shipments are delivered on time and in good condition, * maintains strong relationships with drivers and customers, * streamlines dispatching processes to improve efficiency and reduce errors, * stays up-to-date with industry trends and technologies. **What he feels:** * stress, * time pressure. ## Understanding the business domain – freight forwarding and road transportation While designing prototypes for the transport management solution our design team used numerous product design techniques: ### Desk research The process of gathering information and data by reviewing existing literature, documents, reports, and other available resources regarding the shipping industry. ### Benchmarking It is a process of comparing an organization's products against those of its competitors or industry leaders. It involves identifying best practices, evaluating performance metrics, and using the insights gained to improve and set goals for the organization. ### Field studying It is a research method that involves directly observing and collecting data in real-world settings or natural environments. From the very beginning of the development process, we had access to end-user representatives who were willing to give us a unique insight into their work life. ### User shadowing It is an observational research technique used to understand how people interact with products, services, or systems in their natural environment. Bright Inventions’ team visited the client’s office to watch freight forwarders at their work, specifically to see how they interact with various software tools on a daily basis. ### Adaptive interviews It is a research technique that involves conducting interviews. It allows for a deeper understanding of the interviewee's experiences, opinions, and perspectives. Our team conducted many interviews during the MVP development process. However, after the MVP launch interviews still remained a powerful tool. After every crucial feature release and design update, we conduct interviews with users and improve the product according to their feedback. ## Best UX design practices for transportation management software Creating a visual representation of this app required **a data-heavy design approach**. It is the process of creating interfaces or systems that effectively handle and display large amounts of complex data. It involves organizing, visualizing, and optimizing the interaction with data to facilitate understanding and decision-making.
    ![UX design practices for transport management system](../../static/images/ux_practices_cover_tms.png "UX design practices for transport management system")
    **Check out the data-heavy design practices we implemented for our client:** ### Clear information architecture The goal of the system is to match the transport job with the matching car and driver to find the most efficient way to transport goods internationally. So end users' requirement was to show listing next to matching cars – as many as possible on one screen. You **can see that transport orders are displayed on the left and vehicles on the right. Although there are many of them on screen, they stand out thanks to the white background.**
    ![Clear information architecture](../../static/images/tms_information_architecture.png "Clear information architecture")
    ### Designing cluster information Another product design challenge was to design clustered information. For example, one transport order could be associated with 10 vehicles which have to be accessible all in one place. **Our solution was to create scrolling bubbles**. Obviously, every scrolling has to have an indicator that shows that data should be scrolled. It might seem obvious, but these are the small details that might be sometimes missed while developing advanced systems.
    ![Designing cluster information](../../static/images/tms_ux_scrolling.png "Designing cluster information")
    ### Taking into account users' mental model **A mental model is a person's understanding of how something works or should be used**. It shapes user expectations and interactions with a product. Designers aim to align their designs with users' mental models to create intuitive and user-friendly experiences. B**y incorporating these mental models into the design process, designers reduce cognitive load and enhance usability**, bridging the gap between intentions and user needs. Our team incorporated users' mental model into this design:
    ![User' mental model](../../static/images/tms_ux_mental_model.png "User' mental model")
    This is the routing design. The green square means loading and the orange circle means unloading which is based on the users' mental model. However these color associations and shapes don’t have to be universal to anyone, this is a specific mental model of users representing the shipping industry. ### Navigation design based on patterns familiar to users The app’s navigation should be accessible and similar to other well-known tools users use at work. **Custom software should “ring a bell” and be a natural extension of everyday work, not something completely new users have to comprehend**. No one will sacrifice work time to learn new tools and new navigation, especially freight forwarders who simply don’t have time to spare. ### Button hierarchy **The right UX shows you exactly what action is expected from you with one simple look**. Although this screen shows lots of data the buttons are standing out thanks to the dedicated color and the right size. Also, the Call to Action (CTA) is short but clear and informative – users know what to expect when they click the button.
    ![UX buttons](../../static/images/tms_ux_buttons.png "UX buttons")
    The button’s design should emphasize the hierarchy of the actions users should take. **Product designers should help users and point them in the right direction**. Yet still giving them an alternative option (secondary button). Below you’ll find an example of the button hierarchy:
    ![UX button hierarchy](../../static/images/tms_ux_buttons_hierarchy.png "UX button hierarchy")
    ### Flags UX Our client operates in over 40 countries, so most of their routes are international. Introducing flags next to shipping addresses is a simple but powerful touch. **With one look users can quickly scan the route info before going into details (actual address)**. It speeds up the scanning action which is very crucial for end users. Also, postal codes are important information for the end users, so they are easily accessible next to the flags. Flags are also a useful way to design language setting dropdowns.
    ![UX Flags](../../static/images/tms_ux_flags.png "UX Flags")
    ### Color coding The mockup below shows **the universal power of colors**. In this case, colors are used to show shipping statuses. Even without knowing the app’s domain, we can assume that red color means something negative (for example car malfunction), yellow might mean delay, and blue is neutral. These aren’t the actual statutes used in the app but we just show you the examples of associations that we quickly have while looking at these colors. 🙂
    ![Color coding](../../static/images/tms_color_coding.png "Color coding")
    You may also notice, that a vehicle in a blue color has a different shape. This icon means that the car is on the go.
    ![Vehicle icons](../../static/images/tms_vehicle_icons.png "Vehicle icons")
    ### Iconography Every product design requires iconography. **Although icons have to be unique, they still cannot be out of the box**. No one wants to reinvent the wheel, so icons should be comprehensible. They must evoke the right associations, even if they are designed specifically for this app. Here are examples of icons showing users’ actions available on the app:
    ![Icons](../../static/images/tms_ux_icons.png "Icons")
    Icons are recognizable. By looking at them it’s easy to guess their meaning. Naturally, icons should also be explained in the app because product designers shouldn’t assume that users understand all their intentions. Nevertheless, these icons are approachable, easy to comprehend and remember what they mean. That’s the goal. 🙂 ### Bolding Bolding is a simple but powerful way to prioritize information. As an example take a look at the popup below.
    ![Popup](../../static/images/case_study_picture_tms_screen.png "Popup")
    **Bolding emphasizes the crucial information in the copy, helping to scan the text**. According to [Nielsen Norman Group research](https://www.nngroup.com/articles/how-users-read-on-the-web/) conducted in 1997! 79% od people only scann information on the website, 16% read word-by-word. It is probable that the data today shows an even greater preference for scanning. Bolding definitely helps users quickly see the crucial information on this popup - the fact that the order they want to delete will be gone permanently. Also, take a look at the Calls to Action (CTAs). They clearly state the actions thanks to informative copy, *Yes, delete it*, and *No, keep it*. **We should avoid using CTAs such as Yes, or No which give no context**. Again, users quickly scan the apps. Make sure they understand the consequences of their actions. ### Designing a map in the application Map design can be challenging because maps typically come with predetermined color schemes. If the colors are meant to signify specific information, such as distinguishing between the actual route and the car's navigation from point A to point B, additional effort is necessary. **A viable solution would involve not solely relying on colors but also incorporating various shapes**, such as dashed lines, and utilizing borders to enhance the map's clarity and visual communication. Last but not least, **color contrast has to align with Web Content Accessibility Guidelines** ([WCAG](https://wcag.com/)) guidelines for accessibility.
    ![Map](../../static/images/tms_case_study_screen_map.png "Map")
    ## Are you planning to design and develop your solution for the logistics industry? We are happy to discuss your product with you. We assist clients at every stage of the development process: from design to development and maintenance. Contact us and we’ll get back to you within 48 hours. [Book a free consultation now](/start-project/)! ## Listen to BrightDevTalks Podcast *Published: 2022-05-24 | Author: izabela | Tags: update, development, inspiration* *Source: https://brightinventions.pl/blog/brightdevtalks-podcast/index.md* **Our team at Bright Inventions loves to share their knowledge. What’s a better way to discuss hot software development topics than by starting a podcast? BrightDevTalks is a platform to address the business, tech, and communication challenges that all members of the software development world have to face. Our hosts, first Patryk Szlagowski and now Ula Stankiewicz, invite a variety of guests. Hop on this train and listen to BrightDevTalks. The podcast is done in Polish.** ## Follow on Spotify ## Listen on Apple Podcasts
    ## Subscribe on YouTube
    ## NestJS Parametrizable Dynamic Modules *Published: 2023-11-02 | Author: radek-l | Tags: nestjs, backend* *Source: https://brightinventions.pl/blog/nestjs-parametrizable-dynamic-modules/index.md* NestJS allows to easily encapsulate code not only with Static modules, but also Dynamic Modules. Dynamic modules allow us to modify the module's configuration, dependencies or behaviour at bootstrap time. This gives a massive advantage in terms of code deduplication and reusability. Let's give it a go and implement Notifications by means of Dynamic Modules
    ![Modularization](../../static/images/blog_modularization.png "Modularization")
    ## Objective * The library for sending UserNotifications to different countries with fast horizontal expansion to next countries ### Goals: * Library exposes an interface to easily send a Notification to a User * Library allows to differentiate how to deliver notification: email or sms * Library allows to define custom ways of of delivery * Each Notifcation send attempt is logged and saved in persistence ### Initial analysis: * The common parts to any kind of delivery is to: Send a notification, log all attempts and persist them. The specific part is how we technically deliver the notification: SMS or Email. * We can create a common piece of code to do the common stuff and put SMS and Email sending itself in a dedicated modules. ### Minimalistic, incorrect and faulty implementation: ```typescript import {DynamicModule, Inject, Injectable, Module} from '@nestjs/common'; import {Type} from "@nestjs/common/interfaces/type.interface"; @Module({ providers: [ NaiveuserNotificationService ], exports: [ NaiveuserNotificationService ] }) export class NaiveUserNotificationModule {} export class NaiveUserNotificationService { async notify(user: string, message: string, delivery: "SMS" | "EMAIL"): Promise { switch (delivery) { case "SMS": this.sendSms(user, message) break; case "EMAIL": this.sendEmail(user, message) break; default: throw new Error("Unknown delivery type") } } private sendSms(user: string, message: string) { console.log(`User ${user} notified with message: ${message} by SMS`) } private sendEmail(user: string, message: string) { console.log(`User ${user} notified with message: ${message} by EMAIL`) } } @Module({ imports: [ NaiveUserNotificationModule ] }) export class ConsumerModule {} ``` #### **What’s wrong with this example:** The goal `Library allows to define custom ways of of delivery` is not fulfilled in multiple aspects * The switch-case breaks OCP  * Adding a new delivery method requires modifying `NaiveUserNotificationService` * The switch-case breaks SRP * By Robert C. Martin words: “A class should have only one reason to change”. This class has multiple reasons to change, because it carries implementation related to totally separate concepts: Email and SMS sending. If at some point, we want to modify the Email Sending logic, so we can put the \`message\` test within some prerendered template then the class will bloat even more #### How to make it better? Let’s abstract the act of sending the notification from the act of delivering it by exposing a `NotificationExecutor` interface. Also, we’ll put Email and Sms sending logic into dedicated `NotificationExecutors` and place them into respective, independent NestJS Modules. We’ll also transform a static module: `NaiveUserNotificationModule` to a Dynamic one, to allow to inject `NotificationExecutor` at bootstrap time. *SmsNotificationModule* ```typescript @Injectable() export class SmsNotificationExecutor implements NotificationExecutor { async notify(user: string, message: string): Promise { console.log(`User ${user} notified with message: ${message} by SMS`) } } @Module({ providers: [{provide: "NotificationExecutor", useClass: SmsNotificationExecutor}], exports: ["NotificationExecutor"] }) export class SmsNotificationModule {} ``` *EmailNotificationModule* ```typescript @Injectable() export class EmailNotificationExecutor implements NotificationExecutor { async notify(user: string, message: string): Promise { console.log(`User ${user} notified with message: ${message} by EMAIL`) } } @Module({ providers: [{provide: "NotificationExecutor", useClass: EmailNotificationExecutor}], exports: ["NotificationExecutor"] }) export class EmailNotificationModule {} ``` *NaiveUserNotificationModule* ```typescript import {DynamicModule, Inject, Injectable, Module} from '@nestjs/common'; import {Type} from "@nestjs/common/interfaces/type.interface"; export interface NotificationExecutor { notify(user: string, message: string): Promise } export class NaiveUserNotificationService { constructor(@Inject("NotificationExecutor") private readonly notificationExecutor: NotificationExecutor) { } async notify(user: string, message: string): Promise { this.logAttempt(user, message) this.persistAttempt(user, message) await this.notificationExecutor.notify(user, message) } private logAttempt(user: string, message: string) { console.log(`User ${user} notified with message: ${message}`) } private persistAttempt(user: string, message: string) { console.log(`User ${user} notification ${message} persisted`) } } @Module({ providers: [ NaiveUserNotificationService ], exports: [ NaiveUserNotificationService ] }) export class NaiveUserNotificationModule { static register(notificationExecutor: Type): DynamicModule { return { module: NaiveUserNotificationModule, imports: [notificationExecutor], providers: [NaiveUserNotificationService], exports: [NaiveUserNotificationService] } } } ``` *Consumer modules* ```typescript @Module({ imports: [ NaiveUserNotificationModule.register( EmailNotificationModule ) ] }) export class ConsumerModuleWhichDecidesToUseEmailNotificationModule {} @Module({ imports: [ NaiveUserNotificationModule.register( SmsNotificationModule ) ] }) export class ConsumerModuleWhichDecidesToUseSMSNotificationModule {} ``` #### What have we done? * Created a common interface: `NotificationExecutor` * Create two implementations: `EmailNotificationExecutor`, `SmsNotificationExecutor` which have been delegated to their respective modules as Provides. Also, the Executors are exported by an aliased value: `“NotificationExecutor”.` This token is expected in `NaiveUserNotificationService`. Next steps would be: * Put all classes into dedicated modules * Create a `UserNotificationContractModule` which keeps: * `NotificationExecutor` interface * `“NotificationExecutor”` token constant * Executors would import `UserNotificationContractModule` to implement the interface and properly export their dependencies * `NaiveUserNotificationModule` would import `UserNotificationContractModule` to make use of the interface and the token constant * `NaiveUserNotificationModule` would also import concrete Executors’ modules * Create an `EmailToUserNotificationBridgeModule` and `SMSToUserNotificationBridgeModule` to decouple the pure Email and SMS senders from the specifics of `NaiveUserNotificationModule`. The ‘specific’ part is the fact that `SmsNotificationExecutor` module has to export the service by a token which is specific to another module. Reusable components should have no knowledge about their consumers. The Bridge between can allow to mitigate that, keeping Email and SMS Modules unaware of consumers. The Brigde would now carry that awareness but that’s it’s fundamental purpose. ## Summary By the approach I just showed you we achieved a clean dependency structure, no circular dependencies, no SOLID rules broken, full extensibility and configurability. Dynamic Modules are a great tool but there is much more in NestJS arsenal related to Dependency Inversion Principle: obtaining modules by ModuleRef class, lazy loaded modules are there to be used so check them out! ## Optimise Sign-In Experience. Free Ebook for Product Owners and CTOs [Get PDF] *Published: 2023-10-30 | Author: piotr | Tags: business strategy, product development* *Source: https://brightinventions.pl/blog/optimise-sign-in-experience-free-ebook-product-owners-ctos-pdf/index.md* **With so many sign-in authentication methods, it might be difficult to choose the right one for your solution. Making a bad decision can decrease your users' experience and eventually harm your business. Download the ebook and discover all sign-in options. Finally, follow the decision tree to choose the ultimate authentication method for your application. Get this free ebook now!** ## What’s inside the sign-in experience ebook? Discover the table of contents: 1. Applications require signing users in. 2. Enter password. 3. SMS code. 4. Email code. 5. Open Authorization (OAuth). 6. OpenID Connect. 7. Sign in with Apple. 8. Biometric authentication. 9. Multi-Factor Authentication. 10. Which authentication method should I choose? ## Download the ebook and get answers to the following questions * Which sign-in option is the best for your application? * What security aspects require consideration? * How is GDPR related to sign-in? * Should I build it myself or use off-the-shelf software? * What authentication method should I choose (decision tree)? ## Ebook author Piotr Mionskowski is a Head of Technology and Partner at Bright Inventions with over 12 years of professional experience in software development. He is an expert in backend APIs, distributed systems, backend frameworks, and databases. He possesses an exceptional ability to learn almost every new technology that appears.
    ![Piotr Mionskowski](../../static/images/piotr_ebook_author.png "Piotr Mionskowski")
    ## Value Based Recruitment in VUCA World *Published: 2023-10-28 | Author: ula | Tags: inspiration, business, recruitment* *Source: https://brightinventions.pl/blog/value-based-recruitment-in-vuca-world/index.md* Living in a [VUCA (Volatile, Uncertain, Complex, and Ambiguous)](https://en.wikipedia.org/wiki/Volatility,_uncertainty,_complexity_and_ambiguity) world requires both individuals and organizations to adapt and thrive in an ever-changing and unpredictable environment. Being able to adjust quickly to changing circumstances is crucial to respond swiftly to emerging opportunities and threats. The VUCA world demands constant acquisition of new knowledge and skills to remain relevant and competitive. However, there are still traits that remain constant. These are core values that we follow in private and professional life. **Core values are not just words that you put on your office walls, they are the backbone of any organisation culture.** They create the sense of identity and purpose that make people work together towards coming golas. They drive employees to promote ethical behaviours and build strong relationships.  **At Bright Inventions we foster [the culture of responsibility, flexibility, teamwork, positive attitude and client orientation.](https://brightinventions.pl/about-us/#core-values) Our core values serve as guiding principles, kind of unifying force that helps us make sure employees are aligned with the company's mission and vision.** They foster a sense of belonging and a common understanding of the organization's goals. That is why, we have also decided to use them as one of the main tools in our recruitment process.  ## **Competence based recruitment - start here** If you do not feel sure about building the value based recruitment process from scratch, competence based recruitment (CBR) might a good starting point for you. It is a hiring approach in which recruiter’s or hiring manager's goal is to assess candidates' specific skills, knowledge, abilities, and behaviours relevant to the particular job. **Instead of solely relying on qualifications and experience, CBR aims to match candidates' competencies with the specific requirements of the position.** 
    ![hire for attitude](../../static/images/hire-for-attitude.jpg "undefined")
    **Before you begin the process, you have to determine what are the specific competencies required for the role you are recruiting for.** This involves understanding the tasks, responsibilities, and challenges associated with the position. Before publishing a job description conduct a comprehensive job analysis to understand and highlight the essential competencies a candidate must possess. Come up with some determined competences criteria to [the screening phase](https://resources.workable.com/stories-and-insights/phone-screen-interview) and ask all candidates the same questions. **You have to know what really matters for the role.**  During the interview apart from behavioural questions a good choice might be requesting some work samples to evaluate candidates' technical abilities and demonstrate how they apply their competencies in practical tasks. While planning your process take advantage of **[a structured scoring system](https://recruitee.com/articles/structured-interview)** to objectively evaluate candidates based on their demonstrated competencies. This will help you compare candidates fairly and consistently. For Polish speakers I also recommend the book "Rekrutacja oparta na kompetencjach" by Agnieszka Ciećwierz, who in a very comprehensive and at the same time simple way explains how to create such a hiring process that will help you choose the person for a particular job to be the one who best meets the employer's expectations, and consequently, will most effectively carry out the assigned tasks. ## **Value based recruitment guidelines**  Now, when you know more or less how competence based recruitment works, replace the word “competence" with the word “value” and you may achieve even better results. **Thanks to the value-based recruitment process organization can increase their chances of selecting the best-fit candidates who follow their necessary values to excel in the role and contribute to the success of the organization.** To start your value bases recruitment adventure you have to identify which beliefs and standards are essential to your company and which core values you want to include in the process. As a (hiring) manager or recruiter you have to make sure you understand them properly. Think how [these beliefs translate into daily behaviours and dat-to-day tasks at work](https://hbr.org/2002/07/make-your-values-mean-something). If there are not defined any core values in your organisation, take one step back and check how to discover them. 
    ![steps to create core values ](../../static/images/steps-to-create-core-values.png "undefined")
    ###### Source: https://blog.deliveringhappiness.com/10-steps-to-creating-core-values-that-your-company-lives-by-infographic Then develop a clear and well-defined values framework that will outline the key values  necessary for success in the role and in your team in general. The same as if you were choosing the primary competences, just here you choose the primary values. These values should align with the organization's culture. **Each value should have a rating scale [to minimize the potential risk for bias in the hiring process](https://brightinventions.pl/blog/cognitive-bias-how-it-affects-our-hiring-decisions/). It will help you understand what you are looking for in a candidate beyond  their commercial experience and beyond how well you get along with someone.**  To make the whole process work well I really encourage you to implement [behavioural-based interview questions](https://www.themuse.com/advice/behavioral-interview-questions-answers-examples) to assess candidates' behaviours in specific situations. Ask candidates to provide examples of how they have demonstrated the required value in previous roles or experiences. You can also take advantage of roleplaying exercise that will help you observe how candidates behave in prospective real-life circumstances and which values may motivate their behaviours. **A good strategy (if applicable or possible) might be also involving in the process a few interviewers including managers and team members, to obtain diverse perspectives on candidates' suitability for the role.** 
    ![diversity ](../../static/images/diveristy-.jpeg "undefined")
    **[Ensure the value-based recruitment process is fair, transparent, and free from bias.](https://brightinventions.pl/blog/cognitive-bias-how-it-affects-our-hiring-decisions/) Values should be present at every stage of the recruitment and hiring process. This ensures you’re connecting with the right people every step of the way** Remember that focusing on core values does not mean you should not encourage diversity and inclusion. The process just prioritizes particular beliefs and aspirations, but there is still space for diversity which encourages creative and innovative thinking.  ## **VUCA & Value-based recruitment**  Having a strong company DNA can help individuals and organizations not only survive but thrive in the face of uncertainty and complexity. **When faced with complex decisions in recruitment process, core values provide a framework to make choices that are consistent with the company's beliefs and long-term objectives.** They let us build an effective team regardless of the environment or circumstances our organisation is facing.  The VUCA world encourages recruiters and managers to think creatively to address emerging challenges. These quick adjustments to changing circumstances lead to improved efficiency and effectiveness in the hiring process and make us choose the best talents for the role. Some uncertainty creates gaps in the market, but value based recruitment emphasises the importance of culture fit when hiring new employees**. When a new hire’s value system aligns with the reality of the organisation, they can feel happier in their new role and do their best work.** 
    ![happiness at work ](../../static/images/screenshot-2023-07-25-at-10.43.47.png "undefined")
    ###### Source: Association for Talent Development **Creating a successful values-based recruitment plan depends on how well you know your organization, as well as the values that drive company-wide decisions and behaviors**. By knowing well what your organisation values, you can then identify those values in recruiting candidates. **The bad hiring decisions are made every day value-based recruitment is one of the tools that may help avoid them.**  ## **Food for thought** Do you know core values of the organisation you work for? Do you know what do the core values in your work environment mean?  Do you feel that your core values are visible in different areas of work? If you feel that you share the same values as we do, drop us a line via our [Career page](https://brightinventions.pl/career/) and let us talk about our future bright collaboration! 🧡 ## Uncomfortable Truths in Business Development *Published: 2023-10-27 | Author: agata | Tags: business perspective, business* *Source: https://brightinventions.pl/blog/uncomfortable-truths-in-business-development/index.md* **My previous blogpost explored [leaving the comfort zone](/blog/stepping-out-of-your-comfort-zone/). Inspired by my team colleague Ula and her recent [blogposts](/blog/4-interpersonal-skills-that-can-save-your-software-team-time-and-money/), as a former business owner I will share some thoughts on comfort zones in business.** 
    ![truths in business](../../static/images/comfort_zone_blogpost-4-.png "truths in business")
    ## **The Regret of Silence** Reflecting on missed opportunities in business and product development often unveils pivotal lessons.  **🧐 What was one thing that you regret not doing that could have helped you where you at today in your business project?** For me it was not telling the uncomfortable truth and not identifying my clients needs. \ Remember, that you made your project not for yourself, but for your clients and the only way to make it billable, is to meet your client needs. You have to ask for feedback and hear (probably) some unpleasant words. In the fast-paced world, effective communication is key. Hesitating to hear or voice concerns or share uncomfortable truths can slow down progress and innovation.  It's a crucial aspect that could have steered my - and probably yours - journey differently.
    ![client feedback](../../static/images/7e0c1ff5-a2b1-42e1-babd-d119cb313565.webp "feedback")
    ## **Unblocking Stagnation in Business Development** In business development, encountering team roadblocks is common, often causing delays in product delivery and subsequently leading to increased costs. Who wants that? Nobody. So, where's the remedy? **🚨 Instead of removing a team member in the face of challenges, consider that the issue may not lie with the individual.**  Removing someone doesn't always resolve underlying problems; sometimes, discomfort stems from comfort zone, meaning unspoken truths and unmet needs within the team. ## **Leaving the Comfort Zone. Again** Stepping out of the comfort zone means more than structural changes. Sharing challenges openly can catalyze a shift.  Instead of changing individuals, address uncomfortable truths to bring sustainable improvements through situational adjustments. \ \ **👉 State your problem and interests.** \ **👉 Acknowledge others' problems and interests**. \ **👉 Ask, listen and understand.** \ This fosters a deeper team understanding and paves the way for collaborative problem-solving.
    ![lincoln's quote](../../static/images/teamwork-quotes-abraham-lincoln.png "lincoln's quote")
    ## **Conclusion: The Power of Uncomfortable Truths** In the realm of business development, acknowledging uncomfortable truths is not a weakness but a strength.  It's the gateway to innovation, growth, and resilient team dynamics.  Reflecting on my own journey, I've come to realize that the ability to speak uncomfortable truths and identify unmet needs is not just a personal development tool but a crucial element in the success of any business project. Remember, that embracing discomfort might be the key to unlocking your team's full potential.
    ![undefined](../../static/images/73v1na.jpg "undefined")
    \ \ source: \ https://www.extension.iastate.edu/agdm/wholefarm/html/c6-56.html ## Use These 7 Metrics to Measure Your Mobile MVP Success [Cheat Sheet Included] *Published: 2023-10-19 | Author: izabela | Tags: business, mobile development* *Source: https://brightinventions.pl/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/index.md* **You have an idea, design, and maybe even a software development team to build your mobile application. Still haven't you forgotten about something? What about establishing key targets that you want to achieve? Only then can you verify if your product is successful. Check out how to do that!**
    ![MVP success metrics](../../static/images/blogpost_mvp_success.png "MVP success metrics")
    - - - ## Table of contents [Metric #1: App Download Rate](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-1-app-download-rate) [Metric #2: User Retention Rate](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-2-user-retention-rate) [Metric #3: Churn Rate](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-3-churn-rate) [Metric #4: User Engagement](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-4-user-engagement) [Metric #5: Actions and Conversion Rate](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-5-actions-and-conversion-rate) [Metric #6: Customer Acquisition Cost (CAC)](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-6-customer-acquisition-cost-cac) [Metric #7: Customer Lifetime Value (CLV)](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#metric-7-customer-lifetime-value-clv) [MVP success metrics – cheat sheet](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/#mvp-success-metrics--cheat-sheet) - - - Let’s assume that you chose an Agile way and decided to build [MVP (Minimum Viable Product)](/our-areas/mvp-development/), so you can quickly release your solution and verify it with users. While working on the MVP, **at the very beginning, you should establish your goals and ways to measure them**. Naturally, they can change as the product evolves and you gain a better understanding of the market. ## Examples of MVP success metrics Here are some MVP success criteria for validation of your MVP, along with recommended tools to help measure them: ### Metric #1: App Download Rate This metric is crucial for mobile MVPs and indicates how appealing your app is to users and whether your marketing efforts are effective. To calculate the download rate, use the following formula:
    App Download Rate (%) = (The number of users who download the app / The number of users who click promotional content) x 100
    Remember that downloading isn’t everything, though. [50% of Android apps are uninstalled within 30 days after the download](https://www.businessofapps.com/news/half-of-android-apps-are-uninstalled-within-30-days-after-download/). If your download rates are satisfactory but the number of active users is extremely low you might be dealing with a **high uninstall rate**. That’s why the app download rate cannot be measured without the retention rate (keep on reading to discover that). Tools to track app download rate: You can track app downloads using tools provided by well-known mobile app stores: **Google Play Console** for Android apps, and **App Store Connect** for iOS apps. ### Metric #2: User Retention Rate It measures what **percentage of users continue to use your app after a given period** such as 30 days after app installation. User retention rate might be a crucial measurement to see if your product has loyal and engaged customers. To calculate the user retention rate, you can use the following formula:
    User Retention Rate (%) = \[(The number of users at the end of a specific period - The number of new users acquired during that period) / The number of users at the start of the period] x 100
    **Tools to track user retention rate:** **Mixpanel, Firebase + Google Analytics** and **Amplitude** will be of help in measuring user retention rate. ### Metric #3: Churn Rate This metric **measures the percentage of users who uninstall or stop using your product** over a given period. It helps identify potential issues with your app that might be causing users to churn. To calculate the churn rate, you can use the following formula:
    Churn Rate (%) = \[(Customers at the Start of the Period - Customers at the End of the Period) / Customers at the Start of the Period] x 100
    There are many possible reasons why your users might delete your app or simply stop using it. The most common are: * **Wrongly targeted or misleading ad campaigns** – users download the app only to realize that it’s not useful to them or it doesn’t offer what was promised. * **UX issues** – your app is too difficult to navigate or not enough visually appealing. * **Tech issues** – your app has performance issues, it frequently crashes, etc. * **Too many notifications** – we all know that notifications are a powerful feature for mobile apps but be careful. With that power comes responsibility. * **Too many ads** – what can we add here? Make your app worthy for users, then reasonably monetize. 😉 **Tools to measure churn rate** Tools like **Mixpanel, Amplitude, or Kissmetrics** offer features to monitor and analyze churn rates. ### Metric #4: User Engagement This metric **measures how engaged are users who interact with your mobile MVP**. You can track actions such as making a purchase, time spent on the app, and viewing certain screens. Here's one of the ways to calculate user engagement:
    User Engagement Rate (%) = (Number of Engaged Users / Total Users) x 100
    The definition of "engaged users" can vary depending on your business. You should choose the activities that will define your active user and track them with the preferred tool. **Tools to measure user engagement** Tools like **Firebase, Mixpanel, and Amplitude** offer features to measure user engagement and provide insights. ### Metric #5: Actions and Conversion Rate This metric **measures the percentage of users who complete a desired action**, such as signing up, making a purchase, finishing onboarding, or filling out a form. Some of these actions directly impact the revenue generated by your MVP. So this is a metric that every app owner wants to measure. The formula for calculating the conversion/action rate is as follows:
    Conversion Rate (%) = (Number of Conversions / Total Number of Visitors or Users) x 100
    Action Rate (%) = (Number of Actions / Total Number of Visitors or Users) x 100
    **Tools to measure conversion rate** Tools like **Firebase, Google Analytics, Kissmetrics, or Optimizely** can help you track and optimize your conversion rates. ### Metric #6: Customer Acquisition Cost (CAC) This metric **measures the cost of acquiring a single customer**. It is calculated by dividing the total cost of sales and marketing efforts by the number of new customers acquired during the same period. You can compare the budget spent for different acquisition channels and eventually make a decision on which activities are the best option for your solution. Based on your company's marketing budget you should establish a maximum cost per customer acquisition that you can spend to get clients. It’s a key metric to establish at the beginning, so your financial books are well-balanced. It’s wise to benchmark your CAC. Every industry has to consider different costs. You might consult your marketing budget with marketing freelancers or agencies that specialize in targeting campaigns in your industry. You can also discuss your estimated bids on digital marketing specialist groups on Facebook or LinkedIn, however, remember to verify the answers. To calculate CAC, you can use the following formula:
    Customer Acquisition Cost (CAC) = Total Sales and Marketing Expenses / Number of New Customers Acquired
    **Tools to measure Customer Acquisition Cost** Tools like **HubSpot, Salesforce, Adjust, Google Analytics (connected with Firebase), and Google Keyword Planner** can assist in estimating, tracking, and analyzing customer acquisition costs. ### Metric #7: Customer Lifetime Value (CLV) This metric **measures the total revenue generated by a customer over their entire relationship with your company**. Calculating CLV involves multiplying the average value of the purchase by the number of purchases made by the customer in a year and then multiplying that by the average length of time, a customer remains active. Here's a basic formula for calculating CLV:
    CLV = (Average Purchase Value x Average Purchase Frequency x Average Customer Lifespan)
    **Tools to measure Customer Lifetime Value (CLV)** Tools like **HubSpot, Salesforce, or Kissmetrics** can help you track and analyze customer lifetime value. ## MVP success metrics – cheat sheet Here’s the summary of all mentioned metrics with short definitions. Enjoy!
    ![MVP success metrics cheat sheet](../../static/images/mvp_success_metrics-cheat_sheet.png "MVP success metrics cheat sheet")
    ## Choose the right metrics and analytics tools for your MVP Remember, these are just a few examples of metrics. There are others and maybe even more suitable for your specific MVP and industry. Final things to remember about MVP analysis: * It's important to choose the most relevant metrics for your business goals and use tools that provide accurate and actionable insights. * Don’t surround yourself with too much data, though. Choose only key metrics that you want to follow. * Choose metrics at the beginning of your MVP development. Don’t start to think of analytics after the launch. By then you should have a clear plan of what to measure. Are you planning to develop your mobile application? Feel free to contact my colleagues from [Bright Inventions ](/our-areas/mobile-app-development/)to discuss your mobile solution. ## Strong Women in IT 2023 - Find Your Own Role Model *Published: 2023-10-12 | Author: ula | Tags: inspiration, leadership, role models* *Source: https://brightinventions.pl/blog/strong-women-in-it-2023-find-your-own-role-model/index.md* Gender diversity in each industry (not only tech) is important for several compelling reasons. **We all know that diverse teams bring a variety of perspectives and experiences to problem-solving which leads to more creative solutions and innovations, as different viewpoints are considered.** We also know that fostering an inclusive and diverse work environment can improve employee morale and job satisfaction. This, in turn, can lead to higher retention rates and increased productivity. As the tech industry operates on a global scale, understanding diverse cultural backgrounds and market dynamics is even more crucial. **Diverse teams are better equipped to navigate international markets and cultural nuances.** Still while looking at IT industry we can see many women facing barriers to entry and advance in tech careers due to biases, stereotypes, and lack of access to mentorship opportunities. It is also commonly known that they have been underrepresented in senior IT management roles including positions like CTOs, CIOs, and CEOs of tech companies **[despite some visible rise of female leadership in recent years](https://oatuu.org/the-rising-trend-of-women-ctos-shaking-up-the-industry/).** According to a recent study, women hold just 10% of CTO positions at Fortune 500 companies and according to a report by The World Bank, **[women make up less than a third of the world’s workforce in technology-related fields.](https://www.womentech.net/women-technology-statistics)**
    ![women in tech ](../../static/images/women-in-tech-force-.png "undefined")
    Source: https://financesonline.com/women-in-technology-statistics ## **organisations that support women in tech**  Despite the aforementioned challenges, there is a growing number of female founders and entrepreneurs in the tech space, particularly in areas like health tech, ed tech, and e-commerce. **Also many organisations and advocacy groups work to promote diversity and inclusion in the IT industry. Many initiatives include mentorship programs, scholarships, and increasing female representation at tech conferences and events.** Each with its own unique goals and objectives. [Among some well-known international ones we can find:](https://www.cio.com/article/215709/16-organizations-for-women-in-tech.html)  💃 **[Girls Who Code](https://girlswhocode.com/)** - to close the gender gap in technology by inspiring and educating girls in computer science and coding, providing them with the skills and confidence to pursue tech careers. 💃 **[Women in Technology](https://women-in-tech.org/)** - to empower and support women in the tech industry through mentoring, networking events, and educational programs, with a focus on leadership and career development. 💃 **[AnitaB.org](https://anitab.org/)**  - to increase the representation of women in technology and improve the workplace for all women by connecting, inspiring, and guiding women in tech. 💃 **[Black Girls CODE](https://wearebgc.org/)** - to introduce programming and technology to girls of color, with a focus on underrepresented communities, and to provide them with the skills and opportunities to pursue tech careers. 💃 **[TechWomen](https://www.techwomen.org/)** - to empower, connect, and support women in STEM (Science, Technology, Engineering, and Mathematics) from Africa, Central Asia, and the Middle East by providing professional mentorship opportunities in the United States. 💃 **[National Center for Women & Information Technology ](https://ncwit.org/)-** to increase the diversity of the technology workforce by encouraging and supporting the participation of women, as well as underrepresented groups, in IT and computing fields. ## **tech space for women in Poland**  While there has been progress in recent years, there is still work to be done to achieve greater gender diversity in the Polish tech sector. The current state of women in tech in Poland reflects a broader global trend of underrepresentation and unique challenges faced by women in the tech industry. 
    ![women in IT Poland ](../../static/images/women-tech-poland.png "undefined")
    Source: [https://nofluffjobs.com/insights/raport-kobiety-w-it-2023](https://nofluffjobs.com/insights/raport-kobiety-w-it-2023/) **There is still the shortage of visible tech female role models which may be also discouraging for some young women from pursuing tech careers.** It is important to highlight and celebrate successful women to inspire the next generation. I am really glad that there are positive developments in Poland such as v[arious organizations and communities dedicated to supporting and empowering women in tech.](https://brightinventions.pl/blog/polish-organizations-that-support-women-in-tech/) There are also special educational institutions and organizations that offer programs to encourage girls and young women to pursue STEM education and tech careers. And also some tech companies are actively working on fostering more inclusive and diverse workplaces, including gender diversity. ## **Strong Women in IT** [Strong Women in IT](https://strongwomeninit.com/) was initiated in 2018 as a concept and then it became a respected brand, engaging directly with around 350 women at the C-level from the tech industry. I**ts mission is to show ambitious, entrepreneurial, and strong women and make true female leaders more visible in IT area so that they can serve as role models and inspire other female specialists to pursue careers in technology.** I believe that this kind of initiatives can be really encouraging for girls and young women who are pondering about pursuing Science, Technology, Engineering, and Mathematics career as well as to women who just would like to collaborate with tech companies in different non-tech roles to create a more inclusive ecosystem. **This year Strong Women in IT (SWIT) is breaking records with 251 remarkable stories from inspiring women across Europe, America, Asia, and Africa.** Each finalist brings unique inspiration, shares challenges, and offers different perspectives. They are all ready to serve as role models for others. **One standout discovery is that over 50% of SWIT finalists now prefer mentoring as their learning method of choice.** This shift underscores the collective desire to support fellow women, build communities, and share experiences for growth.
    ![gaining knowledge - Strong Women in IT Report 2023](../../static/images/gaining-tech-knowledge-.png "undefined")
    In these turbulent times, SWIT finalists openly discuss their fears and the daily uncertainties they face. Yet, they remain resilient and inspired by new technologies. A notable change is in how we work: only 3% prefer the traditional office model. The majority see the future of work as a blend of full remote or hybrid arrangements. **If you want to see more detailed statistics and insights, you can download the full report [HERE](https://strongwomeninit.com/en/download/).  There are dozens of stories of influential women in the global tech industry. Among them is also mine - in which I am telling a bit about my story and road to IT industry.** 
    ![Ula Strong Women Quote](../../static/images/ula-strong-women.png "undefined")
    ## **find your role model**  Having a role model when entering IT industry, or any field, is valuable for many reasons. **First of all, [role models can inspire and motivate you as a newcomer.](https://www.womenintech.co.uk/the-importance-of-role-models-for-women-in-tech) They demonstrate what is possible and provide a source of inspiration for those who might be unsure about their own potential.** Role models can also challenge stereotypes and biases. In male-dominated fields like IT, having female role models, for example, can challenge the stereotype that tech is exclusively for men - I even don’t know why this kind of stereotypes still exist, but they do. So, role models can offer guidance and advice based on their own experiences. This can be invaluable while navigating a new industry.  **And I think just seeing someone who looks like you or has a similar background succeed in the industry you want to enter can boost your confidence and self-belief.** 😊 What is more, role models can provide you with a realistic view of what to expect including challenges and setbacks, and how to overcome them. They can be also a source of emotional support and encouragement, especially during difficult times in one's career. So, find your own - the role model or role models - who will help you understand your strengths, inspire to act and support in further development. And at the same time remember that you are [your own role model](https://www.educative.io/blog/being-your-own-role-model-woman-tech) and you are setting your own standards for success. ## Why a Small Budget for App Development Can Be an Advantage for Startups *Published: 2023-10-09 | Author: mateusz | Tags: business* *Source: https://brightinventions.pl/blog/small-budget-for-app-development-advantage-for-startups/index.md* **A smaller budget at the beginning of your startup story may help you build the project with bigger chances of succeeding. How come? Check out why a limited budget can enhance creativity, simplicity, and data-driven development.** ## A low budget helps to make rational decisions while building MVP ### 1. Choose only crucial features, not every feature you’d love to have. Sometimes, CTOs and startup founders forget that building MVP (Minimum Viable Product) is not about delivering a perfect solution that has it all. At the beginning of the development process, you should choose only key features to include in your MVP. It helps you to limit your spending on software development. Remember that there is no guarantee that your MVP will be a success. The advantage of an MVP is its **short time to market – you can quickly and affordably verify your MVP** with users and start making data-driven decisions. **MVP is to learn from data and adopt**. **A small budget won't let you succumb to the temptation to overbuild your MVP**. Sometimes, the features you build will not be appreciated by users. Therefore you might need to change your strategy or even give up on your idea with – hopefully – big lessons for the future. ### 2. You don’t necessarily need two apps for both stores. Are you experiencing a smaller budget for mobile development? How about building an app only for one operating system? Just like Instagram did. They launched their app first on the App Store. Sometimes it’s **worth focusing on one platform** in the initial phase. Or consider **going for hybrid app development**. With tools like Flutter or React Native, you can build one app for both ecosystems. Although these [cross-platform apps carry some limitations](/blog/native-app-development-vs-cross-platform/), they can be a viable solution for a startup with a small budget. ## Limited funds protect from losing money on a product that won’t attract clients As we stated earlier, not every MVP will be successful. Actually, [most startups fail](https://www.embroker.com/blog/startup-statistics/). So a **smaller budget enables you to save costs and minimize financial risk**. Even if you verify your idea before the development process starts, the proper validation comes after the MVP launch. Then you will know if your solution is attractive to users and can get you clients. If not, you can always try to pivot, just as other giants did. Check out [Twitter, Instagram, or YouTube pivot stories](/blog/app-development-pivots-that-prove-the-mvp-works/). ## A tight budget helps to be creative and keep it simple and UX-friendly at the same time A smaller budget pushes you to look for simple but still high-quality solutions. It's great when you have a team or MVP partner who is flexible in looking for creative ways when they are more beneficial. I asked our colleagues how they find more creative and often low-cost ways to meet client’s goals. Here’s an example:

    Implementing a low-cost and more user-friendly solution

    The client wanted to implement quite complex functionality, which was designed as a set of 5 separate screens. After analyzing the client's requirements, we proposed a more straightforward solution that included all the necessary features on a single screen. Following a consultation with the designer, the client chose our proposal, which turned out to be easier to implement and more user-friendly.
    Michał Waśniewski, Senior iOS Developer at Bright Inventions
    ## A small budget helps to create an app that users need and want A smaller budget makes you go deeper into analytics, and that's great! Analytics is often neglected. After the MVP launch, **startup founders often focus too much on app reviews rather than actually going deeper into users' activity**. Thanks to analytics tools like Firebase and Mixpanel, you can **check what features your users really use, what screens engage them, and what features you can simply give up on**. Read more about [mobile MVP success metrics](/blog/metrics-to-measure-mobile-mvp-success-cheat-sheet/) to know what to measure if you build a mobile solution. Not many startups can afford to keep developing the product of their dream, rather than the product their users desire… We recommend you follow the user-oriented path. 🙂 ## Szymon Chmal Will Speak about React Hydration at the dev.js Summit *Published: 2023-10-03 | Author: izabela | Tags: update, frontend* *Source: https://brightinventions.pl/blog/szymon-chmal-will-speak-about-react-hydration-at-the-dev-js-summit/index.md* **Are you planning to attend the dev.js Summit (online) Autumn Edition? Don’t miss a talk by Szymon Chmal, Senior Frontend Developer at Bright Inventions. Join the online event comfortably from your office or home on 12 October 2023. Tickets are free!**
    ![Szymon Chmal dev.js speaker](../../static/images/szymon_devjs.png "Szymon Chmal dev.js speaker")
    ## Szymon’s talk – The New Face of Hydration If you are creating applications in React, you have probably encountered the concept of hydration. The bright side of this process is that our application, initially rendered on the server side, becomes interactive. Not long ago, hydration had to be performed in an "all or nothing" mode and often became noticeable to the end user. Fortunately, the situation has changed with the latest version of React. Hydration can now be divided into phases and even prioritized. What exactly does this mean? You will find out during this presentation. **Szymon will uncover the new face of hydration on October 12 at 2.30 p.m. online. [Claim your spot now](https://devjssummit.pl/)!** ## Learn more about bright speaker Szymon is a senior frontend developer with a holistic view of software. In love with React, but open to new technologies regarding both frontend and backend areas. Technology is for him just a tool used to provide business value to software products he is working on. Do you want to know more about Szymon? [Read this interview](/blog/frontend-developer-with-an-appetite-for-backend-meet-szymon/). ## See you online [Get a free ticket now](https://devjssummit.pl/)! Also, find out what other speech you can find in the dev.js Summit agenda. ## Implementing Payments: Key Questions for Startup Founders and CTOs *Published: 2023-09-27 | Author: fjablonski | Tags: business, POS* *Source: https://brightinventions.pl/blog/implementing-payments-key-questions-for-startup-founders-and-ctos/index.md* **Payment is one of the most important features of digital products. In case any problems arise, both you and your users could potentially experience financial losses. So based on our over 10 years of experience in building digital products, we gathered some recommendations for payment implementation for startup founders, CTOs, and tech leaders.**
    ![Payments](../../static/images/payments.png "Payments")
    Payment can enable you to monetize your solution. Or it can be an important feature for your users. For example, if you offer a retail [POS solution](/projects/pos-legacy/), payment is the heart of it. If there are any issues with it, your clients will lose money. **The success of payments doesn't solely depend on your development team's code but rather on the business decisions you make** before any programming lines are written. **Things to consider before you add a payment feature to the software development team’s backlog:** ## 1. Do you need the payment for international markets or locally? If you need to implement payments for a specific country, it might be wise to seek a local provider that is well-versed in the market's nuances and regulations. However, if you need to facilitate international payments, your payment provider probably should be one of the top players, such as Stripe, PayPal, and Zettle by PayPal. ## 2. Do you need a small provider or a top player on the market? There is no ideal option for everyone, so you need to analyze the pros and cons from your business perspective. The final decision often relies on the size of your organization. Startups and SMEs will likely have different needs compared to large enterprises. ### Advantages of large payment providers: * Stable and mature payment solution. * Technical support. * Lots of helpful resources and docs for software engineers. ### Disadvantages of large payment providers: * Possible slow response time from support (if you're small, you’re not a key client). * Less attractive price models (the smallest volume, the bigger price). ### Advantages of smaller payment providers: * Chance for lower prices. * A possible better response time from support (they often try to offer better customer support to stand out from bigger providers). * Flexibility and startup culture (it might be a plus for small companies). ### Disadvantages of smaller payment providers: * Less stability: their product is often in the early stages of development and updates might affect your payments. * Less amount of resources and docs for software engineers. ## 3. Who is responsible for any technical issues with payments? You or your payment provider? You need to determine who will be responsible for any payment malfunctions – you or your payment provider. For example, if you offer a mentioned POS system, your client will contact you about unavailable payment features even if you aren't directly responsible for them. You need to ensure that your payment provider will take responsibility for issues with payments.
    ![Card payment](../../static/images/card_reader_case_study_app.png "Card payment")
    ## 4. Will your provider offer you an account manager? It's smart to choose a provider that will offer an account manager. This is a person who will not only be a first responder to your problems or needs. **The account manager should also inform you about any payment anomalies and give you a heads-up when security certificates are about to expire**. It's good to have that support from your payment provider's side. ## 5. What is the payment culture of your target group? Choosing the payment method is a decision that should depend on your users' habits. These might vary [depending on the country](https://pay-lobby.com/en/country). For example, in the USA and the UK, online payment with debit/credit cards and e-wallets are the most popular. On the contrary, there are countries where bank transfers are one of the most common payment methods (e.g. Netherlands, Poland). [Over 40% of eCommerce users](https://www.ppro.com/news/retailers-risk-losing-customers/) in the USA stop a purchase if their favorite payment method isn’t available. So **don’t try to change your users' habits, embrace them**. ## 6. What information should be included in the payment statement? In some cases, users are extremely protective of their anonymity. For example, if you build a web therapy platform, your users may not be willing to share the information that they struggle with some mental issues. So they don't want the payment to visibly state that they use a web therapy platform. Especially when another family member has access to, for example, the credit card statement. That's why you need to decide what's the proper name for the payment statement for your solution. ## Join Us for a Torun Web Development Meetup *Published: 2023-09-25 | Author: izabela | Tags: update* *Source: https://brightinventions.pl/blog/join-us-for-a-torun-web-development-meetup/index.md* **We are calling web developers from Toruń and nearby! Whether you're a seasoned web developer or just starting your journey, let’s meet at Toruń Technological Incubator. We have an event coming on October 18! Toruń, here we come!**
    ![Torun Web Development Meetup](../../static/images/blog_torun_meetup.png "Torun Web Development Meetup")
    ## What to Expect at Torun Web Development Meetup #1 \[Agenda] ### 📌 Registration and Networking | October 19, 6.00 PM – 6.15 PM We'll start with some casual networking, giving you the opportunity to meet other web enthusiasts and share your experiences. ### 🚀 Web Components – The Illusion of Encapsulation | Wojciech Trawiński | 6.15 PM – 6.50 PM Encapsulation, independence, and reusability are the buzzwords that technology Web Components are described, much like a Hollywood story. But is it really justified? During my presentation, you will get to know the darker side of Web Components and learn how the context of your element's use affects its functionality. ### ☕️ Short Regenerative Break | 6.50 PM – 7.00 PM Grab that coffee and get ready for what’s next. ### 🚀 Frontend in Production | Olaf Sulich | 7.00 PM – 7.35 PM Frontend beyond the realm of Udemy courses. Discover how to create modern and secure user interfaces for millions of users. ### 🌐 Q&A and Discussion | 7.35 PM – 8.00 PM After the presentations, we will have time for questions and discussions. ### 🍕 Snacks and Networking | 8.00 PM – 8.30 PM Following the official part of the meeting, we invite you for snacks and further networking. It's a great opportunity to continue conversations and establish new connections. ## Meet our speakers
    ![Wojciech Trawiński](../../static/images/torun_speaker_wojciech.png "Wojciech Trawiński")
    **[Wojciech Trawiński](http://www.linkedin.com/in/wojciech-trawi%C5%84ski)** A Senior Software Engineer who specializes in creating web applications. He is an enthusiast of the Angular framework and reactive programming, always seeking challenges both in and outside of work. He is also the author of the blog "[JavaScript Everyday](https://medium.com/javascript-everyday)". In his free time, he enjoys watching Formula 1 and... building Lego. He is addicted to coffee, chocolate, and cycling.
    ![Olaf Sulich](../../static/images/torun_speaker_olaf.png "Olaf Sulich")
    **[Olaf Sulich](https://www.linkedin.com/in/olaf-sulich/)** A Senior Frontend Developer who isn't afraid of any challenges. The creator of the [Frontlive.pl](https://frontlive.pl/) blog and a community for ambitious programmers on Discord. Currently, he is working on developing one of the largest and most dynamic marketplaces in Poland – Allegro Lokalnie. ## Let’s meet in Toruń Are you ready to join us? [Get your free ticket now](https://www.meetup.com/toru%C5%84-web-development/events/295971160/)! ## Event Details Date: October 19, 2023 Time: 6:00-8.30 PM Location: Business Link Toruń Toruński Inkubator Technologiczny Hosted by: Bright Inventions Event Link: [meetup.com](https://www.meetup.com/toru%C5%84-web-development/events/295971160/) ## Stepping Out of Your Comfort Zone: Is It Worth It? *Published: 2023-09-21 | Author: agata | Tags: inspiration, motivation* *Source: https://brightinventions.pl/blog/stepping-out-of-your-comfort-zone/index.md* **Do you enjoy leaving your comfort zone? If your answer is a reluctant "probably not," you're not alone. The comfort zone is that cozy space where everything feels familiar and easy – like an MTB rider in the woods or a Netflix enthusiast on their favorite couch.** 😎
    brain mode
    ## 🧐 What is Leaving Your Comfort Zone? Leaving your comfort zone means venturing into new territory, doing things you might not naturally gravitate toward. It's like swapping a Netflix binge for an engaging book (or a blog-post 😉) about self development. But why should you willingly go into discomfort? The answer lies in personal progress and growth. When you step out of your comfort zone, your brain forges fresh neural pathways. Over time, these experiences become habits, leading to new skills and an expanded comfort zone. It's not just about trying new things; it's about connecting with people you might never have encountered and embracing previously unthinkable possibilities.
    ![magic happens](../../static/images/frame-43.png "undefined")
    ## 👧 My Personal Journey I used to feel apprehensive about new people and unfamiliar situations, but life repeatedly pushed me out of my comfort zone. One significant moment occurred when COVID-19 struck, necessitating a reevaluation and adaptation of my two tourism-related businesses. I found myself transitioning to a different role, working for someone else (hello, Bright Inventions team 👋), in the tech industry (I'm 'not exactly' a technical person 😇). This shift was entirely outside my comfort zone. However, this experience transformed my perspective, teaching me that change is an opportunity for growth and learning. ## 🌚 Identifying your Needs I believe it's common for people to sometimes be uncertain about their needs, direction in life, and what's truly good for them. Stepping out of your comfort zone is like widening its boundaries. We go beyond our comfort zone and use it as a litmus test to determine if something aligns with our needs. This process makes it easier to identify and, consequently, fulfill those needs. ## 🧠 The Role of Dopamine When we embark on unfamiliar journeys or learn new skills, our brains release dopamine, responsible for that exhilarating feeling when you achieve something new. It's your shortcut to feeling good!
    ![dopamine functions](../../static/images/function-of-dopamine.jpg "undefined")
    ## 🗣️ Speaking the Uncomfortable Truth Leaving your comfort zone also involves speaking uncomfortable truths, which can lead to a change in the situation among the same people, rather than changing the people themselves. Otherwise, you'll continue to encounter the same challenging situations with different individuals. ## 👟 Take Small Steps  Leaving your comfort zone is best done in small steps and increments. Sometimes, taking a small step beyond the zone is better than leaping far beyond it.
    ![get out of your comfort zone fish](../../static/images/screenshot-2023-09-20-at-14.32.01.png "undefined")
    Life has a way of pushing us out of our comfort zones precisely when we need it most. It challenges us to adapt, learn, and grow, making us better versions of ourselves. So, don't shy away from discomfort. Embrace it. Life's greatest adventures and profound discoveries often (or may I say - always) lie just beyond your comfort zone.   And I (and dopamine 💥) guarantee that you will feel great about yourself with every step! source: \ [https://mind.help/topic/dopamine/]()\ [https://news.cornell.edu/stories/2022/03/](https://news.cornell.edu/stories/2022/03/leaving-your-comfort-zone-inspires-motivation-growth)\ cover image source: \ [https://www.memesmonkey.com/](https://www.memesmonkey.com/topic/comfort+zone) ## iOS Developer Who Loves to Build Apps Users Rely On. Meet Artur *Published: 2023-09-15 | Author: arturs | Tags: bright story, bright insights* *Source: https://brightinventions.pl/blog/ios-developer-who-loves-to-build-apps-users-rely-on-artur/index.md* **He became an iOS developer by chance, but couldn’t love it more. Find out how Artur’s career has evolved over 5 years from a junior to a senior iOS developer. Check out the apps he has worked on. Discover his favorite travel destinations too. Let’s dive in!**
    ![iOS developer career story](../../static/images/brightstoryarturphotos.png "iOS developer career story")
    ## You joined Bright Inventions 5 years ago while you were still at college. How did you start your job here? I saw a job listing for a blockchain developer position and applied. However, before I had my interview, the position got filled. Yet, **Michał decided to still interview me and eventually offered me the position of iOS developer**. I didn't have any experience with iOS back then. I had maybe 2 classes about it in college. However, I always liked Apple products, so I thought I could go for it. That’s how I became an iOS developer. **Maybe it was a coincidence rather than a conscious decision, but I really enjoy [iOS development](/our-areas/mobile-app-development/)**. ## How would you compare your challenges at the beginning of your career to now? Back then, the team was much smaller. There were only 2 other iOS developers at Bright Inventions. Although they were very supportive, I needed to quickly learn a lot on my own. It required a lot of self-organization to find the answers online. **Then, my challenges were related to the learning process, using the programming languages, and how to structure my code**. Now, I work in a bigger team, and the daily challenges are different. Currently, **we focus on enhancing our communication and creating processes that will help us cooperate effectively**. I work in a team that consists of 6 people. Some would say it’s still a small group, but we really need to communicate well to move the development process forward So, my first challenge was to effectively manage work on my own. Nowadays, it is all about working effectively as a team. ## And how do you enjoy working with your current team? I am a part of an experienced and very competent team. It consists of only senior iOS developers who are highly engaged in what they do. We work on a food delivery app available on the Israeli market. I enjoy the fact that our client trusts us; therefore, we can choose the tech stack we use. Our team also includes skilled software testers. Although we, as developers, do some tests on our own during the code review, it’s great to share the responsibility. I still feel responsible for my code, but it’s great to feel the reassurance that there are people who will test it as well.
    ![Artur during a team retreat.](../../static/images/brightstory_team_szymek.png "Artur during a team retreat.")
    Artur during a team retreat.
    ## What projects, that you worked on, are particularly memorable to you? [Finebite](/projects/everytap/) for sure. **That’s a very popular app in Poland, and it was great to be a part of its development process from the beginning to the launch**. When people find out I am a mobile developer, they often ask me if I've worked on any apps they know. I always mention Finebite, and people recognize it. That’s cool. :) [Just Eat POS](/projects/system-for-restaurants-mobile/) (prev. Practi) was one of the projects close to my heart as well. It was **a retail platform, very popular, especially in the Israeli market**. We delivered solutions for restaurant owners and their employees. Our users and their businesses relied on our work daily. So, it was a huge responsibility. Yet, it's an advantage of building real solutions, rather than creating applications that will never see the light of day.
    ![Artur's quote on projects](../../static/images/artur_quote_real_products.png "Artur's quote on projects")
    ## What’s your recipe for spending over 5 years at one company? It’s rather unique nowadays. 😀 The key ingredient is changing the projects you work on. I've worked for various clients, with different people. Sometimes it almost felt like changing a company. **It’s great to change teams to share knowledge with others. There was never a case when I would land on a team without somebody I could learn something from**.
    ![Artur's quote on learning](../../static/images/artur_quote_learning.png "Artur's quote on learning")
    Although **I have been in one company for over 5 years, Bright Inventions gave me an opportunity to work on many different solutions and touch on various technologies**. What's also important **I have built products that are really used and appreciated by users**. I even traveled to London to see with my own eyes how the end users used the application I had built. It’s such a great feeling to see that your work gives value to someone. ## How do you catch up with news and trends in the iOS world? As probably every iOS developer, I always check all the news announced during The Apple Worldwide Developers Conference. Besides that, **I have OKRs dedicated to my personal growth, monitored by my mentor – Kamil**. We both choose topics that I can improve on or decide on what new solutions and tools I should test. Thanks to the fact that our client lets us choose the tech stack we work on, we can quickly implement new technologies in our project. **So we get to work with SwiftUI, async/await to utilize those for the benefit of our client staying up-to-date with Apple products**. ## I know you love to travel. Some of your favorite travel destinations are Scandinavia and Iceland. Why? I visit these places regularly to hike in nature. I had a chance to experience polar day and to see the Northern lights too. I don’t know which one is better. I recommend everyone to see both.
    ![Hiking in Northern Norway (nearby Tromso).](../../static/images/artur_passion_travel.png "Hiking in Northern Norway (nearby Tromso).")
    Hiking in Northern Norway (nearby Tromso).
    I would actually love to try living on a polar day. I'd like to experience living in a place where you can organize your life cycle whenever you want, and you are not dependent on the time of day or night. It’s not that easy to experience the northern lights, though. You have to be lucky. The sky has to be clear. It’s worth noting that the temperature was really low. When I was there, it was -27 degrees Celsius. ## I know you are going to the Manchester United vs. Liverpool game in April 2024. What is the score going to be? 😉 I’d say it is going to be 3-1 for Manchester United. At least I hope so. 😀 We’re about to find out. 😉
    ![Artur during Manchester United stadium tour](../../static/images/artur_football.png "Artur during Manchester United stadium tour")
    Artur during Manchester United stadium tour.
    ## Don't Miss Szymon's Talk on Web Optimization Techniques at 4Developers *Published: 2023-09-13 | Author: szymon-ch | Tags: update, frontend* *Source: https://brightinventions.pl/blog/dont-miss-szymons-talk-on-web-optimization-techniques-at-4developers/index.md* **Szymon Chmal, Senior Frontend Developer at Bright Inventions, is featured as one of the speakers at the 4Developers conference. The event takes place on the 26th of September in Gdansk. Szymon will speak about the web optimization guide for 2023.**
    ![Szymon](../../static/images/blog_szymon_spekaer.png "Szymon")
    Szymon is a senior frontend developer with a holistic view of software. In love with React, but open to new technologies regarding both frontend and backend areas. Technology is for him just a tool used to provide business value to software products he is working on. Do you want to know more about Szymon? [Read this interview](/blog/frontend-developer-with-an-appetite-for-backend-meet-szymon/). ## An image worth a thousand words... and seconds of loading
    ![4developers Szymon Chmal](../../static/images/szymon_4developers.png "4developers Szymon Chmal")
    If you still believe that choosing a graphic format comes down to selecting one of three classic options: JPEG, GIF, and PNG, then this lecture will change your life forever. You will learn how crucial the loading time of a webpage and its resources is for the user. Szymon will show you how to optimize it by using modern graphic formats, as well as some tricks that will allow you to delay the loading of less important images, among other things. On top of that, he will present services that do all the tedious work for us. **The talk will be held in Polish.** **When: Sep 26th, 4.00 - 4.45 PM, Gdańsk (Focus Hotel Premium)** ## See you at 4Developers [Get a ticket now](https://4developers.org.pl/gdansk-2023/#)! Use the code “DAWKA_WIEDZY” for a 20% discount. Meet with Szymon in Gdańsk!
    ![4developers tickets](../../static/images/grafika_bilet.png "4developers tickets")
    ## 4 Interpersonal Skills That Can Save Your Software Team Time & Money *Published: 2023-09-06 | Author: ula | Tags: communication, inspiration, business* *Source: https://brightinventions.pl/blog/4-interpersonal-skills-that-can-save-your-software-team-time-and-money/index.md* Harold M. Messmer, Executive Chairman at Robert Half International Inc., said once that **your career success in the workplace of today - independent of technical expertise - depends on the quality of your people skills**. Interpersonal skills (also known as soft skills or people skills) are essential for effective communication, collaboration, and building meaningful relationships with others. These skills are crucial in both personal and professional contexts and play a significant role in shaping the quality of our interactions with individuals and groups. However, while looking at some industries including IT I still can see that interpersonal skills are often undermined and presented as less important than technical knowledge. I am on the other side of this and believe that software development teams really need interpersonal skills in many workalike situations and they sometimes need them even more than pure technical knowledge.
    ![adam grant interpersonal skills ](../../static/images/adam-grant-soft-skills.png "undefined")
    ## **1. Communication is the key** Strong interpersonal skills enable individuals to communicate clearly and efficiently. Software engineers who have well-developed interpersonal skills can convey their thoughts, ideas, and emotions effectively, leading to better understanding and reducing the chances of misunderstandings with other team members or clients. **The report [State of Business Communication: The Backbone of Business Is Broken ](https://www.agilitypr.com/pr-news/public-relations/bad-connection-study-finds-poor-communication-costs-businesses-1-2-trillion-annually)shows that up to a $1.2 trillion annual loss among businesses is due to ineffective communication.** Leaders estimate teams lose the equivalent of nearly an entire workday (7.47 hours) each week to poor communication—or approximately $12,506 per employee every year. These numbers are pretty scary and I suppose many companies do note even realise how much poor communication costs them year by year. Apart from increased costs poor communication impacts profoundly productivity, morale, and growth, and sometimes leads to reputational erosion. ## **2. Conflict resolution ability** Inevitably, conflicts arise in various settings and interpersonal skills help in resolving them constructively and finding solutions that satisfy all parties involved. Some disagreements can as well arise during the development process. Conflict resolution is an integral part of the [software development process](/blog/what-are-the-stages-of-app-development/), primarily because software development projects often involve teams with diverse perspectives, backgrounds, and roles. Conflicts can arise due to differences in opinions, goals, priorities, and approaches to problem-solving. Addressing conflicts effectively is essential for fostering collaboration and ensuring project success. Regular design reviews and brainstorming sessions can provide a platform to identify and resolve potential conflicts early in the process. Conflicts may arise also during code reviews and quality assurance when team members have differing opinions about coding standards and best practices. Or during the deployment phase if there are concerns about stability, performance, or security. **Actively listening to all perspectives to understand the root cause of the conflict as well as ensuring that all team members understand project goals, roles, and expectations can really minimize misunderstandings.** ## **3. Empathy in client-dev relationship** We all know that interpersonal skills are closely tied to emotional intelligence, which involves understanding and managing one's emotions and those of others. High levels of empathy in turn contributes to better decision-making, self-awareness, and social awareness while working in a team. In customer-facing roles, empathy is essential for delivering exceptional client service. Software developers who can empathize with the clients are more likely to meet business requirements and enhance satisfaction. **You should understand when you and the specific task fit in in the client’s organization and how it contributes to the client’s vision. High emotional intelligence contributes to better decision-making and better awareness of what our clients need and why they need it.** As a software developer you solve real problems and you work with real people - don’t forget about that.
    ![empathy](../../static/images/empathy-it-vs-healthcare.png "undefined")
    Source: https://info.businessolver.com/empathy-industry-spectrum **Remember that empathy allows developers not only to put themselves in the shoes of clients, but also the end-users, and it allows to understand their preferences.** This understanding helps in creating software that truly addresses user requirements and delivers a better user experience. ## **4. Feedback in leader’s roles**  Effective [team leaders must possess excellent interpersonal skills](https://www.forbes.com/sites/baldwin/2023/07/30/inflation-insurance-for-retirees-what-does-it-cost/?) to inspire and motivate their team members. **Interpersonal skills enable leaders to act as coaches, providing guidance and constructive feedback to help team members grow and develop their skills.** As a leader you have to ensure that your team understands their obligations by using clear written and verbal communication. Important information can get misconstrued when team leader’s communication skills are inadequate. In consequence it may lead relationships to deteriorate and create barriers to progress. **When leaders are skilful in communicating feedback - that benefits the whole organization.** What is more, they have to discuss the project and its progress not only with their team members, but also with upper management and other stakeholders to meet the business goals and requirements. They use the feedback to implement changes in their work and motivate people they work with. When delivered constructively and thoughtfully, feedback has the potential to drive high performance and enhance the overall success of the team.
    ![benefits feedback](../../static/images/benefits-of-employee-feedback.jpeg "undefined")
    Source: https://www.zippia.com/advice/employee-feedback-statistics ## **What matters are people**  Overall strong interpersonal skills are crucial for successful teamwork and collaboration. Software developers (and people in general) who can communicate openly, listen actively, and understand others' perspectives are more likely to work harmoniously in groups and achieve common goals. Good interpersonal skills help in building positive and healthy relationships with friends, family, colleagues, and even strangers. **While looking for talents at bright inventions we pay a lot of attention to “soft skills” possessed by candidates.** Assessing them during the recruitment process is crucial because these skills play a significant role in a final success in a job. **Interpersonal skills such as empathy, active listening or feedback processing help our team members understand client’s needs or concerns and adjust to their challenges.** What is more, team members who share our company's values tend to perform better and contribute positively to the workplace culture. These skills complement our team’s technical knowledge and are often what differentiates us from many companies in IT industry. ## How to Develop Solution-Oriented Mindset in Your Life and in Your Team? *Published: 2023-08-25 | Author: ula | Tags: communication, leadership, inspiration, team building* *Source: https://brightinventions.pl/blog/how-to-develop-solution-oriented-mindset-in-your-life-and-in-your-team/index.md* Throughout human history, survival was the primary concern, and addressing problems and challenges was crucial for our existence. This instinct is deeply ingrained in our psyche, even in modern times it leads us to focus on potential threats and issues much more than on potential opportunities and solutions. Apart from our natural inclinations we are surround by the media that tend to prioritize reporting on problems, conflicts, disasters, and negative events as they grab attention and increase viewership. This constant exposure to negative news can reinforce our problem-oriented way of thinking and can even create the perception of the problem-centric world. **However, human progress is driven by identifying and solving problems not thinking about them. We should work towards solutions and improvements, promoting a more balanced view of the world.** Acknowledging the positive aspects and celebrating achievements can help shift our perception away from a solely problem-focused lenses.  ## **Negativity bias**  Our cognitive biases, such as [the negativity bias, make us more attentive to negative information](https://www.verywellmind.com/negative-bias-4589618). **We tend to remember and emphasise negative experiences over positive ones, reinforcing the idea that problems are more prevalent.** Even though we may no longer need to be on constant alert as our ancestors had to be in order to survive, the negativity bias still has a main role in our brain operations. It has a huge effect on how we think, feel and act. 
    ![negativity bias](../../static/images/negativity-bias.jpeg "undefined")
    ###### Source: https://www.instagram.com/theawkwardyeti Understanding the negativity bias can help you be more aware of your thought patterns and emotional responses. While it may be challenging to completely eliminate this bias, you may use some strategies to minimalise it. **Among the techniques you can find some simples ones such as practising gratitude, limiting expose to negative news (and negative people 😉), evaluating the validity of native thoughts or expressing appreciation.**  ## **What does it mean to be solution-oriented**  People who are solution-oriented have a mindset that focuses on finding practical and effective solutions to problems and challenges. **It involves a proactive and positive attitude, and taking action to overcome obstacles rather than dwelling on the problems themselves**. Being solution-oriented often leads to more productive and constructive outcomes in various aspects of life - not only at work.  **Among the main traits of solution-oriented approach we can see:** * positive mindset even in the face of setbacks, * concentration on identifying creative approaches to tackle the issue at hand,  * proactiveness and initiative to seek ways to implement solutions, * thinking outside the box, * seeking support from others and recognizing diverse perspectives, * quick adjusting of an approach if the initial solution does not yield the desired results, * seeing failure as a learning opportunity and motivation to keep trying.  ## **How to become more solutions-oriented** Becoming solution-oriented requires developing a particular mindset and adopting specific practices. 1. First of all, you should acknowledge that negativity bias exists and you have to become aware of its impact on your thoughts and actions. **Without building self-awareness it is rather impossible to change anything.** If you are not sure whether you have a tendency to focus excessively on problems, ask your family and friends - they can sometimes say about your behaviours much more than you yourself. 2. If gaining self-awareness is not an issue and you understand the effect of negativity bias on your life, you should start the whole practical process. Whenever you encounter a problem, shift your focus from dwelling on the issue to exploring potential solutions. **Avoid getting stuck in a loop of complaining or ruminating about the problem. Remember also to clearly articulate the problem you are facing.** A well-defined problem is halfway to being solved. Then **try to generate as many potential solutions as you can**, regardless of how unconventional they may seem initially. In the end assess the potential solutions based on their effectiveness, practicality, and alignment with your goals. 3. Seek input and support from others. Collaboration with friends, family or your team members can provide fresh perspectives and insights. **Stay open to exploring ideas that may challenge your initial assumptions. Sometimes the best solutions come from unexpected sources.** 4. Invest time in enhancing your problem-solving abilities. Read books, take courses, or engage in activities that promote critical thinking and creative problem-solving. Becoming solution-oriented is an approach that requires practice and consistency. Be patient with yourself as you develop and reinforce this new way of thinking. 5. **Cultivate [a habit of expressing gratitude](https://www.health.harvard.edu/healthbeat/giving-thanks-can-make-you-happier#:~:text=In%20positive%20psychology%20research,%20gratitude,adversity,%20and%20build%20strong%20relationships.) for what you have and the progress you make.** Gratitude can foster a positive attitude. As a grateful individual you can often cope better with stress and adversity and counteract the negative impact of stressors, leading to improved emotional resilience.  ## A **solution-oriented team**  The focus on solutions can empower any organisation and make better use of our time and resources. The key to success here is being clear and transparent what kind of behaviours you want to have in your team and which ones you really disapprove of.  🙌 If solution-oriented thinking is a skill that you want to be learned and possessed by each member of your team, you had better **set the right example how to act and provide a person with appropriate feedback in real time.** It is important to catch inappropriate behaviour just when it happens and help explain the situation to the team members who are struggling. **If a problem seems to be overwhelming to your team members, break it down into smaller, more manageable components.** This can make it easier to identify potential solutions for each part. 🚀 Another thing you can do is to **encourage creative thinking during your team’s meetings**. Understand that not every solution may work as intended, but the brainstorming process and looking for different options is also a valuable part of problem-solving skill. **If a solution doesn't succeed, view it just as a learning opportunity and use the experience to refine your approach.** 🎉 **Don not forget about acknowledging and celebrating successes, no matter how small they may seem.** Focus on improving relationships through expressing appreciation and thankfulness among team members. It fosters feelings of connectedness and trust, leading to more fulfilling and supportive relationships. **Positive reinforcement can reinforce a solution-oriented mindset in your team as well.** When people are not afraid of expressing their views openly and know they can rely on each other, solving problems seems to be a natural and smooth part of their daily life and work.  ## **Solution-focused communication**  There is one special [solution-oriented therapy](https://solutionfocused.net/what-is-solution-focused-therapy/) that is worth mentioning here. [Steve de Shazer](https://www.goodtherapy.org/famous-psychologists/steve-de-shazer.html) together with [Insoo Kim Ber](https://www.goodtherapy.org/famous-psychologists/insoo-kim-berg.html), two developed a type of brief therapeutic approach that focuses on identifying and building solutions to a person’s problems rather than dwelling on the problems themselves. It is based on the belief that people have the resources and strengths to overcome challenges, and the therapist's role is to help them tap into those resources and find effective solutions.
    ![solution focused communication](../../static/images/solution-oriented-language-.png "undefined")
    The same we can do with our everyday communication. **We can put a strong emphasis on identifying and amplifying solutions rather than analyzing problems in depth. To do that we can talk with the details about a preferred future where our problems have been resolved.**  As during the therapy we can use a series of questions designed to think about the problematic situation in new more constructive ways. **These questions often begin with "how" or "what" and encourage us to explore our strengths, exceptions to the problem, and potential solutions. For example, we can ask ourselves - what worked for us in similar situations in the past? Or what could work for our friend/colleague in a similar situation?** Identify and explore previous “exceptions,” e.g. times when you have successfully coped with or addressed previous difficulties and challenges. **Steve de Shazer made a valid point saying that very often the solution is not directly related to the problem and the language we use to describe the solution is different than that needed to describe a problem.**  ## **Summary - solutions as small miracles**  While describing SFT I did not mention one important question that is used in the therapy. One of the key techniques is **"Miracle Question."** Clients with a problem is asked to imagine that a miracle has occurred overnight, and their problem is solved. They are then prompted to describe what their life would be like, how they would feel, and what they would be doing differently. This exercise can help them clarify their goals and identify steps toward achieving them. I believe that it is a very simple and opening technique we can use in our organisations to make a switch from problem-orientation to solution-orientation. **Make sure to keep the focus on what is wanted, not what is not wanted.**  By highlighting strengths, exceptions, and potential solutions we can be empowered to make positive changes and achieve desired outcomes. **Henry Ford said that “most people spend more time and energy going around problems than in trying to solve them” - I believe the emphasis should be always placed on identifying and building solutions to problems, rather than getting stuck in a cycle of dwelling on the problems themselves.** There are three guiding principles you can use every time you start creating problems:
    ![guiding principles in solution oriented approach ](../../static/images/pinciples-solution-oriented-.png "undefined")
    ###### Source: [https://slideplayer.com/slide/14741507](https://slideplayer.com/slide/14741507/) ## 3 Books for First Time Managers *Published: 2023-08-13 | Author: ula | Tags: leadership, management, inspiration* *Source: https://brightinventions.pl/blog/3-books-for-first-time-managers/index.md* If you have just begun your manager’s career, probably there are many questions in your mind - what to start with, where to find the best solutions, what is the most important element in the process, how to take care of people in your team etc. One may say that there is no better way than practice, but it does not have to be the only way. Some answers can be found in the books.  If you are a first time manager and **you are not sure what your responsibilities are, how to organise your work, what is the priority, how to communicate with people in your team or to what extend your should control or supervise your team’s work, it might be worth taking a look at the books below.** I believe you can find there inspirations, guidelines, motivations and true reflections of yourself. **These books can support you, cheer you up and give advice when you do not know which direction to go.**  ## **\#1 *The New One Minute Manager*, Ken Blanchard & Spencer Johnson**  Micromanagement is never the answer. If you need high quality work and cooperation in your team, you can take advantage of **three simple techniques: one minute goal, one minute praising and one minute reprimand.**  **💪 *One-minute goal*** - people should always see the target and know what they want to complete. **They should understand which goal has the biggest impact. As a manager your task will be helping people in the team to see and clarify their goal.** The goal definition and deadline should take maximum one paragraph so that you will be able to read and analyse it in one minute. When goals are concisely defined you can just take a quick look at them and focus on the most important things to do. The effects criteria and expectations are clear for both sides and you can manage your time wisely and effectively. **🙌 *One-minut praising*** - people in the team should be able to look for solutions to their problem by asking themselves appropriate questions. **The manager’s role is to observe what they do right, appreciate the efforts and encourage to learn further.** It will help team members feel more confident and appreciate the efforts of each other. **🙏 *One-minute reprimand*** - your role as a manager is also to give feedback about what exactly was done wrong and it should happen just after it takes palce. **What should follows is personal reassurance that the failure or negative behaviour does not affect the overall account of the person. The feedback should not affect your team member’s self-esteem.** To cut the long story short watch the video below:  ## **\#2 *The First Time Manager*, Loren B. Belker, Jim McCormic, Gary S. Topchik** Giving a lot of orders and introducing as many changes as you can should not be the priority of a new manager or a leader. The priority is **building confidence and trust** with you your team members. Getting people’s trust takes time. **It is important to individualise your management style depending on the person - everyone needs different amount of control and encouragement.** You will have to push some people, but at the same time you will have people who do not need almost any encouragement because they have very strong internal motivation. Another significant skill you will have to learn is **delegation**. However, delegation is not about giving people tasks to do when you do not have time for them. **It is more about giving people such tasks that will help them grow. Delegation is also about teaching your team members how to do them and why. Accept the fact that someone else will do tasks in a different way than yours. Accept also the fact that these tasks will not be done perfectly** **\- but it does not mean that are not done well enough.** Keep in mind that you will not be able to delegate every task as some of them are either too confidential or require very specific skillset.  Let us know focus on meetings. Probably, you will notice during your first leader’s weeks that the number of meetings will be rising. That is why, you have to learn how to mange them wisely.  **The golden rule is to make only these appointments which are really crucial. If you can discuss something via email or Slack or any other online tool, use it.** You do not have to organise a meeting every time you need to talk something over. **Time is money. [As Adam Grant once said  - organise a meeting only when you want to learn something, decide on something, do something or create a bond.](https://www.inc.com/minda-zetlin/adam-grant-wharton-meetings.html)** Otherwise you will just waste your time. 
    ![undefined](../../static/images/adam_grant_meetings.png "undefined")
    The authors also talk about firing people which is the element of manager’s job that freaks many people out. **In fact, firing should not be traumatic experience. Sometimes it is equal to giving someone a new chance to grow. In the long run this person will find a better job in a new organisation.** To make firing right you have to keep in mind the whole feedback process that should follow. If you can see that one of your team member’s efficiency is going down, react straight away, organise an 1:1 and talk it over. Create the action points, and then monitor the situation by doing regular follow-ups. **If someone does not make any better, you have to be transparent about the reasons of saying goodbye.** Your job as manger's is to keep your team’s workflow as effective as it can be.  **To manage people efficiently you have to understand the motivations of people.** For some this will be financial bonus, for others prestige or non-standard projects. You have to ask your people about what motivates them and their development plan and then think how you can match it with your organisation’s goals. **Avoid doing all the talking. Let us your people share their thoughts with you.**  And last but not least, **in this whole managerial chaos do not forget about yourself.** **Remember that how you feel about yourself affects the way you mange people.** Positive self-talk supports you to be better in your role. It may help you handle the most difficult situations. So, be understanding for yourself. **We are not born with managerial skills, but we can learn them.**  ## **\#3 *New Management Psychology*, Tomasz Gordon**  You are a manager and you are not sure how to communicate with people in your team? You see that your team’s motivation is fading slowly? You would like to understand how to challenge status quo in your team? One of the tips you will find in this book is **using promoting messages** especially during an onboarding phase. It will help new team members grow roots in the organisation and increase their effectiveness. It is important to notice a value of a team member from the very first weeks. Think about strengths of each team member and use promoting messages every time you have an opportunity to appreciate someone. **What are the examples of promoting messages?  *You are a really important part of our team. I believe you can do this task. I could see during a recruitment process that you would be a great fit here.***  There are many statements you can apply,  **but remember it has to be genuine.**  Another crucial facet of managing the team is finding and drawing power from the working flow. **The flow is space at work between boredom and stress with challenges for self-development.** How can you as a manager motivate people to take advantage of their flow? You can encourage proactiveness and initiative. You can break your routine by engaging your team into news type of tasks. You can also dose visible portions of knowledge every now and then. Try to plan and present clear steps of career development to your team members. You have to be brave enough to make different decision to help people discover their flow.  Gordon is also underlying **the importance of tractional analysis in the relations between mangers and their co-workers.**  It is important to recognise which ego state is dominant in us, how to use each state consciously and what possible risks they may carry. * **If you have a parent ego state dominant, you might become a very despotic mentor who look down on your team members, which in consequence may limit their engagement, independence and development.** Your team members might be afraid of asking questions or share their ideas and true feelings with you. * **If dominant is adult ego state**, you will be a reasonable observer and you should be able to manage emotions easily without unnecessary judgement. **The key values for a manager with adult ego will be freedom and responsibility of their team.** * **And if the child ego state is primary, you may be concerned too much with your own feelings and you may react in uncontrolled way in many situations.**  As a manger to understand better people you work with at first you have to understand the reasons behind your own behaviours and reactions.  In the book you will also find a handful of useful tips for mentoring, motivation and coaching others. So, if these are the areas you want to develop, it might be a must-read for you.  ## **There always got to be that first time**  You might be an experienced specialist who has been working independently and successfully for many years, but when you are promoted to a manager’s role, your world (and your work) will change. The ambiguities, concerns and uncertainties will probably lead you to ask yourself many questions as it was in my case. **But remember that this whole managerial vagueness is completely normal. No one was born a manager. We have to learn particular skills to be good at this job and to learn these skills we often need time and we also need people more experienced than us who have already gone this way.** Learning is an infinite process especially for managers because people are changing and what works today does not have to work tomorrow. You have to be nimble to your team and their needs. ## Recruitment Screening – What Is It for? *Published: 2023-08-07 | Author: agata-m | Tags: recruitment, bright insights* *Source: https://brightinventions.pl/blog/recruitment-screening-what-is-it-for/index.md* **In this blog post, you will learn what screening is, why it is used in recruitment, and what questions you can expect from the recruiter.**
    Screening in recruitment is typically a short, fifteen to thirty-minute phone or video conversation after the recruiter has reviewed the candidate's CV.
    The purpose of screening is to verify candidates for a specific job position and present initial preferences, and requirements of the employer. Through screening, the recruiter has a chance to identify the most suitable candidates for the next stage of recruitment, while the candidate gets an opportunity to learn more details about the role they are applying for and about the company.
    ![candidate screening](../../static/images/blogpost_screening.png "candidate screening")
    ## **HOW DOES SCREENING LOOK LIKE? WHAT CAN RECRUITERS ASK?** Let's go back to the very beginning, what happens before the screening takes place? So: * The recruiter selects the most suitable individuals from all the applications, profiles, and interested candidates (which is why it's crucial to keep your CV/LinkedIn profile up to date). * Some recruiters proceed directly to screening and contact candidates by phone. However, **at Bright Inventions, we prefer to initiate contact via email to agree on a suitable time for the candidate to talk freely.** * Appointment scheduled? Great! Let's make the call. Screening (at least at Bright Inventions 🙂 ) usually lasts 20-30 minutes. ## **AND NOW, THE MOST IMPORTANT PART – WHAT DO RECRUITERS ASK?** * While it may seem trivial at first glance, for us, it's essential. We ask **why you want to change your job**, what specifically interests you in the offer, and what motivates you in the current positions. * We naturally inquire about **your experience and knowledge of the technologies/tools** required for the specific position. * The team – it's important for us to know **if you prefer smaller or larger teams** and your preferences in this area. * We also ask questions about must-haves, meaning **what is important to you in a new workplace**, what you want to find, and what you want to avoid - simple yet crucial questions. If there are any aspects that the candidate wants to avoid in their future work environment, it's worth clarifying these issues. * Foreign languages – especially English. **We ask about your proficiency in English**, your ability to communicate fluently, and your willingness to work in English. There are also questions to assess your communication skills in this language. * We would like to k**now your financial expectations, availability**, and preferences regarding the **work model** (remote or hybrid). * Naturally, screening is not just about questions. We also take the opportunity to talk about the role, who and why we are looking for, what a candidate can expect from us, the clients, and the projects they will most likely be involved in. **It's crucial for the candidate to have as many details about the role as possible before deciding to participate in the recruitment process.** ## **CAN CANDIDATES PREPARE FOR SCREENING? IF SO, HOW?** It's worth preparing an appropriate place for the conversation before the screening. Avoid talking to the recruiter while on the bus, cooking dinner, or doing shopping. **Find a quiet place where you can speak freely, without distractions and background noise.** Familiarize yourself with the company you are applying to, the job posting, and consider relevant questions to ask. If needed, write down all your questions on a piece of paper to ask the recruiter. ## **WHAT QUESTIONS SHOULD YOU ASK THE RECRUITER DURING THE CONVERSATION?** There's no one-size-fits-all answer here. What you want to ask depends on your preferences. However, remember to address the most important aspects during the conversation. The most common questions candidates ask are about working hours, financial compensation, potential tasks, team size, core values ([check what we appreciate at Bright Inventions](/about-us/#core-values)), questions related to the company's culture, profile and potential project itself, and more. **Naturally, there might be other extra aspects you want to mention. Don't be afraid to ask. Getting answers to your pressing questions will help you assess whether the role you're discussing with the recruiter is really what you're looking for.** ## **WHAT HAPPENS AFTER SCREENING?** After the screening, the recruiter conducts further evaluations. They assess how the conversations went, what the candidates' expectations are, and their English language skills. Based on this information, they select individuals who are invited to the next stage of recruitment and provide them with feedback.  **Selected candidates are invited to the next stage of recruitment, which, at Bright Inventions, is a technical and non-technical interview. We always strive to justify our decision and [provide our candidates with feedback](/blog/the-importance-of-feedback-in-bright-recruitment-process/) regardless of the final result.**  If you want to learn more about our recruitment process, [read the guide for candidates](/blog/how-to-start-working-at-bright-inventions-a-quick-guide-for-candidates/). ## 7 Qualities of a Software Developer We Look for in Candidates *Published: 2023-08-02 | Author: sara-l | Tags: bright insights, recruitment* *Source: https://brightinventions.pl/blog/qualities-of-software-developer-we-look-for-in-candidates/index.md* One of my first tasks at the beginning of onboarding process at Bright Inventions was to read a book. What kind of book and why should I read it? This book is written by Robert C. Martin called Uncle Bob, who is quite a popular developer and author for at least a few books for developers. Ula, my manager, believes that we can find in the book some reflections of a developer's mindset that we are looking for in Bright Inventions. As in every book there are some extremes, but the image of presented professional might be a guidance to understand what kind of behaviours and actions we want or don't want to have in our team. And is there a better way to get to know the “persona” of a software developer than reading a book about the professional developer you are looking for?
    ![Sara - a recruiter at Bright Inventions](/images/blogpost_qualities_sara.png "Sara - a recruiter at Bright Inventions")
    My first reflection after reading "The Clean Coder" is that the author describes not only software developers, but people who are able to live in society and work effectively with other people. So I almost fully agree (well maybe with a small exception) with Uncle Bob and I believe that **everyone who wants to be a good employee and teammate should adapt to some rules, which can make us better in cooperation and effectiveness**.  I believe that “The Clean Coder'' book is all about responsibility. Let me explain how responsibility affects our everyday work and what we actually should be responsible for. ## 1. Be open and reflective It seems to me that some people think that the work of a software developer focuses only on writing code. Of course that is an extremely important part of their job, but there is another important part. **The key to success is to effectively cooperate with teammates and clients**. So there is a lot of space to take responsibility for our own behaviour. So we should ask ourselves some questions: * Are we open to cooperation and therefore other people opinions?  * Are we able to share our own opinion with other people? * Are we able to say sorry, when we make a mistake?  So are you? I hope so! Without communication abilities and openness it’s hard to establish smooth and effective collaboration.  ## 2. Take your career into your hands Another thing we should feel responsible for is our own career. Developing our skills, choosing the path which we would like to follow, being persistent in the pursuit of a goal – these are our responsibilities, which we should take seriously. Uncle Bob believes that it is the employee's responsibility, not the employer's, to initiate attending conferences, courses, buying industry books, and arranging time for learning. It's great that it's currently so popular among employers to invest in employee development. Let's take advantage! And let's remember that it's up to us how we use these perks and benefits.  ## 3. Be responsible for your own work  For example developers should be responsible for their own code and bugs. Naturally everyone can make mistakes, it's more than likely to happen. So what can we do? Prepare! But how?  There are a few ways to prevent mistakes. Firstly, **be honest with your teammates** and project manager/product owner/scrum master and speak directly about how long it will take you to do a particular thing. Don't dim that you're going to try to do something faster when you know it will take more time because PM/PO/SM puts pressure on you. That is their job to finalize the project and your job is to be assertive. For the sake of the project, do your best to estimate sincerely and avoid committing to deadlines that you are not sure of.  Secondly, do your best to **anticipate potential errors in your code**. Create correctable, simple code. And no matter what, test your code.  ## 4. Develop your skills and share your knowledge with others Allow the knowledge to circulate. Be open to feedback, to code review. Once (during the interview with an extremely nice developer) I heard a very wise sentence, "My code is not me". I believe that everyone should sometimes tell it to themselves (not only devs).  **Other people's advice, suggestions and feedback are not about you, they are about how they interpret your work/behavior/code**. So do not take them personally. The best thing you can do is to use them and be smarter and generally better! And the second part is to share your knowledge, advice and feedback with other people to let them be smarter. And then all of us will be smarter. Easy. 😎 ## 5. Take care about your creativity resources As a software developer you have to be creative. However, you don’t need to be born with creativity. You can develop your creativity and care about it. How? Uncle Bob proposes to read creative books/articles which are not work-related. He believes that they recharge our creativity batteries. So we can sum it up with the following sentence: **other people's creativity stimulates our own creativity**. When your creativeness battery is full, then you can resolve more difficult problems in different, new ways. And be smarter. 😎  ## 6. Take care about yourself!   Take care about work-life balance, about your sleep, about proper, healthy, wholesome food – these are the factors affecting the well-being of your mind and body. Well-functioning mind and body have a huge influence on your daily work. ## 7. Get to know yourself It is extremely important to know when we are the most productive. When does our focus decrease? What conditions have to be fulfilled to have as many big brain moments as possible? Do we like to work with music or without? There are a lot of questions we can ask ourselves to know ourselves better. Another important thing is to **listen to ourselves and adapt our work time to our preferences** to be as productive as possible. ## Where do I disagree with Uncle Bob? At the beginning of the blog post I wrote that I almost agree with Uncle Bob, but there is an exception. This exception is about work-develop-life balance. I believe that spending 8 hours, 5 days per week at work is a lot of time. Naturally developing our skills is extremely important – I agree with the author on that.  Yet Uncle Bob believes that a professional developer should spend 3 hours per day on self development in the programming area (including weekends) and have fun with it. It may indeed be a way to be a professional, but is it the only way? I do not think so. That means that you should choose to spend less time with your family, friends, pets or to resign to develop in other areas. In my opinion that sounds dangerous. We have to be careful of how we spend our free time and always remember what is the most important to us – and that's what we should be guided by. If you're curious about other perspectives, I encourage you to read [my teammates' thoughts on the book The Clean Coder](https://brightinventions.pl/blog/the-clean-coder-seven-qualities-of-a-professional-programmer/). And I'm curious about your perspective! Do you agree with Uncle Bob? Feel free to share your thoughts in the comments. ## Digital Transformation Guide for Logistics *Published: 2023-08-01 | Author: izabela | Tags: business* *Source: https://brightinventions.pl/blog/digital-transformation-guide-for-logistics/index.md* **Do you feel that it's time to digitize your company’s operations? Should you have a dedicated app developed or maybe it’s better to use existing solutions on the market? Check how to make that decision. Find out how long it takes to build a customized solution for logistics and why it’s smart to start from MVP (Minimal Viable Product).**
    ![logistics](../../static/images/logistics_photo_blog.png "logistics")
    - - - ## Table of contents [Digital transformation for the logistics industry](/blog/digital-transformation-guide-for-logistics/#digital-transformation-for-the-logistics-industry) [When you should build your own customized solution for logistics](/blog/digital-transformation-guide-for-logistics/#when-you-should-build-your-own-customized-solution-for-logistics) [Example of digital transformation in logistics (case study)](/blog/digital-transformation-guide-for-logistics/#example-of-digital-transformation-in-logistics-case-study) [Examples of challenges in the logistics industry that tech can solve](/blog/digital-transformation-guide-for-logistics/#examples-of-challenges-in-the-logistics-industry-that-tech-can-solve) [The road from the idea to the launch (including MVP)](/blog/digital-transformation-guide-for-logistics/#the-road-from-the-idea-to-the-launch-including-mvp) [Logistics MVP stack for 2023](/blog/digital-transformation-guide-for-logistics/#logistics-industry-mvp-stack-for-2023) [How much does it cost to hire a software agency to build MVP for logistics?](/blog/digital-transformation-guide-for-logistics/#how-much-does-it-cost-to-hire-a-software-agency-to-build-mvp-for-logistics) - - - ## Digital transformation for the logistics industry Digital transformation refers to the implementation of technology to improve various aspects of an organization's operations, business processes, products, services, and customer experiences. Moving into digital with your company documents, processes and data can help to speed up daily operations, secure fragile information and analyze the data to make more business-oriented decisions. ### There are two typical ways to digitalize your company operations: * You can look for available on the market digital software tools (off-the-shelf software). * Or hire a software agency to build a customized solution just for you. ## When you should build your own customized solution for logistics For some companies, off-the-shelf software will be perfectly fine. In some cases, it won’t be enough though. So, when should you consider building something unique for your company? * When you are a large organization that requires a multifunctional platform to meet the diverse needs of various departments and stakeholders. * When you have tested other solutions and identified missing features that are crucial for your operations. * When you have the financial resources, and development capabilities (internal or outsourced) to build something completely suited for your company’s needs. ## Example of digital transformation in logistics (case study)
    ![Transportation Management System](../../static/images/tms_social_preview.png "Transportation Management System")
    Read the case study of a [customized solution for forwarding company in the light road transport sector](/projects/transportation-management-system/) (up to 3.5 tons of the permissible total weight). ## Examples of challenges in the logistics industry that tech can solve ### A weak internet connection Internet connection is often not sufficient for daily operations in the logistics industry. Especially for drivers. It shouldn’t stop others to collaborate with drivers, e.g. freight forwarders. That's why an app built for the logistics industry often should have an offline mode. For example, an app used for drivers-freight forwarders communication should enable to share of vehicle localization even offline. Apps that are built around offline functionality are called [offline-first apps](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/). ### Paperwork and docs sharing Permits, reports, photos, sheets – there is lots of paperwork associated with logistics operations. Technology enables a full digitalization of all documentation. Not only can you store documents in the cloud, but you can also share them with your colleagues, supervisors, and clients. Thanks to the offline mode, mentioned earlier, you can even store data offline. Then they will be synchronized when the internet connection is restored. ### Route Optimization Everyone in the road transportation industry desires to lower the number of empty vehicles on the road. In 2021 [1 in 5 road freight journeys in the EU were performed by empty vehicles](https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Road_freight_transport_by_journey_characteristics#Empty_runnings). Algorithms based on AI can optimize the route to find loads for empty vehicles more effectively. For example, dedicated software matches an empty vehicle with the load nearby enabling the driver to quickly pick up the load on the road and minimize the length of the journey with an empty vehicle. ### Lack of cargo security [Foods products are one of the cargo groups with the highest share in tonne-kilometers](https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Road_freight_transport_by_type_of_goods) transported by road in the EU in 2021. Technologies like GPS, IoT sensors, blockchain, or tamper-evident seals give an opportunity to secure food products (and others), reduce the risk of theft or tampering, and ensure the safe delivery of goods to their intended destinations. If you want to go deeper into [smart packaging](https://brightinventions.pl/blog/how-to-build-mvp-for-smart-packaging-solution/), which also takes care of cargo security, read our other blog post. ### A large scope of the possible end users Logistics companies hire employees with different backgrounds, expectations, and technological expertise. Customized development gives a better option to design a solution that answers all employees’ needs. In this case, end users are represented by various groups with different expertise such as drivers, warehouse workers, freight forwarders, supply chain analysts, dispatchers, packaging specialists, and many more. ## The road from the idea to the launch (including MVP) The typical app development flow estimates that MVP will be launched within a few months. It’s crucial because we should validate the MVP as soon as possible to minimize the costs. However every product is different, so the software development stages should depend on the particular solution. ### App Development Stages (including MVP phase):
    ![Software development stages](../../static/images/timeline_app_development_stages.png "undefined")
    #### The idea for a product Verify the idea's business potential and define the target group. Choose key features to include in MVP. #### MVP Prototyping (1-4 weeks) Create visual representations and mockups of the solution. #### Building and launching the MVP (4-20 weeks) Develop the Minimum Viable Product and start gathering users. #### Product Development, QA & Maintenance based on MVP Continuously deploy new features, prioritize stability, and analyze user behavior for improvements. If you want to dive deeper into [software development stages](/blog/what-are-the-stages-of-app-development/), read our other blog post. ## Logistics MVP stack for 2023 Every project is different and may require another stack approach. At Bright Inventions we always adapt technologies to the budget and time requirements our clients have. The stack listed below is a typical group of tools and programming languages we recommend (but as mentioned, recommendations may change!). **Frontend**: TypeScript, React. **Backend**: Node.js, PostgreSQL, NestJS, AWS. **Android development**: Kotlin. **iOS development**: Swift. **Project management & documentation**: Jira, Github. **Product design**: Figma, Miro. **Analytics**: MixPanel, Google Analytics 4. ## How much does it cost to hire a software agency to build MVP for logistics? There is no simple answer to this question. There are many aspects [MVP development agency](/our-areas/mvp-development/) has to consider before giving you a quote. The best way is to book a consultation and discuss your idea for a product, then you will receive the estimation. ## A Product Designer Who Sees Through the Code. Meet Joanna *Published: 2023-07-31 | Author: joanna-c | Tags: bright story, bright insights, career* *Source: https://brightinventions.pl/blog/product-designer-who-sees-through-code-joanna/index.md* **Joanna successfully redesigned her career from IT Administrator to Junior Product Designer. After landing her dream job, she has been determined to create software products that combine clients’ expectations and high-quality design standards. Check out Joanna’s inspirations, sources of knowledge, and ways to cooperate with software developers.**
    ![Joanna's product design career story](../../static/images/brightstoryjoannacollage.png "Joanna's product design career story")
    ## You started your career in IT & Security Administration. What made you go into Product Design? While I was at college studying Informatics and Econometrics I realized that programming wasn’t my thing. At the same time, I enjoyed classes about UX. **I wrote my bachelor's thesis about UX. It was a quite practical thesis because I redesigned the University of Gdańsk department website**. Then I went to post-graduation studies in UX Design/Product Design. At that time I worked as an Information Security Administration Specialist dreaming of a career in product design. **Eventually, I got my first product designer job at Bright Inventions**. *Joanna described her incredible career journey from IT Administrator to Junior Product Designer in another blog post. [Read her career transformation story](/blog/how-to-get-first-product-designer-job/)!* ## How do you recall the job interview at Bright Inventions? Great! Although I was shocked, when I was informed, before the interview, that it would take 2 hours. I thought, "What could we discuss for such a long time?". In the end, it went well because **it was just a friendly, open conversation. It wasn't a typical round of questions**. ## What is your advice to people aspiring to become junior product designers? Don't give up. **You will probably receive lots of rejections**. It will be frustrating, but you have to get through that phase. **You have to keep pushing, keep developing your portfolio, and redesign the apps you think could work better**. Naturally, you have to stay updated with trends by attending design conferences, workshops, webinars, and so on.
    ![Advice for aspiring junior developers](../../static/images/joanna_quote_juniors.png "Advice for aspiring junior developers")
    ## So what are your sources of product design knowledge? I follow top designers on LinkedIn and Instagram e.g. [Zander Whitehurst](https://www.instagram.com/zanderwhitehurst/), [Katy](https://www.instagram.com/katy.ba), [Aga Naplocha](https://www.instagram.com/theawwwesomes), as well as the profile of [Nielsen Norman Group](https://www.instagram.com/nngux). You know how it goes – as soon as you follow some profiles, your feed is quickly full of news, trends, and inspirations in that regard. I also sign up for various UX courses and try to regularly obtain certificates. **Books can't be overrated as well. I can recommend books such as:** * *The Design of Everyday Things* by Donald Arthur Norman * *[Don't Make Me Think](/blog/5-web-development-rules-from-dont-make-me-think-book/)* by Steve Krug * *User Experience Team of One* by Leah Buley * *100 Things Every Designer Needs to Know about People* by Susan Weinschenk * *Grid Systems in Graphic Design* by Josef Müller-Brockmann * *GIVING A DAMN ABOUT ACCESSIBILITY by* Sheri BYRNE-Haber * *Build Better Products: A Modern Approach to Building Successful User-Centered Products* by Laura Klein * Polish: *Badania jako podstawa projektowania user experience* by Iga Mościchowska, Barbara Rogoś-Turek ## Figma or Adobe XD… Which one is your favorite and why? It's **Figma**, for sure! In my view, Adobe has slightly stopped developing as a product. **Figma has surpassed its competitors because they truly focus on implementing user feedback**. Also, Figma has a great community that enriches this product. I think as well that **Figma makes it easier to collaborate with developers**. However, in my opinion, Figma is more oriented toward UI design and product design. Adobe Apps are in fact better for graphic designers, who make animations and more artistic stuff. So everyone can find something for themselves. ## Do you see the negative impacts of Adobe taking over Figma? In terms of product development, I haven't seen any major issues. Obviously, **I can see the commercialization and rising prices of Figma**. However, every business wants to earn money. I guess that sooner or later Figma had to transform into a more expensive tool. ## What is your favorite font? **I have a strong sentiment toward [Roc Grotesk](https://fonts.adobe.com/fonts/roc-grotesk)** because I used it to design products with my friends, and it became our brand's cool font. I also appreciate [Inter](https://fonts.google.com/specimen/Inter) which is Figma’s default font. On my top list, I would include [Space Grotesk](https://fonts.google.com/specimen/Space+Grotesk) (although it is a little technical) and [Acumin Pro](https://fonts.adobe.com/fonts/acumin). ## What has been the most challenging for you in your product design career? The fact that I mostly design products for users who are in a hurry. Therefore, **I have to find a way to display as much information on a screen as possible** in the best way. Information layout is definitely a challenge in this regard. I would say that **being assertive is also a personal challenge for me sometimes**. I am still learning how to find the balance between meeting clients' and developers' expectations and adhering to design standards. I don't want to simply say “no” to the client's ideas or developers' needs. Yet at the same time, I feel that it is my duty to ensure we deliver a high-quality designed product. ## What does your work on prototypes for clients look like? Can you guide us through your typical prototype design process? Everything starts with research. This includes **user research, business domain research, benchmarking**, and so on. With the help of a project manager, we also establish all of the client's requirements. After the research, I do **sketches**. Based on them I create [low-fidelity or high-fidelity wireframes](/blog/what-are-the-stages-of-app-development/#app-prototyping--product-design), depending on the time constraints we have. Let's face it, working at a software development agency means time is often working against us. 🙂 Finally, **mockups originate from wireframes**.
    ![Quote on mockups](../../static/images/joanna_quote_mockups.png "Quote on mockups")
    **The moment when I have the mockups ready is pivotal in designer-client communication**. Before this, we might have thought that we were on the same page through discussions, but the mockups finally reveal my intentions as a designer and whether they match the client's expectations. **When everyone is on the same page, I design prototypes with all the screens for every flow**. I have to design and describe them well enough so that developers can understand the design of the entire system and start to implement it. ## What are the biggest differences between your perception of this career and the daily reality of it? Before starting the job, I had the impression that I would create the design, and then developers would implement it. However, while working in an Agile methodology, I discovered that **sometimes during the same sprint, I need to do the design while developers simultaneously build features**. This presents another challenge because in order to achieve a successful implementation I have to communicate effectively with developers. There is no time for misunderstandings.
    ![Joanna during a team retreat in Stockholm.](../../static/images/joanna_bright_team.png "Joanna during a team retreat in Stockholm.")
    Joanna during a team retreat in Stockholm.
    ## Do you enjoy your daily cooperation with developers and project managers? It's been going pretty great because we **quickly give each other feedback, and communicate fast, and openly**. I also appreciate the fact that even though we have different teams working for various clients at Bright Inventions, there is communication between the teams. Many times, when I faced some challenges, it turned out that another team had experienced similar struggles. They have helped me resolve those issues based on their experience. I really enjoy **the culture of knowledge sharing at Bright Inventions**. I also feel grateful because **from the first day at Bright Inventions I was treated with respect even though it was my first product designer job**. I was surprised that from the beginning **people asked me about my opinion and expected my expertise**. I was also happy that I could instantly implement all the new techniques and best practices that I learned at college. ## So what are the key factors of successful cooperation between designers and developers/PMs? The primary aspect is **context**. When communicating with a team member (and vice-versa), it's important not to simply state a request like "I need you to do it quickly because I say so". You need to **provide the reasons behind your request and explain why you need their help**. Additionally, **open communication** plays a significant role in effective collaboration. Simply **say what you mean, don’t make others assume your intentions** because that will lead to miscommunications. Another crucial factor in communication is [empathy](/blog/three-dimensions-of-empathy/). It is essential to **always try to understand the other person's perspective and take it into consideration**. ## Have developers and PMs taught you something about product design? They showed me that the **key is to look at the design through the lens of the system we want to build**. As a designer, I may start with an artistic and chaotic sketch. Yet thanks to developers and PMs I understand that it needs to pivot quickly into something organized.
    ![Quote on look at the design through the lens of the system](../../static/images/joanna_quote_design_system.png "Quote on look at the design through the lens of the system")
    Nowadays, **the gap between code and design is getting smaller, but it is still there**. As a product designer, I create a design that needs to be well-interpreted by developers, so order is crucial. **I have to also look through the code**. The fact that I studied Informatics and Econometrics helps me a lot. **I grasp that fonts and colors need to be presented as tokens**. **These, however, are part of the components that need to be reusable**. I also understand that sometimes a seemingly simple idea, like moving a button, may not be as easy as one might think and can even affect the backend. ## Is there a dream app you would love to design? I’d love to have a chance to design something that would let me express myself artistically. In terms of industries, I would love to design something related to fashion. I don’t mean ecommerce though. I am thinking about a **website for a fashion house**. I wouldn’t say no to designing **websites or apps for music festivals like Open'er Festival**. That would give me a chance to create animations and implement some design tricks that wouldn’t be suitable for many other industries. ## What do you do after hours? **I’ve just finished a couple of product design courses and now I need to relax for some time**. I do yoga, stretching, and travel a lot. Recently **I visited Barcelona and New York**. I like to create graphic designs. A graphics tablet helps me with digital illustrations.
    ![Joanna in New York](../../static/images/joanna_ny.png "Joanna in New York")
    Joanna in New York.
    You can check out my doodles on my Instagram @csznsk. Apart from that, I enjoy attending exhibition openings, or just exhibitions in general. I like music and going to concerts or music festivals. Just recently, I went to Beyonce concert and Harry Styles' concert. Both were unforgettable experiences. I'm a big fan of analog photography, so I have a camera everywhere I go with me. ## Mistakes Startups Make When Developing Their Mobile Product *Published: 2019-04-23 | Author: mateusz | Tags: startups, business strategy* *Source: https://brightinventions.pl/blog/mistakes-startups-make-when-developing-their-mobile-product/index.md* **If you’ve ever worked at an early-stage startup, then I’m sure you know the feeling. Your mobile app, a concept you’ve been working intensely on for many months, is finally entering the development phase. Things are starting to feel very real business-wise, aren’t they?**
    ![mobile development mistakes](../../static/images/mistakes_startups_make_when_developing_their_mobile_product_small.jpg "mobile development mistakes")
    On the one hand, you’re pumped from all the excitement. On the other, you might also be feeling intimidated by the extent of the project. Especially, if you’re new to the mobile app development game. To help you make this a productive and informed process, we’ve listed some of the most common startup mistakes in mobile app development. These are: ## **Mistake #1: Not verifying market potential** Setting up a mobile app for success requires a lot of effort up front, in the [ideation stage](/blog/what-are-the-stages-of-app-development/#app-idea). Before you make your decision, verify your app’s potential on the market thoroughly. There are many ways to do this: focus groups, market research surveys, or consulting a professional agency, to name a few. If you don’t determine that your app addresses a genuine need on the market, you run the risk of failing. ## **Mistake #2: Not establishing (or respecting) MVP** For some startup founders, understanding which features are absolutely critical for the first version of the app, and which fall into the “nice-to-have” category, can be pretty difficult. Here’s where working with an experienced [MVP development agency](/our-areas/mvp-development) will do wonders. Speak to your team about organizing a so-called scoping session before they start working on the app. The expected result should be agreeing on an MVP – a list of critical features necessary to launch a first working version of the app. But what about all those unexpected circumstances that might push you to consider updating your MVP halfway through? Before you insist on any changes, keep in mind that they can potentially disrupt the entire development process. This may translate to delays and – sometimes – also wasted financial resources. ## **Mistake #3: Developing your app on too many platforms** Sometimes it’s worth focusing on one platform at the initial phase of your startup. There is a whole plethora of successful mobile apps that started only on iOS or Android (Instagram is one of them). This is likely because market research showed that potential users were using one platform more than the other. Speak to your CTO or the software house you’ll be working with – they’ll surely advise you on a solution that is most effective and fitting. ## **Mistake #4: Micromanaging (or neglecting) your developers** As a startup founder, you might feel tempted to stay in touch with your team 24/7, which oftentimes can be counterproductive and draw your developers’ attention away from tasks. Conversely, you might be so confident that your team is handling everything well that you won’t see the need to show up to meetings. Speak to your team about the frequency of contact that will be most beneficial for the development process. ## **Mistake #5: Not paying attention to app analytics** Once the app goes live, a lot of early-stage startups make the mistake of focusing their entire attention on App Store reviews, all the while underestimating the role of app analytics. In fact, monitoring app performance, user behavior, and install and retention rates (among many other factors) should all be treated as detrimental to product development in the post-MVP phase. There’s a whole array of [analytics tools](http://www.businessofapps.com/guide/app-analytics/) on the market – ask your team to determine which will be the best solution for your needs. ## **Summary** To summarize, learn from the experiences of others. With the above startup mistakes in mind, you’ll avoid many time-consuming obstacles. This, in turn, will let you focus all your efforts on working towards a successful app store launch. Good luck! ## Main Factors that Determine the MVP Cost *Published: 2023-07-27 | Author: michal | Tags: startup, mvp* *Source: https://brightinventions.pl/blog/main-factors-that-determine-the-mvp-cost/index.md* **How much does building MVP cost? There is no easy answer to that question. It’s like buying a car. You can buy an operating car for less than 10 000 dollars. Yet you can also buy a Ferrari for over 1 million dollars. It depends on how advanced the product you have in mind. Check out the main factors that affect the cost of developing MVP.**
    ![MVP cost](../../static/images/blog_mvp_cost_cover.png "MVP cost")
    ## How advanced your app should be Well-advanced apps like Uber or Google Maps may cost hundreds of thousands of dollars. Fortunately, **startups usually don’t have to begin with that budget**. The smart way to start app development is to create a prototype and then the MVP. MVP stands for Minimum Viable Product. It’s the very first version of your solution containing crucial features only. Then you can release MVP to a small group of users and see how they respond to it. According to the valuable feedback, you can develop your app eliminating crucial mistakes at the very beginning.
    MVP helps you invest less money to check if your idea has market potential. You start something small and develop it according to your users' needs.
    It’s a bit like buying a cheaper car just to see if driving to work is fine by you. Let's assume that you just passed your driving test and want to check if driving to work will be better for you than riding a bus. If you’re not sure what you want, the smart way is to buy a cheap car. Eventually, if you rather commute using buses there is a chance to sell your car without a feeling of a bad investment. However, if driving a car turns out to be a perfect solution for you – you can start to save money for a better vehicle. ## The cost of app infrastructure When startups try to estimate the project, they sometimes overleap the fact that the budget should include not only the app itself but also the whole infrastructure behind it. **Software needs to coexist with outside systems that generate extra costs**. The most important is the server infrastructure needed to exchange data. It is impossible to predict the cost of server infrastructure without going into detail. **The price depends on what server provider you would choose and how big the infrastructure needs to be**. It’s like the budget for gasoline. Every car has a different fuel burn efficiency. ## The cost of app maintenance Guess what? It’s like owning a car. 🙂 Buying a vehicle is probably the biggest but only the first payment of the new owner. Every car needs regular services and sometimes repairs. It relates to the software development world. **Launching MVP doesn't mean the work is over. Even if you wait with adding new features, you still have to take care of the app's maintenance**. Both Google and Apple regularly upgrade their systems. On top of it, new mobile devices are launched every year. Every app needs to be adjusted to these changes. That brings extra costs such as developing and testing the new versions of the app. What is more, Google and Apple provide changes on their app stores that often affect every app owner. As an example, Google demanded from app owners information about the age range of their app users. It might not be time-consuming to meet these types of requests. Still it is crucial to keep an eye on them otherwise your app may be even banned from the store. ## Developing an app for iOS and Android doubles the price It sometimes **comes as a surprise to startups that developing an app for Google Play and App Store comes with 2 separate development processes which double the budget**. When you plan to eventually develop an advanced product, it isn't advisable to do [cross-platform software for both stores](/blog/native-app-development-vs-cross-platform/). Apple and Google have their different requirements, processes, and tools. Thus, you need two teams with different coding skills to create products for both top app stores. However, **building two products for iOS and Android isn’t a must**! That is why our team at Bright Inventions loves to build MVPs to analyze the app market potential and check if it is necessary to create both versions for iOS and Android. Developing only one of them is not such a rare case. For example Instagram was first launched on AppStore only. ## Sharing WebSocket Connections between Browser Tabs and Windows *Published: 2023-05-31 | Author: szymon-ch | Tags: JavaScript, web development, TypeScript* *Source: https://brightinventions.pl/blog/sharing-websocket-connections-between-browser-tabs-and-windows/index.md* **WebSocket connections are like special communication channels that allow web browsers and servers to talk to each other in real-time. However, when you have multiple tabs or windows open in your browser, each one establishes its own WebSocket connection. This can be wasteful and affect the performance of your web application.** But don't worry! In this blog post, **we'll explore a solution that lets you optimize WebSocket usage when your users open your application in different tabs or windows**. By sharing WebSocket connections between those tabs and windows, we can make your web application work more efficiently and smoothly. So, let's dive in and discover some helpful strategies for achieving seamless WebSocket connection sharing between browser tabs and windows.
    ![WebSocket Connections](../../static/images/websocket_blog_cover-1-.png "WebSocket Connections")
    ## Introducing Shared Workers In order to achieve WebSocket connection sharing between browser tabs and windows, we can leverage the power of web workers. **Web workers are essentially separate threads, totally independent of other scripts with no access to the DOM**. They can execute tasks in the background, what makes them particularly useful for performing complex computations and preventing the web page from freezing or becoming unresponsive. **A shared worker is a special type of web worker that can be shared between multiple browser tabs or window**s. Unlike regular web workers, which are dedicated to a single web page, shared workers exist independently of any specific web page or user interface. They allow multiple browser contexts, such as tabs or windows, to communicate and share resources. By utilizing shared workers, we can create a persistent entity that manages WebSocket connections and facilitates their sharing across different browser contexts. Also, we don’t have to worry about closing the connection. Shared workers will stop to exist if there are no tabs or windows referencing them anymore, so the connection will be automatically closed. ## Implementing WebSocket connection sharing with Shared Workers To implement WebSocket connection sharing between browser tabs and windows, we'll follow these steps: ### Create a shared worker Start by creating a shared worker using the Shared Worker API. This worker will act as the central entity responsible for managing the WebSocket connection. Add a message handler to receive data from the worker and do whatever you please with it. ```typescript // No bundler const worker = new SharedWorker("./worker.js"); // Webpack 5 const worker = new SharedWorker(new URL("./worker.ts", import.meta.url)); worker.port.addEventListener('message', (event: MessageEvent): void => { // Do whatever you like with data }); worker.port.start(); ``` ### Establish the WebSocket connection Inside the shared worker, create a WebSocket object and establish a connection with the server. This connection will be shared among all browser tabs and windows. Add a connection handler and store ports in an array. It's also crucial to forward each received message to all MessagePort objects. ```typescript const ports: MessagePort[] = []; const ws = new WebSocket('wss://some-url.com'); addEventListener('connect', (event: MessageEvent): void => { const port = event.ports[0]; this.ports.push(port); }); ws.addEventListener('message', (event: MessageEvent): void => { ports.forEach((port) => { port.postMessage(event.data); }); }); ``` That's it. You will now be able to share the connection and receive messages simultaneously in all tabs and windows. ## Challenges and solutions: memory management While shared workers provide an efficient solution, **there is one challenge to address: memory management**. Since there is no built-in mechanism to determine if a Message Port is still active or not, references may accumulate over time, potentially leading to memory leaks. To mitigate this issue, we can leverage WeakRefs. **By using WeakRefs, we can check if a Message Port has been garbage collected**, ensuring efficient resource utilization. ```typescript export class BrowserPort { private readonly weakRef: WeakRef; constructor(port: MessagePort) { this.weakRef = new WeakRef(port); port.start(); } isAlive(): boolean { return !!this.weakRef.deref(); } postMessage(message: unknown): void { this.weakRef.deref()?.postMessage(message); } addEventListener(event: string, handler: (event: Event) => void): void { this.weakRef.deref()?.addEventListener(event, handler); } removeEventListener(event: string, handler: (event: Event) => void): void { this.weakRef.deref()?.removeEventListener(event, handler); } close(): void { this.weakRef.deref()?.close(); } } let ports: BrowserPort[] = []; addEventListener('connect', (event: MessageEvent): void => { const port = event.ports[0]; ports.push(new BrowserPort(port)); }); // At some point we would like to send a message if (port.isAlive()) { // It's alive! We can send a message. port.sendMessage('msg'); } else { // It's dead! We have to remove it from the array. ports = ports.filter(innerPort => innerPort !== port); } ``` **Another solution is to send a special control message in the body of the `onbeforeunload` event handler**. Keep in mind this method isn't reliable and browser may choose to ignore the message and not pass it to the worker at all. ```typescript // Browser window.addEventListener('onbeforeunload', (): void => { worker.port.sendMessage('UNLOAD'); }); // Worker let ports: MessagePort[] = []; addEventListener('connect', (event: MessageEvent): void => { const port = event.ports[0]; ports.push(port); port.addEventListener('message', (event: MessageEvent): void => { if (event.data === 'UNLOAD') { ports = ports.filter(innerPort => innerPort !== port); } }); }); ``` ## Unexpected alternative solution for memory problems It turns out that there is another way to detect when an object gets garbage collected. There is the FinalizationRegistry available, which is capable of observing the process and keeping a record of any reclaimed object. You can use it in a similar way to the IntersectionObserver. ```typescript const registry = new FinalizationRegistry((heldValue) => { console.log(`Object ${heldValue} reclaimed!`); }); const target = new WeakRef([]); registry.register(target.deref(), "some_identifier"); Array.from({ length: 50000 }, () => () => {}); // You will see: "Object some_identifier reclaimed!" in your console ``` Remember not to hold references to MessagePort instances. In other words, make sure to use WeakRefs to store them. This alternative seems to be a better solution for use-cases where you expect a huge number of ports to be opened at the same time. Instead of iterating over them repeatedly, you will be able to simply exclude them when needed. ## Conclusion In this blog post, we've explored the concept of sharing WebSocket connections between browser tabs and windows. By leveraging shared workers, we can optimize resource usage and enhance the performance of web applications in multi-tab or multi-window scenarios. Shared workers provide a powerful mechanism for establishing a central entity that manages WebSocket connections and facilitates communication between different browser contexts. **By creating a shared worker and utilizing the MessagePort API, we can pass messages seamlessly between browser tabs and windows, enabling them to share a single WebSocket connection**. While there are challenges to consider, such as memory management, utilizing appropriate techniques like WeakRefs can help mitigate potential issues. It's important to implement suitable strategies to ensure efficient resource utilization and prevent memory leaks. **By implementing WebSocket connection sharing, you can enhance the efficiency, responsiveness, and overall user experience of your web application**. Users can seamlessly interact with your application across multiple tabs or windows, while avoiding unnecessary resource duplication. Happy coding! ## Focusing Tests in Quick. A Tip for iOS Developers *Published: 2023-07-26 | Author: kamil-b | Tags: ios, development* *Source: https://brightinventions.pl/blog/focusing-tests-in-quick-a-tip-for-ios-developers/index.md* **When writing unit tests in Quick, you can easily change it to `fit` to have a focused test – then only this one will execute. It is great for debugging. Check it out!** In Quick you can focus on specific test with use of `fit`. Just change `it` to `fit` and only this test will run. It’s especially useful when we want to ensure that another test does not activate our breakpoint. Similarly to fit you can focus groups of tests with use of `fcontext` and `fdescribe`. Then only tests within such group will run. ## Focusing test use case example Let's say we are currently working only on the context where a user doesn't have available funds then instead of context we can write `fcontext` which means – focused context and only test cases from this context will be performed. ```swift describe("Credit Card") { context("User has available funds to transfer") { beforeEach { ... } it("Should show enabled button") { @MainActor in ... } it("Should show transaction options") { @MainActor in ... } } fcontext("User doesn't have available funds to transfer") { beforeEach { ... } it("should show disabled button") { @MainActor in ... } it("should show transactions history") { @MainActor in ... } } } ``` Now only tests under the context of the user without any funds will be performed. You need to admit it's rather quick. I'll let myself out… **Have you enjoyed this bright dev tip? Let us know in the comments!** ## Pros and Cons of Software Development Pricing Models *Published: 2021-06-10 | Author: izabela | Tags: pricing model, business* *Source: https://brightinventions.pl/blog/pros-and-cons-of-software-development-pricing-models/index.md* **Fixed price or Time and Material? What is the best pricing model for software development services? Or maybe there is a third option to consider? Let’s dive into the pros and cons of popular pricing models for software development.** The most common ways to settle up with software development agencies are: **fixed pricing and Time and Material (T&M) pricing models**. ![pricing models software development](../../static/images/price_models_in_post.png "") ## What is a fixed price model? A fixed price model is a situation when you (as a client) agree with a software development agency **a price set for a job to be done** in a specific period of time. For example, you pay a fixed price for [Minimum Viable Product (MVP)](/our-areas/mvp-development). ## What is a Time and Material (T&M) model price? You **pay only for the real time spent on the project and the resources** (materials) needed to complete the job. ## Fixed price pros: * It gives you (a client) a sense of security. * You know how much the development process will cost. * You don’t have to worry about any surprises on the road therefore budget changes (in theory). * It is convenient at the beginning of the cooperation when you want to test the software development company and still are building trust toward a software vendor. ## Fixed price cons: * It is not a flexible option. It is somehow in opposition to agile methods. * Changing plans during the development process is a very common practice and the fixed price model doesn’t work well in these cases. * If you need to change the tasks or need to create features that weren’t estimated earlier as soon as possible then it may cause some pauses in the development process because you and the software development agency have to go back to the valuation stage. * You receive only the final price of all tasks. They don’t know the separate costs of every task. As a result you are unaware of a very important aspect of software development – which features cost you the most. If some of the features are particularly expensive – you could skip them if they are not crucial for the app to succeed. ## Time and Material pros: * It is a model price compatible with the agile methodology. * It is flexible – you can quickly change the development process while the work is on, adding new tasks usually doesn't interfere with other tasks. * You understand much better what time, effort and money is behind every feature. You know the price of every feature and based on that knowledge you can optimize the development process according to your budget and business plan. * It also works perfectly during the maintenance phase when the software development team should be available if something happens with the product. That service can be easily estimated thanks to the T&M pricing model. ## Time and Material cons: * You never know the final price of the development process. You get the price after some features are done (depending on the number of hours and resources used on the tasks). * You have to trust the software development agency that the time they spend on the project is accurate and reasonable. * Sometimes you have to involve an expert that will verify the number of working hours established by the software development studio. **Due to the fact that none of these price models are perfect, at Bright Inventions we often offer a hybrid pricing model that combines the advantages of both fixed price and T&M models.** ## Hybrid pricing model for software development: * Software development studio presents the fixed price but for a smaller piece of the software development cake. 🙂 * The fixed price contains the job planned to do within the sprint (usually sprint lasts 2 weeks). * Before each sprint there is a planning meeting with the client and software development company. Both sides establish what needs to be done during the upcoming sprint. * According to that software development company creates a budget proposal. When the client accepts it, they know what is going to be delivered within the next 2 weeks and how much it will cost. * When the plan has to be changed because, for example, other features have to be developed asap, we have flexibility to quickly adjust to the expected changes. It is all thanks to the agile iterations – we plan only next weeks of the development process so it is much easier to change the plan. * During the maintenance phase the client can pay for some amount of hours when a software development team is available if something has to be fixed or changed. Even if nothing happens during those hours the client is secured in case some problems occur. It is less expensive than waiting for availability of a software development company after you deal with issues in production that affect your users. What is the best pricing model for you? Let us know in the comments! ## 5 Things You Should Know about Working with Polish Developers *Published: 2019-07-29 | Author: ula | Tags: software development, Poland, outsourcing, business* *Source: https://brightinventions.pl/blog/five-things-you-should-know-about-working-with-Polish-developers/index.md* **Let us be honest: outsourcing your software development to a different company or – even more so – country, is always a huge step. So, it is natural that you want to look into every possible option. Now, given that you have come across this post, we are assuming you are at least a little intrigued with what it is like to work with Polish developers. Are they really as good as they say? How easy is it to communicate with them in English? What about their work ethics? Wonder no more!** We have created a list of five things you may have always wanted to know about Polish developers, but were too afraid to ask. Let us take a look. ## 1. Poland is a leader among countries in CEE Poland has been recognized as one of the leading countries in Central and Eastern Europe (CEE) for software development. The Future of IT report 2023 gives a regional overview of the IT sector in the region, available talent, costs as well as room for potential growth. Polish developers have gained prominence in the tech industry due to several factors.
    ![poland leader emerging europe](../../static/images/poland-leader-emerging-europe.png "undefined")
    ###### Source: https://emerging-europe.com/future-of-it You also might have heard of a site called [HackerRank.](https://www.hackerrank.com/) It’s where hundreds of thousands of developers from all around the world test their skills by completing various coding challenges. The results of HackerRank’s [Programming Olympics](https://blog.hackerrank.com/which-country-would-win-in-the-programming-olympics/) say it all: Polish developers took third place (an average score from across all types of tech challenges in areas such as algorithms, Java, data structures, and many others). ![Polish software developers](../../static/images/Best_developers_HackerRank.png "") Poles were only two points short from the top two countries on the list, China and Russia. So, who knows what the next round of the Olympics might bring? ## 2. Polish people speak English very well I am sure you have read some dreadful stories about how outsourcing to a foreign country can be a real nightmare, as you might end up working with a team that barely speaks any English. This won’t be your worry if you choose to work with [a software agency from Poland](/). English is by far the most widely spoken foreign language in the country (a huge factor being that you can only graduate from high school if you pass a foreign language exam). Take a look at Poland’s [English Proficiency Index](https://www.ef.com/wwen/epi/regions/europe/poland/) with the position in Europe 11 of 35, 13 out of 111 countries in the world today, and with the high proficiency as compared to Russia and China (so, the other two countries on the HackerRank podium):
    ![english proficiency index ](../../static/images/english-proficiency-index.png "undefined")
    ###### **Source:** https://www.ef.com/wwen/epi/regions/europe/poland Bear in mind that these statistics show Poland as a whole – not just the IT crowd. Looks encouraging, doesn’t it? ## 3. Polish developers are known for strong work ethics There’s no better way to put this than in the words of the [European Committee](https://ec.europa.eu/eures/main.jsp?catId=2789&countryId=PL&acro=lmi&lang=en®ionId=PL0&nuts2Code=%20&nuts3Code=®ionName=National%20Level): “Poland's greatest asset is its people. What stands out is their ambition, motivation to learn, high work ethics, loyalty and rare entrepreneurial spirit”. This is clearly reflected in the way Polish developers work, prioritize, as well as in their understanding of the word “done”. You’ll also notice that Polish developers don’t give up on challenging tasks all that easily. As a matter of fact, HackerRank listed Poland as the 2nd most resilient group of developers in the world – a rank it shares with Hungary. Additionally, Poland is the 6th largest economy in the European Union, with strong international business presence. There are thousands of global companies with significant business operation units located in Poland. These include, for instance, JP Morgan Chase, Google, Uber, Goldman Sachs, EY and McKinsey & Company, among many, many others. This also means that many programmers at Polish software houses have previously worked and gained experience at these and other multinational organisations. ## 4. Poland is GDPR compliant – meaning, your data is safe and sound Safety is another crucial point you can cross off from your potential worries’ list. Being part of the EU, Polish software companies are GDPR-compliant and the data you disclose to them is protected on all fronts (to demonstrate, here’s an example of our own [privacy policy](/privacy-policy/) at Bright Inventions). When you work with Polish software houses, your data is kept secure both by advanced tech, as well as a legal team who works themselves to the bone to keep your data and software protected, 24/7. And now last, but not least… ## 5. The time difference is acceptable, with only 6 hours separating Poland and the U.S. East Coast Poland is ideally located if you want a team who’s available regardless whether you’re based in the Western or Eastern hemisphere. There’s a 6-hour difference between Poland and New York, meaning that both sides can comfortably communicate during office hours. So, for instance, if you want to schedule your sprint planning call during your morning coffee at 9 a.m., EST, your developers will just have finished lunch, with 3 p.m. on the clock. **Hopefully, we have answered at least some of the questions you may have about working with Polish developers. If there is anything else you would like to know, reach us out. We would love to tell you more!** ## How to Inject Navigation Argument Directly into View Model with Jetpack Compose and Hilt *Published: 2023-07-18 | Author: radek | Tags: Android, JetpackCompose, Hilt, navigation* *Source: https://brightinventions.pl/blog/inject-navigation-argument-directly-into-view-model-jetpack-compose-hilt/index.md* **When using the Jetpack Compose navigation you may sooner or later come across the problem of passing arguments between the screens. The solution is fairly well described in the official [Android documentation](https://developer.android.com/jetpack/compose/navigation). Let's follow the documentation and go over a few issues that you might encounter on the way.** ## The problem Following the official documentation we’re ending up with a `NavHost` setup, defined routes and the following view model setup: ```kotlin class UserViewModel( savedStateHandle: SavedStateHandle, private val userInfoRepository: UserInfoRepository ) : ViewModel() { private val userId: String = checkNotNull(savedStateHandle["userId"]) private val userInfo: UserInfo = userInfoRepository.getUserInfo(userId) // ... } ``` With this approach we don’t add a lot of code to the view model in order to retrieve the desired navigation argument. Yet there might be two issues to consider: * With more arguments we keep putting more code to the view model class, * If we want to write tests for our view model we need to mock the `SavedStateHandle` and any repository we’re using, like `UserInfoRepository` in the example above. ## Hilt to the rescue Using Hilt we can add an in-the-middle module that could resolve `SavedStateHandle` and pass the actual navigation argument directly to the view model. ```kotlin @Module @InstallIn(ViewModelComponent::class) object UserScreenNavigationArgModule { @Provides @ViewModelScoped fun provideUserInfo( savedStateHandle: SavedStateHandle, userInfoRepository: UserInfoRepository, ): UserInfo { val userId: String = checkNotNull(savedStateHandle["userId"]) return userInfoRepository.getUserInfo(userId) } } ``` ```kotlin @HiltViewModel class UserViewModel( private val userInfo: UserInfo ) : ViewModel() { // ... } ``` Just two remarks: * Install the module in the `ViewModelComponent` class * Narrow the scope using the `@ViewModelScoped` annotation ## Links If you need to test this solution on a working example I’ve prepared one. Sample app: https://github.com/radek-bright/demo-navigation-arguments ## Side Note: Motivation P.S. for a background reference. In the not-so-distant past, when using Dagger2 and Fragments, we could have skipped injecting `Bundle` objects into view models and take advantage of a custom per-fragment navigation argument module that we could include with `@ContributesAndroidInjector`. I’m not going to go through the process, but just for the reference the core looked like this: ```kotlin @Module interface InjectorModule { @ContributesAndroidInjector(modules = [ArgsModule::class]) fun contributeMyFragment(): MyFragment } @Module class ArgsModule { @Provides fun provideMyArgument(fragment: MyFragment): MyArgument = fragment.arguments?.getSerializable("MY_ARGUMENT_KEY") as MyArgument } class MyFragmentViewModel @Inject constructor( private val myArgument: MyArgument, ) ``` ## Successful Designer-Developer Collaboration in MVP Work Environment *Published: 2020-03-03 | Author: alisa | Tags: MVP, design, cooperation* *Source: https://brightinventions.pl/blog/successful-designer-developer-collaboration-in-mvp-work-environment/index.md* **Undertaking a brand new idea and turning it into a successful product is always thrilling but also risky. In order to create a successful and meaningful project it is essential first to build [Minimum Viable Product (MVP)](/our-areas/mvp-development) to see if we are on the right track and if our strategy is going in the right direction. That is why, building MVP gives us an advantage, as it helps define all possible pitfalls, eliminates gaps in a wholesome product in future, or even helps to understand if our approach should be changed completely already on the early stage of the project.** ![](../../static/images/alisa_desdevcollaboration-copy.png "") Hence, the work environment of MVP should be highly lean and flexible, the collaboration of the team inside such environment should also resemble all traits of resilience, an ability to adapt to a constant change at a rapid pace. Thus, a favourable outcome of MVP largely depends on the team, the way they communicate, adapt and collaborate with each other. Especially, when it comes to designer-developer joining forces, it is essential that they create **a work tandem** and do their best to achieve top results. How do we make sure that the designer-developer team work is lucrative? ## **Here are 3 easy tips to a successful collaboration in MVP environment:** ### Listen #### Listen with the intent to understand, not with the intent to reply Stephen R. Covey in his book, [The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change](https://www.goodreads.com/work/quotes/6277-the-7-habits-of-highly-effective-people) has stated that most of us do not really listen in order to understand, as when our interlocutor explains their idea we do not listen till the end of their sentence, at the very moment we are preparing our reply and we are thinking of what we want to tell our interlocutor. This way we are focusing on what we want to say, not hearing the other party.
    Most people do not listen with the intent to understand; they listen with the intent to reply.
    Stephen R. Covey
    **Whether you are a designer or a developer, make sure you always listen to the other party and what they have to communicate**. While building MVP some adjustments and modifications are inevitable. Developers will most likely ask for a few changes in the designs to make a project easier and faster to implement. Certainly, in the real MVP environment designs might be altered, oftentimes projects will not be even done pixel perfect. A few components can look a little different, as for the faster development ready-made solutions might be taken into consideration as long as they do not disrupt the usability. On the contrary, in some cases it might not be possible to simplify and cut down on a number of things while these changes might hurt user experience or the design system of the product. So, listen in order to hear these arguments from both sides because MVP may not be pixel-perfect, but it should be pleasant and easy to use. ### Ask #### There are no stupid questions in a positive environment Positive atmosphere enhances productivity. Usually building MVP requires a high paced working process which might ricochet at team with stress and feeling pressure especially before meeting the deadlines. What can be worse than confusion and misconception while trying to work fast? Any misunderstanding increases tension in working relations and slows down the process. Therefore, it is significant to **ensure that the designer and developer teams are working in a friendly environment, are positive and respectful towards each other and are comfortable with asking questions**, which discards misunderstandings and results in delivering product faster and with less stress. Asking questions might not be that easy for everyone. Some people hesitate to acknowledge that they do not understand something in order not to be perceived as someone who slows down the working process with their questions. Nevertheless, asking the right question at the right moment might expose the problem from a different perspective and show that the initial concept was not right and the change is needed. That is why it is important to maintain positive working relations in which there are no stupid questions, as raising queries can eliminate misunderstandings, lead to discussions and delivery of better MVP. So, don’t be afraid of asking questions and do not hesitate to answer the same questions again and again till the mutual understanding is reached. ### Adjust #### MVP is about adopting to a change Building MVP means to be constantly ready for a change. Successful MVPs use a **User-Centered Design** approach which follows user needs on all stages of the project. That includes some frequent user testing sessions that help understand if the features we design and build are really needed and if user appreciates them. After such user testing, most often, the product requires some adjustments. At times these changes do not only result in making buttons more eminent, but even in giving up one feature in favour of another, or so much as rethinking the whole concept. So, **designer-developer tandem should be ready as for small modifications, as well as for bigger conceptual alterations of the product**. ## In conclusion Undoubtedly, as designer-developer being a part of MVP process is an amazing experience as you get to see the birth of a product and provide the ideas which can change it. You also can learn volumes from the user feedback, make small adjustments, or rethink the whole concept of an output. However, **the success of MVP also depends on the designer-developer ability to cooperate with each other**. Remember not only to listen to the other party but also hear what that party has to say. Don’t be afraid of asking questions, and don’t be reluctant to answer the same questions again and again. And particularly, do not get attached to already created solutions, be prepared to frequent changes, modifications and alterations. Trying to follow these tips may bring you and your team to a positive, friendly MVP working environment. Contact us if you are looking for [MVP development agency](/our-areas/mvp-development). [](/our-areas/mvp-development)We are ready to help! ## What Are the Stages of App Development? *Published: 2021-05-19 | Author: izabela | Tags: development, business, design* *Source: https://brightinventions.pl/blog/what-are-the-stages-of-app-development/index.md* **From an idea to a successful launch… There are 4 main stages of building an app. Learn more about all of software development steps.**
    ![Software development stages and timeline](../../static/images/timeline_app_development_stages.png "Timeline template by Yuhki Yamashita (licence CC BY 4.0).")
    [Timeline template by Yuhki Yamashita](https://www.figma.com/community/file/767777586184800315) (licence CC BY 4.0). ## Web or mobile app development steps and timelines Check out all the steps on the road to a successful app launch and maintenance. ## App Idea ![idea for na app](../../static/images/1_idea.png "") * Even the most unique idea doesn’t guarantee success. This is only the beginning. * **This phase helps quickly verify if the idea has some business potential.** For example, creating another weather app may not be a profitable option. * Also, during this stage, you can start looking for a suitable software development company. * Software development companies often conduct [product workshops](/our-areas/product-workshops/) with the client to discuss the idea and its potential. * This stage **helps to answer another big question – how much would my app cost**? If the idea is too expensive to develop, you can modify it or even just give up on it. * This is a great moment to **establish first goals** that will help you to measure in the future if your app is a success. However, these goals might change. While you are getting to know the industry, you might better understand what you need to succeed. * Ideation is a significant time for product designers. During workshops with the client, designers can better understand the whole solution. This brings us to the Prototyping phase. ## App Prototyping & Product design (1-4 weeks) ![App prototyping](../../static/images/2_app_prototyping.png "") * The stage when a product **designer creates the first visual representation of the idea**. * Prototyping phase contains 3 stages: **wireframes, mockups, prototypes**. * **Wireframes are very simple designs** (even drawn on a piece of paper) that show the basic application flow. They are just a structure – a backbone of the product that may not be contextually full. * There are two types of wireframes: * **Low fidelity wireframes** – help understand the structure of the product/service and make sure the client and the team are on the same page. * **High fidelity wireframes** – help understand the structure and feel of the product/service. They can be presented to stakeholders and first user testers. * Then come mockups that derive from high fidelity wireframes. **Mockups ensure the client that all requirements are met**. Also, provide developers with all the info about UI elements. * After the mockups stage, it’s **finally time for prototypes**. They are basic clickable mockups or wireframes without any backend. The product designer creates mockups especially to show testers how the solutions might work. This is the moment when the idea starts to be something present, something that we can click on and engage with. * This stage **helps to eliminate other mistakes** that we weren’t aware of till this point. During this phase we can even come to the conclusion that our app is too difficult for users or users would use it differently than was expected. ## Building the MVP (Minimum Viable Product) (4-20 weeks) ![Building the MVP](../../static/images/3_mvp.png "") * According to the first feedback received during the prototyping stage, the software development agency creates the first version of the mobile app. **[MVP](/our-areas/mvp-development) is the minimal version of the product/service including only crucial features.** * Developing crucial features helps to reduce time to market and prevent app owners from spending too much money on a product that hasn’t been verified by the market yet. * MVP development works closely with the agile methodology. * Business trends and technologies transform every day so **developing MVPs helps quickly enter the market** and easily adapt to any possible business or technical changes. * MVP is also an opportunity to meet first technical challenges that could have been missed during prototyping phase such as: accessing geo location in the background or handling [bluetooth](/our-areas/bluetooth-development) communication with other devices. * Even though MVP is a basic version of the product, it should be treated as **a solid base for what’s next**. Well done MVP will benefit in the near future during another development stage. MVP gives a chance to create a well-thought software solution, based on our perception of users’ needs **actual users’ needs and market trends**. ## App Development, QA & Maintenance (Infinity – usually) ![App Development & Maintenance](../../static/images/4_app_development_-_maintenance.png "") * Congrats, you’ve made it! 🙂 * At this stage, a software development company regularly deploys some new features to production. * QA team makes sure that your software is secure, up-and-running and offers the best possible performance. * **Every change in the product will affect your users.** Thus at this stage the priority for developers is to maintain the app stability. All development updates should be tested in a staging environment. * The crucial part is to analyze users’ behavior to see how they respond to new features. * Also, at this stage mobile app developers have to regularly update the apps to cope with the Android and iOS changes. * It’s a constant challenge of developing our product to give more and more satisfaction to the users. :) Now you know more about the most important app development stages. **Remember that the final flow always depends on the project**. Not every step is required. Nothing is set in stone in the app development world. ## Selecting the Right Partner to Build Your MVP *Published: 2017-10-23 | Author: michal | Tags: mvp, startup, outsourcing* *Source: https://brightinventions.pl/blog/selecting-the-right-partner-for-your-mvp/index.md* **One of the things that we do best at Bright Inventions is helping startups build their first MVP. It's pretty common that founders select us as their technology partner and rely on us to turn their vision into reality. We enjoy this kind of challenges and over the years have started to understand quite well why** – **simply said** – **startups like to work with us. However, this note is purely intended as a set of generic things to look for in a technology partner.** ## 1. Closely located It really helps when seeing your MVP development company in person doesn't take half day of travelling. **Software development is one of those activities in which a lack of communication between parties can result in heavy costs further down the road**. Most of the time Slack, Google Meet, JIRA, etc. work perfectly but there should be times that you can just all sit together in one room and make sure you're well aligned. Misunderstood or missed requirements are easy and cheap to fix in the early phases of the project but very expensive later on. **Start project with a [product workshops](/our-areas/product-workshops/) and keep meeting on a regular schedule to validate work in progress and realign your expectations**. ## 2. Shared values Since you're going to be working together very closely **it's vital that you both share the same values and that their working culture is close to yours**. Do you hate when somebody is late for a meeting? Are you obsessed about keeping discussion to the point? What is your definition of "done"? **Vet your potential partner before any agreement is signed**. Make sure you can keep up with them on a personal level. You don't have to be best friends but there needs to be solid grounds for mutual appreciation, trust and understanding. ## 3. Extension of your team You run a startup and therefore things change rapidly. Each day brings new ideas, things to check out, more requests from the clients. **You should be able to share it all with the developers working on your product without having to go through any soft of legal layer. If adding even the smallest change to the feature set requires signing an annex with them - it's not worth it**. If there are things that you would have no problem asking your in-house developer but for some reason are prevented from asking the same from developer working for your partner company then it's not worth it neither. You should be able to work with them as if they were part of your team. Effectively they should feel that they are a part of your team. There's a catch: you also need to treat them as a part of your team.
    ![Bright Inventions team](../../static/images/bright_team.JPG "undefined")
    ## 4. Work out a good payment model In order to make the above possible it's good to **work out a simple to understand payment model**. You might like the benefits of a fixed-price approach but in reality that would quickly limit the scope of changes that you can reasonably request from them. A sensible approach might be to work in sprints and have them charge you a fixed amount after each sprint. It lets you refocus after each short iteration and nobody will make any fuss over requirements changing from sprint to sprint. Your vision will evolve and your partner should adapt. Read more on [software development pricing models](/blog/pros-and-cons-of-software-development-pricing-models). ## 5. Argues with you It's all too easy to find a partner who would just blindly follow your requests. I**t's much harder to find one that would put your ideas to the test and challenge you**. One that would truly care about your ultimate goal and would openly discuss their insight until your (or their) point is validated. Let's say that you want to add full [offline support to the app you're building](/blog/offline-first-app-guide-for-startups-app-owners-case-studies/) (which is usually a tall order but doesn't seem so). They can either sheepily follow or convince you that there are more pressing issues in the backlog that would benefit your users more. Sometimes you come to them not with a problem but with a ready solution. It's better if they are not afraid to point you out misassumptions in your proposed solution and are openly against executing something that doesn't make sense. If you've chosen the right partner they will surely have more technical experience than you have and they will also have some business experience from the past projects. ## 6. Stable team Before you start relying on a development partner you absolutely need to **make sure that it's a company that maintains a stable team of high-quality programmers**. You don't want them to restaff your project team every few weeks. You need to have a sense of stability and be sure that the people who work on your project won't get reassigned willy-nilly to another gig. Also, if there's any way you can get more familiar with the individual developers who will work on your project (their personal blogs, conference talks, etc.), it's a great plus. ## 7. Estimates People who will work on your project will have to come up with different sorts of the estimates. It starts with a high-level estimate before the kickoff, i.e. how many sprints might we need to accomplish a given feature set. Then there are estimations made during sprint planning and estimates made on the go when you check with developer how much time they need to complete a given task. It's very hard to check but you'll be much better of if you can trust the estimates coming from them. **If you realize after the first couple of sprints that their estimates are way off, you have to openly discuss it and expect them to be more realistic**. You make business decisions based on the estimates you get from them. Obviously, you always have to plan for some buffer but you can't accept things taking twice the time they estimated. **An estimate is not a promise and it's not a commitment but it should mean something**. ## 8. Progress You need to be able to track progress easily and on a regular basis. It starts with the source code repository. **Be sure that the code gets pushed to your GitHub or BitBucket account**. Make sure there's a continuous integration system that builds all of the components after each code change and that automatically deploys it or pushes for testing. **Make sure that the continuous integration system stays deployed to machines that you control** so that you can still use it if you stop working together.
    Choosing the right [MVP development agency ](/our-areas/mvp-development)is a leap of faith. You need to feel good about your decision and have full trust in them. **It might be hard to find a partner that meets all the criteria listed in this note but at least make sure that they won't have problems challenging you if they disagree**. They might be right. ## How to Protect Software Development Projects from Bus Factor Problem *Published: 2021-07-15 | Author: izabela | Tags: startup, business strategy* *Source: https://brightinventions.pl/blog/software-development-projects-bus-factor/index.md* **Do you know what a bus factor is? Should it be a nightmare for startups that build in-house teams or hire a software development agency? Check out the best practices to protect the development projects from the bus factor risk.** ![bus factor](../../static/images/blogpost_izabela_bus_in_post-01.png "") ## What is a bus factor? **The bus factor is a risk management term originating from the phrase "in case they get hit by a bus".** The bus factor is a measurement of risk related to the minimal number of people within the team and the quality of knowledge sharing that are required for the projects to pursue in case somebody "gets hit by a bus". **The lower the number of key team members that share some unique knowledge, the lower the bus factor is. If there is only 1 member of the team that has crucial isolated knowledge and distinctive skills then bus factor = 1.** That is a situation which every organisation should avoid. Every project manager and startup that hires a software agency should answer this question: If somebody “gets hit by a bus”, will the team be able to go on with the project? ## How to protect your success from a low bus factor?  At Bright Inventions we have developed lots of best practices that help to protect the project and client from the bus factor = 1. Let us take a look at some of them!  ## Documentation Don’t speak about it, write it. A well-written documentation is an important source of knowledge about the project, especially for new team members. Remember to include architecture decision records that show the reason behind every significant decision. It definitely helps to pursue the software development process even if somebody “gets hit by a bus”. ## Automation When it is beneficial, **use some tools that automate the processes and support developers**. It raises the effectiveness and reduces the bus factor risk at the same time. Continuous integration (CI) and continuous delivery (CD) allows for automated building, testing, and deployment, including some customized settings for each environment.\ \ In the beginning, automation may seem to be time-consuming but in the end it is truly a time-saver with lots of other benefits. In case of somebody being “hit by a bus”, you are not dependent on other people to conduct e.g. the deployment. You rely on scripts to do the job. You reduce the risk of human errors, too. Automation not only increases the effectiveness of your team but also supports you during crises. ## Secret management Imagine a situation when a person “hit by a bus” is the only one that has passwords to the software product and infrastructure. There is an easy way to minimize that risk. **Thanks to secret management tools you can safely store and share passwords**, keys and API within the team and make sure that all that information isn’t accessible only by one member of the team.  ## Don't rely on individuals  When you have less and more experienced developers within the team, they should handle issues together. Only then less experienced developers can learn from others. **Handling difficult tasks only by seniors could significantly increase the risk of the bus factor.** In addition, pair programming is worth considering. Working in pairs is a part of agile methodology (yep, we are agile fans). It helps to constantly review each other's ideas, solutions and code. It ensures faster development of the team, delivering better solutions, and (by the way) it is a great way to increase the bus factor. ## Teambuilding Nowadays, the number of senior developers is still insufficient, so the recruiting processes never end. Recruiters have to regularly bring new talents to the team. It is related to the bus problem as well. **The stable number of seniors within the teams helps to protect business from the low bus factor.** What is more, it may be easier to reduce the bus factor risk when you (as a client) **rely on a software development company instead of so called “body leasing” companies**. When you hire a team that works together for years (instead of developers that have never worked together before), then it is easier to maintain the high quality of work, ethics and teamwork.    ## Get access everywhere  If you decide to hire a [software development agency](/), then **you should get all the access to the code, infrastructure and tools** needed to develop your product. It helps to protect you from vendor lock-in and reduces the bus factor risk as well.  ## Don’t neglect the low bus factor risk When you hire a software team you have to always have in mind the bus factor issue. Fortunately, when your team knows how to share knowledge and communicate effectively, the bus factor shouldn’t be so much of a concern. Just stay calm and… follow the practices that we’ve presented. 😉 ## Embracing Polymorphism for Flexible Components *Published: 2023-07-12 | Author: szymon-ch | Tags: TypeScript, React, Polymorphism, design patterns* *Source: https://brightinventions.pl/blog/embracing-polymorphism-for-flexible-components/index.md* **Do you want to take your React skills to the next level and create more versatile components? Polymorphism is here to save you! It will help you build reusable components, no matter if you're a React rookie or a seasoned pro. Prepare yourself for an expedition through the essentials, advanced techniques, and real-life use cases commonly found in various codebases. Let us embark on this voyage together and unlock the true potential of polymorphism in React!**
    ![Polymorphic Components](../../static/images/polymorphic_components_blog.png "Polymorphic Components")
    ## What Are Polymorphic Components? **They are versatile React components that can adapt their appearance and behavior based on the context in which they are used**. Unlike traditional components, which are rigidly defined by their structure and styling, polymorphic components allow you to customize their rendering based on the specific requirements of each instance.

    Why should you care about polymorphic components?

    Well, picture this: you're building a web app with various user interface elements, such as buttons, links, or even cards. Instead of creating separate components for each variant of these elements, polymorphic components empower you to build a single, flexible component that can effortlessly transform its appearance and functionality as needed.
    ## The Magic Behind Polymorphic Components At the core of polymorphic components lies the concept of prop-driven rendering. Instead of relying solely on predefined tags, polymorphic components harness the flexibility of props to dynamically determine their rendering logic. By passing a special prop, often called `as` or `component`, you can specify the underlying HTML tag or a custom React component that the polymorphic component should render as. This dynamic rendering capability opens up a whole new world of possibilities. Need a button that renders as an anchor tag or even a custom button component? No problem! With polymorphic components, it's as simple as passing the desired tag or component as a prop. This flexibility enables you to reuse a single polymorphic component in various contexts while still maintaining consistency in functionality and styling. ## Unleashing the Potential of Polymorphic Components Now that we have a solid understanding of how polymorphic components work, let's explore some real-world use cases where these dynamic powerhouses truly shine. ### Button Variants Imagine you're working on an e-commerce website, and you need to create different types of buttons for various actions like "Add to Cart," "Buy Now," or "Read More." **Instead of creating separate button components for each variant, you can leverage the flexibility of polymorphic components**. With a single polymorphic button component, you can easily customize its appearance and behavior by passing different values to the `as` prop. This way, you can have anchor tags, button tags, or even custom button components rendered on the fly, all while maintaining consistent functionality and styling. ### Navigation Menus **Polymorphic components can be a game-changer when it comes to building navigation menus**. Let's say you have a horizontal menu that needs to render as an unordered list (`
      `) with list items (`
    • `). However, in certain cases, you may need the menu to be a vertical sidebar rendered as a `