ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
2인 게임을 실시간으로 시각화·분석해 순수·혼합 내시 균형을 모두 구하고, LLM 설명을 독립적 후회 기반 오라클로 검증합니다
Interactive 3D visualizer for 2-player games: solves every pure and mixed Nash equilibrium analytically in real time, with an LLM explanation layer verified against an independent regret-based oracle.
교육TypeScript · JavaScriptGitHub @daluan217온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Interactive 3D visualizer for the Nash equilibria of two-player games.
See the strategic structure of a 2×2 game at a glance. Rotate and zoom the
expected-payoff surfaces, watch best-response dynamics converge step by step, and
read off the pure and mixed-strategy Nash equilibria as they're computed in real time.
Built as a full-stack web app, with an Electron desktop build for offline use.README 전문 보기 ↗Interactive 3D visualizer for the Nash equilibria of two-player games.
See the strategic structure of a 2×2 game at a glance. Rotate and zoom the expected-payoff surfaces, watch best-response dynamics converge step by step, and read off the pure and mixed-strategy Nash equilibria as they're computed in real time. Built as a full-stack web app, with an Electron desktop build for offline use.
▶ Live site: nash-equilibrium-simulator.com
| Technology | Purpose |
|---|---|
| React 19 | UI framework |
| TypeScript | Type safety |
| Tailwind CSS v4 | Styling |
| Vite | Build tool and dev server |
| Plotly.js | 3D surface and scatter visualisation |
| Lucide React | Icons |
| Motion | Animations |
| Technology | Purpose |
|---|---|
| Node.js + Express | REST API server |
| Google Cloud Storage | Persistent JSON database (Cloud Run) |
| Nodemailer | Email verification and account deletion codes |
| Azure AI Foundry (OpenAI-compatible) | AI game theorist situation reports — gpt-5.4-nano by default |
| HMAC-signed tokens | Stateless bearer-token auth (PBKDF2 password hashing) |
| Technology | Purpose |
|---|---|
| Electron 31 | macOS desktop app wrapper |
| electron-builder | DMG and ZIP packaging |
| Embedded Express | Local server running inside the app |
| Technology | Purpose |
|---|---|
| Google Cloud Run | Serverless container hosting |
| Google Cloud Build | CI/CD — auto-deploys on push to main |
| Google Container Registry | Docker image storage |
| Google Cloud Storage | Database persistence + DMG hosting |
| Docker | Container image for Cloud Run |
| Namecheap DNS | Custom domain routing |
| Google Analytics 4 | Traffic and session analytics |
├── src/
│ ├── App.tsx # Root component — layout, auth, simulation state
│ ├── main.tsx # React entry point
│ ├── index.css # Global styles
│ ├── types.ts # Shared TypeScript interfaces
│ ├── test.ts # Game-engine regression tests (npm test)
│ ├── components/
│ │ ├── PlotlyView.tsx # 3D Plotly chart with rotate/pan/pinch controls
│ │ ├── MenuDrawer.tsx # Slide-out workspace centre panel
│ │ ├── DownloadModal.tsx # Desktop app download modal
│ │ ├── AdminDashboard.tsx # Admin stats panel (password protected)
│ │ └── GameGraphMiniature.tsx # Small graph preview thumbnail
│ └── utils/
│ ├── gameEngine.ts # Nash Equilibrium solver + simulation step logic
│ └── plotting.ts # Plotly trace builders for surfaces and markers
│
├── server.ts # Express server — API routes, auth, GCS DB, email
├── electron-main.cjs # Electron main process — window creation, IPC
├── index.html # HTML template (Vite entry + GA4 tag)
├── vite.config.ts # Vite configuration
├── tsconfig.json # TypeScript configuration
├── Dockerfile # Multi-stage Docker build for Cloud Run
├── cloudbuild.yaml # Cloud Build CI/CD pipeline
├── scripts/
│ └── afterPack.cjs # electron-builder hook (post-pack placeholder)
└── build/
├── icon.svg # App icon source (3D isometric cube design)
├── icon.png # Rendered icon PNG
└── icon.icns # macOS icon bundle
The app uses a simple JSON file as its database (db.json), with two collections:
users — id, username, email, passwordHash, isVerified, verificationCodegames — id, userId, name, description, payoffs, createdAtIn Cloud Run: loaded from and saved to Google Cloud Storage on every write.
In Electron / dev: read from and written to the local filesystem.
All routes are rate-limited. Routes that read or write user data require a bearer token.
| Method | Route | Description |
|---|---|---|
| GET | /api/health | Health check |
| GET | /api/version | Latest desktop app version (for update prompts) |
| GET | /api/admin/stats | Admin stats (requires x-admin-secret header) |
| GET | /api/download/dmg | Streams DMG from GCS or local dist-electron/ |
| POST | /api/feedback | Send anonymous or attributed user feedback |
| POST | /api/auth/register | Register + send email verification code |
| POST | /api/auth/verify | Verify email with 6-digit code |
| POST | /api/auth/login | Log in, returns a signed bearer token |
| GET | /api/auth/me | Get the current user from a token |
| POST | /api/auth/forgot-password | Send a password-recovery code by email |
| POST | /api/auth/reset-password | Reset the password with a recovery code |
| POST | /api/auth/delete-request | Send account-deletion confirmation email |
| POST | /api/auth/delete-confirm | Confirm and delete the account |
| GET | /api/games | List saved games for the authenticated user |
| POST | /api/games | Save a new game preset |
| DELETE | /api/games/:id | Delete a saved game |
Prerequisites: Node.js 20+
npm install
npm run dev # starts Express server with hot-reload (website mode)
npm run electron:start # builds and launches the Electron desktop app
Copy .env.example to .env and fill in:
AZURE_FOUNDRY_ENDPOINT=https://your-resource.services.ai.azure.com
AZURE_FOUNDRY_API_KEY=your-key
REPORT_MODEL=gpt-5.4-nano # optional; this is the default
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
[email protected]
SMTP_PASS=your-app-password
ADMIN_SECRET=your-admin-password
AUTH_SECRET=generate-with-openssl-rand-hex-32
AUTH_SECRET(required in production): HMAC key used to sign auth session bearer tokens. If unset, the server generates a random key at boot, so every restart/redeploy invalidates all existing sessions (users get logged out). Set a long, stable, random value (openssl rand -hex 32).SESSION_SECRETis accepted as an alias. In Cloud Run it's wired via the_AUTH_SECRETCloud Build substitution.
npm run electron:dist
Output: dist-electron/Nash Equilibrium Simulator-0.0.0-arm64.dmg
macOS Gatekeeper note: because the app is not notarized, macOS will block it on first launch. Remove the quarantine flag after installing:
xattr -dr com.apple.quarantine "/Applications/Nash Equilibrium Simulator.app"
Every push to main triggers Cloud Build automatically:
Environment variables are passed via Cloud Build substitutions defined in cloudbuild.yaml.
The Electron app bundles the full Express server inside the .app package:
electron-main.cjs sets ELECTRON_USER_DATA_PATH and boots dist/server.cjsglobal.onExpressListeningBrowserWindow and loads http://127.0.0.1:14321Electron in the user agent and adjusts the UIThe database discriminator (ELECTRON_USER_DATA_PATH) tells the server to use local file storage instead of GCS.