<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arshiya Sharma</title>
    <description>The latest articles on DEV Community by Arshiya Sharma (@arshiyasharma).</description>
    <link>https://dev.to/arshiyasharma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F920575%2F7c2dd3dd-eb00-4345-88fe-47dfac1f9e4d.png</url>
      <title>DEV Community: Arshiya Sharma</title>
      <link>https://dev.to/arshiyasharma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arshiyasharma"/>
    <language>en</language>
    <item>
      <title>EvacuAid: They died, and nobody asked who couldn't leave; money came too late.</title>
      <dc:creator>Arshiya Sharma</dc:creator>
      <pubDate>Sun, 15 Nov 2026 13:30:12 +0000</pubDate>
      <link>https://dev.to/arshiyasharma/nobody-asked-who-couldnt-leave-i-built-the-wildfire-night-end-to-end-solo-at-hackumass-3ejc</link>
      <guid>https://dev.to/arshiyasharma/nobody-asked-who-couldnt-leave-i-built-the-wildfire-night-end-to-end-solo-at-hackumass-3ejc</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Altadena, January 8, 2025.&lt;/strong&gt; Anthony Mitchell Sr., 67, couldn't walk on his own. His son Justin had cerebral palsy. They called for an ambulance. They waited. It never came. (&lt;a href="https://www.npr.org/2025/01/13/g-s1-42506/la-fires-victims-altadena-eaton-anthony-mitchell" rel="noopener noreferrer"&gt;NPR&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Eaton fire killed 19 people. &lt;strong&gt;18 died in west Altadena, where the evacuation order came last.&lt;/strong&gt; NASA satellites saw fire at those homes at &lt;strong&gt;1:02 AM&lt;/strong&gt;. The order went out at &lt;strong&gt;3:25 AM&lt;/strong&gt;. It told people to leave, and never asked who &lt;em&gt;couldn't&lt;/em&gt;. &lt;strong&gt;16 of the 19 couldn't leave alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The more I read, the clearer it got that the problem has two halves. &lt;strong&gt;People couldn't get out, and then they couldn't get help.&lt;/strong&gt; Aid arrives weeks after the fire. The people who need it most can't front the gas or the motel room. Fraud drains the funds, and donors can't see where their money went, so they stop giving.&lt;/p&gt;

&lt;p&gt;Every evacuation tool I found stops at the van. Surprisingly, texts work better than calls. I couldn't find a single one that also gets people money the same night. So I built &lt;strong&gt;EvacuAid&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Out safe. Aid tonight.&lt;/strong&gt; EvacuAid finds who can't leave, gets them out first, and gets them fraud-checked aid the same night, with every donor able to see whose life their gift touched.&lt;/p&gt;

&lt;h3&gt;
  
  
  How a night works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A two-way alert, hours early.&lt;/strong&gt; When the fire forecast reaches a home, EvacuAid texts it over real iMessage and &lt;em&gt;asks&lt;/em&gt;: &lt;code&gt;1&lt;/code&gt; leaving on my own · &lt;code&gt;2&lt;/code&gt; need a ride · &lt;code&gt;3&lt;/code&gt; need help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any words, any language.&lt;/strong&gt; People don't reply "3". They write &lt;em&gt;"my mom can't walk and the car's in the shop"&lt;/em&gt; or &lt;em&gt;"mi esposo usa silla de ruedas"&lt;/em&gt;. Gemini turns that into a structured case in about 2 seconds and replies in their language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who goes first is math, not guesswork&lt;/strong&gt; (more below). The operator sees a ranked list with reasons and approves every van in one click. &lt;strong&gt;AI suggests; a person decides.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The resident sees every step:&lt;/strong&gt; &lt;em&gt;dispatched&lt;/em&gt; → &lt;em&gt;outside&lt;/em&gt; → &lt;em&gt;on board&lt;/em&gt; → &lt;em&gt;checked in&lt;/em&gt;, plus a private link to watch the van move on a map. No reply means two more texts, then a door knock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money, while they're leaving.&lt;/strong&gt; Two questions size the aid ($150 gas · $315 gas + a night · $770 full). Five bank checks run on real card history before a dollar moves. Money lands on a relief card that &lt;strong&gt;only buys evacuation&lt;/strong&gt;: gas, rooms, food and pharmacy go through; electronics get declined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Donors see it land.&lt;/strong&gt; Donations sit in an on-chain pool whose rules are written in code. Every donor gets a receipt naming the families their gift reached.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who goes first: a race between the fire and the household
&lt;/h3&gt;

&lt;p&gt;Every home gets a score, recomputed every replay minute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P, the chance the fire wins.&lt;/strong&gt; Let A be when the fire reaches the home and T how long the household needs to get out. Fire timing is uncertain, so A is lognormal with σ = 0.35:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P(trapped) = Φ( (ln T − ln A) / σ )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;T adds up real minutes: 30 to get moving, 20 to drive out, +60 for a wheelchair, +45 for oxygen, +15 for kids, +30 if they haven't replied. No car means at least 240 minutes. Asking for help means 360: only a rescue gets them out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V, the harm if they're trapped.&lt;/strong&gt; Risk factors from the CDC Social Vulnerability Index combine as independent risks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;V = 1 − Π (1 − wᵢ)        priority = P × V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weights are medical 0.6, can't walk 0.5, someone left at home 0.4, age 75+ 0.3, silent 0.3, kids 0.15, non-English 0.1, and a 0.1 baseline so nobody is ever zero.&lt;/p&gt;

