0→1 Laravel, MySQL, Google Maps, GeoIP

Homelessly — Civic Reporting Platform

Homelessly started in November 2017 as a prototype for Bakersfield. I kept seeing the same gap: someone wanted to help a person on the street, but had no trusted way to pass location and context to a charity that could actually respond.

Initial plan

Goal

Let residents report outreach needs anonymously on a map, and give local charities a shared place to review, filter, and export those reports.

Assumptions

  • Charities would need multi-stop routing early, not just pins on a map
  • A native mobile app would be required before field staff would use it
  • Self-serve organization signup would be necessary for the prototype to feel real

Planned scope

  • Public, no-login reporting with map placement and service needs
  • Charity dashboards with map review and CSV export
  • Organization roles (admin, manager, user) and invite links
  • Admin flows for org onboarding and seat limits

Architecture

High-level architecture

flowchart LR
  Visitor["Anonymous visitor"] --> Laravel["Laravel app"]
  Laravel --> MySQL[(MySQL)]
  Laravel --> Maps["Google Maps"]
  Laravel --> GeoIP["GeoIP"]
  Staff["Charity staff"] --> Dashboard["Org dashboard"]
  Dashboard --> Laravel

Workflow

sequenceDiagram
  actor Visitor
  participant App as Laravel
  participant DB as MySQL
  actor Staff as Charity staff

  Visitor->>App: Double-click map + submit report
  App->>DB: Transaction: location + needs + notes
  DB-->>App: Commit or rollback
  App-->>Visitor: Confirmation
  Staff->>App: Browse / filter reports
  App->>DB: Query org-scoped reports
  Staff->>App: Export selected rows to CSV

Schema

erDiagram
  ORGANIZATIONS ||--o{ USERS : employs
  ORGANIZATIONS ||--o{ REPORTS : receives
  REPORTS ||--o{ REPORT_NEEDS : includes
  USERS {
    string role
  }
  REPORTS {
    float lat
    float lng
    int headcount
    string notes
  }

What I learned

  • Report integrity mattered before routing — a pin without needs was useless to a charity
  • Organization boundaries had to exist from day one; a shared inbox would not have been honest
  • Add-to-homescreen was enough to test field use; a native app was premature
  • A working public report loop taught more than unfinished admin polish

Status

First commit November 27, 2017. Core loops (registration, reports, maps) landed through December 2017 into early 2018. Public reporting and charity dashboards were in working shape; some onboarding and admin flows stayed unfinished. Not a launched regional product — honest scope for a side project that tested whether map-based handoffs could work better than phone calls and guesswork.

Demo is back up at homelessly.oscarestrada.dev for anyone who wants to click around the map and charity flows.