Skip to main content
Chapi Assistant provides flexible configuration through multiple settings files that control different aspects of the application.

Configuration Files

Chapi uses two main configuration files:

appsettings.json

Application-wide settings including OAuth and app configuration

user.api.settings.json

User-specific API keys and preferences stored in AppData

Application Settings

Location: ~/workspace/source/Chapi/appsettings.json This file contains application-wide configuration that applies to all users.

App Configuration

AppConfig.UrlGit
string
Default Git repository URL for base templates or resources.Example: https://gitlab.com/net-core2/api-base.git
AppConfig.UpdateUrl
string
GitHub repository URL for checking application updates.Example: https://github.com/JPChanel/chapi-assistant

Git Authentication Settings

See Git Authentication for detailed OAuth configuration.
GitAuth.GitHub
object
GitHub OAuth application credentials and settings
GitAuth.GitLab
object
GitLab OAuth application credentials and settings

Example appsettings.json

appsettings.json
{
  "AppConfig": {
    "UrlGit": "https://gitlab.com/net-core2/api-base.git",
    "UpdateUrl": "https://github.com/JPChanel/chapi-assistant"
  },
  "GitAuth": {
    "GitHub": {
      "ClientId": "Ov23li5zo1SneHUKeXf7",
      "ClientSecret": "your-github-secret",
      "RedirectUri": "http://localhost:8888/callback",
      "Scope": "repo user"
    },
    "GitLab": {
      "ClientId": "your-gitlab-client-id",
      "ClientSecret": "gloas-your-gitlab-secret",
      "RedirectUri": "http://localhost:8891/callback",
      "Scope": "api read_user read_repository write_repository",
      "BaseUrl": "https://gitlab.com"
    }
  }
}
Never commit production OAuth credentials to version control. Use environment variables or user secrets for sensitive data.

User Settings

Location: %AppData%/Chapi/user.api.settings.json This file stores user-specific settings including API keys and preferences.

AI Provider Settings

See AI Providers for detailed AI configuration.
GeminiApiKey
string
Google AI API key for Gemini models
OpenAiApiKey
string
OpenAI API key for GPT models
ClaudeApiKey
string
Anthropic API key for Claude models
PreferredAiProvider
string
default:"Gemini"
Your preferred AI provider. Options: Gemini, OpenAI, Claude

Proxy Settings

