TinyTask for macOS — a tiny, native macro recorder.
TinyTask is a beloved 33 KB Windows .exe that records your mouse and keyboard and replays them with one click. It never made it to the Mac. eamsoTask is that idea, rebuilt natively for macOS: record any sequence of clicks, drags, scrolls, and keystrokes, then replay it — once, N times, or forever — at up to 4× speed.
- One-click record & play — a compact, always-on-top window with two big buttons, just like the original.
- Global hotkeys, fully remappable —
⌃⌥Rto record and⌃⌥Pto play by default; click a field in Settings and press any combination to rebind. - Save & open recordings — macros are saved as
.recfiles (like TinyTask's), so you can keep a library of them and share them. The format is plain JSON, friendly to hand-editing and version control. - Repeat & speed control — play 1–100 times or loop forever, at 0.25×–4× speed.
- Faithful playback — pointer paths, drags, double-clicks, scrolling, modifier keys, and precise timing are all reproduced.
- Native and tiny — a single ~1 MB Swift app. No Electron, no Python runtime, no dependencies.
Grab EamsoTask.app.zip from the latest release, unzip, and drag EamsoTask.app into /Applications.
Because release builds are ad-hoc signed (not notarized), macOS will quarantine the download. Clear it once with:
xattr -dr com.apple.quarantine /Applications/EamsoTask.appor right-click the app → Open → Open.
You only need the Xcode Command Line Tools (xcode-select --install) — full Xcode is not required.
git clone https://github.com/PoomEam/eamsoTask.git
cd eamsoTask
make install # builds dist/EamsoTask.app and copies it to /ApplicationsOther targets: make build (debug), make test (unit tests), make app (build the bundle without installing).
Like every macro tool on macOS, eamsoTask needs two permissions in System Settings → Privacy & Security. On first launch a setup guide walks you through them with live checkmarks:
| Permission | Why |
|---|---|
| Accessibility | to replay events (synthetic clicks and keystrokes) |
| Input Monitoring | to observe the keyboard while recording |
eamsoTask asks macOS for both up front, so it should already appear in each list — just flip the switches. (If it's missing from a list, click the ﹢ button below the list and add eamsoTask from Applications.) macOS only applies these grants at launch, so finish with Restart Now in the guide — or the Restart eamsoTask? popup / the banner's Restart button — and it comes back ready to record.
Note for source builds: macOS ties these permissions to the app's code signature. If you rebuild the app, you may need to remove and re-add it in both permission lists.
- Press Record (or
⌃⌥R) — do the thing you want automated — press it again to stop. - Press Play (or
⌃⌥P) to replay. Pick a repeat count (or ∞) and a speed from the toolbar first if you like. - Save (
⌘S) the macro as a.recfile; Open (⌘O) it any time later — or double-click the file in Finder.
While a macro is looping, the play hotkey stops it — handy when your cursor is being puppeteered.
| Action | Default | |
|---|---|---|
| Start / stop recording | ⌃⌥R |
remappable in Settings |
| Play / stop playback | ⌃⌥P |
remappable in Settings |
| Open / Save / Save As | ⌘O / ⌘S / ⇧⌘S |
in-app |
The record/play hotkeys are registered system-wide and are automatically excluded from your recordings (including the modifier-key releases right after you press them).
Recordings are JSON with a small stable schema:
{
"formatVersion": 1,
"createdAt": "2026-07-27T10:00:00Z",
"generator": "eamsoTask",
"events": [
{ "t": 0.0, "kind": "mouseMoved", "x": 512, "y": 384 },
{ "t": 0.31, "kind": "leftMouseDown", "x": 512, "y": 384, "clickState": 1 },
{ "t": 0.38, "kind": "leftMouseUp", "x": 512, "y": 384, "clickState": 1 },
{ "t": 1.02, "kind": "keyDown", "keyCode": 0, "flags": 0 }
]
}t is seconds from the start of the recording; coordinates are global screen points (top-left origin). Note the format is eamsoTask's own — it does not read the Windows TinyTask binary .rec files.
- Recording — a listen-only
CGEventTapobserves system-wide input. Mouse moves are throttled to 240 Hz to keep files compact; the record/play hotkeys are filtered out. - Playback — events are re-synthesized with
CGEventand posted to the HID event tap from a high-priority background thread that honors original timing (scaled by the speed factor). - Hotkeys — registered with the Carbon
RegisterEventHotKeyAPI, so they work even while the app is busy recording or playing.
Sources/
├── EamsoCore/ pure logic: event model, .rec serialization, hotkeys, filtering, timing
└── EamsoTask/ the app: recorder (CGEventTap), player (CGEvent), Carbon hotkeys, SwiftUI
Tests/
└── EamsoCoreTests/ unit tests for everything in EamsoCore
- Playback is coordinate-based (like TinyTask): if windows move or the screen resolution changes between record and replay, clicks land in the wrong place.
- Recordings capture raw key codes, so they replay on the keyboard layout they were recorded with.
- Some system-owned UI (secure input fields, certain permission dialogs) ignores synthetic events by design.
Issues and PRs are welcome. Please run make test before submitting, and keep the EamsoCore target free of AppKit dependencies so it stays unit-testable.
MIT © Poom Eamsobhana
eamsoTask is an independent project and is not affiliated with TinyTask.


