diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 008b1b0..62df344 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,8 @@ on: push: branches: - - "**" + - main + pull_request: jobs: build: @@ -15,16 +16,10 @@ jobs: - name: Checkout assets run: git -c submodule."assets".update=checkout submodule update --init assets - - name: Install pnpm - uses: pnpm/action-setup@v4 + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@cd24790a7f5f6439ac32cc94f5523cb2de8bfa8c # use-mise-action-v1.1.0 with: - run_install: false - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Install dependencies run: pnpm install diff --git a/.github/workflows/git-town.yml b/.github/workflows/git-town.yml new file mode 100644 index 0000000..060fe10 --- /dev/null +++ b/.github/workflows/git-town.yml @@ -0,0 +1,19 @@ +name: Git Town + +on: + pull_request: + +jobs: + git-town: + name: Display the branch stack + runs-on: ubuntu-slim + + if: ${{ !startsWith(github.head_ref, 'release-please--') }} + + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: stoatchat/action-git-town@4bc5c942e4603bffa0806b51d5fe5f0bc5deb0ac diff --git a/README.md b/README.md index 0077754..59a3694 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ Application for Windows, macOS, and Linux.
+## Installation + + + Packaging status + + +- All downloads and instructions for Stoat can be found on our [Website](https://stoat.chat/download). + ## Development Guide _Contribution guidelines for Desktop app TBA!_ diff --git a/chat.stoat.StoatDesktop.desktop b/chat.stoat.StoatDesktop.desktop new file mode 100644 index 0000000..b0e0b55 --- /dev/null +++ b/chat.stoat.StoatDesktop.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Stoat +Comment=Open source, user-first chat platform +Exec=stoat-desktop +Terminal=false +Type=Application +Icon=chat.stoat.StoatDesktop +Categories=Network;InstantMessaging +StartupWMClass=stoat-desktop +X-Desktop-File-Install-Version=0.26 +X-Flatpak=chat.stoat.StoatDesktop diff --git a/chat.stoat.StoatDesktop.metainfo.xml b/chat.stoat.StoatDesktop.metainfo.xml new file mode 100644 index 0000000..0327c38 --- /dev/null +++ b/chat.stoat.StoatDesktop.metainfo.xml @@ -0,0 +1,70 @@ + + + chat.stoat.StoatDesktop + chat.stoat.StoatDesktop.desktop + Stoat + + Revolt Platforms Ltd + + Open source, user-first chat platform + CC0-1.0 + AGPL-3.0 + + https://raw.githubusercontent.com/stoatchat/assets/f106946659af67ad4f008588ac51570029b2fd47/desktop/icon.png + +

Stoat is an open source, user-first chat platform. Send messages, share + images, mention users, and join voice channels — all from a native desktop + application.

+
+ + + Main window + screenshot.png + + + + + +

Features:

+
    +
  • New Branding
  • +
  • Persist and restore window size and position
  • +
+

Bug Fixes:

+
    +
  • App Autostart
  • +
+
+
+ + +

Bug fixes:

+
    +
  • Add NixOS compatibility for electron startup
  • +
  • Correctly load badge count; expose to renderer
  • +
  • Fix event listener accumulation from rpc client
  • +
  • Fix macOS tray icon size
  • +
  • Fix RPC largeImageText
  • +
  • Use the correct argument for auto start
  • +
+
+
+
+ https://github.com/stoatchat/for-desktop/issues + https://stoat.chat + https://github.com/stoatchat/for-desktop + + intense + intense + intense + intense + + + 940 + always + + + keyboard + pointing + +
diff --git a/default.nix b/default.nix index f343ef1..96d7802 100644 --- a/default.nix +++ b/default.nix @@ -1,16 +1,13 @@ -{ - pkgs ? import { }, +{ pkgs ? import (fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/77ef7a29d276c6d8303aece3444d61118ef71ac2.tar.gz"; + sha256 = "0pm4l48jq8plzrrrisimahxqlcpx7qqq9c99hylmf7p3zlc3phsy"; + }) {}, }: pkgs.mkShell rec { - buildInputs = [ + buildInputs = with pkgs; [ # Tools - pkgs.git - pkgs.gh - - # Node - pkgs.nodejs - pkgs.nodejs.pkgs.pnpm + pkgs.mise # Electron (pkgs.writeShellScriptBin "electron-nix" '' @@ -29,5 +26,15 @@ pkgs.mkShell rec { pkgs.flatpak-builder pkgs.elfutils # flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo + + (writeShellScriptBin "fish" '' + exec ${pkgs.fish}/bin/fish -C 'mise activate fish | source' "$@" + '') ]; + + shellHook = '' + export ELECTRON_OVERRIDE_DIST_PATH="${pkgs.electron}/bin" + export MISE_NODE_COMPILE=false + eval "$(mise activate bash)" + ''; } diff --git a/forge.config.ts b/forge.config.ts index 40952df..3323356 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -58,7 +58,7 @@ if (!process.env.PLATFORM) { description: STRINGS.description, productName: STRINGS.name, productDescription: STRINGS.description, - runtimeVersion: "21.08", + runtimeVersion: "25.08", icon: `${ASSET_DIR}/icon.png`, categories: ["Network"], modules: [ diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..6753e20 --- /dev/null +++ b/mise.toml @@ -0,0 +1,5 @@ +[tools] +node = "25.4.0" +pnpm = "10.28.1" +gh = "2.25.0" +"github:git-town/git-town" = "22.4.0" diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9db349e..4aeb724 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,9 @@ nodeLinker: hoisted onlyBuiltDependencies: + - bufferutil - electron - electron-winstaller - esbuild - register-scheme + - utf-8-validate diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..3611941 Binary files /dev/null and b/screenshot.png differ diff --git a/src/main.ts b/src/main.ts index 5256d5f..d67c18c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,6 @@ -import { updateElectronApp } from "update-electron-app"; +import { IUpdateInfo, updateElectronApp } from "update-electron-app"; -import { BrowserWindow, app, shell } from "electron"; +import { BrowserWindow, app, shell, Notification } from "electron"; import started from "electron-squirrel-startup"; import { autoLaunch } from "./native/autoLaunch"; @@ -24,9 +24,19 @@ if (!config.hardwareAcceleration) { // ensure only one copy of the application can run const acquiredLock = app.requestSingleInstanceLock(); +const onNotifyUser = (_info: IUpdateInfo) => { + const notification = new Notification({ + title: 'Update Available', + body: 'Restart the app to install the update.', + silent: true + }) + + notification.show() +} + if (acquiredLock) { // start auto update logic - updateElectronApp(); + updateElectronApp({onNotifyUser}) // create and configure the app when electron is ready app.on("ready", () => { diff --git a/src/native/tray.ts b/src/native/tray.ts index 6f96a4e..219afde 100644 --- a/src/native/tray.ts +++ b/src/native/tray.ts @@ -28,8 +28,12 @@ export function initTray() { tray.setToolTip("Stoat for Desktop"); tray.setImage(trayIcon); tray.on("click", () => { - mainWindow.show(); - mainWindow.focus(); + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + mainWindow.focus(); + } }); } diff --git a/src/native/window.ts b/src/native/window.ts index 00ada48..7d8cd14 100644 --- a/src/native/window.ts +++ b/src/native/window.ts @@ -116,7 +116,7 @@ export function createMainWindow() { // rebind zoom controls to be more sensible mainWindow.webContents.on("before-input-event", (event, input) => { - if (input.control && input.key === "=") { + if (input.control && (input.key === "=" || input.key === "+")) { // zoom in (+) event.preventDefault(); mainWindow.webContents.setZoomLevel( @@ -128,6 +128,16 @@ export function createMainWindow() { mainWindow.webContents.setZoomLevel( mainWindow.webContents.getZoomLevel() - 1, ); + } else if (input.control && input.key === "0") { + // reset zoom to default. + event.preventDefault(); + mainWindow.webContents.setZoomLevel(0); + } else if ( + input.key === "F5" || + ((input.control || input.meta) && input.key.toLowerCase() === "r") + ) { + event.preventDefault(); + mainWindow.webContents.reload(); } });