Inspiration

I spent a night in a tent surviving a bad storm that I had not seen coming, with no way to know whether it was a downpour that would pass in twenty minutes or a cell that would sit on me until morning. I had one bar of signal. Enough for my phone to insist it was connected, but not enough to load a weather app. I refreshed it for an hour and got nothing. That is the failure I wanted to fix. Not "no signal", which you can plan around, but the in-between state where the phone looks connected and nothing works. It kept happening after that, and not only in the backcountry. Most of my summer is spent in places with thin or no data: the cottage, the beach, a trail an hour from the trailhead. I still had questions in all of those places. What is the weather doing tonight. What does poison ivy look like? How to hang a bear bag? The connection was the only thing missing. The other half came from watching friends carry a Garmin inReach. It is a good device and it solves a real problem, and it is also one more thing to remember, and to charge up. Since iOS 18, an iPhone 14 or later can already send and receive texts over satellite. The hardware was in my pocket.

What it does

You text a number and get an answer back. Send coordinates or a place name and you get the next several hours for that location, hour by hour, with any active alerts. Ask a question in plain language and you get a short answer. It all rides on SMS, so it works on one bar where a web page will absolutely not load, and over iPhone satellite messaging when there is no cellular signal at all. The app also does trip sharing. You start a trek in the WileWire app, then text TREK with your coordinates to drop a point. Your family gets a link they can watch from home, which turns a silent week into something they can check on. Here is a real one: https://www.wildwire.app/track/?c=-EpxTYodi-lw1f4YJWi-8g What I wanted was the informational half of an inReach without the second device. That is what this is, and I want to be exact about the boundary, because it matters: WildWire is not an SOS device. It cannot reach rescuers or contact anyoneon your behalf. Apple's Emergency SOS via satellite is the feature that summons help, it is on the same phone, and it is free. WildWire answers questions, which is the other half of what people actually carry an inReach for, and the half that does not need dedicated hardware any more.

How I built it

The whole thing is an SMS webhook with an app bolted to the front of it. Backend: Firebase Cloud Functions on Node, with Twilio handling the SMS. An inbound text hits a webhook, gets classified, and either takes a deterministic path or goes to Gemini 2.5 Flash on Vertex AI. Firestore holds users, conversation threads and a small per-user memory so a 140-character follow-up still makes sense.

Weather: Forecasts come from the National Weather Service in the United States and Environment Canada in Canada. The model never generates weather. Additional alerts and marine warnings come from the same government sources.

iOS app: SwiftUI, iPhone only. The app exists to verify your number, manage your subscription to the service, keep your coordinates in a format you can paste into a message, start off conversations, and a place to let you read the conversation later.

Challenges I ran into

Replies that never arrived. Users would text and see nothing, then find the answer waiting in the app. Twilio abandons a webhook at about fifteen seconds, and my model call had a twenty second timeout, so a slow answer could not physically make it back as a text no matter what else went right. Twilio logged an error and sent nothing while my function ran happily to completion and wrote to the database. The fix was a hard deadline on the whole request, with the cold start charged against it, and a short honest reply if the budget blows rather than silence.

The cost is the SMS, not the AI. I did a full audit expecting tokens to dominate. Transport is about 97% of the cost of a message once carrier fees are counted, and Gemini is roughly 2%. That inverted my priorities completely. Reply length became the thing worth optimising, and the AI bill turned out to be a rounding error.

Carrier registration. Getting an A2P 10DLC campaign approved took several rejections. The one that taught me something was a reviewer saying they could not verify the opt-in because it lived inside an iOS app they could not install. Fair point. I published screenshots of the actual consent screen on the website and pointed them at the URL.

A false all clear over water. My alert lookup only read the land feed, so a coastal query could return "no alerts" while a marine warning was active for the water a hundred metres away. I found it around the same time a kayak rescue was in the news locally. Marine warnings now come from Environment Canada's marine feed, and an undetermined result is never reported as an all clear.

What I learned

A constraint improved the product. A text message is 160 characters before it splits into billed segments. Forcing every answer into that budget killed the preamble, the restatement of the question, and the closing offer to help further. The first word has to answer the question. The replies got better, not worse.

Knowing when not to answer. The app will not assess a specific injury or illness. Ask it about a wound and it says to contact a professional, and to use Emergency SOS or call 911 if it is serious. I tried removing that boundary during development and put it back. A text message is the wrong instrument for triage, and a confident wrong answer would be worse than no answer.

What's next

Better trip sharing, since that is the feature people react to most. Wider satellite coverage as Apple expands it. And the interesting question I do not have an answer to yet: how much of what people carry a dedicated device for is actually information rather than rescue, and how much of that half the phone in their pocket can now cover on its own.

Built With

Share this project:

Updates

Submission history