Project Config Reference
The project.config.json file in the project root configures site-wide settings: URLs, icons, internationalization, breakpoints, fonts, component organization, and external libraries.
Full Example
{
"siteUrl": "https://example.com",
"icons": {
"favicon": "/icons/favicon.ico",
"appleTouchIcon": "/icons/apple-touch-icon.png"
},
"componentTypes": [
{ "id": "ui", "label": "UI", "color": "#3b82f6" },
{ "id": "shared", "label": "Shared", "color": "#bababa" },
{ "id": "custom", "label": "Custom", "color": "#daf50f" }
],
"i18n": {
"defaultLocale": "en",
"locales": [
{
"code": "en",
"name": "EN",
"nativeName": "EN",
"langTag": "en-US",
"icon": "/icons/us.svg"
},
{
"code": "pl",
"name": "PL",
"nativeName": "PL",
"langTag": "pl-PL",
"icon": "/icons/pl.svg"
}
]
},
"breakpoints": {
"tablet": 1024,
"mobile": 540
},
"responsiveScales": {
"enabled": true,
"baseReference": 16,
"fontSize": { "tablet": 0.8, "mobile": 0.7 },
"padding": { "tablet": 0.75, "mobile": 0.5 },
"margin": { "tablet": 0.7, "mobile": 0.45 },
"gap": { "tablet": 0.65, "mobile": 0.4 }
},
"fonts": [
{
"path": "/fonts/Inter-VariableFont_opsz,wght.ttf",
"family": "Inter",
"weight": 400,
"fontDisplay": "swap"
}
],
"componentCategories": {
"Navigation": "shared",
"Stack": "ui"
}
}Properties
siteUrl
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Full URL of the deployed site |
Used during static build to generate robots.txt and sitemap.xml. Include the protocol and domain without a trailing slash.
{
"siteUrl": "https://example.com"
}icons
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Path to favicon file |
|
| No | Path to Apple touch icon |
Paths are relative to the project's public directory. During static build, <link> tags are generated in the HTML <head>.
{
"icons": {
"favicon": "/icons/favicon.ico",
"appleTouchIcon": "/icons/apple-touch-icon.png"
}
}componentTypes
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Categories for organizing components |
Each component type has:
Field | Type | Description |
|---|---|---|
|
| Unique identifier |
|
| Display name in the editor |
|
| Hex color for visual distinction |
{
"componentTypes": [
{ "id": "ui", "label": "UI", "color": "#3b82f6" },
{ "id": "shared", "label": "Shared", "color": "#bababa" },
{ "id": "custom", "label": "Custom", "color": "#daf50f" }
]
}componentCategories
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Default category mapping for components |
Keys are component names, values are component type IDs from componentTypes.
{
"componentCategories": {
"Navigation": "shared",
"Footer": "shared",
"Hero": "ui",
"Stack": "ui",
"PricingCard": "custom"
}
}i18n
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Internationalization configuration |
Omit i18n entirely for single-language projects.
I18nConfig
Field | Type | Description |
|---|---|---|
|
| Locale code used when no prefix is in the URL |
|
| Array of supported locales |
LocaleConfig
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | URL prefix and translation key (e.g., |
|
| Yes | English name for admin UI (e.g., |
|
| Yes | Native name for public UI (e.g., |
|
| Yes | BCP 47 language tag for SEO (e.g., |
|
| No | Path to flag icon (e.g., |
{
"i18n": {
"defaultLocale": "en",
"locales": [
{
"code": "en",
"name": "English",
"nativeName": "English",
"langTag": "en-US",
"icon": "/icons/us.svg"
},
{
"code": "pl",
"name": "Polish",
"nativeName": "Polski",
"langTag": "pl-PL",
"icon": "/icons/pl.svg"
},
{
"code": "de",
"name": "German",
"nativeName": "Deutsch",
"langTag": "de-DE",
"icon": "/icons/de.svg"
}
]
}
}When i18n is configured:
The default locale pages are at the root (
/about)Non-default locale pages are prefixed (
/pl/about,/de/about)The
<html>tag gets the appropriatelangattributehreflanglink tags are added for SEO
breakpoints
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Responsive breakpoint widths in pixels |
Breakpoint names become keys in the style object. Default values:
{
"breakpoints": {
"tablet": 1024,
"mobile": 540
}
}The value is the maximum viewport width (in pixels) at which the breakpoint applies. Styles are generated as @media (max-width: {value}px).
Custom breakpoints are supported:
{
"breakpoints": {
"desktop": 1440,
"tablet": 1024,
"mobile": 540
}
}responsiveScales
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Auto-scaling multipliers for responsive design |
When enabled, numeric CSS values for specific property types are automatically scaled at smaller breakpoints. This reduces the need to manually set tablet and mobile overrides.
Field | Type | Description |
|---|---|---|
|
| Enable or disable auto-scaling |
|
| Base font size reference (typically |
|
| Multipliers per breakpoint for font sizes |
|
| Multipliers per breakpoint for padding |
|
| Multipliers per breakpoint for margin |
|
| Multipliers per breakpoint for gap |
{
"responsiveScales": {
"enabled": true,
"baseReference": 16,
"fontSize": { "tablet": 0.8, "mobile": 0.7 },
"padding": { "tablet": 0.75, "mobile": 0.5 },
"margin": { "tablet": 0.7, "mobile": 0.45 },
"gap": { "tablet": 0.65, "mobile": 0.4 }
}
}A multiplier of 0.75 means the value is scaled to 75% of the base value. Explicit tablet or mobile style overrides take precedence over auto-scaling.
fonts
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Custom font definitions |
Each font entry:
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | Path to the font file |
|
| Yes | CSS font-family name |
|
| No | Font weight (e.g., |
|
| No | CSS |
{
"fonts": [
{
"path": "/fonts/Inter-VariableFont_opsz,wght.ttf",
"family": "Inter",
"weight": 400,
"fontDisplay": "swap"
},
{
"path": "/fonts/FiraCode-Regular.woff2",
"family": "Fira Code",
"weight": 400,
"fontDisplay": "swap"
}
]
}Fonts are rendered as @font-face declarations in the built CSS.
libraries
Property | Type | Required | Description |
|---|---|---|---|
|
| No | External JavaScript libraries |
Each library entry:
Field | Type | Required | Description |
|---|---|---|---|
|
| Yes | CDN URL for the script |
|
| Yes | Library name for display |
|
| No | Add |
|
| No | Add |
{
"libraries": {
"js": [
{
"url": "https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js",
"name": "GSAP",
"defer": true
}
]
}
}csp
Property | Type | Required | Description |
|---|---|---|---|
|
| No | Content Security Policy configuration |
Specifies additional allowed domains for CSP directives. These are merged with default CSP rules.
Field | Type | Description |
|---|---|---|
|
| Additional script-src domains |
|
| Additional style-src domains |
|
| Additional connect-src domains |
|
| Additional frame-src domains |
|
| Additional font-src domains |
|
| Additional img-src domains |
{
"csp": {
"scriptSrc": ["https://cdnjs.cloudflare.com", "https://unpkg.com"],
"styleSrc": ["https://fonts.googleapis.com"],
"fontSrc": ["https://fonts.gstatic.com"],
"imgSrc": ["https://images.unsplash.com"]
}
}Static Build Outputs
During bun run build, the following files are auto-generated from config values:
File | Source |
|---|---|
| Generated from |
| Generated from |
Favicon | From |
Apple touch icon | From |
These files are copied to the build output if they exist in the project root:
File | Purpose |
|---|---|
| Netlify/Cloudflare headers |
| Netlify/Cloudflare redirects |
| LLM context file |
| Team credits |
| Ad network verification |
| Security contact info |
| GitHub Pages custom domain |
| PWA manifest |
| PWA web manifest |
| Well-known directory (copied recursively) |
Next Steps
Style Properties -- how breakpoints and responsive scales affect styles
Component Props -- component types and categories
Node Types -- locale-list node requires i18n config
CMS Fields -- i18n field types for localized content