Skip to content

Config Reference

/config.js is the central configuration file. Most ShipFast features read from it.

Full Structure

javascript
// /config.js
const config = {
  // App identity
  appName: "YourApp",
  appDescription: "One sentence describing what your app does.",
  domainName: "yourdomain.com",

  // Crisp customer support chat
  crisp: {
    id: "",  // Add your Crisp website ID here
  },

  // Stripe payments
  stripe: {
    plans: [
      {
        priceId:
          process.env.NODE_ENV === "development"
            ? "price_dev_id"       // Test mode price ID
            : "price_live_id",     // Live mode price ID
        name: "Starter",
        description: "Perfect for indie hackers",
        price: 99,
        priceAnchor: 149,          // Optional: crossed-out price to show savings
        features: [
          { name: "Feature one" },
          { name: "Feature two" },
        ],
      },
    ],
  },

  // Auth
  auth: {
    loginUrl: "/api/auth/signin",
    callbackUrl: "/dashboard",    // Where users land after login
  },

  // Resend email
  resend: {
    fromNoReply: "noreply@mail.yourdomain.com",
    fromAdmin: "Marc from YourApp <marc@yourdomain.com>",
    supportEmail: "support@yourdomain.com",
  },

  // Tailwind / daisyUI colors
  colors: {
    theme: "light",
    main: themes["[data-theme=light]"]["primary"],
  },
};

export default config;

Key Fields

FieldUsed ByNotes
appNameSEO tags, email templates, login page logoSet in libs/seo.js defaults
appDescriptionSEO meta description defaultKeep under 160 chars
domainNameSitemap, canonical URLsNo trailing slash, no https://
crisp.idCustomer support chat widgetLeave empty to use mailto fallback
stripe.plans[].priceIdButtonCheckout, pricing sectionUse env-conditional for test vs live
stripe.plans[].pricePricing component displayDisplayed as $price/month
auth.callbackUrlAll sign-in buttons, magic linksUsually /dashboard
resend.fromNoReplyMagic link emailsMust be verified domain in Resend
resend.supportEmailError page mailto fallbackWhere users email when no Crisp

Adding a Second Pricing Plan

Add to stripe.plans array:

javascript
stripe: {
  plans: [
    {
      priceId: "price_starter",
      name: "Starter",
      price: 49,
      features: [{ name: "5 projects" }],
    },
    {
      priceId: "price_pro",
      name: "Pro",
      price: 99,
      isFeatured: true,        // Highlights this plan in the Pricing component
      features: [
        { name: "Unlimited projects" },
        { name: "Priority support" },
      ],
    },
  ],
},

See Also