A community-driven, open-source directory of physical crypto exchange shops worldwide. Find trusted locations to safely trade BTC, ETH, USDT, and other cryptocurrencies for cash near you.
Live at: justzappit.xyz
Part of the Zapp ecosystem.
While centralized and decentralized online exchanges dominate the crypto space, there remains a strong need for physical, in-person locations to trade crypto for fiat (and vice versa). Finding reliable, verified physical crypto desks, OTC counters, or teller shops is difficult.
JustZappIt solves this by crowdsourcing and verifying physical crypto locations globally. We prioritize privacy, accuracy, and community moderation.
- Interactive Global Map: Built with Leaflet and OpenStreetMap for fast, privacy-respecting mapping.
- Community Verification: Users can confirm or flag stores. Markers change color based on their verification score.
- Privacy-First Anti-Spam: Honeypots, time-traps, and SHA-256 IP hashing. We never store raw IP addresses.
- Responsive Design: Seamless experience across desktop and mobile devices.
We are continuously evolving JustZappIt. Here is our high-level roadmap:
- Phase 1: Core Directory & Map — Initial dataset, interactive map, and basic filtering.
- Phase 2: Community Moderation — Ability for users to submit, confirm, and flag stores. Privacy-preserving anti-spam measures.
- Phase 3: Store Operator Claiming — Allow shop owners to verify ownership, update operating hours, and list live rates.
- Phase 4: Ratings & Written Reviews — Let users leave detailed feedback on their trading experience.
- Phase 5: Localized Store Chats — "Join Store Chat" feature for real-time peer-to-peer discussions and OTC rate checking.
- Phase 6: Mobile Application — Dedicated native iOS and Android apps.
- Framework: Next.js 14 (App Router)
- Database & Auth: Supabase (PostgreSQL + Row Level Security)
- Styling: Tailwind CSS
- Mapping: Leaflet + React-Leaflet
- Icons: Lucide React
JustZappIt uses Supabase (hosted PostgreSQL) as its database.
- Go to supabase.com and create a free account.
- Create a new project. Note your Project URL, anon (public) key, and service_role (secret) key from Project Settings → API.
Apply the SQL migrations in order using the Supabase SQL Editor (SQL Editor → New Query) or the Supabase CLI:
# If using the Supabase CLI:
supabase db pushOr manually run each file in the SQL Editor:
supabase/migrations/001_schema.sql— Core tables (stores, votes, submissions), indexes, triggers, RLS policiessupabase/migrations/002_split_contact.sql— Splitscontactcolumn intophoneandemailsupabase/migrations/003_rate_limits.sql— Rate limiting tablesupabase/migrations/004_atomic_rate_limit.sql— Atomic rate-limit RPC function
To populate the database with the initial store dataset:
cp .env.example packages/db/.env
# Fill in your Supabase URL and service role key
npm run seedThis reads from the source spreadsheet, geocodes addresses via Nominatim, and inserts stores into your Supabase project.
Copy the example env file and fill in your Supabase credentials:
cp .env.example apps/web/.env.localSee .env.example for the full list of required variables.
We welcome contributions of all sizes! Whether it's adding new features, fixing bugs, or improving documentation, your help is appreciated.
-
Fork & Clone
git clone https://github.com/your-username/justZappIt.git cd justZappIt npm install --workspace=apps/web -
Environment Variables For UI and frontend development, you can run the app using our public staging environment (if available) or mock data. Copy the example env file:
cp .env.example apps/web/.env.local
Note: If you are working on features that require database access, please reach out to the core team via issues/discussions to coordinate.
-
Run the Dev Server
cd apps/web npm run devOpen http://localhost:3000 to view the app.
- Fork the repository.
- Create a new branch (
git checkout -b feature/amazing-feature). - Commit your changes (
git commit -m 'Add some amazing feature'). - Push to the branch (
git push origin feature/amazing-feature). - Open a Pull Request.
Please ensure your code follows the existing style and that the Next.js build succeeds (npm run build) before opening a PR.
For developers working on the UI, here is how our map markers are color-coded based on community trust:
| Marker | Status | Meaning |
|---|---|---|
| 🟢 Green | seed_confirmed |
Verified in original research |
| 🔵 Blue | community_verified |
3+ community confirmations |
| 🟡 Yellow | seed_partial / unverified |
Incomplete or newly added |
| ⚫ Grey | Any + is_approximate |
City-centre estimate (needs exact address) |
| 🟠 Orange | flagged |
3+ issue reports |
| (hidden) | closed |
Toggle "Show closed" in filters to reveal |
JustZappIt is a community-driven, crowdsourced directory. The information provided on this platform (including store locations, operating hours, and accepted cryptocurrencies) is submitted by users and is not independently verified by the core team.
- Use at your own risk: Always conduct your own research and exercise extreme caution when visiting physical locations or executing peer-to-peer/over-the-counter (OTC) trades.
- No Liability: The creators, contributors, and maintainers of JustZappIt are not responsible or liable for any lost funds, scams, physical harm, or inaccuracies related to the locations listed on this platform or the use of this software.
- Not Financial Advice: Nothing in this project constitutes financial, legal, or investment advice.
This project is open-source and available under the GNU Affero General Public License v3.0 (AGPL-3.0).
This means you are free to use, modify, and distribute the code. However, if you modify it and deploy it as a network service, you must make your modified source code available to users of that service under the same license.