diff --git a/src/GeneralSettings.jsx b/src/GeneralSettings.jsx
index bcb59e3..42f02ba 100644
--- a/src/GeneralSettings.jsx
+++ b/src/GeneralSettings.jsx
@@ -503,226 +503,207 @@ export default function GeneralSettings({
const rerankingModelOptions = buildSelectOptions(rerankingModels, rerankModel, 'saved model unavailable', showMissingModelLabel);
const transcriptionModelOptions = buildSelectOptions(whisperModels, transcriptionModel, 'saved model unavailable', showMissingModelLabel);
- return (
-
-
-
Heimgeist Backend URL
-
-
Internal UI requests like chats, sessions, and databases go to this URL.
-
-
-
Ollama URL
-
-
Heimgeist uses this URL to talk to Ollama for models and chat generation.
-
-
-
Embedding Model
-
- {embeddingModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No embedding models available —'} }
- {embeddingModelOptions.map(model => (
- {model.label}
- ))}
-
-
- Heimgeist uses this model for building or rebuilding local database embeddings.
-
-
-
-
Reranking Model
-
- {rerankingModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No reranking models available —'} }
- {rerankingModelOptions.map(model => (
- {model.label}
- ))}
-
-
- Heimgeist currently uses an embedding-based reranker for web search, so this should generally be an embedding-capable Ollama model.
-
-
-
-
Audio Input
-
-
-
-
-
- Enables microphone transcription in the chat composer. Heimgeist records locally and sends the clip to the local Whisper runtime.
-
- {audioInputEnabled && (
- <>
-
-
- {transcriptionModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No Whisper models available —'} }
- {transcriptionModelOptions.map(model => (
-
- {model.label}
-
- ))}
-
-
- System default microphone
- {audioInputOptions.map(device => (
-
- {device.label}
-
- ))}
-
-
- {AUDIO_INPUT_LANGUAGE_OPTIONS.map(language => (
-
- {language.label}
-
- ))}
-
- refreshAudioDevices({ requestAccess: true })}
- disabled={!audioInputSupported || isRefreshingAudioDevices}
- >
- {isRefreshingAudioDevices ? 'Working…' : audioDeviceRefreshLabel}
-
-
- {audioInputStatus.message && (
-
{audioInputStatus.message}
- )}
-
- Select the Whisper model Heimgeist should use for microphone transcription.
-
-
- Whisper can auto-detect the spoken language, but you can force a fixed input language here when auto-detection drifts.
-
- >
- )}
-
-
-
Chat Model
-
- {chatModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No chat models available —'} }
- {chatModelOptions.map(model => {model.label} )}
-
-
- Heimgeist uses this model for normal text chat.
-
-
-
-
Vision Model
-
- {visionModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No vision models available —'} }
- {visionModelOptions.map(model => {model.label} )}
-
-
- Heimgeist uses this model when a chat message includes image attachments.
-
-
-
-
Stream Output
-
-
-
-
-
-
-
Updates
-
-
+
+
Chat Model
+
- {isCheckingForUpdates ? 'Checking...' : 'Check for Update'}
-
-
-
- Compares the local Git commit with remote master, pulls changes when needed, and restarts Heimgeist automatically. The same check also runs on every startup.
-
- {updateStatus.message && (
-
- {updateStatus.message}
+ {chatModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No chat models available —'} }
+ {chatModelOptions.map(model => {model.label} )}
+
+
+ Heimgeist uses this model for normal text chat.
- )}
- {(updateStatus.localCommit || updateStatus.remoteCommit || updateCheckedAtLabel) && (
-
- {updateStatus.localCommit &&
Local: {shortCommit(updateStatus.localCommit)}
}
- {updateStatus.remoteCommit &&
Remote: {shortCommit(updateStatus.remoteCommit)}
}
- {updateCheckedAtLabel &&
Last checked: {updateCheckedAtLabel}
}
+
+
+
Vision Model
+
+ {visionModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No vision models available —'} }
+ {visionModelOptions.map(model => {model.label} )}
+
+
+ Heimgeist uses this model when a chat message includes image attachments.
+
+
+
+
Embedding Model
+
+ {embeddingModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No embedding models available —'} }
+ {embeddingModelOptions.map(model => (
+ {model.label}
+ ))}
+
+
+ Heimgeist uses this model for building or rebuilding local database embeddings.
+
+
+
+
Reranking Model
+
+ {rerankingModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No reranking models available —'} }
+ {rerankingModelOptions.map(model => (
+ {model.label}
+ ))}
+
+
+ Heimgeist currently uses an embedding-based reranker for web search, so this should generally be an embedding-capable Ollama model.
+
+
+
+
Transcription Model
+
+ {transcriptionModelOptions.length === 0 && {isLoadingModelCatalog ? 'Loading models…' : '— No Whisper models available —'} }
+ {transcriptionModelOptions.map(model => (
+
+ {model.label}
+
+ ))}
+
+
+ Heimgeist uses this Whisper model for microphone transcription.
+
+
+
+ );
+ }
+
+ if (panel === 'Microphone') {
+ return (
+
+
+
Microphone
+
+
+ System default microphone
+ {audioInputOptions.map(device => (
+
+ {device.label}
+
+ ))}
+
+
+ {AUDIO_INPUT_LANGUAGE_OPTIONS.map(language => (
+
+ {language.label}
+
+ ))}
+
+ refreshAudioDevices({ requestAccess: true })}
+ disabled={!audioInputSupported || isRefreshingAudioDevices}
+ >
+ {isRefreshingAudioDevices ? 'Working…' : audioDeviceRefreshLabel}
+
- )}
-
-
-
Purge Databases
-
-
- {isPurgingLibraries ? 'Purging...' : 'Delete All Databases'}
-
-
-
- Removes every local Heimgeist database, including staged files, corpora, and indexes. This is meant as a recovery action when the DB panel becomes unusable. Chat history stays intact.
-
- {libraryPurgeStatus.message && (
-
- {libraryPurgeStatus.message}
+ {audioInputStatus.message && (
+
{audioInputStatus.message}
+ )}
+
+ Microphone input is available in the chat composer. Heimgeist records locally and sends the clip to the configured Whisper model.
- )}
+
+ Whisper can auto-detect the spoken language, but you can force a fixed input language here when auto-detection drifts.
+
+
-
- );
+ );
+ }
+
+ if (panel === 'Updates') {
+ return (
+
+
+
Updates
+
+
+ {isCheckingForUpdates ? 'Checking...' : 'Check for Update'}
+
+
+
+ Compares the local Git commit with remote master, pulls changes when needed, and restarts Heimgeist automatically. The same check also runs on every startup.
+
+ {updateStatus.message && (
+
+ {updateStatus.message}
+
+ )}
+ {(updateStatus.localCommit || updateStatus.remoteCommit || updateCheckedAtLabel) && (
+
+ {updateStatus.localCommit &&
Local: {shortCommit(updateStatus.localCommit)}
}
+ {updateStatus.remoteCommit &&
Remote: {shortCommit(updateStatus.remoteCommit)}
}
+ {updateCheckedAtLabel &&
Last checked: {updateCheckedAtLabel}
}
+
+ )}
+
+
+ );
+ }
+
+ if (panel === 'Advanced') {
+ return (
+
+
+
Purge Databases
+
+
+ {isPurgingLibraries ? 'Purging...' : 'Delete All Databases'}
+
+
+
+ Removes every local Heimgeist database, including staged files, corpora, and indexes. This is meant as a recovery action when the DB panel becomes unusable. Chat history stays intact.
+
+ {libraryPurgeStatus.message && (
+
+ {libraryPurgeStatus.message}
+
+ )}
+
+
+ );
+ }
+
+ return null;
}