MyGo
Configuration

Reference

Configuration

Mygo.config.ts, or mygo.json.

mygo.config.ts, at the root of a project, describes the app and how the CLI develops and builds it. Its default export is the configuration, typed by defineConfig from the mygo-cli package that projects depend on, so editors complete and document every field:

import { defineConfig } from "mygo-cli";

export default defineConfig({
  name: "My App",
  slug: "my-app",
  identifier: "com.example.myapp",
  version: "1.2.0",
  copyright: "© 2026 Example Inc.",

  devUrl: "http://localhost:5173",
  devCommand: "bun run dev:web",
  buildCommand: "bun run build:web",
  frontendDist: "dist",
  bindings: "src/mygo.ts",
  out: "build",

  resources: ["third_party/licenses"],
  urlSchemes: ["myapp"],
  fileAssociations: [{ ext: ["md"], name: "Markdown Document", mimeType: "text/markdown" }],

  i18n: { dir: "locales", source: "en" },
  updates: { publicKey: "…", github: "you/my-app" },
  macos: { signingIdentity: "Developer ID Application: Jane Doe (TEAMID)" },
  windows: { certificate: "certs/code-signing.pfx" },
  linux: { maintainer: "Jane Doe <jane@example.com>" },
});

Every field is optional. The configuration can also be JSON, in mygo.json, as projects of native UI have it: they have no JavaScript, and no frontend to develop or build, so they leave out the fields of the frontend.

The app

Field Default
name the directory's name the name users see: the app, its executable, menus, installers; Windows can show another, windows.displayName
slug the name in lower case, with hyphens between its words, e.g. my-app of My App; Chinese characters take their most common Mandarin reading without tones, each its own word, and kana and Hangul their romanization, e.g. yun-yin-le of 云音乐, ramen of ラーメン the name of the app's files where a name must be plain ASCII: the disk images of macOS and the installers of Windows, the Linux executable, its desktop entry, icon, Debian and RPM packages and /opt directory, the update archives of every platform, the variables of the install scripts and the MIME types the app defines; lower-case letters and digits with single hyphens between them. Set it to choose another, as cloud-music for 云音乐, and keep it once the app is released (see Linux)
identifier com.mygo. and the name's letters and digits, e.g. com.mygo.myapp a reverse DNS name unique to the app, e.g. com.example.myapp; systems key preferences, permissions and registrations on it
version 0.1.0 the version of the app, which App.Version() returns and updates compare
copyright the copyright notice of the app, in its Info.plist (macOS) and file properties (Windows)
publisher the copyright notice without its "©" and years, e.g. Example Inc. of © 2026 Example Inc. who makes the app: the publisher that Settings > Apps lists for the installed app on Windows, and its company in the file properties
license license in package.json the SPDX license expression of the app, such as MIT or Apache-2.0 WITH LLVM-exception, which the RPM package and the PKGBUILD of Arch Linux record
icon resources/icon.png when it exists a square PNG, ideally 1024×1024; its name with -dev, as icon-dev.png, beside it is the development app's, when it exists
main . the Go package of the app, relative to the project

Development and the frontend

Field Default
devUrl the dev server that mygo dev points the app at, an http(s) URL; windows load it for URLs without a scheme, such as /
devCommand runs in the project directory while mygo dev runs, e.g. a Vite dev server; the app starts once devUrl answers
buildCommand builds the frontend before mygo build compiles the app
frontendDist the directory of the built frontend, which mygo build embeds into the app; mygo dev serves it from disk when there is no devUrl
bindings frontend/src/mygo.ts when frontend/package.json depends on mygo-runtime, else src/mygo.ts when package.json at the root does, else mygo.ts when the configuration has a frontend (devUrl, devCommand, buildCommand or frontendDist); none for an app without one, such as one of native UI where mygo generate writes the TypeScript client
out dist where mygo build writes the builds, one directory per platform

See the frontend for how they fit together. New projects set out to build, apart from Vite's dist.

Integration

Field
resources files and directories copied into the app of every platform, next to the contents of the resources directory, under their base names; see resources, and platform resources for the files of one platform
resourcesExclude files of the resources directory left out of the apps: patterns of their paths there, such as ["**/*.psd", "design"], where ** matches any number of directories; Go source files are always left out. See leaving files out
urlSchemes the URL schemes the app opens, such as myapp for myapp://…, which reach App.OnOpenURL; see deep links
fileAssociations the file types the app opens, which reach App.OnOpenFile; see file associations

Each file association has:

Field
ext the file name extensions, without dots: ["md", "markdown"]
name what the files are: "Markdown Document"
mimeType their MIME type, by which Linux identifies files; the app defines an unregistered one (x-), and without one application/x-<app>-<ext>
role Editor (the default) or Viewer, on macOS

i18n

The catalogs of the app's messages, a JSON file per language; see Languages. Without i18n, the app ships English only.

Field Default
dir locales the directory of the catalogs, <tag>.json for each language the app ships (de.json, zh-Hant.json); a Go package of its own, where mygo generate writes the Go functions of the messages
source en the language the app is written in, whose catalog has every message and which the others fall back to

updates

Signed auto-updates. publicKey and one of github and url are required.

