pbnj

06_configuration.md

# Configuration

pbnj is configured through a single `pbnj.config.js` file in the project root.

## Default Configuration

```js
export default {
  name: 'pbnj',
  logo: '/logo.png',
  idStyle: 'sandwich',
  homepage: true,
  sortOrder: 'newest',
  maxPasteSize: '1mb',
  theme: 'flexoki-light',
  icons: {
    login: '/peanut.png',
    logout: '/jelly.png',
    newPaste: '/bread.png',
  },
}
```

## Options

### `name`
- **Type:** `string`
- **Default:** `'pbnj'`

The site name displayed in the browser title and header.

### `logo`
- **Type:** `string`
- **Default:** `'/logo.png'`

Path to your logo image. Place your logo in the `public/` directory and reference it with a leading slash.

### `idStyle`
- **Type:** `'sandwich' | 'short' | 'uuid'`
- **Default:** `'sandwich'`

How paste IDs are generated:

| Style | Example | Description |
|-------|---------|-------------|
| `sandwich` | `crunchy-peanut-butter-jelly-wrap` | Fun, memorable, food-themed IDs |
| `short` | `a3f8x2q1` | 8-character alphanumeric |
| `uuid` | `550e8400-e29b-41d4-a716-446655440000` | Standard UUID v4 |

### `homepage`
- **Type:** `boolean`
- **Default:** `true`

When `true`, the homepage displays a grid of recent public pastes. Set to `false` for a minimal landing page without paste listings.

### `sortOrder`
- **Type:** `'newest' | 'oldest'`
- **Default:** `'newest'`

Controls the order of pastes on the homepage:

| Value | Description |
|-------|-------------|
| `newest` | Most recently updated pastes appear first (default) |
| `oldest` | Oldest pastes appear first |

### `maxPasteSize`
- **Type:** `string`
- **Default:** `'1mb'`

Maximum allowed paste size. Supports units: `b`, `kb`, `mb`, `gb`.

Examples:
- `'500kb'` - 500 kilobytes
- `'2mb'` - 2 megabytes
- `'1gb'` - 1 gigabyte (not recommended)

### `theme`
- **Type:** `string`
- **Default:** `'flexoki-light'`

Theme preset that controls syntax highlighting and UI colors. All themes use locally-hosted CSS for consistent styling.

**Light themes:**
| Theme | Description |
|-------|-------------|
| `flexoki-light` | Warm, paper-like aesthetic (default) |
| `github-light` | Classic GitHub light theme |
| `gruvbox-light` | Retro, warm colors |
| `catppuccin-latte` | Pastel light theme |

**Dark themes:**
| Theme | Description |
|-------|-------------|
| `flexoki-dark` | Warm dark variant |
| `github-dark` | Classic GitHub dark theme |
| `nord` | Arctic, bluish dark theme |
| `gruvbox-dark` | Retro dark with warm accents |
| `dracula` | Popular purple-accented dark theme |
| `catppuccin-frappe` | Catppuccin mid-dark variant |
| `catppuccin-macchiato` | Catppuccin darker variant |
| `catppuccin-mocha` | Catppuccin darkest variant |

### `icons`
- **Type:** `{ login: string, logout: string, newPaste: string }`
- **Default:** `{ login: '/peanut.png', logout: '/jelly.png', newPaste: '/bread.png' }`

Custom icons for the authentication buttons in the header. Place your icons in the `public/` directory.

| Property | Description |
|----------|-------------|
| `login` | Icon shown when logged out (click to login) |
| `logout` | Icon shown when logged in (click to logout) |
| `newPaste` | Icon for creating a new paste (only visible when logged in) |

Example:
```js
icons: {
  login: '/my-login-icon.png',
  logout: '/my-logout-icon.png',
  newPaste: '/my-new-icon.png',
}
```

### `footer`
- **Type:** `{ text: string, link?: string }` or `undefined`
- **Default:** `{ text: 'spread the code 🥪', link: 'https://github.com/bhavnicksm/pbnj' }`

Optional footer displayed at the bottom of every page. Set to `undefined` or omit to hide the footer.

- `text` - The text to display in the footer
- `link` - Optional URL. If provided, the footer text becomes a clickable link

Example:
```js
footer: {
  text: 'Powered by pbnj',
  link: 'https://github.com/bhavnicksm/pbnj',
}
```

To disable the footer entirely:
```js
footer: undefined,
```

## Example: Custom Configuration

```js
export default {
  name: 'my-pastes',
  logo: '/my-logo.svg',
  idStyle: 'short',
  homepage: false,
  maxPasteSize: '2mb',
  theme: 'dracula',
}
```

This creates a pastebin with:
- Custom branding
- Short 8-character IDs
- No public paste listing on homepage
- 2MB paste limit
- Dracula dark theme

---
Next: 07_web_interface.md - Web interface guide