rename the project to gerbil

This commit is contained in:
lone-cloud 2025-08-30 12:11:59 -07:00
parent dacdd24dde
commit 0cca766ea7
18 changed files with 150 additions and 148 deletions

View file

@ -1,4 +1,4 @@
# Copilot Instructions for FriendlyKobold # Copilot Instructions for Gerbil
### General Coding ### General Coding

View file

@ -50,7 +50,7 @@ jobs:
const version = tag.replace(/^v/, ''); const version = tag.replace(/^v/, '');
const authorName = packageJson.author.name; const authorName = packageJson.author.name;
const authorEmail = packageJson.author.email; const authorEmail = packageJson.author.email;
const appImageUrl = `https://github.com/lone-cloud/friendly-kobold/releases/download/${tag}/Friendly.Kobold-${version}.AppImage`; const appImageUrl = `https://github.com/lone-cloud/gerbil/releases/download/${tag}/Friendly.Kobold-${version}.AppImage`;
core.setOutput('version', version); core.setOutput('version', version);
core.setOutput('tag', tag); core.setOutput('tag', tag);
@ -97,7 +97,7 @@ jobs:
# Download AppImage with retry # Download AppImage with retry
for attempt in $(seq 1 $max_attempts); do for attempt in $(seq 1 $max_attempts); do
echo "Attempt $attempt: Downloading AppImage..." echo "Attempt $attempt: Downloading AppImage..."
if curl -L -o "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage" "${{ steps.release_info.outputs.appimage_url }}"; then if curl -L -o "gerbil-${{ steps.release_info.outputs.version }}.AppImage" "${{ steps.release_info.outputs.appimage_url }}"; then
echo "✅ AppImage downloaded successfully" echo "✅ AppImage downloaded successfully"
break break
else else
@ -113,7 +113,7 @@ jobs:
# Download desktop file with retry # Download desktop file with retry
for attempt in $(seq 1 $max_attempts); do for attempt in $(seq 1 $max_attempts); do
echo "Attempt $attempt: Downloading desktop file..." echo "Attempt $attempt: Downloading desktop file..."
if curl -L -o "friendly-kobold.desktop" "https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ inputs.tag }}/assets/friendly-kobold.desktop"; then if curl -L -o "gerbil.desktop" "https://raw.githubusercontent.com/lone-cloud/gerbil/${{ inputs.tag }}/assets/gerbil.desktop"; then
echo "✅ Desktop file downloaded successfully" echo "✅ Desktop file downloaded successfully"
break break
else else
@ -127,15 +127,15 @@ jobs:
done done
# Verify file sizes # Verify file sizes
appimage_size=$(stat -c%s "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage") appimage_size=$(stat -c%s "gerbil-${{ steps.release_info.outputs.version }}.AppImage")
echo "AppImage size: $appimage_size bytes" echo "AppImage size: $appimage_size bytes"
if [ $appimage_size -lt 50000000 ]; then # Less than 50MB is suspicious if [ $appimage_size -lt 50000000 ]; then # Less than 50MB is suspicious
echo "❌ AppImage seems too small ($appimage_size bytes), possible download issue" echo "❌ AppImage seems too small ($appimage_size bytes), possible download issue"
exit 1 exit 1
fi fi
SHA256_APPIMAGE=$(sha256sum "friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage" | cut -d' ' -f1) SHA256_APPIMAGE=$(sha256sum "gerbil-${{ steps.release_info.outputs.version }}.AppImage" | cut -d' ' -f1)
SHA256_DESKTOP=$(sha256sum "friendly-kobold.desktop" | cut -d' ' -f1) SHA256_DESKTOP=$(sha256sum "gerbil.desktop" | cut -d' ' -f1)
echo "sha256_appimage=$SHA256_APPIMAGE" >> $GITHUB_OUTPUT echo "sha256_appimage=$SHA256_APPIMAGE" >> $GITHUB_OUTPUT
echo "sha256_desktop=$SHA256_DESKTOP" >> $GITHUB_OUTPUT echo "sha256_desktop=$SHA256_DESKTOP" >> $GITHUB_OUTPUT
@ -147,62 +147,62 @@ jobs:
run: | run: |
cat > PKGBUILD << 'EOF' cat > PKGBUILD << 'EOF'
# Maintainer: ${{ steps.release_info.outputs.author_name }} <${{ steps.release_info.outputs.author_email }}> # Maintainer: ${{ steps.release_info.outputs.author_name }} <${{ steps.release_info.outputs.author_email }}>
pkgname=friendly-kobold pkgname=gerbil
pkgver=${{ steps.release_info.outputs.version }} pkgver=${{ steps.release_info.outputs.version }}
pkgrel=${{ inputs.pkgrel || '1' }} pkgrel=${{ inputs.pkgrel || '1' }}
pkgdesc="A desktop app for running Large Language Models locally" pkgdesc="A desktop app for running Large Language Models locally"
arch=('x86_64') arch=('x86_64')
url="https://github.com/lone-cloud/friendly-kobold" url="https://github.com/lone-cloud/gerbil"
license=('AGPL-3.0-or-later') license=('AGPL-3.0-or-later')
depends=('gtk3' 'nss') depends=('gtk3' 'nss')
optdepends=('alsa-lib: Audio support for sound effects' optdepends=('alsa-lib: Audio support for sound effects'
'libxss: Screen saver detection support') 'libxss: Screen saver detection support')
provides=('friendly-kobold') provides=('gerbil')
conflicts=('friendly-kobold-git') conflicts=('gerbil-git')
source=("friendly-kobold-${pkgver}.AppImage::${{ steps.release_info.outputs.appimage_url }}" source=("gerbil-${pkgver}.AppImage::${{ steps.release_info.outputs.appimage_url }}"
"friendly-kobold.desktop::https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ steps.release_info.outputs.tag }}/assets/friendly-kobold.desktop") "gerbil.desktop::https://raw.githubusercontent.com/lone-cloud/gerbil/${{ steps.release_info.outputs.tag }}/assets/gerbil.desktop")
sha256sums=('${{ steps.sha_calc.outputs.sha256_appimage }}' sha256sums=('${{ steps.sha_calc.outputs.sha256_appimage }}'
'${{ steps.sha_calc.outputs.sha256_desktop }}') '${{ steps.sha_calc.outputs.sha256_desktop }}')
prepare() { prepare() {
chmod +x "friendly-kobold-${pkgver}.AppImage" chmod +x "gerbil-${pkgver}.AppImage"
"./friendly-kobold-${pkgver}.AppImage" --appimage-extract "./gerbil-${pkgver}.AppImage" --appimage-extract
} }
package() { package() {
# Install the application # Install the application
install -dm755 "${pkgdir}/opt/friendly-kobold" install -dm755 "${pkgdir}/opt/gerbil"
cp -r squashfs-root/* "${pkgdir}/opt/friendly-kobold/" cp -r squashfs-root/* "${pkgdir}/opt/gerbil/"
# Fix permissions on extracted files # Fix permissions on extracted files
chmod -R 755 "${pkgdir}/opt/friendly-kobold/" chmod -R 755 "${pkgdir}/opt/gerbil/"
# Create executable wrapper # Create executable wrapper
install -dm755 "${pkgdir}/usr/bin" install -dm755 "${pkgdir}/usr/bin"
cat > "${pkgdir}/usr/bin/friendly-kobold" << 'WRAPPER' cat > "${pkgdir}/usr/bin/gerbil" << 'WRAPPER'
#!/bin/bash #!/bin/bash
exec "/opt/friendly-kobold/Friendly Kobold" "$@" exec "/opt/gerbil/Gerbil" "$@"
WRAPPER WRAPPER
chmod +x "${pkgdir}/usr/bin/friendly-kobold" chmod +x "${pkgdir}/usr/bin/gerbil"
# Install desktop file from assets # Install desktop file from assets
install -dm755 "${pkgdir}/usr/share/applications" install -dm755 "${pkgdir}/usr/share/applications"
cp "${srcdir}/friendly-kobold.desktop" "${pkgdir}/usr/share/applications/" cp "${srcdir}/gerbil.desktop" "${pkgdir}/usr/share/applications/"
# Install icon to hicolor theme directory and pixmaps as fallback # Install icon to hicolor theme directory and pixmaps as fallback
install -dm755 "${pkgdir}/usr/share/icons/hicolor/512x512/apps" install -dm755 "${pkgdir}/usr/share/icons/hicolor/512x512/apps"
install -dm755 "${pkgdir}/usr/share/pixmaps" install -dm755 "${pkgdir}/usr/share/pixmaps"
# Try different possible icon locations # Try different possible icon locations
if [ -f "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" ]; then if [ -f "${pkgdir}/opt/gerbil/resources/assets/icon.png" ]; then
cp "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/resources/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png"
cp "${pkgdir}/opt/friendly-kobold/resources/assets/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/resources/assets/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png"
elif [ -f "${pkgdir}/opt/friendly-kobold/assets/icon.png" ]; then elif [ -f "${pkgdir}/opt/gerbil/assets/icon.png" ]; then
cp "${pkgdir}/opt/friendly-kobold/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/assets/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png"
cp "${pkgdir}/opt/friendly-kobold/assets/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/assets/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png"
elif [ -f "${pkgdir}/opt/friendly-kobold/icon.png" ]; then elif [ -f "${pkgdir}/opt/gerbil/icon.png" ]; then
cp "${pkgdir}/opt/friendly-kobold/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/icon.png" "${pkgdir}/usr/share/icons/hicolor/512x512/apps/gerbil.png"
cp "${pkgdir}/opt/friendly-kobold/icon.png" "${pkgdir}/usr/share/pixmaps/friendly-kobold.png" cp "${pkgdir}/opt/gerbil/icon.png" "${pkgdir}/usr/share/pixmaps/gerbil.png"
else else
echo "Warning: Could not find icon.png in expected locations" echo "Warning: Could not find icon.png in expected locations"
fi fi
@ -213,31 +213,31 @@ jobs:
run: | run: |
# Create .SRCINFO file (required for AUR) # Create .SRCINFO file (required for AUR)
cat > .SRCINFO << 'EOF' cat > .SRCINFO << 'EOF'
pkgbase = friendly-kobold pkgbase = gerbil
pkgdesc = A desktop app for running Large Language Models locally pkgdesc = A desktop app for running Large Language Models locally
pkgver = ${{ steps.release_info.outputs.version }} pkgver = ${{ steps.release_info.outputs.version }}
pkgrel = ${{ inputs.pkgrel || '1' }} pkgrel = ${{ inputs.pkgrel || '1' }}
url = https://github.com/lone-cloud/friendly-kobold url = https://github.com/lone-cloud/gerbil
arch = x86_64 arch = x86_64
license = AGPL-3.0-or-later license = AGPL-3.0-or-later
depends = gtk3 depends = gtk3
depends = nss depends = nss
optdepends = alsa-lib: Audio support for sound effects optdepends = alsa-lib: Audio support for sound effects
optdepends = libxss: Screen saver detection support optdepends = libxss: Screen saver detection support
provides = friendly-kobold provides = gerbil
conflicts = friendly-kobold-git conflicts = gerbil-git
source = friendly-kobold-${{ steps.release_info.outputs.version }}.AppImage::${{ steps.release_info.outputs.appimage_url }} source = gerbil-${{ steps.release_info.outputs.version }}.AppImage::${{ steps.release_info.outputs.appimage_url }}
source = friendly-kobold.desktop::https://raw.githubusercontent.com/lone-cloud/friendly-kobold/${{ steps.release_info.outputs.tag }}/assets/friendly-kobold.desktop source = gerbil.desktop::https://raw.githubusercontent.com/lone-cloud/gerbil/${{ steps.release_info.outputs.tag }}/assets/gerbil.desktop
sha256sums = ${{ steps.sha_calc.outputs.sha256_appimage }} sha256sums = ${{ steps.sha_calc.outputs.sha256_appimage }}
sha256sums = ${{ steps.sha_calc.outputs.sha256_desktop }} sha256sums = ${{ steps.sha_calc.outputs.sha256_desktop }}
pkgname = friendly-kobold pkgname = gerbil
EOF EOF
- name: Publish to AUR - name: Publish to AUR
uses: KSXGitHub/github-actions-deploy-aur@v2.7.2 uses: KSXGitHub/github-actions-deploy-aur@v2.7.2
with: with:
pkgname: friendly-kobold pkgname: gerbil
pkgbuild: ./PKGBUILD pkgbuild: ./PKGBUILD
commit_username: ${{ steps.release_info.outputs.author_name }} commit_username: ${{ steps.release_info.outputs.author_name }}
commit_email: ${{ steps.release_info.outputs.author_email }} commit_email: ${{ steps.release_info.outputs.author_email }}
@ -249,16 +249,16 @@ jobs:
run: | run: |
echo "## AUR Release Summary" >> $GITHUB_STEP_SUMMARY echo "## AUR Release Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY
echo "📦 **Package**: friendly-kobold" >> $GITHUB_STEP_SUMMARY echo "📦 **Package**: gerbil" >> $GITHUB_STEP_SUMMARY
echo "🔖 **Version**: ${{ steps.release_info.outputs.version }}" >> $GITHUB_STEP_SUMMARY echo "🔖 **Version**: ${{ steps.release_info.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "🔗 **AUR Page**: https://aur.archlinux.org/packages/friendly-kobold" >> $GITHUB_STEP_SUMMARY echo "🔗 **AUR Page**: https://aur.archlinux.org/packages/gerbil" >> $GITHUB_STEP_SUMMARY
echo "✅ **Status**: Successfully published to AUR" >> $GITHUB_STEP_SUMMARY echo "✅ **Status**: Successfully published to AUR" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY
echo "### Installation" >> $GITHUB_STEP_SUMMARY echo "### Installation" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY echo '```bash' >> $GITHUB_STEP_SUMMARY
echo "# Using yay" >> $GITHUB_STEP_SUMMARY echo "# Using yay" >> $GITHUB_STEP_SUMMARY
echo "yay -S friendly-kobold" >> $GITHUB_STEP_SUMMARY echo "yay -S gerbil" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY
echo "# Using paru" >> $GITHUB_STEP_SUMMARY echo "# Using paru" >> $GITHUB_STEP_SUMMARY
echo "paru -S friendly-kobold" >> $GITHUB_STEP_SUMMARY echo "paru -S gerbil" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY

View file

@ -118,7 +118,7 @@ jobs:
- name: Create Release - name: Create Release
run: | run: |
gh release create ${{ steps.tag.outputs.tag }} \ gh release create ${{ steps.tag.outputs.tag }} \
--title "FriendlyKobold ${{ steps.tag.outputs.tag }}" \ --title "Gerbil ${{ steps.tag.outputs.tag }}" \
--generate-notes --generate-notes
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -1,7 +1,8 @@
# Friendly Kobold # Gerbil
A desktop app for running Large Language Models locally. <!-- markdownlint-disable MD033 --> A simple desktop app to easily run Large Language Models locally through KoboldCpp.
<img src="src/assets/icon.png" alt="FriendlyKobold Icon" width="32" height="32">
<img src="src/assets/icon.png" alt="Gerbil Icon" width="32" height="32">
<!-- markdownlint-enable MD033 --> <!-- markdownlint-enable MD033 -->
@ -20,12 +21,12 @@ A desktop app for running Large Language Models locally. <!-- markdownlint-disab
### Pre-built Binaries ### Pre-built Binaries
Download the latest release for your platform from the [GitHub Releases page](https://github.com/lone-cloud/friendly-kobold/releases/latest): Download the latest release for your platform from the [GitHub Releases page](https://github.com/lone-cloud/gerbil/releases/latest):
- **Windows**: `Friendly.Kobold-Portable-X.X.X.exe` (portable executable) - **Windows**: `Gerbil-Portable-X.X.X.exe` (portable executable)
- **Windows**: `Friendly.Kobold-Setup-X.X.X.exe` (installer executable) - **Windows**: `Gerbil-Setup-X.X.X.exe` (installer executable)
- **macOS**: `Friendly.Kobold-X.X.X.dmg` (disk image) - **macOS**: `Gerbil-X.X.X.dmg` (disk image)
- **Linux**: `Friendly.Kobold-X.X.X.AppImage` (portable application) - **Linux**: `Gerbil-X.X.X.AppImage` (portable application)
#### Linux - AUR (Arch Linux) #### Linux - AUR (Arch Linux)
@ -33,18 +34,18 @@ For Arch Linux users, install from the AUR using your preferred AUR helper:
```bash ```bash
# Using yay # Using yay
yay -S friendly-kobold yay -S gerbil
# Using paru # Using paru
paru -S friendly-kobold paru -S gerbil
# Manual installation # Manual installation
git clone https://aur.archlinux.org/friendly-kobold.git git clone https://aur.archlinux.org/gerbil.git
cd friendly-kobold cd gerbil
makepkg -si makepkg -si
``` ```
The AUR package automatically handles installation, desktop integration, and system updates. This is the ideal way to run Friendly Kobold on Linux. The AUR package automatically handles installation, desktop integration, and system updates. This is the ideal way to run Gerbil on Linux.
## Screenshots ## Screenshots
@ -80,11 +81,11 @@ Not all koboldcpp features have currently been ported over to the UI. As a worka
## CLI Mode ## CLI Mode
The `--cli` argument allows you to use the Friendly Kobold binary as a proxy to the downloaded KoboldCpp binary. This enables you to run KoboldCpp from the command line using the same binary that the GUI has downloaded. The `--cli` argument allows you to use the Gerbil binary as a proxy to the downloaded KoboldCpp binary. This enables you to run KoboldCpp from the command line using the same binary that the GUI has downloaded.
### Considerations ### Considerations
You might want to run CLI Mode if you're looking to use a different frontend, such as OpenWebUI, than the ones bundled (eg. KoboldAI Lite, Stable UI) with KoboldCpp AND you're looking to minimize any resource utilization of this app. Note that at the time of this writing, Friendly Kobold only takes about ~200MB of RAM and ~100MB of VRAM for its Chromium-based UI. When running in CLI Mode, Friendly Kobold will still take about 1/3 of those RAM and VRAM numbers. You might want to run CLI Mode if you're looking to use a different frontend, such as OpenWebUI, than the ones bundled (eg. KoboldAI Lite, Stable UI) with KoboldCpp AND you're looking to minimize any resource utilization of this app. Note that at the time of this writing, Gerbil only takes about ~200MB of RAM and ~100MB of VRAM for its Chromium-based UI. When running in CLI Mode, Gerbil will still take about 1/3 of those RAM and VRAM numbers.
### Usage ### Usage
@ -92,25 +93,25 @@ You might want to run CLI Mode if you're looking to use a different frontend, su
```bash ```bash
# Basic usage - launch KoboldCpp launcher with no arguments # Basic usage - launch KoboldCpp launcher with no arguments
friendly-kobold --cli gerbil --cli
# Pass arguments to KoboldCpp # Pass arguments to KoboldCpp
friendly-kobold --cli --help gerbil --cli --help
friendly-kobold --cli --port 5001 --model /path/to/model.gguf gerbil --cli --port 5001 --model /path/to/model.gguf
# Any KoboldCpp arguments are supported # Any KoboldCpp arguments are supported
friendly-kobold --cli --model /path/to/model.gguf --port 5001 --host 0.0.0.0 --multiuser 2 gerbil --cli --model /path/to/model.gguf --port 5001 --host 0.0.0.0 --multiuser 2
# CLI inception (friendly kobold CLI calling KoboldCpp CLI mode) # CLI inception (Gerbil CLI calling KoboldCpp CLI mode)
# This is the ideal way to run a custom frontend # This is the ideal way to run a custom frontend
friendly-kobold --cli --cli --model /path/to/model.gguf --gpulayers 57 --contextsize 8192 --port 5001 --multiuser 1 --flashattention --usemmap --usevulkan gerbil --cli --cli --model /path/to/model.gguf --gpulayers 57 --contextsize 8192 --port 5001 --multiuser 1 --flashattention --usemmap --usevulkan
``` ```
**Windows:** **Windows:**
CLI mode will only work correctly on Windows if you install Friendly Kobold using the Setup.exe from the github releases. Otherwise there is currently a technical limitation with the Windows portable .exe which will cause it to not display the terminal output correctly nor will it be killable through the standard terminal (Ctrl+C) commands. CLI mode will only work correctly on Windows if you install Gerbil using the Setup.exe from the github releases. Otherwise there is currently a technical limitation with the Windows portable .exe which will cause it to not display the terminal output correctly nor will it be killable through the standard terminal (Ctrl+C) commands.
You can use the CLI mode on Windows in exactly the same way as in the Linux/macOS examples above, except you'll be calling the "Friendly Kobold.exe". Note that it will not be on your system PATH by default, so you'll need to manually specify the full path to it when callig it from the Windows terminal. You can use the CLI mode on Windows in exactly the same way as in the Linux/macOS examples above, except you'll be calling the "Gerbil.exe". Note that it will not be on your system PATH by default, so you'll need to manually specify the full path to it when callig it from the Windows terminal.
## For Local Dev ## For Local Dev

View file

@ -1,9 +1,9 @@
[Desktop Entry] [Desktop Entry]
Name=Friendly Kobold Name=Gerbil
Comment=A desktop app for running Large Language Models locally Comment=A desktop app for running Large Language Models locally
Exec=friendly-kobold %U Exec=gerbil %U
Terminal=false Terminal=false
Type=Application Type=Application
Icon=friendly-kobold Icon=gerbil
Categories=Utility; Categories=Utility;
StartupWMClass=Friendly Kobold StartupWMClass=Gerbil

View file

@ -8,7 +8,7 @@
http-equiv="Content-Security-Policy" http-equiv="Content-Security-Policy"
content="default-src 'self'; connect-src 'self' http: https:; script-src 'self' blob:; worker-src 'self' blob:; style-src 'self' 'unsafe-inline' data:; frame-src 'self' http: https:;" content="default-src 'self'; connect-src 'self' http: https:; script-src 'self' blob:; worker-src 'self' blob:; style-src 'self' 'unsafe-inline' data:; frame-src 'self' http: https:;"
/> />
<title>Friendly Kobold</title> <title>Gerbil</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View file

@ -1,6 +1,6 @@
{ {
"name": "friendly-kobold", "name": "gerbil",
"productName": "Friendly Kobold", "productName": "Gerbil",
"version": "1.0.0", "version": "1.0.0",
"description": "A desktop app for running Large Language Models locally", "description": "A desktop app for running Large Language Models locally",
"main": "out/main/index.js", "main": "out/main/index.js",
@ -11,9 +11,9 @@
}, },
"volta": { "volta": {
"node": "22.18.0", "node": "22.18.0",
"yarn": "4.9.3" "yarn": "4.9.4"
}, },
"packageManager": "yarn@4.9.3", "packageManager": "yarn@4.9.4",
"scripts": { "scripts": {
"dev": "electron-vite dev", "dev": "electron-vite dev",
"build": "electron-vite build", "build": "electron-vite build",
@ -93,8 +93,8 @@
"zustand": "^5.0.8" "zustand": "^5.0.8"
}, },
"build": { "build": {
"appId": "com.friendly-kobold.app", "appId": "com.gerbil.app",
"productName": "Friendly Kobold", "productName": "Gerbil",
"compression": "normal", "compression": "normal",
"icon": "src/assets/icon.png", "icon": "src/assets/icon.png",
"publish": null, "publish": null,
@ -110,8 +110,8 @@
], ],
"extraFiles": [ "extraFiles": [
{ {
"from": "assets/friendly-kobold.desktop", "from": "assets/gerbil.desktop",
"to": "assets/friendly-kobold.desktop", "to": "assets/gerbil.desktop",
"filter": [ "filter": [
"**/*" "**/*"
] ]
@ -171,7 +171,7 @@
"allowToChangeInstallationDirectory": true, "allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true, "createDesktopShortcut": true,
"createStartMenuShortcut": true, "createStartMenuShortcut": true,
"shortcutName": "Friendly Kobold" "shortcutName": "Gerbil"
}, },
"portable": { "portable": {
"artifactName": "${productName}-Portable-${version}.${ext}" "artifactName": "${productName}-Portable-${version}.${ext}"
@ -181,10 +181,10 @@
"category": "Utility", "category": "Utility",
"desktop": { "desktop": {
"entry": { "entry": {
"Name": "Friendly Kobold", "Name": "Gerbil",
"Comment": "A desktop app for running Large Language Models locally", "Comment": "A desktop app for running Large Language Models locally",
"Categories": "Utility;", "Categories": "Utility;",
"StartupWMClass": "Friendly Kobold" "StartupWMClass": "Gerbil"
} }
}, },
"target": [ "target": [

View file

@ -38,7 +38,7 @@ try {
console.log(`✅ Release ${tagName} created successfully!`); console.log(`✅ Release ${tagName} created successfully!`);
console.log(`📦 GitHub Actions will now build and publish the release.`); console.log(`📦 GitHub Actions will now build and publish the release.`);
console.log( console.log(
`🔗 Check the progress at: https://github.com/lone-cloud/friendly-kobold/actions` `🔗 Check the progress at: https://github.com/lone-cloud/gerbil/actions`
); );
} catch (error: unknown) { } catch (error: unknown) {
const errorMessage = error instanceof Error ? error.message : String(error); const errorMessage = error instanceof Error ? error.message : String(error);

View file

@ -84,7 +84,7 @@ export const AppHeader = ({
<Group gap="sm" align="center"> <Group gap="sm" align="center">
<Image <Image
src={iconUrl} src={iconUrl}
alt="Friendly Kobold" alt="Gerbil"
w={28} w={28}
h={28} h={28}
style={{ style={{
@ -105,7 +105,7 @@ export const AppHeader = ({
onClick={handleLogoClick} onClick={handleLogoClick}
/> />
<Title order={4} fw={500}> <Title order={4} fw={500}>
Friendly Kobold Gerbil
</Title> </Title>
</Group> </Group>
)} )}

View file

@ -23,7 +23,7 @@ export const WelcomeScreen = ({ onGetStarted }: WelcomeScreenProps) => (
<Stack gap="lg" align="center"> <Stack gap="lg" align="center">
<Stack gap="md" align="center"> <Stack gap="md" align="center">
<Title order={1} ta="center"> <Title order={1} ta="center">
Friendly Kobold Gerbil
</Title> </Title>
<Text size="lg" c="dimmed" ta="center" maw={600}> <Text size="lg" c="dimmed" ta="center" maw={600}>
A desktop app for running Large Language Models locally A desktop app for running Large Language Models locally
@ -117,14 +117,14 @@ export const WelcomeScreen = ({ onGetStarted }: WelcomeScreenProps) => (
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
window.electronAPI.app.openExternal( window.electronAPI.app.openExternal(
'https://github.com/lone-cloud/friendly-kobold' 'https://github.com/lone-cloud/gerbil'
); );
}} }}
size="sm" size="sm"
c="dimmed" c="dimmed"
> >
<Group gap={4} align="center"> <Group gap={4} align="center">
<span>About Friendly Kobold</span> <span>About Gerbil</span>
<ExternalLink size={12} /> <ExternalLink size={12} />
</Group> </Group>
</Anchor> </Anchor>

View file

@ -132,7 +132,8 @@ export const GeneralTab = () => {
</Text> </Text>
{isNpxAvailable && ( {isNpxAvailable && (
<Text size="sm" c="dimmed" mb="md"> <Text size="sm" c="dimmed" mb="md">
Choose which frontend interface to use for interacting with models Choose which frontend interface to use for interacting with AI
models
</Text> </Text>
)} )}

View file

@ -1,5 +1,5 @@
export const APP_NAME = 'friendly-kobold'; export const APP_NAME = 'gerbil';
export const PRODUCT_NAME = 'Friendly Kobold'; export const PRODUCT_NAME = 'Gerbil';
export const CONFIG_FILE_NAME = 'config.json'; export const CONFIG_FILE_NAME = 'config.json';
@ -20,7 +20,7 @@ export const GITHUB_API = {
BASE_URL: 'https://api.github.com', BASE_URL: 'https://api.github.com',
KOBOLDCPP_REPO: 'LostRuins/koboldcpp', KOBOLDCPP_REPO: 'LostRuins/koboldcpp',
KOBOLDCPP_ROCM_REPO: 'YellowRoseCx/koboldcpp-rocm', KOBOLDCPP_ROCM_REPO: 'YellowRoseCx/koboldcpp-rocm',
FRIENDLY_KOBOLD_REPO: 'lone-cloud/friendly-kobold', GERBIL_REPO: 'lone-cloud/gerbil',
get LATEST_RELEASE_URL() { get LATEST_RELEASE_URL() {
return `${this.BASE_URL}/repos/${this.KOBOLDCPP_REPO}/releases/latest`; return `${this.BASE_URL}/repos/${this.KOBOLDCPP_REPO}/releases/latest`;
}, },

View file

@ -21,7 +21,7 @@ export const useAppUpdateChecker = () => {
const currentVersion = await window.electronAPI.app.getVersion(); const currentVersion = await window.electronAPI.app.getVersion();
const response = await fetch( const response = await fetch(
`${GITHUB_API.BASE_URL}/repos/${GITHUB_API.FRIENDLY_KOBOLD_REPO}/releases/latest` `${GITHUB_API.BASE_URL}/repos/${GITHUB_API.GERBIL_REPO}/releases/latest`
); );
if (!response.ok) { if (!response.ok) {

View file

@ -13,7 +13,7 @@ import { PRODUCT_NAME, CONFIG_FILE_NAME } from '@/constants';
import { homedir } from 'os'; import { homedir } from 'os';
import { ensureDir } from '@/utils/fs'; import { ensureDir } from '@/utils/fs';
export class FriendlyKoboldApp { export class GerbilApp {
private windowManager: WindowManager; private windowManager: WindowManager;
private koboldManager: KoboldCppManager; private koboldManager: KoboldCppManager;
private configManager: ConfigManager; private configManager: ConfigManager;
@ -97,7 +97,7 @@ export class FriendlyKoboldApp {
await this.ensureInstallDirectory(); await this.ensureInstallDirectory();
if (process.platform === 'linux') { if (process.platform === 'linux') {
app.setAppUserModelId('com.friendly-kobold.app'); app.setAppUserModelId('com.gerbil.app');
} }
this.windowManager.setupApplicationMenu(); this.windowManager.setupApplicationMenu();

View file

@ -20,10 +20,10 @@ if (isCliMode) {
}); });
} else { } else {
import('./gui').then((guiModule) => { import('./gui').then((guiModule) => {
const app = new guiModule.FriendlyKoboldApp(); const app = new guiModule.GerbilApp();
app.initialize().catch((error: unknown) => { app.initialize().catch((error: unknown) => {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.error('Failed to initialize FriendlyKobold:', error); console.error('Failed to initialize Gerbil:', error);
}); });
}); });
} }

View file

@ -29,12 +29,12 @@ export class LogManager {
), ),
transports: [ transports: [
new winston.transports.DailyRotateFile({ new winston.transports.DailyRotateFile({
filename: join(logsDir, 'friendly-kobold-%DATE%.log'), filename: join(logsDir, 'gerbil-%DATE%.log'),
datePattern: 'YYYY-MM-DD', datePattern: 'YYYY-MM-DD',
maxSize: '10m', maxSize: '10m',
maxFiles: '5d', maxFiles: '5d',
createSymlink: true, createSymlink: true,
symlinkName: 'friendly-kobold.log', symlinkName: 'gerbil.log',
}), }),
], ],
}); });
@ -79,7 +79,7 @@ export class LogManager {
} }
public getLogFilePath(): string { public getLogFilePath(): string {
return join(app.getPath('userData'), 'logs', 'friendly-kobold.log'); return join(app.getPath('userData'), 'logs', 'gerbil.log');
} }
public getLogsDirectory(): string { public getLogsDirectory(): string {

View file

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>About Friendly Kobold</title> <title>About Gerbil</title>
<style> <style>
body { body {
font-family: font-family:
@ -116,7 +116,7 @@
</head> </head>
<body> <body>
<div class="container"> <div class="container">
<h1>Friendly Kobold</h1> <h1>Gerbil</h1>
<div class="version-info" id="version-info"> <div class="version-info" id="version-info">
<!-- Version information will be injected here --> <!-- Version information will be injected here -->
</div> </div>
@ -142,7 +142,7 @@
// Send IPC message directly since this is a simple modal // Send IPC message directly since this is a simple modal
if (window.electronAPI && window.electronAPI.app) { if (window.electronAPI && window.electronAPI.app) {
window.electronAPI.app.openExternal( window.electronAPI.app.openExternal(
'https://github.com/lone-cloud/friendly-kobold' 'https://github.com/lone-cloud/gerbil'
); );
} }
} }

View file

@ -3570,50 +3570,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"friendly-kobold@workspace:.":
version: 0.0.0-use.local
resolution: "friendly-kobold@workspace:."
dependencies:
"@eslint/js": "npm:^9.34.0"
"@mantine/core": "npm:^8.2.7"
"@mantine/hooks": "npm:^8.2.7"
"@types/node": "npm:^24.3.0"
"@types/react": "npm:^19.1.12"
"@types/react-dom": "npm:^19.1.9"
"@typescript-eslint/eslint-plugin": "npm:^8.41.0"
"@typescript-eslint/parser": "npm:^8.41.0"
"@vitejs/plugin-react": "npm:^5.0.2"
axios: "npm:^1.11.0"
cross-env: "npm:^10.0.0"
electron: "npm:^37.4.0"
electron-builder: "npm:^26.0.12"
electron-vite: "npm:^4.0.0"
eslint: "npm:^9.34.0"
eslint-plugin-import: "npm:^2.32.0"
eslint-plugin-no-comments: "npm:^1.1.10"
eslint-plugin-react: "npm:^7.37.5"
eslint-plugin-react-hooks: "npm:^5.2.0"
eslint-plugin-react-refresh: "npm:^0.4.20"
eslint-plugin-sonarjs: "npm:^3.0.5"
execa: "npm:^9.6.0"
globals: "npm:^16.3.0"
husky: "npm:^9.1.7"
jiti: "npm:^2.5.1"
lint-staged: "npm:^16.1.5"
lucide-react: "npm:^0.542.0"
prettier: "npm:^3.6.2"
react: "npm:^19.1.1"
react-dom: "npm:^19.1.1"
rollup-plugin-visualizer: "npm:^6.0.3"
systeminformation: "npm:^5.27.8"
typescript: "npm:^5.9.2"
vite: "npm:^7.1.3"
winston: "npm:^3.17.0"
winston-daily-rotate-file: "npm:^5.0.0"
zustand: "npm:^5.0.8"
languageName: unknown
linkType: soft
"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": "fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0":
version: 10.1.0 version: 10.1.0
resolution: "fs-extra@npm:10.1.0" resolution: "fs-extra@npm:10.1.0"
@ -3745,6 +3701,50 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"gerbil@workspace:.":
version: 0.0.0-use.local
resolution: "gerbil@workspace:."
dependencies:
"@eslint/js": "npm:^9.34.0"
"@mantine/core": "npm:^8.2.7"
"@mantine/hooks": "npm:^8.2.7"
"@types/node": "npm:^24.3.0"
"@types/react": "npm:^19.1.12"
"@types/react-dom": "npm:^19.1.9"
"@typescript-eslint/eslint-plugin": "npm:^8.41.0"
"@typescript-eslint/parser": "npm:^8.41.0"
"@vitejs/plugin-react": "npm:^5.0.2"
axios: "npm:^1.11.0"
cross-env: "npm:^10.0.0"
electron: "npm:^37.4.0"
electron-builder: "npm:^26.0.12"
electron-vite: "npm:^4.0.0"
eslint: "npm:^9.34.0"
eslint-plugin-import: "npm:^2.32.0"
eslint-plugin-no-comments: "npm:^1.1.10"
eslint-plugin-react: "npm:^7.37.5"
eslint-plugin-react-hooks: "npm:^5.2.0"
eslint-plugin-react-refresh: "npm:^0.4.20"
eslint-plugin-sonarjs: "npm:^3.0.5"
execa: "npm:^9.6.0"
globals: "npm:^16.3.0"
husky: "npm:^9.1.7"
jiti: "npm:^2.5.1"
lint-staged: "npm:^16.1.5"
lucide-react: "npm:^0.542.0"
prettier: "npm:^3.6.2"
react: "npm:^19.1.1"
react-dom: "npm:^19.1.1"
rollup-plugin-visualizer: "npm:^6.0.3"
systeminformation: "npm:^5.27.8"
typescript: "npm:^5.9.2"
vite: "npm:^7.1.3"
winston: "npm:^3.17.0"
winston-daily-rotate-file: "npm:^5.0.0"
zustand: "npm:^5.0.8"
languageName: unknown
linkType: soft
"get-caller-file@npm:^2.0.5": "get-caller-file@npm:^2.0.5":
version: 2.0.5 version: 2.0.5
resolution: "get-caller-file@npm:2.0.5" resolution: "get-caller-file@npm:2.0.5"