Keystroke Tokens
Send real key presses and timed pauses inside a TXT expansion — without a separate KEY step.

Tokens inside {curly braces} in a TXT step are not typed as text — they send the corresponding keystroke or perform a special action. Use them to tab through form fields, press Enter to confirm, or insert dynamic content mid-expansion.
Navigation and editing keys
| Token | Key sent |
|---|---|
{TAB} |
Tab |
{ENTER} |
Enter / Return |
{ESC} |
Escape |
{BACKSPACE} |
Backspace |
{DELETE} |
Delete |
{INSERT} |
Insert |
{HOME} |
Home |
{END} |
End |
{PGUP} |
Page Up |
{PGDN} |
Page Down |
{UP} |
Arrow Up |
{DOWN} |
Arrow Down |
{LEFT} |
Arrow Left |
{RIGHT} |
Arrow Right |
Function keys
{F1} through {F12} — sends the corresponding function key.
Timing tokens
| Token | Effect |
|---|---|
{DELAY:N} |
Pause N milliseconds before continuing |
{DELAY:N,"text"} |
Type the quoted text at N ms per character (slow-type) |
{WAIT:N} |
Alias for {DELAY:N} — absolute pause only (no inline text variant) |
{RDELAY:LO-HI} |
Pause a random number of milliseconds between LO and HI |
{RDELAY:LO-HI,"text"} |
Type the quoted text at a random per-character speed between LO and HI ms |
{RWAIT:LO-HI} |
Alias for {RDELAY:LO-HI} — pairs naturally with the WAIT/DELAY naming |
{SPEED:N} |
Set per-character delay to N ms for all plain text that follows in this step |
{SETTLE:N} |
Set post-action settle delay to N ms for all tokens that follow in this step; {SETTLE:0} disables |
Random delays (RDELAY, RWAIT) mimic human-like rhythm — useful to bypass naive bot detection in fragile web forms, or to feel less robotic when the expansion is watched.
Tip: you can abort a running trigger with ESC at any time — the in-flight workflow interrupts at the next ~50 ms check.
Settle delay — what it is and why you (rarely) want to change it
After every keystroke-producing token (paste, typed text, or a named key like {TAB}), Blue Synergy waits a short moment before continuing to the next token. This is the settle delay: it gives the target application time to actually process what was just sent. Without it, a {TAB} can race ahead of a preceding paste and land your text in the next field by mistake, or a {DELAY:1000} can start counting before the {TAB} has actually moved focus.
Defaults (no configuration needed):
| After | Settle |
|---|---|
| Text paste (Ctrl+V) | 80 ms |
| Typed text (char-by-char) | 20 ms |
Named key ({TAB}, {ENTER}, {F2}, …) |
20 ms |
{DELAY:N} / {RDELAY:LO-HI} |
— (the delay is the wait) |
These defaults are tuned for typical desktop apps and most users never need to change them. Use {SETTLE:N} only when the target demands it:
{SETTLE:0}— target is fast and you want maximum throughput (e.g. Notepad, plain text editors). Accepts the old race behaviour in exchange for speed.{SETTLE:200}or higher — target has a laggy paste-handler (some React forms, cloud IDE editors, remote desktop sessions). Use when values keep landing in wrong fields.
{SETTLE:N} applies from its position in the step onwards; set it once at the top of the step, or change it mid-step if only part of the workflow needs a different value.
Try it live
The Trigger Playground is a self-contained test page with five inputs, gated autocomplete, keystroke blocking, and a configurable laggy-form simulator — the exact pattern that makes settle delays matter. Open it in a browser, focus the first field, and fire your trigger; you will see in the event log whether values drift into the wrong field or land cleanly. Useful suggested triggers are listed on the page itself.
Dynamic content tokens
Clipboard
| Token | Inserts |
|---|---|
{clip:last} |
Most recent clipboard item |
{clip:-1} |
Most recent clipboard item (same as last) |
{clip:-2} |
Second most recent clipboard item |
{clip:-N} |
Nth most recent clipboard item |
{clip:N} |
Clipboard item with absolute nr = N |
Date and time
| Token | Inserts |
|---|---|
{date} |
Current date (locale default, 2026-04-20) |
{time} |
Current time (locale default, 17:30:45) |
{datetime} |
Full date + time (2026-04-20 17:30:45) |
{date:FMT} |
Current date with custom format — see below |
{time:FMT} |
Current time with custom format |
{datetime:FMT} |
Full timestamp with custom format |
Format tokens
Blue Synergy accepts both friendly tokens and strftime patterns in a single format string:
| Friendly | strftime | Meaning |
|---|---|---|
YYYY |
%Y |
4-digit year |
YY |
%y |
2-digit year |
MM |
%m |
Month (01–12) |
DD |
%d |
Day of month (01–31) |
HH |
%H |
Hour (00–23) |
mm |
%M |
Minute (00–59) |
ss |
%S |
Second (00–59) |
Examples:
{date:YYYY-MM-DD}→2026-04-20{time:HH:mm}→17:30{datetime:%A %d %B %Y — HH:mm}→Monday 20 April 2026 — 17:30
Time / date rounding
Round a timestamp to a coarser granularity (e.g. snap to the nearest 15 minutes):
| Token | Behaviour |
|---|---|
{time:round:Nm} |
Round time to the nearest N minutes |
{time:round:Nm:up} |
Always round up to the next N-minute tick |
{time:round:Nm:down} |
Always round down |
{time:round:Nh} |
Round to the nearest N hours |
{date:round:…} |
Same grammar, applied to the date component |
Useful for timesheets, meeting notes, or any workflow where you type the “current time” but want it quantised to 5 / 10 / 15 / 30 minutes.
Example — Excel timesheet row ending with a rounded start time:
{clip:-3}{TAB}{clip:-2}{TAB}{clip:-1}{TAB}{time:round:15m:down}{TAB}
Time offsets — “in N hours / minutes / days”
Offset tokens do natural-language time arithmetic, not grid snapping. They answer questions like “what’s the time in 2 hours?” or “what’s the date next week?”.
The difference vs. :round::
| Token | Semantic | At 19:02 |
|---|---|---|
{time:round:2h:down} |
Grid snap to previous 2h mark | 18:00 |
{time:in:-2h} |
Subtract 2h | 17:00 |
{time:was:2h} |
Same as above, reads naturally | 17:00 |
Offset grammar:
{time|date|datetime:in|was:[+]<N><unit>[:<fmt>]}
- unit —
m(minutes),h(hours),d(days),w(weeks) - leading
-— flip direction (future/past) - leading
+— preserve minutes (only relevant onh— defaults strip minutes to:00) - optional
:<fmt>— same friendly/strftime syntax as{time:FMT}(e.g.HHmm,%H%M) :was:— reads the number as “ago” (was:2h= 2 hours in the past)
Examples at 19:02 on 2026-04-23:
| Token | Output | Note |
|---|---|---|
{time:in:2h} |
21:00 |
Strip minutes to :00 |
{time:in:+2h} |
21:02 |
Preserve minutes |
{time:in:30m} |
19:32 |
Minute offset |
{time:in:90m} |
20:32 |
Overflows into the hour |
{time:in:-2h} |
17:00 |
Negative = past |
{time:was:2h} |
17:00 |
Natural “2 hours ago” |
{time:was:+2h} |
17:02 |
Past, minutes preserved |
{date:in:2d} |
2026-04-25 |
Day offset |
{date:in:1w} |
2026-04-30 |
Week offset |
{date:was:1d} |
2026-04-22 |
Yesterday |
{datetime:in:2d} |
2026-04-25 19:02 |
Keeps time-of-day |
{datetime:in:+2h} |
2026-04-23 21:02 |
Hour + minutes preserved |
Custom output format on offsets and rounds
Append :<fmt> to any :in: / :was: / :round: token for a custom format using the same rules as {time:FMT}:
| Token | Output |
|---|---|
{time:in:2h:HHmm} |
2100 |
{time:in:+2h:HH-mm} |
21-02 |
{time:in:2h:%H%M} |
2100 |
{time:round:15m:up:HHmm} |
1430 |
{time:round:15m:HHmm} |
1430 (nearest + fmt) |
{date:in:2d:YYYYMMDD} |
20260425 |
{date:was:1w:DD.MM.YY} |
16.04.26 |
Try it — pastable test set
Import this YAML via Ctrl+V in the Triggers workspace to get a ready-made playground for every time-related token:
- trigger: ";t-now"
label: "Now: time, date, datetime"
replace: "now → time={time} date={date} datetime={datetime}"
- trigger: ";t-fmt"
label: "Custom format (friendly tokens and strftime)"
replace: "custom → {date:DD.MM.YYYY} {time:HH:mm} iso={datetime:%Y-%m-%dT%H:%M:%S}"
- trigger: ";t-round"
label: "Round tokens (grid snap)"
replace: "round → nearest15={time:round:15m} up15={time:round:15m:up} down1h={time:round:1h:down} up2h={time:round:2h:up}"
- trigger: ";t-round-fmt"
label: "Round with custom format"
replace: "round+fmt → up15HHmm={time:round:15m:up:HHmm} nearest15HHmm={time:round:15m:HHmm}"
- trigger: ";t-in-h"
label: "Offset hours (default strips minutes, + preserves)"
replace: "in hours → default2h={time:in:2h} preserve2h={time:in:+2h} minus2h={time:in:-2h}"
- trigger: ";t-in-m"
label: "Offset minutes (naturally preserved)"
replace: "in minutes → +30m={time:in:30m} +90m={time:in:90m} -45m={time:in:-45m}"
- trigger: ";t-in-d"
label: "Offset days and weeks"
replace: "in days → +2d={date:in:2d} +1w={date:in:1w} -1d={date:in:-1d}"
- trigger: ";t-in-dt"
label: "Datetime offsets (day rollover, minute preservation)"
replace: "dt → +2d={datetime:in:2d} +2h-default={datetime:in:2h} +2h-preserve={datetime:in:+2h}"
- trigger: ";t-was"
label: "Past-direction alias (reads naturally)"
replace: "was → 2h-ago={time:was:2h} preserve={time:was:+2h} yesterday={date:was:1d} lastweek={date:was:1w}"
- trigger: ";t-in-fmt"
label: "Offset with custom format (no colons in output)"
replace: "in+fmt → 2hHHmm={time:in:2h:HHmm} 2dYYYYMMDD={date:in:2d:YYYYMMDD} wasHHmm={time:was:2h:HHmm}"
- trigger: ";t-clips"
label: "Clipboard refs (the last three copied values)"
replace: "clips → newest={clip:-1} 2nd-newest={clip:-2} 3rd-newest={clip:-3}"
- trigger: ";t-cursor"
label: "Cursor placement (caret lands between the brackets)"
replace: "Type here → [{cursor}] ← cursor stops here"
- trigger: ";t-keys"
label: "Keys (Tab / Enter / Escape)"
replace: "Field1{TAB}Field2{TAB}{ENTER}"
- trigger: ";t-rapport"
label: "Timesheet row — three clips + rounded start time"
replace: "{clip:-3}{TAB}{clip:-2}{TAB}{clip:-1}{TAB}{time:round:15m:down}{TAB}"
- trigger: ";t-meeting"
label: "Meeting invite — back in 2 hours on the hour"
replace: "Meeting today at {time:in:2h} — date: {date}"
How to insert tokens
Type them directly in the TXT step editor, or use the token toolbar above the editor — buttons for common tokens like {TAB}, {ENTER}, {DELAY:N}, {date}, {clip:-1}, and more.
Example: fill a form
First name{TAB}Last name{TAB}email@example.com{TAB}{ENTER}
This types the three values, tabbing between fields, then presses Enter to submit.
Example: slow-type a password hint
Hint: {DELAY:80,"correct horse battery staple"}
Types the hint text at 80 ms per character — useful for apps that don’t handle pasted text well.
Tips & gotchas
- Token names are case-insensitive —
{tab},{TAB}, and{Tab}all work. - Unknown token names (e.g.
{typo}) are passed through as literal text. {clip:-N}fetches from the in-memory clip cache — if you deleted the clip, the token inserts an empty string.- Tokens work in both Paste and Type typing modes.
See also
- Typing Mode — Paste vs. char-by-char insertion,
{DELAY}and{SPEED}details - Triggers Overview — step types and how the engine works