Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Event companion app for indie hacker meetups: check in, post what you're building, and team up with people in the room.
Stack: Next.js 15 (App Router) · TypeScript · Tailwind · Supabase (Postgres, Auth, Realtime, Storage, RLS) · Resend · Creem · Vercel.
supabase/migrations/ in order (0001_init.sql through the highest number).supabase link --project-ref <ref> then supabase db push.https://<your-domain>https://<your-domain>/auth/callback, http://localhost:3000/auth/callbackhttps://<project-ref>.supabase.co/auth/v1/callback, then paste the client ID and secret.media bucket. Nothing else to do.
Tests: psql "$DATABASE_URL" -f supabase/tests/rls_test.sql and supabase/tests/host_test.sql (each runs in a transaction and rolls back).supabase_realtime publication.update profiles set is_admin = true where username = 'your-username';
Copy .env.example to .env.local and fill it in:
| Variable | Where |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase → Project settings → API |
SUPABASE_SERVICE_ROLE_KEY | Same page. Server-only, never expose. |
NEXT_PUBLIC_SITE_URL | Your deployed URL, used for QR codes and emails |
RESEND_API_KEY, EMAIL_FROM | https://resend.com. Emails are skipped when unset. |
CRON_SECRET | Any long random string. Vercel Cron sends it automatically. |
CREEM_API_KEY, CREEM_WEBHOOK_SECRET | Only needed for paid tickets (Creem dashboard) |
CREEM_TEST_MODE | true to use Creem's test API. Automatic for keys starting with creem_test_. |
NEXT_PUBLIC_PAYMENTS_ENABLED | true shows the ticket price field to organizers |
npm install
npm run dev
npx vercel link
npx vercel env add ... # add every variable above for Production
npx vercel --prod
vercel.json registers a daily cron at /api/cron (03:00 UTC; Vercel Hobby allows daily crons only, Pro can switch to hourly). Each run expires requests 48 hours after an event ends, marks finished events as ended, emails going guests a reminder for events starting in the next 36 hours, and sends recap emails. Reminders and recaps are only sent (and events only marked as reminded or recapped) once RESEND_API_KEY is set, so nothing is lost if you add email later. Organizers can also send a recap any time from the event dashboard.
Creem is the merchant of record, so it handles tax and receipts.
CREEM_API_KEY. Use a test key (creem_test_...) first; the app switches to https://test-api.creem.io automatically.https://<your-domain>/api/creem/webhook subscribed to checkout.completed and refund.created, then copy its signing secret into CREEM_WEBHOOK_SECRET.NEXT_PUBLIC_PAYMENTS_ENABLED=true and redeploy so organizers can set a ticket price.supabase/migrations/0004_creem.sql.How it works: the first ticket purchase for an event creates a one-time Creem product at the event's price (a new one is created if the price changes later). POST /api/tickets/checkout creates a checkout with the ticket id as request_id and redirects the attendee. When Creem calls the webhook, the ticket is marked paid and the attendee can check in. Refunds mark the ticket refunded.
Hosts (the event creator plus any co-hosts added on the manage page) can:
Database rules for all of this live in supabase/migrations/0006_host_controls.sql; supabase/tests/host_test.sql covers them.
API routes: POST /api/events/[id]/messages, POST /api/events/[id]/cancel, POST /api/events/[id]/guests/notify.
user_contacts. RLS only lets you read them for yourself or for people you share a project with, which happens through an accepted request or invite.can_view_board).create_join_request and respond_join_request RPCs. These enforce ownership, blocks, one open request per project, 10 requests per event, and event state./ landing · /login · /onboarding · /e/[code] event (Projects / People / My activity) · /e/[code]/board projector · /p/[id] project · /u/[username] profile · /me · /inbox · /space/[id] · /organizer · /organizer/new · /organizer/[id] · /organizer/[id]/poster (printable door poster) · /series/[slug] · /admin