inertia start
Getting Started

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

VariableDescriptionIf unset
I_S_THEMEForce a specific theme (light or dark). Leave unset to let users switch theme.null
I_S_APP_LAYOUTChoose the authenticated app layout. Supported values: sidebar, header.sidebar
I_S_APP_ADMIN_LAYOUTChoose the app admin area layout. Supported values: sidebar, header.sidebar
I_S_BEHIND_CLOUDFLARE_PROXYTrust 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_ACCOUNTSEnable account registration and account-related routes.false
I_S_ACCOUNT_MUST_ACCEPT_TERMSRequire Terms of Service and Privacy Policy acceptance during registration.false
I_S_ACCOUNT_NAME_REQUIREDRequire a name field during registration.false
I_S_ENABLE_AVATARSEnable profile photo uploads.false
I_S_ENABLE_USERNAMESEnable usernames on accounts.false
I_S_ENABLE_LOCALIZATIONEnable multi-language routing and locale switching.false
I_S_ENABLE_ANALYTICSEnable Umami analytics integration.false
I_S_UMAMI_HOSTBase URL of your Umami instance.null
I_S_UMAMI_WEBSITE_IDWebsite identifier used by Umami.null
I_S_UMAMI_TRACKER_SCRIPTTracker script filename served by Umami (for example script.js).null
I_S_CONTACT_EMAILThe 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:

.env
I_S_APP_LAYOUT=header

The 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 the localization key. locales, detection, and storage are global, while localized_urls only applies when you use localized URLs.
  • config/env/locales.json: by default, Inertia Start uses this file to populate inertia-start.localization.locales.
  • lang/: translation strings, including optional routes.php files when you translate URI segments with Lang::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:

config/inertia-start.php
'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

VariableDescriptionIf unset
I_S_ENABLE_BILLINGEnable billing features and billing-related UI.false
I_S_DEFAULT_PAYMENT_PROVIDERDefault provider for checkout and billing flows. Supported values: stripe, paddle.stripe
I_S_ENABLED_PAYMENT_PROVIDERSComma-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_CURRENCYDefault 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

VariableDescriptionIf unset
STRIPE_KEYStripe publishable key.null
STRIPE_SECRETStripe secret key.null
STRIPE_WEBHOOK_SECRETSecret used to verify incoming Stripe webhooks.null
I_S_STRIPE_ALLOWED_PRICESRestrict checkout to approved Stripe price IDs. Use * to allow all active prices, or a comma-separated allowlist.*
I_S_STRIPE_ALLOWED_DISCOUNTSRestrict 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_ENABLEDEnable Stripe Managed Payments preview mode.false
I_S_STRIPE_CUSTOMER_PORTAL_URLOptional 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

VariableDescriptionIf unset
PADDLE_CLIENT_SIDE_TOKENPaddle client-side token used by Paddle.js.null
PADDLE_API_KEYPaddle API key used for server-side requests.null
PADDLE_WEBHOOK_SECRETSecret used to verify incoming Paddle webhooks.null
PADDLE_SANDBOXEnable Paddle sandbox mode.false
I_S_PADDLE_ALLOWED_PRICESRestrict checkout to approved Paddle price IDs. Use * to allow all active prices, or a comma-separated allowlist.*
I_S_PADDLE_ALLOWED_DISCOUNTSRestrict checkout to approved Paddle discount IDs or codes. Use * to allow all active discounts.*
I_S_PADDLE_CUSTOMER_PORTAL_URLOptional 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.

config/inertia-start.php
'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

The application logo components are located at:

  • resources/js/components/AppLogo.vue
  • resources/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:

resources/css/theme.css
@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:

resources/js/components/ProseContent.vue
<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:

  1. Find and install your fonts (go to Fontsource).
npm install @fontsource-variable/inter @fontsource-variable/space-grotesk

Follow 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.

  1. Import your fonts in resources/js/app.ts
resources/js/app.ts
import '@fontsource-variable/inter'; // Supports weights 100-900
import '@fontsource-variable/space-grotesk'; // Supports weights 300-700
  1. 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-sans and --font-heading in its built-in pages, feel free to add other font utilities as needed).
resources/css/app.css
@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';
  }
}
  1. Use the font utilities in your markup
<div class="font-heading">
  <!-- ... -->
</div>

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.md for the default language of your app (the locale in app.locale config)
  • resources/markdown/legal-terms.{locale}.md for each additional language that your app supports (example for fr locale: resources/markdown/legal-terms.fr.md)

Privacy Policy

Add your privacy policy in:

  • resources/markdown/privacy-policy.md for the default language of your app (the locale in app.locale config)
  • resources/markdown/privacy-policy.{locale}.md for each additional language that your app supports (example for fr locale: resources/markdown/privacy-policy.fr.md)

On this page