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.

feat: use humanize for next time

intergrav (Jul 1, 2026, 9:54 PM EDT) 2ca2cf01 d3d1485b

+3 -18
+2 -1
README.md
··· 139 139 - [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) - hot-reloading 140 140 - [github.com/gen2brain/beeep](https://github.com/gen2brain/beeep) - cross-platform notification handler 141 141 - [github.com/robfig/cron](https://github.com/robfig/cron) - cron scheduler 142 - - [github.com/lnquy/cron](https://github.com/lnquy/cron) - convert cron to human-readable expression 142 + - [github.com/dustin/go-humanize](https://github.com/dustin/go-humanize) - human-readable relative timestamps 143 + - [github.com/lnquy/cron](https://github.com/lnquy/cron) - human-readable cron expressions 143 144 - [github.com/thiagokokada/dark-mode-go](https://github.com/thiagokokada/dark-mode-go) - dark mode detection for icons 144 145 - [github.com/urfave/cli](https://github.com/urfave/cli) - cli library
+1 -17
cmd/restray/tray.go
··· 1 1 package main 2 2 3 3 import ( 4 - "fmt" 5 4 "log" 6 5 "os" 7 6 "runtime" ··· 827 826 if earliest.IsZero() { 828 827 return "" 829 828 } 830 - d := earliest.Sub(now) 831 - 832 - today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) 833 - tomorrow := today.AddDate(0, 0, 1) 834 - dayAfter := today.AddDate(0, 0, 2) 835 - 836 - switch { 837 - case d < time.Hour: 838 - return fmt.Sprintf("%dm", int(d.Minutes())) 839 - case earliest.After(today) && earliest.Before(tomorrow): 840 - return "Today " + earliest.Format("15:04") 841 - case earliest.After(tomorrow) && earliest.Before(dayAfter): 842 - return "Tomorrow " + earliest.Format("15:04") 843 - default: 844 - return earliest.Format("Jan 2 15:04") 845 - } 829 + return humanize.Time(earliest) 846 830 } 847 831 848 832 func formatLastBackup(last time.Time) string {