尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證ReviewRank — trusted local business discovery app
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Find the places locals trust most — ranked by real customer reviews, not paid placements.
Built with Next.js 15 · Deployed on Vercel · Native mobile via Capacitor (iOS + Android).
Smart Score = rating × log₁₀(review_count + 1)
ReviewRank uses Capacitor's server.url mode: the native apps load the deployed
Vercel URL inside a native WebView. The Google Places API key stays protected on the
server. App updates go live the moment you deploy to Vercel — no new App Store release
required for content changes.
Open http://localhost:3000.檢視完整 README ↗Find the places locals trust most — ranked by real customer reviews, not paid placements.
Built with Next.js 16 · Tailwind CSS 4 · Deployed on Vercel · Native mobile via Capacitor (iOS + Android).
Smart Score = rating × log₁₀(review_count + 1)
ReviewRank uses Capacitor's server.url mode: the native apps load the deployed
Vercel URL inside a native WebView. The Google Places API key stays protected on the
server. App updates go live the moment you deploy to Vercel — no new App Store release
required for content changes.
[iOS App / Android App]
│
Capacitor WebView
│
https://your-app.vercel.app ← Next.js on Vercel
│
/api/places ──────── Google Places API (key server-side only)
/api/lead-request ── Supabase
| Tool | Version | Notes |
|---|---|---|
| Node.js | 24.x | Use .nvmrc; npm 11.6.2+ (11.x) |
| Xcode | 15+ | macOS only, required for iOS |
| Android Studio | Hedgehog+ | Required for Android |
| Vercel account | — | Free tier works |
| Apple Developer Program | $99/year | Required for App Store |
| Google Play Console | $25 one-time | Required for Play Store |
nvm install
nvm use
npm ci
# Create .env.local with development/staging credentials only if you need live integrations.
npm run dev
Open http://localhost:3000.
The committed lockfile uses Next.js 16.4.1 (including patched PostCSS 8.5.23),
Tailwind / its PostCSS plugin 4.3.3, root PostCSS 8.5.30, Vitest 5.0.5, and
coordinated Capacitor 8.5.3 packages. React 18 is retained within Next's published
peer range. Explicit Webpack flags preserve the established bundler rather than
also adopting Next 16's default Turbopack migration. The admin request gate uses
Next 16's proxy.ts convention; server-page authorization remains in place.
Tests use Vitest's Oxc JSX transform; no Tinypool dependency remains.
npm ci
npm run typecheck
npm test
npm run verify:native-toolchain
npm run verify:build
npm run verify:smoke
verify:build performs a production-mode compilation with application/provider
credentials blanked before dotenv loading, Next telemetry disabled, and Node
fetch/http/https restricted to loopback and Google Fonts. Its self-test verifies
the restrictions without contacting a provider. This is not an operating-system
network sandbox: direct sockets and native clients are outside the interception.
It allows font downloads but is not intended to exercise live integrations.
Verification uses one build/render worker; normal deployments retain Next's defaults.
Do not deploy its credential-free output; normal deployments use npm run build
with the separately approved environment.
On 2026-10-15, npm audit --package-lock-only changed from 36 flagged dependency
entries (6 critical, 14 high, 16 moderate) to 12 (0 critical, 6 high, 6 moderate).
This follow-up removes the vulnerable Tailwind globbing chain and upgrades
Next's bundled PostCSS through supported parent releases, not forced transitive
overrides. That follow-up left 3 moderate entries, 0 high and 0 critical in
Capacitor CLI's Xcode/UUID chain. Counts include inherited/metavulnerability
entries, not distinct exploits.
The native-toolchain follow-up retains coordinated Capacitor 8.5.3 and Xcode
3.0.1, whose latest published releases still request UUID 7. A narrowly scoped
[email protected] override selects UUID 11.1.1, the latest CommonJS-capable 11.x
release and the patched threshold for GHSA-w5hq-g745-h8pq. It intentionally
exceeds Xcode's declared UUID range: compatibility must be checked, not assumed.
Xcode uses synchronous require('uuid').v4(); a blind upgrade to the latest
ESM-only UUID release is not the chosen compatibility strategy. Remove/revisit
the override when Xcode declares a supported patched dependency or either
parent changes. No other UUID consumers are overridden.
verify:native-toolchain checks actual CLI-to-Xcode-to-UUID resolution, UUID
buffer bounds and ID generation, the real Capacitor Swift-file registration
helper against a temporary copy of the tracked Xcode project, idempotency and
CLI startup. It does not write the original project, run native sync, compile,
sign or distribute an app. Provider credentials are stripped and the same
Node network guard is installed. This is API/project-file compatibility
coverage, not macOS/Xcode or device QA.
The 2026-10-15 locked audit reports zero findings at every severity after
this fix; the three moderate inherited entries are removed.
CI audits all severities (--audit-level=info) without suppressing findings.
Always rerun the current audit; a zero report is not proof that every dependency
is vulnerability-free. Issue #15 remains open for overall release verification.
next lint was removed in Next 16; no lint command is advertised until an ESLint
configuration is supplied.
After the guarded build, verify:smoke starts only a loopback server with the
same credential-stripping network guard. It verifies homepage SSR/security
headers, fail-closed admin proxy behavior, short-input autocomplete (which
returns before database/provider access), API no-store headers, and immutable
static-asset caching. It does not exercise paid/live-provider workflows.
Tailwind 4 raises the styling baseline to Safari 16.4+, Chrome 111+ and Firefox 128+. Confirm that this is acceptable for the supported audience before merging/deploying; older iOS WebViews can otherwise lose styling. Native device QA remains required. Compatibility CSS preserves legacy brand/named colors, shadows, focus outlines, responsive utilities and safe-area precedence. Automated CSS checks are not a substitute for real-device search/detail/forms/travel and Stripe test-mode verification. Cache keys, retention policy, provider-fetch code and lead-matching logic are unchanged.
Admin pages also revalidate Basic Auth on the server before fetching private records, rather than relying exclusively on middleware matching.
Updating Capacitor packages does not patch installed mobile apps. An approved native sync, signed rebuild, device testing, and redistribution are still needed; no mobile release is performed by these verification commands.
| Variable | Required | Description |
|---|---|---|
GOOGLE_PLACES_API_KEY | Yes | Google Cloud Places API key |
NEXT_PUBLIC_SUPABASE_URL | No | Supabase project URL |
SUPABASE_SERVICE_ROLE_KEY | No | Supabase service role key |
ADMIN_SECRET | No | Secret for /admin/* pages |
CAPACITOR_SERVER_URL | Mobile | Vercel URL loaded by the native app |
The Capacitor mobile app loads your Vercel URL — deploy the web app first.
npm install -g vercel
vercel login
vercel --prod
Note the URL (e.g. https://reviewrank-abc123.vercel.app).
Set all environment variables in the Vercel dashboard under Project → Settings → Environment Variables.
Edit capacitor.config.ts and replace your-app.vercel.app with your real Vercel URL.
npx cap add ios
npx cap add android
npm run cap:sync
npm run cap:ios # opens Xcode
In Xcode:
Team & signing — select your Apple Developer team in Signing & Capabilities
Bundle ID — must match appId in capacitor.config.ts (com.reviewrank.app)
Location permissions — verify these keys exist in ios/App/App/Info.plist
(the Geolocation plugin adds them, but check the description strings):
<key>NSLocationWhenInUseUsageDescription</key>
<string>ReviewRank uses your location to find trusted businesses near you.</string>
App icons — see public/assets/icons/README.md to generate all required sizes
Archive — Product → Archive → Distribute App → App Store Connect
Upload via Xcode Organizer → Distribute → App Store Connect. Then invite testers from App Store Connect → TestFlight.
npm run cap:android # opens Android Studio
In Android Studio:
App ID — matches appId in capacitor.config.ts (com.reviewrank.app)
Location permissions — verify these exist in android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
App icons — see public/assets/icons/README.md to generate adaptive icons
Signing — Build → Generate Signed Bundle/APK → Android App Bundle (.aab)
Upload — Google Play Console → Create app → Production → Upload AAB
| Change type | Steps |
|---|---|
| UI / content / ranking logic | Push to main → Vercel auto-deploys → users see it immediately |
| New Capacitor plugin | npm install @capacitor/plugin → npx cap sync → rebuild in Xcode/Android Studio → submit new binary |
| App name, icon, permissions | Update config → npx cap sync → rebuild and submit new binary |
See public/assets/icons/README.md for source file requirements and generation steps.
Quick reference:
npm install -D @capacitor/assets
npx capacitor-assets generate --assetPath public/assets/icons
review-rank/
├── app/
│ ├── api/ Server-side API routes (Places, leads, reports)
│ ├── business/[id]/ Business detail page
│ ├── results/ Search results page
│ ├── admin/ Admin panels (leads, report requests)
│ └── page.tsx Homepage
├── components/ Shared UI components
│ ├── NavLogo.tsx Logo mark — single source of truth
│ ├── BusinessCard.tsx Search result card with quote CTA
│ ├── QuoteButton.tsx Lead capture modal
│ └── SearchForm.tsx Search form with Capacitor Geolocation
├── lib/
│ ├── places.ts Google Places API client
│ ├── ranking.ts Smart Score + trust tier logic
│ └── types.ts TypeScript types
├── public/
│ ├── assets/icons/ Source images for app icons and splash screens
│ └── favicon.svg Browser favicon (copper pin mark)
├── supabase/migrations/ Database schema
├── capacitor.config.ts Capacitor configuration
├── next.config.ts Next.js config (CSP, image domains)
└── .env.production Environment variable template
| Command | Description |
|---|---|
npm run dev | Start development server |
npm run build | Production build |
npm run start | Start production server |
npm run cap:sync | Sync Capacitor config and plugins |
npm run cap:ios | Open iOS project in Xcode |
npm run cap:android | Open Android project in Android Studio |
npm run cap:copy | Copy web assets to native projects |
GOOGLE_PLACES_API_KEY in Vercel environment variablesUsed for lead requests (/api/lead-request) and report submissions (/api/report-request).
supabase/migrations/0002_business_report_requests.sqlsupabase/migrations/0003_leads.sqlNEXT_PUBLIC_SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY in Vercel