From 8aa41160638ec7ad12d13427664c8b9dd3305725 Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 20 Jan 2026 14:16:39 -0800 Subject: [PATCH 1/6] feat: add donate icon --- src/lib/components/StatusBar.svelte | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib/components/StatusBar.svelte b/src/lib/components/StatusBar.svelte index 5693a00..2f96e3a 100644 --- a/src/lib/components/StatusBar.svelte +++ b/src/lib/components/StatusBar.svelte @@ -18,6 +18,7 @@ import { achievementProgress } from "$lib/stores/achievements"; const DISCORD_URL = "https://chat.nhcarrigan.com"; + const DONATE_URL = "https://donate.nhcarrigan.com"; let connectionStatus: ConnectionStatus = $state("disconnected"); let workingDirectory = $state(""); @@ -241,6 +242,17 @@ /> + + + +
+
+

What is Hikari Desktop?

+

+ Hikari Desktop is an AI-powered desktop assistant that brings Claude directly to your desktop. + Built with love using Tauri, Svelte, and Rust for a fast, native experience. +

+
+ +
+

Version

+

+ {appVersion || "Loading..."} +

+
+ +
+

Source Code

+ +
+ +
+

Support & Community

+

+ Found a bug or have a suggestion? +

+ +
+ +
+

Built with 💕 by

+ +
+ +
+

License

+

+ This project is open source and available under our license terms. +

+ +
+ +
+

+ Copyright © {new Date().getFullYear()} Naomi Carrigan. All rights reserved. +

