Automation Desk

DeskAutomate

Drop a PDF in Inbox and it gets filed. Dry run until you say otherwise.

Free right now — no account, no card

Get DeskAutomate free Windows & Mac · one file, nothing to install

Preview

1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.

Interface design DeskAutomate, 1 of 1
Screenshot DeskAutomate running on Windows today

Free while we’re in preview

Get DeskAutomate

Drop a PDF in Inbox and it gets filed. Dry run until you say otherwise.

The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.

One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.

Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.

  • One file — no installer
  • Runs on your machine, offline
  • Source code published below

Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, DeskAutomate is included in every plan along with the rest of the range.

Rules fire when the filesystem changes

Each rule names a directory, a glob tested against the base filename, and an action: move, copy or run. The other Automation Desk tools do something when you tell them to. This one runs in the foreground and watches.

Polling, and what that costs you

There’s no inotify, no FSEvents, no ReadDirectoryChangesW. Every interval (500ms by default) it snapshots each watched directory as (path, size, mtime) and diffs against last time. So detection lags by up to one interval, a file created and deleted between two polls is never seen, and a change that alters neither size nor mtime is invisible. Native events are on the roadmap. This is worth knowing before you point it at a tree with 200,000 files.

Half-written files

A large download is visible long before it’s complete. Set debounce_ms and a file must hold the same size and mtime for that long before its rule fires, with the timer restarting on every change it sees.

Running it twice does nothing

State is keyed by rule name, path, size and mtime, and written to disk, so idempotence survives across separate process runs. A rule that fails isn’t marked handled and gets retried.

No deletion action exists.

Reading on the job itself

Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams

A working CLI prototype of the file-watch trigger engine: poll watched folders, and when a file appears or changes, fire a matching rule (move, copy, or run a command) with debounce so a still-being-written file waits until it settles. Handled state is persisted, so repeated runs are genuinely idempotent — verified across separate invocations. Watching is poll-based because native filesystem events aren't reachable from a stdlib-only binary.

Naming status

Working name only — brand verdict **CAUTION** (Medium). Collision: DeskAutomate. Do not invest in brand until owner/product status is resolved.

What it draws on

Existing paid software whose best ideas shaped this program: PhraseExpress, Macro Express Pro, Jitbit Macro Recorder, ClipboardFusion Pro.

Command line

There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.

deskautomate - file-watch triggered automation (Automation Desk line)

Watches directories by POLLING and fires rules when a file appears or changes.
Actions are a DRY RUN unless you pass --apply.

USAGE
  deskautomate <command> [flags]

COMMANDS
  watch    poll the watched directories and fire matching rules
  rules    validate and list the rules in a rules file
  help     show this help

WATCH FLAGS
  --rules <file>     rules JSON file (required; may also be given positionally)
  --interval <dur>   poll interval, e.g. 500ms, 2s        (default 500ms)
  --once             do a single poll pass and exit
  --apply            actually perform the actions         (default: dry run)
  --log <file>       JSONL log, one line per fired rule   (default deskautomate.jsonl)
  --state <file>     handled-file state                   (default <log>.state.json)

RULES FLAGS
  --rules <file>     rules JSON file (may also be given positionally)

RULES FILE
  {"rules": [
    {"name": "file-pdfs", "watch_dir": "/home/me/Inbox", "match": "*.pdf",
     "action": "move", "dest": "/home/me/Documents/PDF", "debounce_ms": 750},
    {"name": "index-csv", "watch_dir": "/home/me/Inbox", "match": "*.csv",
     "action": "run", "command": "/usr/local/bin/index.sh"}
  ]}

  action move|copy  needs "dest" (a directory; never overwrites, never deletes)
  action run        needs "command"; the matched file path is appended as the
                    final argument, and is also exported as DESKAUTOMATE_FILE

EXAMPLES
  deskautomate rules --rules rules.json
  deskautomate watch --rules rules.json --once
  deskautomate watch --rules rules.json --once --apply --log run.jsonl
...

Recorded from the shipped binary, not written by hand.

Source

Every file the program is built from:

console.go · console_test.go · guided.go · main.go

SHA-256 checksums · build instructions & scope notes · full build plan