# Auto-Generated Startup Configuration

## Overview

As of this update, Jellyfin automatically creates a `startup.json` configuration file on first startup if one doesn't already exist. This makes it easier for new users to get started with file-based path configuration.

## Automatic Creation

### When It's Created

The `startup.json` file is automatically created when:
1. Jellyfin starts for the first time
2. No existing `startup.json` file is found in any of the search locations
3. The application has write permissions to the directory

### Where It's Created

The file is created in the **current working directory** by default:

- **Development**: Where you run `dotnet run` from
- **Installed**: The Jellyfin installation directory
- **Service**: Typically the service's working directory (e.g., `/opt/jellyfin`)
- **Docker**: The working directory inside the container

**Search order for existing files:**
1. Current working directory: `./startup.json`
2. Application directory: `{AppDir}/startup.json`
3. Config subdirectory: `{AppDir}/config/startup.json`

### What It Contains

The auto-generated file includes:

```json
{
  "_comment": "Jellyfin Startup Configuration - Configure path locations for Jellyfin data, logs, cache, and more.",
  "_documentation": "See FILE_BASED_STARTUP_CONFIG.md for complete documentation",
  "_priority": "Command-line options > Environment variables > This file > Defaults",
  "Paths": {
    "DataDir": null,
    "ConfigDir": null,
    "CacheDir": null,
    "LogDir": null,
    "TempDir": null,
    "WebDir": null
  },
  "Examples": {
    "_comment": "Example configurations below - remove this Examples section when customizing",
    "Linux": {
      "DataDir": "/var/lib/jellyfin",
      "ConfigDir": "/etc/jellyfin",
      "CacheDir": "/var/cache/jellyfin",
      "LogDir": "/var/log/jellyfin",
      "TempDir": "/var/tmp/jellyfin",
      "WebDir": "/usr/share/jellyfin/web"
    },
    "Windows": {
      "DataDir": "C:\\ProgramData\\Jellyfin\\data",
      "ConfigDir": "C:\\ProgramData\\Jellyfin\\config",
      "CacheDir": "D:\\Cache\\Jellyfin",
      "LogDir": "C:\\ProgramData\\Jellyfin\\logs",
      "TempDir": "D:\\Temp\\Jellyfin",
      "WebDir": "C:\\Program Files\\Jellyfin\\web"
    },
    "Portable": {
      "DataDir": "./data",
      "ConfigDir": "./config",
      "CacheDir": "./cache",
      "LogDir": "./logs",
      "TempDir": "./temp",
      "WebDir": "./web"
    }
  }
}
```

## Features

### 1. Self-Documenting
- Includes comments explaining purpose and priority
- References full documentation
- Shows examples for different platforms

### 2. Ready to Customize
- All path properties set to `null` by default (uses system defaults)
- Remove `null` and add your custom paths
- Remove the `Examples` section after customizing

### 3. Platform Examples
- **Linux** - Standard Linux FHS paths
- **Windows** - Windows Program Data paths
- **Portable** - Relative paths for portable installations

## Customization

### Quick Start

1. **After first startup**, you'll see:
   ```
   Created default startup configuration at: /path/to/startup.json
   You can customize this file to set default paths for Jellyfin.
   ```

2. **Edit the file** to add your custom paths:
   ```json
   {
     "Paths": {
       "DataDir": "/var/lib/jellyfin",
       "ConfigDir": "/etc/jellyfin",
       "LogDir": "/var/log/jellyfin"
     }
   }
   ```

3. **Remove unused properties** and examples:
   ```json
   {
     "Paths": {
       "DataDir": "/custom/path"
     }
   }
   ```

4. **Restart Jellyfin** to apply changes

### Using Examples

To use one of the example configurations:

**Linux:**
```json
{
  "Paths": {
    "DataDir": "/var/lib/jellyfin",
    "ConfigDir": "/etc/jellyfin",
    "CacheDir": "/var/cache/jellyfin",
    "LogDir": "/var/log/jellyfin",
    "TempDir": "/var/tmp/jellyfin"
  }
}
```

**Windows:**
```json
{
  "Paths": {
    "DataDir": "C:\\ProgramData\\Jellyfin\\data",
    "ConfigDir": "C:\\ProgramData\\Jellyfin\\config",
    "LogDir": "C:\\ProgramData\\Jellyfin\\logs"
  }
}
```

**Portable:**
```json
{
  "Paths": {
    "DataDir": "./data",
    "ConfigDir": "./config",
    "CacheDir": "./cache"
  }
}
```

## Startup Messages

### File Created
```
Created default startup configuration at: /path/to/startup.json
You can customize this file to set default paths for Jellyfin.
```

