ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
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.
EducationTypeScript · JavaScriptGitHub @daluan217OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.