# 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”.

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.

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.

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**.

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.

*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.

*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.
**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.

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
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.
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.

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.

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.
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*

**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.
PSA to the DotSama community 💻🤩🎉@BrightDevs developed something awesome to ease the treasury proposal submission process on @kusamanetwork and @Polkadot:
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.

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.

### 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**.

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.

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.
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**.

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**.

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**.
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**.

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.
**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**.

**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.

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.
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.*
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**.

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.

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**.
**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.

*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.
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.
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.
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.
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.

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**.
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**.

*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.

*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.

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.

*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.

*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.

*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.

*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.

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:
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.
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.

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.
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.
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.**

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**.
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.
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.

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**.
**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.

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.

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.

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.
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.

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.

*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.

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.

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.

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).

### 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.

**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.

### 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.

### 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*

*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.

*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.

*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.

*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.
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.
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**.
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**.
**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**.
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.

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.

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*

* 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.

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*

*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.

*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.

*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.
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.

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.

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.

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.

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.

*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.
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.
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’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.
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**.
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.
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.
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.
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*

## 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.

## 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**.

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.

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.
## 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.

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.

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.

**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.
### 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**.

### 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.

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.

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.
**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*

* 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.

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)
```

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:
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.
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.
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.**

## 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**.

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.

## 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.
## 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?**

## 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).
## 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.**

## 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.**
## 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:

* [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.

* [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.
*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.**
## 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.
**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.**

## 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.

## 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.

## 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.
## 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.
## 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
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.

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...

Now you have to select repository for which pipeline is being created. In my case this is repo for our iOS application.

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 😃
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...

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.
## 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.
### 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.
## 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**
## 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.
## 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.**

## 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.
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

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

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.**

## 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.

## 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.

## 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.

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.

## 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.

## 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.**
## 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.

**Ł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.

## 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.

### 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.

### 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.
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.**

## 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.

## 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.

## 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.

## 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.
## 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.
## 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.
## 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.
## 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.”

## 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.**
## 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**.
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.

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.
### 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**.

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:


## 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.

## 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.**

## 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.

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.
## 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.

**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.
## 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.
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.
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.
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.

# **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.**

## 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.
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**.

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.

## 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!

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.
## 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.
### 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.

## 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/).
## 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.
## 👀 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.**
## 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.**

## 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.**

## 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.**

## 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
;
};
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.**

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.

### 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

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

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

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

### 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!**

## 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 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.
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:
### 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:
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:
## 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.
Below is an example of a screen captured in wireframe mode in Android:
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.**

## 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.

## 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.
## 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**.

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.
## 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.
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.**

## 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
## 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

## 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*

## 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.**
## 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.
### 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.
## 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.**

## 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.**
## 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**.

## 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.
## 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.
## 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.
## 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”.

### 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.
## 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
**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*

## 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:
\- 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:

## 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.

## 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.

## 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.
## 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.

## 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.

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.
- - -
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
## 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.**
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!**
## 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.
## 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**.

## 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.

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.
## 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.
## 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.**

## **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 (
;
};
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:

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.

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.
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

### 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.**

## 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.**

## 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

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 `