### File Loaded
```
Loaded startup configuration from: /path/to/startup.json
```

### Creation Failed
```
Warning: Could not create default startup configuration: [error message]
```

This is not fatal - Jellyfin will continue using defaults or environment variables/command-line options.

## Preventing Auto-Creation

If you don't want the file to be auto-created:

1. **Create an empty file** before starting:
   ```bash
   touch startup.json
   echo "{}" > startup.json
   ```

2. **Use environment variables or command-line options** instead of file-based config

3. **Check file permissions** - File won't be created if directory isn't writable

## File Locations by Installation Type

### Standard Installation (Linux)
```
/opt/jellyfin/startup.json
```

### Systemd Service
```
/etc/jellyfin/startup.json
# or
/usr/lib/jellyfin/startup.json
```

### Windows Installed
```
C:\Program Files\Jellyfin\Server\startup.json
```

### Portable Installation
```
./startup.json  (same directory as jellyfin.exe or jellyfin)
```

### Docker Container
```
/app/startup.json  (inside container)
# or mount from host:
docker run -v /path/to/startup.json:/app/startup.json ...
```

## Configuration Priority

Remember, the file-based configuration has this priority:

1. **Command-line options** (highest) - `--datadir /path`
2. **Environment variables** - `JELLYFIN_DATA_DIR=/path`
3. **Configuration file** - `startup.json`
4. **Defaults** (lowest) - OS-specific defaults

So even with a `startup.json` file, you can still override settings with environment variables or command-line options.

## Integration with Other Configuration

### Works With
- ✅ **database.xml** - Database configuration
- ✅ **system.xml** - System settings
- ✅ **logging.json** - Logging configuration
- ✅ **Environment variables** - Can override paths
- ✅ **Command-line options** - Can override paths

### Independent From
- Database selection (SQLite vs PostgreSQL)
- Web client hosting
- Network configuration
- Plugin settings

## Troubleshooting

### File Not Created

**Possible Causes:**
1. Directory isn't writable
2. File already exists (check search locations)
3. Insufficient permissions

**Solution:**
```bash
# Check permissions
ls -la ./startup.json

# Create manually if needed
cp startup.json.example startup.json

# Set proper permissions
chmod 644 startup.json
```

### File Ignored

**Check:**
1. File is valid JSON (no syntax errors)
2. File is in one of the search locations
3. Properties are correctly named (case-sensitive)
4. No environment variables or CLI options overriding

### Example Section Causing Issues

The `Examples` section is ignored by the configuration parser - it's just for reference. You can safely remove it:

```json
{
  "Paths": {
    "DataDir": "/custom/path"
  }
}
```

## Migration from Manual Creation

If you previously created `startup.json` manually:

1. **Your file is preserved** - Auto-creation only happens if no file exists
2. **Your settings continue to work** - No changes needed
3. **You can add examples** from the auto-generated template if desired

## Security Considerations

1. **File Permissions**
   ```bash
   chmod 644 startup.json
   chown jellyfin:jellyfin startup.json
   ```

2. **No Sensitive Data**
   - The file doesn't contain passwords
   - Only paths are stored
   - Safe to commit to version control

3. **Read-Only Option**
   ```bash
   # Make read-only after customizing
   chmod 444 startup.json
   ```

## Docker Considerations

### Option 1: Let Docker Create It
```bash
docker run -v jellyfin-config:/config jellyfin/jellyfin
# startup.json created inside container
```

### Option 2: Mount Pre-Created File
```bash
docker run -v /host/path/startup.json:/app/startup.json:ro jellyfin/jellyfin
```

### Option 3: Use Environment Variables
```bash
docker run -e JELLYFIN_DATA_DIR=/data -e JELLYFIN_CONFIG_DIR=/config jellyfin/jellyfin
```

## Benefits

1. **✅ First-Time Experience** - New users get a template automatically
2. **✅ Self-Documenting** - Examples and comments included
3. **✅ No Manual Download** - No need to find example files
4. **✅ Platform Aware** - Examples for Linux, Windows, and portable setups
5. **✅ Non-Intrusive** - Only created if missing
6. **✅ Safe Defaults** - All paths null means use system defaults

## See Also

- [FILE_BASED_STARTUP_CONFIG.md](FILE_BASED_STARTUP_CONFIG.md) - Complete configuration guide
- [PATH_CONFIGURATION_GUIDE.md](PATH_CONFIGURATION_GUIDE.md) - Path configuration reference
- [startup.json.example](startup.json.example) - Example configuration file
- [DATABASE_CONFIGURATION_GUIDE.md](DATABASE_CONFIGURATION_GUIDE.md) - Database setup