&lt;p&gt;A wheelchair user on oxygen with the fire 90 minutes out scores &lt;strong&gt;0.82&lt;/strong&gt;. A family with a car on the same street scores &lt;strong&gt;0.05&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did it work? I replayed the real night.
&lt;/h3&gt;

&lt;p&gt;I didn't invent a fire. EvacuAid replays &lt;strong&gt;the actual Eaton fire&lt;/strong&gt; from &lt;strong&gt;365 NASA FIRMS satellite detections&lt;/strong&gt;, on the real streets, against the real 3:25 AM order.&lt;/p&gt;

&lt;p&gt;My first model said fire reached west Altadena around 10 PM. The satellites said after 1 AM. It would have made my results look better. &lt;strong&gt;I threw out my own number and used theirs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;200 paired runs, 179 people in 114 homes who can't leave alone, 22 vehicles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Alert&lt;/th&gt;
&lt;th&gt;People out before the fire&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What happened&lt;/td&gt;
&lt;td&gt;One-way, 3:25 AM&lt;/td&gt;
&lt;td&gt;~3 of 179&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generous baseline: alert when satellites saw fire&lt;/td&gt;
&lt;td&gt;One-way, 1:02 AM&lt;/td&gt;
&lt;td&gt;~97 of 179&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EvacuAid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Two-way, 6:49 PM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;179 of 179&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's &lt;strong&gt;+176 people, the same gain in all 200 runs&lt;/strong&gt;, with a median of about 4.5 hours to spare. The baseline even knows who needs a ride. It still loses, because a one-way alert can't hear "I can't."&lt;/p&gt;

&lt;p&gt;Fire is the proof, not the limit. Only one input changes per disaster (the feed that says when the hazard reaches each home), so the same system works for floods, hurricanes, earthquakes and chemical spills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://evacuid.us" rel="noopener noreferrer"&gt;evacuid.us&lt;/a&gt; · the pitch at &lt;a href="https://evacuid.us/pitch" rel="noopener noreferrer"&gt;evacuid.us/pitch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What you can do right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sign up on the landing page&lt;/strong&gt; and text the number. You'll get the real alert flow on your phone over iMessage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the console&lt;/strong&gt; replay the Eaton fire minute by minute, with households lighting up as the fire reaches them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open &lt;code&gt;/relief&lt;/code&gt;&lt;/strong&gt; to see every dollar: Nessie transfers, card swipes, van bills, and Solana releases paying the county back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Donate on &lt;code&gt;/donate&lt;/code&gt;.&lt;/strong&gt; That sends a real Solana devnet transaction, and your receipt names the family it reached.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;I wanted every sponsor platform to be &lt;strong&gt;load-bearing&lt;/strong&gt;: take any one away and a piece of the rescue breaks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Gemini: turning panic into a case
&lt;/h3&gt;

&lt;p&gt;A frightened text is the hardest input in the system. I use &lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt; through the Interactions API with minimal thinking, which gets about 2 seconds per message.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A management prompt&lt;/strong&gt; with the mission, 14 conversation stages, the needs taxonomy, safety rules, and worked examples in English and Spanish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured JSON output:&lt;/strong&gt; status, stage, needs, who's left behind, emergency, language, a one-line operator summary, and the reply. &lt;strong&gt;Code decides; AI reads.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails in code.&lt;/strong&gt; It can never promise a ride or a dollar amount. If it says "on the way" before an operator dispatched, code replaces the line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hybrid engine.&lt;/strong&gt; A state machine answers menu replies instantly and for free; Gemini handles everything else. If Gemini fails, keyword rules answer, so &lt;strong&gt;no text is ever dropped.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I learned: Gemini is remarkable at reading &lt;em&gt;"the car's in the shop and grandma's on oxygen"&lt;/em&gt; and getting both needs. But approving a van belongs to a person, so I built the system so it physically can't skip that step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vultr: the always-on front door
&lt;/h3&gt;

&lt;p&gt;EvacuAid isn't a stateless website. It holds a live roster, checks iMessage every 2 seconds and times every van trip, all things serverless functions forget between requests. So it runs on a &lt;strong&gt;Vultr Cloud Compute&lt;/strong&gt; server (Ubuntu 24.04):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caddy&lt;/strong&gt; for automatic HTTPS; &lt;strong&gt;ufw&lt;/strong&gt; leaves only SSH, 80 and 443 open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One live copy, always.&lt;/strong&gt; Photon only lets you &lt;em&gt;read&lt;/em&gt; messages, so two running copies both reply to every text. An SSH reverse tunnel carries evacuid.us to a single operator station, and a full standby copy on Vultr (Node 22, systemd, restarts in 2 s) takes the whole night over in one command, data included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploys can't break the site.&lt;/strong&gt; Each build goes into a new release folder, 34 smoke checks run against the real domain, and any failure rolls back automatically. Nightly backups, 14 kept.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scariest part of the weekend was deploying something with this many moving parts. Three of my first deploys failed in instructive ways: an rsync exclude that also skipped my fire data, a Turbopack panic on a symlinked data folder, and a symlink nested inside a real directory. The rollback script is why none of them reached the live site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solana: donor money with rules in code
&lt;/h3&gt;

