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
- π Multilingual (English, Spanish, Chinese, Japanese, Vietnamese)
- π Privacy-focused (no tracking, EXIF stripping)
- β‘ Fast and lightweight
- π Easy deployment per city
- Dark mode interface
- More languages
- PWA Push Notifications
- SMS (donation-based?)
No coding experience required! This guide will walk you through deploying Rocksalt for your city or state in about 30-60 minutes.
- A computer with internet access
- A free GitHub account
- A free Supabase account
- A free Vercel account
- About 30-60 minutes of your time
Deploying Rocksalt involves three main steps:
- Set up Supabase - This is your database (where reports are stored)
- Configure for your city - Set your geographic boundaries and city name
- Deploy to Vercel - Make your site live on the internet
Let's get started!
Before you can deploy Rocksalt, you need to find the geographic boundaries (coordinates) for your area. This tells the app which region to cover.
- SW (Southwest) = The bottom-left corner of your coverage area
- NE (Northeast) = The top-right corner of your coverage area
- Coordinates are always in the format:
latitude,longitude - Latitude = How far north/south (positive = north)
- Longitude = How far east/west (negative = west in the US)
This is the easiest method for beginners:
- Go to https://boundingbox.klokantech.com/
- In the top-left, select "CSV" from the dropdown menu
- Use the search box or drag the map to find your city/state
- Click and drag to draw a rectangle around the area you want to cover
- You'll see coordinates appear in the bottom-left box
- The format will be:
west,south,east,north - Convert to our format:
VITE_BOUNDS_SW=south,west(swap the order)VITE_BOUNDS_NE=north,east(swap the order)
Example: If the tool shows -103.0,33.6,-94.4,37.0:
VITE_BOUNDS_SW=33.6,-103.0VITE_BOUNDS_NE=37.0,-94.4
- Go to https://www.openstreetmap.org/
- Navigate to your city/state
- Right-click on the southwest corner (bottom-left) of your coverage area
- Click "Show address" or look at the URL - you'll see coordinates like
lat=33.6&lon=-103.0 - Copy the latitude and longitude:
33.6,-103.0β This is yourVITE_BOUNDS_SW - Right-click on the northeast corner (top-right) of your coverage area
- Copy those coordinates:
37.0,-94.4β This is yourVITE_BOUNDS_NE
- Go to https://www.google.com/maps
- Navigate to your city/state
- Right-click on the southwest corner of your coverage area
- Click the coordinates that appear at the top of the menu
- Copy the coordinates (format:
lat, lng) β This is yourVITE_BOUNDS_SW - Repeat for the northeast corner β This is your
VITE_BOUNDS_NE
- Default Center = The point where the map should start when users first open the app (usually your city center or state capital)
- Default Zoom = How zoomed in the map should be (6 = very zoomed out, 12 = very zoomed in)
- States: Use 6-8
- Cities: Use 10-12
To find your center point:
- Right-click on your city center or capital on any map tool
- Copy the coordinates (lat,long format)
Here are ready-to-use configurations for common areas:
| Location | VITE_BOUNDS_SW | VITE_BOUNDS_NE | VITE_DEFAULT_CENTER | VITE_DEFAULT_ZOOM |
|---|---|---|---|---|
| Oklahoma | 33.6,-103.0 |
37.0,-94.4 |
35.4676,-97.5164 |
8 |
| Los Angeles | 33.7,-118.7 |
34.3,-118.1 |
34.0522,-118.2437 |
11 |
| Texas | 25.84,-106.65 |
36.5,-93.51 |
31.9686,-99.9018 |
6 |
| New York City | 40.49,-74.26 |
40.92,-73.7 |
40.7128,-74.006 |
11 |
| Chicago | 41.64,-87.94 |
42.02,-87.52 |
41.8781,-87.6298 |
11 |
Write down your coordinates - you'll need them in Step 3!
Supabase is a free database service that stores all the sighting reports. Here's how to set it up:
- Go to https://supabase.com
- Click "Start your project" or "Sign up"
- Sign up with your GitHub account (recommended) or email
- Click "New Project" in the Supabase dashboard
- Fill in the details:
- Name: Choose a name like
rocksalt-oklahoma(use your city/state name) - Database Password: Create a strong password and save it somewhere safe (you won't need it often, but keep it!)
- Region: Choose the region closest to your users
- Name: Choose a name like
- Click "Create new project"
- Wait 2-3 minutes for your project to be created
You'll need these for Step 3:
- In your Supabase project dashboard, click "Settings" (gear icon) in the left sidebar
- Click "API" in the settings menu
- Find these two values:
- Project URL - Copy this (looks like
https://xxxxx.supabase.co) - anon public key - Click "Reveal" and copy this long string (starts with
eyJhbGc...)
- Project URL - Copy this (looks like
Save both of these - you'll paste them into Vercel in Step 3!
Migrations are scripts that set up your database tables. You need to run them in order:
- In your Supabase dashboard, click "SQL Editor" in the left sidebar
- Click "New query"
- Open the file
supabase/migrations/001_enable_postgis.sqlfrom this repository - Copy all the text from that file
- Paste it into the SQL Editor
- Click "Run" (or press Ctrl+Enter / Cmd+Enter)
- You should see "Success. No rows returned"
Repeat this process for each migration file in this exact order:
001_enable_postgis.sql- Enables geographic features (what this does: allows the database to work with maps)002_create_tables.sql- Creates the main tables (what this does: sets up tables for storing reports and alerts)003_create_functions.sql- Creates helper functions (what this does: adds functions for finding nearby reports and updating confidence scores)004_create_policies.sql- Sets up security rules (what this does: makes sure only public reports are visible, allows anyone to submit reports)006_create_storage_policies.sql- Sets up photo storage rules (what this does: allows photos to be uploaded and viewed)
Note: Skip 005_schedule_cron.sql - this is optional and requires special setup.
- In your Supabase dashboard, click "Storage" in the left sidebar
- Click "New bucket"
- Name it exactly:
sighting-photos - Important: Toggle "Public bucket" to ON (this allows photos to be viewed)
- Click "Create bucket"
- Now go back to the SQL Editor and run
006_create_storage_policies.sql(if you haven't already)
Great! Your Supabase database is now set up. β
Vercel is a free hosting service that makes your website live on the internet.
- Go to the Rocksalt repository on GitHub
- Click the "Fork" button in the top-right corner
- This creates your own copy of the code that you can customize
What is forking? It's like making a copy of a recipe so you can modify it for your own use.
- Go to https://vercel.com
- Click "Sign Up" and sign up with your GitHub account
- After signing in, click "Add New..." β "Project"
- You'll see a list of your GitHub repositories
- Find your forked
rocksaltrepository and click "Import"
- Project Name: Vercel will suggest a name - you can keep it or change it (e.g.,
rocksalt-oklahoma) - Framework Preset: Vercel should auto-detect "Vite" - leave this as is
- Root Directory: Leave as
./(default)
This is where you'll paste all your configuration. Click "Environment Variables" and add each of these:
| Variable Name | Value | Where to Get It |
|---|---|---|
VITE_SUPABASE_URL |
Your Supabase Project URL | From Step 2, Section 3 |
VITE_SUPABASE_ANON_KEY |
Your Supabase anon key | From Step 2, Section 3 |
VITE_CITY_NAME |
Your city/state name | e.g., Oklahoma or Los Angeles |
VITE_CITY_SLUG |
Short code (no spaces) | e.g., ok or la |
VITE_BOUNDS_SW |
Southwest coordinates | From Step 1 |
VITE_BOUNDS_NE |
Northeast coordinates | From Step 1 |
VITE_DEFAULT_CENTER |
Center point coordinates | From Step 1 |
VITE_DEFAULT_ZOOM |
Zoom level (6-12) | From Step 1 |
Important:
- Don't use quotes around the values (Vercel adds them automatically)
- Make sure there are no spaces before or after your coordinates
- Double-check that your coordinates are in the format
lat,long(notlong,lat)
- Click "Deploy" at the bottom
- Wait 2-3 minutes while Vercel builds and deploys your site
- When it's done, you'll see a green "Success" message
- Click the "Visit" button or the URL shown
- Your Rocksalt site is now live! π
Here's a complete reference of all environment variables:
| Variable | Required | Description | Example |
|---|---|---|---|
VITE_SUPABASE_URL |
Yes | Your Supabase project URL | https://abc123.supabase.co |
VITE_SUPABASE_ANON_KEY |
Yes | Supabase anonymous/public key | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... |
VITE_CITY_NAME |
Yes | Display name for your area | Oklahoma |
VITE_CITY_SLUG |
Yes | Short code (lowercase, no spaces) | ok |
VITE_BOUNDS_SW |
Yes | Southwest corner coordinates (lat,long) | 33.6,-103.0 |
VITE_BOUNDS_NE |
Yes | Northeast corner coordinates (lat,long) | 37.0,-94.4 |
VITE_DEFAULT_CENTER |
Yes | Map center point (lat,long) | 35.4676,-97.5164 |
VITE_DEFAULT_ZOOM |
Yes | Initial zoom level (6-12) | 8 |
No problem! You can update your environment variables in Vercel anytime:
- Go to your project in Vercel
- Click "Settings" β "Environment Variables"
- Edit the variable and save
- Click "Redeploy" - your changes will be live in 2-3 minutes
Free! Both Supabase and Vercel offer generous free tiers that are sufficient for most cities:
- Supabase Free Tier: 500 MB database, 1 GB file storage, 2 GB bandwidth
- Vercel Free Tier: Unlimited deployments, 100 GB bandwidth
For larger cities with heavy traffic, you may eventually need paid plans, but the free tiers are perfect to get started.
Yes! After deploying, you can customize the resources shown in the app by editing src/config/city.ts in your GitHub repository. The resources array contains the links shown in the "Resources" tab.
Rocksalt currently supports English, Spanish, Chinese, and Japanese. To add more languages:
- Add translation files in
src/locales/[language-code]/translation.json - Update
src/i18n.tsto include the new language - Update
src/components/LanguageSwitcher.tsxto add the language option - Commit and push to GitHub - Vercel will automatically redeploy
Yes! If you have Node.js installed:
- Clone your forked repository
- Run
npm install - Create a
.envfile with your environment variables (see.env.example) - Run
npm run dev - Open
http://localhost:5173in your browser
Check the Vercel deployment logs:
- Go to your project in Vercel
- Click on the failed deployment
- Check the "Build Logs" tab for error messages
- Common issues:
- Missing environment variables
- Incorrect coordinate format
- Supabase credentials are wrong
- Found a bug or have a question? Open an issue on GitHub Issues
- Want to contribute? Pull requests are welcome!
- Need help with deployment? Check the FAQ above or open a GitHub issue
- Frontend: React + Vite + TypeScript
- Styling: Tailwind CSS + shadcn/ui
- Maps: Leaflet + OpenStreetMap
- Backend: Supabase (PostgreSQL + PostGIS + Realtime)
- i18n: react-i18next
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
# Start development server
npm run devrocksalt/
βββ 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.