Luke Angel
← back to the bookcase
A DIY pet collar tracker on a workbench: a teal PCB puck clipped to a collar strap emits radio signal beside a coin-cell battery, a microcontroller chip, a soldering iron on a pad, and a location pin, with a dog wearing the collar. Notebook · 05 parts
Notebook · 5 parts · read in order
~45 min total

IoT Pet Health Tracker — Build

Twelve years of paying other people's subscriptions to learn my pets are home. This is the build log for the tracker I actually want — cheap, no-subscription, months of battery, location first and health later — designed the way I'd run any connected-product program, then soldered together nights and weekends.

The Pet IoT Field Guide is the observer's seat — twelve years of what shipped and what broke, kept in the order it happened. This notebook is the opposite chair: the builder's log.

I've spent a career building connected-hardware platforms and a decade buying connected-pet gear for Atom, Joule, Boson, and Quark. The two finally collided over a renewal notice. What follows is the whole train of thought — from "I'm tired of this" to a product spec, to the gear order, to the nights-and-weekends build that comes after. Location first, on BLE and LoRa. Cellular second. Health vitals third.

It's a real build with a full-time job attached, so it moves at the speed of evenings. Follow along — including the parts that don't work.

Start here
01 · The Renewal Notice That Made Me Build My Own Pet Tracker
open part 01 →
A growing stack of recurring subscription bills on one side, a single hand-built location tracker puck on a workbench on the other — years of renewal fees versus a one-time build. Part 01 of 05
IoT Pet Health Tracker — Build · part 01
Apr 27, 2026

The Renewal Notice That Made Me Build My Own Pet Tracker

Three pets, three subscriptions, and the bulk of what I get for the money is a green dot that says 'home.' After a decade of paying other people to tell me my pets are where I left them, I'm building the tracker I actually want.

The renewal notice landed for the third time this year — different pet, same number. Add it up across Quark's collar and the two on the cats and I'm spending north of three hundred dollars a year, most of it to confirm that animals who rarely leave my house are, in fact, in my house.

I've been in connected products my whole career, and buying connected-pet gear since Atom got his first Whistle in 2013. Twelve years. It took a renewal email to make me actually do the math on what I'm paying for.

What I'm actually paying for

Strip it down and the answer is uncomfortable: presence. Ninety-five percent of what these trackers tell me is "your pet is home," which I could get from a two-dollar radio that never leaves the house. The cellular link — the expensive part, the part the subscription exists to fund — earns its keep maybe a handful of times a year, when a pet is actually somewhere it shouldn't be.

And the cellular link is also why I'm on the charging treadmill. Always-on LTE is the reason these collars die every few days. So I'm paying a monthly fee and a recurring chore, both in service of a capability my indoor cats use approximately never.

The math only gets worse the longer you run it. A subscription is a line that never stops climbing — three pets at ~$100/year each, compounding for as long as you own the gear. A one-time build is a single step up for parts and then flat. The two lines cross sooner than the renewal email wants you to notice.

Cumulative cost over time: a red staircase for subscriptions, climbing roughly $300 a year across three pets and never leveling off, versus a teal line for a one-time DIY build that jumps once for parts and then stays flat near zero per year. The lines cross early, where the parts pay for themselves.

Tractive just proved my point

Right on cue, Tractive shipped the CAT 6 Mini this month — their newest cat tracker, and the first to carry real Health Intelligence: resting heart rate and respiratory rate on a 1.13-ounce collar. It's genuinely impressive, and it tells me the whole category is finally moving toward health, which is where the real value has always been.

But look at what it actually is: another cellular collar, another subscription, per cat. Joule and Boson have worn Tractive trackers for years and they don't leave the house. Putting a cellular plan on a cat that's asleep on the couch is the most on-the-nose version of the problem I've been paying into for a decade.

The same gaps, twelve years running

I started all this with Atom — the first Whistle on his collar two months after he came home in 2013. He's gone now, and across his whole life the trackers got better at counting steps and never once got better at the things that actually bothered me: the cost scaled linearly with every pet I added, the batteries needed charging constantly, and the indoor case always paid full freight for range it never used.

Quark wears the dog version now; the cats wear theirs. Better silicon, glossier app, same three gaps.

So I'm going to build it

Here's the thing — I do this for a living. I just open-sourced a reference IoT stack: AWS IoT Core, device certs, ingest, a dashboard, the works. The cloud half of a pet tracker is already sitting in a repo with my name on it. I have the backend, I have the wireless decision rubric I make every team run, and I have twelve years of receipts on exactly where these products fall short.

