From da630f4b89abed748ff3e5d0de4210bda4db1e01 Mon Sep 17 00:00:00 2001 From: en <54501296+2hexed@users.noreply.github.com> Date: Sun, 27 Sep 2026 23:05:28 +0530 Subject: [PATCH 1/3] feat: Add devtools toggle for development env and fix flake Signed-off-by: en <54501296+2hexed@users.noreply.github.com> --- README.md | 8 +------ flake.lock | 17 +++++++++------ flake.nix | 60 ++++++++++++++++++++++++++++++++-------------------- package.json | 5 ++--- src/main.ts | 15 +++++++++++++ 5 files changed, 65 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 97e5b88e..f3c84884 100644 --- a/README.md +++ b/README.md @@ -65,14 +65,8 @@ mise exec -- pnpm run:flatpak # ... also connect to dev server like so: mise exec -- pnpm run:flatpak --force-server http://localhost:5173 -# Nix-specific instructions for testing +# Nix: Enter the development environment & start working with `mise` nix develop -pnpm package -pnpm run:nix -# ... as before: -pnpm run:nix --force-server=http://localhost:5173 -# a better solution would be telling -# Electron Forge where system Electron is ``` ### Pulling in Stoat's assets diff --git a/flake.lock b/flake.lock index 5da5518d..0ad6b89b 100644 --- a/flake.lock +++ b/flake.lock @@ -2,15 +2,18 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1789370336, - "narHash": "sha256-obwZbWHP7htCIoq2Z0g/uTMcEgN6yqcMNIcOMe6P2qI=", - "rev": "c7def046b9a883d46974757852106483d741586f", - "type": "tarball", - "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.11pre1073483.c7def046b9a8/nixexprs.tar.zst" + "lastModified": 1790463110, + "narHash": "sha256-hKlVl12B1dF0Q5vd9dY3lIJM5mFGWYSlXwSLAqHZ1+s=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e158d9ed9b51c98974c5e66e1ba1c9e0255fecaa", + "type": "github" }, "original": { - "type": "tarball", - "url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.zst" + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, "root": { diff --git a/flake.nix b/flake.nix index 441b1f91..0baef712 100644 --- a/flake.nix +++ b/flake.nix @@ -1,30 +1,44 @@ { - description = "Stoat for Desktop Development shell"; + description = "Development environment for Stoat desktop app"; inputs = { - nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.zst"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; }; - outputs = inputs: { - devShells = builtins.mapAttrs (system: pkgs: { - default = pkgs.mkShell { - buildInputs = with pkgs; [ - mise - pnpm - (writeShellScriptBin "electron-nix" '' - exec ${pkgs.lib.getExe pkgs.electron} "$@" - '') - zip - flatpak - flatpak-builder - elfutils - ]; + outputs = + { self, nixpkgs }@inputs: + let + supportedSystems = [ + "x86_64-linux" + "aarch64-linux" + ]; + forEachSystem = nixpkgs.lib.genAttrs supportedSystems; + in + { + devShells = forEachSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + default = pkgs.mkShell { + buildInputs = with pkgs; [ + mise + pnpm + python3 + electron + zip + flatpak + flatpak-builder + elfutils + ]; - shellHook = '' - export ELECTRON_OVERRIDE_DIST_PATH="${pkgs.electron}/bin" - export MISE_NODE_COMPILE=false - ''; - }; - }) inputs.nixpkgs.legacyPackages; - }; + shellHook = '' + export ELECTRON_OVERRIDE_DIST_PATH="${pkgs.electron}/bin" + export MISE_NODE_COMPILE=false + ''; + }; + } + ); + }; } diff --git a/package.json b/package.json index d8266589..00b41701 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,7 @@ "fmt": "prettier --check 'src/**/*.{ts,tsx,json}'", "fmt:fix": "prettier --write 'src/**/*.{ts,tsx,json}'", "install:flatpak": "flatpak --user install out/make/flatpak/x86_64/chat.stoat.StoatDesktop_stable_x86_64.flatpak", - "run:flatpak": "flatpak run chat.stoat.StoatDesktop", - "run:nix": "/usr/bin/env electron-nix ." + "run:flatpak": "flatpak run chat.stoat.StoatDesktop" }, "keywords": [], "author": { @@ -64,4 +63,4 @@ "node-pipewire": "1.1.0" }, "packageManager": "pnpm@11.17.0+sha512.cca3cea332ad254bb84145f966d19f4879615210346fc92c79a047f23a0d7b3cca3c3792f0076ba1f1831d277efbcf0a9119b31a9a60eca7fb3d6231f331ef72" -} +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 1e7d0b55..ffdc845f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -106,6 +106,21 @@ if (acquiredLock) { // ensure URLs launch in external context app.on("web-contents-created", (_, contents) => { + // DevTools in dev env only, to avoid users opening it in production + if (!app.isPackaged) { + contents.on("before-input-event", (event, input) => { + const isMac = process.platform === "darwin"; + const isDevToolsShortcut = isMac + ? input.meta && input.alt && input.key.toLowerCase() === "i" + : input.control && input.shift && input.key.toLowerCase() === "i"; + + if (input.key === "F12" || isDevToolsShortcut) { + contents.toggleDevTools(); + event.preventDefault(); + } + }); + } + // prevent navigation out of build URL origin contents.on("will-navigate", (event, navigationUrl) => { if (new URL(navigationUrl).origin !== BUILD_URL.origin) { From 4dd0ae670ec42a3c15fe35daafb4933cf3da9a5e Mon Sep 17 00:00:00 2001 From: en <54501296+2hexed@users.noreply.github.com> Date: Sun, 27 Sep 2026 23:11:05 +0530 Subject: [PATCH 2/3] fix: Enhance context menu for spellchecker to show only on editable text or misspelled words --- src/native/window.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/native/window.ts b/src/native/window.ts index 80bdbac1..d1286c92 100644 --- a/src/native/window.ts +++ b/src/native/window.ts @@ -153,6 +153,11 @@ export function createMainWindow() { // configure spellchecker context menu mainWindow.webContents.on("context-menu", (_, params) => { + // Only show this menu if the user is right-clicking editable text or a misspelled word + if (!params.isEditable && !params.misspelledWord) { + return; + } + const menu = new Menu(); // add all suggestions From 7b13ec8d840c39824c81f6cfc1d77f0a6a3f2124 Mon Sep 17 00:00:00 2001 From: en <54501296+2hexed@users.noreply.github.com> Date: Sun, 27 Sep 2026 23:19:34 +0530 Subject: [PATCH 3/3] feat: Update spellchecker context menu to show options based on selection type Signed-off-by: en <54501296+2hexed@users.noreply.github.com> --- src/native/window.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/native/window.ts b/src/native/window.ts index d1286c92..ed7c8998 100644 --- a/src/native/window.ts +++ b/src/native/window.ts @@ -154,12 +154,25 @@ export function createMainWindow() { // configure spellchecker context menu mainWindow.webContents.on("context-menu", (_, params) => { // Only show this menu if the user is right-clicking editable text or a misspelled word - if (!params.isEditable && !params.misspelledWord) { - return; - } + // if (!params.isEditable && !params.misspelledWord) { + // return; + // } const menu = new Menu(); + if (params.isEditable) { + menu.append(new MenuItem({ label: "Cut", role: "cut" })); + menu.append(new MenuItem({ label: "Copy", role: "copy" })); + menu.append(new MenuItem({ label: "Paste", role: "paste" })); + menu.append(new MenuItem({ type: "separator" })); + } else if (params.selectionText.trim().length > 0) { + menu.append(new MenuItem({ label: "Copy", role: "copy" })); + menu.append(new MenuItem({ type: "separator" })); + } + + menu.append(new MenuItem({ label: "Select All", role: "selectAll" })); + menu.append(new MenuItem({ type: "separator" })); + // add all suggestions for (const suggestion of params.dictionarySuggestions) { menu.append(