diff --git a/README.md b/README.md
index df7a088..560189d 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# Friendly Kobold
A desktop app for running Large Language Models locally.
-
+
diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index 4d81656..aee44d0 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -27,7 +27,7 @@ export default defineConfig({
},
renderer: {
root: '.',
- publicDir: 'assets',
+ publicDir: 'src/assets',
build: {
outDir: 'dist',
rollupOptions: {
diff --git a/package.json b/package.json
index e5dffd0..cf448f1 100644
--- a/package.json
+++ b/package.json
@@ -85,7 +85,6 @@
"execa": "^9.6.0",
"got": "^14.4.7",
"lucide-react": "^0.542.0",
- "npm": "^11.5.2",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"systeminformation": "^5.27.8",
@@ -97,7 +96,7 @@
"appId": "com.friendly-kobold.app",
"productName": "Friendly Kobold",
"compression": "normal",
- "icon": "assets/icon.png",
+ "icon": "src/assets/icon.png",
"publish": null,
"electronLanguages": [
"en-US"
@@ -107,18 +106,18 @@
},
"files": [
"out/**/*",
- "dist/**/*",
- "assets/**/*"
+ "dist/**/*"
+ ],
+ "extraFiles": [
+ {
+ "from": "assets/friendly-kobold.desktop",
+ "to": "assets/friendly-kobold.desktop",
+ "filter": [
+ "**/*"
+ ]
+ }
],
"extraResources": [
- {
- "from": "assets",
- "to": "assets",
- "filter": [
- "**/*",
- "!screenshots/**/*"
- ]
- },
{
"from": "src/main/templates",
"to": "templates",
@@ -134,6 +133,12 @@
"gatekeeperAssess": false,
"entitlements": "assets/entitlements.mac.plist",
"entitlementsInherit": "assets/entitlements.mac.plist",
+ "extraFiles": [
+ {
+ "from": "assets/entitlements.mac.plist",
+ "to": "assets/entitlements.mac.plist"
+ }
+ ],
"target": [
{
"target": "dmg",
diff --git a/assets/icon.png b/src/assets/icon.png
similarity index 100%
rename from assets/icon.png
rename to src/assets/icon.png
diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx
index f5435a3..93ffe1f 100644
--- a/src/components/AppHeader.tsx
+++ b/src/components/AppHeader.tsx
@@ -11,7 +11,7 @@ import {
Tooltip,
} from '@mantine/core';
import { Settings, ArrowLeft } from 'lucide-react';
-import { soundAssets, playSound, initializeAudio } from '@/utils';
+import { soundAssets, playSound, initializeAudio } from '@/utils/sounds';
import iconUrl from '/icon.png';
import { FRONTENDS } from '@/constants';
import type { InterfaceTab, FrontendPreference, Screen } from '@/types';
diff --git a/src/components/ModelFileField.tsx b/src/components/ModelFileField.tsx
index 0d9591d..90fbb33 100644
--- a/src/components/ModelFileField.tsx
+++ b/src/components/ModelFileField.tsx
@@ -1,7 +1,7 @@
import { Group, TextInput, Button } from '@mantine/core';
import { File, Search } from 'lucide-react';
import { LabelWithTooltip } from '@/components/LabelWithTooltip';
-import { getInputValidationState } from '@/utils';
+import { getInputValidationState } from '@/utils/validation';
import styles from '@/styles/layout.module.css';
interface ModelFileFieldProps {
diff --git a/src/components/screens/Download.tsx b/src/components/screens/Download.tsx
index 0bc4f37..531ad05 100644
--- a/src/components/screens/Download.tsx
+++ b/src/components/screens/Download.tsx
@@ -1,7 +1,8 @@
import { useState, useCallback, useEffect, useRef } from 'react';
import { Card, Text, Title, Loader, Stack, Container } from '@mantine/core';
import { DownloadCard } from '@/components/DownloadCard';
-import { getPlatformDisplayName, formatDownloadSize } from '@/utils';
+import { getPlatformDisplayName } from '@/utils/platform';
+import { formatDownloadSize } from '@/utils/downloadUtils';
import { getAssetDescription, sortDownloadsByType } from '@/utils/assets';
import { useKoboldVersions } from '@/hooks/useKoboldVersions';
import type { DownloadItem } from '@/types/electron';
diff --git a/src/components/screens/Interface/TerminalTab.tsx b/src/components/screens/Interface/TerminalTab.tsx
index 8a1ca0a..184922e 100644
--- a/src/components/screens/Interface/TerminalTab.tsx
+++ b/src/components/screens/Interface/TerminalTab.tsx
@@ -9,7 +9,8 @@ import {
import { ChevronDown } from 'lucide-react';
import styles from '@/styles/layout.module.css';
import { UI } from '@/constants';
-import { handleTerminalOutput, processTerminalContent } from '@/utils';
+import { handleTerminalOutput } from '@/utils/terminal';
+import { processTerminalContent } from '@/utils/linkifyTerminal';
import { useLaunchConfigStore } from '@/stores/launchConfigStore';
interface TerminalTabProps {
diff --git a/src/components/screens/Launch/ImageGenerationTab.tsx b/src/components/screens/Launch/ImageGenerationTab.tsx
index e2f52db..c52ff49 100644
--- a/src/components/screens/Launch/ImageGenerationTab.tsx
+++ b/src/components/screens/Launch/ImageGenerationTab.tsx
@@ -2,7 +2,7 @@ import { Stack } from '@mantine/core';
import { useState } from 'react';
import { ModelFileField } from '@/components/ModelFileField';
import { SelectWithTooltip } from '@/components/SelectWithTooltip';
-import { IMAGE_MODEL_PRESETS } from '@/utils';
+import { IMAGE_MODEL_PRESETS } from '@/constants/imageModelPresets';
import { useLaunchConfig } from '@/hooks/useLaunchConfig';
export const ImageGenerationTab = () => {
diff --git a/src/components/screens/Welcome.tsx b/src/components/screens/Welcome.tsx
index 5942ec2..d7bcbf7 100644
--- a/src/components/screens/Welcome.tsx
+++ b/src/components/screens/Welcome.tsx
@@ -73,7 +73,22 @@ export const WelcomeScreen = ({ onGetStarted }: WelcomeScreenProps) => (
- Use powerful AI models for free once downloaded
+
+
+
+ Hardware acceleration
+ {' '}
+ - Supports CUDA, ROCm, Vulkan, and CLBlast backends for faster
+ inference
+
+
+
+
+ Note: Hardware acceleration requires appropriate drivers to be
+ manually installed by the user (CUDA for NVIDIA GPUs, ROCm for AMD
+ GPUs, etc.)
+