An open-source, city/state-deployable web app for crowdsourced reporting of immigration enforcement activity. Think WAZE for ICE sightings. Optimized for speed, anonymity, and resilience.
- 🗺️ Real-time map of reported sightings
- 📱 Mobile-first, dark mode interface
- 🌐 Bilingual (English/Spanish)
- 🔒 Privacy-focused (no tracking, EXIF stripping)
- ⚡ Fast and lightweight
- 🚀 Easy deployment per city
- Frontend: React + Vite + TypeScript
- Styling: Tailwind CSS + shadcn/ui
- Maps: Leaflet + OpenStreetMap
- Backend: Supabase (PostgreSQL + PostGIS + Realtime)
- i18n: react-i18next
- Node.js 18+
- npm or yarn
- Supabase account
- Clone the repository:
git clone <repo-url>
cd rocksalt- Install dependencies:
npm install- Copy environment variables:
cp .env.example .env-
Configure your
.envfile with your Supabase credentials and city settings. -
Set up Supabase:
- Create a new Supabase project
- Run the migrations in
supabase/migrations/in order:001_enable_postgis.sql002_create_tables.sql003_create_functions.sql004_create_policies.sql006_create_storage_policies.sql
- Create a storage bucket named
sighting-photosin Supabase Dashboard:- Go to Storage → Create bucket
- Name:
sighting-photos - Make it Public (toggle "Public bucket")
- Then run
006_create_storage_policies.sqlto set up permissions
- (Optional) Set up pg_cron for
005_schedule_cron.sql
-
Start the development server:
npm run dev- Push your code to GitHub
- Import project in Vercel
- Add environment variables
- Deploy
See .env.example for required variables.
VITE_SUPABASE_URL=https://xxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=xxxxx
# Maps (Leaflet uses OpenStreetMap - no API key needed)
# VITE_MAPBOX_TOKEN=xxxxx
# City Configuration (Oklahoma State)
VITE_CITY_NAME="Oklahoma"
VITE_CITY_SLUG="ok"
VITE_BOUNDS_SW="33.6,-103.0"
VITE_BOUNDS_NE="37.0,-94.4"
VITE_DEFAULT_CENTER="35.4676,-97.5164"
VITE_DEFAULT_ZOOM=8
rocksalt/
├── src/
│ ├── components/ # React components
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utility functions
│ ├── locales/ # i18n translations
│ ├── config/ # Location configuration
│ └── types/ # TypeScript types
├── supabase/
│ └── migrations/ # Database migrations
└── public/ # Static assets
MIT or AGPL-3.0
Rocksalt is a community information-sharing tool. Reporting and viewing public activity is protected speech. This app does not provide legal advice. If you need legal help, contact an immigration attorney or one of the resources listed in the app.