Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
FFXIV 이용자를 위한 무료 도구 모음으로 색상 매칭·조화 생성·접근성 검사·염료 비교·혼합 기능을 제공해 완벽한 염료를 찾을 수 있습니다
Free tools for FFXIV players: Color Matcher, Harmony Generator, Accessibility Checker, Dye Comparison, and Dye Mixer. Find perfect dyes for your glamour and housing.
게임TypeScript · JavaScriptGitHub @FlashGalatine온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A comprehensive suite of color and dye tools for Final Fantasy XIV.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A comprehensive suite of color and dye tools for Final Fantasy XIV, built as a pnpm monorepo with Turborepo. Published to npm under the @xivdyetools scope (except test-utils, which is workspace-private): [README 설치·사용 부분 발췌] Quick StartREADME 전문 보기 ↗
A comprehensive suite of color and dye tools for Final Fantasy XIV, built as a pnpm monorepo with Turborepo.
Live site: xivdyetools.app
packages/)Published to npm under the @xivdyetools scope (except test-utils, which is workspace-private):
| Package | Version | Description |
|---|---|---|
@xivdyetools/types | 3.3.0 | Branded types (HexColor, DyeId, etc.) and shared interfaces |
@xivdyetools/logger | 2.3.0 | Multi-runtime logging (browser, Node, CF Workers) with secret redaction |
@xivdyetools/auth | 2.0.2 | JWT verification, HMAC signing, Discord Ed25519 verification, Base64URL/hex encoding (/encoding) |
@xivdyetools/worker-kit | 1.5.0 | Worker toolkit: Hono middleware (request ID, logger, rate limit) + sliding-window rate limiting backends (/rate-limiter) |
@xivdyetools/core | 5.15.0 | Color algorithms, dye database (schema v2), k-d tree matching, 6-language i18n, Universalis client, blending (/blending) |
@xivdyetools/svg | 4.4.0 | Pure SVG card generators on the 5.0 frame system (data in → SVG string out) |
@xivdyetools/bot-logic | 4.11.0 | Platform-agnostic command business logic + bot UI translation engine (/i18n) |
@xivdyetools/test-utils | 3.0.0 | Cloudflare Workers mocks (D1, KV, R2) and test factories — not published |
apps/)| App | Version | Description |
|---|---|---|
web-app | 5.16.0 | Main web app at xivdyetools.app (Vite + Lit + Tailwind) |
discord-worker | 5.9.0 | Primary Discord bot — 18 slash commands (CF Worker + Hono, HTTP Interactions) |
image-worker | 1.3.4 | Photon host — POST /extract (raw pixels for the bot) and POST /thumbnail (WebP previews for presets-api), service-binding-only (CF Worker) |
moderation-worker | 1.8.2 | Moderation bot for community presets (CF Worker) |
presets-api | 2.6.1 | Community presets REST API + preview-image storage (CF Worker + D1 + R2) |
oauth | 3.1.3 | Discord OAuth + JWT issuance (CF Worker + D1) |
api-worker | 0.21.0 | Public REST API at data.xivdyetools.app + Universalis proxy routes + docs site at developers.xivdyetools.app (CF Worker + KV) |
docs/)Start at docs/index.md: architecture overviews, per-project deep dives, user guides, operations runbooks, specifications, and the version matrix. Dated audits, research and design specs are kept as frozen snapshots.
# Prerequisites: Node.js 22.13+, pnpm 11+
pnpm install # Install all workspace dependencies
pnpm turbo run build # Build all packages
pnpm turbo run test # Run all tests (Vitest, ~480 test files across 17 workspaces)
# Work with a specific package or app
pnpm turbo run build --filter=@xivdyetools/core
pnpm turbo run test --filter=xivdyetools-discord-worker
# Run a single test file
pnpm --filter @xivdyetools/core exec vitest run src/path/to/file.test.ts
# Dev servers
pnpm --filter xivdyetools-web-app run dev
pnpm --filter xivdyetools-discord-worker run dev
types, logger, auth (incl. /encoding) ───────────────────┐ (Level 0: no internal deps)
worker-kit (→ logger; incl. /rate-limiter) ──────────────┤ (Level 1 — workers only)
core (→ types, logger; incl. /blending) ─────────────────┤ (Level 1)
test-utils (→ auth, types; private) ─────────────────────┤ (Level 1)
svg (→ core, types) ─────────────────────────────────────┤ (Level 2)
bot-logic (→ core, svg, types; incl. /i18n) ─────────────┤ (Level 3)
│
Applications ◄───────────────────────┘
Workers communicate via Cloudflare Service Bindings (direct Worker-to-Worker, no HTTP overhead):
discord-worker ──► presets-api (preset CRUD)
discord-worker ──► image-worker (pixel extraction for /extractor)
discord-worker ──► api-worker (Universalis market prices for /budget, .chara resolve for /glamour)
moderation-worker ──► presets-api (approve / reject)
presets-api ──► discord-worker (submission notifications)
presets-api ──► image-worker (WebP thumbnails for moderated preview images)
All Cloudflare Workers use Hono as the HTTP framework and @xivdyetools/worker-kit for shared middleware. Persistence is D1 (SQLite) for presets-api (xivdyetools-presets, also bound read/write by moderation-worker; discord-worker reaches preset data only through its service binding) and oauth (xivdyetools-users), R2 for preset preview images, and KV elsewhere.
All CI/CD is handled via GitHub Actions:
| Workflow | Trigger | What it does |
|---|---|---|
| CI | Push to main / *-prep, every PR, nightly audit | Lint, type-check, test, build (affected packages) + repo-wide gates: wrangler-config invariants, dead-code reachability, docs version tables, docs links; pnpm audit --prod and gitleaks in their own jobs; Playwright E2E for the web app |
| Deploy (×11) | Push to main with matching path changes | Build → test → deploy to Cloudflare Workers/Pages |
| Publish Packages | Manual (workflow_dispatch) | Build → test → publish selected @xivdyetools/* package to npm |
Deploy workflows cover api-worker, discord-worker (+ beta), image-worker, moderation-worker, oauth, og-worker (+ beta), presets-api, and web-app (+ beta). stoat-worker has no deploy workflow — it is parked.
| Secret | Used by |
|---|---|
CLOUDFLARE_API_TOKEN | The 8 non-beta deploy workflows (environment: production) |
CLOUDFLARE_API_TOKEN_BETA | The 3 *-beta.yml deploy workflows (environment: beta, since 2026-08-29 FINDING-028 — a separate credential so a beta job can't read the production token) |
CLOUDFLARE_ACCOUNT_ID | All 11 deploy workflows — an account id, not a credential, shared by both environments |
The publish workflow needs no secret. It authenticates to npm with trusted publishing (OIDC) using its own GitHub Actions identity via the id-token: write permission, which also signs the provenance attestation.
workspace:* protocolverbatimModuleSyntax)web-app E2EXIV Dye Tools stands on work by others. Thank you to:
| Project | Used for | License |
|---|---|---|
| XIVAPI | Dye names in English, Japanese, German, and French | — |
| Universalis | Market board price data | MIT |
| spectral.js | Kubelka-Munk physical paint mixing | MIT |
| Hono | HTTP framework for every Cloudflare Worker | MIT |
| Lit | Web component framework for the web app | BSD-3-Clause |
| resvg | SVG → PNG rasterization (resvg-wasm / resvg-js) | MPL-2.0 |
| Photon | WASM image pixel extraction | Apache-2.0 |
| revolt.js | Stoat/Revolt bot client | MIT |
Korean and Chinese dye names are manually sourced — XIVAPI does not serve them.
All bundled fonts are licensed under the SIL Open Font License 1.1:
Flash Galatine | Midgardsormr (Aether)
🎮 FFXIV: Lodestone Character 💻 GitHub: @FlashGalatine 🐦 X/Twitter: @AsheJunius 📺 Twitch: flashgalatine 🌐 BlueSky: projectgalatine.com ❤️ Patreon: ProjectGalatine ☕ Ko-Fi: flashgalatine 💬 Discord: Join Server
MIT © 2025-2026 Flash Galatine — see LICENSE.
Every package and app in this monorepo is MIT licensed and carries its own LICENSE file.
FINAL FANTASY is a registered trademark of Square Enix Holdings Co., Ltd. FINAL FANTASY XIV © SQUARE ENIX CO., LTD.
XIV Dye Tools is an unofficial fan project and is not affiliated with, endorsed by, or sponsored by Square Enix Co., Ltd. All FINAL FANTASY XIV content, including dye names and color values, is the property of Square Enix.
og-worker | 2.12.0 | Dynamic OpenGraph image generation (CF Worker + WASM) |
stoat-worker | 0.3.3 | Stoat (Revolt) bot (Node.js + revolt.js, WebSocket, prefix commands) — parked |