MacroNest is a free, open-source Windows desktop macro and automation tool.
Combine keyboard, mouse, OCR, image search, color detect, geometry drawing, pin part of a window, crosshair overlays, commands, sound playback, HUD labels, window control, and more in the same macro flow, with variables to build more flexible automation.
The modules below are built to work with the macro system, so you can combine them in the same macro flow.
| Module | What it does | How macros use it |
|---|---|---|
| Macro Engine | Run key presses, mouse actions, loops, waits, conditional branches, and shareable presets | Build logic: click buttons, enter input fields, loop tasks, branch flow with variables, and export/import compact preset codes via clipboard |
| Computer Vision | Find images on screen, watch colors, and count matching pixels | Scan screen: locate game icons, wait for color changes, or trigger actions when an enemy bar fills up |
| OCR | Extract text/numbers from screen regions and check if specific text is found | Save scan results to variables (e.g. read coordinates/scores) and branch macro logic based on text matches |
| Window Control | Move, resize, layout (arrange in grid), pin, and zoom windows | Setup workspace: tile windows side-by-side, crop active regions, or center windows for precise clicking |
| Audio Sense | Monitor system audio, microphone levels, and audio frequency (pitch) | Handle sound cues: trigger automated responses when a voice call starts or game sound plays |
| Sound Effects | Play sound alerts, text-to-speech, and custom audio clips | Audible alerts: play warning sound on error, or read status messages aloud during execution |
| Crosshair | Render a customizable crosshair overlay on the screen | Visual aid: overlay a targeting crosshair for manual games, toggled on/off via macro steps |
| Geometry Overlay | Draw shapes (Points, Lines, Circles, Rectangles, Ellipses, Arrows, Polylines, Polygons, Arcs, Labels, and SVGs) on screen | Draw dynamic visual indicators, track zones, or display text labels on screen using mathematical expressions bound to variables |
| HUD Labels | Display customizable floating text labels and values on screen | Live dashboard: show variable values, current step status, or custom status labels overlaying the screen |
| Timer | Create stopwatches, countdowns, and cooldown overlays on screen | Track time: read stopwatch/countdown values directly into macro variables, trigger actions after elapsed time, or overlay skill cooldown indicators on screen |
| Script Command | Execute CMD and PowerShell commands, capturing their output to variables | System integration: execute local scripts, run command-line tools, or query network endpoints inside a macro |
| Hardware Input | Send input via Interception driver, Arduino boards, or recorded mouse paths | Emulate input: send low-level mouse and keyboard signals to ensure compatibility with high-security applications or games |
Quick Actions are small utility tools in the title bar. They are useful for fast manual access, but they are separate from the macro feature list above.
| Action | What it does |
|---|---|
| Taskbar | Hide or restore the Windows taskbar |
| Windows Key | Lock or unlock the Windows key |
| Window Pin | Keep a selected window always on top |
| Focus Highlight | Outline the active window with a configurable border and decoration |
| Focus Mode | Dim everything outside the focused or selected window |
| Window Opacity | Change the selected window's native opacity directly from 0% to 100% |
| Protractor | Show a draggable protractor overlay for angle checking |
| Ruler | Measure the distance between two screen points and optionally copy the result |
| Get Coordinates | Pick a screen point and optionally copy X and Y |
| Get Color | Sample a screen color and optionally copy the hex value |
| Key Display | Show a live key overlay with normal and mascot display modes |
| Draw | Toggle the screen drawing overlay and configure its hotkey |
| Screen Recorder | Record the full screen, focused window, selected window, or a selected region at 30, 60, or 144 FPS with WASAPI system audio. Features an integrated Video Library with 60 FPS playback, video trimming, and fast video compression for easy sharing |
| Clear Overlays | Clear active geometry, HUD, and pin overlays from the screen |
| Key Sound | Play keyboard sound effects with selectable switch style and volume |
Expand expression syntax and examples
| Syntax | Meaning | Example | Result |
|---|---|---|---|
a + b |
Add | 2 + 3 |
5 |
a - b |
Subtract | 10 - 4 |
6 |
a * b |
Multiply | 3 * 4 |
12 |
a / b |
Divide | 5 / 2 |
2.5 |
a ^ b |
Power | 5^2 |
25 |
a == b |
Equal comparison | 5 == 5 |
1 |
a != b |
Not-equal comparison | 5 != 5 |
0 |
a > b / a >= b |
Greater-than comparison | 8 >= 3 |
1 |
a < b / a <= b |
Less-than comparison | 2 < 1 |
0 |
| Syntax | Meaning | Example | Result |
|---|---|---|---|
math.pi |
Pi constant | degrees(math.pi) |
180 |
math.e |
Euler's number | round(math.e, 3) |
2.718 |
| Function | Meaning | Example | Result |
|---|---|---|---|
random(min, max) |
Random integer in range | random(10, 20) |
10..20 |
choice(a, b, ...) |
Pick one value at random (supports numbers, text, or a mix) | 1. choice(10, 20, 30) (numbers)2. choice(apple, banana, cherry) (text)3. choice(Level: 5, 50, critical) (mixed) |
1. 10 or 20 or 302. apple or banana or cherry3. Level: 5 or 50 or critical |
clamp(x, min, max) |
Keep x inside a range |
clamp(120, 0, 100) |
100 |
between(x, a, b) |
Check whether x is inside a range (inclusive) |
between(7, 1, 10) |
1 |
min(a, b) |
Smaller value | min(20, 50) |
20 |
max(a, b) |
Larger value | max(20, 50) |
50 |
abs(a) |
Absolute value | abs(-50) |
50 |
div(a, b) |
Integer division using truncation | div(5, 2) |
2 |
mod(a, b) |
Remainder | mod(5, 2) |
1 |
round(a, digits) |
Round to digits | round(863.6897, 2) |
863.69 |
ceil(a) |
Round up | ceil(math.pi) |
4 |
floor(a) |
Round down | floor(math.pi) |
3 |
sqrt(a) |
Square root | sqrt(9) |
3 |
pow(a, b) |
Power function | pow(2, 3) |
8 |
factorial(n) |
Factorial | factorial(5) |
120 |
gcd(a, b, ...) |
Greatest common divisor | gcd(24, 36, 48) |
12 |
lcm(a, b, ...) |
Least common multiple | lcm(4, 6, 8) |
24 |
isqrt(n) |
Integer square root | isqrt(17) |
4 |
comb(n, k) |
Combination | comb(5, 2) |
10 |
perm(n, k) |
Permutation | perm(5, 2) |
20 |
| Function | Meaning | Example | Result |
|---|---|---|---|
sin(a) |
Sine | sin(radians(30)) * 1000 |
500 |
cos(a) |
Cosine | cos(radians(60)) * 1000 |
500 |
tan(a) |
Tangent | tan(45) |
depends on input unit |
asin(a) |
Arc sine | asin(0.5) |
angle in radians |
acos(a) |
Arc cosine | acos(0.5) |
angle in radians |
atan(a) |
Arc tangent | degrees(atan(1)) |
45 |
atan2(y, x) |
2-argument arc tangent | degrees(atan2(1, 1)) |
45 |
sinh(a) |
Hyperbolic sine | sinh(1) |
numeric result |
cosh(a) |
Hyperbolic cosine | cosh(1) |
numeric result |
tanh(a) |
Hyperbolic tangent | tanh(1) |
numeric result |
degrees(rad) |
Radians to degrees | degrees(math.pi) |
180 |
radians(deg) |
Degrees to radians | radians(180) |
about 3.14159 |
| Function | Meaning | Example | Result |
|---|---|---|---|
ln(a) |
Natural log | ln(math.e) |
1 |
log(a) |
Natural log | log(math.e) |
1 |
log10(a) |
Base-10 log | log10(1000) |
3 |
exp(a) |
e^a |
exp(1) |
about 2.71828 |
| Function | Meaning | Example | Result |
|---|---|---|---|
contains(a, b) |
Check whether text a contains text b (supports numbers, text, or a mix) |
1. contains(hello, world) (text)2. contains(Gold: 5000, 5000) (mixed)3. contains(12345, 99) (numbers) |
1. 0 (false)2. 1 (true)3. 0 (false) |
concat(a, b, ...) |
Join multiple values into one text result | concat(Player, "-", 01) |
Player-01 |
substr(text, start, len) |
Get part of a string (supports numbers, text, or a mix) | 1. substr(banana, 2, 3) (text)2. substr(Rank #1: Player, 9, 6) (mixed)3. substr(123456, 1, 4) (numbers) |
1. nan2. Player3. 2345 |
charat(text, index) |
Get one character at a zero-based position; returns empty text when out of range | charat("hello", 1) |
e |
len(text) |
Count characters (supports numbers, text, or a mix) | 1. len(apple) (text)2. len(Score: 9999) (mixed)3. len(453454) (numbers) |
1. 52. 113. 6 |
lower(text) |
Convert text to lowercase | lower(HeLLo) |
hello |
upper(text) |
Convert text to uppercase | upper(HeLLo) |
HELLO |
trim(text) |
Remove leading and trailing spaces | trim(" hello ") |
hello |
myVar.toNumber |
Extract digits from a text variable and convert them to a number (ignores non-digits) | If variable A is "Gold: 500" (text):A.toNumber |
500 (numeric) |
myVar.toString |
Convert a variable to text by filtering out all digits (keeps only non-digits) | If variable A is "Wave #10" (text):A.toString |
"Wave #" (text) |
Text comparisons preserve quoted whitespace and symbols. For example, charat(a, 0) == " " returns 1 when the first character is a space.
Variable names support computed {} parts. Setting item[{i}] while i = 3 writes item[3]; item[{len(text)}] works the same way. This can be used with a loop to create item[1], item[2], and so on.
| Variable | Meaning | Example / Notes |
|---|---|---|
screen.width |
Width of the primary screen in pixels | screen.width |
screen.height |
Height of the primary screen in pixels | screen.height |
mouse.x |
Current X coordinate of the mouse | mouse.x |
mouse.y |
Current Y coordinate of the mouse | mouse.y |
mouse.sensitivity |
Current system mouse sensitivity speed | mouse.sensitivity |
volume.level |
Current system volume level (0 to 100) | volume.level |
window.x / window.left |
X coordinate of target window's left edge | window.x |
window.y / window.top |
Y coordinate of target window's top edge | window.y |
window.right |
X coordinate of target window's right edge | window.right |
window.bottom |
Y coordinate of target window's bottom edge | window.bottom |
window.width |
Width of the target window | window.width |
window.height |
Height of the target window | window.height |
window.centerX |
X coordinate of the target window's center | window.centerX |
window.centerY |
Y coordinate of the target window's center | window.centerY |
| Variable / Property | Meaning | Example / Notes |
|---|---|---|
system.year / month / day |
Current calendar year, month, or day | system.year |
system.hour / minute / second |
Current system time components | system.hour |
system.millisecond |
Current system millisecond | system.millisecond |
system.date |
Current system date | e.g. 2026-07-09 |
system.time |
Current system time | e.g. 04:24:00 |
window.title |
Title text of the target window | window.title |
clipboard.text |
Current text content in the clipboard | clipboard.text |
- Expression fields evaluate variables and functions directly.
- Text fields keep plain text as-is; use
{...}to inject variables or math into text. - Comparison operators return
1for true and0for false. - Some macro fields store final values as integers, so decimal results may be rounded there.
- Any math evaluation errors or division by zero (e.g.
5/0) will return0.
| Requirement | Minimum |
|---|---|
| OS | Windows 10 / 11 (64-bit) |
| Runtime | No install needed, portable .exe |
| Privileges | Administrator access |
- Download
MacroNest.exefrom the latest release. - Run the file.
These can be downloaded from the app settings:
- OpenCV DLL for image search
- Interception driver for low-level keyboard and mouse input
- Arduino firmware for hardware input emulation
- OCR data files for text recognition (OCR)
Released under the MIT License. See LICENSE.