尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A crowdsourced metro map of café wifi speeds. Cafés are stations. The three lines are speed tiers, not geography.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A metro map of the best places to get coffee and get online. Live in London, Nairobi, and San Francisco.
Built for the Nimiq Pay Mini Apps Competition.
Lattency is a crowdsourced metro map of workable coffee spots — cafés, coworking spaces, hotel lobbies, and anywhere else you can sit down with a coffee and a laptop. Venues are stations. The three lines are speed tiers: Express (≥50 Mbps), Local (10–49 Mbps), and Suspended (<10 Mbps).
The engine works everywhere. The first three boards are London, Nairobi, and San Francisco — switch cities from the nav or deep-link directly to /london, /nairobi, or /sf.
| Layer | Choice | Why |
|---|---|---|
| Backend | Base44 (entities, auth, Deno functions) | Free backend with built-in auth, DB, and hosting — no infra to manage |
| Frontend | Next.js 16.3 on Vercel (App Router, RSC, ISR) | Multi-city SSG, schematic/geographic map, realtime Base44 subscriptions |
| Network | Base44 SDK via @base44/sdk | Serverless-safe — the SDK client is shared across invocations |
| Payments | Nimiq Pay via @nimiq/mini-app-sdk | Contributors earn NIM for verified speed tests; sponsors fund bounties |
A finished Mini App inside Nimiq Pay where anyone in a live city can:
The speed test is the trust mechanism. The NIM reward is the growth mechanism. The map is the product.
We believe the best data about a workspace comes from someone who is physically there. Lattency turns that private experience into a public good:
We started with cafés. The engine supports cafés, coworking spaces, hotel lobbies, libraries, and hybrid venues. We call them all stations.
AI agents cannot walk into a café and run a speed test. They need a trusted, verified, real-time source of physical-world infrastructure data to make decisions for their human users.
Lattency is a physical-world oracle for the agentic era. We don't build the agent — we build the ground-truth layer that agents consume.
app/
├── page.tsx # Root redirect → /london (carries query params)
├── [city]/page.tsx # Dynamic city route (London / Nairobi / SF), SSG
├── tour/ # Story page + self-running product-loop reel
├── cafes/[slug]/ # Per-venue standalone page
├── partners/ # Sponsorship / bounty dashboard
├── me/ # Contributor profile + payout rail
├── opengraph-image.tsx # OG image (1200×630, "Live in 3 cities")
├── api/cafes/ # POST /api/cafes (create venue + first measurement)
├── api/cafes/near # GET nearby venues (Haversine filter)
├── api/cafes/[id] # GET venue detail + stats
├── api/measurements # POST /api/measurements
├── api/bounties/claim/ # NIM payout flow
└── api/speedtest/ # download.bin, upload sink, whereami
base44/ # Base44 backend config
├── entities/
│ ├── Cafe.json # Venue entity schema
│ ├── Measurement.json # Speed measurement schema
│ ├── Sponsorship.json # Sponsor schema
│ └── Bounty.json # Bounty schema
├── functions/ # 7 Deno backend functions (service role)
└── agents/
└── workspace_concierge.jsonc # AI concierge agent
components/
├── top-nav.tsx # Sticky nav (multi-city links)
├── map-shell.tsx # SVG schematic ↔ Leaflet geographic map, optimistic pins, trail
├── live-map.tsx # Realtime wrapper (Measurement.subscribe)
├── city-switcher.tsx # Split-flap multi-city selector
├── station-directory.tsx # List + filter + geolocation
├── cafe-detail.tsx # Venue detail drawer
├── cafe-page.tsx # Per-venue page
├── cafe-contribution-form.tsx # Add a new venue flow + immediate tier verdict
├── measurement-form.tsx # In-browser speed test
├── bounties-board.tsx # City-aware sponsor-funded bounties
├── concierge-chat.tsx # AI oracle drawer
├── ai-venue-summary.tsx # Auto-generated editorial one-liner
├── map-toast.tsx # Shared toast system (arrival, promotion)
├── onboarding-overlay.tsx # First-visit coach ticket
└── loop-storyboard.tsx # Self-running product reel (SVG animation)
lib/
├── base44.ts # Base44 SDK client singleton
├── base44-data.ts # Data-access layer
├── cafes.ts # Read path + mock fallback
├── cities.ts # City registry (London, Nairobi, SF)
├── cafe-metadata.ts # Workspace metadata vocabulary
├── map-data.ts # Tier paths, waypoints, TIER_USE, tierForDown()
├── measurements.ts # Shared insert path
├── rate-limit.ts # Rate-limiting + outlier logic
├── speedtest.ts # In-browser speed test
├── bounties.ts # City-aware bounty logic
├── mock-cafes.ts # Bundled fallback (33 stations, 3 cities)
└── types.ts # Shared types
hooks/
├── use-personal-trail.ts # localStorage per-city contributed stations
└── use-realtime-cafes.ts # Measurement.subscribe wrapper
Cafe entity)| Field | Type | Notes |
|---|---|---|
name | string | Required |
neighbourhood | string | e.g. "Shoreditch" |
latitude | number | Required |
longitude | number | Required |
venue_type | string | cafe, coworking, hotel-lobby, library, hybrid |
vibe | string | Short editorial descriptor |
city | string | Default "london" |
price_tier | string | budget, mid, premium |
milk_options | array | e.g. ["oat", "soy"] |
power_outlets | boolean | Are outlets available? |
seating | string | bar, tables, lounge, mixed |
noise_level | string | quiet, moderate, loud |
table_space | string | small, standard, large |
wifi_network | string | SSID or password hint |
photo_url | string | Base64 data URL |
| Field | Type | Notes |
|---|---|---|
cafe_id | string | Required — Venue entity ID |
down_mbps | number | Required |
up_mbps | number | Required |
latency_ms | number | Required |
jitter_ms | number | |
loss_pct | number | |
measured_at | datetime | |
time_bucket | string | morning, afternoon, evening |
photo_url | string | |
test_method | string | manual, browser-auto |
target_server | string | Edge region id |
device_type | string | Derived from User-Agent |
contributor_ip_hash | string | Hashed for rate-limiting only |
is_outlier | boolean | Flagged by stats function |
contributor_user_id | string | Base44 User ID |
Contributors earn NIM for verified speed tests that complete sponsor-funded bounties. The flow:
NIM is the default reward token. USDT on supported EVM chains can be added later.
pnpm install
npx base44 create # scaffold or link the Base44 backend
npx base44 entities push # deploy entity schemas
npx base44 functions deploy # deploy geo-filter + stats functions
pnpm dev # random high port (see AGENTS.md)
Type-check the whole project:
pnpm exec tsc --noEmit
Run the smoke suite:
pnpm test
pnpm build
vercel --prod
npx base44 deploy
MIT