+
+
+ + + + \ No newline at end of file diff --git a/src/lib/components/StatusBar.svelte b/src/lib/components/StatusBar.svelte index 2f96e3a..c387ea9 100644 --- a/src/lib/components/StatusBar.svelte +++ b/src/lib/components/StatusBar.svelte @@ -15,6 +15,7 @@ import type { ConnectionStatus } from "$lib/types/messages"; import { onMount } from "svelte"; import StatsDisplay from "./StatsDisplay.svelte"; + import AboutPanel from "./AboutPanel.svelte"; import { achievementProgress } from "$lib/stores/achievements"; const DISCORD_URL = "https://chat.nhcarrigan.com"; @@ -27,6 +28,7 @@ let grantedToolsList: string[] = $state([]); let appVersion = $state(""); let showStats = $state(false); + let showAbout = $state(false); const progress = $derived($achievementProgress); let currentConfig: HikariConfig = $state({ model: null, @@ -253,6 +255,20 @@ /> + + + +
+ {#each sections as section} +
+

{section.title}

+
    + {#each section.items as item} +
  • + + {item} +
  • + {/each} +
+
+ {/each} + +
+

+ Need more help? Join our Discord community for support and updates! +

+
+
+ + + + \ No newline at end of file diff --git a/src/lib/components/StatusBar.svelte b/src/lib/components/StatusBar.svelte index c387ea9..10c5d54 100644 --- a/src/lib/components/StatusBar.svelte +++ b/src/lib/components/StatusBar.svelte @@ -16,6 +16,7 @@ import { onMount } from "svelte"; import StatsDisplay from "./StatsDisplay.svelte"; import AboutPanel from "./AboutPanel.svelte"; + import HelpPanel from "./HelpPanel.svelte"; import { achievementProgress } from "$lib/stores/achievements"; const DISCORD_URL = "https://chat.nhcarrigan.com"; @@ -29,6 +30,7 @@ let appVersion = $state(""); let showStats = $state(false); let showAbout = $state(false); + let showHelp = $state(false); const progress = $derived($achievementProgress); let currentConfig: HikariConfig = $state({ model: null, @@ -269,6 +271,20 @@ /> +
-- 2.52.0 From 32fd2ddf458616fec3091363297bcd9b3b8a403c Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 20 Jan 2026 17:24:19 -0800 Subject: [PATCH 5/6] fix: live settings updates --- src/lib/notifications/soundPlayer.ts | 2 +- src/lib/stores/notifications.ts | 31 ++++++++++++++-------------- src/routes/+page.svelte | 5 +++++ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/lib/notifications/soundPlayer.ts b/src/lib/notifications/soundPlayer.ts index 8157a80..455acca 100644 --- a/src/lib/notifications/soundPlayer.ts +++ b/src/lib/notifications/soundPlayer.ts @@ -2,7 +2,7 @@ import { NOTIFICATION_SOUNDS, type NotificationType } from "./types"; class SoundPlayer { private audioCache: Map = new Map(); - private enabled: boolean = true; + private enabled: boolean = false; // Start disabled until config loads private globalVolume: number = 1.0; constructor() { diff --git a/src/lib/stores/notifications.ts b/src/lib/stores/notifications.ts index c001417..64f3599 100644 --- a/src/lib/stores/notifications.ts +++ b/src/lib/stores/notifications.ts @@ -1,22 +1,23 @@ -import { derived } from "svelte/store"; import { configStore } from "./config"; import { soundPlayer } from "$lib/notifications"; -// Sync notification settings with config -export const notificationSettings = derived(configStore.config, ($config) => { - soundPlayer.setEnabled($config.notifications_enabled); - soundPlayer.setGlobalVolume($config.notification_volume); +let unsubscribe: (() => void) | null = null; - return { - enabled: $config.notifications_enabled, - volume: $config.notification_volume, - }; -}); +// Initialize notification settings sync - call this once on app startup +export function initNotificationSync() { + // Prevent duplicate subscriptions + if (unsubscribe) return; -// Helper to update notification settings -export async function updateNotificationSettings(enabled: boolean, volume: number) { - await configStore.updateConfig({ - notifications_enabled: enabled, - notification_volume: volume, + unsubscribe = configStore.config.subscribe(($config) => { + soundPlayer.setEnabled($config.notifications_enabled); + soundPlayer.setGlobalVolume($config.notification_volume); }); } + +// Cleanup function if needed +export function cleanupNotificationSync() { + if (unsubscribe) { + unsubscribe(); + unsubscribe = null; + } +} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index c9d47eb..195de40 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,6 +2,7 @@ import { onMount, onDestroy } from "svelte"; import { initializeTauriListeners, cleanupTauriListeners } from "$lib/tauri"; import { configStore, applyTheme } from "$lib/stores/config"; + import { initNotificationSync, cleanupNotificationSync } from "$lib/stores/notifications"; import { conversationsStore } from "$lib/stores/conversations"; import "$lib/notifications/testNotifications"; import Terminal from "$lib/components/Terminal.svelte"; @@ -29,12 +30,16 @@ // Apply saved theme on startup const config = configStore.getConfig(); applyTheme(config.theme); + + // Initialize notification settings sync + initNotificationSync(); } }); onDestroy(() => { if (initialized) { cleanupTauriListeners(); + cleanupNotificationSync(); initialized = false; } }); -- 2.52.0 From 6ab7713e05723ea428958b2d3a803f3df0a0123b Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 20 Jan 2026 19:11:28 -0800 Subject: [PATCH 6/6] chore: linter --- src/lib/components/AboutPanel.svelte | 16 ++++++------- src/lib/components/HelpPanel.svelte | 34 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/lib/components/AboutPanel.svelte b/src/lib/components/AboutPanel.svelte index a008b00..4f240b6 100644 --- a/src/lib/components/AboutPanel.svelte +++ b/src/lib/components/AboutPanel.svelte @@ -34,13 +34,13 @@
e.stopPropagation()} + onkeydown={(e) => e.stopPropagation()} role="dialog" aria-labelledby="about-title" + tabindex="-1" >
-

- About Hikari Desktop -

+

About Hikari Desktop

@@ -91,9 +91,7 @@

Support & Community

-

- Found a bug or have a suggestion? -

+

Found a bug or have a suggestion?