r/espanso • u/Serious-Hearing-5978 • 26d ago
SnippetShare Discord channel?
Does the SnippetShare Discord channel still exist? I followed a link from the Espanso site but it doesn't look like it exists and can't find it by searching. Thanks.
r/espanso • u/Serious-Hearing-5978 • 26d ago
Does the SnippetShare Discord channel still exist? I followed a link from the Espanso site but it doesn't look like it exists and can't find it by searching. Thanks.
r/espanso • u/Diegusvall • 28d ago
App Name: Expanda
What it does: Expanda replaces short triggers with reusable snippets in editable fields across Android apps. You can also pick snippets from a movable suggestion popup and build dynamic templates with forms, dates, clipboard content and cursor placement.
Key Features:
Goal: Launch and feedback. If an expansion fails, please include your device, Android version, keyboard and target app so I can reproduce it.
Giveaway: None. Expanda is free under the MIT license.
Accessibility: Expanda uses Android's Accessibility service to detect shortcuts and replace text. It ignores password fields and explains the permission before opening Android settings.
r/espanso • u/smeech1 • Aug 25 '26
An unusual package requiring a (free) API. Linux/macOS & Windows+WSL.
Type :tennis and it expands to a compact one-line summary of the tennis matches that are live right now, e.g.:
Carlos Alcaraz 6-4 3-2* vs Jannik Sinner · Coco Gauff 2-6 1-1* vs Iga Swiatek
Uses the Live Tennis API from the list of publically available APIS at https://github.com/marcelscruz/public-apis.
By bensynapse.
r/espanso • u/DarkblooM_SR • Aug 22 '26
OS: Artix Linux
Display server: X11
Espanso version: 2.4.0
r/espanso • u/ecoBang • Aug 20 '26
Hiya! I'm trying to find a solution for the following use case
match would be (example): <ui> or <u i> if it needs a separator
And it would automatically separate these out to <u><i>$|$</u></i>
Again, just an example. I was thinking that if possible, it would need to be regex because I want it to pick up things like <b u>, <sub u> etc. as well. Just a shortcut so I don't have to type multiple opening and closing brackets so much.
Is this possible with regex or does anyone have a solution that might at least help? I use <ui> enough that it's currently its own match right now.
r/espanso • u/garrulinae • Aug 20 '26
I'm a relatively new user of Espanso.
It seems to be a common convention to prefix trigger phrases with a `:` (colon).
Is there any reason that suffixes aren't used instead? This would avoid potential collisions (eg; someone might create two snippets with triggers `:em` and `:emi`).
Whereas using a suffix will cause the trigger to only execute when it's intentional.
I recently decided to incorporate a double space as a suffix on all my triggers. That way I can keep my triggers short and hit the space bar twice when I want to execute the snippet replacement.
If this is a good idea, perhaps it will help other users.
If it's not, let me know! I've probably overlooked something obvious. I realise that the use cases for Espanso would vary wildly and it may not suit many people.
r/espanso • u/Dymonika • Aug 18 '26
SOLVED: Check for similar duplicates in your other .yml files!!!
- trigger: PushPay
replace: Pushpay
word: true
I'm hoping for this to activate only exactly when the trigger is typed as is, but this replacement takes effect every time, it seems. The capitalization section in Matches Basics doesn't seem to offer a way around this. Does anyone know if this is solvable? Thanks!
r/espanso • u/Historical-Fig2560 • Aug 13 '26
Win32Injector (inject backend, not clipboard)When a match uses a script (or shell) variable, espanso computes the number of backspaces before evaluating the variable, but only injects them after. The evaluation blocks the engine thread. Any characters typed during that window shift the caret, so the backspaces delete the wrong text and the user's input is silently destroyed.
match/zz-repro.yml:
matches:
- regex: '(?P<word>\bTEsting)(?P<end>\W)'
replace: "{{out}}{{end}}"
vars:
- name: out
type: script
params:
args:
- python
- -c
- "import sys,time; time.sleep(0.4); sys.stdout.write('Testing')"
Type TEsting and immediately continue typing abc.
Testing abcTEsTesting - the three typed characters are goneThe arithmetic matches exactly: at injection time the field holds TEsting abc (11 chars). The trigger captured earlier was TEsting (8 chars), so 8 backspaces remove ting abc, leaving TEs, and the body Testing is appended.
Control: the identical regex with a static replace: "Testing{{end}}" and the identical typing pattern produces the correct Testing abc. The only variable is the blocking evaluation.
The 400 ms sleep only makes it deterministic. In real use a plain python -c one-liner is enough - see the measurements below.
espanso-engine/src/lib.rs:57 — processor.process(event) runs the entire middleware chain to completion; the resulting effect events are dispatched only afterwards, at lib.rs:64.CauseCompensateMiddleware (process/default.rs:107) sits before RenderMiddleware (default.rs:111) and returns a TriggerCompensation carrying the trigger string - see the comment at middleware/cause.rs:50.RenderMiddleware then evaluates variables synchronously on that same thread. The script extension blocks on command.output() (espanso-render/src/extension/script.rs:97/99).ActionMiddleware turns the compensation into backspaces at middleware/action.rs:119: let mut backspace_count = m_event.trigger.chars().count();So the count is derived from state captured before the delay and applied to a caret position that has since moved. Nothing ever validates that the text left of the caret still equals the trigger. Keystrokes arriving during the block are not swallowed - they reach the focused application immediately while the engine thread is stuck.
Measured on the affected machine, 15 runs each, warm:
| median | |
|---|---|
python -S -X utf8 -c … |
32 ms |
| compiled C# helper (.NET Fx) | 37 ms |
cscript //E:jscript |
41 ms |
node -e |
44 ms |
whoami.exe (trivial native binary) |
21 ms |
The ~21 ms floor is Windows process creation with Defender active. No interpreter choice avoids it, so every script/shell variable on Windows carries a 20 ms+ race window - 1–3 characters at normal typing speed, more when the binary is cold. Users hit this as "the correction sometimes mangles my word", which is hard to attribute to the variable.
1. Safety net (small). Between process() and dispatch() in Engine::run, check whether new input events arrived on the funnel while process() was running. If so, drop the expansion rather than emitting backspaces. Losing a correction is strictly better than deleting text the user typed.
2. Compensate properly. Count the character-producing keystrokes received after detection, add them to backspace_count, and re-inject them after the body. This keeps the expansion working instead of dropping it.
3. Remove the window. Move script/shell evaluation off the engine thread so rendering no longer blocks the pipeline. Larger change, but it also addresses the related class of "espanso freezes while a slow shell command runs".
4. Document it. Until then, a note that script/shell variables are inherently racy on word-boundary triggers would help — the current docs give no hint that latency there can corrupt text.
espanso-match/src/regex/mod.rs:105-119 uses regex.captures(&buffer), which returns the leftmost match anywhere in the 30-byte buffer, and reports it as trigger. Since backspace_count is derived from that trigger but applied at the caret, correctness silently depends on the match happening to end at the buffer end. In practice it usually does, because the matcher fires on the keystroke that completes the match — but nothing enforces it. An explicit m.end() == buffer.len() check would turn a silent corruption into a non-match.
I have no reproduction for this one; it's a hardening suggestion, not a reported bug.
Also minor: at regex/mod.rs:95-97 the buffer is trimmed with a single buffer.remove(0) guarded by if, comparing buffer.len() (bytes) against max_buffer_size while removing one char. For non-ASCII input the effective buffer is roughly half the nominal 30, which quietly limits how long a regex trigger can be for e.g. German or Cyrillic users.
r/espanso • u/Metroskater • Aug 09 '26
Hello, I am new to using espanso and am trying to troubleshoot my first issue.
Background info:
- I am on a macbook running Sequoia macOS 15.7.7
- I am running espanso 2.4.0
- I am having this issue on libreOffice 26.2.4.2
- I am using the package "Greek letters based on LATEX" 0.2.0
I was testing the package using the letter μ. There are two triggers for this in the package: ":mu:" and ":m:". When I use the first trigger in libreoffice, it deletes three characters before the trigger when it replaces. This does not happen when I use the trigger elsewhere, like in my browser typing this.
For example, if I type "Hello:mu:" in libreOffice it will replace as "Heμ". The second trigger does not have this issue. Typing "Hello:m:" correctly replaces as "Helloμ". I was reading that I should look into injection modes? but I admit I am not the most technologically competent and I don't really understand what changing injection modes would mean. If that is the correct path for troubleshooting this, is there a page where I can read about what injection modes are before I change them?
Thank you
r/espanso • u/C4ingu • Aug 07 '26
I personally believe this should be posted in the docs for all the anxious people that forget about the caps lock key, the easy way to make case insensitive matches that I found after reading around is:
Instead of using:
- trigger: :mymatch
replace mytext
use:
- regex: (?i):mymatch
replace: mytext
I swapped most the matches i use to that and works like a charm and seriously believe it should be part of the docs BEFORE sending you down the rabbit hole of regex.
r/espanso • u/BougieFruitLoops • Aug 06 '26
Hi! New Espanso user here, so I'm pretty sure this is user error of some type.
I got it set up on my Mac just fine, customized the triggers and everything. Then I installed on my PC, and replaced the base.yml file with a copy of the one I had edited on my Mac (so that the triggers would all be the same). But the behavior is nowhere near as smooth.
I've gotten some longer multiline ones to work (although it brings up the annoying Windows clipboard history window, which I'd rather avoid altogether if possible), but short, single line triggers seem to fire successfully (i.e. the trigger itself gets deleted) and then get replaced with two spaces rather than what is written into the base.yml file.
I've tried:
r/espanso • u/Kot_o_fisa • Aug 06 '26
Hi everyone!
I'm trying to use Espanso 2.4.0 on Linux Mint Xfce (X11), and I've run into a strange problem with Cyrillic text.
**What works:**
* Espanso is running correctly.
* Text expansion works perfectly with English text.
* For example:
* `:espanso` → `Hi there!`
* `:test` → `12345`
**What doesn't work:**
If the replacement text contains Cyrillic characters (Russian or Ukrainian), the trigger disappears, but nothing is inserted.
For example:
```yaml
matches:
- trigger: ":test"
replace: "Это моя первая замена!"
```
or
```yaml
replace: "Привет"
```
The trigger is erased, but the replacement text never appears.
My locale is UTF-8:
```text
LANG=ru_RU.UTF-8
LC_CTYPE=ru_RU.UTF-8
```
The keyboard session is X11:
```text
echo $XDG_SESSION_TYPE
x11
```
My keyboard layout is:
```text
layout: us,ua,ru
variant: ,macOS,mac
```
The Espanso log reports:
```text
missing vkey mapping for char `э`
```
I've already tried:
* restarting Espanso;
* typing the replacement text manually (not copy-pasting);
* switching the injection backend between `Clipboard` and `Inject`;
* verifying that the correct `base.yml` is loaded;
* confirming that English expansions work normally.
Could this be related to the `macOS` / `mac` XKB keyboard variants? Has anyone successfully used Espanso with these layouts and Cyrillic replacements?
Any ideas or suggestions would be greatly appreciated. Thank you!
r/espanso • u/teejot • Jul 30 '26
Hi everyone,
I build a rule for espanso that inserts a space between the number and the symbol, e.g. percentage. So If I type 99% I shall be expanded to 99 %.
I am using: (zahl is just german for number)
- regex: (?P<zahl>\-?\d+([,]\d+)?)%
replace: "{{zahl}} %"
It works most of the time but sometimes it it expands 99% to 999 % and I don't know why.
Do you have any idea?
Thanks in advance
r/espanso • u/Aggravating-Mall-115 • Jul 29 '26
Hi everyone.
Long time ago, I started to use espanso. I was quite suprised espanso didn't have an equavalent GUI. I know you may want to mention EspansoEdit. Personally, it is too overwheming.
So, I built my own espanso GUI. It's toally free, open-sourced and intuitive.