ProxyEnabled
boolean
default:false
Enable proxy for network connections
ProxyUrl
string
Proxy server URL (e.g., http://proxy.company.com:8080)
ProxyUser
string
Proxy authentication username
ProxyPass
string
Proxy authentication password

GitHub Integration

GitHubToken
string
Stored GitHub OAuth access token (managed by the application)
GitHubUserLogin
string
GitHub username (cached from authentication)
GitHubUserName
string
GitHub display name (cached from authentication)
GitHubUserAvatar
string
GitHub avatar URL (cached from authentication)

Example user.api.settings.json

user.api.settings.json
{
  "GeminiApiKey": "AIzaSyD...",
  "OpenAiApiKey": "sk-proj-...",
  "ClaudeApiKey": "sk-ant-...",
  "PreferredAiProvider": "Gemini",
  "ProxyEnabled": false,
  "ProxyUrl": "",
  "ProxyUser": "",
  "ProxyPass": "",
  "GitHubToken": "",
  "GitHubUserLogin": "",
  "GitHubUserName": "",
  "GitHubUserAvatar": ""
}

Settings Management

The UserSettingsService class handles loading and saving user settings:
UserSettingsService.cs
public static class UserSettingsService
{
    private static readonly string AppDataPath = 
        Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Chapi");
    
    private static readonly string SettingsFilePath = 
        Path.Combine(AppDataPath, "user.api.settings.json");

    public static UserApiSettings LoadSettings()
    {
        if (!File.Exists(SettingsFilePath))
        {
            return new UserApiSettings();
        }

        try
        {
            var json = File.ReadAllText(SettingsFilePath);
            return JsonSerializer.Deserialize<UserApiSettings>(json) ?? new UserApiSettings();
        }
        catch (Exception)
        {
            return new UserApiSettings();
        }
    }

    public static void SaveSettings(UserApiSettings settings)
    {
        var json = JsonSerializer.Serialize(settings, new JsonSerializerOptions { WriteIndented = true });
        File.WriteAllText(SettingsFilePath, json);
    }
}

Features

Auto-Creation

Automatically creates %AppData%/Chapi directory on first run

Graceful Fallback

Returns default settings if file doesn’t exist or is corrupted

JSON Formatting

Saves settings with indentation for readability

Type Safety

Strongly-typed settings model with defaults

Configuration Priority

Chapi uses the following priority for settings:
1

User Settings (Highest)

User-specific settings in user.api.settings.json override all others
2

Application Settings

Application-wide settings in appsettings.json
3

Default Values (Lowest)

Hard-coded defaults in the settings models

Environment-Specific Configuration

For development vs. production environments, you can use:

Development

appsettings.Development.json
{
  "GitAuth": {
    "GitHub": {
      "ClientId": "dev-client-id",
      "ClientSecret": "dev-secret",
      "RedirectUri": "http://localhost:8888/callback"
    }
  }
}

Production

appsettings.Production.json
{
  "GitAuth": {
    "GitHub": {
      "ClientId": "prod-client-id",
      "ClientSecret": "prod-secret",
      "RedirectUri": "https://yourapp.com/callback"
    }
  }
}
.NET automatically merges environment-specific configuration files based on the ASPNETCORE_ENVIRONMENT or DOTNET_ENVIRONMENT variable.

Accessing Settings in Code

Dependency Injection

public class GitHubOAuthProvider : IGitAuthProvider
{
    private readonly GitHubConfig _config;

    public GitHubOAuthProvider(
        ICredentialStorageService credentialStorage,
        HttpClient httpClient,
        IOptions<GitAuthConfig> config)
    {
        _config = config.Value.GitHub;
    }
}

Direct Access

var settings = UserSettingsService.LoadSettings();
var geminiKey = settings.GeminiApiKey;
var preferredProvider = settings.PreferredAiProvider;

Best Practices

Security

Never commit API keys or secrets to version control

Validation

Validate settings on load and provide meaningful error messages

Defaults

Always provide sensible default values

Documentation

Document all configuration options with examples

Security Recommendations

  1. Use User Secrets for development:
    dotnet user-secrets set "GitAuth:GitHub:ClientSecret" "your-secret"
    
  2. Use Environment Variables for production:
    export GitAuth__GitHub__ClientSecret="your-secret"
    
  3. Encrypt Sensitive Data at rest using Windows DPAPI or similar
  4. Restrict File Permissions on configuration files

Troubleshooting

Possible causes:
  • Insufficient permissions to write to %AppData%/Chapi
  • File is locked by another process
  • Disk space issues
Solution:
  • Check folder permissions
  • Close other instances of the application
  • Verify available disk space
Possible causes:
  • Corrupted JSON in settings file
  • File encoding issues
Solution:
  • Validate JSON syntax using a JSON validator
  • Ensure file is UTF-8 encoded
  • Restore from backup or recreate manually
Possible causes:
  • Incorrect file path
  • Missing configuration section
  • Deserialization errors
Solution:
  • Verify file locations match expected paths
  • Check console/logs for deserialization errors
  • Compare with example configurations

Git Authentication

Configure GitHub and GitLab OAuth

AI Providers

Configure Gemini, OpenAI, and Claude

Source Code Reference

  • Settings Service: ~/workspace/source/Chapi/Infrastructure/Persistence/Settings/UserSettings.cs
  • App Configuration: ~/workspace/source/Chapi/appsettings.json
  • Git Auth Config: ~/workspace/source/Chapi/Infrastructure/Configuration/GitAuthConfig.cs

Build docs developers (and LLMs) love