Join the Agent Deck Discord Server!
Check out the Agent Deck community on Discord – hang out with 357 other members and enjoy free voice and text chat.
Talk, flirt, and connect with the AI companion of your choice. Custom selfies, voice notes, and roleplay. 25 free messages.
SocialTypeScript · PLpgSQLGitHub @HumancrushAiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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