CoOp:Anything
게임을 검색해 협동 플레이 가능한 모드·단계·품질·커뮤니티 평점을 확인합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗See your VALORANT shop on the web and in Discord. Get pinged when a skin you want shows up.
Live site · How it works and the risks · Report a bug
Unofficial. valorant shop is a fan-made project. It is not affiliated with, endorsed by, or supported by Riot Games, Inc. It uses undocumented player-data endpoints that Riot can change or block at any time. Read the disclaimer before you run it or link an account.
Website
/wishlist, /bundles, /a/<puuid>), no analytics and no third-party scripts.Discord bot (slash commands, rendered as image cards)
| Command | What it does |
|---|---|
/shop | Your daily shop, with the countdown to the next reset |
/accessories | The accessory shop. Animated sprays are sent as GIFs |
/nightmarket | Your Night Market with discounts, when it is live |
/bundle | Featured bundles with prices and time left. No account needed |
/rank | Competitive rank card |
/collection | How many skins and accessories you own |
/share code, /share import, /share stop | Share an account read-only, or open one shared with you |
/main | Pick the account commands use by default |
/link | Jump to the website to manage accounts and alerts |
Scheduled jobs send a daily shop DM right after the 00:00 UTC rotation and alert you when a new bundle appears.
Browser / Discord
|
api/index.js (Vercel) or server.js (local)
|
app.js routes, OAuth, sessions, cron endpoints
|
src/shop.js fetch, cache and token refresh per account
| |
src/riot.js src/storage.js Riot client Supabase or in-memory
|
src/parse.js -> src/grid.js -> src/discord/embeds.js
normalise PNG / GIF Discord message payloads
auth.riotgames.com, then paste the resulting redirect URL back so the server can exchange the code. Your password never reaches this app.@resvg/resvg-js. Animated sprays are re-encoded to GIF with omggif and gifenc.More detail on every module is in .brain/.
Requires Node 20 or newer.
git clone https://github.com/xhvsh/valorant-shop.git
cd valorant-shop
npm install
cp .env.example .env
npm run dev
The app refuses to boot without SESSION_SECRET and LINK_SECRET. ENCRYPTION_KEY must be 64 hex characters. Generate any of them with:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Without Supabase credentials everything is kept in memory, which is fine for development but is lost on restart. Discord sign-in and the bot need the Discord variables below.
Every setting is documented in .env.example. The ones you need:
| Variable | Purpose |
|---|---|
BASE_URL | Public URL of the site, used for OAuth redirects and links |
BASE_PATH | Set when mounted under a subpath, for example /valorant-shop |
SESSION_SECRET, LINK_SECRET | Long random strings, required to boot |
ENCRYPTION_KEY | 64 hex characters. Changing it forces every user to re-link |
SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY | Persistent storage |
DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET, DISCORD_PUBLIC_KEY, DISCORD_BOT_TOKEN | Discord login and the bot |
BUNDLE_SOURCE_ID | Linked Discord user whose Riot account supplies /bundle data for everyone |
CRON_SECRET, SCHEDULER_SECRET | Protect /api/cron/* |
ADMIN_DISCORD_ID, LOG_CHANNEL_ID | Optional failure pings and a private log channel |
Create a Supabase project and run schema.sql in the SQL editor. It is safe to run again. Row level security is on and only the service role key, used server side, has access. Never expose that key to the browser.
Create an application in the Discord developer portal and set the interactions endpoint URL to <your site>/api/interactions.
Fill in the four Discord variables.
Register the slash commands:
node scripts/register-commands.js
This registers them globally and clears any server-only copies, which would otherwise show every command twice. To audit what is registered:
npm run check:commands
The project is set up for Vercel. vercel.json routes everything to api/index.js and defines the cron jobs.
npm i -g vercel
vercel deploy --prod
Set the same environment variables in the Vercel project settings. If you want the daily DM to go out exactly at the rotation, point an external scheduler at /api/cron/dailyshop with the x-scheduler-secret header.
api/ Vercel entry point
app.js Express app: website routes, auth, API, interactions, cron
server.js Local server
src/
riot.js Riot auth (PKCE, DPoP) and player-data requests
shop.js Per-account fetch, cache and token refresh
parse.js Raw Riot responses to clean store objects
items.js Item catalog from valorant-api.com
grid.js PNG and GIF rendering for Discord
storage.js Supabase storage with an in-memory fallback
session.js Login sessions
discord/ Slash commands, message builders, signature check, logging
website/ Static dashboard (plain HTML, CSS and JavaScript, no build step)
scripts/ Command registration and audit, plus a few dev probes
schema.sql Database schema
.brain/ Architecture notes for each module
ENCRYPTION_KEY means every user has to re-link.httpOnly cookie, and the site ships a strict Content Security Policy (script-src 'self')..env files. They are ignored by .gitignore.Found a vulnerability? Please message @xhvsh on Discord instead of opening a public issue.
Issues and pull requests are welcome. Keep changes small and run npm run lint before you submit.
This project only reads data that belongs to the signed-in user. Changes that buy items, automate gameplay, touch the game client, hit Riot at high volume, or access accounts that are not the user's own will not be accepted. They are also much more likely to be treated as a rules violation by Riot.
MIT. VALORANT and Riot Games are trademarks or registered trademarks of Riot Games, Inc.