SoleAI is an interactive AI shoe-design experience built with React, Vite, Express, Socket.IO, and Google's Gemini models. It is designed for event-style installations where one screen guides a guest through a co-design flow while another screen shows a live projection gallery of finalized designs.
The app walks a user through a short creative journey:
- Start from an attract screen.
- Pick a design mood such as
Cyberpunk,Botanical, orOceanic. - Choose a shoe type.
- Refine the design with an AI co-designer, material selection, and palette controls.
- Generate three AI-rendered variations.
- Finalize one design and push it to a live projection feed.
- Open a share page to download or share the finished design.
- AI co-designer chat powered by Gemini chat responses.
- AI image generation for three draft shoe concepts per session.
- Real-time projection view using Socket.IO.
- Shareable design pages at
/share/:id. - QR-code based handoff on the finalize screen.
- Lightweight Express API bundled with the frontend app.
- React 19
- TypeScript
- Vite
- Tailwind CSS 4
- Express
- Socket.IO
- Google GenAI SDK
- Motion
.
|-- server.ts # Express + Socket.IO server and dev entrypoint
|-- src/
| |-- App.tsx # Main app flow and route switching
| |-- services/gemini.ts # Gemini chat + image generation helpers
| |-- components/ # Experience screens and UI pieces
| |-- types.ts # Shared app types
|-- vite.config.ts # Vite config and env exposure
|-- .env.example # Example environment variables
/- main interactive shoe design flow/projection- live event projection / gallery screen/share/:id- share page for a finalized design
The Express server exposes a few simple endpoints:
POST /api/finalize- stores a finalized design in memory and broadcasts it to projection clientsGET /api/design/:id- returns one finalized designGET /api/designs- returns the recent design feed
- Node.js 18+ recommended
- A valid
GEMINI_API_KEY
- Install dependencies:
npm install- Create a local env file and add your Gemini key:
copy .env.example .env.localThen set:
GEMINI_API_KEY=your_key_here- Start the app:
npm run devThe custom server starts on http://localhost:3000.
npm run dev- starts the Express server with Vite middlewarenpm run build- builds the frontend with Vitenpm run preview- previews the production frontend bundlenpm run lint- runs TypeScript type-checkingnpm run clean- removesdistusingrm -rfcurrently
This project uses GEMINI_API_KEY in two places:
- In
server.ts,dotenvloads local environment variables for the Node process. - In
vite.config.ts, the same key is injected into the frontend asprocess.env.GEMINI_API_KEY.
That means the browser-side app directly calls Gemini from the client code in src/services/gemini.ts.
- Finalized designs are stored only in memory, so restarting the server clears the gallery and share pages.
- The server keeps only the 50 most recent designs.
- The
cleanscript usesrm -rf, which is Unix-style and may fail in a default Windows shell. - The repository includes
better-sqlite3, but the current code path does not persist designs to SQLite yet. - The share and projection experience assumes the app is served from a single origin.
In production mode, server.ts serves the built dist folder and falls back to index.html for SPA routes. A typical production flow is:
Build with:
npm run buildThen start the server with NODE_ENV=production using the correct syntax for your shell or process manager.
src/App.tsxcontrols the full multi-step journey.src/components/CoDesignerChat.tsxmanages the AI-assisted customization interface.src/components/FinalizeScreen.tsxcreates the QR-based share handoff.src/components/ProjectionView.tsxlistens for live updates and rotates between the latest design and the gallery view.
- Persist finalized designs in SQLite or another database.
- Move Gemini calls server-side so API keys are not exposed to the browser bundle.
- Add error states and retry guidance for failed generation requests.
- Add tests for the server endpoints and the multi-step flow.