Nova is an AI-powered multi-page UI generator built as an Electron desktop app. Describe what you want to build in plain language, and Nova generates complete, styled HTML pages — with live preview, version history, multi-page canvas, and cross-page navigation.
- Brief-driven page generation with direction presets (landing page, dashboard, e-commerce, etc.)
- Conversational iteration — refine pages by chatting with the AI
- Auto multi-page creation: when you mention linking to a new page, Nova creates and generates it automatically
- Smart page type detection: standalone pages (login, register, 404) get independent layouts; app pages share nav and sidebar structure from existing pages
- Design consistency enforcement: new pages inherit the color palette, typography, and component patterns of existing pages
- Image-to-page generation (attach a reference screenshot)
- 12 AI providers supported: Anthropic, OpenAI, DeepSeek, Moonshot, Zhipu, QwenAI, OpenRouter, MiniMax, Baichuan, NVIDIA, and custom OpenAI-compatible endpoints
- Per-project page management with named routes (e.g.
/dashboard,/login) - Browser-style tab bar with add/close controls and active page indicator
- In-page link navigation: clicking
<a>tags in the preview switches pages instead of navigating away - Page canvas: view all pages side-by-side as scaled device frames
- Canvas supports pan (drag or scroll), zoom (Ctrl+scroll or ±% buttons), and device frame switching (mobile / tablet / desktop)
- Click a canvas card to switch the active page
- Live sandboxed iframe preview with desktop, tablet, and mobile viewport modes
- Focus preview mode — expands preview to full screen for detailed review
- Safe mode strips external scripts while preserving internal navigation
- Every generation saves a version snapshot
- Restore or branch from any prior version
- Collapsible chat/workspace panel
- Sidebar with project list and quick switching
- Project selector dropdown in header
- AI provider configuration panel with connection test
- Saved presets for quick provider switching
- HTML copy and export (via Electron file dialog)
- Data storage settings (localStorage-backed, no backend required)
| Layer | Technology |
|---|---|
| UI framework | React 18 + TypeScript |
| Build tool | Vite |
| Styling | Tailwind CSS + CSS custom properties |
| State | Zustand |
| Desktop shell | Electron |
| AI abstraction | Custom RuntimeAIService (streaming, 12 providers) |
| Persistence | localStorage (no server required) |
Requirements: Node.js 18+, npm
# Install dependencies
npm install
# Start renderer dev server only (port 5173)
npm run dev
# Build Electron main/preload and launch full desktop app
npm run electron:dev
# TypeScript check
npm run typecheck
# Lint
npm run lint
# Production renderer build
npm run build
# Package desktop installer (outputs to release/)
npm run electron:buildVS Code note: If Electron behaves like plain Node.js (broken APIs), it's because VS Code sets
ELECTRON_RUN_AS_NODE=1. Theelectron:devscript usesscripts/electron-launcher.jsto strip this env var automatically. Never runelectron .directly from the VS Code terminal.
src/
main/
index.ts Electron main process — file I/O, HTTP proxy, IPC handlers
preload.ts contextBridge API exposed to renderer as window.electronAPI
renderer/
components/ UI components (ChatPanel, PreviewPanel, CanvasView, Header, …)
stores/ Zustand stores (appStore, aiConfigStore, settingsStore)
services/ AI provider abstraction (runtimeAI.ts, ai.ts)
hooks/ useLocale, useKeyboard
locale/ zh-CN / en-US string selection
scripts/
electron-launcher.js Strips ELECTRON_RUN_AS_NODE before spawning Electron
public/ Static assets
- All data persists to
localStorage— there is no backend or database. - The renderer is a standard React SPA; in dev it loads from
http://localhost:5173, in production fromdist/index.html. - IPC channels between main and renderer:
save-file,load-file,export-html,proxy-request. - AI streaming uses
for awaitover the provider's async iterator; abort is handled viaAbortController. - In-page navigation is intercepted by an injected script inside each iframe that sends
postMessage({ type: 'nova-navigate', href })to the parent window.
UI supports Chinese (zh-CN) and English (en-US). Language is stored in localStorage under nova-locale and toggled from the header.
No license file has been added yet.