So I'm building the one I actually want. The bet is simple and it's the inverse of what everyone ships:

  • Cheap, with little or no subscription — because most of the value doesn't need a cellular plan.
  • Months of battery, not days — because nobody wants to charge the thing.
  • Location first, health later — get the dot reliable before it takes a heart rate.
  • Matched to how pets actually live — home most of the time, occasionally on a trail, rarely truly lost.

The inverted bet, four requirements side by side. What everyone ships, in red: a monthly cellular plan per pet; a battery that dies every few days; health-first features on a coin-cell radio; hardware that pays for range it never uses. What I actually want, in teal: cheap with little or no subscription; months of battery, not days; location first and health later; matched to how pets actually live — home most of the time, occasionally on a trail, rarely truly lost.

Next post is the part where I resist the urge to start soldering and do the PM work first: the use cases, the rubric, and an honest read on whether this is a product or just a grudge. Then we buy parts.

A collar puck with a paw mark radiates three concentric radio rings of increasing range, linked by a direct dashed line straight to its own cloud — no vendor box in between — beside a dollar coin struck through, standing for no recurring subscription. Part 02 of 05
IoT Pet Health Tracker — Build · part 02
May 13, 2026

Speccing a Pet Tracker That Doesn't Need a Subscription

Before I buy a single board, the PM work: three use cases, the wireless rubric, and the product line that falls out of it. The punchline is that the two loudest complaints about pet trackers — price and charging — have the same root cause, and you fix both by refusing to put cellular where it isn't needed.

Last time I talked myself into building a pet tracker. This time I do the part that keeps a grudge from becoming a garage full of dead prototypes: the product work, before the soldering iron.

Three use cases, in priority order

  1. Is my pet home / in the yard? The 95% case. Wants near-zero power, near-zero data, an instant "they left" alert, and activity tracking.
  2. My pet is off-grid with me — a trail, the woods. No cell coverage. I want to see where they are relative to me.
  3. My pet got out and is miles away. Rare, high-emotion — and the fear that actually sells trackers.

Most products are built entirely around #3 and bill you monthly for it. But #1 is where pets spend their lives.

The rubric, applied

I make every connected-product team I run answer five questions before picking a radio. Run them on a pet:

  1. Range? Home is meters. A trail is kilometers. "Lost in the next county" is anywhere.
  2. How often does it phone home, and how big is the message? A GPS fix is ~12 bytes, and at home you only need a heartbeat. Tiny.
  3. BOM budget? Consumer. Every dollar of radio locks the rest of the bill.
  4. Power budget? Small battery, and — per the last postno charging cult.
  5. Security model? Consumer. A device cert to the cloud, TLS, no drama.

Answer those honestly and you do not arrive at "always-on cellular for everything." You arrive at a spectrum.

The connectivity spectrum

RadioRangePowerCostGood for
BLEmeterssips (an AirTag runs ~a year on a coin cell)~free"Is it home?" presence
LoRa (915 MHz)kilometers, line-of-sightlowcheap, no carriertrail + local recovery, if you bring the gateway
Cellular (LTE-M)anywhere with a towerhungryhardware + monthly datathe genuinely-lost case

The whole insight is one line: match the radio to the usage. A pet that's home 95% of the time should be running its cheapest, lowest-power radio 95% of the time — and only reach for the expensive one during the rare event that needs it.

Three radios laid out along a range axis from meters to anywhere: BLE for the 95% home case (sips power, ~a year on a coin cell, no carrier), LoRa at 915 MHz for trail and local recovery (low power, cheap, bring your own gateway), and cellular LTE-M for the rare genuinely-lost case (hungry, days-to-two-weeks battery, hardware plus a monthly data plan).

The product line

That spectrum is the product line. Three SKUs, so the customer picks their own range / cost / battery trade instead of me guessing:

SKURadiosBatteryForMoney
LoRa collarBLE + LoRa + GPSmonthshome/indoor pets; trail dogs (with the base station)hardware + optional ~$20/yr cloud history
Cellular collarBLE + LTE-M + GPSdays–~2 wksroamers / escape artists / "find from the couch"premium hardware + data sub (still under the incumbents)
Base station / handheldBLE + LoRaweeks (docked = always charged)every LoRa-collar ownerbundled with the LoRa collar

The tiered-power trick

The LoRa collar does one clever thing: it lives in BLE presence mode at home (months of battery, ~no data), and only flips to findable mode — GPS fixes + LoRa beacons — when it crosses the geofence. The expensive radio work only happens during the rare event, so the months-long battery survives. That single decision is what delivers both of the things people complain about: low cost and no charging.