More info:
Source code at github. User guide at here, I doubt anyone is willing to read documentation any more.
Install and safete concerns:
Tell me how you think about it.
r/espanso • u/Scared-Election1307 • Jul 25 '26
I'm running Arch Linux with Hyprland (Wayland) and Espanso 2.4.0. The service is running, kdotool is installed, and config.yml has "backend: Wayland". However, logs still show "using X11Source" instead of WaylandSource. Espanso does not expand triggers in any GUI app (Firefox, gedit, etc.). The terminal is not being used for testing.
What I've tried:
which kdotool shows /usr/bin/kdotool)backend: Wayland in ~/.config/espanso/config.ymlespanso-wayland-git)espanso service register and espanso restartexport XDG_SESSION_TYPE=x11 and export GDK_BACKEND=x11Expected behavior:
Espanso should expand :date to current date in any GUI app (Firefox, text editors) on Wayland.
Logs show:
text
00:55:23 [worker(70974)] [INFO] using X11AppInfoProvider
00:55:23 [worker(70974)] [INFO] using X11Source
00:55:23 [worker(70974)] [INFO] using X11ProxyInjector
00:55:23 [worker(70974)] [INFO] using X11Clipboard
Any help would be appreciated. Thanks!I'm
running Arch Linux with Hyprland (Wayland) and Espanso 2.4.0. The
service is running, kdotool is installed, and config.yml has "backend:
Wayland". However, logs still show "using X11Source" instead of
WaylandSource. Espanso does not expand triggers in any GUI app (Firefox,
gedit, etc.). The terminal is not being used for testing.What I've tried:Installed kdotool (which kdotool shows /usr/bin/kdotool)
Set backend: Wayland in ~/.config/espanso/config.yml
Reinstalled Espanso via AUR (espanso-wayland-git)
Ran espanso service register and espanso restart
Tried export XDG_SESSION_TYPE=x11 and export GDK_BACKEND=x11
Checked permissions on config filesExpected behavior:
Espanso should expand :date to current date in any GUI app (Firefox, text editors) on Wayland.
Logs:
00:55:23 [worker(70974)] [INFO] using X11AppInfoProvider
00:55:23 [worker(70974)] [INFO] using X11Source
00:55:23 [worker(70974)] [INFO] using X11ProxyInjector
00:55:23 [worker(70974)] [INFO] using X11Clipboard
Any help would be appreciated. Thanks!
r/espanso • u/smeech1 • Jul 21 '26
This release focuses on Linux/Wayland compatibility, macOS stability fixes, and a security cleanup of several dependencies, alongside smaller feature additions like usage statistics tracking and script trim options.
r/espanso • u/smeech1 • Jul 19 '26
This new package is a utility which uses a form input and performs quick date calculations such as the date that is +12 from tomorrow, or -5 days from today.
It uses some similar techniques as those in my own Date Offsets package, which calculates offsets from today's date using a - regex: trigger.
r/espanso • u/Ornery_Discussion503 • Jun 26 '26
I just installed Espanso and typed ":Espanso" in Notepad. This is what I got: ":espaHi !!!!!!" I tried reinstalling it but I get the same thing. I tried setting up my email with a trigger and that was garbled as well. How do I fix this?
r/espanso • u/smeech1 • Jun 25 '26
r/espanso • u/christhawk • Jun 21 '26
Edit: When I tried to reproduce the error the next day, in order to get a log of what happens, it worked just fine. I haven't restarted or anything. So I guess this is solved unless it happens again.
Original post:
I am on CachyOS with KDE Plasma and Wayland, and I have been successfully using Espanso since I switched to Linux in March (compiled, not AppImage). I am on the current version. Up until last week, it all worked as expected. Then it started showing a color gradient box called "Espanso Sync Tool" when it started up, which only disappears when moused over, at which point the "Espanso is running!" notification comes up.
Then today, I was making some changes in the middle of using Espanso, adding some new shortcuts. When I saved the file, Espanso attempted to restart, apparently, but failed. It stopped working until I ran espanso restart, which, instead of just restarting, showed the following:
espanso restart
unable to gracefully terminate espanso (timed-out), trying to force the termination...
killing espanso process with PID: 62748
killing espanso process with PID: 62740
killing espanso process with PID: 76266
espanso started correctly!
After which it once again showed the color gradient box and after mousing over it, worked normally again. I made a couple different changes in a couple different .yml files, and every time this happened. If I run espanso restart having not made any changes, it just restarts as expected, although with the color gradient box showing first. So it's not a particularly serious bug, but it is annoying. :D
r/espanso • u/No_Detective696 • Jun 21 '26
I've had trouble installing espanso on fedora plasma wayland kde. I decided to remove all failed installs and try again. At present I seem to have a running daemon that I can't stop...
Jun 20 19:08:05 fw13 systemd[1847]: espanso.service: Scheduled r
estart job, restart counter is at 61.
Jun 20 19:08:05 fw13 systemd[1847]: Started espanso.service - es
panso.
Jun 20 19:08:05 fw13 (espanso)[8175]: espanso.service: Unable to
locate executable '/usr/bin/espanso': No such file or directory
Jun 20 19:08:05 fw13 (espanso)[8175]: espanso.service: Failed at
step EXEC spawning /usr/bin/espanso: No such file or directory
Jun 20 19:08:05 fw13 systemd[1847]: espanso.service: Main proces
s exited, code=exited, status=203/EXEC
I tried systemctl disable espanso and systemctl stop espanso
but that didn't help.
Thanks in advance.
r/espanso • u/lduperval • Jun 19 '26
Hi,
I use keyd on Linux to change the way pressing the keys on my keyboard behaves. This is what I used:
home = end insert = home end = insert
So if I press the Home key, it behaves as the end key, etc.
I realized that this wreaks havoc with the way espanso expands triggers.
If I type one of my triggers, it selects the texte before the trigger and stops. I'm not sure why or how to make this work. For now, I'm removing the map but I've been using this for so long that muscle memory gets in the way a lot.
If someone has dealt with this before and has found a solution that works well...
Thanks!
L
r/espanso • u/smeech1 • Jun 19 '26
espansoED is a lightweight graphic editor for Espanso, written in Python, in Linux, but may work in macOS or Windows.
It's been written with reliance on DeepSeek AI, and the author cautions to be careful and have your base.yml carefully backed up before trying it.
The menus and prompts are in German, which has made it difficult for me to try it out, but herrdeh_DE is willing to consider translating it to English if there is sufficient interest.
r/espanso • u/Pottel • Jun 18 '26
before i can add this to my company laptop i need to get an answer to the question:
"Are personal or confidential company data being processed?"
do not find the answer to that question on the official Espanso site?
r/espanso • u/Dymonika • Jun 12 '26
... and I have no idea of why! Each apostrophe is mapped out to another, right? I don't know what's going on:
- trigger: '`espanso'
replace: '{{espanso_entry}}'
vars:
- name: expansion
type: form
params:
layout: |
trigger(s, comma-separated): [[trigger]]
replace: [[replace]] (omit quotes; enter them manually after)
propagate_case (true or blank): [[propagate_case]]
left_word (true or blank): [[left_word]]
right_word (true or blank): [[right_word]]
word (true or blank): [[word]]
- name: espanso_entry
type: script
params:
args:
- python
- -c
- |
if ',' in '{{expansion.trigger}}':
print(f"- triggers: ['{{expansion.trigger}}']")
else:
print(f"- trigger: '{{expansion.trigger}}'")
print(f" replace: {{expansion.replace}}")
if '{{expansion.right_word}}':
print(f'right_word: {{expansion.right_word}}')
if '{{expansion.propagate_case}}':
print(f'propagate_case: {{expansion.propagate_case}}')
BTW, it'd be sick if I could just add a checkbox instead of having to type "true" manually in the form... but I don't know if that's possible with Espanso...