&lt;p&gt;"Trust us" doesn't work for disaster money anymore. I wrote an &lt;strong&gt;Anchor&lt;/strong&gt; program, &lt;code&gt;relief_pool&lt;/code&gt;, deployed on devnet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;4 instructions:&lt;/strong&gt; &lt;code&gt;init_pool&lt;/code&gt; · &lt;code&gt;donate&lt;/code&gt; · &lt;code&gt;publish_order&lt;/code&gt; · &lt;code&gt;release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDAs&lt;/strong&gt; for the pool, the vault, one zone per evacuation order, and one claim per household hash, so a home can't double-dip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules enforced on-chain:&lt;/strong&gt; money only moves for zones the county actually ordered out, never more than &lt;strong&gt;$770 per home&lt;/strong&gt;, and only to the county's account (&lt;code&gt;has_one county_payout&lt;/code&gt;). Each rule is proven to refuse on devnet, so not even a stolen key can send money elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro-rata receipts:&lt;/strong&gt; each release draws from each donor in proportion to what their gift still makes up of the pool, so your receipt names the real families you helped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Capital One Nessie: the bank, the fraud engine and the books
&lt;/h3&gt;

&lt;p&gt;Nessie isn't just a ledger here. EvacuAid uses 10+ endpoints, each with a job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A customer per home (the ZIP is the residency check) and a relief card per family.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /accounts/{id}/transactions&lt;/code&gt; answers &lt;strong&gt;"where was this card an hour ago?"&lt;/strong&gt; That's how it catches the "evacuee" whose card was swiped in Las Vegas.&lt;/li&gt;
&lt;li&gt;Transfers only after approval, and a decision on every claim. A held claim moves &lt;strong&gt;$0&lt;/strong&gt;. Nessie settles pending transfers on its own sweep, so I rebuilt the flow to create no transfer at all until a human says yes.&lt;/li&gt;
&lt;li&gt;Every van trip is billed live to County Emergency Operations, itemized for FEMA's 75% reimbursement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bridge:&lt;/strong&gt; Nessie pays the family in seconds; Solana pays the county back from donors, and each release lands as a Nessie deposit that records the transaction it reimbursed. Chain and bank point at each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tiger Data: the incident's memory
&lt;/h3&gt;

&lt;p&gt;Every text, case, dispatch and dollar is a row in an &lt;code&gt;evac_events&lt;/code&gt; &lt;strong&gt;TimescaleDB hypertable&lt;/strong&gt;, with a 5-minute &lt;strong&gt;continuous aggregate&lt;/strong&gt;, compression, and a &lt;code&gt;(run, kind, time desc)&lt;/code&gt; index so the console's charts return in milliseconds. Writes are fire-and-forget: analytics can fail; a ride can't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Photon: real iMessage
&lt;/h3&gt;

&lt;p&gt;Residents don't install anything. EvacuAid talks to the phone they already have over real iMessage through Photon, polling every 2 seconds, with conversation routes saved to disk so a restart never forgets who it was talking to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;I built EvacuAid &lt;strong&gt;solo at HackUMass XIV&lt;/strong&gt;: about 12,000 lines of TypeScript, 297 lines of on-chain Rust, and 34 automated tests.&lt;/p&gt;

&lt;p&gt;What I'll remember most is the moment the first real iPhone buzzed with the alert, someone replied &lt;em&gt;"my mom uses a wheelchair and we have no car,"&lt;/em&gt; and a van, a $150 relief card and a donor receipt all followed from that one sentence.&lt;/p&gt;

&lt;p&gt;Some things I'll carry out of this weekend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rescue is a listening problem.&lt;/strong&gt; The people who died weren't the ones who missed the alert. They were the ones nobody asked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money is a rescue tool.&lt;/strong&gt; People stay because leaving costs money. Aid that arrives next month gets nobody out tonight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest numbers beat impressive ones.&lt;/strong&gt; Throwing out my own fire timing made the result smaller and far more believable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resets that erase real people are bugs.&lt;/strong&gt; Early on, "reset drill" wiped real phone numbers. Now every run is archived, and only replying STOP turns a phone off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nobody should have to wait for an ambulance that never comes, or for a check that comes too late.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If this moved you, share it with someone who works in emergency management, accessibility or disaster relief. I'd love to hear what you'd build next.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Residents in the replay are simulated; the fire, the streets and the timeline are real. In an emergency, call 911.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
