Inspiration

Remember week one of university? You meet a flood of names with zero anchors. By October you’re waving at “that one person from orientation,” but the spark fades because there was nothing to hold onto—no shared thread, no easy next step. Bond lowers the cost of that first hello to almost zero and hands you something to talk about. You glance at your phone, see that the person across the table also skis, and suddenly it’s, “oh we both like to ski! how about we go this sunday!” Now the icebreaker comes with a built-in follow-up.

Meeting people nearby is weirdly hard. You see folks in the library, at rehearsal, in the dining hall—but you rarely know who shares your interests, your background, or just your immediate problem of “who wants to grab food?” We wanted something small, respectful, and instant: a gentle nudge that helps you find your people in the spaces you already occupy. That’s the seed of Bond—a way to surface nearby connections for any moment: matching on shared interests, spotting someone from your community to feel more at home, or pairing hungry humans to find a bite together.

What pushed us to build it wasn’t just the social need; it was the technical challenge. We’d never touched Bluetooth before this project, yet we wanted to bend the radio to our will—literally manipulate the bits in the advertisement packets—so your phone could act like a lightweight “key” that nearby devices recognize. Then we layered on time-together tracking and an end-to-end AI pipeline to make matches feel meaningful, not random. The result is a surprisingly powerful system that still feels down to earth: it just helps you meet the right people, right where you are. And because we automatically track who you actually spend time with, Bond doesn’t just spark connections—it helps them grow.

Introduction

Bond is a proximity-first matching app that works in the real world, in real time. Phones broadcast a tiny Bluetooth Low Energy (BLE) beacon and listen for others doing the same (we advertise BND as service data under the Heart Rate service UUID and scan with that filter). When two users are near each other, we create a unique pair (ID1<ID2), compute a similarity score from a short voice note → transcription → text embeddings, and let either person “request” or “bond” with one tap. If both accept, Bond quietly tracks shared minutes while you study, rehearse, or grab food—no GPS, no QR codes, no forms.

Under the hood, the system is intentionally simple—and rigorously engineered:

  • Bit-level BLE: Hand-rolled advertisement payloads and filters to detect nearby users without location services.
  • Clean state machine: Firestore “pairs” with (F,F)=no bond, (T,F)/(F,T)=pending, (T,T)=bonded, mirrored to each user’s incoming/bonded lists for instant UI sync.
  • Trustworthy time + insights: A throttled TimeTracker increments totalTimeMinutes only when both users are bonded and detected (via BLE). You get a personal Time With dashboard—who you’ve spent time with this week, streaks, and gentle suggestions about who you might want to see more—tracked automatically, zero check-ins.
  • Explainable AI matching (on AWS): Voice profile → Amazon Transcribe → Amazon Nova Micro for profile distillation → Amazon Nova Titan for embeddings (via AWS Bedrock) → similarity score + “similar features,” so matches feel meaningful, not random.
  • Firebase backbone: Auth, Firestore, Analytics, and Functions keep the app fast and reliable, while AWS powers the AI brain.

AI Framework — Powered by AWS

  • Generative AI is the heartbeat of Bond’s matching, and AWS made it production-ready in a weekend:
  • Understand the voice — A user records a short description. Amazon Transcribe converts speech to clean text.
  • Distill the person — Amazon Nova Micro (via AWS Bedrock) turns that transcript into a compact, expressive profile: hobbies, vibe, values.
  • Make it comparable — Amazon Nova Titan (via AWS Bedrock) encodes each profile into a vector embedding, so semantic “closeness” becomes measurable.
  • Match with reasons — We compare embeddings to produce a similarity score plus “similar features” explanations—the fuel for “hey, we both ski—Sunday?”
  • Strengthen over time — Those AI-understood profiles pair beautifully with TimeTracker’s automatically collected minutes. With AWS in the loop, we can generate friendly, privacy-respecting recaps like, “You spent 92 minutes with Ana this week—want to set up a coffee?” that help good connections become great ones.

