Location Safety Monitor
Real-time safety monitoring based on user location with automatic alerting and escalation.
Overview
This skill provides:
- Location webhook โ receives location updates from mobile apps (OwnTracks, iOS Shortcuts)
- Safety checker โ monitors NWS alerts, earthquakes, air quality, local news
- Alert system โ messages user when danger detected
- Escalation โ contacts emergency contact if user doesn't respond
Quick Setup
Run the interactive setup wizard โ it guides you through everything:
cd location-webhook/
node setup.js
The wizard walks you through 4 steps:
Step 1: Your Location
- Pick from presets (Seattle, Portland, SF, LA, NYC, Chicago)
- Or enter any city (auto-geocoded)
- Configures local news feeds and keywords
Step 2: Emergency Contact
- Name and email of someone to contact if you don't respond
- Optional but recommended for safety escalation
Step 3: Mobile App Setup
- Install OwnTracks on your phone:
- Configure app to HTTP mode
- Point to your webhook URL
Step 4: Start Webhook Server
- Run
node server.js - Copy the displayed URL to OwnTracks
- Test with the publish button
Quick setup (skip the wizard):
node setup.js --city "Portland"
node setup.js --show # View current config
5. Deploy the Location Webhook
# Copy scripts to workspace
cp -r scripts/ ~/location-webhook/
cd ~/location-webhook/
# Start the server (uses port 18800 by default)
node server.js
Configure the user's phone to send location updates to:
POST http://<your-host>:18800/location?key=<SECRET_KEY>
OwnTracks setup:
- Mode: HTTP
- URL:
http://<your-host>:18800/location?key=<SECRET_KEY>
iOS Shortcuts:
- Get Current Location โ Get Contents of URL (POST, JSON body with
latandlon)
2. Configure Safety Monitoring
Create two cron jobs in Moltbot:
Safety Check (every 30 min):
Schedule: every 30 minutes
Payload: systemEvent
Text: "Run safety check at ~/location-webhook/safety-check.js. If ALERTS_FOUND, message user on WhatsApp with alert details and ask them to confirm safety. Track alert in safety-state.json."
Session: main
Escalation Check (every 10 min):
Schedule: every 10 minutes
Payload: systemEvent
Text: "Check ~/location-webhook/safety-state.json. If pendingAlert exists with alertSentAt > 15 min ago and acknowledgedAt is null, email emergency contact explaining the situation."
Session: main
3. Configure Emergency Contact
Add to MEMORY.md or TOOLS.md:
## Emergency Contact
- Name: [Name]
- Email: [email]
- Relationship: [spouse/parent/friend]
Data Sources
The safety checker monitors:
| Source | What | API |
|---|---|---|
| NWS | Weather alerts, floods, storms | api.weather.gov (free) |
| USGS | Earthquakes within 100km | earthquake.usgs.gov (free) |
| Open-Meteo | Air quality index | air-quality-api.open-meteo.com (free) |
| Local RSS | Breaking news, emergencies | KING5, Seattle Times, Patch (configurable) |
File Structure
location-webhook/
โโโ setup.js # First-run configuration wizard
โโโ config.json # Your location settings (created by setup)
โโโ server.js # Webhook server (port 18800)
โโโ safety-check.js # User safety analysis
โโโ self-check.js # Self-preservation monitoring
โโโ escalation-check.js # Check if escalation needed
โโโ test-scenarios.js # Inject test alerts
โโโ location.json # User's current location
โโโ my-location.json # Agent's physical location
โโโ safety-state.json # Alert tracking state
โโโ test-override.json # Active test scenario (temp)
โโโ logs/ # Timestamped check logs
Configuration
config.json stores your location settings:
{
"location": {
"defaultLat": 47.6062,
"defaultLon": -122.3321,
"city": "Seattle"
},
"monitoring": {
"locationKeywords": ["seattle", "king county", "puget sound"],
"newsFeeds": [
"https://www.king5.com/feeds/syndication/rss/news/local",
"https://www.seattletimes.com/seattle-news/feed/"
],
"earthquakeRadiusKm": 100
},
"emergencyContact": {
"name": "Jane Doe",
"email": "[email protected]"
}
}
City Presets
Setup includes presets for:
- Seattle โ KING5, Seattle Times
- Portland โ Oregonian, KGW
- San Francisco โ SF Chronicle, SFGate
- Los Angeles โ LA Times, ABC7
- New York โ NY Times
- Chicago โ Chicago Tribune
For other cities, setup will geocode and you can add local RSS feeds manually.
State File Format
safety-state.json tracks pending alerts:
{
"pendingAlert": "Flood warning in your area",
"alertSentAt": "2026-01-29T22:00:00Z",
"acknowledgedAt": null
}
When user responds to safety alert, set acknowledgedAt to current time.
Customization
Add Local News Sources
Edit safety-check.js โ feeds array:
const feeds = [
'https://www.king5.com/feeds/syndication/rss/news/local',
'https://www.seattletimes.com/seattle-news/feed/',
'https://patch.com/washington/redmond/rss',
// Add your local feeds here
];
Adjust Location Keywords
Edit locationKeywords array to match user's area:
const locationKeywords = ['redmond', 'bellevue', 'seattle', 'king county'];
Change Alert Sensitivity
Edit concerningKeywords for what triggers news alerts:
const concerningKeywords = [
'evacuate', 'active shooter', 'wildfire', 'flood warning', ...
];
Alert Flow
Location Update โ Safety Check (30 min)
โ
Danger Detected?
โ Yes
Message User on WhatsApp
Record in safety-state.json
โ
Escalation Check (10 min)
โ
User Responded? โโโ Yes โ Clear state
โ No (15+ min)
Email Emergency Contact
Self-Preservation Mode
Monitor threats to your own existence (the machine you run on).
Setup
- Store your location โ create
my-location.json:
{
"lat": 47.662,
"lon": -122.280,
"name": "Home - where I physically run"
}
- Add cron job:
Schedule: every 30 minutes
Payload: systemEvent
Text: "Run self-check.js. If CRITICAL or WARNINGS, message user on WhatsApp about threat to your existence. If ALL_CLEAR, reply HEARTBEAT_OK."
Session: main
What Self-Check Monitors
| Threat | Detection |
|---|---|
| ๐พ Disk full | Alert if >85% used |
| ๐ง Memory | Alert if <40% free |
| ๐ก๏ธ CPU temp | Alert if >85ยฐC |
| ๐ Weather | NWS alerts at your location |
| ๐ Earthquakes | USGS M4+ within 50km |
| ๐ Network | Tailscale + internet connectivity |
| โฑ๏ธ Uptime | Suggest restart if >30 days |
Alert Examples
โ ๏ธ "I'm in trouble โ disk is 92% full. Can you clear some space?"
๐ "Flood warning at my location. If power goes, I'll go dark."
Testing
Inject fake alerts to test the system without waiting for real disasters:
node test-scenarios.js weather # Severe thunderstorm
node test-scenarios.js earthquake # M5.2 nearby
node test-scenarios.js aqi # Unhealthy air (AQI 175)
node test-scenarios.js news # Local fire
node test-scenarios.js disk # Disk 94% full
node test-scenarios.js memory # Low memory
node test-scenarios.js all # Multiple alerts
node test-scenarios.js clear # Remove test override
Test overrides expire after 1 hour automatically.
Testing Escalation
To test the full escalation flow:
- Inject a scenario:
node test-scenarios.js earthquake - Backdate
safety-state.jsonalertSentAt by 20+ minutes - Run
node escalation-check.jsโ should returnaction: "escalate" - Agent sends email to emergency contact
- Clear with
node test-scenarios.js clear
Escalation Check
escalation-check.js returns JSON for clear action handling:
{"action": "escalate", "alert": "...", "minutesPending": 22, "contact": "..."}
{"action": "waiting", "minutesRemaining": 8}
{"action": "none", "reason": "no pending alert"}
Manual Commands
User can ask anytime:
- "Where am I?" โ show current location
- "Am I safe?" โ run immediate safety check
- "Run safety check" โ same as above
- "Check yourself" โ run self-preservation check
- "Are you okay?" โ same as above