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
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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 Start查看完整 README ↗
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 |