个人 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.