個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A rental app for people who know the feel they want better than the filters. Describe a stay in one sentence ("quiet pet friendly cabin with a hot tub under $300 a night") and get ranked stays back. Ask booking and policy questions about a stay and get the exact text from Roam's own policies. Book with Stripe, or become a host and list your own stay.
Built with Expo (React Native), Expo Router, NativeWind, Clerk, Sanity, Neon Postgres, Stripe, DeepSeek and PostHog.
Roam is a demo. Payments run in Stripe test mode, so no real money moves, and the stays and photos are samples.
Landing page: roam.norbertoignaciojr.dev.
Android: download the APK (about 46 MB, arm64) and install it, allowing installs from your browser or file manager. It talks to the hosted API.
iOS: there is no iOS build to share yet (it needs an Apple Developer account). The screenshots below show the iOS app.
Sign in with the demo account, or create your own with an email:
[email protected] | |
| Password | RoamDemo-2026-Stay |
| New-device code | 424242 |
The demo account is shared, so saved stays and bookings made on it are visible to the next person.
Pay with the Stripe test card 4242 4242 4242 4242, any future expiry, any CVC.
Search and policy questions call a paid model, so there is a daily cap. If it is used up, search falls back to a simpler reading and Ask says to try tomorrow.
| Find | Stay | Book and manage |
|---|---|---|
More: add a stay, manage a stay, settings, personal info, onboarding, sign up, sign in.
The app and its API routes are one Expo project. API routes (src/app/api/*+api.ts) run on EAS Hosting (Cloudflare Workers). Every route verifies the Clerk session and counts the call before doing any work.
flowchart LR
App["Roam app<br/>Expo + Expo Router"] -->|"session token"| API["API routes<br/>EAS Hosting"]
App -->|"public reads"| CDN["Sanity CDN<br/>stays, hosts, policies"]
App -->|"PaymentSheet"| Stripe
App -.->|"events, no text"| PostHog
API --> Clerk["Clerk<br/>auth, saved stays"]
API --> Neon[("Neon Postgres<br/>bookings, holds,<br/>rate limits, daily budget")]
API --> Context["Sanity Context<br/>GROQ search + policy KB"]
API --> Embed["Sanity Dataset Embeddings<br/>soft-intent ranking"]
API --> DeepSeek["DeepSeek<br/>labels the sentence,<br/>picks policy entries"]
API --> Stripe["Stripe<br/>PaymentIntents"]
Stripe -->|"webhook"| API
API -->|"host writes"| Sanity["Sanity API<br/>property, host, policy"]
Repository layout:
| Path | What it is |
|---|---|
src/app/ | Screens (Expo Router) and API routes |
src/components/ | Shared design-system components, shown at /design-system |
src/lib/ | Hooks, search and booking logic, server helpers, database schema |
studio/ | Sanity Studio (the only content schema) and seed scripts |
landing/ | Astro marketing site, separate package.json |
drizzle/ | Postgres migrations |
prompts/ | Plan for each feature, as history |
AGENTS.md | Every decision that is still true |
The full list is in AGENTS.md. The ones that shape the app:
You need your own Clerk, Sanity, Neon, Stripe (test mode) and DeepSeek accounts. Copy the variable names from .env.example into .env (never commit it).
npm install
npx drizzle-kit migrate # create the database tables
npx expo start # press i for the iOS simulator
npx expo lint
npx tsc --noEmit
Native modules (Stripe, SVG) need a development build rather than Expo Go for custom builds: npx expo run:ios.
Content and seed data:
cd studio
npx sanity schema deploy && npx sanity deploy
npx sanity exec scripts/seed.ts --with-user-token
Landing page:
cd landing && npm install && npm run dev
Android APK for testers (EAS):
npx eas-cli@latest build --platform android --profile production-apk
BOOKINGS_LIVE=1.+clerk_test email with a fixed code.