Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Contributor guild on Monad: passport, open work, and a record of reviewed contributions.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Most NFT utility is a badge or a discount. Take the NFT away and the product still works. Choguild turns that around: a wallet is just a key, and the member is the Chog.
chog:<tokenId>, never a wallet address.ownerOf on Monad mainnet) acts as it, and every write re-checks it./chog/:id.With no Chog, a wallet can sign in and browse, but it cannot save a passport, post a listing, apply, review work, do quests or appear on the leaderboard. There is no wallet-level account to fall back on, so if you removed the NFT, Choguild would have no members at all.
| Chog passport | Name, bio, skills and links, saved on the token. Its face is always the Chog's own art. |
| Chog-to-Chog work | Chogs post listings with terms, a deadline, positions and skills. Other Chogs apply and submit evidence. The poster's Chog accepts it, asks for changes, or rejects it. |
| Leaderboard of Chogs | /ranking ranks tokens, not people, both all-time and for the current season. |
| Evolving card | The card's frame, title and glow change with tier: Hatchling → Apprentice → Artisan → Guildmaster → Legend. |
| $CHOG tips | From any Chog's page, tip its current holder in $CHOG. This is a direct ERC-20 transfer from your wallet, with no escrow. The address comes from chog.xyz and was checked onchain (name "Chog", symbol "CHOG", 18 decimals). |
/chog/:id and a shareable /duel/:id result page.Transfer(publisher → holder, amount ≥ reward) from the $CHOG contract. Each Chog page shows its total rewards paid.SEASON_PRIZE)./passport → Check in → save its passport → duel a rival Chog from its page → open a listing → share the rank card.Without a Chog, the same wallet stays view-only, which is the point.
| Action | XP |
|---|---|
| Accepted submission | +100 |
| Accepted application | +25 |
| Published listing (counts once another Chog's work is accepted on it, or it stays open 72 h; max 4 per 30 days) | +15 |
| Saved public passport | +10, once |
| Daily check-in | +5, plus +1 per streak day (bonus max +10) |
| Scout a listing, visit a rival | +5 each, once a day |
| Duel (challenger) | win +6 · draw +3 · loss +1 |
| Duel (defender holds) | +3 |
The farming rules live in src/lib/ranking/farming.ts, src/lib/chog/actor.server.ts and src/lib/quests:
src/lib/duels).orphaned_at, migrations/0013_orphan_listings.sql).Tiers start at Hatchling 0 · Apprentice 50 · Artisan 150 · Guildmaster 400 · Legend 1000.
Migration from v2: passports that used to be tied to a wallet moved, with their history, onto that wallet's lowest-numbered Chog (based on the last saved list of holders). Passports from wallets with no Chog were archived. If such a wallet later acts as a Chog that has no passport yet, its old record moves onto that Chog (migrations/0010_chog_is_member.sql).
flowchart LR
W[Browser wallet] -->|SIWE, no gas| S[Session: wallet + acting Chog]
S -->|every write| O{ownerOf Chog #id<br/>== wallet?}
O -->|no| V[View only / Chog dropped]
O -->|yes| A[Actor chog:id]
A --> P[(Postgres: passports, listings,<br/>applications, submissions, quests)]
P --> X[XP engine<br/>anti-farming + seasons]
X --> L[Leaderboard · /chog/:id · rank card]
M[Monad mainnet] -->|ownerOf, holder list via Multicall3| O
Browser (React 19, wagmi injected connector)
│ server functions (zod-validated, rate-limited)
▼
TanStack Start on Vercel (Nitro) ──► Postgres (Neon) / PGLite locally
│
└─► Chog Genesis 0xc96d…3763: live ownerOf before every write (30 s cache for reads),
wallet → Chogs holder list via Multicall3 (5 min cache)
src/
routes/ /, chog/$chogId, ranking, passport, discover, opportunities, applications, submissions, docs, api
components/chog/ chog card, act-as picker, quests, level-up + confetti, rank card, $CHOG tip
lib/chog/ actor keys (chog:<id>), live ownerOf, holder list, legacy adoption
lib/quests/ daily quests, streaks, weekly seasons
lib/ranking/ XP rules, anti-farming, tiers, leaderboard
lib/board/ listings and applications
lib/work/ submissions and reviews
lib/passport/ profiles, SIWE sessions, wallet config
migrations/ SQL schema, applied in order (0010 = Chog is the member)
docs/screens/ README screenshots
cmdk, lucide-react; own design system with neutrals and one solid purple (#836EF9), plus light/darkwagmi (injected connector only) + viem on Monad mainnet (chain 143); Sign-In with Ethereum sessionspg (Neon in production), in-memory PGLite locallyzod on every server function, per-client rate limits, enforced CSPRequires Node 22 (.nvmrc).
npm install
npm run dev # http://localhost:8080
No database is needed locally: PGLite starts in memory and applies migrations/ on boot.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | For persistent data | Postgres connection string (Neon works). Without it data lives in memory. |
CHOG_SESSION_SECRET | Yes, on deployed builds | ≥32 random characters (openssl rand -hex 32). Signs passport sessions. |
VITE_MONAD_RPC_URL | No | Preferred Monad RPC (https). Add a custom host to connect-src in vercel.json. |
CHOG_RUN_MIGRATIONS | No | Local/CI: 1 lets npm run db:migrate run outside Vercel. |
On Vercel, migrations run during npm run build only for production deploys with DATABASE_URL set.
npm run typecheck
npm run lint
npm test # script + unit tests (ranking, farming, quests, seasons, board, passport, chog)
npm run test:chog-live # live Chog Genesis ownership checks against Monad mainnet
npm run build
CI (.github/workflows/ci.yml) runs typecheck, lint, tests and build on Node 22 for every push and pull request.
Injected browser wallets only (MetaMask, Rabby…). No Coinbase SDK, no WalletConnect, no Phantom. On a phone with no injected wallet, tapping Connect wallet offers deep links that reopen the page inside a wallet app.
Enforced CSP and security headers in vercel.json (violations reported to /api/csp-report), zod-validated inputs, per-client rate limits, client errors logged via /api/client-error, no source maps shipped.
Judges: start with JUDGES.md (tours, onchain checks, known limitations)
Live app: https://choguild.vercel.app
Docs / whitepaper: https://choguild.vercel.app/docs
Chog Genesis: https://monadscan.com/token/0xc96d31F8626c6D03Fae5dCD3d61e3FB9F4a73763
$CHOG: https://monadscan.com/token/0x350035555E10d9AfAF1566AaebfCeD5BA6C27777