Configuration
Configuring and customizing your application.
Inertia Start is designed to be easily configurable. Configuration is done via environment variables and standard Laravel config files. For a deep dive, check the Laravel Configuration documentation.
Environment Variables
The .env file in the root of your project contains sensitive credentials and environment-specific settings.
Critical variables to configure:
APP_NAME: The name of your application.APP_URL: The URL of your application (used for generating links).DB_*: Database connection details.MAIL_*: Email service configuration.
On top of the environment variables that come with Laravel, Inertia Start adds its own variables.
These variables use the I_S_ prefix.
General feature flags
| Variable | Description | If unset |
|---|---|---|
I_S_THEME | Force a specific theme (light or dark). Leave unset to let users switch theme. | null |
I_S_APP_LAYOUT | Choose the authenticated app layout. Supported values: sidebar, header. | sidebar |
I_S_APP_ADMIN_LAYOUT | Choose the app admin area layout. Supported values: sidebar, header. | sidebar |
I_S_BEHIND_CLOUDFLARE_PROXY | Trust Cloudflare's IP ranges as proxies so IP and country detection use the CF-* headers. Only enable it when you host outside Laravel Cloud behind your own Cloudflare proxy. | false |
I_S_ENABLE_ACCOUNTS | Enable account registration and account-related routes. | false |
I_S_ACCOUNT_MUST_ACCEPT_TERMS | Require Terms of Service and Privacy Policy acceptance during registration. | false |
I_S_ACCOUNT_NAME_REQUIRED | Require a name field during registration. | false |
I_S_ENABLE_AVATARS | Enable profile photo uploads. | false |
I_S_ENABLE_USERNAMES | Enable usernames on accounts. | false |
I_S_ENABLE_LOCALIZATION | Enable multi-language routing and locale switching. | false |
I_S_ENABLE_ANALYTICS | Enable Umami analytics integration. | false |
I_S_UMAMI_HOST | Base URL of your Umami instance. | null |
I_S_UMAMI_WEBSITE_ID | Website identifier used by Umami. | null |
I_S_UMAMI_TRACKER_SCRIPT | Tracker script filename served by Umami (for example script.js). | null |
I_S_CONTACT_EMAIL | The email address customers can contact you at. Distinct from MAIL_FROM_ADDRESS (the sending address for transactional email). | null |
When I_S_CONTACT_EMAIL is set, it is used as the global Reply-To address for every email sent by the application (reply_to in config/mail.php), and the footer of notification emails invites recipients to write to that address. When it is left empty, no Reply-To header is added.
Cloudflare on Laravel Cloud
Laravel Cloud already resolves trusted proxies for you, so you can leave I_S_BEHIND_CLOUDFLARE_PROXY unset there (it will be ignored anyway). See Cloudflare proxy in the deployment guide.
App layout
The authenticated application shell is configurable through I_S_APP_LAYOUT.
sidebar: render the default sidebar application shell.header: render the header-based application shell.
Example:
I_S_APP_LAYOUT=headerThe value is normalized in config/inertia-start.php, then shared with the frontend as page.props.appLayout through HandleInertiaRequests middleware.
Localization
When localization is enabled, these are the relevant configuration files and directories:
config/inertia-start.php: all localization settings live under thelocalizationkey.locales,detection, andstorageare global, whilelocalized_urlsonly applies when you use localized URLs.config/env/locales.json: by default, Inertia Start uses this file to populateinertia-start.localization.locales.lang/: translation strings, including optionalroutes.phpfiles when you translate URI segments withLang::uri(...).
By default, config/inertia-start.php uses en as both the fallback locale and the omitted locale under localization.localized_urls. That means English URLs stay unprefixed while the other locales use a prefix.
If your primary language is not English, update both values:
'localization' => [
'localized_urls' => [
'fallback_locale' => 'fr',
'omitted_locale' => 'fr',
],
],See the Localization guide for the full routing and translation workflow.
Billing system
Use php artisan inertia-start:billing:setup to toggle billing and choose the default provider, then fill in the provider credentials you need.
Shared billing settings
| Variable | Description | If unset |
|---|---|---|
I_S_ENABLE_BILLING | Enable billing features and billing-related UI. | false |
I_S_DEFAULT_PAYMENT_PROVIDER | Default provider for checkout and billing flows. Supported values: stripe, paddle. | stripe |
I_S_ENABLED_PAYMENT_PROVIDERS | Comma-separated providers kept enabled for provider-specific routes/webhooks. Keep previous providers here while legacy paying customers still exist. | empty (default provider is still enabled automatically) |
CASHIER_CURRENCY | Default billing currency used by Cashier. | usd |
Switching payment providers
If you switch I_S_DEFAULT_PAYMENT_PROVIDER after you already have paying customers, keep the previous provider in I_S_ENABLED_PAYMENT_PROVIDERS, and keep its credentials and webhooks configured.
Existing customers still rely on that provider for portal access and webhook lifecycle syncing.
Stripe
| Variable | Description | If unset |
|---|---|---|
STRIPE_KEY | Stripe publishable key. | null |
STRIPE_SECRET | Stripe secret key. | null |
STRIPE_WEBHOOK_SECRET | Secret used to verify incoming Stripe webhooks. | null |
I_S_STRIPE_ALLOWED_PRICES | Restrict checkout to approved Stripe price IDs. Use * to allow all active prices, or a comma-separated allowlist. | * |
I_S_STRIPE_ALLOWED_DISCOUNTS | Restrict checkout to approved Stripe discounts. Use * to allow all active discounts, or a comma-separated allowlist of coupon IDs, promotion code IDs, or codes. | * |
I_S_STRIPE_MANAGED_PAYMENTS_ENABLED | Enable Stripe Managed Payments preview mode. | false |
I_S_STRIPE_CUSTOMER_PORTAL_URL | Optional fallback portal URL used when a customer-specific Stripe billing portal session cannot be generated. | empty |
For I_S_STRIPE_CUSTOMER_PORTAL_URL, find your customer portal URL in your Stripe dashboard under Settings > Billing > Customer Portal.
Paddle
| Variable | Description | If unset |
|---|---|---|
PADDLE_CLIENT_SIDE_TOKEN | Paddle client-side token used by Paddle.js. | null |
PADDLE_API_KEY | Paddle API key used for server-side requests. | null |
PADDLE_WEBHOOK_SECRET | Secret used to verify incoming Paddle webhooks. | null |
PADDLE_SANDBOX | Enable Paddle sandbox mode. | false |
I_S_PADDLE_ALLOWED_PRICES | Restrict checkout to approved Paddle price IDs. Use * to allow all active prices, or a comma-separated allowlist. | * |
I_S_PADDLE_ALLOWED_DISCOUNTS | Restrict checkout to approved Paddle discount IDs or codes. Use * to allow all active discounts. | * |
I_S_PADDLE_CUSTOMER_PORTAL_URL | Optional fallback portal URL used when no authenticated Paddle customer portal session is available. | https://paddle.net/verify-email |
For I_S_PADDLE_CUSTOMER_PORTAL_URL, find your customer portal URL in your Paddle dashboard under Business Account > Customer Portal.
Activity logs
Activity log expiration is configured in config/inertia-start.php through the activity_log_lifetimes option.
'activity_log_lifetimes' => file_exists(config_path('env/activity_log_lifetimes.json'))
? json_decode(file_get_contents(config_path('env/activity_log_lifetimes.json')), true)
: [
'throttle' => '2 days',
],This configuration maps log names to retention durations. Only the log names listed here are marked as expirable and will be purged automatically.
If you want to override the defaults without editing the config file directly, create config/env/activity_log_lifetimes.json.
See the Activity Logging guide for the full logging workflow.
Branding
Logo
The application logo components are located at:
resources/js/components/AppLogo.vueresources/js/components/AppLogoIcon.vue
The logo used in emails is located at:
resources/views/vendor/mail/html/logo.blade.php
You can customize these components to match your brand.
Colors
Inertia Start uses Tailwind CSS v4. Theming and configuration is handled using CSS in resources/css/app.css.
Inertia Start comes with pre-built themes: 27 primary colors and 26 secondary colors (based on the last version of the Tailwind's palette) that you can combine as you want.
To change theme colors, just change the imported primary and secondary colors in resources/css/theme.css. For example, to use amber as primary color and stone as secondary color, replace the default colors like this:
@import './themes/primary/black.css';
@import './themes/primary/amber.css';
@import './themes/secondary/zinc.css';
@import './themes/secondary/stone.css';
@import './themes/common.css';If you change the secondary color, you will also have to change the Tailwind CSS prose class in the resources/js/components/ProseContent.vue component:
<div class="prose prose-sm max-w-none prose-zinc md:prose-base dark:prose-invert" v-html="content"></div>
<div class="prose prose-sm max-w-none prose-stone md:prose-base dark:prose-invert" v-html="content"></div>Fonts
We use Fontsource to manage fonts.
To change or add fonts:
- Find and install your fonts (go to Fontsource).
npm install @fontsource-variable/inter @fontsource-variable/space-groteskFollow the instructions in the "Install" tab of the font to know how to import it and which value is expected for the font-family property.
- Import your fonts in
resources/js/app.ts
import '@fontsource-variable/inter'; // Supports weights 100-900
import '@fontsource-variable/space-grotesk'; // Supports weights 300-700- In
resources/css/app.css, use the --font-* Tailwind CSS theme variables to customize the font family utilities in your project (Inertia Start uses--font-sansand--font-headingin its built-in pages, feel free to add other font utilities as needed).
@theme inline {
--font-sans:
'Inter Variable', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--font-heading:
'Space Grotesk Variable', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
@layer utilities {
body,
html {
--font-sans:
'Inter Variable', ui-sans-serif, system-ui, sans-serif,
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji';
--font-heading:
'Space Grotesk Variable', ui-sans-serif, system-ui, sans-serif,
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji';
}
}- Use the font utilities in your markup
<div class="font-heading">
<!-- ... -->
</div>Legal Texts
Your legal texts can be written in markdown, they will be automatically converted to HTML and beautifully formatted with Tailwind CSS Typography plugin in our ProseContent Vue component.
Terms of Service
Add your general terms of service in:
resources/markdown/legal-terms.mdfor the default language of your app (the locale inapp.localeconfig)resources/markdown/legal-terms.{locale}.mdfor each additional language that your app supports (example forfrlocale:resources/markdown/legal-terms.fr.md)
Privacy Policy
Add your privacy policy in:
resources/markdown/privacy-policy.mdfor the default language of your app (the locale inapp.localeconfig)resources/markdown/privacy-policy.{locale}.mdfor each additional language that your app supports (example forfrlocale:resources/markdown/privacy-policy.fr.md)