diff --git a/README.md b/README.md
index f1d477a..bbf7284 100644
--- a/README.md
+++ b/README.md
@@ -24,9 +24,9 @@ second -- with copy, regenerate, and fork controls that appear on hover.
Settings keep model selection and generation defaults in one place, and the chat
model doubles as the title model so there is only one choice to make:
-
+
`Ctrl`/`Cmd`+`K` opens a command palette that reaches new chat, settings, theme,
model switching, and recent conversations without leaving the keyboard:
diff --git a/docs/images/settings.png b/docs/images/settings.png
index 75e182f..4fc0692 100644
Binary files a/docs/images/settings.png and b/docs/images/settings.png differ
diff --git a/frontend/src/features/settings/SettingsPanel.tsx b/frontend/src/features/settings/SettingsPanel.tsx
index 402b04b..ebe7300 100644
--- a/frontend/src/features/settings/SettingsPanel.tsx
+++ b/frontend/src/features/settings/SettingsPanel.tsx
@@ -7,6 +7,7 @@ import type {
ModelResponse,
} from "../../../../contracts/cortex-api";
import { displayModelName, isGGUFModel, localModelNames } from "../../lib/localModels";
+import { RangeField } from "../../shared/ui/RangeField";
import { Select } from "../../shared/ui/Select";
import { MemoryPanel } from "./MemoryPanel";
import { ModelsPanel } from "../models/ModelsPanel";
@@ -184,18 +185,23 @@ export function SettingsPanel({
)}
-
-
-
-
+
+
+ Sampling
+ How the model picks its next token. Defaults suit most local models.
+
+ Context
+ A larger window holds more conversation but uses more memory. Seed -1 keeps replies varied.
+
+
+
+
+ System prompt
+ Standing instructions sent with every message in every chat.
+
diff --git a/frontend/src/shared/ui/RangeField.tsx b/frontend/src/shared/ui/RangeField.tsx
new file mode 100644
index 0000000..391c468
--- /dev/null
+++ b/frontend/src/shared/ui/RangeField.tsx
@@ -0,0 +1,52 @@
+import type { CSSProperties } from "react";
+
+type Props = {
+ id: string;
+ label: string;
+ value: number;
+ min: number;
+ max: number;
+ step: number;
+ onChange: (value: number) => void;
+ /** Short explanation shown under the track. */
+ hint?: string;
+ /** Override the printed value, e.g. to add a unit or fix decimals. */
+ format?: (value: number) => string;
+};
+
+/**
+ * A labelled slider with a filled track.
+ *
+ * Browsers only paint the filled portion of a range input natively in Firefox
+ * (`::-moz-range-progress`); WebKit has no equivalent. Publishing the position
+ * as a `--range-fill` percentage lets the track be painted with a gradient, so
+ * the control looks the same everywhere instead of falling back to the default
+ * grey rail on Chromium and WebView2 -- which is what Cortex actually ships in.
+ */
+export function RangeField({ id, label, value, min, max, step, onChange, hint, format }: Props) {
+ const span = max - min;
+ const fill = span > 0 ? ((value - min) / span) * 100 : 0;
+
+ return (
+