marketplace/productivity

Render Ping

v0.1.0

@rebindfree

Watches your render's progress bar and pings your phone through ntfy.sh when it finishes.

Gallery

Render Ping preview

Readme

Point at the end of the render progress bar and press F4. Rebind watches those pixels and sends a notification through ntfy.sh to your phone the moment they turn the done color. It works with DaVinci Resolve, Blender, or any app with a progress bar.

Needs Rebind 3.8.0 or newer on Windows or macOS. It requests network access to ntfy.sh only. On macOS, Rebind needs Screen Recording permission to see the screen.

Set up

  1. Install the ntfy app on your phone and subscribe to a topic name of your own. Anyone who knows the name can read the messages, so pick something hard to guess.
  2. Put the same name in ntfy.sh topic.
  3. Set Color when done to the color the bar shows when it is full.

Use

Point at the last few pixels of the bar and press F4. Press F4 again to stop watching.

Limits

  • It checks every 2 seconds, within a 10 percent color tolerance, in a 7 by 7 pixel square around where the pointer was.
  • The message goes to ntfy.sh's public server.
  • If the screen cannot be read, watching stops and a notice says why.
  • Notices appear in Rebind. To see them on the desktop, turn on Desktop notifications in Rebind's settings.
  • Live use remains unverified on Windows and macOS.

Stop

Stop the package from the editor toolbar, or press Left Ctrl + Left Alt + K to stop all scripts.

Reviews

No reviews yet. Be the first, from the app.

Source

Version 0.1.0 (current)

main.luau

-- Render Ping: watch a few pixels at the end of a progress bar and send a
-- notification through ntfy.sh to your phone when they turn the done color.

local cfg = UI.Schema({
  watch = UI.Keybind("F4", { label = "Watch the render" }),
  topic = UI.Text("my-renders", { label = "ntfy.sh topic" }),
  done = UI.Color("#3ddc84", { label = "Color when done" }),
})

local watcher = nil

Bind(cfg.watch, function()
  if watcher then
    watcher:Cancel()
    watcher = nil
    UI.Notify("Stopped watching", "info")
    return
  end
  local x, y = System.Mouse()
  local box = { x - 3, y - 3, x + 3, y + 3 }
  local color = cfg.done:gsub("^#", "")
  UI.Notify("Watching the render", "info")
  watcher = Run(function()
    local read, err = pcall(function()
      while not Screen.SearchForColor(box, color, 0.1) do
        Sleep(2000)
      end
    end)
    watcher = nil
    if not read then
      UI.Notify("Stopped watching: " .. tostring(err), "error")
      return
    end
    local ok, response = pcall(Net.Post, "https://ntfy.sh/" .. cfg.topic, "Your render is done")
    if ok and response.status >= 200 and response.status < 300 then
      UI.Notify("Render done", "success")
    else
      UI.Notify("Render done, but ntfy.sh did not take the message", "warning")
    end
  end)
end)

function OnStop()
  if watcher then
    watcher:Cancel()
  end
end