Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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