Join the Agent Deck Discord Server!
Discord에서 Agent Deck 커뮤니티 확인, 357명과 자유 음성·텍스트 채팅 이용
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AI companion chat platform. Users sign up, chat with AI personas, buy credits or
subscribe, and spend credits on messages, AI selfies, and voice notes. Admins
manage users, payments, credits, and personas from an in-app console.
Stack: TanStack Start (React 19 + TypeScript) · TailwindCSS · Supabase
(Postgres + Auth) · Authorize.Net · Vercel.
Copy .env.example → .env.local. On Vercel, set the same keys under
Project Settings → Environment Variables (Production and Preview).
VITE_* vars are inlined into the client bundle at build time — they must be
present when Vercel runs the build.README 전문 보기 ↗AI companion chat platform. Users sign up, chat with AI personas, buy credits or subscribe, and spend credits on messages, AI selfies, and voice notes. Admins manage users, payments, credits, and personas from an in-app console.
Stack: TanStack Start (React 19 + TypeScript) · TailwindCSS · Supabase (Postgres + Auth) · Authorize.Net · Vercel.
npm install
cp .env.example .env.local # then fill in the values (see §2)
npm run dev # http://localhost:3000
Other scripts:
| Command | What it does |
|---|---|
npm run build | Production build (Vercel/Nitro output) |
npm test | Run the vitest suite once |
npm run test:watch | Watch mode |
npm run lint | ESLint |
npm run format | Prettier write |
Copy .env.example → .env.local. On Vercel, set the same keys under
Project Settings → Environment Variables (Production and Preview).
VITE_* vars are inlined into the client bundle at build time — they must be
present when Vercel runs the build.
| Var | Scope | Notes |
|---|---|---|
VITE_SUPABASE_URL | client | Public project URL |
VITE_SUPABASE_PUBLISHABLE_KEY | client | Public (anon-equivalent) key |
SUPABASE_URL | server | Same URL, server runtime |
SUPABASE_PUBLISHABLE_KEY | server | Public key, server runtime |
SUPABASE_SERVICE_ROLE_KEY | server only | Full DB access. No VITE_ prefix. Never expose. |
OPENROUTER_API_KEY | server only | Powers chat replies. Use an NSFW-permitting model. |
OPENROUTER_MODEL | server only | Optional. Default sao10k/l3.1-euryale-70b. |
OPENAI_API_KEY | server only | Powers selfies (image) + voice notes (TTS). |
OPENAI_IMAGE_MODEL / OPENAI_TTS_MODEL | server only | Optional overrides (defaults gpt-image-1 / gpt-4o-mini-tts). |
AUTHORIZE_NET_API_LOGIN_ID | server | Also returned to client for Accept.js (public) |
AUTHORIZE_NET_CLIENT_KEY | server | Returned to client for Accept.js (public) |
AUTHORIZE_NET_TRANSACTION_KEY | server only | Secret. Never sent to client. |
AUTHORIZE_NET_SIGNATURE_KEY | server only | Webhook HMAC secret. |
Security:
.env*is gitignored. OnlyAPI_LOGIN_IDandCLIENT_KEYreach the browser (required by Authorize.Net Accept.js). The transaction key, signature key, and service-role key are used exclusively inside server functions (*.functions.ts) and the webhook, viasrc/integrations/supabase/client.server.ts.
supabase link --project-ref <your-ref>
supabase db push
Migrations live in supabase/migrations/. They create: profiles,
companions (personas), user_personalities, conversations, messages,
credit_balances, transactions, credit_ledger, subscription_events,
user_roles, and the handle_new_user trigger that provisions a profile +
25 free credits on signup.main deploy to production.npm run build, output handled by the
Nitro/Vercel preset (see vercel.json).https:// loads and the cert is valid.Post-deploy smoke test: sign up → chat sends → buy a small credit pack →
credits increase → open /history → open /admin as an admin.
payments.functions.ts is the live
endpoint).authCaptureTransactions. Subscriptions use
ARB (recurring) via ARBCreateSubscriptionRequest.https://<your-domain>/api/public/authnet-webhook and subscribe to
net.authorize.customer.subscription.* and
net.authorize.payment.authcapture.created. The endpoint verifies the
X-ANET-Signature HMAC-SHA512 header against AUTHORIZE_NET_SIGNATURE_KEY.Admin access is gated by the user_roles table + has_role() RPC. The first
admin must be set manually (an admin can promote others afterward). In the
Supabase SQL editor:
insert into public.user_roles (user_id, role)
values ('<auth-user-uuid>', 'admin')
on conflict do nothing;
Then visit /admin (only visible to admins; others see "Admins only").
/admin)Users tab
+50 / +200 / +1000 / Zero) — logged as a transaction.Personas tab
CHECK constraint).Personas are rows in the companions table — not hardcoded. Edit them in the
Personas tab (§6). Setting Inactive hides a persona from the public catalog
(RLS returns only status = 'active' to end users; admins see all via the
service-role client). Language defaults to en; see src/lib/languages.ts for
the supported set (en, es, pt, ja, fr, de) — the foundation for future
translation.
src/lib/credits.ts).transactions (money) and credit_ledger (running balance). Declined charges
are recorded with status = 'failed'.OUT_OF_CREDITS when
empty (src/lib/chat.functions.ts, src/lib/media.functions.ts).Moderation is a reusable server-side layer (src/lib/safety.ts,
screenUserMessage) applied before any AI call — not in UI components. It
blocks minor-related and other prohibited/illegal requests and returns a
BLOCKED_CONTENT error. Every persona is 18+ (enforced by the DB constraint and
the admin form).
npm test runs the vitest suite (credit math, catalog integrity, Authorize.Net
success/decline parsing, webhook signature verification, moderation, languages,
and an end-to-end wallet+payment flow).
Manual QA checklist: signup · login · logout · protected routes (/me,
/admin) · user dashboard · admin console · subscription flow · credit purchase ·
credit deduction · /history · mobile responsiveness · browser check · console
errors · broken links.
A full live-Supabase e2e (browser-driven auth/protected-route tests) needs
supabase start(Docker) + Playwright and is not included in the unit+integration suite.
src/
routes/ file-based routes (auth, browse, chat, credits, history, me, _authenticated/admin)
lib/ server functions (*.functions.ts) + pure helpers (credits, authnet, safety, languages)
integrations/supabase/ client (browser), client.server (service role), auth middleware, types
supabase/migrations/ schema, RLS, triggers, seed data