The collar's two power states. BLE presence mode at home — GPS off, LoRa quiet, BLE heartbeat only, accelerometer logging activity — gives months of battery. Crossing the geofence flips it to findable mode: GPS fixes on, LoRa beacons out to the base station, an RSSI proximity beep on approach; battery drains fast but only briefly. Coming back inside flips it down to presence mode again.

The base station is the network

Normally it's a docked listener at home. But it's built as a handheld in a charging cradle — Garmin-Alpha style — so you grab it off the dock and it becomes a mobile LoRa gateway. Pet got out? You drive a grid around the neighborhood and re-acquire its beacon; the collar's GPS gets you to the block, and an RSSI proximity beep (faster and louder as you close in) gets you to the actual bush. On a trail, you just carry it and watch the pet relative to you, phone over BLE for the map.

And the strategic part: crowdsource the base stations. Every docked unit passively listens for any lost collar nearby and reports it. At neighborhood density that's a pet-specialized recovery mesh — the Apple Find My / Amazon Sidewalk model, seeded by always-on home base stations instead of phones. Tractive can't copy it; pure cellular has no network effect. The honest catch is cold-start: the mesh is only magic once it's dense, so early on recovery leans on you and your own handheld. Same chicken-and-egg every crowdsourced network faced.

Little features that punch above their BOM

