My Secret Santa
Organize your Secret Santa gift exchange with private groups and anonymous messaging
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
AI chatbot that helps young people (16+) find local CQC-registered care homes and start volunteering as dementia befrienders. Replaces Tony's manual phone/email outreach process.檢視完整 README ↗AI chatbot that helps young people (16+) find local CQC-registered care homes and start volunteering as dementia befrienders. Replaces Tony's manual phone/email outreach process.
backend/ FastAPI Python server (chat + LLM tools + nudge cron + dashboard API)
frontend/ Next.js 14 site (landing, onboard form, chat, admin dashboard)
<script> tag drops the whole flow onto any partner website as a floating chat bubble (see below)Partners add the chatbot to their own site with a single line before </body>:
<script src="https://YOUR-FRONTEND-DOMAIN/widget.js" async></script>
This injects a floating launcher button that opens the full YOPEY funnel (onboarding → care-home search → email drafting) inside an iframe served from the YOPEY frontend. Because the iframe runs on YOPEY's own origin, the partner site needs no API keys and no CORS/server changes — and its CSS/JS can't reach into the chat.
https://YOUR-FRONTEND-DOMAIN/widget-demo.htmldata- attributes on the script tag): data-yopey-position
(left/right), data-yopey-label, data-yopey-color, data-yopey-entry
(/chat lets returning visitors resume instead of re-onboarding)The app detects it is framed (via lib/embed.ts) and hides its own page header
so the widget panel shows a single, clean chrome. Note: if you later add
X-Frame-Options or a frame-ancestors CSP to the frontend, allow framing or
the widget will stop loading. Browser third-party-storage limits (notably
Safari) mean a returning visitor may need to onboard again; a single visit
always works end to end.
cd backend
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env with your keys (Gemini, Supabase, Resend, EMAIL_TOKEN_SECRET)
python agent.py
# server now on http://localhost:8000
Sanity check: curl http://localhost:8000/health → {"ok": true}
cd frontend
cp .env.local.example .env.local
# Edit .env.local if your backend isn't on http://localhost:8000
npm install
npm run dev
# open http://localhost:3000
Run this every morning (Railway/Render cron, or system crontab):
cd /path/to/backend && python agent.py --nudge
Example crontab — 9am UTC daily:
0 9 * * * cd /path/to/backend && /path/to/venv/bin/python agent.py --nudge >> nudge.log 2>&1
backend/.env)| Var | Required | Notes |
|---|---|---|
GEMINI_API_KEY | Yes | from aistudio.google.com (new keys start AQ., legacy AIza accepted) — use a billing-enabled project (paid tier excludes data from training) |
SUPABASE_URL | Yes | https://xxxxx.supabase.co |
SUPABASE_KEY | Yes | service_role key |
RESEND_API_KEY | Yes | resend.com — also sends dashboard sign-up codes |
EMAIL_FROM | For nudges | e.g. YOPEY <[email protected]> |
EMAIL_TOKEN_SECRET | Yes | long random string — signs dashboard sessions and email links |
ADMIN_EMAIL_DOMAIN | Optional | email domain allowed to register for the dashboard (default yopey.org) |
ALLOWED_ORIGINS | Yes | comma-separated frontend origins |
CQC_PARTNER_CODE | Optional | from cqc.org.uk if you have one |
PORT | Optional | defaults to 8000 |
frontend/.env.local)| Var | Required | Notes |
|---|---|---|
NEXT_PUBLIC_API_URL | Yes | your backend URL |
Frontend → Vercel
frontend/ directory into VercelNEXT_PUBLIC_API_URL env var pointing to your Railway URLBackend → Railway
backend/pip install -r requirements.txtpython agent.py.env.examplepython agent.py --nudge, schedule 0 9 * * *CB8 8YN), email.users table has: first_name, surname, age, postcode, email.contacts row written when bot logs the email send.UPDATE contacts SET contacted_at = NOW() - INTERVAL '3 days', then run python agent.py --nudge — confirm Resend dashboard shows the email./dashboard, choose "Create an account" with a @yopey.org email, enter the 6 digit code (shown in the backend logs if Resend is unset), then confirm tables populate and "Refresh" works.| Item | Cost |
|---|---|
| Supabase | Free tier |
| Gemini (3.5 Flash chat + grounded search) | ~£5/month for hundreds of conversations; web searches free under 5,000 grounded prompts/month, then $14/1k |
| Vercel | Free tier |
| Railway | ~£5/month for backend + cron |
| Resend | Free (100/day, 3k/month) |
| CQC + postcodes.io APIs | Free |
| Total | ~£10/month |
care_homes Supabase table loaded from the CQC bulk CSV + PostGIS distance queries (sub-100ms searches, no partnerCode needed).