Why this could be huge

  • What we have today already works—and it’s more platform than feature.
  • Campus & onboarding: Help new students or employees find micro-communities in hours, not months, with instant conversation starters and natural next steps. The Time With stats turn first meetings into sustained relationships.
  • Events & conferences: Auto-form birds-of-a-feather circles and “walk-to-lunch” groups based on live proximity + interests; time stats highlight which connections stuck after the keynote.
  • Clubs, studios, labs: Spin up study pods, rehearsal partners, or project matches as people co-locate; streaks and minutes make commitment visible and motivating.
  • Comfort & inclusion: Surface nearby folks who share language, cultural background, or accessibility needs—then reinforce those bonds with effortless, automatic tracking.
  • Everyday utility: Hungry now? Match with people nearby who are free now and share a taste; later, your dashboard shows who you actually vibe with and nudges you toward more of the good stuff.

Proximity makes meeting effortless. AI makes it relevant. Automatic time insights turn sparks into sustained connections. That trio—ambient sensing, transparent reasoning, light-touch accountability—can quietly rewire how communities boot up and sustain themselves. Bond isn’t gamifying friendship; it’s removing the static so the signal gets through.

Why we should get Excellent (8/8) across all criteria

FUNCTIONALITY — Code, execution quality (8/8) Bond doesn’t just demo; it operates as a coherent, real-time system. Phones advertise and scan via BLE with a tight Heart-Rate-UUID filter and a tiny BND payload, so proximity works indoors without GPS. On detection, we create/fetch a canonical pairs/{pairId} (ID1<ID2) and drive all logic from that single record. Bond/Unbond is transactional to prevent races, TimeTracker is idempotent and throttled (≤1 write/min per pair), and both devices stay in lockstep via Firestore snapshot listeners. Our AI pipeline—Amazon Transcribe → Nova Micro (distill) → Nova Titan (embed) via AWS Bedrock—runs in Cloud Functions, so phones remain responsive while the cloud computes similarity and “similar features,” which stream back and re-order the UI live. We’ve shipped empty states, failure states, staged permissions, and lifecycle-aware BLE so the app remains predictable on mid-range hardware.

Why this satisfies “Excellent.” The spec asks for robust code functionality and high-quality execution. We deliver: a real proximity graph, explainable AI matching, real-time state sync across devices, accurate co-presence time, and defensive engineering (transactions, throttling, lifecycle gating). Everything you see on screen is backed by production-style patterns rather than mock data—the hallway test, the live reordering from cloud scores, and the instant bond state flip prove end-to-end reliability.

DESIGN — UI / aesthetics (8/8) Bond’s interface looks polished and reads instantly. Similarity-first ordering puts the most promising matches at the top; tappable “why we matched” chips turn scores into concrete icebreakers (“Skiing,” “Ramen,” “CSE 351”). The Time With dashboard visualizes weekly minutes and streaks from totalTimeMinutes/lastSeen, nudging meaningful follow-ups without any check-ins. We wrap the app in a GlobalTouchRippleOverlay for subtle, system-wide motion; a breathing background adds mood without stealing focus; and Material 3 makes dark mode and typography feel native. Actions (Request/Accept/Unbond) use large hit targets, short state-narrating animations, and micro-haptics for confidence. Accessibility is baked in: content descriptions, focus order, contrast-checked chips, and announced state changes.

Why this satisfies “Excellent.” The rubric calls for very easy to understand, professional aesthetics. Our UI communicates hierarchy (similarity > proximity), provides transparent reasons, and maintains performance through memoization and conditional drawing—delight without jank. It’s not “a list with buttons”; it’s a coherent language where motion explains state and every visual element earns its keep.

CREATIVITY — Novel solution, few weaknesses (8/8) Bond combines ambient radio presence (BLE) with explainable generative AI and automatic time insights—a trio we haven’t seen in campus social tools. Instead of forms or GPS maps, we use tiny BLE beacons to surface nearby humans; instead of black-box matches, we show Bedrock-generated reasons; instead of “add friend,” we quietly track shared minutes to strengthen real-world bonds. The pair mini-ledger (one canonical doc carrying state, similarity, explanations, time) is a clean, uncommon primitive that simplifies UX and analytics. We handle constraints head-on: privacy (no GPS, distilled profiles not raw audio), battery (scan/advertise scoped to lifecycle), concurrency (transactions), and multi-device variance—not as afterthoughts, but as design inputs.

