Search Documentation

Search for pages and headings in the documentation

The Art of Misconfiguration

Welcome to the most powerful file in your project: data/config.ts. With great power comes great responsibility to break everything spectacularly.

The Config File: Your New Best Frenemy

Located at data/config.ts, this file controls:

  • Everything
  • The universe
  • Your hopes and dreams
  • Whether your site builds or not

Fun Fact: 90% of “Why isn’t this working?” questions can be answered with “Check your config file.”

The Semicolon Saga

TypeScript is very particular about semicolons. Like, very particular.

// ❌ TypeScript has left the chat
const config = {
  title: "My Site"
  description: "Oops"
}

// ✅ TypeScript is happy
const config = {
  title: "My Site",
  description: "Much better",
};

Pro Tip: When in doubt, add a semicolon. When still in doubt, add more semicolons. Eventually, something will work.

Common Configuration Catastrophes

The Typo That Broke Everything

// ❌ Can you spot the typo?
export const SITE = {
    titel: "My Documentation", // 😈
    description: "Why isn't my title showing?",
};

// ✅ Fixed (after 2 hours of debugging)
export const SITE = {
    title: "My Documentation",
    description: "Oh. Right.",
};

The Case Sensitivity Trap

// These are all different to the computer:
title: "Hello";
Title: "Hello";
TITLE: "Hello";
TiTlE: "Hello"; // Stop it

// Only this one works:
title: "Hello";

The Comma Catastrophe

// ❌ The trailing comma of doom
export const HEADER_NAV_ITEMS = [
    { label: "Docs", href: "/docs" },
    { label: "API", href: "/api" }, // <- This little guy will ruin your day
    ,
];

The Navigation Configuration Nightmare

Configuring navigation is like playing 4D chess while blindfolded:

export const SIDEBAR_NAVIGATION = {
    docs: {
        defaultTab: {
            label: "Documentation",
            icon: "document", // SVG reference
        },
        groups: [
            {
                id: "getting-started", // Must match folder name
                label: "Getting Started", // Can be anything
                icon: "🚀", // Emoji works too
                entries: [
                    { slug: "getting-started/intro" }, // No leading slash!
                    { slug: "/getting-started/intro" }, // ❌ This breaks
                    { slug: "getting-started/intro.md" }, // ❌ No extension!
                ],
            },
        ],
    },
};

The Rules (That You’ll Forget):

  1. No leading slashes in slugs
  2. No file extensions in slugs
  3. Group IDs should match folder names
  4. Icons can be emoji or SVG references (but not both at once)
  5. You’ll get all of these wrong at least once

The Icon Identity Crisis

// ✅ Emoji icon
icon: "🚀";

// ✅ SVG icon (references src/assets/icons/document.svg)
icon: "document";

// ❌ This doesn't work
icon: "🚀.svg";

// ❌ Neither does this
icon: "document.emoji";

// ❌ And definitely not this
icon: "yes";

Auto-Generated vs Manual: The Eternal Struggle

// Manual: You control everything (and must update everything)
{
  id: "guides",
  label: "Guides",
  icon: "📖",
  entries: [
    { slug: "guides/page1" },
    { slug: "guides/page2" },
    { slug: "guides/page3" },
    // Add new page? Update this list!
  ],
}

// Auto-generated: It does whatever it wants
{
  id: "guides",
  label: "Guides",
  icon: "📖",
  autoGenerated: true,
  // New pages appear automatically!
  // In alphabetical order!
  // Whether you like it or not!
}

// Hybrid: The worst of both worlds (or the best?)
{
  id: "guides",
  label: "Guides",
  icon: "📖",
  entries: [
    { slug: "guides/important" },  // This one first
  ],
  autoGenerated: true,  // Everything else alphabetically
  // Now you have to remember which pages are manual!
}

Common Error Messages (Translated)

“Error: ’;’ expected”

Translation: You forgot a semicolon somewhere. Good luck finding it.

Solution: Add semicolons everywhere until the error goes away.

”Error: Cannot find module”

Translation: TypeScript can’t find something you imported.

Solution:

  1. Check your import path
  2. Check if the file exists
  3. Restart your dev server
  4. Sacrifice a rubber duck to the coding gods

”Error: Type ‘string’ is not assignable to type ‘never’”

Translation: TypeScript is having an existential crisis.

Solution: Add as any and pretend you didn’t see anything. (Don’t actually do this. But we all do.)

”Error: undefined is not a function”

Translation: You’re trying to call something that isn’t a function.

Solution: It’s probably a typo. Or you forgot to import something. Or both.

”Error: PC Load Letter”

Translation: Your printer is confused.

Solution: Wrong error message. But if you got this, you have bigger problems.

The Environment Variable Enigma

// ❌ This won't work
const apiKey = process.env.API_KEY;

// ✅ This might work
const apiKey = import.meta.env.PUBLIC_API_KEY;

// ❌ But this definitely won't
const apiKey = import.meta.env.SECRET_API_KEY; // Not public!

// The rules:
// 1. Prefix with PUBLIC_ for client-side access
// 2. Don't prefix for server-side only
// 3. Restart dev server after adding env vars
// 4. Forget all of this and debug for an hour

The Build vs Dev Difference

// Works in dev:
const config = {
    title: "My Site",
    // Oops, forgot the comma
    description: "Description",
};

// Breaks in production:
// "Error: Unexpected token"
// "But it worked on my machine!"

The Truth: Dev mode is forgiving. Production is not. Always test your build locally:

npm run build
npm run preview

Configuration Best Practices (That You’ll Ignore)

  1. Comment your config - Future you will thank present you
  2. Use consistent formatting - Pick tabs or spaces (spaces, obviously)
  3. Validate your changes - Run npm run check before committing
  4. Test your build - Don’t trust dev mode
  5. Keep it simple - Complexity is the enemy of working code

The Nuclear Option

When all else fails:

# Step 1: Panic
# Step 2: Deep breath
# Step 3: The nuclear option
rm -rf node_modules package-lock.json
npm install
npm run dev

# Step 4: It works!
# Step 5: You have no idea why
# Step 6: Never touch it again

Advanced Misconfiguration Techniques

The Circular Reference

const config = {
    title: config.description, // ❌ Nope
    description: config.title, // ❌ Still nope
};

The Infinite Recursion

function getConfig() {
    return {
        ...getConfig(), // ❌ Stack overflow speedrun
    };
}

The Type Assertion Abuse

const config = {
  title: "My Site" as any as number as string as boolean as any;
  // TypeScript has given up on you
};

Debugging Your Config

Step 1: Read the error message Step 2: Ignore the error message Step 3: Change random things Step 4: It works! Step 5: You have no idea what you changed Step 6: Commit immediately before it breaks again

The Truth About Configuration

  • You’ll spend more time configuring than coding
  • The docs will be outdated
  • Stack Overflow will have conflicting answers
  • It will work eventually
  • You won’t know why
  • That’s okay

Conclusion

Configuration is an art form. A dark, mysterious art form that makes you question your life choices. But once you get it working, don’t touch it. Ever. Just leave it alone and back away slowly.

Remember: A working config is a happy config. A happy config is a config you don’t touch.


Pro Tip: When someone asks “Why did you configure it that way?” the correct answer is always “It works, doesn’t it?” 🎯