Real time answers from verified humans at any location. Ask anything and earn.
The internet has data oracles. Blockchains have price oracles. We built the human oracle.
Your eyes. Your location. Your knowledge. Right now, someone needs to know what's happening where you are. Horacle lets them ask you — and pays you for answering.
"Is the beach crowded?" — someone at the beach earns $0.05 for saying "Packed, come after 4pm."
"How long is the DMV line?" — someone in line earns $0.05 for saying "45 minutes."
"Did the food truck show up today?" — someone on that street earns $0.05 for saying "Yeah, it's here."
Real humans. Real-time. Real answers. Real money.
No AI hallucinations. No reviews from 6 months ago. No guessing. Just a verified human who's physically there, answering in 10 seconds.
Horacle = Human + Oracle. A real-time intelligence marketplace where verified humans earn micropayments by answering questions about locations they're physically at.
No app answers "what's happening at a place right now?"
| Source | Problem | |--------|---------| | Google Reviews | 6 months old. "Great restaurant!" — but is there a table right now? | | ChatGPT | Hallucinates. Can't know the chef left last month. | | Calling the place | Most don't answer. "Is the parking lot full?" isn't something you call about. | | Social media | Noise. No verified signal. |
Make every human an oracle for their location.
You're at the beach → You're the beach oracle. You're in a queue → You're the queue oracle. You're at a restaurant → You're the restaurant oracle.
Your phone knows where you are. World ID proves you're human. Circle pays you instantly. You earn money from simply being somewhere.
1. Type: "Is the beach crowded right now?"
2. Pick location (GPS or search any place)
3. Horacle finds verified humans within 300m
4. Someone replies in ~10 seconds
5. You pay $0.05 (gasless, via Circle nanopayments)
1. Tap "Start Earning" at any location
2. Background tracking keeps you discoverable (even with app closed)
3. Phone buzzes: "Someone's asking about the beach — $0.05"
4. Reply in 10 seconds
5. $0.05 for 8 seconds = $22.50/hr equivalent
You're not doing extra work. You're already there. Dead time becomes money.
Without proof of human, the system dies. Bots would flood the network with fake answers to farm micropayments. One bot could claim to be at 1000 locations simultaneously.
World ID ensures:
Horacle breaks without World ID. It's not an add-on — it's the foundation.
$0.05 per answer is impossible with traditional payment rails. Stripe charges $0.30 per transaction. Credit card fees exceed the payment.
Circle's x402 nanopayments on World Chain make this viable:
TransferWithAuthorizationUsers need wallets but shouldn't think about wallets. Dynamic provides:
| Layer | Tech | Purpose |
|-------|------|---------|
| Mobile App | React Native + Expo | Native app with background services |
| Identity | World ID 4.0 | Proof of unique human — the oracle must be real |
| Wallet | Dynamic SDK | Embedded wallets + EIP-712 signing |
| Payments | Circle x402 Nanopayments | Gasless $0.05 USDC on World Chain Sepolia |
| Location | expo-location | Background GPS every 15 seconds |
| Geospatial | Supabase + PostGIS | Find oracles within 300m via ST_DWithin |
| Push | Firebase + Expo Notifications | Alert nearby oracles instantly |
| Backend | Express + Node.js | x402-protected endpoints |
┌──────────────────────────────────────────────────┐
│ Expo React Native App │
│ ┌──────┐ ┌──────┐ ┌─────┐ ┌────────┐ ┌───────┐│
│ │ Earn │ │Inbox │ │ Ask │ │Activity│ │Profile││
│ └──────┘ └──────┘ └─────┘ └────────┘ └───────┘│
│ Background Location · Push Notifications │
│ World ID (IDKit) · Dynamic Wallet · x402 Signer│
└───────────────────────┬──────────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌────────────┐ ┌──────────┐ ┌──────────┐
│ Supabase │ │ Express │ │ Circle │
│ + PostGIS │ │ Backend │ │ Gateway │
│ │ │ (x402) │ │ (USDC) │
└────────────┘ └──────────┘ └──────────┘
Open app → Verify with World ID (biometric, one-time)
→ Bridge protocol: AES-GCM encrypted session → deep link to World App
→ Proof verified via World's v4 API
→ One human, one oracle. Forever.
Tap "Start Earning" → GPS captured → live session created
→ expo-location tracks every 15 seconds (even when app is closed)
→ Android foreground service survives app kill
→ PostGIS indexes your position for instant discovery
→ You are now a discoverable oracle.
Type question + pick location
→ App calls x402-protected endpoint → gets 402
→ Dynamic wallet signs EIP-3009 authorization (gasless)
→ Retries with payment signature → Circle settles
→ PostGIS: SELECT oracles WHERE ST_DWithin(location, 300m)
→ Push notification to nearby oracles
→ First oracle answers → earns $0.05
→ Asker sees answer + rates it
Backend cron reads pending earnings from DB
→ Pool wallet deposits into Circle Gateway
→ GatewayClient.withdraw() to each oracle's wallet
→ Circle settles (gasless)
→ Oracles receive USDC
cd horacle
npm install
# Generate pool wallet for payments
npx tsx scripts/generate-wallets.ts
App (.env):
EXPO_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=eyJ...
EXPO_PUBLIC_APP_ID=app_xxx # World Developer Portal
EXPO_PUBLIC_RP_ID=rp_xxx # World ID 4.0
EXPO_PUBLIC_DYNAMIC_ENV_ID=xxx # Dynamic dashboard
EXPO_PUBLIC_POOL_WALLET=0x... # Pool wallet address
EXPO_PUBLIC_API_URL=http://IP:3001 # Backend URL
Backend (backend/.env):
POOL_PRIVATE_KEY=0x... # Pool wallet private key
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_SERVICE_KEY=eyJ...
PORT=3001
Run scripts/setup-db.sql in Supabase SQL Editor.
# Terminal 1 — Backend
cd backend && node index.js
# Terminal 2 — App
npx expo start --dev-client
eas build --profile development --platform android
| Track | Prize | Why Horacle qualifies | |-------|-------|----------------------| | World ID 4.0 | $8,000 | Every oracle is World ID verified. The system breaks without it — bots would farm payments with fake answers. Proof validated server-side via v4 API. World ID is the foundation, not a feature. | | Circle Nanopayments | $6,000 | $0.05 per answer via x402 on World Chain Sepolia. EIP-3009 signed by user's Dynamic wallet. Circle Gateway settles. Gasless for all users. Without nanopayments, per-answer micropayments are economically impossible. | | Dynamic Mobile | $1,667 | Embedded wallet in React Native. Auto-created on signup. EIP-712 signing for x402 payments. USDC deposits to Circle Gateway. The wallet layer that makes payments frictionless. |
Total eligible: $15,667
horacle/
├── app/
│ ├── (auth)/verify.tsx # World ID verification + wallet connection
│ ├── (tabs)/
│ │ ├── index.tsx # Earn — Go Live, stats, location
│ │ ├── inbox.tsx # Incoming questions to answer
│ │ ├── ask.tsx # Ask questions with location search
│ │ ├── activity.tsx # My Questions / My Answers
│ │ └── profile.tsx # Wallet, balance, settings
│ ├── answer/[queryId].tsx # Answer screen (from notification)
│ └── _layout.tsx # Root layout, auth routing, Dynamic WebView
├── lib/
│ ├── worldid.ts # World ID bridge protocol (AES-GCM, pure JS)
│ ├── dynamic.ts # Dynamic wallet client
│ ├── payment.ts # x402 payment signing + fallbacks
│ ├── queries.ts # Question CRUD + push notifications
│ ├── location.ts # GPS tracking + permissions
│ ├── geocode.ts # Place search + reverse geocode (Photon API)
│ ├── auth.ts # User auth persistence (SecureStore)
│ ├── supabase.ts # Database client
│ └── wallet.ts # Wallet management
├── tasks/
│ └── location-task.ts # Background location → Supabase
├── backend/
│ ├── index.js # Express + x402 middleware + push notifications
│ └── batch-settle.js # Daily oracle payout cron
└── scripts/
├── setup-db.sql # Full PostGIS schema + functions
└── generate-wallets.ts # Pool wallet generator
"The internet has data oracles. Blockchains have price oracles. We built the human oracle."
Every human knows something about where they are. Horacle turns that knowledge into real-time intelligence — verified, paid, and instant.
Built at ETHGlobal Cannes 2026
Horacle is a React Native (Expo) app with background location tracking via expo-location's foreground service — GPS syncs to
Supabase every 15 seconds even when the app is killed. PostGIS handles geospatial queries, using ST_DWithin to find verified
humans within 300m of any location in milliseconds.
World ID 4.0 is integrated via the bridge protocol — we implemented AES-GCM encryption in pure JavaScript using @noble/ciphers
(since React Native lacks crypto.subtle), deep-linking to World App and polling for the proof. The v4 verify API validates
proofs server-side, ensuring one unique human per oracle. Without this, bots would farm micropayments with fake answers.
Circle x402 nanopayments handle the economics — $0.05 per answer would be impossible with traditional rails. We built a custom
x402 client that uses Dynamic's embedded wallet to sign EIP-3009 TransferWithAuthorization typed data, sending it to our
Express backend's createGatewayMiddleware. The GatewayWalletBatched scheme on World Chain Sepolia settles payments gaslessly
through Circle's facilitator. Responder earnings are tracked in the database and batch-settled daily via the pool wallet's
GatewayClient.
Dynamic SDK provides embedded wallets in React Native — users get a wallet on signup without MetaMask. The viem extension
handles EIP-712 signing for x402 payments. One notably hacky thing: since Dynamic's MPC wallet doesn't expose raw private keys,
we had to reverse-engineer Circle's x402-batching SDK source to match the exact payment payload format (x402Version, accepted,
payload with authorization + signature, resource) that the BatchFacilitatorClient expects.
Push notifications use Firebase FCM v1 through Expo's push service. The notification tap deep-links directly to the answer
screen with the query ID, so the responder goes from phone buzz to answering in seconds.
The geospatial layer is particularly interesting — we use PostGIS GEOGRAPHY(POINT, 4326) columns with GIST indexes, and custom
SQL functions (find_live_responders, find_nearby_queries, upsert_location) that combine spatial proximity, session status,
location freshness (updated in last 5 minutes), and reputation scores into a single efficient query. The inbox only shows
questions near you, not all questions globally.

