- Node.js 20+ (LTS recommended)
- npm (or compatible package manager)
git clone https://github.com/cminhho/stdout.git
cd stdout
npm installWeb (Vite)
npm run dev # Dev server
npm run build # Production build → dist/Desktop (Electron)
npm run electron:dev # Dev with hot reload
npm run electron:build:mac # Build macOS (arm64 + x64) → release/
npm run electron:build:win # Build Windows
npm run electron:build:linux # Build LinuxDeploy web to Firebase
npm run deploy # build + compress + firebase deployRelease (bump version + tag → GitHub Release)
npm run release # patch (e.g. 1.1.0 → 1.1.1)
npm run release:minor # minor; npm run release:major for major
# Then push: git push origin <branch> && git push origin v<version>See release.md for the full flow.
| Layer | Technology |
|---|---|
| Desktop | Electron 33+ |
| UI | React 19 + TypeScript |
| Build | Vite 5 |
| Styling | Tailwind CSS, Radix UI |
| Package | electron-builder |
src/
components/ # App + UI primitives (ToolLayout, CodeEditor, ui/)
contexts/ # React context (Settings)
hooks/ # useToolEngine, useCurrentTool, useToolTracking
pages/ # Tool pages by domain (converters, encode, formatters, …)
tools/ # Tool registry (registry.ts), routing, types, tracking
utils/ # Domain logic (encode, validators, cn, …)
Tools are registered in src/tools/registry.ts; each page is self-contained and lazy-loaded.