prepareConfig
Most apps never need this, dev, build, and extractTranslations already run it internally. Call it only when building custom tooling. See Canva App Scripts for the CLI-first workflow.
Runs the config-preparation pipeline every command shares: load
canva-app.config.{ts,…} (or the file named by options.configFile),
apply options.overrides on top, overrides > env > config file >
default, then validate the result for command.
import("./dev.ts").dev, import("./build.ts").build, and
import("./extract_translations.ts").extractTranslations
already run this internally. Call it directly only when building tooling that needs
the same resolution and validation ahead of, or independent from,
invoking one of those verbs.
Parameters
commandCommandWhich commands's validation rules to apply
Available values:
"dev""build""extractTranslation"
optionsCoreCommandOptionsConfiguration overrides and config-file selection
configFilestringExplicit config file, resolved against rootDir; must exist. Unset runs
the default canva-app.config.{ts,…} discovery at the project root,
falling back to package defaults when nothing is found.
overridesCanvaAppConfigConfiguration overrides, merged over the loaded config file as the top precedence tier: overrides > env > config file > default.
Rsbuild-specific app configuration.
This is the configuration for apps using Rsbuild as the bundler.
The bundler property is optional since Rsbuild is the default.
entrystringEntry point for the app (default: 'src/index.tsx')
rootDirstringRoot directory of the project (default: process.cwd())
outputDirstringBuild output directory, relative to rootDir. build writes artefacts
here. Bundler-tier output concerns (filename, chunking) are reachable
through the bundler escape hatch, not this field.
Default
"dist"
devServerDevServerOptionsOptional dev-server options (frontend port, HTTPS, public tunnel). CLI flags and env vars override these at run time.
portnumberFrontend dev-server port. Overridden by --override-frontend-port and the
CANVA_FRONTEND_PORT env var.
Default
8080
httpsbooleanServe the frontend over HTTPS using locally-managed certificates.
Overridden by --use-https.
Default
false
backendobjectOptional backend run alongside the dev server.
When enabled, dev spawns the backend entry under nodemon with
TypeScript support, passes SSL certificate paths through to its
environment, and ties its lifecycle to the dev server — a backend crash
tears the whole process down. Apps without a backend simply omit this field.
Use true (or any backend config, even {}) to run the backend at the
default location backend/server.ts; set entry to point elsewhere.
Examples
export default defineConfig({entry: "./src/index.tsx",backend: true, // runs backend/server.ts});
export default defineConfig({entry: "./src/index.tsx",backend: { entry: "./api/main.ts", port: 3100 },});
Backend options for the dev server.
In canva-app.config.ts, any backend config (even an empty object) enables
the backend; omit the backend field entirely to run frontend-only. As a
command override, an object without entry only patches fields — true or
{ entry } opts into a run.
entrystringPath to the backend entry script, relative to rootDir, falls back to
the package default when unset.
Default
"backend/server.ts"
portnumberPort the backend listens on, used to build DevServer.backend.url.
Falls back to CANVA_BACKEND_PORT then the package default when unset.
Default
3001
hoststringBackend host the built app calls. Falls back to CANVA_BACKEND_HOST
when unset.
tunnelbooleanExpose the backend through a public HTTPS tunnel so third-party services
(OAuth providers, webhook callbacks) can reach it during local
development. Overridden by --tunnel. Requires a tunnel authtoken in env.
extractTranslationsobjectOptional configuration for extractTranslations.
outputDirstringDirectory to write extracted messages into (default: 'dist').
outputFilestringOutput filename written into outputDir (default: 'messages_en.json').
Must be a bare filename — no directory segments; use outputDir for that.
patternstringGlob for source files to scan (default: 'src/**/*.{ts,tsx}').
bundlerstringThe bundler to use for building the app. Defaults to 'rsbuild' if not specified.
The only valid value is "rsbuild".
configRsbuildConfigFnCustomize the Rsbuild configuration. Receives the base config and context, returns modified config.
Example
export default defineConfig({config: (rsbuildConfig, { mode }) => {rsbuildConfig.plugins?.push(myPlugin());return rsbuildConfig;},});
Parameters
configRsbuildConfigcontextRsbuildContextContext passed to the Rsbuild customization function.
Mirrors WebpackContext's { mode } shape for symmetry across adapters.
modestringWhether this is a development or production build.
Available values:
"production""development"
Returns
Webpack-specific app configuration.
The bundler property is required: Rsbuild is the package default, so
webpack is always an explicit opt-in.
bundlerstringThe bundler to use for building the app.
The only valid value is "webpack".
entrystringEntry point for the app (default: 'src/index.tsx')
rootDirstringRoot directory of the project (default: process.cwd())
outputDirstringBuild output directory, relative to rootDir. build writes artefacts
here. Bundler-tier output concerns (filename, chunking) are reachable
through the bundler escape hatch, not this field.
Default
"dist"
devServerDevServerOptionsOptional dev-server options (frontend port, HTTPS, public tunnel). CLI flags and env vars override these at run time.
portnumberFrontend dev-server port. Overridden by --override-frontend-port and the
CANVA_FRONTEND_PORT env var.
Default
8080
httpsbooleanServe the frontend over HTTPS using locally-managed certificates.
Overridden by --use-https.
Default
false
backendobjectOptional backend run alongside the dev server.
When enabled, dev spawns the backend entry under nodemon with
TypeScript support, passes SSL certificate paths through to its
environment, and ties its lifecycle to the dev server — a backend crash
tears the whole process down. Apps without a backend simply omit this field.
Use true (or any backend config, even {}) to run the backend at the
default location backend/server.ts; set entry to point elsewhere.
Examples
export default defineConfig({entry: "./src/index.tsx",backend: true, // runs backend/server.ts});
export default defineConfig({entry: "./src/index.tsx",backend: { entry: "./api/main.ts", port: 3100 },});
Backend options for the dev server.
In canva-app.config.ts, any backend config (even an empty object) enables
the backend; omit the backend field entirely to run frontend-only. As a
command override, an object without entry only patches fields — true or
{ entry } opts into a run.
entrystringPath to the backend entry script, relative to rootDir, falls back to
the package default when unset.
Default
"backend/server.ts"
portnumberPort the backend listens on, used to build DevServer.backend.url.
Falls back to CANVA_BACKEND_PORT then the package default when unset.
Default
3001
hoststringBackend host the built app calls. Falls back to CANVA_BACKEND_HOST
when unset.
tunnelbooleanExpose the backend through a public HTTPS tunnel so third-party services
(OAuth providers, webhook callbacks) can reach it during local
development. Overridden by --tunnel. Requires a tunnel authtoken in env.
extractTranslationsobjectOptional configuration for extractTranslations.
outputDirstringDirectory to write extracted messages into (default: 'dist').
outputFilestringOutput filename written into outputDir (default: 'messages_en.json').
Must be a bare filename — no directory segments; use outputDir for that.
patternstringGlob for source files to scan (default: 'src/**/*.{ts,tsx}').
configWebpackConfigFnCustomize the webpack configuration. Receives the base config and context, returns modified config.
Example
export default defineConfig({bundler: 'webpack',config: (webpackConfig, { mode }) => {webpackConfig.plugins?.push(new MyPlugin());return webpackConfig;},});
Parameters
configConfigurationcontextWebpackContextContext passed to the webpack customization function.
Shaped to match argv.mode from webpack's own CLI convention. Other
bundler adapters mirror the same { mode } shape for symmetry.
modestringWhether this is a development or production build.
Available values:
"production""development"
Returns
Returns
The prepared config, its source file path, and any notices. This is a Promise that resolves with the following object:
configFullConfigThe fully-resolved config the engine consumes.
bundlerstringThe resolved bundler, defaulting to Rsbuild.
Available values:
"rsbuild""webpack"
entrystringResolved frontend entry, relative to rootDir (or absolute), defaulting
to src/index.tsx; validateConfig checks it exists.
rootDirstringResolved project root, defaulting to process.cwd().
outputDirstringResolved build output directory, relative to rootDir (or absolute),
defaulting to dist. Consumers absolutize against rootDir.
assetsDirstringResolved static assets directory, relative to rootDir (or absolute),
defaulting to assets. Consumers absolutize against rootDir.
Local development only, not recommended for production builds — imported
assets bundle directly into app.js, and apps have a 5MB submission size
limit. Not part of the canva-app.config.ts schema (unlike outputDir);
set via the CANVA_ASSETS_DIR env var, for tooling like the
starter-kit's examples/ runner, which shares one asset directory
across many apps.
extractTranslationsobjectResolved extractTranslations options, all fields defaulted.
outputDirstringoutputFilestringpatternstringdevServerobjectElaborated dev-server options (the internal superset of the public DevServerOptions, adding HMR, app origin, and SSL cert paths). Port, HTTPS, and HMR are always resolved.
portnumberhttpsobjectOptions for SSL certificate generation.
sslDirstringDirectory to store SSL certificates (default: .ssl in rootDir)
rootDirstringRoot directory of the project (default: process.cwd())
hmrbooleanopenbooleanOpen browser on start
appOriginstringApp origin URL for HMR CORS configuration
sslSSLCertPathsPre-generated SSL certificate paths (avoids regeneration)
certFilestringPath to the SSL certificate file
keyFilestringPath to the SSL private key file
appIdstringThe app's identity from CANVA_APP_ID, captured by resolveConfig so
validation stays env-free. Required when a backend runs in dev.
configobjectCustomize the selected bundler's configuration
Function to customize webpack configuration. Receives the base config and returns a modified version.
Example
config: (webpackConfig, { mode }) => {if (mode === "production") {webpackConfig.plugins?.push(new MyPlugin());}return webpackConfig;}
Parameters
configConfigurationcontextWebpackContextContext passed to the webpack customization function.
Shaped to match argv.mode from webpack's own CLI convention. Other
bundler adapters mirror the same { mode } shape for symmetry.
modestringWhether this is a development or production build.
Available values:
"production""development"
Returns
Function to customize the Rsbuild configuration. Receives the base config and returns a modified version.
Example
config: (rsbuildConfig, { mode }) => {if (mode === "production") {rsbuildConfig.output = { ...rsbuildConfig.output, sourceMap: false };}return rsbuildConfig;}
Parameters
configRsbuildConfigcontextRsbuildContextContext passed to the Rsbuild customization function.
Mirrors WebpackContext's { mode } shape for symmetry across adapters.
modestringWhether this is a development or production build.
Available values:
"production""development"
Returns
backendobjectResolved backend. resolveConfig collapses the public boolean/object form
to an object (or undefined): a resolved entry marks a local backend to
spawn, while a lone host (e.g. from CANVA_BACKEND_HOST with no run
opt-in) carries the deployed BACKEND_HOST for an external backend without
running one. onCrash is the api-only hook invoked after a backend crash
tears the frontend down — the CLI exits non-zero, an embedding consumer can
recover.
portnumbertunnelbooleanentrystringPath to the backend entry script, relative to rootDir, falls back to
the package default when unset.
Default
"backend/server.ts"
hoststringBackend host the built app calls. Falls back to CANVA_BACKEND_HOST
when unset.
onCrashfunctionReturns
void
harnessHarnessConfigResolved test-harness paths. Test harness mode is deliberately only invocable
through the concrete env IN_HARNESS, to avoid accidental builds with the
harness. The harness entry/init are absolute; html is the filename each
adapter's dev() uses to build its printed URL.
For more info, see: https://www.canva.dev/docs/apps/test-harness/
entrystringAbsolute path to the harness entry module.
Default
"harness/harness.tsx"
initstringAbsolute path to the harness init module.
Default
"harness/init.ts"
htmlstringFilename used only to build the printed dev-server URL — not read or
served by app-scripts itself.
Default
"harness.html"
noticesstring[]Non-fatal advisories for the caller to render.
configPathstringAbsolute path of the loaded config file; undefined when defaults applied.