Inspiration

Homelessness is a serious and growing crisis in Austin, Texas. Organizations like ECHO (Ending Community Homelessness Coalition) do incredible work tracking shelter availability, homelessness rates, and system-wide data. Their Homelessness Response System Dashboard shows that 3,865 people are likely experiencing unsheltered homelessness in Austin right now, with 5,960 shelter beds in the system.

But here's the gap: knowing that data exists and actually being able to use it in the moment are two completely different things. If you're someone who needs a bed tonight, you're not browsing a research dashboard. You might have a prepaid phone with limited data, no time to search, and no idea which shelters are full, which are open, or which ones even accept people in your situation. Existing resource directories are static, outdated, and built for administrators, not for the person standing outside at 11 PM who just needs to know where they can sleep tonight.

That's what inspired Tonight's Bed. I wanted to build the last mile: the tool that takes all that existing data and gets it to the person who actually needs it, in a format that works for them, right now.

What it does

Tonight's Bed is a real-time resource navigator for people experiencing homelessness or housing insecurity in Austin, Texas. It's designed around SMS, so it works on any phone, no app download required, no account needed.

SMS-Style Resource Simulator Users can type their need in plain language - "Need a bed near downtown," "Woman alone near UT," "Family with two kids needs shelter," "Cold outside, where can I go?" - and the app parses their situation, location, and need type to return 1–3 matched resources with live availability, phone numbers, eligibility notes, and a reminder to call ahead. Crisis detection is built in: phrases like "I'm hurt" or "harm myself" immediately surface 911 and 988 before any resource results.

Live Resource Dashboard A filterable directory of Austin resources pulled live from Supabase. Users can filter by category (shelter, food, clinic, warming center, hygiene, outreach), open tonight status, demographics served (women, families, youth), pet-friendly, and wheelchair accessible. Every card shows real-time availability and a confidence indicator showing whether the data was provider-verified, outreach-verified, or may be stale.

Provider Update Dashboard Shelter staff and outreach workers can update tonight's availability in real time - open/full status, beds available, special notes, demographics served. Changes save directly to the database and reflect instantly for everyone using the app.

Live Toast Notifications When a provider saves an availability update, anyone with the app open receives an instant notification in the corner of their screen. No sign-up required. Powered by Supabase Realtime.

Safety First The app always surfaces 911 and 988 before anything else when a crisis keyword is detected. It never guarantees availability, always reminds users to call ahead, and uses dignity-centered language throughout, such as "people experiencing homelessness," never "the homeless."

How I built it

  • Frontend: React 18 + Vite — single-page app with six pages, all client-side rendered
  • Database: Supabase (PostgreSQL) — stores all 10 Austin resources with full availability metadata
  • Real-time: Supabase Realtime (postgres_changes) — listens for any database update and fires live toast notifications instantly across all open sessions
  • Deployment: Vercel — connected to GitHub for automatic deploys on every push
  • Fonts: Fraunces (display serif) + Plus Jakarta Sans (body) via Google Fonts
  • Styling: Fully custom inline React styles — warm earthy design system built from scratch

The SMS matching logic is a rule-based parser that detects need type, location, and situation from natural language input and scores each resource against the query to return the best matches.

Challenges I ran into

Getting live data to work seamlessly was the biggest technical challenge. Wiring Supabase Realtime so that a provider update in one browser tab instantly notifies a completely different session required understanding how postgres_changes subscriptions work and making sure the channel stayed alive across re-renders.

Building live toast notifications that weren't spammy nor repetitive, but were genuinely useful took more thought than expected. I implemented a per-resource per-day deduplication system so the same resource doesn't flood users with notifications if it gets updated multiple times.

Making it mobile accessible was a constant consideration given the target population. Large buttons, pill-shaped UI, plain language, short messages, and high contrast were all deliberate design choices made with someone on a small phone in a stressful situation in mind.

Balancing real-time and demo data — I wanted the app to feel live and real even as an MVP with simulated data, without misleading anyone into thinking the availability shown is guaranteed.

Accomplishments that I'm proud of

Getting all the pieces working together as a cohesive, functional product is something I'm genuinely proud of — Supabase, Realtime subscriptions, Vercel deployment, and a live public URL all talking to each other correctly.

I'm also proud of the design. I wanted this to feel warm, human, and dignified, not clinical or governmental. The earthy color palette, layered wave hero, and Fraunces display font were all intentional choices to make the app feel approachable for someone who might be in a vulnerable moment.

Lastly, I'm proud of the SMS simulator. The natural language parser handles a wide range of inputs and returns genuinely useful, situationally appropriate matches.

What I learned

Building Tonight's Bed taught me how to work with real-time database subscriptions and wire multiple APIs together into a single cohesive experience. I learned how Supabase Realtime works under the hood and how to handle live updates in React without causing unnecessary re-renders.

I also learned a lot about the problem itself. Digging into ECHO's data — 3,865 unsheltered people, 16,806 served in 12 months, 9,740 coordinated assessments — made the scale of the problem very real. There's serious infrastructure in Austin for addressing homelessness, but the gap between that infrastructure and the people who need it most is genuinely large. Building something that tries to close that gap, even a little, felt meaningful.

I learned that language matters too. Using "people experiencing homelessness" instead of "the homeless" isn't just political correctness. It reflects a real commitment to seeing users as full people, not categories.

What's next for Tonight's Bed

Real SMS integration via Twilio — the biggest next step is making the tagline literally true. Someone texts a real number, gets matched resources back as an SMS. The matching logic is already built; it just needs a Twilio webhook in front of it and A2P 10DLC registration to send outbound messages at scale.

ECHO API integration — if ECHO opens their data via API, Tonight's Bed could pull availability automatically with zero manual input, removing the reliance on providers manually updating the dashboard.

Automated nightly check-ins — a nightly automated text to each partner shelter asking "how many beds available tonight? Reply with a number" would keep data fresh with minimal friction for providers.

Authentication for providers — right now any visitor can update resources. A production version would require shelter staff to log in so only verified providers can edit their own listings.

Expanded cities — the architecture is city-agnostic. Austin is the pilot, but the same system could work in any city with a homelessness coordination infrastructure to partner with.

Github Link: https://github.com/myreenmalik/tonights-bed

Built With

Share this project:

Updates