Join the Agent Deck Discord Server!
Discord에서 Agent Deck 커뮤니티 확인, 357명과 자유 음성·텍스트 채팅 이용
프라이버시를 최우선으로 하는 메시징, 모바일·데스크톱에서 암호화 채팅·음성메시지·그룹·공유·신뢰 디바이스 제어 제공
Privacy-first messaging for your circle. Discover encrypted chats, voice messages, groups, sharing and trusted-device controls on mobile and desktop.
소셜TypeScript · JavaScriptGitHub @mudassirishfaq94온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Circlo is a full-stack direct-messaging application built with Next.js, React, TypeScript, PostgreSQL, and Drizzle ORM. It supports persistent private conversations, realtime delivery and presence, typing indicators, read receipts, reactions, replies, search, notifications, private attachments, and responsive light/dark themes.
For the live deployment and the approved Bluehost VPS cutover, see DEPLOYMENT.md and the migration runbook. The private-media move to Cloudflare R2 is staged separately; Supabase remains the live storage backend until the object copy is verified and deployed. See the R2 migration guide. Upload hardening, device sessions, staged CSP, and mobile profiling are documented in Tasks 4–6.
Clone the repository and install dependencies:
git clone https://github.com/mudassirishfaq94/maddychats.git
cd maddychats
npm install
Create a local environment file from the safe template:
cp .env.example .env
Configure .env with local values. Never commit this file.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | Yes | Server-only PostgreSQL connection string |
SESSION_TTL_DAYS | No | Absolute device lifetime in days (default: 30, maximum: 90); access JWTs last 15 minutes |
JWT_SECRET | Production | Secret of at least 32 characters used to sign sessions |
PORT | No | Application port; defaults to 3000 |
CLIENT_URL | Recommended | Canonical application origin |
NEXT_PUBLIC_FIREBASE_API_KEY | Phone auth | Firebase web-app API key (public) |
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN | Phone auth | Firebase Auth domain (for example, project.firebaseapp.com) |
NEXT_PUBLIC_FIREBASE_PROJECT_ID | Phone auth | Firebase project ID (public) |
NEXT_PUBLIC_FIREBASE_APP_ID | Phone auth | Firebase web app ID (public) |
FIREBASE_PROJECT_ID, FIREBASE_CLIENT_EMAIL, FIREBASE_PRIVATE_KEY | Phone auth | Service-account credentials used to verify phone tokens on the server |
MAX_AVATAR_MB | No | Avatar upload limit |
MAX_IMAGE_MB | No | Message-image upload limit |
MAX_FILE_MB | No | Message-file upload limit |
DEV_SEED_PASSWORD | Seed only | Password for local development accounts |
Generate a production-quality session secret locally:
openssl rand -hex 32
Create the database, then apply the schema:
createdb maddy_chats
npm run db:migrate
Start the development server:
npm run dev
Open http://localhost:3000.
| Command | Description |
|---|---|
npm run dev | Start the development server |
npm run build | Create a production build |
npm start | Run the production build |
npm run typecheck | Run TypeScript checks |
npm run lint | Run ESLint |
npm run db:migrate | Apply the versioned migration journal |
npx drizzle-kit generate | Generate schema migration files |
The optional seed script creates two local test users. It requires an explicit
password and refuses to run when NODE_ENV=production.
DEV_SEED_PASSWORD='local-password-only' node scripts/seed.mjs
src/
├── app/
│ ├── api/ # authenticated HTTP and realtime endpoints
│ └── app/ # protected application pages
├── components/ # auth, chat, profile, people, and shell UI
├── db/ # Drizzle connection and PostgreSQL schema
├── lib/ # shared validation, types, and utilities
└── server/ # server-only auth, chat, media, and realtime logic
scripts/
├── seed.mjs # guarded local-development seed
└── smoke-test.sh # end-to-end API and realtime checks
server/uploads/ # runtime media; excluded from Git
The browser communicates only with same-origin Next.js endpoints. Database credentials, password hashes, signing material, and storage paths remain on the server. Private media is served through authenticated routes that verify conversation membership.
Realtime updates use the authenticated /api/realtime/stream Server-Sent
Events endpoint. Realtime events and rate-limit buckets are persisted in
PostgreSQL. Presence remains process-local, so production uses one web replica.
Docker Compose runs an independent scheduled-message worker and private
readiness checks. The deployment guide includes backup and restoration steps.
Run static checks before opening a pull request:
npm run typecheck
npm run lint
npm run build
The Quality workflow also runs dependency audits and isolated integration
tests on every pull request. Follow the quality-gate guide
to prepare disposable local databases and run npm test. The supported suites
exercise authentication/MFA, authorization, private media, migrations,
scheduling, readiness and backup restoration. The old manual smoke script
predates email verification and is not the supported automated test command.
JWT_SECRET; never rely on a fallback in production.DATABASE_URL, JWT_SECRET, and seed credentials in the deployment
platform's secret manager, not in source control or client-visible variables.CLIENT_URL to the exact HTTPS production origin..env files, database dumps, logs, uploads, credentials,
private keys, access tokens, or production user data.NEXT_PUBLIC_ can be exposed to
browser bundles. Do not use that prefix for secrets.