Inspiration
This project was inspired by two key experiences. The first was when one of our team members, Keith, visited his cousin’s workplace—a hospital. There, he observed a verification kiosk where staff used keycards to access secure areas, while guests used temporary passes. The second inspiration came from CSULB’s theater system, where ushers scan digital tickets (such as those in Apple Wallet) before allowing entry into the auditorium.
These experiences sparked the idea behind Blinkey—a unified, secure access system that replaces physical passes and scannable tickets with facial recognition. By merging both scenarios into one streamlined service, Blinkey aims to reduce the risk of lost or duplicated credentials while integrating our team’s interest in computer vision and biometric technology.
What it does
Blinkey acts as a secure, facial-recognition-based access system that consolidates your tickets and work passes into one unified platform. By linking your facial profile with your authorized credentials from various institutions, Blinkey allows you to gain entry simply by scanning your face. It stores facial embeddings on a secure server and matches them against a database to verify your identity with speed and accuracy.
How we built it
We started by outlining the core functionality of Blinkey: facial recognition-based ticket/pass verification across different institutions. The development process was divided into three main parts — the Flutter frontend, the Python backend, and the integration of Firebase and InsightFace.
The Flutter frontend was responsible for capturing user images, handling registration, and allowing users to view or manage their linked tickets or passes. We used Flutter's camera plugin to capture real-time facial images and provided a clean UI for a seamless user experience on both iOS and Android devices.
On the backend, we used Python to build a lightweight API that handled facial recognition tasks. We integrated InsightFace, a state-of-the-art library for facial recognition, to generate facial embeddings (numerical representations of user faces). When a user registers or checks in, their image is passed to the backend, converted into an embedding, and then either stored (for registration) or compared to existing embeddings in the database (for verification).
We built matching logic using cosine similarity to determine whether a face matched an existing profile. This enabled real-time facial verification during check-ins or access attempts.
Firebase handled most of our backend needs in terms of infrastructure, with Firebase Authentication managing user sign-up and login, Firebase Firestore storing user data, ticket/pass information, and the facial embeddings of the user. Along that, FlutterFire allowed us to be able to access the server in real time to sync any changes that the user could want immediately to their app.
All components were tied together through HTTP requests from the Flutter app to the Python backend. When a user attempts to check in, their face is captured and sent to the backend, where it's matched against stored embeddings. If a match is found, the backend returns the associated tickets or access permissions to the frontend — all in one seamless interaction.
Challenges we ran into
Many of the challenges we encountered stemmed from our limited experience with some of the platforms we needed to bring this application to life. Two of our team members, Jason and Keith, were new to making API calls with Flask, designing mobile UIs with Flutter, and integrating Firebase services — which added a steep learning curve.
Beyond technical inexperience, one of the biggest hurdles was implementing our app’s core feature: real-time blink detection through the device camera. Integrating this functionality required us to restructure major portions of our application and rethink how components would communicate.
Initially, we tried incorporating blink detection into our user-facing app, but we quickly ran into compatibility issues that broke core dependencies and made the project unstable. This led us to pivot and integrate the detection feature into the Institution App instead.
Even after this pivot, performance was a major concern. Our early implementations of blink detection were choppy and inconsistent, resulting in a frustrating user experience. However, we were able to rebound quickly by leveraging open-source libraries and optimizing the detection logic to be faster, more responsive, and much more accurate.
Overall, many of our challenges were rooted in inexperience — but what we lacked in familiarity, we made up for in determination. Through problem-solving, pivoting, and persistent iteration, we turned blinking — once our greatest obstacle — into one of the features we’re most proud of.
Accomplishments that we're proud of
There were many accomplishments that we were proud of for this app. One of them was getting the blink detection feature to work. Getting the blink detection to work was very important as it was the core feature of our app.
Another accomplishment that we're proud of is the user interface and user experience (UI/UX) . The vision behind the app's UI in its initial stages was very minimal and bland in some ways. As we continued to develop the app, we ended up going above and beyond. One of them being the look of the tickets themselves. Initially we had them look like your typical red tickets that you get from carnivals and fairs. We ended up changing the entire look of the ticket where the ticket changes color depending on the status of the ticket (more details in the demo video).
Another part of the UI/UX that we're proud of is the animation of our logo when the user opens the app for the first time. We wanted to greet the user with something simple but flashy, giving the app some sort of user confidence and professionalism. The inspiration behind this was from apps like Life360 and Netflix. These apps although not related in terms of feature set, are apps that many people confidently rely on. We wanted to replicate that feeling when the user opened up Blinkey for the first time especially since this is a security app involving data collected from your face.
Overall, the accomplishment that we're most proud of was the development process. Although, some of the team was more seasoned in mobile app development than others, each time we met up as a team, we were all learning something new from one another. This ranges from things like learning new languages such as Flutter to learning how a pre-trained AI model worked to the tedious and unforgiving trenches of debugging. This collaborative growth not only strengthened our technical skills but also deepened our appreciation for the development process itself—turning challenges into shared victories and making the journey as rewarding as the outcome.
What we learned
Throughout, the development of Blinkey, our team gained invaluable technical and collaborative experience.
One of the things we learned was understanding how ArcFace worked. We learned that facial recognition models such as ArcFace converts facial features into high-dimensional embeddings, and how consine similarity can be used to identify a face with relatively high accuracy. Learning how to incorporate the InsightFace library (uses ArcFace) was essential in implementing one of our core features into Blinkey.
In addition, we also learned about mobile app development, specifically in Flutter. For some team members, this was an extremely new language. Learning Flutter involved understanding reactive programming principles, widget trees, state management, and creating fluid user interfaces that work across iOS and Android devices. It was both a challenge and a highlight to see our design ideas come to life on real devices.
Another core component we mastered was how to use Firebase as a full-featured backend service. We explored Firebase Authentication for managing user identities securely, and Firebase Firestore for real-time database syncing and storage of user-related data, including tickets and facial embeddings. We also learned how to handle secure interactions between the mobile frontend and our Flask-based Python API, which served as the bridge between user actions and our facial recognition system.
Bringing all these pieces together required a lot of trial and error, especially when dealing with asynchronous data handling, API integration, and performance optimization across platforms. But through this process, we not only improved our technical fluency, we also became more confident in working across a full-stack environment.
Future Considerations for Blinkey
There were many features and improvements we envisioned for Blinkey that didn’t make it into our final build due to time constraints, but would significantly elevate the user experience, security, and scalability of the platform.
For starters, we wanted to enhance the login and registration experience with small but impactful quality-of-life improvements — such as a show/hide password toggle on the password input fields. This would allow users to verify their inputs more easily, reducing login friction and avoiding common errors during account creation.
We also discussed expanding user customization. For example, allowing users to upload a profile picture alongside their facial recognition data would make the app feel more personal and engaging. Similarly, supporting theme customization — or even auto-adapting to the user’s device settings (like switching between light and dark mode) — would create a more modern and user-friendly interface. Giving users control over how the app looks and feels helps build trust, especially for a platform that handles sensitive biometric data.
Another future feature we want to implement is a "Recent Activity" log, which would show the user when and where their face was used for access. This not only improves transparency but also adds a layer of security and accountability.
Although some of these may seem like small or “nice-to-have” features, we believe that together, they would greatly enhance the usability, flexibility, and security of Blinkey. These future additions would not only polish the end-user experience but also strengthen Blinkey’s value as a scalable, professional-grade solution for modern access control.
Log in or sign up for Devpost to join the conversation.