A piezo buzzer costs pennies, so both the collar and the base get one:

  • Collar: beep to find it (it fell off, or the pet's hiding), a recall/training cue, and a humane no-shock "you're leaving the yard" boundary warning.
  • Base: an audible "he got out" alert the moment the pet crosses the geofence or drops off the radio — so you're not glued to the app — plus that proximity beep while you search.

The build phases

  1. Location — BLE + LoRa. The novel, can't-buy-it part: presence, the geofence flip, the mesh, the base station. The hardest phase, on purpose.
  2. Cellular. The "anywhere" premium SKU. A paved road (Nordic's nRF9160 + reference firmware), so it's a low-risk bolt-on.
  3. Health. And here's why it's last: pet vitals are mostly an IMU + algorithms problem, not a new sensor. A sensitive accelerometer picks up the body's micro-vibrations at rest — that's how the incumbents derive resting heart rate and respiratory rate, fur and all. So the accelerometer I put on the collar in phase 1 becomes the vitals sensor in phase 3, once tracking is rock-solid.

The connectivity spectrum drawn as three SKUs and the build order. The LoRa collar (BLE plus LoRa plus GPS, months of battery, hardware plus optional cloud history) for home and trail; the cellular collar (BLE plus LTE-M plus GPS, days-to-two-weeks battery, premium hardware plus a data sub) for roamers; and the base/handheld (BLE plus LoRa, always charged on its dock) that is the gateway and the recovery mesh, bundled with the LoRa collar. Below, the phased build runs location first (BLE plus LoRa, geofence, mesh — the hardest), then cellular as an nRF9160 bolt-on, then health, where the phase-1 accelerometer becomes the vitals sensor.

A phase-4 idea worth writing down now: the base station is stationary, right where the pet sleeps. It could later carry a mm-wave radar for fully contactless resting vitals — heart and respiratory rate with no collar contact at all. That's the magic version of "the base station is more than a charger."

The honest part

  • AirTag already owns cheap + no-subscription + find-my-network at $29. So my moat is not raw location — it's the pet features Apple won't build (activity, sleep, vitals trends, multi-pet, family alerts, vet-shareable data) plus the pet-specialized mesh. The position is Whistle's features, AirTag's price model.
  • A LoRa collar can't find a pet past the edge of the mesh and your car's reach. That's exactly what the cellular SKU is for. The line lets the buyer choose.
  • At volume the hardware BOM is ~$30. The reason incumbents charge $120/yr is the cellular data plan — remove cellular and you remove the cost basis for the subscription, which is how ~$20/yr for cloud history is honest and still 6× cheaper.

Spec's done. Next post: I stop typing and hit buy.

A pet collar tracker at the center, emitting concentric LoRa signal arcs to a base station and taking a GPS fix from a satellite overhead, with a small battery gauge on the tag — the gear at the heart of the build. Part 03 of 05
IoT Pet Health Tracker — Build · part 03
May 18, 2026

The Gear, the Bill, and a Six-Month Nights-and-Weekends Plan

The spec is set, so today I hit buy — but the order got smarter than the plan. I was going to build the handheld base station from modules; turns out it already exists off the shelf, pre-flashed and FCC-certified, as a two-pack. So step one is a proof-of-concept I can strap to Quark the day it lands, then the collar build behind it.

The spec is done, which means today is the dangerous day: I hit buy. But the cart looks different from the plan — because while I was sketching the handheld base station, I found out somebody already builds it.

The head start

The cloud is done. The reference IoT stack I open-sourced — IoT Core, device-cert provisioning, ingest, DynamoDB, a dashboard — already accepts a real device with near-zero change. The collar just publishes pet telemetry (lat, lon, battery, activity) instead of tool telemetry. That's months of backend I don't have to write.

The shortcut I didn't expect: the Wio Tracker L1

I'd specced the base station as a handheld-in-a-cradle — screen, GPS, LoRa, battery, a button or two. Turns out that's a shipping product: the Wio Tracker L1, sold as a ready-to-use Meshtastic handheld, pre-flashed, FCC-certified, in a two-pack.

The Meshnology Wio Tracker L1 two-pack — two ready-to-use Meshtastic handheld units with nRF52840 + SX1262 LoRa, GPS, and a 1.3-inch OLED, used as the pet-tracker proof-of-concept base station and test node.

The spec reads like I wrote it for myself:

Wio Tracker L1 specification — nRF52840 with 1 MB flash and 256 kB RAM, Wio-SX1262 LoRa 862–930 MHz, Bluetooth 5.0, L76K multi-constellation GNSS, 1.3-inch 128×64 OLED, Grove and plated-through-hole interfaces plus reserved SWD pads, USB-C / solar / lithium power, FCC/CE/RoHS certified.

  • nRF52840 + Wio-SX1262 (862–930 MHz) — the same chip family as the collar I'm going to build, so one firmware codebase covers both, and the reserved SWD pads mean the nRF9160 DK I already ordered can debug it.
  • L76K multi-GNSS, 1.3" OLED, onboard buzzer, 3000 mAh + solar + USB-C. Everything the base station needs, including the beeper for the "he got out" alert and the proximity search.
  • Grove + plated-through-hole I/O — I can hang an I²C sensor off it without soldering if I want to prototype the collar's heat-risk sensing on the bench.
  • Pre-flashed with Meshtastic — which is the whole point of starting here.

Wio Tracker L1 internals — the Seeed Wio-SX1262 board with an onboard buzzer and L76K GPS antenna, and a 3000 mAh lithium battery, fitted into the handheld case.

Wio Tracker L1 case detail — handheld enclosure with a 1.3-inch OLED, antenna port, USB-C, and power, reset, menu, and 4-way control buttons.

Because it's pre-flashed and comes as a pair, it isn't just the base station — it's my entire proof-of-concept. One on Quark, one in my hand, and I can watch him move on a phone map over Bluetooth the day it arrives. No firmware, no soldering, no waiting. That's the right first dollar.

The order, reordered around the PoC

1 — Proof-of-concept + base station (ordered today, arrives tomorrow):

  • Meshnology Wio Tracker L1, 2-pack (Amazon) — base unit + test node, pre-flashed Meshtastic.

2 — The collar build kit (RAK — this was the original plan; I'll revisit it once the PoC proves the range is real):

QtyPartPrice
2WisBlock Meshtastic Starter Kit, US915 (SKU 116016 — base + RAK4631 core)~$64 (buy-2 −8%)
2RAK12500 GNSS — u-blox ZOE-M8Q$51.24 (buy-2 −5%)
1RAK1904 3-axis accelerometer — ST LIS3DH$7.97
2RAK1901 temp/humidity — Sensirion SHTC3$14.36 (buy-2 −20%)

Plus a passive piezo buzzer (Amazon) and LiPos (Adafruit). The RAK4631 inside that starter kit is the same nRF52840 + SX1262 as the Wio L1 — so whatever firmware I prove on the PoC carries straight to a custom collar.

3 — Cellular (already ordered, for phase 2):

  • Nordic Thingy:91 + nRF9160 DK (~$295, DigiKey). The DK doubles as my debugger for everything above.

Three buys reordered around a proof-of-concept: Buy 1 is the pre-flashed Wio Tracker L1 two-pack that needs no firmware or soldering; Buy 2 is the RAK4631 collar kit, deferred until range proves out, sharing the same nRF52840 plus SX1262 chip family so one firmware codebase carries across both; Buy 3 is the cellular nRF9160 Thingy:91 and DK on a separate LTE path for phase two, with the DK doubling as the debugger for all of it.

The thread that ties the first two buys together is the silicon: the Wio L1 and the RAK4631 collar are both nRF52840 + SX1262, so the firmware I prove on the proof-of-concept is the firmware the custom collar runs. Cellular is the one part on a different chip — and it's deliberately last.

The phases, and what each one has to prove

  1. Location — BLE + LoRa. Presence at home, the geofence flip to findable mode, collar → base over LoRa, data into the existing cloud, beep + proximity search. The hard part, first.
  2. Cellular. Swap in the nRF9160 path for the "anywhere" collar. Lower risk — a well-documented road.
  3. Health. Resting heart rate and respiratory rate off the accelerometer the collar already carries. Only after the dot is boringly reliable.

The phased build plan: phase one is location over BLE and LoRa — the hard part, taken first; phase two is the cellular nRF9160 path, lower risk and well-documented; phase three is health, heart rate and respiratory rate from the collar's accelerometer, attempted only once the location dot is boringly reliable. Below, a six-month phase-one timeline of nights and weekends: month one a proof-of-concept and range tests, month two the collar publishing GPS and battery to the cloud, month three BLE presence and the geofence-exit flip, month four base-station behaviors and an RSSI proximity beep, month five enclosure and charging that survives a wet Lab, month six a field test on Quark and a write-up of what broke.

The honest timeline

Six months, evenings and weekends, shipping delays included. Phase 1 only — cellular and health are next year's problem.

MonthGoal
1Wio L1 two-pack PoC — one on Quark, range tests around the neighborhood and on a trail, GPS → phone map
2RAK4631 collar publishing GPS + battery into the existing IoT Core stack
3BLE home-presence + geofence-exit flip to findable mode; the power budget that makes "months" real
4Base station behaviors: home listener, grab-and-go gateway, RSSI proximity beep
5Enclosure + collar mount + charging; survive a wet Lab
6Field test on Quark; write up what broke

Step one isn't a product. It's a proof-of-concept that earns the rest of the spend — before I commit to building a collar, I want to know the range and the GPS-to-phone loop actually hold up in my yard and on my trails.

Next: a scorecard, not a vibe

Which is exactly why the next post won't be "look, a dot moved." It'll be a test plan with a scorecard — range, time-to-first-fix, battery drain, in-house presence reliability — so the decision to build the real collar is made on numbers, not excitement. The boxes land tomorrow. The notebook turns into a real build log from here — the parts that work, and the parts that don't.

A decision scorecard on a clipboard: five weighted criterion rows, four passing with green checks and one failing with a red X, feeding a fork that splits into an open gate (go, build the collar) and a closed gate (hold, reconsider). Part 04 of 05
IoT Pet Health Tracker — Build · part 04
May 26, 2026

A Scorecard, Not a Vibe: How I'll Decide Whether to Build the Collar

The proof-of-concept hardware is here, so the temptation is to post a screenshot of a dot moving and call it a win. Instead, here's the scorecard — range, fix time, battery, presence reliability — with pass/fail targets, so the decision to build the custom collar gets made on numbers, not adrenaline.

The Wio Tracker L1 two-pack landed, which means I could post a screenshot of Quark as a dot on a map and call the proof-of-concept a success. That would be a lie of omission. A dot moving proves the radio turns on. It doesn't tell me whether this architecture survives my neighborhood, my trails, and a battery I don't want to charge every other day.

So before I spend another dollar on the custom RAK collar, the PoC has to earn it — against a scorecard with numbers I set before I started, so I can't move the goalposts when I get excited.

What landed

It doesn't show up as a finished gadget. Each unit is a flat-pack: a board, a 3D-printed enclosure in two halves, a 3000 mAh lithium pouch, a GPS patch antenna on a u.FL lead, a stubby LoRa whip, and a baggie of screws. No soldering and no firmware — but some assembly, which is honest about what this stage actually is.

Wio Tracker L1 unboxed on a work mat: a 3.7-volt 3000 mAh lithium pouch cell, the Wio-SX1262 board with a stubby LoRa antenna and a GPS patch antenna on a u.FL lead, a 3D-printed handheld enclosure, and a bag of assembly screws.

Wired up before I closed the case, it's exactly the bill of materials from last post: the nRF52840 and the Wio-SX1262 LoRa radio on one board, the L76K GPS antenna on its pigtail, the LoRa antenna on an SMA bulkhead, the battery on a JST plug.

The Wio Tracker L1 wired up before closing the case: the nRF52840 plus Wio-SX1262 board with the L76K GPS patch antenna on a u.FL pigtail, an SMA LoRa antenna connector, and the 3000 mAh battery on a JST lead, resting in one half of the printed enclosure.

Put a ruler against the enclosure and the verdict writes itself: about 10 cm tall. That's a fine handheld — clip it to a belt, drop it in a truck cradle — and obviously not something a cat wears. Which is the split this whole series keeps circling back to: the base station you can buy off the shelf; the collar you still have to build small. This unit is the base. The collar is the custom job behind it.

The Wio Tracker L1 enclosure against a centimeter ruler — roughly 10 cm tall, clearly handheld-sized rather than collar-sized.

The other half of the enclosure with a ruler for scale, about 6 cm across — a reminder that this unit is the handheld base station, not the wearable collar.

The setup

Two nodes: one rides Quark (call it the collar), one stays with me (the handheld), phone paired over Bluetooth with the Meshtastic map open. That's the whole architecture in miniature — collar beacons its position over LoRa, handheld receives it, phone draws the map.

Two-node proof-of-concept setup: a collar node riding Quark beacons its GPS position over LoRa to a handheld node that stays with me; the handheld is paired to a phone over BLE, and the phone draws the position on a Meshtastic map.

Getting it on the air — and what bit me

Two units, a foot apart, both powered on, both completely deaf to each other. Meshtastic ships with the LoRa region unset, and an unset radio won't transmit — legally it can't, because it doesn't yet know which band and duty cycle it's allowed to use. Set Region = US on each and they found each other instantly. First lesson, and a good one for any radio project: "powered on" is not "transmitting."

Then the collar looked dead anyway. It was in the node list, but its "last heard" read thirty minutes — no fresh beacons. Two defaults conspire there: the position broadcast interval ships at roughly 15 minutes, and smart positioning only beacons when the node has moved far enough. A collar sitting still on a bench is, by design, silent — wonderful for battery life, useless for a range walk, where I need a steady heartbeat to catch the exact second the link drops. So I forced it: fixed 1-minute interval, smart positioning off. Now it chirps every 60 seconds whether it's moved or not.

I rehearsed the signal before trusting it. Powered the collar off — "last heard" climbed and stuck: one minute, two, four. Powered it back on — it snapped to "now" within ten seconds. That climb-and-stick versus snap-back is the whole language of the range test: heartbeat alive, or heartbeat gone stale.

The surprise: my block was already a mesh

Here's the part I didn't see coming. The first time the app finished scanning, my node list had 41 nodes in it. I'd added two. The other 39 were my neighbors.

Meshtastic's default channel is a public commons — every node within radio earshot shows up. Thirty-nine of them around my block, most reachable only over two hops, which means my little handheld's signal was already being relayed across the neighborhood by strangers' nodes I'll never meet.

That cuts two ways. First, it's a problem for an honest range test: if a neighbor's node rebroadcasts my collar's beacon, my handheld keeps "hearing" the collar long after the direct link is dead — and I'd be measuring the neighborhood's mesh instead of my own radio. The fix was to move my two nodes off the public commons onto their own named channel. Because Meshtastic derives the radio's frequency slot from a hash of the channel name, renaming it also lifts the pair onto their own frequency, clear of the public traffic — then I switched the node view to a direct-only (zero-hop) filter, so the only thing I count is what my handheld hears firsthand.

But step back from the annoyance and that accidental discovery is the moat I sketched in the PRD. The reason a crowd-sourced tracker beats a pure-cellular one is the network effect: every unit sold becomes a relay that improves recovery for everyone — the same model behind Apple's Find My and Amazon Sidewalk. I'd assumed I'd have to bootstrap that network from zero, one sale at a time. Instead, 39 nodes of it already exist within a few hundred meters of my front door, before I've shipped a thing. The mesh isn't a someday feature on a roadmap. On my street, it's already on the air.

The scorecard

1. LoRa range — the make-or-break. If this fails, nothing else matters.

SettingTarget
Open line-of-sight≥ 1.0 km
Suburban / through houses≥ 300 m
Dense foliage / trail≥ 150 m

2. GPS.

TestTarget
Time-to-first-fix (cold)≤ 60 s
Time-to-first-fix (warm)≤ 15 s
Position accuracy vs phone≤ 10 m

3. Battery — the second make-or-break. The whole pitch is "you don't charge it constantly."

TestTarget
Active beaconing → projected runtime≥ 3 days
Idle / presence mode → projected runtime≥ 2 weeks

4. Presence + link.

TestTarget
Home ↔ away detection (10 transitions)≥ 9/10 correct
BLE reconnect after walking out of range≤ 30 s, no manual fix

5. The real test — Quark. Fit in a collar pouch, watch him cross the yard in real time, and an "escape" sim: someone walks him down the block while I re-acquire him on foot with the handheld's proximity readout.

The decision gate

This is the part that keeps it honest:

  • Build the custom collar if all three range targets hold for how I'd actually use it, GPS passes, and projected active battery clears three days.
  • Reconsider if range falls short in the neighborhood — that points to a better antenna, or leaning cellular-first. If battery fails, power tuning becomes priority one before any collar work.

The decision gate as a scorecard: four criteria with pass targets — LoRa range and battery runtime are hard stops, GPS fix and presence/BLE link are required — all feeding a single AND gate. If every criterion holds for real-world use, the gate opens to build the collar; if range or battery falls short, it routes to reconsider: a better antenna, going cellular-first, or power tuning before any collar work.

Multi-hop mesh — the crowdsourced-recovery magic — I can't test yet; that needs a third node. It waits.

Next post is this same scorecard with the cells filled in, and an honest verdict. If the numbers say stop, I'll say stop — that's the difference between a build log and a highlight reel.

A range-walk diagram: a base station with an antenna at left, a dashed direct link reaching a walking figure at about 1,250 feet where the link goes stale, and faint relay nodes scattered beyond that hand the signal onward to a much greater distance. Part 05 of 05
IoT Pet Health Tracker — Build · part 05
May 28, 2026

The Range Test: 1,250 Feet Direct — and Miles Through the Mesh

Range was the make-or-break criterion on the scorecard — if it failed, nothing else mattered. It didn't fail. A zero-hop direct link held to 1,250 feet in the suburbs, clearing the bar I set before I started. And the neighborhood mesh I stumbled onto last post was already relaying beacons miles further.

Last post I wrote the scorecard before I ran a single test, so I couldn't move the goalposts once I got excited. Criterion #1 was LoRa range, flagged the make-or-break: if this fails, nothing else matters.

It didn't fail. Here are the first numbers, against the targets I set.

The walk

One node on the move (call it the collar), one node home as the base station, beaconing forced to a 60-second heartbeat so I could catch the exact second the link died — the setup from last post. I started with the link solid and walked a straight suburban line until the heartbeat went stale.

The collar controller's OLED at the start of the walk, link alive: it shows the Base-Station node heard seconds ago, with a compass arrow and distance — a healthy, fresh heartbeat.

The number: the direct link held to 1,250 feet before the heartbeat went stale and stuck — last-heard climbing to one minute, two, three, no fresh beacons. That's where I stopped.

The collar controller at the limit of the walk: the Base-Station node now reads 1250 ft away, last heard 3 minutes ago — the heartbeat has gone stale, the direct link is gone.

1,250 ft is about 381 meters. Against the scorecard:

SettingTargetResult
Open line-of-sight≥ 1.0 km— not yet walked —
Suburban / through houses≥ 300 m381 m — pass
Dense foliage / trail≥ 150 m— not yet walked —

The suburban bar — the one that matters most for a dog who gets out the front door — cleared, with margin.

Zero hops — why that number is honest

Here's the part I want to be precise about, because it's easy to accidentally cheat a range test. The app showed the base station at Hops Away: 0.

The Meshtastic app's node details for the Base-Station: Device Role CLIENT, Last heard Now, and Hops Away 0 — a confirmed direct, zero-relay link.

Zero hops means my handheld heard the collar firsthand — the radio itself reached 1,250 feet, with no neighbor's node quietly relaying the beacon and inflating the result. Last post I found 39 strangers' nodes already on the air around my block, so I deliberately moved my two nodes onto their own channel and filtered the view to direct-only. 1,250 feet is the floor: what one radio does, alone, with nobody helping.

And the mesh was already doing miles

The Meshtastic app node list with both my nodes online — Collar at 97% battery and 8 GPS satellites, Base-Station at 76% and 157 ft away in this snapshot — under a header reading "2 online / 2 shown / 39 total." The 39 is the neighborhood mesh already on the air.

Now lift the zero-hop filter off and the story changes scale. Those 39 nodes are a working mesh, and it is emphatically not local. Sort the list by distance and there's a station — Mesh_WYVERN, 33 miles (53 km) out, four hops away:

The Meshtastic node list sorted by distance: a node "Mesh_WYVERN" 33 miles away reached over four relayed hops, above a "North Point" tower node 8.2 miles out — direct evidence the mesh I'm sitting on spans tens of miles, not a city block.

That's the network, not my radio — and my own collar rides it: on earlier runs across the public channel, with beacons free to relay hop to hop, the collar's position came back from about ten kilometers out. The reach my pet's beacon can borrow is measured in miles, not feet.

Put the whole span on one axis and the gap is the story — what my own radio did, against what the mesh carried for nothing:

A logarithmic distance axis from 10 meters to 100 kilometers. My collar's direct, zero-hop link sits at 381 meters (1,250 feet), measured on the walk; far out on the same axis are real nodes pulled from the mesh log — a North Point tower node at 8.2 miles and Mesh_WYVERN at 33 miles reached over four relayed hops, roughly 140 times my direct link, on hardware I don't own.

My own radio's direct link tops out around 381 m. On the same axis, the neighborhood mesh reached North Point's tower 8.2 miles out and Mesh_WYVERN 33 miles away over four hops — about 140× my direct range, on nodes I didn't buy and didn't place. (The log even caught a node at 100 km; that one's almost certainly a misconfigured fixed position, so I'm not counting it.)

That's the moat I sketched in the PRD, and I'd assumed I'd have to bootstrap it one sale at a time. Instead it already exists, on my street, before I've shipped anything — the same network effect behind Find My and Sidewalk. Zero-hop clears the bar on its own; the mesh turns feet into miles for free. The direct link is what I can promise; the mesh is the upside I don't have to build.

And I haven't touched the antenna or the power

The 1,250 feet is conservative for a third reason: it's the stock rig. The base is running the little screw-on whip the Wio Tracker ships with — and the Meshtastic crowd is near-unanimous that it's the cheapest weak link to fix, with higher-gain antennas that clearly outrun it. It's a fiddly part to swap on this enclosure, but it's swappable. I also haven't pushed transmit power toward its ceiling.

Both are pure link budget, and link budget turns into range through one clean equation. Every decibel you add — antenna gain on either end, plus transmit power — multiplies range by:

range × 10 ^ ( ΔdB / (10 · n) )

where n is the path-loss exponent: about 3 in the suburbs (free space is 2; dense foliage pushes toward 4). Anchored at my measured 1,250 ft / 381 m:

Link budget addedMultiplier (n = 3)Direct range
+3 dB1.26×~1,580 ft
+6 dB1.58×~1,980 ft
+9 dB2.0×~2,500 ft
+12 dB2.5×~3,140 ft

Range as a function of added link budget at suburban path loss (n = 3), drawn as a bar chart anchored at the measured 1,250 feet with zero decibels added: the bars climb to about 1,980 feet at +6 dB, 2,500 feet at +9 dB, and 3,140 feet at +12 dB. A note shows the decibels come from two knobs — a higher-gain base antenna and more transmit power — and a dashed line marks the regulatory EIRP ceiling that caps how far the two can be stacked.

Where those decibels come from: trading the ~2 dBi stock whip for a ~5.8 dBi collinear is about +4 dB, and there's usually a few dB of transmit-power headroom on top — call it +8 to +10 dB on the base side, which the table turns into roughly double the direct link, a quarter-mile-plus. Two honest limits keep it from being free. US 915 MHz ISM has an EIRP cap, so you can't stack gain and power without bound. And the collar antenna can't grow — a cat won't wear a collinear — so the realistic gains live on the base side. The upside: the same decibels lift every mesh hop too, so a better base antenna stretches both the 1,250-ft direct floor and the ~10 km mesh ceiling.

I'll confirm it with a real walk once the new antenna's on. For now it's a model — but the model is just radio physics, and it's why range isn't the thing that worries me.

Messaging works too

The link isn't just position beacons. I sent a plain text from the collar mid-walk and it landed at the base station:

The base station node sitting in a window, its OLED showing a received message: "hi from collar," heard 2 minutes ago — proof the link carries text both directions, not just position pings.

Small thing, big implication for an actual escape: I can ping the collar and get a fix back on demand, not just wait for the next scheduled beacon.

Presence — the heartbeat is the signal

The two walk photos above are also the presence test in miniature: at the start the heartbeat reads seconds ago (home / in range), at the limit it climbs and sticks (away / out of range). That climb-and-stick is exactly the home-vs-away signal the scorecard asks for — clean, with no false "still here" once the radio's truly gone.

The scorecard so far

CriterionStatus
LoRa range — suburbanPass (381 m, zero-hop)
LoRa range — open LOS / foliageNot yet walked
Presence — home/away heartbeatLooks clean; full 10-transition run to come
Messaging over the linkWorks both directions
GPS — time-to-fix, accuracy— to come —
Battery — active runtime~3.5 days at periodic beaconing — pass (continuous GPS + lit screen: ~10 h)
Battery — idle / presence runtime— to come —
The Quark test (escape sim)— to come —

Where this leaves the build

The criterion that could have killed the project — range — cleared the suburban bar direct, and the neighborhood mesh already extends recovery to miles I didn't have to engineer. The build stays alive. And the other make-or-break, battery, is looking like a pass too: at periodic beaconing the collar projects to ~3.5 days on a charge — past the three-day bar — while a continuous-GPS, screen-lit stress run collapses it to ~10 hours, which is exactly why the production collar runs headless and duty-cycles the GPS. What's left is GPS fix quality, the idle/presence number, and a per-mode bench measurement to make the battery verdict airtight. Those are next.