Config
This page is a reference for the settings people change most often after starting with create-frontron, or after wiring frontron into an existing web project.
You do not need to learn the whole desktop layer at once. Start with the values that have the biggest visible effect, then come back here when you need a specific desktop behavior.
Good first places to change
For most people, this order is enough:
public/icon.ico- root
frontron.config.tsapp metadata - build output policy in
frontron.config.ts frontron/windows/index.tsvite.config.ts
1. Commands
The main run and build commands live in package.json.
The generated starter uses this shape:
{
"scripts": {
"dev": "vite",
"web:dev": "vite",
"web:build": "vite build",
"app:dev": "frontron dev",
"app:build": "frontron build"
}
}For a standard Vite project, frontron dev and frontron build can infer the web command and target from package.json and vite.config.*.
If you are retrofitting an existing frontend, keep this same script shape when possible.
Add web.dev and web.build only when your project needs explicit custom values that frontron cannot infer safely.
2. App metadata
The main metadata values live in the root frontron.config.ts.
The most common fields are:
app.nameapp.idapp.iconapp.descriptionapp.authorapp.copyright
If app.icon is omitted, Frontron uses its default packaged icon.
Example:
app: {
name: 'My App',
id: 'com.example.myapp',
icon: './public/icon.ico',
description: 'Desktop build for My App',
author: 'My Team',
copyright: 'Copyright 2026 My Team',
}3. Packaging policy
Normal packaged-app decisions also live in frontron.config.ts.
build: {
outputDir: 'release',
artifactName: '${productName}-${version}-${target}.${ext}',
publish: 'never',
windows: {
targets: ['portable', 'dir'],
},
mac: {
targets: ['dmg', 'zip'],
},
linux: {
targets: ['AppImage', 'deb'],
},
}The common fields are:
build.outputDir: change the packaged output folderbuild.artifactName: change artifact namingbuild.publish: choose the publish mode forelectron-builderbuild.asar: enable or disableasarbuild.compression: choosestore,normal, ormaximumbuild.files: filter staged packaged app contentsbuild.extraResources: copy extra project files into packaged resourcesbuild.extraFiles: copy extra project files next to packaged app outputbuild.fileAssociations: register packaged document/file associationsbuild.windows.targets: choose Windows targets such asnsis,portable, ordirbuild.windows.icon,build.windows.publisherName,build.windows.certificateSubjectName,build.windows.signAndEditExecutablebuild.windows.requestedExecutionLevel,build.windows.artifactNamebuild.nsis.oneClick,build.nsis.perMachine,build.nsis.allowToChangeInstallationDirectorybuild.nsis.deleteAppDataOnUninstall,build.nsis.installerIcon,build.nsis.uninstallerIconbuild.mac.targets: choose macOS targets such asdmg,zip,pkg, ordirbuild.mac.icon,build.mac.category,build.mac.identity,build.mac.hardenedRuntimebuild.mac.gatekeeperAssess,build.mac.entitlements,build.mac.entitlementsInherit,build.mac.artifactNamebuild.linux.targets: choose Linux targets such asAppImage,deb,rpm, ordirbuild.linux.icon,build.linux.category,build.linux.packageCategory,build.linux.artifactNamebuild.advanced.electronBuilder: add guarded extraelectron-builderfields for edge casesdeepLinks.enabled,deepLinks.name,deepLinks.schemesupdates.enabled,updates.provider,updates.url,updates.checkOnLaunchsecurity.externalNavigation,security.newWindow
If you omit build.outputDir, frontron uses output/.
Path-based resource settings such as build.extraResources, build.extraFiles, build.windows.icon, build.nsis.installerIcon, build.mac.icon, build.mac.entitlements, build.mac.entitlementsInherit, and build.linux.icon are resolved from the project root.
build.files is different. It filters the staged packaged app contents, so keep those patterns relative to the staged app root.
build.fileAssociations is the typed file-association surface. Use it for packaged document types instead of trying to push raw fileAssociations through build.advanced.electronBuilder.
Path-based file association icons are resolved from the project root.
On Windows, electron-builder only applies file associations for NSIS builds, and NSIS registration is effective when build.nsis.perMachine is true.
build.advanced.electronBuilder is a best-effort escape hatch. Prefer the typed build.* fields first. frontron blocks the staged app paths, package entry wiring, and other packaging fields it already owns.
Typed signing fields describe normal product policy, not secret material. Certificates, keychains, and CI signing secrets still stay outside the repo.
updates.* is also a typed policy surface, but the supported slice is intentionally small. frontron currently supports a generic feed URL with launch-time update checks for packaged macOS apps only.
Keep updates.url empty only when updates.enabled is false.
deepLinks.* controls custom protocol registration and runtime deep-link capture. The current slice registers the configured schemes through packaged build metadata and exposes incoming URLs through bridge.deepLink.getState() and bridge.deepLink.consumePending().
security.* is the first typed runtime policy slice for external navigation. Use it when your product should explicitly decide whether external links stay in-app, are blocked, or are opened in the system browser.
Example:
security: {
externalNavigation: 'openExternal',
newWindow: 'deny',
}Supported values are:
allowdenyopenExternal
These policies only apply when renderer content tries to leave the current app origin. Same-origin navigation stays inside the app.
4. Window config
Window definitions live in frontron/windows/index.ts.
The generated starter uses a route-based window shape:
const windows = {
main: {
route: '/',
width: 1280,
height: 800,
frame: false,
minWidth: 960,
minHeight: 640,
center: true,
autoHideMenuBar: true,
},
}main is still the primary window.
Any additional configured windows are runtime-owned named windows.
In the current slice, non-primary configured windows are lazy singleton windows. frontron does not create them during bootstrap. Open them later from menu, tray, hooks, or renderer bridge calls such as bridge.windows.open({ name: 'settings' }).
Common window fields you can now change from frontron.config.ts or frontron/windows/index.ts are:
routewidth,heightminWidth,minHeight,maxWidth,maxHeightframe,resizableshow,centerfullscreen,fullscreenablemaximizable,minimizable,closablealwaysOnTop,skipTaskbarbackgroundColor,transparentautoHideMenuBartitle,titleBarStylezoomFactor,sandbox,spellcheck,webSecurityadvanced: guarded extraBrowserWindowoptions for edge cases
Use show: false when your app should start hidden and open later from your tray or bridge logic.
windows.*.advanced is intentionally limited. Frontron still owns webPreferences, icon wiring, and the common typed window fields above.
The safe web preference subset is intentionally small. Use zoomFactor, sandbox, spellcheck, and webSecurity here, but keep preload, contextIsolation, nodeIntegration, and raw session ownership inside frontron.
5. Development server alignment
If you set web.dev.url explicitly, the development server port in vite.config.ts must match it.
If they do not match, the desktop window can open with a blank page.
6. The desktop bridge
Renderer code should use only frontron/client.
import { bridge } from 'frontron/client'
const version = await bridge.system.getVersion()
const state = await bridge.window.getState()
const nativeStatus = await bridge.native.getStatus()Starter projects and compatible manual installs register custom namespaces from frontron/bridge/.
// frontron/bridge/index.ts
const bridge = {
app: {
getGreeting: () => 'Hello from bridge',
},
}
export default bridge7. Output paths
The main generated paths are:
dist/
output/
.frontron/dist/: built web outputoutput/: default packaged desktop output.frontron/:frontronstaging, manifests, and generated types
If you set build.outputDir, replace output/ with that folder when you inspect packaged output.
8. Menu, tray, and hooks
Starter/template app-layer desktop extensions live under frontron/.
import menu from './frontron/menu'
import tray from './frontron/tray'
import hooks from './frontron/hooks'frontron/menu.ts: application menu definitionfrontron/tray.ts: system tray definitionfrontron/hooks/:beforeDev,beforeBuild,afterPack
9. Rust slot
The official Rust slot is enabled from the root frontron.config.ts.
export default defineConfig({
rust: {
enabled: true,
},
})The generated starter scaffold lives under frontron/rust/.
npm run app:dev: runscargo buildnpm run app:build: runscargo build --release
Renderer code still goes through frontron/client.
10. How to use this page
This page is a reference page for the support package, not a tutorial.
TIP
If you want a slower walkthrough before changing values, start with the "Change App Name and Icon" guide first.