diff --git a/src/App.tsx b/src/App.tsx index 86a1d42..68db654 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,6 +10,9 @@ const SetupPage = lazy(() => import("./pages/SetupPage").then((m) => ({ default: const DashboardPage = lazy(() => import("./pages/DashboardPage").then((m) => ({ default: m.DashboardPage })), ); +const SettingsPage = lazy(() => + import("./pages/SettingsPage").then((m) => ({ default: m.SettingsPage })), +); function RoutePageFallback() { return ( @@ -33,7 +36,7 @@ function StartupDashboardRedirect() { startupDone.current = true; const path = window.location.pathname; - if (path === "/dashboard") return; + if (path === "/dashboard" || path === "/settings") return; if (useAppSessionStore.getState().isDeviceConnected) { navigate("/dashboard", { replace: true }); @@ -97,6 +100,7 @@ function App() { } /> } /> } /> + } /> } /> diff --git a/src/pages/DashboardPage.tsx b/src/pages/DashboardPage.tsx index 3b0b95e..e22069d 100644 --- a/src/pages/DashboardPage.tsx +++ b/src/pages/DashboardPage.tsx @@ -197,6 +197,12 @@ export function DashboardPage() { Setup )} + + Settings + {isDeviceConnected && ( + ); + + return ( +
+ + +
+
+
+

User & profile

+

Settings

+

+ Preferences for this install and compliance information for the app. +

+
+ + Back to dashboard + +
+ +
+ {tabBtn("preferences", "Preferences")} + {tabBtn("about", "About")} +
+ +
+ {tab === "preferences" && ( +
+
+

Session

+

+ {isDeviceConnected && displayBot ? ( + <> + Connected Telegram bot:{" "} + @{displayBot} + + ) : ( + "No Telegram bot is connected in this UI session. Use setup to connect." + )} +

+
+ + Open setup + + + Dashboard + +
+
+ +
+

Runtime preferences

+
    +
  • + Ollama model — choose + the preferred model from the selector in the dashboard header. +
  • +
  • + Skills & context — + manage skill templates and the skills context size limit in the Skills panel on + the dashboard. +
  • +
+
+
+ )} + + {tab === "about" && ( +
+
+

Contact info

+

+ Project links and maintainer contact on social platforms. +

+ +
+ +
+

Privacy info

+
+
+

+ Privacy Policy +

+

+ Pengine is a{" "} + desktop app that + runs an agent loop on your machine. There is no Pengine-hosted account or + cloud database for your chats: ordinary use keeps configuration and skills on + your device, while the bot and tools you enable determine what leaves it. +

+
+
+

+ Analytics and telemetry +

+

+ The app does not include first-party analytics or behavioral tracking, and it + does not phone home to a Pengine telemetry service. The dashboard may{" "} + + check GitHub’s public API + {" "} + for new releases (version metadata only), which is subject to GitHub’s own + policies and your network path. +

+
+
+

+ What stays on your device +

+

+ Pengine stores app data under your OS app-data location: connection metadata, + skills, MCP configuration, and UI-related settings files. Sensitive values + such as your{" "} + Telegram bot token{" "} + and MCP secrets you configure are kept in the{" "} + + platform secure store + {" "} + (for example Keychain on macOS), not in a Pengine cloud. +

+
+
+

+ Network, Telegram, and inference +

+

+ When your bot is connected, message traffic uses{" "} + Telegram’s services{" "} + per Telegram’s terms. The app sends prompts and tool activity to{" "} + + Ollama (or another endpoint you configure) + + — typically on your LAN or localhost, but cloud or remote models are possible + if you point the stack there. Any{" "} + + MCP servers, containers, or custom tools + {" "} + you add can read or forward data according to their own configuration; treat + them like any other software you install. +

+
+
+

+ Responsibility +

+

+ You choose the bot, models, skills, and tools. This policy describes how + Pengine is designed to run locally; it does not replace Telegram’s, your host + OS’s, or your inference provider’s policies. For exact storage and startup + behavior, see the project documentation in the repository. +

+
+
+
+ +
+

About the app

+

+ Pengine is a local AI agent runtime: it connects your Telegram bot to Ollama (or + compatible inference) so conversations and tools run on your hardware. The project + is open source; see the GitHub repository above for license and source code. +

+ {appVersion && ( +

+ Reported app version: v{appVersion} +

+ )} +
+
+ )} +
+
+
+ ); +} diff --git a/src/shared/ui/TopMenu.tsx b/src/shared/ui/TopMenu.tsx index ba97a05..7689f2d 100644 --- a/src/shared/ui/TopMenu.tsx +++ b/src/shared/ui/TopMenu.tsx @@ -6,6 +6,7 @@ import { useAppSessionStore } from "../../modules/bot/store/appSessionStore"; const navLinks = [ { label: "Home", to: "/" }, { label: "Dashboard", to: "/dashboard" }, + { label: "Settings", to: "/settings" }, ]; export function TopMenu() {