; AUTOSAVE REMINDER ; -> Nudges you to save regularly while Ableton is running. CTRL+S resets the timer. Snoozes automatically when Melodyne is open. #Requires AutoHotkey v2.0 #SingleInstance Force SendMode("Input") SetWorkingDir(A_ScriptDir) SetTitleMatchMode(2) ; Reminder cadence. global AutoSaveInterval := 30 * 60 * 1000 ; 30 min = 30 * 60 * 1000 ms global AutoSaveShortInterval := 10 * 60 * 1000 ; 10 min = 10 * 60 * 1000 ms ; Runtime state. global AutoSavePopupActive := false global WaitingForAbletonActive := false global AutoSaveGui := "" SetTimer(CheckAbletonAndSetTimer, 1000) CheckAbletonAndSetTimer() { global AutoSaveInterval if LiveHack_AbletonWindowExists() { SetTimer(AutoSaveReminder, AutoSaveInterval) SetTimer(CheckAbletonAndSetTimer, 0) } } AutoSaveReminder() { global WaitingForAbletonActive SetTimer(AutoSaveReminder, 0) WaitingForAbletonActive := true SetTimer(WaitForAbletonActive, 1000) } WaitForAbletonActive() { global WaitingForAbletonActive if (!WaitingForAbletonActive) return if (LiveHack_IsAbletonOrPluginActive() and not LiveHack_IsMelodyneActive()) { WaitingForAbletonActive := false SetTimer(WaitForAbletonActive, 0) ShowSavePopup() return } if not LiveHack_AbletonWindowExists() { WaitingForAbletonActive := false SetTimer(WaitForAbletonActive, 0) SetTimer(CheckAbletonAndSetTimer, 1000) } } ShowSavePopup() { global AutoSavePopupActive, AutoSaveGui if (!AutoSavePopupActive) { AutoSavePopupActive := true AutoSaveGui := Gui("+AlwaysOnTop +ToolWindow", "LiveHack: Auto Save") AutoSaveGui.MarginX := 14 AutoSaveGui.MarginY := 14 AutoSaveGui.SetFont("s10", "Segoe UI") AutoSaveGui.Add("Text", , "Time to save your Ableton project.") AutoSaveGui.Add("Text", "y+6", "Save now or snooze for 10 minutes.") AutoSaveGui.Add("Button", "xm y+14 w100 Default", "Save now").OnEvent("Click", AutoSave_DoSave) AutoSaveGui.Add("Button", "x+10 w120", "Remind me later").OnEvent("Click", AutoSave_Later) AutoSaveGui.OnEvent("Close", AutoSave_Later) AutoSaveGui.OnEvent("Escape", AutoSave_Later) AutoSaveGui.Show() } } AutoSave_DoSave(*) { global AutoSavePopupActive, AutoSaveGui, AutoSaveInterval AutoSaveGui.Destroy() AutoSavePopupActive := false if LiveHack_AbletonWindowExists() { WinActivate("ahk_class Ableton Live Window Class") Send("^s") } SetTimer(AutoSaveReminder, AutoSaveInterval) } AutoSave_Later(*) { global AutoSavePopupActive, AutoSaveGui, AutoSaveShortInterval AutoSaveGui.Destroy() AutoSavePopupActive := false SetTimer(AutoSaveReminder, AutoSaveShortInterval) } #HotIf LiveHack_IsAbletonOrPluginActive() $^s:: { global AutoSavePopupActive, AutoSaveGui, WaitingForAbletonActive, AutoSaveInterval Send("^s") SetTimer(AutoSaveReminder, 0) SetTimer(AutoSaveReminder, AutoSaveInterval) if (AutoSavePopupActive) { AutoSaveGui.Destroy() AutoSavePopupActive := false } if (WaitingForAbletonActive) { WaitingForAbletonActive := false SetTimer(WaitForAbletonActive, 0) } } #HotIf LiveHack_AbletonWindowExists() { return WinExist("ahk_class Ableton Live Window Class") } LiveHack_IsAbletonOrPluginActive() { return ( WinActive("ahk_class Ableton Live Window Class") or WinActive("ahk_class Vst3PlugWindow") or WinActive("ahk_class AbletonVstPlugClass") ) } LiveHack_IsMelodyneActive() { return WinActive("Melodyne") } ; April 2026 — Released under MIT license by Yannis Lever ; This code is provided as-is with no warranty. Use at your own risk. ; Check out www.livehack.tools for more LiveHacks!