Why this satisfies “Excellent.” The category asks for a complex approach that addresses technological and contextual constraints in a unique manner. Our architecture is novel yet grounded: radio instead of location, explainability instead of mystery, continuity instead of one-off pings. Weaknesses (privacy, races, power) are mitigated with specific mechanisms, not promises.

TRACK APPLICABILITY — AWS alignment (8/8) Bond is an AWS-first application where the cloud isn’t décor—it drives the experience. We use Amazon Transcribe for speech→text, Amazon Nova Micro to distill persona snapshots, and Amazon Nova Titan for embeddings, all via AWS Bedrock for a unified, managed entry point. A Firebase Cloud Function orchestrates Bedrock calls, writes sim_score and similar_features to Firestore, and the phone live-reorders candidates based on those AWS results. This is precisely the “cloud intelligence animating the edge” pattern AWS champions. Our roadmap extends AWS further with weekly recaps and suggestions generated by Bedrock, cost/latency wins via on-device caching + Bedrock refresh, and privacy-aware token rotation validated server-side.

Why this satisfies “Excellent.” The rubric asks that the project go above and beyond as an exemplar of the track. We’re not merely “using an API”; AWS is the brain: it creates the icebreakers, orders the UI, and enables human-readable explanations that change behavior. In short, no AWS, no Bond—that’s exemplary applicability.

How we built it — Full technical write-up

1) System at a glance (end-to-end flow)

  • Proximity signal. Each phone advertises a tiny BLE packet (BND as service data under the Heart Rate UUID 0000180D-0000-1000-8000-00805F9B34FB) and scans with the same filter, which tells us who is physically nearby without using GPS.
  • Pair bootstrap. When we detect another user, we create or fetch a canonical pairs/{pairId} document in Firestore using the ordering ID1<ID2, and that single record holds bond state, similarity, and time-together stats.
  • AI profiles on AWS. A short voice note flows through Amazon Transcribe for speech-to-text, Amazon Nova Micro (via AWS Bedrock) to distill the text into a compact profile, and Amazon Nova Titan (via AWS Bedrock) to embed that profile as a vector.
  • Similarity with reasons. We compute cosine similarity between embeddings and ask Nova Micro for “similar features,” and we write both the score and explanations to the pair document as sim_score and similar_features.
  • User action. Either side can tap Request, and when both accept, the pair flips to the bonded state.
  • TimeTracker. While bonded and in BLE range, a throttled worker increments totalTimeMinutes and updates lastSeen, and the Time With dashboard shows who you actually spend time with so you can lean into the relationships that matter—no check-ins required.

2) BLE proximity stack (Android)

  • Advertising. We broadcast a compact service-data payload with a deterministic BND prefix plus a username key so candidates are discoverable with a narrow filter.
  • Scanning. We filter on the Heart Rate UUID and the BND prefix to avoid noise, and we use RSSI only as a soft tiebreaker rather than as a distance estimate.
  • UI ordering. We primarily sort candidates by the AI similarity score because people are more motivated to bond with clear, high-affinity matches, and when scores tie we use RSSI as a gentle proximity hint.
  • Why BLE. BLE gives low-power, low-latency indoor presence without location permissions or manual check-ins, which keeps the experience ambient.
  • Android hygiene. We handle runtime permissions for BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT, microphone, and internet, and we scope advertising and scanning to visible screens while backing off intervals in the background.
  • Future privacy. We plan to rotate short-lived, server-verifiable tokens instead of BND so discovery stays smooth while scraping becomes impractical.

3) Data model and state machine (Firestore)

  • Collections. The users/{uid} documents store { email, username, incoming[], bonded[] }, and the pairs/{pairId} documents store { ID1, ID2, Bonded1, Bonded2, sim_score, similar_features[], totalTimeMinutes, lastSeen }.
  • Canonical IDs. We define pairId = min(uidA, uidB) + "_" + max(uidA, uidB) so the relationship is unique regardless of who detects whom first.
  • Bond states. The (F,F) state means no bond, the (T,F) or (F,T) state means a request is pending, and the (T,T) state means the users are bonded.
  • Operations. A Request sets your own Bonded_* = true and adds you to the other user’s incoming, an Accept sets the other flag to true and moves both users to each other’s bonded[] while clearing incoming, and an Unbond clears the other flag first, then your own, and removes each user from the other’s bonded[].

