mirror of
https://github.com/lone-cloud/gerbil
synced 2026-06-03 09:33:10 -07:00
rename the project to gerbil
This commit is contained in:
parent
dacdd24dde
commit
0cca766ea7
18 changed files with 150 additions and 148 deletions
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
# Copilot Instructions for FriendlyKobold
|
# Copilot Instructions for Gerbil
|
||||||
|
|
||||||
### General Coding
|
### General Coding
|
||||||
|
|
||||||
|
|
|
||||||
84
.github/workflows/aur-release.yml
vendored
84
.github/workflows/aur-release.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -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 }}
|
||||||
|
|
|
||||||
47
README.md
47
README.md
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
22
package.json
22
package.json
|
|
@ -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": [
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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`;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
88
yarn.lock
88
yarn.lock
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue