Merge branch 'main' of https://github.com/stoatchat/for-desktop into feat/minimise-to-tray-startup

This commit is contained in:
Mihai 2026-02-17 21:16:35 +01:00
commit 2679e78d68
13 changed files with 167 additions and 26 deletions

View File

@ -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

19
.github/workflows/git-town.yml vendored Normal file
View File

@ -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

View File

@ -13,6 +13,14 @@ Application for Windows, macOS, and Linux.
</div>
<br/>
## Installation
<a href="https://repology.org/project/stoat-desktop/versions">
<img src="https://repology.org/badge/vertical-allrepos/stoat-desktop.svg" alt="Packaging status" align="right">
</a>
- All downloads and instructions for Stoat can be found on our [Website](https://stoat.chat/download).
## Development Guide
_Contribution guidelines for Desktop app TBA!_

View File

@ -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

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
<id>chat.stoat.StoatDesktop</id>
<launchable type="desktop-id">chat.stoat.StoatDesktop.desktop</launchable>
<name>Stoat</name>
<developer id="chat.stoat">
<name>Revolt Platforms Ltd</name>
</developer>
<summary>Open source, user-first chat platform</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>AGPL-3.0</project_license>
<icon type="remote" height="256" width="256">
https://raw.githubusercontent.com/stoatchat/assets/f106946659af67ad4f008588ac51570029b2fd47/desktop/icon.png</icon>
<description>
<p>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.</p>
</description>
<screenshots>
<screenshot type="default">
<caption>Main window</caption>
<image>screenshot.png</image>
</screenshot>
</screenshots>
<releases>
<release date="2026-02-14" version="1.2.0">
<description>
<p>Features:</p>
<ul>
<li>New Branding</li>
<li>Persist and restore window size and position</li>
</ul>
<p>Bug Fixes:</p>
<ul>
<li>App Autostart</li>
</ul>
</description>
</release>
<release date="2025-12-29" version="1.1.12">
<description>
<p>Bug fixes:</p>
<ul>
<li>Add NixOS compatibility for electron startup</li>
<li>Correctly load badge count; expose to renderer</li>
<li>Fix event listener accumulation from rpc client</li>
<li>Fix macOS tray icon size</li>
<li>Fix RPC largeImageText</li>
<li>Use the correct argument for auto start</li>
</ul>
</description>
</release>
</releases>
<url type="bugtracker">https://github.com/stoatchat/for-desktop/issues</url>
<url type="homepage">https://stoat.chat</url>
<url type="vcs-browser">https://github.com/stoatchat/for-desktop</url>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">intense</content_attribute>
<content_attribute id="social-info">intense</content_attribute>
<content_attribute id="social-audio">intense</content_attribute>
<content_attribute id="social-contacts">intense</content_attribute>
</content_rating>
<requires>
<display_length compare="ge">940</display_length>
<internet>always</internet>
</requires>
<supports>
<control>keyboard</control>
<control>pointing</control>
</supports>
</component>

View File

@ -1,16 +1,13 @@
{
pkgs ? import <nixpkgs> { },
{ 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)"
'';
}

View File

@ -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: [

5
mise.toml Normal file
View File

@ -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"

View File

@ -1,7 +1,9 @@
nodeLinker: hoisted
onlyBuiltDependencies:
- bufferutil
- electron
- electron-winstaller
- esbuild
- register-scheme
- utf-8-validate

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

View File

@ -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", () => {

View File

@ -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();
}
});
}

View File

@ -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();
}
});