powerful but friendly backup program that runs in your tray, powered by restic devins.page/restray
go restic system-tray
2

Configure Feed

Select the types of activity you want to include in your feed.

chore: rearrange menus

intergrav (Jun 28, 2026, 10:01 PM EDT) 27c237ed d7c92445

+16 -20
+16 -20
tray.go
··· 104 104 setIconAnimated("idle") 105 105 systray.SetTooltip("Restray") 106 106 107 - mProfile := systray.AddMenuItem("Restray", "") 107 + mGlobalStatus := prefixedMenuItem{systray.AddMenuItem("Loading...", ""), ""} 108 + mGlobalStatus.Disable() 109 + var mStatusItems [maxProfiles]*systray.MenuItem 110 + for i := range mStatusItems { 111 + mStatusItems[i] = systray.AddMenuItem("", "") 112 + mStatusItems[i].Disable() 113 + mStatusItems[i].Hide() 114 + } 115 + 116 + systray.AddSeparator() 117 + mProfile := systray.AddMenuItem("Profile", "") 108 118 mProfile.Disable() 109 119 var profileItems [maxProfiles]*systray.MenuItem 110 120 for i := range profileItems { ··· 113 123 } 114 124 115 125 setProfileTitle := func(cfg Config, idx int) { 126 + if idx < len(cfg.Profile) { 127 + mProfile.SetTitle(cfg.Profile[idx].displayName()) 128 + } 116 129 if len(cfg.Profile) > 1 { 117 - mProfile.SetTitle("Profile - " + cfg.Profile[idx].displayName()) 118 130 mProfile.Enable() 119 131 } else { 120 - mProfile.SetTitle("Restray") 121 132 mProfile.Disable() 122 133 } 123 134 } ··· 134 145 } 135 146 } 136 147 137 - mGlobalStatus := prefixedMenuItem{systray.AddMenuItem("Loading...", ""), ""} 138 - mGlobalStatus.Disable() 139 - var mStatusItems [maxProfiles]*systray.MenuItem 140 - for i := range mStatusItems { 141 - mStatusItems[i] = systray.AddMenuItem("", "") 142 - mStatusItems[i].Disable() 143 - mStatusItems[i].Hide() 144 - } 145 - 146 - systray.AddSeparator() 147 148 mDownload := systray.AddMenuItem("Download Restic", "Download restic binary") 148 149 mDownload.Hide() 149 150 mUpdate := systray.AddMenuItem("", "Update restic binary") ··· 160 161 mUnlock := mRepo.AddSubMenuItem("Unlock", "Remove stale repository locks") 161 162 mMount := mRepo.AddSubMenuItem("Mount", "Mount repository and browse snapshots") 162 163 mConsole := mRepo.AddSubMenuItem("Shell", "Open terminal with repository environment") 164 + systray.AddSeparator() 163 165 mConfigure := systray.AddMenuItem("Configure", "Restray settings") 164 166 mFDA := mConfigure.AddSubMenuItem("Grant Full Disk Access", "Open System Settings to grant Full Disk Access") 165 167 mFDA.Hide() ··· 169 171 mFixPerms.Hide() 170 172 mLog := mConfigure.AddSubMenuItem("View Log", "Open log file in editor") 171 173 mFolder := mConfigure.AddSubMenuItem("Open Folder", "Open folder in file manager") 174 + mAbout := mConfigure.AddSubMenuItem("Restray v"+version, "Open repository in browser") 172 175 systray.AddSeparator() 173 - mAbout := systray.AddMenuItem("Restray v"+version, "Open repository in browser") 174 176 mQuit := systray.AddMenuItem("Quit", "Quit Restray") 175 177 176 178 sched := cron.New() ··· 411 413 mGlobalStatus.Show() 412 414 hideActions() 413 415 mDownload.Show() 414 - mProfile.SetTitle("Restray") 415 416 mProfile.Disable() 416 417 return 417 418 } ··· 437 438 } 438 439 439 440 label := prof.displayName() 440 - if ps.errMsg != "" { 441 - label += " - " + ps.errMsg 442 - } else if ps.repoErr != "" { 443 - label += " - " + ps.repoErr 444 - } 445 441 446 442 profileMu.Lock() 447 443 profileStates[i] = ps