4) TimeTracker and the “Time With” dashboard

  • Triggering. The tracker runs only when both users are bonded and the other user’s BLE signal is detected, so minutes reflect real co-presence.
  • Throttling. We persist a last-increment timestamp and write at most once per minute per pair to control load and avoid duplicates.
  • Consistency. We wrap increments in Firestore transactions so concurrent devices cannot double-count.
  • Fields. We maintain totalTimeMinutes as a monotonic counter and lastSeen as an ISO timestamp so freshness is visible.
  • Insights. The client aggregates weekly stats into a Time With dashboard that shows your top people, your streaks, and soft prompts like “You spent 92 minutes with Ana this week—want to set up a coffee?”, which nudges you to strengthen bonds you already value.
  • Why it matters. Because detection is passive via BLE, these stats integrate seamlessly without check-ins and help turn first matches into sustained relationships.

5) AI matching on AWS (Generative + Embeddings)

  • Voice to text. Amazon Transcribe converts the user’s short voice description to clean text with low latency.
  • Distillation. Amazon Nova Micro on AWS Bedrock turns that transcript into a compact, human-readable profile that captures hobbies, personality cues, and values.
  • Embeddings. Amazon Nova Titan on AWS Bedrock encodes the distilled profile into a vector so semantic similarity becomes measurable.
  • Scoring and reasons. We compute cosine similarity for a sim_score and ask Nova Micro for succinct “similar features” (for example, “Both ski,” “Both CS majors,” or “Both prefer spontaneous hangouts.”) so matches feel transparent.
  • Placement. A Firebase Cloud Function watches for new or updated pair documents that lack a score, calls AWS Bedrock to run Nova Micro and Nova Titan, and writes results back so mobile stays thin and responsiveness stays predictable.
  • Why AWS. AWS gives us one managed entry for generation and embeddings with clean auth, quotas, and reliability, which is ideal for shipping a production-feeling brain on a hackathon timeline.

6) App architecture (Compose + Firebase glue)

  • Screens. The Looking screen enables BLE and shows nearby candidates ordered by similarity score with RSSI as a subtle tiebreak; the Requests screen shows incoming[] and lets you accept or ignore; the Bonded screen lists your bonds with totalTimeMinutes and lastSeen plus an Unbond action; and the Profile screen records a voice note, shows the distilled profile, and offers privacy controls.
  • Lifecycle wiring. MainActivity gates permissions, starts and stops BLEManager and TimeTracker with lifecycle events, and scopes advertising and scanning to visible screens.
  • Backend glue. Firebase Auth provides identity, Firestore provides realtime state, Cloud Functions orchestrate AWS calls, and Analytics instruments funnels so we can tune onboarding.
  • UI polish. We use Jetpack Compose for fast lists, swipe actions on requests, and a Time With dashboard with weekly bars and streak counters so progress is obvious at a glance.

7) UI & motion system (Jetpack Compose)

  • Global touch ripples make the whole app feel alive. We wrap the app in GlobalTouchRippleOverlay, which listens to pointer-down events without consuming them and paints animated radial waves that expand toward the farthest screen corner; each ripple uses an Animatable with FastOutSlowInEasing, a soft gradient fill, and a shockwave ring, and we cap concurrent ripples to keep performance smooth.
  • The background breathes instead of blinking. Our animated background layer runs beneath content with low-frequency color shifts and subtle motion, which keeps the app visually rich while avoiding distraction and battery drain.

Coolest Moments of the Project

