{#if isMFAModalOpen} (isMFAModalOpen = false)} bind:is_enabled={data.props.authenticators} /> {/if}

{$t('settings.settings_page')}

{$t('settings.settings_menu')}

{#if activeSection === 'profile'}
👤

{$t('settings.profile_info')}

{$t('settings.profile_info_desc')}

This currency pre-fills money fields when adding new items.

{/if} {#if activeSection === 'security'}
🔐

{$t('settings.change_password')}

{$t('settings.pass_change_desc')}

{#if user.has_password}
{/if}
{#if $page.form?.message}
{$t($page.form?.message)}
{/if}
đŸ›Ąī¸

{$t('settings.mfa_page_title')}

{$t('settings.mfa_desc')}

{#if data.props.authenticators} ✅ {$t('settings.enabled')} {:else} ❌ {$t('settings.disabled')} {/if}
{data.props.authenticators ? $t('settings.mfa_is_enabled') : $t('settings.mfa_not_enabled')}
{#if !data.props.authenticators} {#if !emails.some((e) => e.verified)}
{:else} {/if} {:else} {/if}
{#if !emails.some((e) => e.verified)}
{$t('settings.no_verified_email_warning')}
{/if}
{#if socialProviders && socialProviders.length > 0}
🔗

{$t('settings.social_auth')}

{$t('settings.social_auth_desc_1')}

{$t('settings.password_auth')}

{user.disable_password || (socialProviders && socialProviders.some((p) => p.usage_required)) ? $t('settings.password_login_disabled') : $t('settings.password_login_enabled')}

{user.disable_password || (socialProviders && socialProviders.some((p) => p.usage_required)) ? $t('settings.disabled') : $t('settings.enabled')}
p.usage_required)} class="toggle toggle-primary {socialProviders && socialProviders.some((p) => p.usage_required) ? 'toggle-disabled' : ''}" />
{#if user.disable_password}
{$t('settings.password_disable_warning')}
{/if}
🔗 {$t('settings.launch_account_connections')}
{/if}
{/if} {#if activeSection === 'emails'}
📧

{$t('settings.email_management')}

{$t('settings.email_management_desc')}

{#if emails.length > 0}
{#each emails as email}
{email.email}
{#if email.verified}
✅ {$t('settings.verified')}
{:else}
❌ Not Verified
{/if} {#if email.primary}
⭐ {$t('settings.primary')}
{/if}
{#if !email.verified} {/if} {#if !email.primary && email.verified} {/if}
{/each}
{:else}
📧

{$t('settings.no_email_set')}

{/if}
{$t('settings.add_new_email')}
{/if} {#if activeSection === 'integrations'}
🔗

{$t('settings.integrations')}

{$t('settings.integrations_desc')}

Immich

Immich

{$t('immich.immich_integration_desc')}

{#if immichIntegration}
{$t('settings.connected')}
{:else}
{$t('settings.disconnected')}
{/if}
{#if immichIntegration && !newImmichIntegration.id}
{/if} {#if !immichIntegration || newImmichIntegration.id}
{#if newImmichIntegration.server_url && !newImmichIntegration.server_url.endsWith('api')}
{$t('immich.api_note')}
{/if} {#if newImmichIntegration.server_url && (newImmichIntegration.server_url.indexOf('localhost') !== -1 || newImmichIntegration.server_url.indexOf('127.0.0.1') !== -1)}
{$t('immich.localhost_note')}
{/if}
{/if}

📖 {$t('immich.need_help')} {$t('navbar.documentation')}

Google Maps

Google Maps

{$t('google_maps.google_maps_integration_desc')}

{#if googleMapsEnabled}
{$t('settings.connected')}
{:else}
{$t('settings.disconnected')}
{/if}
{#if user.is_staff || !googleMapsEnabled}
{#if user.is_staff}

📖 {$t('immich.need_help')} {$t('navbar.documentation')}

{:else if !googleMapsEnabled}

â„šī¸ {$t('google_maps.google_maps_integration_desc_no_staff')}

{/if}
{/if}
Strava

Strava

{$t('strava.strava_integration_desc')}

{#if stravaGlobalEnabled && stravaUserEnabled}
{$t('settings.connected')}
{:else}
{$t('settings.disconnected')}
{/if}
{#if !stravaGlobalEnabled}

{$t('strava.not_enabled') || 'Strava integration is not enabled on this instance.'}

{:else if !stravaUserEnabled && stravaGlobalEnabled}
{:else if stravaGlobalEnabled && stravaUserEnabled}
{/if} {#if user.is_staff || !stravaGlobalEnabled}
{#if user.is_staff}

📖 {$t('immich.need_help')} {$t('navbar.documentation')}

{:else if !stravaGlobalEnabled}

â„šī¸ {$t('google_maps.google_maps_integration_desc_no_staff')}

{/if}
{/if}
Wanderer

Wanderer

{$t('wanderer.wanderer_integration_desc')}

{#if wandererEnabled}
{$t('settings.connected')}
{:else}
{$t('settings.disconnected')}
{/if}
{#if wandererEnabled && wandererExpired}
{/if} {#if !wandererEnabled}
{:else}
{/if} {#if !wandererEnabled}

📖 {$t('immich.need_help')} {$t('navbar.documentation')}

{/if}
{/if} {#if activeSection === 'ai_api_keys'}
🤖

{$t('settings.ai_api_keys')}

{$t('settings.ai_api_keys_desc')}

{#if apiKeysConfigError}

{$t('settings.api_keys_config_unavailable')}

{apiKeysConfigError}

{$t('settings.api_keys_config_guidance')}

{/if}

{$t('settings.travel_agent_help_title')}

{$t('settings.travel_agent_help_body')}

{$t('settings.travel_agent_help_open_collections')} {$t('settings.travel_agent_help_setup_guide')}

MCP Access Token

Create or fetch your personal token for MCP clients. The same token is reused if one already exists.

Token
{mcpToken ? getMaskedMcpToken(mcpToken) : 'Not generated yet'}
Use this exact auth header format
{data.props.mcpTokenHeaderFormat}

{$t('settings.saved_api_keys')}

{#if userApiKeys.length === 0}

{$t('settings.no_api_keys_saved')}

{:else}
{#each userApiKeys as apiKey}
{getApiKeyProviderLabel(apiKey.provider)}
{apiKey.masked_api_key}
{/each}
{/if}

{$t('settings.add_api_key')}

{$t('settings.api_key_write_only_hint')}

{/if} {#if activeSection === 'import_export'}
đŸ“Ļ

{$t('settings.backup_restore')}

{$t('settings.backup_restore_desc')}

{$t('settings.whats_included')}

📍 {$t('locations.locations')} ✅
đŸšļ {$t('adventures.visits')} ✅
📚 {$t('navbar.collections')} ✅
đŸ–ŧī¸ {$t('settings.media')} ✅
đŸĨž {$t('settings.trails')} ✅
âąī¸ {$t('settings.activities')} ✅
🌍 {$t('settings.world_travel_visits')} ✅
âš™ī¸ {$t('navbar.settings')} ❌
👤 {$t('navbar.profile')} ❌
🔗 {$t('settings.integrations_settings')} ❌

📤 {$t('settings.backup_your_data')}

{$t('settings.backup_your_data_desc')}

đŸ“Ĩ {$t('settings.restore_data')}

{$t('settings.restore_data_desc')}

âš ī¸ {$t('settings.data_override_warning')}

{$t('settings.data_override_warning_desc')}

(isRestoring = true)} enctype="multipart/form-data" class="space-y-4" >
{#if $page.form?.message && $page.form?.message.includes('restore')}
{$t($page.form?.message)}
{/if}
{/if} {#if activeSection === 'admin' && user.is_staff}
âš™ī¸

{$t('settings.administration')}

{$t('settings.administration_desc')}

đŸ› ī¸

{$t('navbar.admin_panel')}

{$t('settings.admin_panel_desc')}

{$t('settings.launch_administration_panel')}
📍

{$t('settings.region_updates')}

{$t('settings.region_updates_desc')}

{:else if activeSection === 'admin' && !user.is_staff}
🔒

{$t('settings.access_restricted')}

{$t('settings.access_restricted_desc')}

{/if} {#if activeSection === 'advanced'}
đŸ› ī¸

{$t('settings.advanced_settings')}

{$t('settings.advanced_settings_desc')}

{$t('settings.social_auth_setup')}

{$t('settings.social_auth_desc')}

{$t('settings.social_auth_desc_2')} {$t('settings.documentation_link')}

{$t('settings.debug_information')}

UUID:
{user.uuid}
{$t('settings.staff_status')}:
{user.is_staff ? $t('settings.staff_user') : $t('settings.regular_user')}
{$t('settings.app_version')}:
{appTitle} {appVersion}
Profile Type:
{user.public_profile ? $t('adventures.public') : $t('adventures.private')}

{$t('settings.quick_actions')}

{#if user.is_staff} âš™ī¸ {$t('settings.launch_administration_panel')} {/if}

{$t('about.about')} Voyage

{$t('about.license')}

Š {copyrightYear} Sean Morley. {$t('settings.all_rights_reserved')}

{/if}
User Settings | Voyage