Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The campus event platform: discover events, RSVP, plan your week, chat with attendees, and ask an AI assistant what's on.
Campus events are scattered across WhatsApp groups, posters and emails, so students miss things and clubs can't tell who's coming. Syncronify puts them in one place:
• Students find events, RSVP in one tap, keep a personal calendar and chat with other attendees.
• Clubs publish events, manage registrations and waitlists, and check people in at the door.
• Admins approve which clubs can publish and keep the platform tidy.README 전문 보기 ↗Sync puts every campus event in one place: students find events, RSVP in one tap and plan their week; clubs publish events, manage waitlists and check people in at the door. One feed instead of forty WhatsApp groups.
Live app: https://sync-campus.vercel.app (press Sign in, then a one-click Member, Organizer or Admin button)
Campus events are announced in WhatsApp groups, on posters and in emails. So nobody has the whole picture:
Sync is the single list. Students get a feed, a calendar and a ticket. Clubs get registrations, a waitlist that runs itself and a door check-in. Admins decide which clubs may publish.
Every account, and a script of things to try with each, is in TEST_ACCOUNTS.md.
| Screen | What it does |
|---|---|
| Home | Your tickets, recommendations from your interests and what's popular, and unread notifications. |
| Explore | Search and filter public events by category and date, sorted by soonest or most popular. RSVP in one tap; a full event puts you on the waitlist instead of turning you away. |
| Event page | Details, venue map, seats left, organizer, an "Add to calendar" file, the event chat and, once it has ended, a rating. Server-rendered, so a shared link shows a real preview. |
| Schedule | A calendar of everything you are attending, waitlisted for, organising or planned privately. Click a day to add a private plan. Your QR entry code lives here. |
| Chats | One chat per event, open to its attendees. Organizer announcements notify everyone going. |
| Notes | Personal sticky notes, optionally linked to an event; pin the ones that matter. |
| Map | Venues on an OpenStreetMap map, with place search. |
| Ask Sync | An AI assistant that answers from live event data and your own calendar, and replies with real event cards. It can only read. |
| Organizer console | Create, edit, publish and cancel events; stats; the attendee list with CSV export; door check-in by QR scan; and The team: invite co-organisers and door staff to a single event. |
| Admin console | Users (roles, suspension), organizer applications to approve or reject, and the queue of events members have reported. |
| Settings | Profile, interests, email notifications, theme and password, and where a member applies to become an organizer. |
Ctrl+K opens a command palette from anywhere in the app.
flowchart LR
W[Next.js web app<br/>Vercel] -->|REST + JWT| A[Express API<br/>one policy layer]
A --> DB[(MongoDB Atlas<br/>events · registrations · outbox)]
A <-->|Socket.io, or polling<br/>on serverless| W
C[Vercel Cron<br/>or in-process timers] --> J[Jobs: reminders ·<br/>email outbox · maintenance]
J --> DB
J --> M[Brevo / SMTP]
A --> AI[Ask Sync: model with<br/>4 read-only tools]
AI --> A
search_events, get_my_schedule, get_event_details, get_recommendations), each a thin read-only wrapper over the same services the app uses, so it sees exactly what the signed-in user may see. The server formats every time in the user's time zone, so the model never does time-zone maths, and it gets at most five rounds of tool calls before it must answer./api/meta tells the web app to poll instead, and Vercel Cron triggers the same job functions.| Area | Choice |
|---|---|
| Web app | Next.js 16 (App Router), React 19, TypeScript |
| UI | Tailwind CSS 4, motion, FullCalendar, lucide icons, sonner. Fonts: Bricolage Grotesque, Instrument Serif, Geist, Geist Mono |
| API | Node.js, Express 5, TypeScript, zod for every request and for the assistant's tool schemas |
| Database | MongoDB with Mongoose: MongoDB Atlas in production, an in-memory MongoDB for local development and tests |
| Realtime | Socket.io, with polling on serverless hosts |
| Auth | Email and password (bcrypt), a 6-digit email code, JWT sessions, password reset by link |
| A transactional outbox, delivered through Brevo's HTTP API or any SMTP server | |
| AI | Any OpenAI-compatible Chat Completions API, in Ask Sync only |
| Maps | OpenStreetMap, with place search through Nominatim |
| Security | helmet, a CORS allowlist, three rate limiters (sign-in, the whole API, the assistant per user) |
| Jobs | Vercel Cron in production, in-process timers elsewhere |
| Testing | Node's built-in test runner with supertest, against an in-memory MongoDB |
| Hosting | Vercel (web app and API as two projects), GitHub Actions for CI |
client/ Next.js web app
src/app/ Pages (App Router)
(app)/ Signed-in app: dashboard, explore, schedule, chat, notes, map, organizer, admin, settings
events/[id]/ Public, server-rendered event page
authentication/ Sign in, sign up, verify, forgot password
page.tsx Landing page
src/components/ UI by area (events, calendar, chat, assistant, organizer, admin, landing, …) plus shared shell/ and ui/
src/context/ Session, realtime connection and cross-page event updates
src/lib/api/ Typed API client and shared types
server/ Express API
api/index.ts Entry point on Vercel (serverless function)
src/server.ts Entry point on a long-running host (HTTP, Socket.io, job timers)
src/app.ts The Express app both entry points share
src/modules/ One folder per feature: routes, service, schemas
events/ Events, registrations, seats, waitlist, check-in, ratings, staff and the permission policy
assistant/ Ask Sync: the tool loop and its four read-only tools
auth/ me/ admin/ organizer/ notes/ notifications/ places/ reports/ chat/ jobs/
src/models/ Mongoose models: users, events, registrations, staff, messages, notifications, notes, ratings, reports, applications, outbox
src/jobs/ Event reminders, the email outbox, maintenance
src/lib/ AI client, mailer, email templates, tokens, calendar files, realtime, errors
src/middleware/ Auth, validation, rate limits, error handling
scripts/ Demo data, seed, local in-memory database, create an admin
test/ API tests
.github/workflows/ci.yml Tests, build, and a smoke test of the live site after each deploy
An "after dark campus" look rather than a corporate dashboard: dark by default with a warm off-white light theme, a purple brand colour and neon accents. Three devices carry it:
Type has four voices: Bricolage Grotesque for headlines, Instrument Serif italic for the one word that matters, Geist for text and Geist Mono for dates and counts. The layout is mobile-first with a bottom dock. Status always carries text or a number, never colour alone, and motion (including the RSVP confetti) is switched off for people who ask for reduced motion.
The sign-in page has one-click buttons for the first three. All accounts use the password syncronify123.
| Account | What it shows |
|---|---|
[email protected] · Kabir | Start here. Tickets, private plans, notes, event chats and unread notifications |
[email protected] · Tech & Computing Society | A full hackathon with a waitlist, a draft, a cancelled event, and a past event with check-ins and a team |
[email protected] | Users, a pending organizer application to approve, and a reported event |
[email protected] | On the waitlist for the full hackathon; leave it as member@ and he is moved up |
[email protected] | Door staff on one event: can scan entry codes, cannot see the attendee list |
[email protected] … [email protected] | Clean accounts, for walking through as a new user |
Things to know:
The full list, the demo events and how to reset the data are in TEST_ACCOUNTS.md.
Requires Node.js 20.19 or newer. The same commands work on Windows, macOS and Linux.
git clone https://github.com/sakshamm21/sync.git
cd sync
npm run install:all
cp server/.env.example server/.env
cp client/.env.example client/.env
npm run dev:memory
Open http://localhost:3000 and sign in as [email protected] / syncronify123.
No database, email service or API keys are needed. npm run dev:memory starts a local MongoDB in server/.data and loads the demo data; the first run downloads MongoDB once (about 780 MB). Without an email service, verification codes and reset links are shown on screen, so any made-up address works.
To enable optional features, edit server/.env:
| Feature | Variable |
|---|---|
| Your own MongoDB | DB_URI, then npm --prefix server run seed and npm run dev |
| Ask Sync | AI_API_KEY, with AI_BASE_URL and AI_MODEL (the default is Google Gemini's free tier) |
| Real email | BREVO_API_KEY or SMTP_*, plus MAIL_FROM |
| One-click demo buttons on the sign-in page | NEXT_PUBLIC_SHOW_DEMO_ACCOUNTS=true in client/.env |
Every variable is documented in server/.env.example and client/.env.example.
| Command | What it does |
|---|---|
npm run dev:memory | Run the API and the web app with a local database and the demo data |
npm run dev | Run both against the MongoDB in DB_URI |
npm test | API tests (123 tests) |
npm --prefix server run typecheck | Type-check the API and its tests |
npm run build | Build, and type-check, the web app |
npm --prefix server run seed | Load the demo data; add -- --reset to wipe everything first (refuses to run in production) |
npm --prefix server run create-admin -- --email [email protected] | Create the first admin, or promote an existing account |
The tests drive the real Express app over HTTP against an in-memory MongoDB. They never touch a real database and never send email.
There are no automated tests for the web app yet; it is covered by the type-checked build.
client/, one with server/.DB_URI, JWT_SECRET (32 characters or more), CLIENT_URL (the web app's address) and CRON_SECRET; add BREVO_API_KEY, MAIL_FROM and AI_API_KEY for email and Ask Sync.NEXT_PUBLIC_API_URL (the API's address) and NEXT_PUBLIC_SITE_URL (its own).DB_URI in server/.env pointing at your database, run npm --prefix server run create-admin -- --email [email protected] for the first admin.server/vercel.json schedules the three jobs once a day, each called with Authorization: Bearer $CRON_SECRET:
| Job | What it does |
|---|---|
/api/jobs/event-reminders | Emails attendees 24 hours before an event starts |
/api/jobs/email-outbox | Delivers queued emails |
/api/jobs/maintenance | Recounts attendees from the registrations that exist, and prunes old rows |
Every push to master deploys both projects. The workflow in .github/workflows/ci.yml tests every push and pull request, and after a push to master it waits for Vercel to finish and smoke-tests the live site.
ISC.
Made by Saksham Malhotra.
BarcodeDetector/api/health