📡 The Short Answer

Your phone continuously broadcasts a small BLE advertisement packet containing your pet's ID, type, and level. Other phones running BuddyDoggie that are within Bluetooth range (~30 meters) pick up this broadcast, and vice versa. When both devices discover each other, the app logs a StreetPass encounter — exactly like the Nintendo 3DS did with its hardware-based StreetPass, but using standard BLE that works on any modern smartphone.

📱 🐕 Mochi Your phone
〰️
BLE Advertisement
📱 🐈 Luna Other player

🔬 Step by Step

1

Your Phone Broadcasts

When BuddyDoggie runs in the background, it starts a BLE peripheral that advertises a small payload (~20 bytes) every 100-300ms. This payload contains an anonymous pet ID hash, species code, and level — no personal data.

2

Other Phones Scan

Every other BuddyDoggie user nearby is also advertising and scanning. When their phone sees your advertisement, it recognizes the BuddyDoggie service UUID (0xFEED) and flags it as a discovery.

3

Handshake & Card Exchange

Both devices initiate a brief BLE GATT connection to exchange richer pet card data — name, avatar, outfit, and a greeting message. This takes ~1-2 seconds and doesn't require internet.

4

Notification & Collection

When you next open BuddyDoggie, you see: "Mochi met Luna on Maple Street!" with the pet's card added to your collection. You can send them a gift, visit their profile, or set them up to play together.

🎮 Like the 3DS, But Smarter

The original Nintendo 3DS used dedicated 2.4 GHz wireless hardware for StreetPass — it worked even in sleep mode. BuddyDoggie achieves the same magic using BLE, which is designed exactly for this kind of low-power, always-on discovery.

3DS StreetPass BuddyDoggie (BLE)
Wireless Tech Proprietary 2.4 GHz Bluetooth Low Energy 5.0+
Range 10-20 meters ~30 meters (BLE 5.0)
Background Mode Sleep mode works App runs in background
Data Exchanged Mii, game data Pet card, greeting, gifts
Max Encounters/Day 12 (3DS limit) Unlimited
Internet Required No No (BLE only)

💻 Under the Hood

Here's a simplified view of how BuddyDoggie sets up BLE advertising:

// 1. Create BLE advertisement payload (~20 bytes) const payload = encodePetData({ petId: hash(user.uuid + "buddydoggie"), species: "golden_retriever", level: 12, mood: "happy", }); // 2. Start advertising with BuddyDoggie service UUID const advertiser = BleManager.createAdvertiser({ serviceUuid: "0xFEED", // BuddyDoggie assigned UUID payload: payload, interval: 200, // ms between advertisements txPower: -4, // dBm, balances range vs battery }); advertiser.start(); // 3. Scan for other BuddyDoggie devices const scanner = BleManager.createScanner({ serviceUuids: ["0xFEED"], allowDuplicates: false, }); scanner.onDiscovered((device) => { const pet = decodePetData(device.adPayload); logStreetPass(pet, device.rssi); // estimate proximity connectGATT(device); // exchange full cards }); scanner.start();

The entire BLE stack uses less than 1% battery per hour of background advertising, making it practical for all-day StreetPass discovery without draining your phone.

🔒 Privacy & Safety

StreetPass is designed from the ground up to keep you anonymous:

  • Pet IDs are one-way hashed — they can't be reversed to find your identity
  • No GPS location is transmitted — proximity is estimated from BLE signal strength only
  • Advertisements contain no name, email, phone number, or account data
  • You can pause StreetPass at any time from settings
  • Encounter logs are stored locally and only sync to the cloud when you open the app
  • Full card exchange requires mutual discovery — both devices must see each other