A modern starter template for building Windows desktop applications with Vue.js 3
, Vuetify 3
, and Electron
.
This template combines the power of modern web technologies with native Windows desktop capabilities.
Main goal: Create a Windows app that can automate browsers:
This is a proof-of-concept
demonstrating browser automation technologies including
standard Playwright and advanced fingerprint automation
with playwright-with-fingerprints
.
Latest Release: v0.0.2
1.Download:
- Go to Releases
- Click on the latest release
- Under "Assets," download the
.zip
file (e.g.,VuetifyElectronStarter-0.0.2-x64.zip
)
2.Extract: Right-click the downloaded .zip
file and select "Extract All..." to your desired location
3.Run: Navigate to the extracted folder and double-click VuetifyElectronStarter.exe
to start the application
- β Ready-to-use Windows desktop app: No installation required
- β Browser automation tools: Chrome and Firefox automation
- β Advanced fingerprint automation - Stealth browsing capabilities
- β Modern UI - Vue.js 3 + Vuetify 3 interface
- The app will download the fingerprint engine (800+ MB) when you first click "Launch Browser" in the fingerprint section
- Download time depends on your internet speed
- This is a one-time download, later fingerprint requests are instant
- OS: Windows 10/11 (x64)
- RAM: 4GB minimum, 8GB recommended
- Storage: 2GB free space (for fingerprint engine)
- Internet: Required for initial setup and fingerprint downloads
- Electron: Latest stable version for Windows desktop apps
- electron-vite: Modern build tooling for Electron
- electron-builder: Complete solution to package and build Electron apps
- OS Integration: IPC communication between renderer and main process
- Playwright Browser Automation: Launch and control Chrome/Firefox browsers with CDP support
- Fingerprint Browser Automation: Enhanced privacy automation with
playwright-with-fingerprints
- External Browser Control: Open URLs in Chrome or default browser
- Native Notifications: System-level notification support
- System Information API: Access to platform and version details
- Vue.js 3: Progressive JavaScript framework with Composition API
- Vuetify 3: Material Design component framework
- Vite: Next generation frontend tooling
- TypeScript: Full TypeScript support throughout the project
- Pinia: Intuitive state management for Vue
- Vitest: Fast unit testing framework
- Cypress: End-to-end testing framework
- ESLint: Code linting and formatting
- Auto-imports: Automatic imports for Vue and utilities
- Hot Module Replacement: Instant updates during development
- DevTools Integration: Built-in debugging capabilities
- Modern Security Context isolation and secure preload scripts
- Auto-updater Ready: Built-in support for application updates (planned)
- Icon Integration: Automatic Windows icon support with a build process
- Node.js (v22 or higher)
- npm
git clone https://github.com/sergerdn/vuetify-electron-starter.git
cd vuetify-electron-starter
npm install
Start the web development server:
npm run dev
This will start the Vite development server at http://localhost:3000
with hot module replacement.
Start the Electron application in development mode:
npm run electron:dev
This will:
- Build the main and preload processes
- Start the Vite development server
- Launch the Electron application with DevTools enabled
- Enable hot reload for both the renderer and main processes
Build the web application for production:
npm run build
Build the complete Electron application:
npm run electron:build
This will:
- Build the renderer process (Vue.js app)
- Build the main and preload processes
- Package the application using electron-builder
- Create platform-specific installers and executables
Output:
dist-electron/{version}/win-unpacked/
- Unpacked Windows application folder (e.g.,dist-electron/0.0.2/win-unpacked/
)dist-electron/{version}/win-unpacked/VuetifyElectronStarter.exe
- Windows executable with custom icon
Windows Build Fix:
Create this directory before building to avoid fsevents errors:
mkdir ./node_modules/playwright/node_modules/fsevents
Preview the built Electron application:
npm run electron:preview
Run unit tests:
npm run test
Run E2E tests:
npm run test:e2e
Advanced stealth automation using
playwright-with-fingerprints
for enhanced privacy and
detection avoidance.
- Enhanced Privacy: Modified browser fingerprints for stealth automation
- Service Integration: Free and premium fingerprint service support
- Windows Optimized: Specifically designed for Windows environments
- Chromium Engine: Uses Chromium with fingerprint modifications
- Set Service Key: Enter your fingerprint service key (optional for free tier)
- Fetch Fingerprint: Get a fresh fingerprint with Windows/Chrome tags
- Launch Browser: Start Chromium with the applied fingerprint
- Stealth Browsing: Browse websites with modified fingerprint data
- Download Time: Depends on internet speed
- Storage:
.data_playwright_with_fingerprints
directory - One-Time: Subsequent fingerprint requests are instant
Visit fingerprint testing sites to verify the modifications:
https://browserleaks.com/canvas
https://fingerprint.com/demo
https://amiunique.org
Multi-browser automation with Chrome and Firefox support for general automation tasks.
- Browser Choice: Chrome or Firefox selection
- CDP Integration: Chrome DevTools Protocol for external tools
- Session Management: Multiple browser instances
- System Integration: Uses your installed browsers
Each browser provides automation endpoints:
- Chrome:
http://localhost:9222
- Firefox:
http://localhost:9223
- External Tools: Connect Puppeteer, Selenium, or other automation frameworks
- Chrome: "Chrome is being controlled by automated test software" banner
- Firefox: Similar automation warning
- Console Logs: Detailed process information and CDP endpoints
The following diagram illustrates how data flows between the Vue.js frontend and Electron's main process:
graph TD
%% Define link styles
linkStyle default stroke: #666, stroke-width: 2px
%% User interaction flow - Blue
A[User] -->|Interacts with| B[Vue Components]
B -->|Calls| C[Vue Methods]
C -->|Accesses| D[window.electronAPI]
%% Frontend to backend flow - Purple
D -->|Invokes| E[IPC Bridge]
E -->|Sends via| F[IPC Channel]
F -->|Receives| G[Main Process]
G -->|Routes to| H[IPC Handlers]
H -->|Calls| I[Services]
I -->|Executes| J[Business Logic]
%% Backend to frontend flow - Green
J -->|Returns Data| I
I -->|Returns| H
H -->|Sends Response| G
G -->|Replies via| F
F -->|Receives| E
E -->|Returns to| D
%% UI update flow - Orange
D -->|Updates| C
C -->|Sets| K[Vue Data]
K -->|Triggers| L[Reactive Template]
L -->|Renders| M[Updated UI]
M --> A
%% Color the links by flow type
linkStyle 0,1,2 stroke: #1E88E5, stroke-width: 2px
linkStyle 3,4,5,6,7,8 stroke: #7B1FA2, stroke-width: 2px
linkStyle 9,10,11,12,13,14 stroke: #2E7D32, stroke-width: 2px
linkStyle 15,16,17,18,19 stroke: #FF8F00, stroke-width: 2px
subgraph "Vue.js Frontend"
B["Vue Components<br/>(ElectronIntegration,<br/>PlaywrightIntegration,<br/>FingerprintPlaywrightIntegration)"]
C["Vue Methods<br/>(async methods calling electronAPI)"]
K["Vue Data<br/>(reactive state)"]
L["Reactive Template<br/>(v-if, v-for, v-bind)"]
M["Updated UI<br/>(rendered DOM)"]
end
subgraph "Electron Renderer Process"
D["window.electronAPI<br/>(exposed by contextBridge)"]
E["ipcRenderer<br/>(invoke, send, on)"]
end
subgraph "Electron Preload Script"
N["contextBridge.exposeInMainWorld()<br/>(secure API exposure)"]
E -.- N
end
subgraph "Electron Main Process"
G["app, BrowserWindow, ipcMain<br/>(handle, on)"]
H["Handlers<br/>(PlaywrightHandlers,<br/>FingerprintPlaywrightHandlers)"]
I["Services<br/>(PlaywrightService,<br/>FingerprintPlaywrightService)"]
J["Business Logic<br/>(Playwright browser automation)"]
end
subgraph "IPC Communication"
F["IPC Channel<br/>(named channels for specific operations)"]
end
style A fill: #e1f5fe, stroke: #039be5
style B fill: #f3e5f5, stroke: #9c27b0
style C fill: #f3e5f5, stroke: #9c27b0
style D fill: #d1c4e9, stroke: #673ab7
style E fill: #d1c4e9, stroke: #673ab7
style F fill: #ffecb3, stroke: #ffa000
style G fill: #c8e6c9, stroke: #4caf50
style H fill: #c8e6c9, stroke: #4caf50
style I fill: #a5d6a7, stroke: #2e7d32
style J fill: #a5d6a7, stroke: #2e7d32
style K fill: #f3e5f5, stroke: #9c27b0
style L fill: #f3e5f5, stroke: #9c27b0
style M fill: #f3e5f5, stroke: #9c27b0
style N fill: #d1c4e9, stroke: #673ab7
This diagram shows:
- How user interactions in Vue components trigger IPC communication
- The role of the preload script and contextBridge in securing the renderer process
- How IPC channels facilitate communication between processes
- The flow of data through handlers and services in the main process
- How responses are returned to update the UI reactively
The diagram uses color-coded paths to distinguish different data flows:
- Blue: User interaction flow (user to Vue components)
- Purple: Frontend to backend flow (Vue to an Electron main process)
- Green: Backend to frontend flow (response data returning to renderer)
- Orange: UI update flow (updating Vue data and rendering UI)
βββ public/ # Static assets
β βββ favicon.ico # Application favicon
βββ src/ # Source code
β βββ electron-main/ # Electron main process (Windows-focused)
β β βββ services/ # Business logic services
β β β βββ PlaywrightService.ts # Playwright automation service
β β β βββ FingerprintPlaywrightService.ts # Fingerprint automation service
β β βββ handlers/ # IPC communication handlers
β β β βββ PlaywrightHandlers.ts # Playwright IPC handlers
β β β βββ FingerprintPlaywrightHandlers.ts # Fingerprint IPC handlers
β β βββ index.ts # Main process entry point
β βββ electron-preload/ # Electron preload scripts
β β βββ index.ts # Preload script
β β βββ types.d.ts # TypeScript definitions
β βββ components/ # Vue components
β β βββ PlaywrightIntegration.vue # Standard browser automation UI
β β βββ FingerprintPlaywrightIntegration.vue # Fingerprint automation UI
β β βββ ElectronIntegration.vue # Desktop integration UI
β β βββ Dashboard.vue # Main dashboard component
β βββ layouts/ # Page layouts
β βββ pages/ # Application pages
β βββ plugins/ # Vue plugins
β βββ router/ # Vue Router configuration
β βββ stores/ # Pinia stores
β βββ styles/ # Global styles and Vuetify settings
β βββ utils/ # Utility functions
β βββ config/ # Configuration management
β βββ auto-imports.d.ts # Auto-generated import types
β βββ components.d.ts # Auto-generated component types
β βββ typed-router.d.ts # Auto-generated router types
β βββ App.vue # Root Vue component
β βββ main.ts # Application entry point
βββ tests/ # Comprehensive test suite
β βββ setup.ts # Global test setup and utilities
β βββ unit/ # Unit and component tests (Vitest)
β β βββ components/ # Vue component tests
β β βββ config/ # Configuration unit tests
β βββ integration/ # Integration tests (Vitest)
β β βββ config_integration.spec.ts # Configuration integration tests
β βββ e2e/ # End-to-end tests (Cypress)
β β βββ fixtures/ # Test data for E2E tests
β β βββ support/ # Cypress support files
β β βββ screenshots/ # Test screenshots (auto-generated)
β β βββ videos/ # Test videos (auto-generated)
β β βββ home.cy.js # Sample E2E test
β βββ fixtures/ # Shared test fixtures
β β βββ env_files.ts # Environment file fixtures
β βββ helpers/ # Test helper utilities
β βββ config_helpers.ts # Configuration test helpers
βββ docs/ # Documentation
β βββ screenshots/ # Application screenshots
βββ build-electron/ # Compiled Electron files (auto-generated)
β βββ electron-main/ # Compiled main process
β βββ electron-preload/ # Compiled preload scripts
β βββ renderer/ # Compiled renderer (Vue app)
βββ dist-electron/ # Built Windows application (auto-generated)
β βββ {version}/ # Version-specific build output (e.g., 0.0.2/)
β βββ win-unpacked/ # Unpacked Windows application
β βββ builder-debug.yml # Electron builder debug info
β βββ builder-effective-config.yaml # Effective build configuration
βββ build-resources/ # Build assets (icons, etc.)
β βββ README.md # Icon and build resources guide
β βββ v-logo.ico # Windows application icon
β βββ v-logo.svg # SVG source icon
βββ scripts/ # Build and utility scripts
βββ node_modules/ # Dependencies (auto-generated)
βββ .env.production # Production environment variables (in git)
βββ .env.development # Development environment variables (not in git)
βββ .env.development.example # Development environment template
βββ CONFIG.md # Configuration documentation
βββ electron.vite.config.ts # Electron-Vite configuration
βββ vite.config.mts # Vite configuration with test setup
βββ cypress.config.cjs # Cypress E2E test configuration
βββ eslint.config.js # ESLint configuration
βββ tsconfig.json # TypeScript configuration (main)
βββ tsconfig.app.json # TypeScript configuration (app)
βββ tsconfig.node.json # TypeScript configuration (Node.js)
βββ tsconfig.preload.json # TypeScript configuration (preload)
βββ package.json # Dependencies and scripts
βββ package-lock.json # Dependency lock file
βββ index.html # HTML entry point
βββ env.d.ts # Environment type definitions
βββ Makefile # Development automation tasks
βββ README.md # Project documentation
Windows-Specific Build:
{
"win": {
"target": "dir",
"arch": [
"x64"
],
"icon": "build-resources/v-logo.ico"
}
}
Automation Libraries Unpacking:
{
"asarUnpack": [
"**/node_modules/playwright/**/*",
"**/node_modules/playwright-with-fingerprints/**/*"
]
}
# Development environment (.env.development)
NODE_ENV=development
PLAYWRIGHT_FINGERPRINTS_WORKING_FOLDER=.data_playwright_with_fingerprints
# Production environment (.env.production)
NODE_ENV=production
PLAYWRIGHT_FINGERPRINTS_WORKING_FOLDER=.data_playwright_with_fingerprints
Script | Description |
---|---|
npm run dev |
Start web development server |
npm run electron:dev |
Start Electron in development mode |
npm run electron:preview |
Preview built Electron application |
Script | Description |
---|---|
npm run build |
Build web application for production |
npm run electron:build |
Build complete Electron application |
npm run electron:pack |
Pack Electron app without installer |
Script | Description |
---|---|
npm run test |
Run unit and integration tests (Vitest) |
npm run test:watch |
Run tests in watch mode |
npm run test:coverage |
Generate test coverage report |
npm run test:e2e |
Run end-to-end tests with Cypress |
npm run test:e2e:open |
Open Cypress test runner |
npm run test:all |
Run all tests (unit + integration + e2e) |
Script | Description |
---|---|
npm run lint |
Lint code with ESLint |
npm run lint:fix |
Fix ESLint issues automatically |
npm run format |
Format code with Prettier |
npm run format:check |
Check code formatting |
npm run format:all |
Format all files including markdown |
npm run lint:format |
Run lint fix + format together |
npm run type-check |
Check TypeScript types |
Script | Description |
---|---|
npm run ci |
Run all checks (lint + type-check + tests) |
Script | Description |
---|---|
npm run commit |
Interactive commit with conventional format |
npm run version:dry |
Preview what next version would be |
npm run version:auto |
Automatically determine and bump version |
npm run version:patch |
Bump patch version (0.0.1 β 0.0.2) |
npm run version:minor |
Bump minor version (0.1.0 β 0.2.0) |
npm run version:major |
Bump major version (1.0.0 β 2.0.0) |
π Developer release workflow: VERSIONING.md
To create a new release with the built application:
-
Bump Version:
npm run version:patch # 0.0.1 β 0.0.2 npm run version:minor # 0.1.0 β 0.2.0 npm run version:major # 1.0.0 β 2.0.0
-
Build Application:
npm run electron:build
-
Create Release:
- Push the version tag:
git push origin v0.0.2
- Go to GitHub Releases
- Create a new release from the tag
- Upload the built application from
dist-electron/{version}/win-unpacked/
The built application includes:
VuetifyElectronStarter.exe
- Main executable- All required dependencies and libraries
- Unpacked format for easy distribution
Users can:
- Download and extract the zip file
- Run the executable directly (no installation required)
- Move the folder to any location on their system
Create this directory before building to avoid fsevents errors:
mkdir ./node_modules/playwright/node_modules/fsevents
- Fingerprint Engine: 800+ MB download on first fingerprint request
- Internet Required: Initial fingerprint setup requires internet connection
- Storage Space: Ensure adequate disk space for automation engines
- Automation Banners: Browsers show automation warnings
- Fingerprint Modifications: Enhanced stealth with fingerprint automation
- CDP Endpoints: External tools can connect to automation sessions
β Black screen in production build
- Ensure hash history is enabled for
file://
protocol - Check console for JavaScript errors
- Verify all assets are loading correctly
β Fingerprint engine download fails
- Check internet connection
- Ensure adequate disk space (800+ MB)
- Verify firewall/antivirus isn't blocking download
β Browser automation not working
- Confirm Chrome/Firefox is installed
- Check if browsers are already running
- Verify CDP ports aren't blocked
β Windows build errors
- Create fsevents directory:
mkdir ./node_modules/playwright/node_modules/fsevents
- Ensure Node.js v22+ is installed
- Check Windows build tools are available
- Check Console: Look for error messages in the Electron console
- Verify Environment: Ensure development mode works (
npm run electron:dev
) - Test Components: Try each automation feature individually
- Review Logs: Check detailed logging for automation processes
- Main Process: Use
console.log()
statements - output appears in the terminal - Renderer Process: Use browser DevTools (automatically opened in development)
- Preload Script: Use
console.log()
- output appears in DevTools console - Router Debug: Check
console
for "π§ Router Configuration Debug" to verify history mode
- Renderer Process: Automatic hot reload via Vite
- Main/Preload Process: Automatic restart when files change
This project is configured specifically for Windows development:
{
"build": {
"win": {
"target": [
{
"target": "dir",
"arch": [
"x64"
]
}
],
"icon": "build-resources/v-logo.ico",
"artifactName": "${productName}-${version}-${arch}"
}
}
}
The application includes automatic icon integration:
- Replace the icon: Add your custom
icon.ico
file tobuild-resources/
(currently usingv-logo.ico
) - Build the app: Run
npm run electron:build
- Verify: Check the executable in
dist-electron/win-unpacked/
For detailed icon requirements and creation guides, see build-resources/README.md.
This template follows Electron security best practices:
- β Context isolation enabled
- β Node integration disabled in renderer
- β Secure preload scripts
- β Content Security Policy ready
Electron applications run using the file://
protocol, which has important implications:
π§ Router Configuration:
- Development Uses
createWebHistory
(works with Vite dev server) - Production Automatically switches to
createWebHashHistory
forfile://
compatibility - URLs Production URLs will have a hash format:
file:///path/to/app/index.html#/route
π File Protocol Limitations:
- HTML5 History API doesn't work with
file://
protocol - CORS restrictions apply to local file access
- Some web APIs may behave differently
π« Font Preload Considerations:
- Font preload links work correctly with proper MIME types
- No
crossorigin
issues with local file system access - Fonts load efficiently in Electron environment
β‘ Performance Notes:
- Optimized font loading for Electron's local file system
- No console warnings about preload resources
- Efficient asset loading with proper caching
Key Differences:
- Development: Runs against Vite dev server (
http://localhost:3000
) - Production: Loads from local files (
file://
protocol) - Router: Automatically adapts history mode based on the environment
- DevTools: Available in development, disabled in production builds
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes using the interactive commit tool:
Or manually using Conventional Commits:
npm run commit # Interactive conventional commit
git commit -m 'feat: add amazing feature' git commit -m 'fix: resolve issue with component' git commit -m 'docs: update README with new instructions'
- Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
π For detailed commit and versioning guidelines: VERSIONING.md
This project follows the Conventional Commits specification:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Types:
feat
: A new featurefix
: A bug fixdocs
: Documentation only changesstyle
: Changes that do not affect the meaning of the coderefactor
: A code change that neither fixes a bug nor adds a featureperf
: A code change that improves performancetest
: Adding missing tests or correcting existing testschore
: Changes to the build process or auxiliary tools
Examples:
feat(electron): add auto-updater functionality
fix(renderer): resolve routing issue in production
docs(readme): add installation instructions
chore(deps): update electron to latest version
MIT licensed.