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.
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.
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.
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.
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
- 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.
- My pet is off-grid with me — a trail, the woods. No cell coverage. I want to see where they are relative to me.
- 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:
- Range? Home is meters. A trail is kilometers. "Lost in the next county" is anywhere.
- 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.
- BOM budget? Consumer. Every dollar of radio locks the rest of the bill.
- Power budget? Small battery, and — per the last post — no charging cult.
- 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
| Radio | Range | Power | Cost | Good for |
|---|---|---|---|---|
| BLE | meters | sips (an AirTag runs ~a year on a coin cell) | ~free | "Is it home?" presence |
| LoRa (915 MHz) | kilometers, line-of-sight | low | cheap, no carrier | trail + local recovery, if you bring the gateway |
| Cellular (LTE-M) | anywhere with a tower | hungry | hardware + monthly data | the 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.
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:
| SKU | Radios | Battery | For | Money |
|---|---|---|---|---|
| LoRa collar | BLE + LoRa + GPS | months | home/indoor pets; trail dogs (with the base station) | hardware + optional ~$20/yr cloud history |
| Cellular collar | BLE + LTE-M + GPS | days–~2 wks | roamers / escape artists / "find from the couch" | premium hardware + data sub (still under the incumbents) |
| Base station / handheld | BLE + LoRa | weeks (docked = always charged) | every LoRa-collar owner | bundled 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 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
- Location — BLE + LoRa. The novel, can't-buy-it part: presence, the geofence flip, the mesh, the base station. The hardest phase, on purpose.
- Cellular. The "anywhere" premium SKU. A paved road (Nordic's nRF9160 + reference firmware), so it's a low-risk bolt-on.
- 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.
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.
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 spec reads like I wrote it for myself:
![]()
- 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.
![]()
![]()
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):
| Qty | Part | Price |
|---|---|---|
| 2 | WisBlock Meshtastic Starter Kit, US915 (SKU 116016 — base + RAK4631 core) | ~$64 (buy-2 −8%) |
| 2 | RAK12500 GNSS — u-blox ZOE-M8Q | $51.24 (buy-2 −5%) |
| 1 | RAK1904 3-axis accelerometer — ST LIS3DH | $7.97 |
| 2 | RAK1901 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.
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
- 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.
- Cellular. Swap in the nRF9160 path for the "anywhere" collar. Lower risk — a well-documented road.
- Health. Resting heart rate and respiratory rate off the accelerometer the collar already carries. Only after the dot is boringly reliable.
The honest timeline
Six months, evenings and weekends, shipping delays included. Phase 1 only — cellular and health are next year's problem.
| Month | Goal |
|---|---|
| 1 | Wio L1 two-pack PoC — one on Quark, range tests around the neighborhood and on a trail, GPS → phone map |
| 2 | RAK4631 collar publishing GPS + battery into the existing IoT Core stack |
| 3 | BLE home-presence + geofence-exit flip to findable mode; the power budget that makes "months" real |
| 4 | Base station behaviors: home listener, grab-and-go gateway, RSSI proximity beep |
| 5 | Enclosure + collar mount + charging; survive a wet Lab |
| 6 | Field 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 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.
![]()
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.
![]()
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 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.
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.
| Setting | Target |
|---|---|
| Open line-of-sight | ≥ 1.0 km |
| Suburban / through houses | ≥ 300 m |
| Dense foliage / trail | ≥ 150 m |
2. GPS.
| Test | Target |
|---|---|
| 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."
| Test | Target |
|---|---|
| Active beaconing → projected runtime | ≥ 3 days |
| Idle / presence mode → projected runtime | ≥ 2 weeks |
4. Presence + link.
| Test | Target |
|---|---|
| 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.
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.
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 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.
![]()
1,250 ft is about 381 meters. Against the scorecard:
| Setting | Target | Result |
|---|---|---|
| Open line-of-sight | ≥ 1.0 km | — not yet walked — |
| Suburban / through houses | ≥ 300 m | 381 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.
![]()
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
![]()
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:
![]()
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:
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 added | Multiplier (n = 3) | Direct range |
|---|---|---|
| +3 dB | 1.26× | ~1,580 ft |
| +6 dB | 1.58× | ~1,980 ft |
| +9 dB | 2.0× | ~2,500 ft |
| +12 dB | 2.5× | ~3,140 ft |
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:
![]()
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
| Criterion | Status |
|---|---|
| LoRa range — suburban | Pass (381 m, zero-hop) |
| LoRa range — open LOS / foliage | Not yet walked |
| Presence — home/away heartbeat | Looks clean; full 10-transition run to come |
| Messaging over the link | Works 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.