There was a very specific, very cool loop where cloud code created instant icebreakers on the phone. A user recorded a 7-second profile; our Cloud Function sent it to Amazon Transcribe, Nova Micro distilled it into a compact snapshot, Nova Titan embedded it, and we compared vectors—then wrote sim_score and similar_features back to Firestore. Within seconds, Compose re-composed: the list re-ordered and chips appeared under the card—“Skiing,” “Ramen,” “CSE 351,” “Live jazz.” Standing there, you didn’t have to invent an opener; the phone literally handed you one: “you ski too—want to hit Sunday?” Then there was the hallway moment. Two teammates stood at opposite ends of a long corridor. The phones were broadcasting those tiny BLE packets and filtering for our BND service data. We watched the Looking screen light up as they came into range—no GPS, no Wi-Fi triangulation, just radio whispers through doors and backpacks. RSSI ticked up, the match popped to the top (sorted by the AWS similarity score), and it felt like the building itself was part of the app. And the Bond button turned into a shared, real-time ritual. Tapping Request flipped a single field in pairs/{pairId} (Bonded_self=true), Firestore’s snapshot listener fired on the other device, and their UI slid that card into “pending” with a tiny motion cue. When they tapped Accept, both flags became true (Bonded1=true, Bonded2=true), the card moved to Bonded on both phones, and TimeTracker started counting because BLE presence said you were together—no pings, no reloads, no “refresh to see changes.” The coolest part wasn’t the animation; it was the architecture: two phones acting like live views into the same document, staying in lockstep because the database was the protocol.

With gratitude

Huge thanks to AWS—especially the teams behind Amazon Transcribe, Amazon Nova Micro, Amazon Nova Titan, and AWS Bedrock—for the tools that let a weekend project feel like a real product. Your stack powered the brain of Bond, and your services helped us not only create bonds, but strengthen them over time.

Built With

  • accessibility
  • adb
  • amazon-nova-micro
  • amazon-nova-titan
  • amazon-transcribe
  • amazon-web-services
  • android
  • android-bluetoothadapter
  • android-gradle-plugin
  • android-lint
  • android-studio
  • androidx-activity
  • androidx-lifecycle
  • animatable
  • architecture-patterns
  • audiorecord
  • aws-bedrock
  • aws-iam
  • aws-sdk-for-javascript-v3
  • ble
  • ble-proximity-matching
  • blendmode
  • bluetooth
  • bluetooth-advertise
  • bluetooth-connect
  • bluetooth-scan
  • bluetoothleadvertiser
  • bluetoothlescanner
  • brush-radialgradient
  • canvas-drawcircle
  • cloud-firestore
  • cloud-functions)
  • compose-animation
  • compose-canvas
  • compose-runtime
  • content-descriptions
  • continuous-deployment-ready
  • contrast-checked-chips
  • cosine-similarity
  • dark-mode
  • data-minimization
  • debounce-throttle
  • dynamic-color
  • empty-states
  • environment-variables
  • error-states
  • explainable-ai-matching
  • fastoutslowineasing
  • firebase
  • firebase-analytics
  • firebase-auth
  • firebase-bom
  • firebase-client-sdk
  • firebase-cloud-functions
  • firebase-functions-config
  • firestore-collections
  • firestore-documents
  • firestore-indexes
  • firestore-realtime-snapshot-listeners
  • firestore-security-rules
  • firestore-transactions
  • focus-order
  • foreground-service
  • gatt-service-data
  • git
  • github
  • globaltouchrippleoverlay
  • google-services-gradle-plugin
  • gradle
  • gradle-kotlin-dsl
  • guards
  • https-callable-functions
  • iam-policies
  • iam-roles
  • jetpack-compose
  • json
  • kotlin
  • kotlin-flow
  • kotlin-serialization-json
  • kotlinx-coroutines
  • localhapticfeedback
  • logcat
  • material-3
  • material-icons-extended
  • material-you
  • mediarecorder
  • mvvm
  • node.js
  • pointer-input
  • pointereventpass
  • privacy-by-design
  • proguard
  • r8
  • recomposition
  • record-audio
  • rssi
  • runtime-permissions
  • scanfilter
  • scansettings
  • secrets-management
  • similar-features-explanations
  • similarity-scoring
  • streak-counters
  • stroke
  • talkback
  • time-with-dashboard
  • timetracker
  • tween
  • typescript
  • vector-embeddings
  • viewmodel-compose
  • weekly-bar-charts
+ 3 more
Share this project:

Updates