Field Default
publicKey the contents of mygo-update.pub, from mygo keygen
github a public repository, owner/name, whose releases hold the updates
tagPrefix v what precedes the version in release tags; another prefix, such as desktop-v, makes apps find the newest release tagged with it rather than the repository's latest
url instead of github, the HTTPS URL of a directory holding the updates
s3 the bucket that serves url, which mygo build -upload uploads to: bucket, and optionally prefix, its directory, region (default: AWS_REGION, else us-east-1), endpoint, of a compatible service such as Cloudflare R2, and pathStyle (see publishing to S3)
privateKey the path of mygo-update.key, for mygo build; the MYGO_UPDATER_PRIVATE_KEY environment variable, holding the key, takes precedence
changelog CHANGELOG.md when it exists a Markdown file whose ## <version> section becomes the release notes
deltas 3 how many earlier versions get a delta update; 0 for none

macos

Field Default
icon the icon as an asset catalog, an Assets.car or an Icon Composer .icon, beside the .icns of icon; or an .icns in its place. See the icon
minimumSystemVersion 12.0 the oldest macOS the app runs on
signingIdentity -, ad hoc the identity that signs the app and its disk image, e.g. Developer ID Application: Jane Doe (TEAMID)
entitlements a property list of entitlements to sign the app with
provisioningProfile a profile embedded as Contents/embedded.provisionprofile before signing; must match the app's identifier, entitlements and signing identity; cannot be used with ad-hoc signing. See provisioning profiles
helperEntitlements property lists of entitlements for code among the resources, by its path there, e.g. { "bin/server": "server.entitlements.plist" }; other code keeps the entitlements it is signed with. See helper executables
infoPlist keys added to the app's Info.plist, replacing MyGo's, e.g. NSCameraUsageDescription
dmgTitle name the volume name of the disk image
notarize notarizes production disk images: keychainProfile, the profile of xcrun notarytool store-credentials, and optionally keychain, the keychain holding it

See macOS.

windows

Field Default
displayName name the name Windows shows the app by: its Start menu and desktop shortcuts, its entry in Settings > Apps, the installer's title and messages, and the product name in the executable's file properties. The executable, its install folder and the files named after name or slug keep their names, e.g. 天气助手 for an app named weather, whose executable stays weather.exe
installDirName name the name of the folder the installer installs the app in, %LOCALAPPDATA%\Programs\<installDirName>, e.g. an ASCII ZhiLian for an app named 智链; the executable, the shortcuts, the entry in Settings > Apps and everything else users see keep the name. No path separators, :*?"<>|, or . and ... Changing it moves new installs only. See the installer
certificate a code signing certificate (.pfx) for the executable, the unsigned executables and libraries among the resources, and the installer; its password comes from MYGO_WINDOWS_CERTIFICATE_PASSWORD
signCommand instead of certificate, a command that signs a file, with %1 for its path
timestampUrl http://timestamp.digicert.com the time stamping server of certificate
installerInclude an NSIS script that the installer includes, e.g. build/installer.nsh, whose customInit, customInstall and customUnInstall macros run when the installer starts, at the end of the install, and in the uninstall before the app's folder is removed. See installer hooks

See Windows.

linux

Field Default
maintainer author in package.json, else name Name <email>, the maintainer of the Debian and RPM packages and of the PKGBUILD
comment a short description, for the desktop entry and the packages
categories ["Utility"] the categories of the desktop entry, which place it in application menus
depends packages the app needs besides GTK and WebKitGTK, by package format (deb, rpm and arch), or as a list of Debian packages mapped to the Arch Linux and RPM packages MyGo knows
webview true false for an app that shows no web page, as one of native UI: the Debian and RPM packages and the PKGBUILD depend on GTK alone, and install.sh and mygo doctor do not ask for WebKitGTK
command none a command that runs the app, or a list of names, as ["my-app", "ma"], which adds a short one: /usr/bin/<command> from the Debian and RPM packages and the PKGBUILD, ~/.local/bin/<command> from install.sh, for each
formats ["deb", "rpm", "pkgbuild"] the packages mygo build writes, of deb, rpm and pkgbuild; the archive with install.sh is always written, as install.sh updates the app from it and the PKGBUILD packages it, so [] writes it alone

See Linux.

Computed configuration

The configuration is code, so it can compute fields: read the version from package.json, or a signing identity from the environment of CI. The default export may also be a function, which can be async, of the command running ("dev", "build", "generate" or "init"):

import { defineConfig } from "mygo-cli";
import pkg from "./package.json" with { type: "json" };

export default defineConfig(({ command }) => ({
  name: command === "dev" ? "My App (dev)" : "My App",
  version: pkg.version,
  macos: {
    signingIdentity: process.env.MACOS_SIGNING_IDENTITY ?? "-",
  },
}));

How it runs

The CLI evaluates mygo.config.ts with Bun, or else Node.js 22.6 or later, in the project directory, and checks the result. Node.js runs TypeScript by removing the types, so the file may use type annotations but not syntax that generates code, such as enum. What the file prints goes to the terminal, apart from the CLI's output. mygo dev reloads the app when the file changes, but not when files it imports do.

mygo.json

The configuration can be JSON instead, in mygo.json, which needs no JavaScript runtime to read; mygo init -template native makes one:

{
  "name": "My App",
  "identifier": "com.example.myapp",
  "devUrl": "http://localhost:5173",
  "macos": { "signingIdentity": "Developer ID Application: Jane Doe (TEAMID)" }
}

It has the same fields. A project has either mygo.config.ts or mygo.json, not both.