搜尋、收藏、整理你的集換式卡牌。建立專屬卡冊,隨時掌握收藏進度。
訪客可搜尋卡牌;登入後可標記擁有/想要並放入自訂格式的卡冊(binder),支援雙頁展開瀏覽、 拖拉排列格位,以及唯讀公開分享連結。目前涵蓋 Pokémon TCG 與 One Piece TCG(英文 / 日文 / 繁體中文)。 每張卡皆有獨立、可分享、可被搜尋引擎索引的頁面。
🌐 線上服務:https://pocketbindr.app
|
拖拉排列 以 dnd-kit 拖放卡片格位,直覺地重新安排卡冊版面。
|
三語支援 英 / 日 / 繁中,卡牌資料與 UI 皆完整在地化。 繁體中文 ![]() 日本語 ![]() English
|
|
智慧搜尋 卡號格式提示,涵蓋 PTCG 與 One Piece TCG 的編號。
|
|
|
公開分享 產生唯讀公開連結,任何人無需登入即可瀏覽整本收藏。
|
- Next.js 16(App Router, TypeScript)
- Prisma + PostgreSQL(Supabase)
- NextAuth.js v5(Email/密碼 + Google / Discord OAuth)
- Upstash Redis(rate limiting)
- Tailwind CSS + shadcn/ui
- react-hook-form + zod(表單狀態與驗證,前後端共用 schema)
- next-intl(UI 多語言:繁中 / 英 / 日)
- Vitest(單元)+ Playwright(E2E)
- pnpm
需求:Node.js 22+、pnpm、一個 PostgreSQL 資料庫(建議 Supabase)。
# 1. 安裝依賴
pnpm install
# 2. 設定環境變數
cp .env.example .env.local
# 填入你自己的 DATABASE_URL / AUTH_SECRET 等(見下方「環境變數」)
# 3. 套用資料庫 schema
pnpm prisma migrate dev
# 4. 啟動開發伺服器
pnpm dev
# 開啟 http://localhost:3000不需要任何卡牌資料就能開發 登入 / 卡冊 / 設定 / 分享 等功能—— 這些流程在空卡庫下即可運作。卡牌資料的取得見下方「卡牌資料」。
完整清單與說明見 .env.example。重點:
| 變數 | 用途 | 本機開發是否必填 |
|---|---|---|
DATABASE_URL / DIRECT_URL |
PostgreSQL 連線(pooled / 直連) | ✅ |
DATABASE_SSL |
設為 false 關閉 SSL 連線(Supabase 需要 SSL,為預設行為;僅本機/CI 接不支援 SSL 的 disposable Postgres 時使用) |
選填 |
AUTH_SECRET / AUTH_URL |
NextAuth session 簽章與站點 URL | ✅ |
LINK_STATE_SECRET / RESET_TOKEN_SECRET / EMAIL_VERIFY_SECRET |
OAuth 連結、密碼重設、email 驗證(含註冊強制驗證與純 OAuth 補填 email)的 HMAC 簽章密鑰(各自獨立、lazy 載入);EMAIL_VERIFY_SECRET 為 email/password 註冊必經路徑,需先設定否則註冊會失敗 |
選填(EMAIL_VERIFY_SECRET 若要測試 email/password 註冊則必填) |
UPSTASH_REDIS_REST_URL / _TOKEN |
rate limiting | ✅ |
RL_CARDS_SEARCH_LIMIT / _WINDOW、RL_CARDS_READ_LIMIT / _WINDOW |
讀取端防爬限流閾值(/api/cards、/api/cards/[id]、/api/sets);未設用寬鬆預設值 |
選填 |
RL_PREFIX_NAMESPACE |
所有 rate-limit key 的 prefix 前綴,僅供測試環境隔離用(如 CI 併發 run);production 留空 | 選填 |
GOOGLE_* / DISCORD_* |
社群登入(不需要可留空,改用 Email/密碼) | 選填 |
RESEND_API_KEY |
寄送密碼重設信、註冊驗證信、email 補填驗證信、缺卡/bug 回報信;設為 test 可跳過真實寄信 |
選填 |
REPORT_TO_EMAIL |
缺卡/bug 回報的收件信箱 | 選填 |
SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY |
Storage 金鑰:本機維護腳本 + runtime 頭像上傳皆用 | 選填 |
⚠️ .env/.env.local已被.gitignore排除,請勿提交任何真實金鑰。
新 clone 的資料庫是空的。各資料源的取得方式不同:
- PTCG(英文):來自公開的 pokemontcg.io API,無需 API key 即可請求、自行同步。
- PTCG(日文 / 繁中)、One Piece TCG(全語言):來自各官方網站,依賴未隨本專案散布的內部維護腳本, 外部開發者無法直接重建這批資料。
因此若要開發依賴實際卡牌的功能(搜尋、加入卡冊),建議自行匯入少量測試卡牌; 其餘功能在空卡庫下即可開發與測試。卡牌圖片版權屬各發行商所有,本專案不散布任何卡牌圖片。
pnpm test # 單元測試(Vitest)
pnpm test:e2e # E2E 測試(Playwright,會以 production build 啟動站點)
pnpm test:e2e:ui # E2E 互動式 UIE2E 以 pnpm build && pnpm start 啟動正式 build(非 dev mode),並需要可連線的資料庫與必填環境變數。
pnpm test:e2e:seed-cards 會從 committed 的 e2e/fixtures/card-seed.json(精選卡牌子集)冪等灌入資料庫,
供不依賴真實 74k 卡資料集的環境(如 CI 的獨立 Postgres 容器)跑完整套件。
⚠️ E2E 會實際寫入資料庫,請務必指向獨立的測試資料庫,切勿指向正式 / 生產環境。
部署於 Vercel(function region 釘東京 hnd1 對齊 Supabase ap-northeast-1,見 vercel.json)。
正式環境需設定上表所有必填變數,並將 AUTH_TRUST_HOST 設為 true。
歡迎貢獻。請先閱讀 貢獻指南;架構概覽見 ARCHITECTURE.md。 回報安全性問題請見 SECURITY.md。
PocketBindr 是一個免費、開源的 side project。如果它對你有幫助,歡迎請我喝杯咖啡, 幫忙分攤 Supabase / Vercel 的基礎設施費用。
本專案程式碼以 MIT License 授權。
本專案為個人 / 教育用途的卡牌收藏管理工具,與 The Pokémon Company、Nintendo、Bandai 等公司無任何關聯, 亦未獲其授權或贊助。所有卡牌名稱、圖片與相關資料之著作權與商標權均屬各自權利人所有。
服務條款與隱私權政策(繁中 / 英 / 日)請見網站頁尾連結(/terms、/privacy)。






