├── .github └── FUNDING.yml ├── .gitignore ├── .gitmodules ├── AnalogClock ├── AnalogClock.widget.zip ├── AnalogClock.widget │ ├── AnalogClock-CentralUS.coffee │ ├── AnalogClock-CustomFace.coffee │ └── Faces │ │ └── ClockFace.png ├── ReadMe.txt ├── screenshot.png └── widget.json ├── BackgroundGrid ├── BackgroundGrid.widget.zip ├── BackgroundGrid.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── NetworkInfo ├── NetworkInfo.widget.zip ├── NetworkInfo.widget │ ├── NetworkInfo.coffee │ ├── NetworkInfo.sh │ └── images │ │ ├── ethernet.png │ │ ├── ethernet_disabled.png │ │ ├── wi-fi.png │ │ └── wi-fi_disabled.png ├── screenshot.png └── widget.json ├── README.md ├── SimpleDate ├── SimpleDate.widget.zip ├── index.coffee ├── screenshot.png └── widget.json ├── Spotify-Current-Track ├── screenshot.png ├── spotify-current-track.widget.zip ├── spotify-current-track.widget │ ├── README.md │ └── index.coffee └── widget.json ├── Today ├── Today.widget.zip ├── Today.widget │ ├── TodayIn.coffee │ ├── TodayIs.coffee │ ├── TodaysNews.coffee │ └── TodaysWord.coffee ├── screenshot.png └── widget.json ├── WorldClock ├── WorldClock.widget.zip ├── WorldClock.widget │ ├── WorldClock.sh │ └── index.coffee ├── screenshot.png └── widget.json ├── battery ├── battery.widget.zip ├── battery.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── btc-eur ├── btceur.coffee ├── btceur.widget.zip ├── screenshot.png └── widget.json ├── btc-prices ├── btc-prices.widget.zip ├── btc-prices.widget │ ├── LICENSE │ ├── README.md │ └── index.coffee ├── screenshot.png └── widget.json ├── btc ├── btc.widget.zip ├── btc.widget │ └── btc.coffee ├── screenshot.png └── widget.json ├── calendar ├── README.txt ├── calendar.zip ├── index.coffee ├── screenshot.png └── widget.json ├── disk-usage ├── disk-usage.widget.zip ├── disk-usage.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── fever-rss ├── fever-rss.widget.zip ├── fever-rss.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── german-word-of-the-day ├── german-word-of-the-day.widget.zip ├── german-word-of-the-day.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── iTunes-now ├── itunes-now.widget.zip ├── itunes-now.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── inspirational-quote ├── inspirational-quote.widget.zip ├── inspirational-quote.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── iostats ├── iostats.widget.zip ├── iostats.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── load-avg ├── load-avg.widget.zip ├── load-avg.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── mail ├── mail.widget.zip ├── mail.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── network-throughput ├── network-throughput.widget.zip ├── network-throughput.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── public_ip ├── public_ip.widget.zip ├── public_ip.widget │ └── index.coffee ├── screenshot.png └── widget.json ├── simple-stocks ├── screenshot.png ├── simple-stocks.widget.zip ├── simple-stocks.widget │ └── index.coffee └── widget.json ├── swap-usage ├── screenshot.png ├── swap-usage.widget.zip ├── swap-usage.widget │ └── index.coffee └── widget.json ├── sys-mon-set ├── screenshot.png ├── sys-mon-set.widget.zip ├── sys-mon-set.widget │ ├── README.md │ ├── battery.widget │ │ └── index.coffee │ ├── mini-top-mem.widget │ │ └── index.coffee │ ├── netstat.widget │ │ ├── index.coffee │ │ └── scripts │ │ │ ├── netst │ │ │ └── netst.c │ ├── public_ip.widget │ │ └── index.coffee │ ├── simple-clock.widget │ │ └── index.coffee │ ├── top-cpu.widget │ │ └── index.coffee │ └── total-mem.widget │ │ └── index.coffee └── widget.json ├── to-do-list ├── screenshot.png ├── to-do-list.widget.zip ├── to-do-list │ └── index.coffee └── widget.json ├── top-cpu ├── screenshot.png ├── top-cpu.widget.zip ├── top-cpu.widget │ └── index.coffee └── widget.json ├── top-mem ├── screenshot.png ├── top-mem.widget.zip ├── top-mem.widget │ └── index.coffee └── widget.json ├── wildstar-server-status ├── screenshot.png ├── widget.json ├── wildstar-server-status.widget.zip └── wildstar-server-status.widget │ └── index.coffee └── worldcup ├── screenshot.png ├── widget.json ├── worldcup.widget.zip └── worldcup.widget ├── README.md ├── football.ico ├── index.coffee └── worldcup.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: felixhageloh 2 | custom: https://bunq.me/fhageloh 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "weather"] 2 | path = weather 3 | url = git@github.com:felixhageloh/weather-widget.git 4 | [submodule "CPU-Usage-bar-Widget"] 5 | path = CPU-Usage-bar-Widget 6 | url = git@github.com:DaniBarca/CPU-Usage-bar-Widget.git 7 | [submodule "memory-bar"] 8 | path = memory-bar 9 | url = git@github.com:cobyism/ubersicht-memory-bar.git 10 | [submodule "simple-clock"] 11 | path = simple-clock 12 | url = git@github.com:soberstadt/simple-clock-widget.git 13 | [submodule "circleci-widget"] 14 | path = circleci-widget 15 | url = git@github.com:andremedeiros/circleci-widget.git 16 | [submodule "roundClock"] 17 | path = roundClock 18 | url = https://github.com/phaseOne/roundClock.git 19 | [submodule "mailcount"] 20 | path = mailcount 21 | url = git@github.com:wfalkwallace/mailcount.git 22 | [submodule "currency-converter"] 23 | path = currency-converter 24 | url = https://github.com/kikorb/currency-conversor.git 25 | [submodule "statuscake"] 26 | path = statuscake 27 | url = https://github.com/things/uebersicht-statuscake.git 28 | [submodule "tmstatus"] 29 | path = tmstatus 30 | url = https://github.com/rudders/tmstatus.git 31 | [submodule "batteryDetails.widget"] 32 | path = batteryDetails.widget 33 | url = https://github.com/bausi2k/batteryDetails.widget 34 | [submodule "only-this"] 35 | path = only-this 36 | url = https://github.com/bgartenmann/uebersicht-only-this-widget.git 37 | [submodule "Rdio-Widget"] 38 | path = Rdio-Widget 39 | url = https://github.com/larkov/Rdio-Widget.git 40 | [submodule "mbta-widget"] 41 | path = mbta-widget 42 | url = https://github.com/joshuaswilcox/mbta-widget 43 | [submodule "Stock-quotes-Widget"] 44 | path = Stock-quotes-Widget 45 | url = https://github.com/edasque/Stock-quotes-Widget 46 | [submodule "ScoreTicker"] 47 | path = ScoreTicker 48 | url = https://github.com/jckimmel/ScoreTicker 49 | [submodule "CurrLocation"] 50 | path = CurrLocation 51 | url = https://github.com/jckimmel/CurrLocation 52 | [submodule "horizontal-calendar-widget"] 53 | path = horizontal-calendar-widget 54 | url = https://github.com/ashikahmad/horizontal-calendar-widget 55 | [submodule "prayer-time-widget"] 56 | path = prayer-time-widget 57 | url = https://github.com/ashikahmad/prayer-time-widget 58 | [submodule "analog-clock-widget"] 59 | path = analog-clock-widget 60 | url = https://github.com/ashikahmad/analog-clock-widget 61 | [submodule "SPS"] 62 | path = SPS 63 | url = https://github.com/wilsongis/uebersicht-SPS_Widget 64 | [submodule "bart-widget"] 65 | path = bart-widget 66 | url = https://github.com/MatisseHack/bart-widget 67 | [submodule "craigslist"] 68 | path = craigslist 69 | url = https://github.com/stursby/uebersicht-craigslist 70 | [submodule "things.widget"] 71 | path = things.widget 72 | url = https://github.com/digitalbias/things.widget 73 | [submodule "cjdns"] 74 | path = cjdns 75 | url = https://github.com/lukevers/uber-cjdns.git 76 | [submodule "vertical-calendar"] 77 | path = vertical-calendar 78 | url = https://github.com/ziti/uebersicht-calendar-widget 79 | [submodule "d3-clock"] 80 | path = d3-clock 81 | url = https://github.com/cmaurer/d3-clock-uebersicht-widget.git 82 | [submodule "weathernow"] 83 | path = weathernow 84 | url = https://github.com/briandconnelly/weathernow-widget 85 | [submodule "trello"] 86 | path = trello 87 | url = https://github.com/NickBusey/Ubersicht-Trello-Widget 88 | [submodule "muni.widget"] 89 | path = muni.widget 90 | url = https://github.com/dmaurath/muni.widget.git 91 | [submodule "slideshow"] 92 | path = slideshow 93 | url = https://github.com/mpandrews2000/slideshow.git 94 | [submodule "git-log"] 95 | path = git-log 96 | url = https://github.com/DigitallyBorn/Ubersicht-Git-Log.git 97 | [submodule "wunderlist-tasks"] 98 | path = wunderlist-tasks 99 | url = https://github.com/NikitaBazhenov/UbersichtWunderlistTasks 100 | [submodule "Youtube-Channel"] 101 | path = Youtube-Channel 102 | url = https://github.com/atika/Ubersicht-Youtube 103 | [submodule "countdown"] 104 | path = countdown 105 | url = https://github.com/anuragbakshi/Countdown-Widget 106 | [submodule "fever-hotlinks"] 107 | path = fever-hotlinks 108 | url = https://github.com/telega/fever-widget.git 109 | [submodule "GitFinder"] 110 | path = GitFinder 111 | url = https://github.com/atika/Ubersicht-GitFinder 112 | [submodule "ical-widget"] 113 | path = ical-widget 114 | url = https://github.com/djbrooks111/ical-widget.git 115 | [submodule "Set-networking"] 116 | path = Set-networking 117 | url = https://github.com/brookesdjb/Set-networking.widget 118 | [submodule "github-notifications"] 119 | path = github-notifications 120 | url = https://github.com/mtscout6/uebersicht-github-notifications.git 121 | [submodule "gcal-widget"] 122 | path = gcal-widget 123 | url = https://github.com/mattk410/gcal-widget 124 | [submodule "authentic-weather"] 125 | path = authentic-weather 126 | url = https://github.com/reduxd/authentic-ubersicht.git 127 | [submodule "pretty-weather"] 128 | path = pretty-weather 129 | url = https://github.com/felixhageloh/pretty-weather.git 130 | [submodule "omnifocus-widget"] 131 | path = omnifocus-widget 132 | url = https://github.com/fitzagard/omnifocus-widget.git 133 | [submodule "ping-history"] 134 | path = ping-history 135 | url = https://github.com/bonus-tm/uebersicht-ping-history.widget.git 136 | [submodule "cpu-bar"] 137 | path = cpu-bar 138 | url = https://github.com/PerishableDave/ubersicht-cpu-bar.git 139 | [submodule "anydo"] 140 | path = anydo 141 | url = https://github.com/mislavcimpersak/anydo-widget 142 | [submodule "CoverArt"] 143 | path = CoverArt 144 | url = https://github.com/slowburn/CoverArt 145 | [submodule "grid-launcher"] 146 | path = grid-launcher 147 | url = https://github.com/ddgond/uebersicht-grid-launcher 148 | [submodule "trash-size"] 149 | path = trash-size 150 | url = https://github.com/MrKireko/trash-size.git 151 | [submodule "battery-charge"] 152 | path = battery-charge 153 | url = https://github.com/bcseda/BatteryCharge.git 154 | [submodule "uberist"] 155 | path = uberist 156 | url = https://github.com/chagel/uberist.git 157 | [submodule "earth_view"] 158 | path = earth_view 159 | url = https://github.com/Maggick-/earth_view 160 | [submodule "markdown_cheat_sheet"] 161 | path = markdown_cheat_sheet 162 | url = https://github.com/jacksonfylle/Ubersicht 163 | [submodule "morning"] 164 | path = morning 165 | url = git@github.com:imRohan/ubersicht-morning.widget.git 166 | [submodule "macports"] 167 | path = macports 168 | url = git@github.com:Maggick-/macports.git 169 | [submodule "jenkins"] 170 | path = jenkins 171 | url = https://github.com/piresbruno/uebersicht-jenkins 172 | [submodule "google-cal"] 173 | path = google-cal 174 | url = https://github.com/dimitri-koenig/uebersicht-widget-for-google-cal 175 | [submodule "swiss-sbb-connections"] 176 | path = swiss-sbb-connections 177 | url = git@github.com:dimitri-koenig/uebersicht-widget-for-swiss-transport-data.git 178 | [submodule "Time-in-Words"] 179 | path = Time-in-Words 180 | url = https://github.com/behoernchen/Time-in-Words.git 181 | [submodule "outdated-brew-formulae"] 182 | path = outdated-brew-formulae 183 | url = https://github.com/gregmajor/ubersicht-outdated-brew-formulae-widget 184 | [submodule "sys-monitor"] 185 | path = sys-monitor 186 | url = https://github.com/kporten/uebersicht-sys-monitor.git 187 | [submodule "multiple-locations-weather"] 188 | path = multiple-locations-weather 189 | url = https://github.com/rabad/uebersicht-multiple-locations-weather 190 | [submodule "lol-stats"] 191 | path = lol-stats 192 | url = git@github.com:Xcrucifier/lol-stats-widget.git 193 | [submodule "lol-current-game"] 194 | path = lol-current-game 195 | url = git@github.com:Baxter900/lol-current-game.git 196 | [submodule "animated-background"] 197 | path = animated-background 198 | url = https://github.com/Baxter900/background-widget 199 | [submodule "blur-widget"] 200 | path = blur-widget 201 | url = https://github.com/atika/Ubersicht-Blur 202 | [submodule "time-of-angels"] 203 | path = time-of-angels 204 | url = https://github.com/cytec/uebersicht-time-of-angels 205 | [submodule "Nightshades"] 206 | path = Nightshades 207 | url = git@github.com:Porco-Rosso/Ubersicht-Nightshades.git 208 | [submodule "Circular-CPU"] 209 | path = Circular-CPU 210 | url = https://github.com/zanderp/Mac-CPU-Widget 211 | [submodule "circular-liquid-battery-widget"] 212 | path = circular-liquid-battery-widget 213 | url = https://github.com/zanderp/circular-liquid-battery-widget 214 | [submodule "Circular-RAM"] 215 | path = Circular-RAM 216 | url = git@github.com:zanderp/circular-ram-widget.git 217 | [submodule "Unread-Messages.widget"] 218 | path = mail-and-messages.widget 219 | url = https://github.com/travtrigs/Unread-Messages.widget 220 | [submodule "Mandarin-Chinese-Word-Of-The-Day-widget"] 221 | path = Mandarin-Chinese-Word-Of-The-Day-widget 222 | url = git@github.com:himynameisbeni/Mandarin-Chinese-Word-Of-The-Day-widget.git 223 | [submodule "app-launcher"] 224 | path = app-launcher 225 | url = https://github.com/travtrigs/app-launcher.widget 226 | [submodule "folder-launcher"] 227 | path = folder-launcher 228 | url = git@github.com:travtrigs/folder-launcher.widget.git 229 | [submodule "sticky-notes-ubersicht"] 230 | path = sticky-notes-ubersicht 231 | url = git@github.com:zanderp/sticky-notes-ubersicht.git 232 | [submodule "Yr4u"] 233 | path = Yr4u 234 | url = git@github.com:larkov/Yr4Ubersicht.git 235 | [submodule "solar-system.widget"] 236 | path = solar-system.widget 237 | url = git@github.com:travtrigs/solar-system.widget.git 238 | [submodule "Evangelion"] 239 | path = Evangelion 240 | url = https://github.com/jeticg/Evangelion-Uebersicht-Widget 241 | [submodule "DiskUsage-Bar"] 242 | path = DiskUsage-Bar 243 | url = https://github.com/dinever/DiskUsage-Bar-Widget 244 | [submodule "bluetooth-battery-bar"] 245 | path = bluetooth-battery-bar 246 | url = git@github.com:gschrader/ubersicht-bluetooth-battery-bar.git 247 | [submodule "DailyBibleVerse"] 248 | path = DailyBibleVerse 249 | url = git@github.com:justiceamoh/DailyBibleVerse.git 250 | [submodule "Xkcd-now"] 251 | path = Xkcd-now 252 | url = https://github.com/AlataMors/Ubersicht-Xkcd-now 253 | [submodule "iTunesMiniPlayer.widget"] 254 | path = iTunesMiniPlayer.widget 255 | url = git@github.com:jscampos/iTunesMiniPlayer.widget.git 256 | [submodule "words-worldclock"] 257 | path = words-worldclock 258 | url = git@github.com:wrutkowski/ubericht-wordclock.git 259 | [submodule "kindle-random-quote"] 260 | path = kindle-random-quote 261 | url = git@github.com:apletnev/ubersicht-kindle-random-quote.git 262 | [submodule "xkcd-random"] 263 | path = xkcd-random 264 | url = git@github.com:PapyPev/xkcd-random.widget.git 265 | [submodule "lastfm"] 266 | path = lastfm 267 | url = git@github.com:patrickhpan/lastfm-ubersicht.git 268 | [submodule "video-widget"] 269 | path = video-widget 270 | url = https://github.com/paulbhartzog/ubersicht-video-widget 271 | [submodule "istats.widget"] 272 | path = istats.widget 273 | url = git@github.com:roele/istats.widget.git 274 | [submodule "stackexchange.widget"] 275 | path = stackexchange.widget 276 | url = git@github.com:d4rkd3v1l/uebersicht-stackexchange.widget.git 277 | [submodule "git-stats.widget"] 278 | path = git-stats.widget 279 | url = git@github.com:d4rkd3v1l/uebersicht-git-stats.widget.git 280 | [submodule "FancyDateTime"] 281 | path = FancyDateTime 282 | url = git@github.com:codeFareith/uebersicht-FancyDateTime.git 283 | [submodule "SolTunes.widget"] 284 | path = SolTunes.widget 285 | url = git@github.com:yohnnyjoe/SolTunes.widget.git 286 | [submodule "apod-view"] 287 | path = apod-view 288 | url = https://github.com/KiwiSkunk/apod-view.widget 289 | [submodule "youtube-video"] 290 | path = youtube-video 291 | url = https://github.com/paulbhartzog/ubersicht-youtube-video-widget 292 | [submodule "Hangu-Word-Clock"] 293 | path = Hangu-Word-Clock 294 | url = https://github.com/openmaya/Uebersicht-Hangul-Word-Clock.git 295 | [submodule "lightroom-latest"] 296 | path = lightroom-latest 297 | url = https://github.com/evanfuture/lightroom-latest.widget.git 298 | [submodule "bar"] 299 | path = bar 300 | url = https://github.com/callahanrts/bar.git 301 | [submodule "zendesk"] 302 | path = zendesk 303 | url = https://github.com/unglud/ubersicht-zendesk 304 | [submodule "fuzzytime"] 305 | path = fuzzytime 306 | url = https://github.com/plan8studios/fuzzytime 307 | [submodule "usefulinfo"] 308 | path = usefulinfo 309 | url = https://github.com/justinellingson/usefulinfowidget 310 | [submodule "backgroundwidget"] 311 | path = backgroundwidget 312 | url = https://github.com/roach0123/backgroundwidget 313 | [submodule "forecast"] 314 | path = forecast 315 | url = https://github.com/uPaymeiFixit/forecast-widget 316 | [submodule "binari-clock"] 317 | path = binari-clock 318 | url = https://github.com/jeisner93/ubersicht-binary-clock 319 | [submodule "now-playing"] 320 | path = now-playing 321 | url = https://github.com/levifig/now-playing.widget 322 | [submodule "TaskwarriorWidget"] 323 | path = TaskwarriorWidget 324 | url = git@github.com:KevinBockelandt/TaskwarriorWidget.git 325 | [submodule "Sidebar"] 326 | path = Sidebar 327 | url = https://github.com/Pe8er/Sidebar.Widget 328 | [submodule "Playbox"] 329 | path = Playbox 330 | url = https://github.com/Pe8er/Playbox.Widget 331 | [submodule "coding-net-notifications.widget"] 332 | path = coding-net-notifications.widget 333 | url = https://github.com/IUsual/coding-net-notifications.widget 334 | [submodule "minimal-forecast-widget"] 335 | path = minimal-forecast-widget 336 | url = https://github.com/cpmsmith/minimal-forecast-widget.git 337 | [submodule "RemindersWidget"] 338 | path = RemindersWidget 339 | url = https://github.com/davidlday/RemindersWidget 340 | [submodule "ubersicht-network-throughput"] 341 | path = ubersicht-network-throughput 342 | url = git@github.com:dionmunk/ubersicht-network-throughput.git 343 | [submodule "Strava.widget"] 344 | path = Strava.widget 345 | url = git@github.com:Pe8er/Strava.widget.git 346 | [submodule "Docker-Uber-Stats"] 347 | path = Docker-Uber-Stats 348 | url = git@github.com:Paradiddley/Docker-Uber-Stats.git 349 | [submodule "Simple-Uber-System-Status"] 350 | path = Simple-Uber-System-Status 351 | url = git@github.com:Paradiddley/Simple-Uber-System-Status.git 352 | [submodule "Simple-Uber-Device-Status"] 353 | path = Simple-Uber-Device-Status 354 | url = git@github.com:Paradiddley/Simple-Uber-Device-Status.git 355 | [submodule "Simple-Uber-Disk-Usage"] 356 | path = Simple-Uber-Disk-Usage 357 | url = git@github.com:Paradiddley/Simple-Uber-Disk-Usage.git 358 | [submodule "mail-count-read.widget"] 359 | path = mail-count-read.widget 360 | url = https://github.com/roadglide03/mail-count-read.widget.git 361 | [submodule "vms.widget"] 362 | path = vms.widget 363 | url = https://github.com/roadglide03/vms.widget.git 364 | [submodule "justthedate"] 365 | path = justthedate 366 | url = https://github.com/ruurd/justthedate 367 | [submodule "XiamiFM"] 368 | path = XiamiFM 369 | url = https://github.com/ProfFan/Ubersicht-XiamiFM 370 | [submodule "iTunesLyrics.widget"] 371 | path = iTunesLyrics.widget 372 | url = git@github.com:Pe8er/iTunesLyrics.widget.git 373 | [submodule "moon-phase"] 374 | path = moon-phase 375 | url = git@github.com:joecreighton/moon-phase.git 376 | [submodule "ubersicht-putio"] 377 | path = ubersicht-putio 378 | url = https://github.com/gitzerai/ubersicht-putio 379 | [submodule "minimal-github-widgit"] 380 | path = minimal-github-widgit 381 | url = https://github.com/eanplatter/minimal-github-widgit 382 | [submodule "aoede"] 383 | path = aoede 384 | url = https://github.com/pyraxo/aoede 385 | [submodule "air-quality.widget"] 386 | path = air-quality.widget 387 | url = https://github.com/FanZhen2002/air-quality.widget 388 | [submodule "time_since"] 389 | path = time_since 390 | url = https://github.com/johnmathews/time_since 391 | [submodule "doviz-ticker"] 392 | path = doviz-ticker 393 | url = https://github.com/xcolor/doviz-ticker 394 | [submodule "time_until"] 395 | path = time_until 396 | url = https://github.com/johnmathews/time_until 397 | [submodule "UpcomingEvents"] 398 | path = UpcomingEvents 399 | url = https://github.com/cbeardsmore/UpcomingEvents 400 | [submodule "WiFi-Tx-Speed"] 401 | path = WiFi-Tx-Speed 402 | url = https://github.com/mactexan/WiFi-Tx-Speed 403 | [submodule "kaspersky-threats"] 404 | path = kaspersky-threats 405 | url = https://github.com/mactexan/kaspersky-threats 406 | [submodule "longviewer-widget"] 407 | path = longviewer-widget 408 | url = https://github.com/telega/longviewer-widget 409 | [submodule "Daily-Random-Kanji"] 410 | path = Daily-Random-Kanji 411 | url = https://github.com/cbeardsmore/Daily-Random-Kanji 412 | [submodule "ubersichtGitInfo"] 413 | path = ubersichtGitInfo 414 | url = https://github.com/synle/ubersichtGitInfo 415 | [submodule "JapaneseCalendar-widget"] 416 | path = JapaneseCalendar-widget 417 | url = https://github.com/Gr3yR0n1n/JapaneseCalendar-widget 418 | [submodule "ubersicht-currentKeymap"] 419 | path = ubersicht-currentKeymap 420 | url = https://github.com/KryDos/ubersicht-currentKeymap 421 | [submodule "minimal_weather"] 422 | path = minimal_weather 423 | url = https://github.com/sungjp/minimal_weather 424 | [submodule "netspeeds-widget"] 425 | path = netspeeds-widget 426 | url = https://github.com/cschoenfeld/netspeeds-widget 427 | [submodule "ubersicht-astronauts"] 428 | path = ubersicht-astronauts 429 | url = https://github.com/LePhil/ubersicht-astronauts 430 | [submodule "uebersicht-sensu"] 431 | path = uebersicht-sensu 432 | url = https://github.com/GhostLyrics/uebersicht-sensu 433 | [submodule "word-of-the.widget"] 434 | path = word-of-the.widget 435 | url = https://github.com/evanfuture/word-of-the.widget 436 | [submodule "ubersicht-now-playing"] 437 | path = ubersicht-now-playing 438 | url = https://github.com/dionmunk/ubersicht-now-playing 439 | [submodule "tsushin"] 440 | path = tsushin 441 | url = https://github.com/louixs/tsushin 442 | [submodule "WiFi-SSID-Widget"] 443 | path = WiFi-SSID-Widget 444 | url = https://github.com/mactexan/WiFi-SSID-Widget 445 | [submodule "Plexpy-Ubersicht-Widget"] 446 | path = Plexpy-Ubersicht-Widget 447 | url = https://github.com/yoyostile/Plexpy-Ubersicht-Widget 448 | [submodule "Black-Bar-Widget"] 449 | path = Black-Bar-Widget 450 | url = https://github.com/jrb12364/Black-Bar-Widget 451 | [submodule "commandment-11"] 452 | path = commandment-11 453 | url = https://github.com/cscharff/commandment-11 454 | [submodule "SmoothAnalogClock.widget"] 455 | path = SmoothAnalogClock.widget 456 | url = https://github.com/N00bySumairu/SmoothAnalogClock.widget 457 | [submodule "uebersicht-wiki-holidays.widget"] 458 | path = uebersicht-wiki-holidays.widget 459 | url = https://github.com/DiSiqueira/uebersicht-wiki-holidays.widget 460 | [submodule "sunradar"] 461 | path = sunradar 462 | url = https://github.com/lakiryt/sunradar/ 463 | [submodule "ubersicht_gmail"] 464 | path = ubersicht_gmail 465 | url = https://github.com/louixs/ubersicht_gmail 466 | [submodule "ubersicht_google_calendar"] 467 | path = ubersicht_google_calendar 468 | url = https://github.com/louixs/ubersicht_google_calendar 469 | [submodule "stravasicht"] 470 | path = stravasicht 471 | url = https://github.com/draganmarjanovic/stravasicht 472 | [submodule "reddit-karma.widget"] 473 | path = reddit-karma.widget 474 | url = https://github.com/z3t0/reddit-karma.widget 475 | [submodule "ubersicht_tasks"] 476 | path = ubersicht_tasks 477 | url = https://github.com/louixs/ubersicht_tasks 478 | [submodule "pic-display.widget"] 479 | path = pic-display.widget 480 | url = https://github.com/Trapper777/pic-display.widget 481 | [submodule "daily-xkcd-uebersicht-widget"] 482 | path = daily-xkcd-uebersicht-widget 483 | url = https://github.com/dalemanthei/daily-xkcd-uebersicht-widget 484 | [submodule "wttr-moon-uebersicht"] 485 | path = wttr-moon-uebersicht 486 | url = https://github.com/matthias-vogt/wttr-moon-uebersicht 487 | [submodule "wttr-uebersicht"] 488 | path = wttr-uebersicht 489 | url = https://github.com/matthias-vogt/wttr-uebersicht 490 | [submodule "uebersicht-github-activity"] 491 | path = uebersicht-github-activity 492 | url = https://github.com/shadowfacts/uebersicht-github-activity 493 | [submodule "ToDo"] 494 | path = ToDo 495 | url = https://github.com/illuminati945/ToDo 496 | [submodule "Ubersicht-Matrix"] 497 | path = Ubersicht-Matrix 498 | url = https://github.com/Porco-Rosso/Ubersicht-Matrix 499 | [submodule "ubersicht-docker-containers"] 500 | path = ubersicht-docker-containers 501 | url = https://github.com/pauloamgomes/ubersicht-docker-containers 502 | [submodule "Ubersicht_zendesk_jg"] 503 | path = Ubersicht_zendesk_jg 504 | url = https://github.com/jagalbraith/Ubersicht_zendesk_jg 505 | [submodule "uebersicht-taskpaper"] 506 | path = uebersicht-taskpaper 507 | url = https://github.com/flow7/uebersicht-taskpaper 508 | [submodule "todolist-widget"] 509 | path = todolist-widget 510 | url = https://github.com/Langhaarzombie/todolist-widget 511 | [submodule "RSSs_Ubersicht_Widget"] 512 | path = RSSs_Ubersicht_Widget 513 | url = https://github.com/edasque/RSSs_Ubersicht_Widget 514 | [submodule "valerian-time"] 515 | path = valerian-time 516 | url = https://github.com/arminrosu/valerian-time 517 | [submodule "bingwall"] 518 | path = bingwall 519 | url = https://github.com/alebertacco/bingwall 520 | [submodule "vsts.widget"] 521 | path = vsts.widget 522 | url = https://github.com/GregaVrbancic/vsts.widget 523 | [submodule "led-clock"] 524 | path = led-clock 525 | url = https://github.com/imranzahid01/led-clock 526 | [submodule "uebersicht-ethereum-usd-price"] 527 | path = uebersicht-ethereum-usd-price 528 | url = https://github.com/AdrienKuhn/uebersicht-ethereum-usd-price 529 | [submodule "Ubersicht-DiskUsage-bar"] 530 | path = Ubersicht-DiskUsage-bar 531 | url = https://github.com/onishy/Ubersicht-DiskUsage-bar 532 | [submodule "conky-for-mac"] 533 | path = conky-for-mac 534 | url = https://github.com/dumbo25/conky-for-mac 535 | [submodule "cryptowidget"] 536 | path = cryptowidget 537 | url = https://github.com/avocadomaster/cryptowidget 538 | [submodule "uebersicht-central-logo-widget"] 539 | path = uebersicht-central-logo-widget 540 | url = https://github.com/aykot/uebersicht-central-logo-widget 541 | [submodule "todo.txt-widget"] 542 | path = todo.txt-widget 543 | url = https://github.com/16kRAMpack/todo.txt-widget 544 | [submodule "commands-feed.widget"] 545 | path = commands-feed.widget 546 | url = https://github.com/smartameer/commands-feed.widget 547 | [submodule "mini-system-charts.widget"] 548 | path = mini-system-charts.widget 549 | url = https://github.com/aprowe/mini-system-charts.widget 550 | [submodule "scrolling-cpu-meter"] 551 | path = scrolling-cpu-meter 552 | url = https://github.com/FunkyQChicken/scrolling-cpu-meter 553 | [submodule "uebersicht_ch_meteo_widget"] 554 | path = uebersicht_ch_meteo_widget 555 | url = https://github.com/gbuendia/uebersicht_ch_meteo_widget 556 | [submodule "uebersicht_polizeiticker_widget"] 557 | path = uebersicht_polizeiticker_widget 558 | url = https://github.com/gbuendia/uebersicht_polizeiticker_widget 559 | [submodule "trellocard"] 560 | path = trellocard 561 | url = https://github.com/guxsousa/trellocard 562 | [submodule "ubersicht-wanikani"] 563 | path = ubersicht-wanikani 564 | url = https://github.com/jakeoid/ubersicht-wanikani 565 | [submodule "uebersicht-widget-public_ip"] 566 | path = uebersicht-widget-public_ip 567 | url = https://github.com/i07/uebersicht-widget-public_ip 568 | [submodule "uebersicht-binary-clock.widget"] 569 | path = uebersicht-binary-clock.widget 570 | url = https://github.com/Dellos7/uebersicht-binary-clock.widget/ 571 | [submodule "wttr"] 572 | path = wttr 573 | url = https://github.com/bkroggel/wttr 574 | [submodule "uebersicht-spotify-adsilencer.widget"] 575 | path = uebersicht-spotify-adsilencer.widget 576 | url = https://github.com/Dellos7/uebersicht-spotify-adsilencer.widget 577 | [submodule "cuteical.widget"] 578 | path = cuteical.widget 579 | url = https://github.com/ctakemoto/cuteical.widget 580 | [submodule "WunderlistTasksWidget"] 581 | path = WunderlistTasksWidget 582 | url = https://github.com/Makiah/WunderlistTasksWidget 583 | [submodule "reddit-overview.widget"] 584 | path = reddit-overview.widget 585 | url = https://github.com/diceroll123/reddit-overview.widget 586 | [submodule "byrthdays.widget"] 587 | path = byrthdays.widget 588 | url = https://github.com/olfuerniss/byrthdays.widget 589 | [submodule "litecoin-widget"] 590 | path = litecoin-widget 591 | url = https://github.com/plan8studios/litecoin-widget 592 | -------------------------------------------------------------------------------- /AnalogClock/AnalogClock.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/AnalogClock/AnalogClock.widget.zip -------------------------------------------------------------------------------- /AnalogClock/AnalogClock.widget/AnalogClock-CentralUS.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: 'export TZ="US/Central";date +"%m/%d/%Y %I:%M:%S %p"' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 1000 6 | 7 | # CSS Style 8 | style: """ 9 | top:40px 10 | left:260px 11 | margin:0px 12 | padding:0px 13 | 14 | #clockImage 15 | display:none 16 | 17 | #clockLabel 18 | display:none 19 | """ 20 | 21 | # Render the output. 22 | render: (output) -> """ 23 | 24 | 25 |
26 | """ 27 | 28 | # Update the rendered output. 29 | update: (output, domEl) -> 30 | 31 | # Get a reference to our DOM. 32 | dom = $(domEl) 33 | 34 | # Convert the date from the output to a Javascript date. 35 | # We do this (rather than using Javascript dates) so that we can use Unix timezones. 36 | theDate = new Date(output) 37 | 38 | # Set our clock settings. 39 | Clock = 40 | size: 100 41 | scale: 2 42 | showFace: true 43 | showFaceImage: false 44 | showHourTicks: true 45 | showMinuteTicks: true 46 | showFrame: true 47 | showHourHand: true 48 | showMinuteHand: true 49 | showSecondHand: true 50 | showHandCover: true 51 | showLabel: true 52 | 53 | # This measurement is used frequently below. 54 | ClockRadius = (Clock.size * Clock.scale / 2) 55 | 56 | Face = 57 | radius: ClockRadius 58 | fillColor: "rgba(0,0,0,0.25)" 59 | 60 | FaceImage = 61 | imageObject: dom.find(clockImage)[0] 62 | width: Clock.size * Clock.scale 63 | height: Clock.size * Clock.scale 64 | filename: "clockface1.png" 65 | 66 | MinuteTicks = 67 | outerRadius: ClockRadius 68 | innerRadius: ClockRadius - Clock.scale * 4 69 | degrees: 6 70 | lineWidth: 1 71 | strokeColor: "rgba(255,255,255,0.5)" 72 | 73 | HourTicks = 74 | outerRadius: ClockRadius 75 | innerRadius: ClockRadius - Clock.scale * 4 76 | degrees: 30 77 | lineWidth: 4 78 | strokeColor: "rgba(255,255,255,1)" 79 | 80 | Frame = 81 | outerRadius: ClockRadius 82 | innerRadius: ClockRadius - Clock.scale * 2 83 | fillColor: "rgba(0,0,0,0.25)" 84 | 85 | SecondHand = 86 | length: ClockRadius * 0.75 87 | width: 1 88 | fillColor: "rgba(255,0,0,0.75)" 89 | strokeColor: "rgba(0,0,0,0.5)" 90 | lineWidth:0 91 | shadowOffset: 2 92 | shadowColor: "rgba(0,0,0,0.25)" 93 | shadowBlur: 2 94 | degrees: @degreesToRadians(theDate.getSeconds() * 6) 95 | 96 | MinuteHand = 97 | length: ClockRadius * 0.75 98 | width: 1.5 99 | fillColor: "rgba(0,0,0,0.5)" 100 | strokeColor: "rgba(255,255,255,0.5)" 101 | lineWidth:0 102 | shadowOffset: 2 103 | shadowColor: "rgba(0,0,0,0.25)" 104 | shadowBlur: 2 105 | degrees: @degreesToRadians((theDate.getMinutes() + theDate.getSeconds() / 60) * 6) 106 | 107 | HourHand = 108 | length: ClockRadius * 0.55 109 | width: 1.5 110 | fillColor: "rgba(0,0,0,0.5)" 111 | strokeColor: "rgba(255,255,255,.25)" 112 | lineWidth:0 113 | shadowOffset: 2 114 | shadowColor: "rgba(0,0,0,0.25)" 115 | shadowBlur: 2 116 | degrees: @degreesToRadians(((theDate.getHours() + theDate.getMinutes() / 60) * 360 / 12) % 360) 117 | 118 | HandCover = 119 | radius: HourHand.width * 2 120 | lineWidth: 0 121 | fillColor: "rgba(0,0,0,.15)" 122 | strokeColor: "rgba(0,0,0,1)" 123 | 124 | Label = 125 | labelObject: $(dom.find(clockLabel)[0]) 126 | text: "Central US" 127 | fontFamily: "Helvetica Neue" 128 | fontSize: "6pt" 129 | color: "rgba(255,255,255,0.5)" 130 | textAlign: "center" 131 | background: "rgba(0,0,0,0.125)" 132 | borderColor: "rgba(0,0,0,.125)" 133 | borderWidth: "1px" 134 | borderRadius: "20px" 135 | 136 | # Get a reference to our canvas. 137 | cvs = dom.find(clockCanvas)[0] 138 | 139 | # Set our scale. 140 | cvs.width = Clock.size * Clock.scale 141 | cvs.height = Clock.size * Clock.scale 142 | 143 | # Get our Context and translate it to make the center point of the Canvas our origin. 144 | # Clear the entire canvas each time we run through this. 145 | context = cvs.getContext('2d') 146 | context.translate(cvs.width/2, cvs.height/2) 147 | context.clearRect(cvs.width/2 * -1,cvs.height/2 * -1,cvs.width,cvs.width) 148 | 149 | # Create our clock. 150 | theDate = new Date() 151 | if Clock.showFace then @drawFace(context,Face,Clock.scale) 152 | if Clock.showFaceImage then @showFaceImage(FaceImage) 153 | if Clock.showMinuteTicks then @drawFaceDecorations(context,MinuteTicks,Clock.scale) 154 | if Clock.showHourTicks then @drawFaceDecorations(context,HourTicks,Clock.scale) 155 | if Clock.showFrame then @drawFrame(context,Frame,Clock.scale) 156 | if Clock.showSecondHand then @drawHand(context,theDate,SecondHand,Clock.scale) 157 | if Clock.showMinuteHand then @drawHand(context,theDate,MinuteHand,Clock.scale) 158 | if Clock.showHourHand then @drawHand(context,theDate,HourHand,Clock.scale) 159 | if Clock.showHandCover then @drawHandCover(context,HandCover,Clock.scale) 160 | if Clock.showLabel then @showLabel(Label,Clock.scale) 161 | 162 | # Set the origin back to 0,0. Translate uses relative positioning, which would cause the 163 | # context to continue to move each time the widget runs. 164 | context.translate(cvs.width/2 * -1, cvs.height/2 * -1) 165 | 166 | drawFace: (context,Settings,Scale) -> 167 | # Draw the face of our clock. 168 | context.save() 169 | context.beginPath() 170 | context.arc(0, 0, Settings.radius, 0, 2 * Math.PI, false) 171 | context.fillStyle = Settings.fillColor 172 | context.fill() 173 | context.restore() 174 | 175 | showFaceImage: (Settings) -> 176 | # Show our image. 177 | Settings.imageObject.src = Settings.filename 178 | $(Settings.imageObject).css('position','absolute') 179 | $(Settings.imageObject).css('top','0') 180 | $(Settings.imageObject).css('left','0') 181 | $(Settings.imageObject).width(Settings.width) 182 | $(Settings.imageObject).height(Settings.height) 183 | $(Settings.imageObject).css('display','block') 184 | 185 | drawFrame: (context,Settings,Scale) -> 186 | # Draw the frame of our clock. This is a torus with the outside circle filled and 187 | # the inner one not. 188 | context.save() 189 | context.beginPath() 190 | context.arc(0, 0, Settings.outerRadius, 0, 2 * Math.PI, true) 191 | context.arc(0, 0, Settings.innerRadius, 0, 2 * Math.PI, false) 192 | context.fillStyle = Settings.fillColor 193 | context.fill() 194 | context.restore() 195 | 196 | drawFaceDecorations: (context,Settings,Scale) -> 197 | # Draw the ticks on the clock. 198 | context.save() 199 | context.beginPath() 200 | for d in [1..(360/Settings.degrees)] 201 | context.rotate(@degreesToRadians(Settings.degrees)) 202 | context.moveTo(Settings.innerRadius,0) 203 | context.lineTo(Settings.outerRadius,0) 204 | if Settings.lineWidth > 0 205 | context.lineWidth = Settings.lineWidth * Scale 206 | context.strokeStyle = Settings.strokeColor 207 | context.stroke() 208 | context.restore() 209 | 210 | drawHandCover: (context, Settings, Scale) -> 211 | # Draw a circle over the hands to polish things up. 212 | context.save() 213 | context.beginPath() 214 | context.arc(0, 0, Settings.radius * Scale, 0, 2 * Math.PI, false) 215 | context.fillStyle = Settings.fillColor 216 | context.fill() 217 | if Settings.lineWidth > 0 218 | context.lineWidth = Settings.lineWidth * Scale 219 | context.strokeStyle = Settings.strokeColor 220 | context.stroke() 221 | context.restore() 222 | 223 | drawHand: (context,theDate,Settings,Scale) -> 224 | context.save() 225 | 226 | # Rotate the canvas the appropriate number of degrees. This makes the drawing of the hand much easier. 227 | context.rotate(Settings.degrees) 228 | 229 | # Set our basic colors, etc. 230 | context.fillStyle = Settings.fillColor 231 | context.shadowColor = Settings.shadowColor 232 | context.shadowBlur = Settings.shadowBlur * Scale 233 | context.shadowOffsetX = Settings.shadowOffset * Scale 234 | context.shadowOffsetY = Settings.shadowOffset * Scale 235 | 236 | # Draw the hand. 237 | context.beginPath() 238 | context.arc(0, 0, Settings.width*2*Scale, @degreesToRadians(0), @degreesToRadians(180),false); 239 | context.moveTo(Settings.width*-2*Scale,0) 240 | context.lineTo(Settings.width/2*Scale,Settings.length * -1) 241 | context.lineTo(Settings.width*2*Scale,0) 242 | 243 | if Settings.lineWidth > 0 244 | context.lineWidth = Settings.lineWidth * Scale 245 | context.strokeStyle = Settings.strokeColor 246 | context.stroke() 247 | 248 | context.fill() 249 | context.restore() 250 | 251 | showLabel: (Settings,Scale) -> 252 | Settings.labelObject.html(Settings.text) 253 | Settings.labelObject.css('font-family',Settings.fontFamily) 254 | Settings.labelObject.css('font-size',@scaleUnit(Settings.fontSize,Scale)) 255 | Settings.labelObject.css('color',Settings.color) 256 | Settings.labelObject.css('text-align',Settings.textAlign) 257 | Settings.labelObject.css('background',Settings.background) 258 | Settings.labelObject.css('border-style',"solid") 259 | Settings.labelObject.css('border-color',Settings.borderColor) 260 | Settings.labelObject.css('border-width',@scaleUnit(Settings.borderWidth,Scale)) 261 | Settings.labelObject.css('border-radius',@scaleUnit(Settings.borderRadius,Scale)) 262 | Settings.labelObject.css('display','block') 263 | 264 | degreesToRadians: (degrees) -> 265 | (Math.PI / 180) * degrees 266 | 267 | scaleUnit: (sizeString,Scale) -> 268 | unit = sizeString.match('px|em|%|in|cm|mm|ex|pt|pc') 269 | value = sizeString.match('[0-9]+') 270 | value * Scale + unit -------------------------------------------------------------------------------- /AnalogClock/AnalogClock.widget/AnalogClock-CustomFace.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: 'export TZ="US/Central";date +"%m/%d/%Y %I:%M:%S %p"' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 1000 6 | 7 | # CSS Style 8 | style: """ 9 | top:40px 10 | left:40px 11 | margin:0px 12 | padding:0px 13 | 14 | #clockImage 15 | z-index:-1 16 | display:none 17 | 18 | #clockLabel 19 | display:none 20 | """ 21 | 22 | # Render the output. 23 | render: (output) -> """ 24 | 25 | 26 |
27 | """ 28 | 29 | # Update the rendered output. 30 | update: (output, domEl) -> 31 | 32 | # Get a reference to our DOM. 33 | dom = $(domEl) 34 | 35 | # Convert the date from the output to a Javascript date. 36 | # We do this (rather than using Javascript dates) so that we can use Unix timezones. 37 | theDate = new Date(output) 38 | 39 | # Set our clock settings. 40 | Clock = 41 | size: 100 42 | scale: 2 43 | showFace: false 44 | showFaceImage: true 45 | showHourTicks: true 46 | showMinuteTicks: true 47 | showFrame: true 48 | showHourHand: true 49 | showMinuteHand: true 50 | showSecondHand: true 51 | showHandCover: true 52 | showLabel: false 53 | 54 | # This measurement is used frequently below. 55 | ClockRadius = (Clock.size * Clock.scale / 2) 56 | 57 | Face = 58 | radius: ClockRadius 59 | fillColor: "rgba(0,0,0,0.25)" 60 | 61 | FaceImage = 62 | imageObject: dom.find(clockImage)[0] 63 | width: Clock.size * Clock.scale 64 | height: Clock.size * Clock.scale 65 | filename: "AnalogClock.widget/Faces/ClockFace.png" 66 | 67 | MinuteTicks = 68 | outerRadius: ClockRadius 69 | innerRadius: ClockRadius - Clock.scale * 4 70 | degrees: 6 71 | lineWidth: 1 72 | strokeColor: "rgba(255,255,255,0.5)" 73 | 74 | HourTicks = 75 | outerRadius: ClockRadius 76 | innerRadius: ClockRadius - Clock.scale * 4 77 | degrees: 30 78 | lineWidth: 4 79 | strokeColor: "rgba(255,255,255,1)" 80 | 81 | Frame = 82 | outerRadius: ClockRadius 83 | innerRadius: ClockRadius - Clock.scale * 2 84 | fillColor: "rgba(0,0,0,1)" 85 | 86 | SecondHand = 87 | length: ClockRadius * 0.75 88 | width: 1 89 | fillColor: "rgba(255,0,0,1)" 90 | strokeColor: "rgba(0,0,0,0.5)" 91 | lineWidth:0 92 | shadowOffset: 2 93 | shadowColor: "rgba(0,0,0,0.75)" 94 | shadowBlur: 2 95 | degrees: @degreesToRadians(theDate.getSeconds() * 6) 96 | 97 | MinuteHand = 98 | length: ClockRadius * 0.75 99 | width: 1.5 100 | fillColor: "rgba(0,0,0,1)" 101 | strokeColor: "rgba(255,255,255,1)" 102 | lineWidth:0 103 | shadowOffset: 2 104 | shadowColor: "rgba(0,0,0,0.75)" 105 | shadowBlur: 2 106 | degrees: @degreesToRadians((theDate.getMinutes() + theDate.getSeconds() / 60) * 6) 107 | 108 | HourHand = 109 | length: ClockRadius * 0.55 110 | width: 1.5 111 | fillColor: "rgba(0,0,0,1)" 112 | strokeColor: "rgba(255,255,255,1)" 113 | lineWidth:0 114 | shadowOffset: 2 115 | shadowColor: "rgba(0,0,0,0.75)" 116 | shadowBlur: 2 117 | degrees: @degreesToRadians(((theDate.getHours() + theDate.getMinutes() / 60) * 360 / 12) % 360) 118 | 119 | HandCover = 120 | radius: HourHand.width * 2 121 | lineWidth: 0 122 | fillColor: "rgba(0,0,0,1)" 123 | strokeColor: "rgba(0,0,0,1)" 124 | 125 | Label = 126 | labelObject: $(dom.find(clockLabel)[0]) 127 | text: "Central US" 128 | fontFamily: "Helvetica Neue" 129 | fontSize: "6pt" 130 | color: "rgba(255,255,255,0.5)" 131 | textAlign: "center" 132 | background: "rgba(0,0,0,0.125)" 133 | borderColor: "rgba(0,0,0,.125)" 134 | borderWidth: "1px" 135 | borderRadius: "20px" 136 | 137 | # Get a reference to our canvas. 138 | cvs = dom.find(clockCanvas)[0] 139 | 140 | # Set our scale. 141 | cvs.width = Clock.size * Clock.scale 142 | cvs.height = Clock.size * Clock.scale 143 | 144 | # Get our Context and translate it to make the center point of the Canvas our origin. 145 | # Clear the entire canvas each time we run through this. 146 | context = cvs.getContext('2d') 147 | context.translate(cvs.width/2, cvs.height/2) 148 | context.clearRect(cvs.width/2 * -1,cvs.height/2 * -1,cvs.width,cvs.width) 149 | 150 | # Create our clock. 151 | theDate = new Date() 152 | if Clock.showFace then @drawFace(context,Face,Clock.scale) 153 | if Clock.showFaceImage then @showFaceImage(FaceImage) 154 | if Clock.showMinuteTicks then @drawFaceDecorations(context,MinuteTicks,Clock.scale) 155 | if Clock.showHourTicks then @drawFaceDecorations(context,HourTicks,Clock.scale) 156 | if Clock.showFrame then @drawFrame(context,Frame,Clock.scale) 157 | if Clock.showSecondHand then @drawHand(context,theDate,SecondHand,Clock.scale) 158 | if Clock.showMinuteHand then @drawHand(context,theDate,MinuteHand,Clock.scale) 159 | if Clock.showHourHand then @drawHand(context,theDate,HourHand,Clock.scale) 160 | if Clock.showHandCover then @drawHandCover(context,HandCover,Clock.scale) 161 | if Clock.showLabel then @showLabel(Label,Clock.scale) 162 | 163 | # Set the origin back to 0,0. Translate uses relative positioning, which would cause the 164 | # context to continue to move each time the widget runs. 165 | context.translate(cvs.width/2 * -1, cvs.height/2 * -1) 166 | 167 | drawFace: (context,Settings,Scale) -> 168 | # Draw the face of our clock. 169 | context.save() 170 | context.beginPath() 171 | context.arc(0, 0, Settings.radius, 0, 2 * Math.PI, false) 172 | context.fillStyle = Settings.fillColor 173 | context.fill() 174 | context.restore() 175 | 176 | showFaceImage: (Settings) -> 177 | # Show our image. 178 | Settings.imageObject.src = Settings.filename 179 | $(Settings.imageObject).css('position','absolute') 180 | $(Settings.imageObject).css('top','0') 181 | $(Settings.imageObject).css('left','0') 182 | $(Settings.imageObject).width(Settings.width) 183 | $(Settings.imageObject).height(Settings.height) 184 | $(Settings.imageObject).css('display','block') 185 | 186 | drawFrame: (context,Settings,Scale) -> 187 | # Draw the frame of our clock. This is a torus with the outside circle filled and 188 | # the inner one not. 189 | context.save() 190 | context.beginPath() 191 | context.arc(0, 0, Settings.outerRadius, 0, 2 * Math.PI, true) 192 | context.arc(0, 0, Settings.innerRadius, 0, 2 * Math.PI, false) 193 | context.fillStyle = Settings.fillColor 194 | context.fill() 195 | context.restore() 196 | 197 | drawFaceDecorations: (context,Settings,Scale) -> 198 | # Draw the ticks on the clock. 199 | context.save() 200 | context.beginPath() 201 | for d in [1..(360/Settings.degrees)] 202 | context.rotate(@degreesToRadians(Settings.degrees)) 203 | context.moveTo(Settings.innerRadius,0) 204 | context.lineTo(Settings.outerRadius,0) 205 | if Settings.lineWidth > 0 206 | context.lineWidth = Settings.lineWidth * Scale 207 | context.strokeStyle = Settings.strokeColor 208 | context.stroke() 209 | context.restore() 210 | 211 | drawHandCover: (context, Settings, Scale) -> 212 | # Draw a circle over the hands to polish things up. 213 | context.save() 214 | context.beginPath() 215 | context.arc(0, 0, Settings.radius * Scale, 0, 2 * Math.PI, false) 216 | context.fillStyle = Settings.fillColor 217 | context.fill() 218 | if Settings.lineWidth > 0 219 | context.lineWidth = Settings.lineWidth * Scale 220 | context.strokeStyle = Settings.strokeColor 221 | context.stroke() 222 | context.restore() 223 | 224 | drawHand: (context,theDate,Settings,Scale) -> 225 | context.save() 226 | 227 | # Rotate the canvas the appropriate number of degrees. This makes the drawing of the hand much easier. 228 | context.rotate(Settings.degrees) 229 | 230 | # Set our basic colors, etc. 231 | context.fillStyle = Settings.fillColor 232 | context.shadowColor = Settings.shadowColor 233 | context.shadowBlur = Settings.shadowBlur * Scale 234 | context.shadowOffsetX = Settings.shadowOffset * Scale 235 | context.shadowOffsetY = Settings.shadowOffset * Scale 236 | 237 | # Draw the hand. 238 | context.beginPath() 239 | context.arc(0, 0, Settings.width*2*Scale, @degreesToRadians(0), @degreesToRadians(180),false); 240 | context.moveTo(Settings.width*-2*Scale,0) 241 | context.lineTo(Settings.width/2*Scale,Settings.length * -1) 242 | context.lineTo(Settings.width*2*Scale,0) 243 | 244 | if Settings.lineWidth > 0 245 | context.lineWidth = Settings.lineWidth * Scale 246 | context.strokeStyle = Settings.strokeColor 247 | context.stroke() 248 | 249 | context.fill() 250 | context.restore() 251 | 252 | showLabel: (Settings,Scale) -> 253 | Settings.labelObject.html(Settings.text) 254 | Settings.labelObject.css('font-family',Settings.fontFamily) 255 | Settings.labelObject.css('font-size',@scaleUnit(Settings.fontSize,Scale)) 256 | Settings.labelObject.css('color',Settings.color) 257 | Settings.labelObject.css('text-align',Settings.textAlign) 258 | Settings.labelObject.css('background',Settings.background) 259 | Settings.labelObject.css('border-style',"solid") 260 | Settings.labelObject.css('border-color',Settings.borderColor) 261 | Settings.labelObject.css('border-width',@scaleUnit(Settings.borderWidth,Scale)) 262 | Settings.labelObject.css('border-radius',@scaleUnit(Settings.borderRadius,Scale)) 263 | Settings.labelObject.css('display','block') 264 | 265 | degreesToRadians: (degrees) -> 266 | (Math.PI / 180) * degrees 267 | 268 | scaleUnit: (sizeString,Scale) -> 269 | unit = sizeString.match('px|em|%|in|cm|mm|ex|pt|pc') 270 | value = sizeString.match('[0-9]+') 271 | value * Scale + unit -------------------------------------------------------------------------------- /AnalogClock/AnalogClock.widget/Faces/ClockFace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/AnalogClock/AnalogClock.widget/Faces/ClockFace.png -------------------------------------------------------------------------------- /AnalogClock/ReadMe.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- 2 | Widget: Analog Clock 3 | Author: Chris Johnson 4 | -------------------------------------------------------------------------------- 5 | 6 | -------------------------------------------------------------------------------- 7 | Features 8 | -------------------------------------------------------------------------------- 9 | Multiple versions of the clock can be run at the same time, allowing one to have 10 | multiple timezones displayed. 11 | 12 | The following options can be customized on the clock. 13 | 14 | Timezone -- Any Unix timezone can be specified. With no timezone specified, 15 | it will default to the local timezone. 16 | 17 | Clock Size -- The clock can be scaled to any size. 18 | 19 | Clock Face -- The code-driven clock face can be customized as desired. Alternatively, 20 | a custom image can be used instead of (or in addition to the clock face). 21 | 22 | Hands -- The hands can be completely customized, including sizes, colors, etc. 23 | 24 | 25 | -------------------------------------------------------------------------------- 26 | Clock Size/Scale 27 | -------------------------------------------------------------------------------- 28 | Most of the features of the clock can be manipulated by changing the "Settings" 29 | objects (Clock, Face, etc.). Most of the settings are intuitive. Others are explained 30 | easily by making changes and looking at how they affect the clock. 31 | 32 | There are, however, a couple settings that require some explanation: 33 | 34 | Clock.size: 100 35 | Clock.scale: 2 36 | 37 | The overall size of the clock is determined by Size * Scale. This allows us 38 | to scale all of the elements on the clock as desired. 39 | 40 | Size is the baseline measurement, and Scale is applied to all heights/widths/etc. 41 | on the clock. 42 | 43 | -------------------------------------------------------------------------------- 44 | Changing Timezones 45 | -------------------------------------------------------------------------------- 46 | The timezones are set with the Unix command. For example: 47 | 48 | command: 'export TZ="US/Central";date +"%m/%d/%Y %I:%M:%S %p"' 49 | 50 | will show the clock in US Central time. If you wish to show the clock in another 51 | timezone, you can use any of the Unix-supported values (Valid values are relative to 52 | /usr/share/zoneinfo) These can be found with the following shell command: 53 | 54 | find /usr/share/zoneinfo -type f 55 | 56 | If you wish to use your local timezone, you can simply eliminate the timezone 57 | from the command: 58 | 59 | command: 'date +"%m/%d/%Y %I:%M:%S %p"' 60 | 61 | -------------------------------------------------------------------------------- 62 | Clock Face Image 63 | -------------------------------------------------------------------------------- 64 | To display an image on the face of the clock, change the following two settings: 65 | 66 | Set FaceImage.filename to an image file in the clock's widget directory 67 | Set Clock.showFaceImage to true 68 | 69 | -------------------------------------------------------------------------------- /AnalogClock/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/AnalogClock/screenshot.png -------------------------------------------------------------------------------- /AnalogClock/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Analog Clock", 3 | "description" : "A fully customizable analog clock. Two example clocks are included. Please see the ReadMe document for more details.", 4 | "author" : "Chris Johnson", 5 | "email" : "Chris.1@nosnhoj.com" 6 | } 7 | -------------------------------------------------------------------------------- /BackgroundGrid/BackgroundGrid.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/BackgroundGrid/BackgroundGrid.widget.zip -------------------------------------------------------------------------------- /BackgroundGrid/BackgroundGrid.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: '' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 86400000 6 | 7 | # Render the output. 8 | render: (output) -> """ 9 | 10 | 11 | 12 | """ 13 | 14 | # Update the rendered output. 15 | update: (output, domEl) -> 16 | 17 | #-------------------------------------------------------------------------------- 18 | # User-Defined Properties 19 | #-------------------------------------------------------------------------------- 20 | 21 | # Background 22 | Background = 23 | visible: true 24 | color: "rgba(102,128,153,1)" 25 | 26 | # Major Grid 27 | Major = 28 | visible: true 29 | xSpacing: 50 30 | ySpacing: 50 31 | lineSize: 1 32 | dashSize: 0 33 | gridColor: "rgba(255, 255, 255, 0.25)" 34 | showMeasures: true 35 | textColor: "rgba(255, 255, 255, 0.50)" 36 | font: "9pt Helvetica Neue" 37 | 38 | # Minor Grid 39 | Minor = 40 | visible: true 41 | gridDivisions: 5 42 | lineSize: 1 43 | dashSize: 0 44 | gridColor: "rgba(255, 255, 255, 0.10)" 45 | 46 | #-------------------------------------------------------------------------------- 47 | # Main Code 48 | #-------------------------------------------------------------------------------- 49 | 50 | # Get our main DIV. 51 | div = $(domEl) 52 | 53 | # Set the width and height of each canvas. 54 | canvases = div.find('canvas') 55 | for c in canvases 56 | c.width = div.width() 57 | c.height = div.height() 58 | 59 | # Get our contexts. 60 | backgroundCtx = backgroundCanvas.getContext('2d') 61 | majorCtx = majorGridCanvas.getContext('2d') 62 | minorCtx = minorGridCanvas.getContext('2d') 63 | 64 | # Create the background. 65 | if Background.visible 66 | backgroundCtx.rect(0,0,div.width(),div.height()) 67 | backgroundCtx.fillStyle = Background.color 68 | backgroundCtx.fill() 69 | 70 | # Create the major grid. 71 | if Major.visible 72 | 73 | # Set the font settings for the measures. 74 | majorCtx.fillStyle = Major.textColor 75 | majorCtx.font = Major.font 76 | 77 | # Loop from 0 to the width of our main div and draw the vertical lines. 78 | for x in [0..div.width()] by Major.xSpacing 79 | majorCtx.moveTo(x+.5,0); 80 | majorCtx.lineTo(x+.5,div.height()); 81 | if Major.showMeasures then majorCtx.fillText(x,x+2,12); 82 | 83 | # Loop from 0 to the width of our main div and draw the horizontal lines. 84 | for y in [0..div.height()] by Major.ySpacing 85 | majorCtx.moveTo(0,y+.5); 86 | majorCtx.lineTo(div.width(),y+.5); 87 | if Major.showMeasures && y > 0 then majorCtx.fillText(y,2,y+12); 88 | 89 | # Set the line formatting and stroke the lines. 90 | if Major.dashSize > 0 then majorCtx.setLineDash([Major.dashSize]) 91 | majorCtx.lineWidth = Major.lineSize; 92 | majorCtx.strokeStyle = Major.gridColor 93 | majorCtx.stroke(); 94 | 95 | # Create the minor grid. 96 | if Minor.visible 97 | 98 | # Loop from 0 to the width of our main div and draw the vertical lines. 99 | for x in [0..div.width()] by Major.xSpacing / Minor.gridDivisions 100 | minorCtx.moveTo(x+.5,0); 101 | minorCtx.lineTo(x+.5,div.height()); 102 | 103 | # Loop from 0 to the width of our main div and draw the horizontal lines. 104 | for y in [0..div.height()] by Major.ySpacing / Minor.gridDivisions 105 | minorCtx.moveTo(0,y+.5); 106 | minorCtx.lineTo(div.width(),y+.5); 107 | 108 | # Set the line formatting and stroke the lines. 109 | if Minor.dashSize > 0 then minorCtx.setLineDash([Minor.dashSize]) 110 | minorCtx.lineWidth = Minor.lineSize; 111 | minorCtx.strokeStyle = Minor.gridColor 112 | minorCtx.stroke(); 113 | 114 | # CSS Style 115 | style: """ 116 | top: 0 117 | left: 0 118 | width:100% 119 | height:100% 120 | margin:0px 121 | padding:0px 122 | z-index:-999 123 | 124 | #majorGridCanvas, #minorGridCanvas, #backgroundCanvas 125 | position:absolute 126 | top:0 127 | left:0 128 | """ 129 | -------------------------------------------------------------------------------- /BackgroundGrid/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/BackgroundGrid/screenshot.png -------------------------------------------------------------------------------- /BackgroundGrid/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Background Grid", 3 | "description" : "A fully customizable full-screen grid.", 4 | "author" : "Chris Johnson", 5 | "email" : "Chris.1@nosnhoj.com" 6 | } 7 | -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/NetworkInfo.widget.zip -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/NetworkInfo.coffee: -------------------------------------------------------------------------------- 1 | #-------------------------------------------------------------------------------------- 2 | # Please Read 3 | #-------------------------------------------------------------------------------------- 4 | # The images used in this widget are from the Noun Project (http://thenounproject.com). 5 | # 6 | # They were created by the following individuals: 7 | # Ethernet by Michael Anthony from The Noun Project 8 | # Wireless by Piotrek Chuchla from The Noun Project 9 | # 10 | #-------------------------------------------------------------------------------------- 11 | 12 | # Execute the shell command. 13 | command: "NetworkInfo.widget/NetworkInfo.sh" 14 | 15 | # Set the refresh frequency (milliseconds). 16 | refreshFrequency: 5000 17 | 18 | # Render the output. 19 | render: (output) -> """ 20 |
21 |
22 |

23 |

24 |
25 |
26 |

27 |

28 |
29 |
30 | """ 31 | 32 | # Update the rendered output. 33 | update: (output, domEl) -> 34 | dom = $(domEl) 35 | 36 | # Parse the JSON created by the shell script. 37 | data = JSON.parse output 38 | html = "" 39 | 40 | # Loop through the services in the JSON. 41 | for svc in data.service 42 | 43 | disabled = svc.ipaddress == "" 44 | el = $('#'+svc.name) 45 | el.find('.primaryInfo').text(svc.ipaddress || 'NotConnected') 46 | el.find('.secondaryInfo').text(if !disabled then svc.macaddress else '') 47 | el.toggleClass('disabled', disabled) 48 | 49 | 50 | # CSS Style 51 | style: """ 52 | margin:0 53 | padding:0px 54 | left:10px 55 | top: 10px 56 | background:rgba(#000, .25) 57 | border:1px solid rgba(#000, .25) 58 | border-radius:10px 59 | 60 | #wi-fi 61 | background: url(/NetworkInfo.widget/images/wi-fi.png) 62 | 63 | &.disabled 64 | background: url(/NetworkInfo.widget/images/wi-fi_disabled.png) 65 | 66 | #ethernet 67 | background: url(/NetworkInfo.widget/images/ethernet.png) 68 | 69 | &.disabled 70 | background: url(/NetworkInfo.widget/images/ethernet_disabled.png) 71 | 72 | #wi-fi, #ethernet, #wi-fi.disabled, #ethernet.disabled 73 | height: 40px 74 | width: 100px 75 | float: left 76 | background-position: center 5px 77 | background-repeat: no-repeat 78 | background-size: 32px 32px 79 | 80 | .service 81 | text-align: center 82 | padding: 35px 2px 2px 2px 83 | 84 | .primaryInfo, .secondaryInfo 85 | font-family: Helvetica Neue 86 | padding:0px 87 | margin:2px 88 | 89 | .primaryInfo 90 | font-size:10pt 91 | font-weight:bold 92 | color: rgba(#000,0.75) 93 | 94 | .secondaryInfo 95 | font-size:8pt 96 | color: rgba(#000, 0.5) 97 | 98 | .disabled p 99 | color: rgba(#000, 0.35) 100 | """ 101 | -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/NetworkInfo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This function will start our JSON text. 4 | startJSON() { 5 | echo '{' 6 | echo ' "service" : [' 7 | } 8 | 9 | # This function will return a single block of JSON for a single service. 10 | exportService() { 11 | echo ' {' 12 | echo ' "name":"'$1'",' 13 | echo ' "ipaddress":"'${ip}'",' 14 | echo ' "macaddress":"'${mac}'"' 15 | echo ' }' 16 | } 17 | 18 | # This function will finish our JSON text. 19 | endJSON() { 20 | echo ' ]' 21 | echo '}' 22 | } 23 | 24 | # Start the JSON. 25 | startJSON 26 | 27 | # Output the Ethernet information. 28 | ip=$(networksetup -getinfo ethernet | grep -Ei '(^IP address:)' | awk '{print $3}') 29 | mac=$(networksetup -getinfo ethernet | grep -Ei '(^Ethernet address:)' | awk '{print $3}') 30 | if [ "$ip" = "" ];then 31 | if networksetup -listallnetworkservices | grep -qEi '^Display Ethernet'; then 32 | service="Display Ethernet" 33 | else 34 | service="Thunderbolt Ethernet" 35 | fi 36 | 37 | ip=$(networksetup -getinfo "$service" | grep -Ei '(^IP address:)' | awk '{print $3}') 38 | mac=$(networksetup -getinfo "$service" | grep -Ei '(^Ethernet address:)' | awk '{print $3}') 39 | fi 40 | exportService "ethernet" 41 | 42 | # Place a comma between services. 43 | echo ' ,' 44 | 45 | # Output the Wi-Fi information. 46 | ip=$(networksetup -getinfo wi-fi | grep -Ei '(^IP address:)' | awk '{print $3}') 47 | mac=$(networksetup -getinfo wi-fi | grep -Ei '(^Wi-Fi ID:)' | awk '{print $3}') 48 | exportService "wi-fi" 49 | 50 | # End the JSON 51 | endJSON 52 | -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/images/ethernet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/NetworkInfo.widget/images/ethernet.png -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/images/ethernet_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/NetworkInfo.widget/images/ethernet_disabled.png -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/images/wi-fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/NetworkInfo.widget/images/wi-fi.png -------------------------------------------------------------------------------- /NetworkInfo/NetworkInfo.widget/images/wi-fi_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/NetworkInfo.widget/images/wi-fi_disabled.png -------------------------------------------------------------------------------- /NetworkInfo/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/NetworkInfo/screenshot.png -------------------------------------------------------------------------------- /NetworkInfo/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "NetworkInfo", 3 | "description" : "Displays current Ethernet and Wi-Fi status (connected / not connected / IP Address / Mac Address.", 4 | "author" : "Chris Johnson", 5 | "email" : "Chris.1@nosnhoj.com" 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Widgets for [Übersicht](http://tracesof.net/uebersicht/) 2 | 3 | > UPDATE: widgets now live in their own github repo. The old format is still supported, but will be phased out soon. 4 | 5 | Got a widget to share? Great, create a **github repo** for it, then [open an issue here](https://github.com/felixhageloh/uebersicht-widgets/issues) and be sure to mention the url. 6 | It will get picked up ASAP! 7 | 8 | ### Note: 9 | 10 | Since tweaking the look of a widget is fun and easy, the widget gallery is probably the most useful if it serves as starting point instead of being a comprehensive list of all possible widgets. For this reason we try to keep the widget gallery as focused as possible. This means, instead of adding new widgets that are very similar to an existing widget, we try to encourage people to make a pull requests with their improvements (these could be technical improvements or style/design improvements). 11 | 12 | ## Widget format 13 | 14 | Your repo should contain at least these three files: 15 | 16 | * `widget.json` a widget manifest 17 | * `.widget.zip` a zip archive containing your widget 18 | * `screenshot.png` an image showing your widget in action 19 | 20 | It is also advised that you include an unzipped version of your widget, so that people can view the code and/or issue pull requests with improvements. 21 | 22 | ### widget.json 23 | 24 | A small manifest file that describes your widget. It should have the following format: 25 | 26 | { 27 | "name": "name of your widget", 28 | "description": "a short(!) description", 29 | "author": "your name", 30 | "email": "your email address" 31 | } 32 | 33 | ### widget-name.widget.zip 34 | 35 | This is the actual widget, which is a zipped folder with the name of your widget and a .widget extension. The contents of the folder are usually just the .js or .coffee file with your widget code (you can call it anything you like, but using the name your widget seems like a good choice). If your widget needs any other assets such as images, fonts or even binaries, you can include them here. 36 | 37 | 38 | ### screenshot 39 | 40 | > IMPORTANT: make sure your screen shot is 258x160px (516x320px for hi-res). Otherwise it will get scaled, squashed and/or squeezed in the widgets gallery. 41 | 42 | An image file in any web format you like, showing a screen shot of your widget. Currently, screen shots are displayed at 258x160px. For best results you can provide a 516x320px image for retina resolution. 43 | 44 | #### Still have questions? You can start by checking existing widgets for examples. 45 | 46 | Also visit the [documentation](https://github.com/felixhageloh/uebersicht). 47 | -------------------------------------------------------------------------------- /SimpleDate/SimpleDate.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/SimpleDate/SimpleDate.widget.zip -------------------------------------------------------------------------------- /SimpleDate/index.coffee: -------------------------------------------------------------------------------- 1 | command: "date +%A,%B,%e,%Y" 2 | 3 | refreshFrequency: 50000 4 | 5 | style: """ 6 | /* Modify Colors and Size Here:*/ 7 | 8 | size = 800px //This is just a base for the overall size so everything stays centered 9 | 10 | width: size 11 | margin-left: -.5 * size //Set left edge of widget to be center so it can be easily centered on the page 12 | text-align: center 13 | 14 | 15 | height: 130px 16 | margin-top: -.5 * 130px 17 | vertical-align: middle 18 | 19 | 20 | /*POSITION*/ 21 | top: 50% 22 | left: 50% 23 | 24 | /*COLORS*/ 25 | primaryColor = rgba(255,255,255,0.55) 26 | secondaryColor = rgba(255,255,255,0.35) 27 | 28 | 29 | font-family: Helvetica Neue 30 | font-weight: 100 31 | font-size: 46px 32 | 33 | #main 34 | color: primaryColor 35 | font-size: 64px 36 | 37 | #suffix 38 | color: primaryColor 39 | font-weight: 100 40 | margin-left: -15px //Forces suffix to be closer to numDate 41 | 42 | #secondary 43 | font-weight: 100 44 | color: secondaryColor 45 | """ 46 | 47 | 48 | render: (output) -> """ 49 |
50 | 51 | 52 |
53 |
54 | 55 | """ 56 | 57 | 58 | update: (output) -> 59 | dateInfo = output.split(',') 60 | 61 | day = dateInfo[0] 62 | month = dateInfo[1] 63 | numDate = parseInt(dateInfo[2]) 64 | year = dateInfo[3] 65 | 66 | secondDigit = numDate%10 67 | 68 | # This switch determines the appropriate suffix for the numDate: 69 | suffix = switch 70 | when numDate is 1 then 'st' 71 | when numDate is 2 then 'nd' 72 | when numDate is 3 then 'rd' 73 | when numDate < 21 then 'th' 74 | when numDate is 21 then 'st' 75 | when numDate is 22 then 'nd' 76 | when numDate is 23 then 'rd' 77 | when numDate < 31 then 'th' 78 | when numDate is 31 then 'st' 79 | else 'ERROR' 80 | 81 | top = day+" the "+numDate 82 | bottom = month+", "+year 83 | 84 | $('#main').text top #Add day and numDate to main 85 | $('#suffix').text suffix #Add suffix to numDate 86 | $('#secondary').text bottom #Add month and year to secondary 87 | 88 | -------------------------------------------------------------------------------- /SimpleDate/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/SimpleDate/screenshot.png -------------------------------------------------------------------------------- /SimpleDate/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SimpleDate", 3 | "description": "A widget that displays the current date", 4 | "author": "Spencer Kaiser – @spencerkaiser on GitHub", 5 | "email": "skaiser@me.com" 6 | } -------------------------------------------------------------------------------- /Spotify-Current-Track/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/Spotify-Current-Track/screenshot.png -------------------------------------------------------------------------------- /Spotify-Current-Track/spotify-current-track.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/Spotify-Current-Track/spotify-current-track.widget.zip -------------------------------------------------------------------------------- /Spotify-Current-Track/spotify-current-track.widget/README.md: -------------------------------------------------------------------------------- 1 | Ubersicht-Spotify-widget 2 | ========================== 3 | 4 | Using Ubersicht displays current track palying in spotify on you desktop. 5 | 6 | Link to Ubersicht http://tracesof.net/uebersicht/#comment-1445259628 7 | 8 | Drop SpotifyCurrentTrack.coffee in you Ubersicht widgets folder and away you go! 9 | 10 | You may need to adjust the "top" and "left" position to suite your display 11 | 12 | 13 | -------------------------------------------------------------------------------- /Spotify-Current-Track/spotify-current-track.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: """ 2 | read -r running <<<"$(ps -ef | grep \"MacOS/Spotify\" | grep -v \"grep\" | wc -l)" && 3 | test $running != 0 && 4 | IFS='|' read -r theArtist theName <<<"$(osascript <<<'tell application "Spotify" 5 | set theTrack to current track 6 | set theArtist to artist of theTrack 7 | set theName to name of theTrack 8 | return theArtist & "|" & theName 9 | end tell')" && 10 | if [ -z "$theArtist" ] 11 | then 12 | echo "" 13 | else 14 | echo "$theArtist - $theName" || echo "Not Connected To Spotify" 15 | fi 16 | """ 17 | 18 | refreshFrequency: 2000 19 | 20 | style: """ 21 | bottom: 10px 22 | left: 10px 23 | color: #fff 24 | 25 | .output 26 | font-family: Helvetica Neue 27 | font-size: 30px 28 | font-weight: 100 29 | text-shadow: 0 1px 5px #000000; 30 | """ 31 | 32 | render: (output) -> """ 33 |
#{output}
34 | """ 35 | -------------------------------------------------------------------------------- /Spotify-Current-Track/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SpotifyCurrentTrack", 3 | "description": "Displays current track palying in spotify", 4 | "author": "ThomasBrace", 5 | "email": "thomas@thomasbrace.com" 6 | } -------------------------------------------------------------------------------- /Today/Today.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/Today/Today.widget.zip -------------------------------------------------------------------------------- /Today/Today.widget/TodayIn.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: 'curl -s "http://www.history.com/this-day-in-history/rss"' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 7200000 6 | 7 | # Render the output. 8 | render: (output) -> """ 9 |
10 |
11 |
12 | 13 | """ 14 | 15 | # Update the rendered output. 16 | update: (output, domEl) -> 17 | dom = $(domEl) 18 | 19 | # Parse our XML. 20 | xml = jQuery.parseXML(output) 21 | $xml = $(xml) 22 | 23 | # Get the item we care about. 24 | theItem = ($xml.find('rss').find('channel').find('item')) 25 | 26 | # Get the title and the description from the item. 27 | theTitle = theItem.find('title')[0].childNodes[0].data.split(':') 28 | theDescription = theItem.find('description')[0].childNodes[0].data 29 | 30 | # Spit out the date and the title. 31 | theDate = new Date(theTitle[0]) 32 | theDate = 'Today in ' + theDate.getFullYear() 33 | theTitle = theTitle[1] 34 | 35 | # Output the variables. 36 | dom.find(date).html(theDate) 37 | dom.find(title).html(theTitle) 38 | dom.find(description).html(theDescription) 39 | 40 | # Find the total number of paragraphs in the description. 41 | parCount = dom.find(description).find('p').length 42 | 43 | # If there is more than one, replace the Description with just the first paragraph 44 | # and set the footer to reflect that more information is available on the website. 45 | # We grab the innerHTML to avoid the "

" tags in the feed. 46 | if parCount > 0 47 | dom.find(description).html(dom.find(description).find('p')[0].innerHTML) 48 | dom.find(footer).html('Read ' + parCount + ' more paragraphs at http://www.history.com/this-day-in-history') 49 | 50 | # CSS Style 51 | style: """ 52 | top:480px 53 | left: 20px 54 | width:400px 55 | margin:0px 56 | padding:0px 57 | background:rgba(#FFF, 0.5) 58 | border:2px solid rgba(#000, 0.5) 59 | border-radius:10px 60 | overflow:hidden 61 | 62 | #date 63 | margin:12pt 64 | margin-bottom:0 65 | font-family: Helvetica 66 | font-size: 42pt 67 | font-weight:bold 68 | color: rgba(#FFF, 0.75) 69 | 70 | #title 71 | margin-left:12pt 72 | margin-right:12pt 73 | xxmargin-bottom:-10pt 74 | font-family: American Typewriter 75 | font-size: 20pt 76 | font-weight:bold 77 | 78 | #description 79 | margin-left:12pt 80 | margin-right:12pt 81 | font-family: American Typewriter 82 | font-size: 12pt 83 | line-height:18pt 84 | max-height:124pt 85 | overflow:hidden 86 | hyphens: auto 87 | 88 | #footer 89 | font-family: Helvetica 90 | font-size: 9pt 91 | margin:12pt 92 | color: rgba(#000, 0.5) 93 | """ 94 | -------------------------------------------------------------------------------- /Today/Today.widget/TodayIs.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: '' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 7200000 6 | 7 | # Render the output. 8 | render: (output) -> """ 9 |

Today Is
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
0
Sunday
January0000
21 | """ 22 | 23 | # Update the rendered output. 24 | update: (output, domEl) -> 25 | dom = $(domEl) 26 | 27 | # Get today's date information. 28 | theDate = new Date() 29 | theYear = theDate.getFullYear() 30 | theMonth = theDate.getMonth() 31 | theMonthName = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][theMonth] 32 | theDay = theDate.getDay() 33 | theDayName = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][theDay] 34 | theDayNumber = theDate.getDate() 35 | 36 | # Update the table with the date information. 37 | dom.find(year).html(theYear) 38 | dom.find(monthName).html(theMonthName) 39 | dom.find(dayName).html(theDayName) 40 | dom.find(dayNumber).html(theDayNumber) 41 | 42 | # CSS Style 43 | style: """ 44 | top: 20px 45 | left: 20px 46 | width:400px 47 | margin:0px 48 | padding:0px 49 | background:rgba(#FFF, 0.5) 50 | border:2px solid rgba(#000, 0.5) 51 | border-radius:10px 52 | overflow:hidden 53 | 54 | #dateTable 55 | width:100% 56 | background:rgba(255,255,255,0.5) 57 | 58 | #heading 59 | margin:12pt 60 | font-family: Helvetica 61 | font-size: 42pt 62 | font-weight:bold 63 | color: rgba(#FFF, 0.75) 64 | 65 | #dayNumber 66 | margin-left:12pt 67 | margin-right:12pt 68 | font-family: American Typewriter 69 | font-size: 160pt 70 | font-weight:bold 71 | text-align:center 72 | 73 | #dayName, #monthName, #year 74 | padding-left:12pt 75 | padding-right:12pt 76 | font-family: Helvetica 77 | font-weight:bold 78 | font-size: 18pt 79 | 80 | #monthName, #year 81 | padding-bottom:12pt 82 | 83 | #year 84 | text-align:right 85 | 86 | 87 | """ 88 | -------------------------------------------------------------------------------- /Today/Today.widget/TodaysNews.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: 'curl -s "http://mf.feeds.reuters.com/reuters/UKTopNews"' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 300000 6 | 7 | # Render the output. 8 | render: (output) -> """ 9 |
Today's News
10 |
11 |
12 | 13 | """ 14 | 15 | # Update the rendered output. 16 | update: (output, domEl) -> 17 | dom = $(domEl) 18 | 19 | # Parse our XML. 20 | xml = jQuery.parseXML(output) 21 | $xml = $(xml) 22 | 23 | # Get the item we care about. 24 | theItem = ($xml.find('rss').find('channel').find('item')) 25 | window.todaysNewsMaxStories = theItem.find('title').length 26 | window.todaysNewsCurrentStory = 0 27 | 28 | @showStory(theItem,dom,window) 29 | 30 | # Set the interval. We store the value in a window variable so we can clear it 31 | # each time the widget is refreshed. 32 | clearInterval(window.todaysNewsInterval) 33 | window.todaysNewsInterval = setInterval (=> @showStory(theItem,dom,window)),10000 34 | 35 | showStory: (theItem,dom,win)-> 36 | 37 | win.todaysNewsCurrentStory += 1 38 | if win.todaysNewsCurrentStory > win.todaysNewsMaxStories 39 | win.todaysNewsCurrentStory = 0 40 | 41 | # Get the title and the description from the item. 42 | theTitle = theItem.find('title')[win.todaysNewsCurrentStory].childNodes[0].data.split(':') 43 | theDescription = theItem.find('description')[win.todaysNewsCurrentStory].childNodes[0].data 44 | theDate = theItem.find('pubDate')[win.todaysNewsCurrentStory].childNodes[0].data 45 | 46 | # Convert the date to the local timezone. 47 | theDate = new Date(theDate) 48 | 49 | # Output the variables. 50 | dom.find(title).html(theTitle) 51 | dom.find(description).html(theDescription) 52 | dom.find(footer).html(theDate + ' (Story ' + win.todaysNewsCurrentStory + ' of ' + win.todaysNewsMaxStories + ')') 53 | 54 | # Trim out the extra information from the description. 55 | dom.find(description).html(dom.find(description)[0].childNodes[0]) 56 | 57 | # CSS Style 58 | style: """ 59 | top: 20px 60 | left: 440px 61 | width:400px 62 | margin:0px 63 | padding:0px 64 | background:rgba(#FFF, 0.5) 65 | border:2px solid rgba(#000, 0.5) 66 | border-radius:10px 67 | overflow:hidden 68 | 69 | #heading 70 | margin:12pt 71 | margin-bottom:0 72 | font-family: Helvetica 73 | font-size: 42pt 74 | font-weight:bold 75 | color: rgba(#FFF, 0.75) 76 | 77 | #title 78 | margin-left:12pt 79 | margin-right:12pt 80 | xxmargin-bottom:-10pt 81 | font-family: American Typewriter 82 | font-size: 20pt 83 | font-weight:bold 84 | 85 | #description 86 | margin-left:12pt 87 | margin-right:12pt 88 | font-family: American Typewriter 89 | font-size: 12pt 90 | line-height:18pt 91 | max-height:120pt 92 | overflow:hidden 93 | hyphens: auto 94 | 95 | #footer 96 | font-family: Helvetica 97 | font-size: 9pt 98 | margin:12pt 99 | color: rgba(#000, 0.5) 100 | """ 101 | -------------------------------------------------------------------------------- /Today/Today.widget/TodaysWord.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: 'curl -s "http://wordsmith.org/awad/rss1.xml"' 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 7200000 6 | 7 | # Render the output. 8 | render: (output) -> """ 9 |
10 |
11 |
12 | 13 | """ 14 | 15 | # Update the rendered output. 16 | update: (output, domEl) -> 17 | dom = $(domEl) 18 | 19 | # Parse our XML. 20 | xml = jQuery.parseXML(output) 21 | $xml = $(xml) 22 | 23 | # Get the item we care about. 24 | theItem = ($xml.find('rss').find('channel').find('item')) 25 | 26 | # Get the title and the description from the item. 27 | theTitle = theItem.find('title')[0].childNodes[0].data.split(':') 28 | theDescription = theItem.find('description')[0].childNodes[0].data 29 | 30 | theDate = "Today's Word" 31 | 32 | # Output the variables. 33 | dom.find(date).html(theDate) 34 | dom.find(title).html(theTitle) 35 | dom.find(description).html(theDescription) 36 | 37 | # Find the total number of paragraphs in the description. 38 | parCount = dom.find(description).find('p').length 39 | 40 | # If there is more than one, replace the Description with just the first paragraph 41 | # and set the footer to reflect that more information is available on the website. 42 | if parCount > 0 43 | dom.find(description).html(dom.find(description).find('p')[0]) 44 | dom.find(footer).html('Read ' + parCount + ' more paragraphs at http://www.history.com/this-day-in-history') 45 | 46 | # CSS Style 47 | style: """ 48 | top: 400px 49 | left: 440px 50 | width:400px 51 | margin:0px 52 | padding:0px 53 | background:rgba(#FFF, 0.5) 54 | border:2px solid rgba(#000, 0.5) 55 | border-radius:10px 56 | overflow:hidden 57 | 58 | #date 59 | margin:12pt 60 | margin-bottom:0 61 | font-family: Helvetica 62 | font-size: 42pt 63 | font-weight:bold 64 | color: rgba(#FFF, 0.75) 65 | 66 | #title 67 | margin-left:12pt 68 | margin-right:12pt 69 | font-family: American Typewriter 70 | font-size: 20pt 71 | font-weight:bold 72 | 73 | #description 74 | margin-left:12pt 75 | margin-right:12pt 76 | font-family: American Typewriter 77 | font-size: 12pt 78 | line-height:18pt 79 | max-height:120pt 80 | overflow:hidden 81 | hyphens: auto 82 | 83 | #footer 84 | font-family: Helvetica 85 | font-size: 9pt 86 | margin:12pt 87 | color: rgba(#000, 0.5) 88 | """ 89 | -------------------------------------------------------------------------------- /Today/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/Today/screenshot.png -------------------------------------------------------------------------------- /Today/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Today", 3 | "description" : "A small collection of widgets that show daily information: Today's Date, Today in History (from History.com), Today's News (from Reuters) and Today's Word (from WordSmith.org).", 4 | "author" : "Chris Johnson", 5 | "email" : "Chris.1@nosnhoj.com" 6 | } 7 | -------------------------------------------------------------------------------- /WorldClock/WorldClock.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/WorldClock/WorldClock.widget.zip -------------------------------------------------------------------------------- /WorldClock/WorldClock.widget/WorldClock.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Hawaii;`export TZ='Pacific/Honolulu';date +'%-l:%M %p';unset TZ`" 3 | echo "Alaska;`export TZ='America/Anchorage';date +'%-l:%M %p';unset TZ`" 4 | echo "Pacific;`export TZ='US/Pacific';date +'%-l:%M %p';unset TZ`" 5 | echo "Mountain;`export TZ='US/Mountain';date +'%-l:%M %p';unset TZ`" 6 | echo "Central;`export TZ='US/Central';date +'%-l:%M %p';unset TZ`" 7 | echo "Eastern;`export TZ='US/Eastern';date +'%-l:%M %p';unset TZ`" 8 | echo "London;`export TZ='Europe/London';date +'%-l:%M %p';unset TZ`" 9 | echo "Paris;`export TZ='Europe/Paris';date +'%-l:%M %p';unset TZ`" 10 | echo "Moscow;`export TZ='Europe/Moscow';date +'%-l:%M %p';unset TZ`" 11 | echo "India;`export TZ='Asia/Kolkata';date +'%-l:%M %p';unset TZ`" 12 | echo "Shanghai;`export TZ='Asia/Shanghai';date +'%-l:%M %p';unset TZ`" -------------------------------------------------------------------------------- /WorldClock/WorldClock.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # Execute the shell command. 2 | command: "WorldClock.widget/WorldClock.sh" 3 | 4 | # Set the refresh frequency (milliseconds). 5 | refreshFrequency: 1000 6 | 7 | # Render the output. 8 | render: -> """ 9 | """ 10 | 11 | # Update the rendered output. 12 | update: (output, domEl) -> 13 | 14 | # Get our main DIV. 15 | div = $(domEl) 16 | 17 | # Get our timezones and times. 18 | zones=output.split("\n") 19 | 20 | # Initialize our HTML. 21 | timeHTML = '' 22 | 23 | # Loop through each of the time zones. 24 | for zone, idx in zones 25 | 26 | # If the zone is not empty (e.g. the last newline), let's add it to the HTML. 27 | if zone != '' 28 | 29 | # Split the timezone from the time. 30 | values = zone.split(";") 31 | 32 | # Create the DIVs for each timezone/time. The last item is unique in that we don't want to display the border. 33 | if idx < zones.length - 2 34 | timeHTML = timeHTML + "
" + values[0] + "
" + values[1] + "
" 35 | else 36 | timeHTML = timeHTML + "
" + values[0] + "
" + values[1] + "
" 37 | 38 | # Set the HTML of our main DIV. 39 | div.html(timeHTML) 40 | 41 | # Change the location of the border, depending on whether or not the Wrapper DIVs are the same size as the overall DIV (i.e. the display is vertical). 42 | if div.find('.Wrapper').css('width') == div.css('width') 43 | div.find('.Wrapper').css({'border-bottom-style':'solid','border-bottom-width':'2px','border-bottom-color':'rgba(0,0,0,0.25)'}) 44 | else 45 | div.find('.Wrapper').css({'border-right-style':'solid','border-right-width':'2px','border-right-color':'rgba(0,0,0,0.25)'}) 46 | 47 | 48 | # CSS Style 49 | style: """ 50 | xxwidth:140px 51 | top: 6pt 52 | left: 6pt 53 | font-family: Helvetica Neue 54 | background:rgba(#000, 0.25) 55 | border:2px solid rgba(0,0,0,0.15) 56 | border-radius:10px 57 | text-align:center 58 | font-size:11pt 59 | 60 | .Wrapper, .LastWrapper 61 | xxwidth:100% 62 | display:inline-block 63 | 64 | .Timezone 65 | color: rgba(255,255,255,0.75) 66 | padding:6px 67 | padding-bottom:0px 68 | 69 | .Time 70 | color: rgba(255,255,255,0.40) 71 | padding:6px 72 | padding-top:0px 73 | """ 74 | -------------------------------------------------------------------------------- /WorldClock/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/WorldClock/screenshot.png -------------------------------------------------------------------------------- /WorldClock/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "World Clock", 3 | "description" : "A widget that shows multiple timezones in either horizontal or vertical orientation", 4 | "author" : "Chris Johnson", 5 | "email" : "Chris.1@nosnhoj.com" 6 | } 7 | -------------------------------------------------------------------------------- /battery/battery.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/battery/battery.widget.zip -------------------------------------------------------------------------------- /battery/battery.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "pmset -g batt | grep -o '[0-9]*%; [a-z]*'" 2 | 3 | refreshFrequency: 30000 4 | 5 | style: """ 6 | top: 20px 7 | left: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | border: 1px solid #fff 14 | width: 80px 15 | max-width: 120px 16 | text-shadow: 0 0 1px rgba(#000, 0.5) 17 | background: rgba(#fff, 0.1) 18 | padding: 4px 6px 4px 6px 19 | 20 | &:after 21 | content: 'battery' 22 | position: absolute 23 | left: 0 24 | top: -14px 25 | font-size: 10px 26 | font-weight: 500 27 | 28 | .percent 29 | font-size: 24px 30 | font-weight: 100 31 | margin: 0 32 | 33 | .status 34 | padding: 0 35 | margin: 0 36 | font-size: 11px 37 | font-weight: normal 38 | max-width: 100% 39 | color: #ddd 40 | text-overflow: ellipsis 41 | text-shadow: none 42 | 43 | """ 44 | 45 | 46 | render: -> """ 47 |

48 | """ 49 | 50 | update: (output, domEl) -> 51 | values = output.split(";") 52 | percent = values[0] 53 | status = values[1] 54 | div = $(domEl) 55 | 56 | div.find('.percent').html(percent) 57 | div.find('.status').html(status) 58 | 59 | -------------------------------------------------------------------------------- /battery/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/battery/screenshot.png -------------------------------------------------------------------------------- /battery/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "battery", 3 | "description": "Display current battery percentage and status", 4 | "author": "Johan Bleuzen", 5 | "email": "johan@bleuzen.fr" 6 | } 7 | -------------------------------------------------------------------------------- /btc-eur/btceur.coffee: -------------------------------------------------------------------------------- 1 | command: "curl -s https://api.bitcoinaverage.com/ticker/global/EUR/last" 2 | 3 | refreshFrequency: 50000 #ms 4 | 5 | style: """ 6 | bottom: 10px 7 | left: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | 15 | &:after 16 | content: 'Bitcoin Price' 17 | position: absolute 18 | left: 0 19 | top: -14px 20 | font-size: 11px 21 | 22 | td 23 | font-size: 24.5px 24 | font-weight: 200 25 | width: 90px 26 | max-width: 110px 27 | overflow: hidden 28 | text-shadow: 0 0 1px rgba(#000, 0.5) 29 | padding-left:5px 30 | 31 | .wrapper 32 | padding: 4px 6px 4px 6px 33 | position: relative 34 | 35 | .col1 36 | background: rgba(#fff, 0.2) 37 | 38 | 39 | """ 40 | 41 | render: (o) -> """ 42 | 43 | 44 | 45 | 46 |
€#{o}
47 | """ -------------------------------------------------------------------------------- /btc-eur/btceur.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc-eur/btceur.widget.zip -------------------------------------------------------------------------------- /btc-eur/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc-eur/screenshot.png -------------------------------------------------------------------------------- /btc-eur/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "btceur", 3 | "description": "Get the last bitcoin price. Now, in EUR (€)", 4 | "author": "@cesckat", 5 | "donations": "16mdeGdicdF6qrsjbL2WQhiSPuMz5nz7hz" 6 | } -------------------------------------------------------------------------------- /btc-prices/btc-prices.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc-prices/btc-prices.widget.zip -------------------------------------------------------------------------------- /btc-prices/btc-prices.widget/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 David Parry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /btc-prices/btc-prices.widget/README.md: -------------------------------------------------------------------------------- 1 | Bitcoin prices widget 2 | ==================== 3 | 4 | Retrieves Bitcoin exchange rate prices for different currencies from 5 | blockchain.info's public API. 6 | 7 | Works with [Übersicht](http://tracesof.net/uebersicht/) on OSX. 8 | 9 | Modifying 10 | --------- 11 | To change which currencies are displayed, modify this line: 12 | 13 | ```javascript 14 | CURRENCIES = ["AUD", "USD"] 15 | ``` 16 | -------------------------------------------------------------------------------- /btc-prices/btc-prices.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # this is the shell command that gets executed every time this widget refreshes 2 | command: "curl -s http://blockchain.info/ticker" 3 | 4 | # the refresh frequency in milliseconds 5 | refreshFrequency: 60000 6 | 7 | render: (o) -> 8 | @count = 0 9 | """ 10 |
11 |
1 BTC
12 |
13 |
14 |
15 | """ 16 | 17 | update: (output, domEl) -> 18 | ######################################################### 19 | # Change this to the currency symbols you want to show. # 20 | ######################################################### 21 | CURRENCIES = ["AUD", "USD"] 22 | 23 | box = $(domEl).find('.box') 24 | 25 | prices = JSON.parse(output) 26 | 27 | 28 | content = for currency in CURRENCIES 29 | info = prices[currency] 30 | price = parseInt(info["last"]) 31 | symbol = info["symbol"] 32 | 33 | """ 34 |
#{symbol} #{price}
35 |
#{currency}
36 | """ 37 | 38 | $(box).find('.prices').html content 39 | 40 | style: """ 41 | bottom: 10% 42 | left: 5px 43 | color: white 44 | font-family: 'Helvetica Neue' 45 | font-weight: 100 46 | text-align: left 47 | margin: 5px 48 | width: 120px 49 | text-align: center 50 | 51 | .box 52 | padding: 3px 53 | border: 1px solid rgba(#FFF, 50%) 54 | font-size: 24px 55 | 56 | .price 57 | font-size: 32px 58 | 59 | .btc 60 | text-align: left 61 | 62 | .currency 63 | text-align: right 64 | 65 | .currency, .btc 66 | font-size: 10px 67 | font-weight: 500 68 | letter-spacing: 1px 69 | """ 70 | -------------------------------------------------------------------------------- /btc-prices/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc-prices/screenshot.png -------------------------------------------------------------------------------- /btc-prices/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bitcoin Prices", 3 | "description": "Shows several exchange rate prices for different currencies.", 4 | "author": "David Parry", 5 | "email": "david.parry@suranyami.com" 6 | } 7 | -------------------------------------------------------------------------------- /btc/btc.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc/btc.widget.zip -------------------------------------------------------------------------------- /btc/btc.widget/btc.coffee: -------------------------------------------------------------------------------- 1 | command: "curl -s https://api.bitcoinaverage.com/ticker/global/USD/last" 2 | 3 | refreshFrequency: 60000 #ms 4 | 5 | style: """ 6 | bottom: 10px 7 | left: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | 15 | &:after 16 | content: 'Bitcoin Price' 17 | position: absolute 18 | left: 0 19 | top: -14px 20 | font-size: 10px 21 | 22 | td 23 | font-size: 24px 24 | font-weight: 100 25 | width: 90px 26 | max-width: 110px 27 | overflow: hidden 28 | text-shadow: 0 0 1px rgba(#000, 0.5) 29 | padding-left:5px 30 | 31 | .wrapper 32 | padding: 4px 6px 4px 6px 33 | position: relative 34 | 35 | .col1 36 | background: rgba(#fff, 0.2) 37 | 38 | 39 | """ 40 | 41 | render: (o) -> """ 42 | 43 | 44 | 45 | 46 |
U$#{o}
47 | """ 48 | -------------------------------------------------------------------------------- /btc/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/btc/screenshot.png -------------------------------------------------------------------------------- /btc/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "btc", 3 | "description": "Get current bitcoin price in USD.", 4 | "author": "Daniel Spillere Andrade", 5 | "email": "daniel@danielandrade.net" 6 | } 7 | -------------------------------------------------------------------------------- /calendar/README.txt: -------------------------------------------------------------------------------- 1 | Installation: 2 | 3 | 1. Move calendar.widget to your Ubersicht widgets folder. 4 | 2. Enjoy! 5 | -------------------------------------------------------------------------------- /calendar/calendar.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/calendar/calendar.zip -------------------------------------------------------------------------------- /calendar/index.coffee: -------------------------------------------------------------------------------- 1 | sundayFirstCalendar = 'cal -h && date "+%-m %-d %y"' 2 | 3 | mondayFirstCalendar = 'cal -h | awk \'{ print " "$0; getline; print "Mo Tu We Th Fr Sa Su"; \ 4 | getline; if (substr($0,1,2) == " 1") print " 1 "; \ 5 | do { prevline=$0; if (getline == 0) exit; print " " \ 6 | substr(prevline,4,17) " " substr($0,1,2) " "; } while (1) }\' && date "+%-m %-d %y"' 7 | 8 | command: sundayFirstCalendar 9 | 10 | #Set this to true to enable previous and next month dates, or false to disable 11 | otherMonths: true 12 | 13 | refreshFrequency: 3600000 14 | 15 | style: """ 16 | bottom: 10px 17 | right: 10px 18 | color: #fff 19 | font-family: Helvetica Neue 20 | 21 | table 22 | border-collapse: collapse 23 | table-layout: fixed 24 | 25 | td 26 | text-align: center 27 | padding: 4px 6px 28 | text-shadow: 0 0 1px rgba(#000, 0.5) 29 | 30 | thead tr 31 | &:first-child td 32 | font-size: 24px 33 | font-weight: 100 34 | 35 | &:last-child td 36 | font-size: 11px 37 | padding-bottom: 10px 38 | font-weight: 500 39 | 40 | tbody td 41 | font-size: 12px 42 | 43 | .today 44 | font-weight: bold 45 | background: rgba(#fff, 0.2) 46 | border-radius: 50% 47 | 48 | .grey 49 | color: rgba(#C0C0C0, .7) 50 | """ 51 | 52 | render: -> """ 53 | 54 | 55 | 56 | 57 | 58 |
59 | """ 60 | 61 | 62 | updateHeader: (rows, table) -> 63 | thead = table.find("thead") 64 | thead.empty() 65 | 66 | thead.append "#{rows[0]}" 67 | tableRow = $("").appendTo(thead) 68 | daysOfWeek = rows[1].split(/\s+/) 69 | 70 | for dayOfWeek in daysOfWeek 71 | tableRow.append "#{dayOfWeek}" 72 | 73 | updateBody: (rows, table) -> 74 | #Set to 1 to enable previous and next month dates, 0 to disable 75 | PrevAndNext = 1 76 | 77 | tbody = table.find("tbody") 78 | tbody.empty() 79 | 80 | rows.splice 0, 2 81 | rows.pop() 82 | 83 | today = rows.pop().split(/\s+/) 84 | month = today[0] 85 | date = today[1] 86 | year = today[2] 87 | 88 | lengths = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30] 89 | if year%4 == 0 90 | lengths[2] = 29 91 | 92 | for week, i in rows 93 | days = week.split(/\s+/).filter((day) -> day.length > 0) 94 | tableRow = $("").appendTo(tbody) 95 | 96 | if i == 0 and days.length < 7 97 | for j in [days.length...7] 98 | if @otherMonths == true 99 | k = 6 - j 100 | cell = $("#{lengths[month-1]-k}").appendTo(tableRow) 101 | cell.addClass("grey") 102 | else 103 | cell = $("").appendTo(tableRow) 104 | 105 | for day in days 106 | day = day.replace(/\D/g, '') 107 | cell = $("#{day}").appendTo(tableRow) 108 | cell.addClass("today") if day == date 109 | 110 | if i != 0 and 0 < days.length < 7 and @otherMonths == true 111 | for j in [1..7-days.length] 112 | cell = $("#{j}").appendTo(tableRow) 113 | cell.addClass("grey") 114 | 115 | update: (output, domEl) -> 116 | rows = output.split("\n") 117 | table = $(domEl).find("table") 118 | 119 | @updateHeader rows, table 120 | @updateBody rows, table 121 | -------------------------------------------------------------------------------- /calendar/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/calendar/screenshot.png -------------------------------------------------------------------------------- /calendar/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calendar", 3 | "description": "Display a simple calendar for the current month.", 4 | "author": "Adam Vaughan", 5 | "email": "adamjvaughan@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /disk-usage/disk-usage.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/disk-usage/disk-usage.widget.zip -------------------------------------------------------------------------------- /disk-usage/disk-usage.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # You may exclude certain drives (separate with a pipe) 2 | # Example: exclude = 'MyBook' or exclude = 'MyBook|WD Passport' 3 | # Set as something obscure to show all drives (strange, but easier than editing the command) 4 | exclude = 'NONE' 5 | 6 | # Use base 10 numbers, i.e. 1GB = 1000MB. Leave this true to show disk sizes as 7 | # OS X would (since Snow Leopard) 8 | base10 = true 9 | 10 | # appearance 11 | filledStyle = false # set to true for the second style variant. bgColor will become the text color 12 | 13 | width = '367px' 14 | barHeight = '36px' 15 | labelColor = '#fff' 16 | usedColor = '#d7051d' 17 | freeColor = '#525252' 18 | bgColor = '#fff' 19 | borderRadius = '3px' 20 | bgOpacity = 0.9 21 | 22 | # You may optionally limit the number of disk to show 23 | maxDisks: 10 24 | 25 | 26 | command: "df -#{if base10 then 'H' else 'h'} | grep '/dev/' | while read -r line; do fs=$(echo $line | awk '{print $1}'); name=$(diskutil info $fs | grep 'Volume Name' | awk '{print substr($0, index($0,$3))}'); echo $(echo $line | awk '{print $2, $3, $4, $5}') $(echo $name | awk '{print substr($0, index($0,$1))}'); done | grep -vE '#{exclude}'" 27 | 28 | refreshFrequency: 60000 29 | 30 | style: """ 31 | bottom: 330px 32 | right: 400px 33 | font-family: Helvetica Neue 34 | font-weight: 200 35 | 36 | .label 37 | font-size: 12px 38 | color: #{labelColor} 39 | margin-left: 1px 40 | font-style: italic 41 | font-family: Myriad Set Pro, Helvetica Neue 42 | 43 | .total 44 | display: inline-block 45 | margin-left: 8px 46 | font-weight: bold 47 | 48 | .disk:not(:first-child) 49 | margin-top: 16px 50 | 51 | .wrapper 52 | height: #{barHeight} 53 | font-size: #{Math.round(parseInt(barHeight)*0.8)}px 54 | line-height: 1 55 | width: #{width} 56 | max-width: #{width} 57 | margin: 4px 0 0 0 58 | position: relative 59 | overflow: hidden 60 | border-radius: #{borderRadius} 61 | background: rgba(#{bgColor}, #{bgOpacity}) 62 | #{'background: none' if filledStyle } 63 | 64 | .wrapper:first-of-type 65 | margin: 0px 66 | 67 | .bar 68 | position: absolute 69 | top: 0 70 | bottom: 0px 71 | 72 | &.used 73 | border-radius: #{borderRadius} 0 0 #{borderRadius} 74 | background: rgba(#{usedColor}, #{ if filledStyle then bgOpacity else 0.05 }) 75 | border-bottom: 1px solid #{usedColor} 76 | #{'border-bottom: none' if filledStyle } 77 | 78 | &.free 79 | right: 0 80 | border-radius: 0 #{borderRadius} #{borderRadius} 0 81 | background: rgba(#{freeColor}, #{ if filledStyle then bgOpacity else 0.05 }) 82 | border-bottom: 1px solid #{freeColor} 83 | #{'border-bottom: none' if filledStyle } 84 | 85 | 86 | .stats 87 | display: inline-block 88 | font-size: 0.5em 89 | line-height: 1 90 | word-spacing: -2px 91 | text-overflow: ellipsis 92 | vertical-align: middle 93 | position: relative 94 | 95 | span 96 | font-size: 0.8em 97 | margin-left: 2px 98 | 99 | .free, .used 100 | display: inline-block 101 | white-space: nowrap 102 | 103 | 104 | .free 105 | margin-left: 12px 106 | color: #{if filledStyle then bgColor else freeColor} 107 | 108 | .used 109 | color: #{if filledStyle then bgColor else usedColor} 110 | margin-left: 6px 111 | font-size: 0.9em 112 | 113 | .needle 114 | width: 0 115 | border-left: 1px dashed rgba(#{usedColor}, 0.2) 116 | position: absolute 117 | top: 0 118 | bottom: -2px 119 | display: #{'none' if filledStyle} 120 | 121 | &:after, &:before 122 | content: ' ' 123 | border-top: 5px solid #{usedColor} 124 | border-left: 4px solid transparent 125 | border-right: 4px solid transparent 126 | position: absolute 127 | left: -4px 128 | """ 129 | 130 | humanize: (sizeString) -> 131 | sizeString + 'B' 132 | 133 | 134 | renderInfo: (total, used, free, pctg, name) -> """ 135 |
136 |
#{name} #{@humanize(total)}
137 |
138 |
139 |
140 | 141 |
142 |
#{@humanize(free)} free
143 |
#{@humanize(used)} used
144 |
145 |
146 |
147 |
148 | """ 149 | 150 | update: (output, domEl) -> 151 | disks = output.split('\n') 152 | $(domEl).html '' 153 | 154 | for disk, i in disks[..(@maxDisks - 1)] 155 | args = disk.split(' ') 156 | if (args[4]) 157 | args[4] = args[4..].join(' ') 158 | $(domEl).append @renderInfo(args...) 159 | -------------------------------------------------------------------------------- /disk-usage/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/disk-usage/screenshot.png -------------------------------------------------------------------------------- /disk-usage/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Disk Usage", 3 | "description": "Shows disk usage for mounted disks, with the option to exclude specific disks. Update: New option for showing disk sizes.", 4 | "author": "Adam Courtemanche", 5 | "email": "adam.courtemanche@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /fever-rss/fever-rss.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/fever-rss/fever-rss.widget.zip -------------------------------------------------------------------------------- /fever-rss/fever-rss.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # the api key is generated using md5(username:password) 2 | api_key = "yourApiKey" 3 | server = "https://yourFeverServer/" 4 | command: "curl -s -d 'api_key=#{api_key}' \"#{server}?api&unread_item_ids\" | grep -Eo '\"unread_item_ids\":.*?[^\\]\",' | grep -Eo [0-9]+ | wc -l" 5 | 6 | refreshFrequency: 60000 7 | 8 | style: """ 9 | bottom: 120px 10 | left: 100px 11 | color: #fff 12 | font-family: Helvetica Neue 13 | 14 | div 15 | display: block 16 | text-shadow: 0 0 1px rgba(#000, 0.5) 17 | font-size: 24px 18 | font-weight: 100 19 | 20 | 21 | """ 22 | 23 | 24 | render: -> """ 25 |
26 | """ 27 | 28 | update: (numberOfUnreadArticles, domEl) -> 29 | $(domEl).find('.rss-count').html("RSS: #{numberOfUnreadArticles} unread") 30 | -------------------------------------------------------------------------------- /fever-rss/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/fever-rss/screenshot.png -------------------------------------------------------------------------------- /fever-rss/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fever RSS count", 3 | "description": "Shows the number of unread RSS articles", 4 | "author": "Martin Ziel", 5 | "email": "martin.ziel@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /german-word-of-the-day/german-word-of-the-day.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/german-word-of-the-day/german-word-of-the-day.widget.zip -------------------------------------------------------------------------------- /german-word-of-the-day/german-word-of-the-day.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: 'curl -s "http://feeds.feedblitz.com/german-word-of-the-day&x=1"' 2 | 3 | refreshFrequency: 3600000 4 | 5 | style: """ 6 | top: 40px 7 | left: 0px 8 | color: #fff 9 | 10 | .output 11 | padding: 5px 10px 12 | font-family: Helvetica Neue 13 | font-size: 30px 14 | font-weight: 100 15 | text-shadow: 0 0px 5px #000000; 16 | background-color: rgba(0,0,0,0.15) 17 | 18 | .word, .part, .example, .example-meaning 19 | text-transform:capitalize 20 | font-size: 20px 21 | """ 22 | 23 | render: (output) -> """ 24 |
25 |
German word of the day
26 |
27 |
28 |
29 |
30 |
31 | """ 32 | 33 | update: (output, domEl) -> 34 | # Define constants, and extract the juicy html. 35 | dom = $(domEl) 36 | xml = jQuery.parseXML(output) 37 | $xml = $(xml) 38 | description = jQuery.parseHTML($xml.find('description').eq(1).text()) 39 | $description = $(description) 40 | 41 | # Find the info we need, and inject it into the DOM. 42 | dom.find('.word').html $xml.find('title').eq(1) 43 | part = $description.find('td').eq(0).text() 44 | dom.find('.part').html "Part of speech: #{part}" 45 | example = $description.find('td').eq(1).text() 46 | dom.find('.example').html "Example sentence: #{example}" 47 | exampleMeaning = $description.find('td').eq(2).text() 48 | dom.find('.example-meaning').html "Sentence meaning: #{exampleMeaning}" 49 | 50 | # Position the DOM in the middle of our screen. 51 | # NOTE: this is optional. Adjust as you like. 52 | domWidth = dom.width() 53 | frameWidth = $(window).width() 54 | dom.css('left',((frameWidth)/2)-(domWidth/2)) 55 | -------------------------------------------------------------------------------- /german-word-of-the-day/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/german-word-of-the-day/screenshot.png -------------------------------------------------------------------------------- /german-word-of-the-day/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "German Word of the Day", 3 | "description": "Shows you the german word of the day!", 4 | "author": "Tassilo Selover-Stephan", 5 | "email": "tassilo@selover.net" 6 | } 7 | -------------------------------------------------------------------------------- /iTunes-now/itunes-now.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/iTunes-now/itunes-now.widget.zip -------------------------------------------------------------------------------- /iTunes-now/itunes-now.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # A widget to describe what's playing in iTunes 2 | # in the form of "Now Playing in iTunes: by on " 3 | # blagged and edited from: 4 | # http://www.tuaw.com/2007/04/02/terminal-tip-now-playing-info-from-the-command-line/ 5 | 6 | command: "osascript -e \'tell application \"iTunes\" to if player state is playing then \"Now Playing in iTunes: \" & name of current track & \" by \" & artist of current track & \" on \" & album of current track'" 7 | 8 | refreshFrequency: 1000 9 | 10 | style: """ 11 | top: 75% 12 | left: 35% 13 | color: #fff 14 | font-family: Helvetica Neue 15 | text-shadow: 0.1em 0.1em 0.2em #000 16 | 17 | p 18 | padding: 0 19 | margin: 0 20 | font-size: 16px 21 | font-weight: normal 22 | 23 | """ 24 | 25 | render: (output) -> """ 26 |

#{output}

27 | """ 28 | -------------------------------------------------------------------------------- /iTunes-now/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/iTunes-now/screenshot.png -------------------------------------------------------------------------------- /iTunes-now/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Now Playing in iTunes", 3 | "description": "Shows the name, artist and album of the current song in iTunes", 4 | "author": "Patrick Braiden", 5 | "email": "me@padge.eu" 6 | } 7 | -------------------------------------------------------------------------------- /inspirational-quote/inspirational-quote.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/inspirational-quote/inspirational-quote.widget.zip -------------------------------------------------------------------------------- /inspirational-quote/inspirational-quote.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: 'curl -s "http://feeds.feedburner.com/brainyquote/QUOTEBR"' 2 | 3 | refreshFrequency: 30000 4 | 5 | style: """ 6 | bottom: 0px 7 | right: 0px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | 12 | .output 13 | padding: 5px 10px 14 | width: 300px 15 | font-size: 20px 16 | font-weight: lighter 17 | font-smoothing: antialiased 18 | 19 | .author, .example, .example-meaning 20 | text-transform: capitalize 21 | font-size: 14px 22 | .author 23 | text-align: right 24 | """ 25 | 26 | render: (output) -> """ 27 |
28 |
29 |
30 |
31 | """ 32 | 33 | update: (output, domEl) -> 34 | # Define constants, and extract the juicy html. 35 | dom = $(domEl) 36 | xml = $.parseXML(output) 37 | $xml = $(xml) 38 | description = $.parseHTML($xml.find('description').eq(1).text()) 39 | $description = $(description) 40 | 41 | # Find the info we need, and inject it into the DOM. 42 | dom.find('.quote').html $xml.find('description').eq(2) 43 | dom.find('.author').html $xml.find('title').eq(2) 44 | 45 | 46 | -------------------------------------------------------------------------------- /inspirational-quote/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/inspirational-quote/screenshot.png -------------------------------------------------------------------------------- /inspirational-quote/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Inspirational Quote", 3 | "description": "Inspirational quote of the day from brainyquote.com, with direction drawn from the German Quote of the Day widget", 4 | "author": "Alex Anderson", 5 | "email": "alexanderson1993@icloud.com" 6 | } 7 | -------------------------------------------------------------------------------- /iostats/iostats.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/iostats/iostats.widget.zip -------------------------------------------------------------------------------- /iostats/iostats.widget/index.coffee: -------------------------------------------------------------------------------- 1 | disk = 'disk0' 2 | delay = '5' #seconds 3 | 4 | command: "iostat -dw #{delay} -c 2 #{disk} | awk 'FNR>3' | awk '{printf \"%s,%s,%s\",$1,$2,$3}'" 5 | 6 | refreshFrequency: delay*1000 7 | 8 | style: """ 9 | top: 300px 10 | left: 20px 11 | color: #fff 12 | font-family: Helvetica Neue 13 | 14 | table 15 | border-collapse: collapse 16 | table-layout: fixed 17 | 18 | &:after 19 | content: 'iostats' 20 | position: absolute 21 | left: 0 22 | top: -14px 23 | font-size: 10px 24 | 25 | td 26 | border: 1px solid #fff 27 | font-size: 24px 28 | font-weight: 100 29 | width: 120px 30 | max-width: 120px 31 | overflow: hidden 32 | text-shadow: 0 0 1px rgba(#000, 0.5) 33 | 34 | .value 35 | padding: 4px 6px 4px 6px 36 | position: relative 37 | 38 | .col1 39 | background: rgba(#fff, 0.2) 40 | 41 | .col2 42 | background: rgba(#fff, 0.1) 43 | 44 | p 45 | padding: 0 46 | margin: 0 47 | font-size: 11px 48 | font-weight: normal 49 | max-width: 100% 50 | color: #ddd 51 | text-overflow: ellipsis 52 | text-shadow: none 53 | """ 54 | 55 | render: -> """ 56 | 57 | 58 | 59 | 60 | 61 | 62 |
63 | """ 64 | 65 | update: (output, domEl) -> 66 | values = output.split(',') 67 | table = $(domEl).find('table') 68 | 69 | 70 | 71 | 72 | renderValue = (value, index, label) -> 73 | "
" + 74 | "#{value}" + 75 | "

#{label}

" + 76 | "
" 77 | 78 | for value, i in values 79 | if i == 0 80 | label = 'KB/t' 81 | else if i == 1 82 | label = 'tps' 83 | else if i == 2 84 | label = 'MB/s' 85 | 86 | table.find(".col#{i+1}").html renderValue(value,i,label) 87 | -------------------------------------------------------------------------------- /iostats/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/iostats/screenshot.png -------------------------------------------------------------------------------- /iostats/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "I/O Stats", 3 | "description": "Show current throughput statistics for the specified disk. Style based on Top CPU and Top MEM widgets by Felix Hageloh.", 4 | "author": "Eric Miller", 5 | "email": "emiller42@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /load-avg/load-avg.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/load-avg/load-avg.widget.zip -------------------------------------------------------------------------------- /load-avg/load-avg.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "sysctl -n vm.loadavg | awk '{printf \"%s,%s,%s\",$2,$3,$4}'" 2 | 3 | refreshFrequency: 5000 4 | 5 | style: """ 6 | top: 70px 7 | left: 50px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | 15 | &:after 16 | content: 'load avg' 17 | position: absolute 18 | left: 0 19 | top: -14px 20 | font-size: 10px 21 | 22 | td 23 | border: 1px solid #fff 24 | font-size: 24px 25 | font-weight: 100 26 | width: 120px 27 | max-width: 120px 28 | overflow: hidden 29 | text-shadow: 0 0 1px rgba(#000, 0.5) 30 | 31 | .value 32 | padding: 4px 6px 4px 6px 33 | position: relative 34 | 35 | .col1 36 | background: rgba(#fff, 0.2) 37 | 38 | .col2 39 | background: rgba(#fff, 0.1) 40 | 41 | p 42 | padding: 0 43 | margin: 0 44 | font-size: 11px 45 | font-weight: normal 46 | max-width: 100% 47 | color: #ddd 48 | text-overflow: ellipsis 49 | text-shadow: none 50 | """ 51 | 52 | render: -> """ 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | """ 61 | 62 | update: (output, domEl) -> 63 | values = output.split(',') 64 | table = $(domEl).find('table') 65 | 66 | renderValue = (load_avg, index, label) -> 67 | "
" + 68 | "#{load_avg}" + 69 | "

#{label}

" + 70 | "
" 71 | 72 | for value, i in values 73 | if i == 0 74 | label = '1 Minute' 75 | else if i == 1 76 | label = '5 Minute' 77 | else if i == 2 78 | label = '15 Minute' 79 | 80 | table.find(".col#{i+1}").html renderValue(value,i, label) 81 | -------------------------------------------------------------------------------- /load-avg/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/load-avg/screenshot.png -------------------------------------------------------------------------------- /load-avg/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Load Average", 3 | "description": "Display the 1, 5, and 15-minute load averages of your system. Style based on Top CPU and Top MEM widgets by Felix Hageloh.", 4 | "author": "Eric Miller", 5 | "email": "emiller42@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /mail/mail.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/mail/mail.widget.zip -------------------------------------------------------------------------------- /mail/mail.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "osascript -e 'tell application \"Mail\" to set unreadCount to unread count of inbox'" 2 | 3 | refreshFrequency: 60000 4 | 5 | style: """ 6 | bottom: 120px 7 | left: 310px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | text-shadow: 0 0 1px rgba(#000, 0.5) 14 | font-size: 24px 15 | font-weight: 100 16 | 17 | 18 | """ 19 | 20 | 21 | render: -> """ 22 |
23 | """ 24 | 25 | update: (numberOfUnreadMails, domEl) -> 26 | $(domEl).find('.mail-count').html("Mail: #{numberOfUnreadMails} unread") 27 | -------------------------------------------------------------------------------- /mail/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/mail/screenshot.png -------------------------------------------------------------------------------- /mail/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Unread mail count", 3 | "description": "Shows the number of unread mails in Mail.app", 4 | "author": "Martin Ziel", 5 | "email": "martin.ziel@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /network-throughput/network-throughput.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/network-throughput/network-throughput.widget.zip -------------------------------------------------------------------------------- /network-throughput/network-throughput.widget/index.coffee: -------------------------------------------------------------------------------- 1 | network_interface = 'en0' 2 | 3 | # Sample for one second, one time 4 | # The command actually takes longer than 1 second to execute 5 | command: "sar -n DEV 1 1 | grep #{network_interface} | tail -n1 | awk '{print $4,$6}'" 6 | 7 | # Even though the command takes longer than 1 second to execute, 1000ms 8 | # seems to work best (widget output updates approx every 3 seconds) 9 | refreshFrequency: 1000 10 | 11 | style: """ 12 | top: 20px 13 | left: 10px 14 | color: #fff 15 | font-family: Helvetica Neue 16 | 17 | table 18 | border-collapse: collapse 19 | table-layout: fixed 20 | 21 | &:after 22 | content: 'network throughput' 23 | position: absolute 24 | left: 0 25 | top: -14px 26 | font-size: 10px 27 | 28 | td 29 | border: 1px solid #fff 30 | font-size: 24px 31 | font-weight: 100 32 | width: 182px 33 | max-width: 182px 34 | height: 48px 35 | overflow: hidden 36 | text-shadow: 0 0 1px rgba(#000, 0.5) 37 | 38 | .wrapper 39 | padding: 4px 6px 4px 6px 40 | position: relative 41 | 42 | .label 43 | position: absolute 44 | top: 1px 45 | right: 8px 46 | font-size: 10px 47 | font-weight: normal 48 | 49 | .col1 50 | background: rgba(#f00, 0.4) 51 | 52 | .col2 53 | background: rgba(#0ff, 0.4) 54 | 55 | .hidden 56 | display: none 57 | """ 58 | 59 | render: -> """ 60 | 61 | 62 | 63 | 64 | 65 |
0.00 KB/s
IN
0.00 KB/s
OUT
66 | """ 67 | 68 | update: (output, domEl) -> 69 | table = $(domEl).find('table') 70 | result = output.split(' ') 71 | 72 | # Rather than just use KB and/or MB, let's accommodate all speeds 73 | # Pass "si" as true for base 10 (1 KiB = 1000 bytes) 74 | # Pass "si" as false for base 2 (1 kB = 1024 bytes) 75 | renderBytes = (bytes, type, si) -> 76 | bytes = Number(bytes) 77 | units = ['B'] 78 | u = 0 79 | thresh = if si then 1000 else 1024 80 | if (bytes < thresh) 81 | units = ['B'] 82 | u = 0 83 | else 84 | units = if si then ['kB','MB','GB','TB','PB','EB','ZB','YB'] else ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'] 85 | u = -1 86 | loop 87 | bytes /= thresh 88 | ++u 89 | break if (bytes <= thresh) 90 | 91 | "
" + 92 | "#{bytes.toFixed(1)} #{units[u]}/s" + 93 | "
#{type}
" + 94 | "
" 95 | 96 | table.find(".col1").html renderBytes(result[0], 'IN', true) 97 | table.find(".col2").html renderBytes(result[1], 'OUT', true) 98 | -------------------------------------------------------------------------------- /network-throughput/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/network-throughput/screenshot.png -------------------------------------------------------------------------------- /network-throughput/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Network Throughput", 3 | "description": "Shows incoming and outgoing throughput on a user-specified network interface", 4 | "author": "Adam Courtemanche", 5 | "email": "adam.courtemanche@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /public_ip/public_ip.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/public_ip/public_ip.widget.zip -------------------------------------------------------------------------------- /public_ip/public_ip.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "curl -4fNs 'https://ip.appspot.com' || curl -4fNs 'https://api.ipify.org'" 2 | 3 | refreshFrequency: 43200000 4 | 5 | style: """ 6 | top: 100px 7 | left: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | border: 1px solid #fff 14 | text-shadow: 0 0 1px rgba(#000, 0.5) 15 | background: rgba(#fff, 0.1) 16 | font-size: 24px 17 | font-weight: 100 18 | padding: 4px 6px 4px 6px 19 | 20 | &:after 21 | content: 'Public IP' 22 | position: absolute 23 | left: 0 24 | top: -14px 25 | font-size: 10px 26 | font-weight: 500 27 | 28 | """ 29 | 30 | 31 | render: -> """ 32 |
33 | """ 34 | 35 | update: (output, domEl) -> 36 | $(domEl).find('.ip_address').html(output) 37 | 38 | -------------------------------------------------------------------------------- /public_ip/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/public_ip/screenshot.png -------------------------------------------------------------------------------- /public_ip/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Public Ip", 3 | "description": "Displays your current public IP address", 4 | "author": "George Irwin" 5 | } 6 | -------------------------------------------------------------------------------- /simple-stocks/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/simple-stocks/screenshot.png -------------------------------------------------------------------------------- /simple-stocks/simple-stocks.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/simple-stocks/simple-stocks.widget.zip -------------------------------------------------------------------------------- /simple-stocks/simple-stocks.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # Separate stock symbols with a plus sign 2 | symbols = "AAPL+FB+ORCL+GOOG+MSFT" 3 | 4 | # See http://www.jarloo.com/yahoo_finance/ for Yahoo Finance options 5 | command: "curl -s 'http://download.finance.yahoo.com/d/quotes.csv?s=#{symbols}&f=sl1c1p2' | sed 's/\"//g'" 6 | 7 | # Refresh every 5 minutes 8 | refreshFrequency: 300000 9 | 10 | style: """ 11 | bottom: 300px 12 | left: 500px 13 | color: #fff 14 | font-family: Helvetica Neue 15 | 16 | table 17 | border-collapse: collapse 18 | table-layout: fixed 19 | 20 | &:after 21 | content: 'simple stocks' 22 | position: absolute 23 | left: 0 24 | top: -14px 25 | font-size: 10px 26 | 27 | td 28 | border: 1px solid #fff 29 | font-size: 24px 30 | font-weight: 100 31 | width: 182px 32 | max-width: 182px 33 | overflow: hidden 34 | text-shadow: 0 0 1px rgba(#000, 0.5) 35 | background: rgba(#000, 0.3) 36 | 37 | .wrapper 38 | padding: 4px 6px 4px 6px 39 | position: relative 40 | 41 | .info 42 | padding: 0 43 | margin: 0 44 | font-size: 11px 45 | font-weight: normal 46 | max-width: 100% 47 | color: #ddd 48 | text-overflow: ellipsis 49 | text-shadow: none 50 | 51 | .up 52 | color: #0f0 53 | 54 | .down 55 | color: #f00 56 | """ 57 | 58 | render: -> """ 59 |
Loading...
60 | """ 61 | 62 | update: (output, domEl) -> 63 | stocks = output.split('\n') 64 | table = $(domEl).find('table') 65 | table.html "" 66 | 67 | renderStock = (label, val, change, changepct) -> 68 | direction = if (changepct.charAt(0) == '+') then 'up' else 'down' 69 | """ 70 | 71 |
72 | #{label} #{val} 73 |
#{change} (#{changepct.replace /\s/g, ''})
74 |
75 | 76 | """ 77 | 78 | for stock, i in stocks 79 | args = stock.split(',') 80 | if i % 2 == 0 81 | table.append "" 82 | if (args[0]) 83 | table.find("tr:last").append renderStock(args...) 84 | -------------------------------------------------------------------------------- /simple-stocks/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Simple Stocks", 3 | "description": "Shows stock information with minimal configuration required (simply specify the symbols)", 4 | "author": "Adam Courtemanche", 5 | "email": "adam.courtemanche@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /swap-usage/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/swap-usage/screenshot.png -------------------------------------------------------------------------------- /swap-usage/swap-usage.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/swap-usage/swap-usage.widget.zip -------------------------------------------------------------------------------- /swap-usage/swap-usage.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "sysctl -n vm.swapusage | awk '{printf \"%s,%s\\n%s,%s\\n%s,%s\", $1,$3,$4,$6,$7,$9}'" 2 | 3 | refreshFrequency: 5000 4 | 5 | style: """ 6 | top: 280px 7 | left: 50px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | 12 | table 13 | border-collapse: collapse 14 | table-layout: fixed 15 | 16 | &:before 17 | content: 'swap' 18 | position: absolute 19 | left: 0 20 | top: -14px 21 | font-size: 10px 22 | 23 | td 24 | border: 1px solid #fff 25 | font-size: 24px 26 | font-weight: 100 27 | width: 120px 28 | max-width: 120px 29 | overflow: hidden 30 | text-shadow: 0 0 1px rgba(#000, 0.5) 31 | 32 | .value 33 | padding: 4px 6px 4px 6px 34 | position: relative 35 | 36 | .col1 37 | background: rgba(#fff, 0.2) 38 | 39 | .col2 40 | background: rgba(#fff, 0.1) 41 | 42 | p 43 | padding: 0 44 | margin: 0 45 | font-size: 11px 46 | font-weight: normal 47 | max-width: 100% 48 | color: #ddd 49 | text-overflow: ellipsis 50 | 51 | """ 52 | 53 | 54 | render: -> 55 | """ 56 | 57 | 58 | 59 | 60 | 61 | 62 |
63 | """ 64 | 65 | update: (output, domEl) -> 66 | processes = output.split('\n') 67 | table = $(domEl).find('table') 68 | 69 | renderProcess = (name, value) -> 70 | "
" + 71 | "#{value}

#{name}

" + 72 | "
" 73 | 74 | for process, i in processes 75 | args = process.split(',') 76 | table.find(".col#{i+1}").html renderProcess(args...) 77 | -------------------------------------------------------------------------------- /swap-usage/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Swap Usage", 3 | "description": "Display swap file metrics for your system. Style based on Top CPU and Top MEM widgets by Felix Hageloh.", 4 | "author": "Eric Miller", 5 | "email": "emiller42@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /sys-mon-set/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/sys-mon-set/screenshot.png -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/sys-mon-set/sys-mon-set.widget.zip -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/README.md: -------------------------------------------------------------------------------- 1 | # Credits 2 | 3 | Authors of the various widgets include: 4 | 5 | George Irwin, mfam, Aliceljm, Johan Bleuzen, Spencer Oberstadt, Felix Hageloh 6 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/battery.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "pmset -g batt | grep -o '[0-9]*%'" 2 | 3 | refreshFrequency: 60000 4 | 5 | style: """ 6 | bottom: 120px 7 | left: 0 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | text-shadow: 0 0 1px rgba(#000, 0.5) 14 | font-size: 24px 15 | font-weight: 100 16 | 17 | 18 | """ 19 | 20 | 21 | render: -> """ 22 |
23 | """ 24 | 25 | update: (output, domEl) -> 26 | $(domEl).find('.battery').html(output) 27 | 28 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/mini-top-mem.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "ps axo \"rss,pid,ucomm\" | sort -nr | head -n3 | awk '{printf \"%8.0f,%s,%s\\n\", $1/1024, $3, $2}'" 2 | 3 | refreshFrequency: 5000 4 | 5 | style: """ 6 | bottom: 0px 7 | left: 580px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | margin-bottom: 4px 15 | 16 | td 17 | font-size: 10px 18 | font-weight: normal 19 | width: 80px 20 | max-width: 80px 21 | overflow: ellipsis 22 | text-shadow: 0 0 1px rgba(#000, 0.5) 23 | 24 | 25 | """ 26 | 27 | 28 | render: -> 29 | """ 30 | 31 | 32 | 33 | 34 |
35 | """ 36 | 37 | update: (output, domEl) -> 38 | processes = output.split('\n') 39 | table = $(domEl).find('table') 40 | 41 | renderProcess = (mem, name) -> 42 | "#{name}#{mem}" 43 | 44 | for process, i in processes 45 | args = process.split(',') 46 | table.find("#row-#{i+1}").html renderProcess(args...) 47 | 48 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/netstat.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "sys-mon-set.widget/netstat.widget/scripts/netst" 2 | 3 | refreshFrequency: 1000 4 | 5 | style: """ 6 | bottom: 150px 7 | left: 0 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | text-shadow: 0 0 1px rgba(#000, 0.5) 14 | font-size: 16px 15 | font-weight: 100 16 | 17 | p 18 | margin: 0 19 | 20 | p > span 21 | font-weight: normal 22 | 23 | 24 | """ 25 | 26 | 27 | render: -> """ 28 |
29 |

In:

30 |

Out:

31 |
32 | """ 33 | 34 | 35 | update: (output, domEl) -> 36 | bytesToSize = (bytes) -> 37 | return "0 Byte" if parseInt(bytes) is 0 38 | k = 1024 39 | sizes = [ 40 | "b/s" 41 | "kb/s" 42 | "mb/s" 43 | "gb/s" 44 | "gb/s" 45 | "pb/s" 46 | "eb/s" 47 | "zb/s" 48 | "yb/s" 49 | ] 50 | i = Math.floor(Math.log(bytes) / Math.log(k)) 51 | (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i] 52 | values = output.split(' ') 53 | $(domEl).find('#in').text(bytesToSize(values[0])) 54 | $(domEl).find('#out').text(bytesToSize(values[1])) 55 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/netstat.widget/scripts/netst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/sys-mon-set/sys-mon-set.widget/netstat.widget/scripts/netst -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/netstat.widget/scripts/netst.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Print interface statistics in bytes per second 3 | * 4 | * Parameters: 5 | * -t # Time interval to compute, default 2 seconds 6 | * -i Interface name, defaults to 'en0' 7 | * -s Print raw stats 8 | * 9 | * Output: Two numbers separated by a space. First value is input bytes per 10 | * second. Second value is output bytes per second 11 | */ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | #include 27 | #include 28 | #include 29 | 30 | static u_int64_t opackets = 0; 31 | static u_int64_t ipackets = 0; 32 | static u_int64_t obytes = 0; 33 | static u_int64_t ibytes = 0; 34 | static int raw_stats = 0; 35 | 36 | int 37 | get_stats(char *interface) 38 | { 39 | int ret = 0; 40 | char name [32]; 41 | int mib [6]; 42 | char *buf = NULL, *lim, *next; 43 | size_t len; 44 | struct if_msghdr *ifm; 45 | unsigned int ifindex = 0; 46 | 47 | if (interface != 0) 48 | ifindex = if_nametoindex(interface); 49 | 50 | mib[0] = CTL_NET; 51 | mib[1] = PF_ROUTE; 52 | mib[2] = 0; 53 | mib[3] = 0; 54 | mib[4] = NET_RT_IFLIST2; 55 | mib[5] = 0; 56 | 57 | if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) 58 | return ret; 59 | if ((buf = malloc(len)) == NULL) { 60 | printf("malloc failed\n"); 61 | exit(1); 62 | } 63 | if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { 64 | if (buf) 65 | free(buf); 66 | return ret; 67 | } 68 | lim = buf + len; 69 | for (next = buf; next < lim;) { 70 | ifm = (struct if_msghdr *)next; 71 | next += ifm->ifm_msglen; 72 | 73 | if (ifm->ifm_type == RTM_IFINFO2) { 74 | struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm; 75 | struct sockaddr_dl *sdl = (struct sockaddr_dl *)(if2m + 1); 76 | 77 | strncpy(name, sdl->sdl_data, sdl->sdl_nlen); 78 | name[sdl->sdl_nlen] = 0; 79 | if (interface != 0 && if2m->ifm_index != ifindex) 80 | continue; 81 | 82 | /* 83 | * Get the interface stats. These may get overriden 84 | * below on a per-interface basis. 85 | */ 86 | opackets = if2m->ifm_data.ifi_opackets; 87 | ipackets = if2m->ifm_data.ifi_ipackets; 88 | obytes = if2m->ifm_data.ifi_obytes; 89 | ibytes = if2m->ifm_data.ifi_ibytes; 90 | if (ret == 0) { 91 | ret = 1; 92 | if (raw_stats) { 93 | printf("%5s %10s %14s ", 94 | "Name", "Ipkts", "IBytes"); 95 | printf("%10s %14s\n", "Opkts", "Obytes"); 96 | } 97 | } 98 | if (raw_stats) { 99 | printf("%-5s %10llu ", name, ipackets); 100 | printf("%14llu ", ibytes); 101 | printf("%10llu ", opackets); 102 | printf("%14llu\n", obytes); 103 | } 104 | } 105 | } 106 | 107 | free(buf); 108 | 109 | return ret; 110 | } 111 | 112 | void 113 | usage(void) 114 | { 115 | printf("arguments:\n\t-t #\t\tTime interval to compute, default 2 seconds\n"); 116 | printf("\t-i \tInterface name, defaults to 'en0'\n"); 117 | printf("\t-s\t\tPrint raw stats\n"); 118 | exit(1); 119 | } 120 | 121 | int 122 | main(int argc, char *argv[]) 123 | { 124 | char *ifname = "en0"; 125 | int r; 126 | int sleeptime = 2; 127 | 128 | int bflag , ch, fd; 129 | 130 | bflag = 0; 131 | while ((ch = getopt(argc, argv, "st:i:")) != -1) { 132 | switch (ch) { 133 | case 't': 134 | sleeptime = atoi(optarg); 135 | if (sleeptime < 1) { 136 | sleeptime = 1; 137 | } 138 | break; 139 | case 'i': 140 | ifname = optarg; 141 | break; 142 | case 's': 143 | raw_stats = 1; 144 | break; 145 | default: 146 | usage(); 147 | } 148 | } 149 | argc -= optind; 150 | argv += optind; 151 | 152 | r = get_stats(ifname); 153 | if (r) { 154 | u_int64_t ib = ibytes; 155 | u_int64_t ob = obytes; 156 | u_int64_t diffo, diffi; 157 | 158 | sleep(sleeptime); 159 | get_stats(ifname); 160 | diffo = (obytes - ob) / (u_int64_t) sleeptime; 161 | diffi = (ibytes - ib) / (u_int64_t) sleeptime; 162 | printf("%llu %llu\n", diffi, diffo); 163 | } else { 164 | printf("No interface %s\n", ifname); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/public_ip.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'" 2 | 3 | refreshFrequency: 43200000 4 | 5 | style: """ 6 | bottom: 120px 7 | left: 70px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | div 12 | display: block 13 | text-shadow: 0 0 1px rgba(#000, 0.5) 14 | font-size: 24px 15 | font-weight: 100 16 | 17 | """ 18 | 19 | 20 | render: -> """ 21 |
22 | """ 23 | 24 | update: (output, domEl) -> 25 | $(domEl).find('.ip_address').html(output) 26 | 27 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/simple-clock.widget/index.coffee: -------------------------------------------------------------------------------- 1 | format = '%d %a %l:%M %p' 2 | 3 | command: "date +\"#{format}\"" 4 | 5 | # the refresh frequency in milliseconds 6 | refreshFrequency: 30000 7 | 8 | render: (output) -> """ 9 |

#{output}

10 | """ 11 | 12 | style: """ 13 | color: #FFFFFF 14 | font-family: Helvetica Neue 15 | left: 0 16 | bottom: 40px 17 | 18 | h1 19 | font-size: 5em 20 | font-weight: 100 21 | margin: 0 22 | padding: 0 23 | """ 24 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/top-cpu.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "ps axro \"pid, %cpu, ucomm\" | awk 'FNR>1' | head -n 3 | awk '{ printf \"%5.1f%%,%s,%s\\n\", $2, $3, $1}'" 2 | 3 | refreshFrequency: 2000 4 | 5 | style: """ 6 | bottom: 0px 7 | left: 0px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | 15 | td 16 | font-size: 24px 17 | font-weight: 100 18 | width: 100px 19 | max-width: 100px 20 | overflow: ellipsis 21 | text-shadow: 0 0 1px rgba(#000, 0.5) 22 | 23 | .wrapper 24 | padding: 4px 6px 4px 6px 25 | position: relative 26 | 27 | p 28 | padding: 0 29 | margin: 0 30 | font-size: 11px 31 | font-weight: normal 32 | max-width: 100% 33 | color: #ddd 34 | text-overflow: ellipsis 35 | text-shadow: none 36 | 37 | .pid 38 | position: absolute 39 | top: 2px 40 | right: 2px 41 | font-size: 10px 42 | font-weight: normal 43 | 44 | """ 45 | 46 | 47 | render: -> """ 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | """ 56 | 57 | update: (output, domEl) -> 58 | processes = output.split('\n') 59 | table = $(domEl).find('table') 60 | 61 | renderProcess = (cpu, name, id) -> 62 | "
" + 63 | "#{cpu}

#{name}

" + 64 | "
" 65 | 66 | for process, i in processes 67 | args = process.split(',') 68 | table.find(".col#{i+1}").html renderProcess(args...) 69 | 70 | -------------------------------------------------------------------------------- /sys-mon-set/sys-mon-set.widget/total-mem.widget/index.coffee: -------------------------------------------------------------------------------- 1 | # vm_stat returns pages (4096 bytes on mac). 256 pages per MB. 2 | # To convert pages to GB: no. of pages / 256 / 1024 3 | 4 | command: "vm_stat | awk 'NR==2 {print \"Free,\"($3 / 256) / 1024} NR==3 {print \"Active,\"($3 / 256) / 1024} NR==4 {print \"Inactive,\"($3 / 256) / 1024} NR==7 {print \"Wired,\"($4 / 256) / 1024}'" 5 | 6 | refreshFrequency: 1000 7 | 8 | style: """ 9 | bottom: 0px 10 | left: 300px 11 | color: #fff 12 | font-family: Helvetica Neue 13 | 14 | table 15 | border-collapse: collapse 16 | table-layout: fixed 17 | 18 | td 19 | font-size: 24px 20 | font-weight: 100 21 | width: 70px 22 | max-width: 70px 23 | overflow: hidden 24 | text-shadow: 0 0 1px rgba(#000, 0.5) 25 | 26 | .wrapper 27 | padding: 4px 6px 4px 6px 28 | position: relative 29 | 30 | 31 | p 32 | padding: 0 33 | margin: 0 34 | font-size: 11px 35 | font-weight: normal 36 | max-width: 100% 37 | color: #ddd 38 | text-overflow: ellipsis 39 | 40 | .pid 41 | position: absolute 42 | top: 2px 43 | right: 2px 44 | font-size: 10px 45 | font-weight: normal 46 | 47 | """ 48 | 49 | 50 | render: -> 51 | """ 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | """ 61 | 62 | update: (output, domEl) -> 63 | processes = output.split('\n') 64 | table = $(domEl).find('table') 65 | 66 | renderProcess = (type, mem) -> 67 | "
" + 68 | "#{Math.round(mem * 100) / 100}

#{type}

" + 69 | "
" 70 | 71 | for process, i in processes 72 | args = process.split(',') 73 | table.find(".col#{i+1}").html renderProcess(args...) 74 | 75 | -------------------------------------------------------------------------------- /sys-mon-set/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Sysmon Set", 3 | "description": "An arrangement of system monitoring widgets.", 4 | "author": "George Irwin and others", 5 | "email": "http://georgeirw.in" 6 | } 7 | -------------------------------------------------------------------------------- /to-do-list/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/to-do-list/screenshot.png -------------------------------------------------------------------------------- /to-do-list/to-do-list.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/to-do-list/to-do-list.widget.zip -------------------------------------------------------------------------------- /to-do-list/to-do-list/index.coffee: -------------------------------------------------------------------------------- 1 | refreshFrequency: 60000 2 | 3 | # ToDoList Entries: 4 | # Use a '-' for an open item 5 | # Use a '+' for a completed item 6 | todolistfile = '~/ToDo.list' 7 | 8 | command: "cat #{todolistfile} | awk 'BEGIN {print \"
    \"} /^[-]/ {print \"
  1. \"substr($0,2)\"
  2. \"} /^[+]/ {print \"
  3. \"substr($0,2)\"
  4. \"} END {print \"
\"}'" 9 | 10 | style: """ 11 | top: 10px 12 | left: 10px 13 | color: #fff 14 | font-family: Helvetica Neue 15 | 16 | h 17 | display: block 18 | text-align: center 19 | font-size: 24px 20 | font-weight: 100 21 | 22 | div 23 | display: block 24 | text-shadow: 0 0 1px rgba(#000, 0.5) 25 | font-size: 12px 26 | 27 | ol 28 | padding-left: 20px 29 | 30 | .completed 31 | color: #888 32 | font-weight: regular 33 | text-decoration:line-through 34 | """ 35 | 36 | 37 | render: -> """ 38 | ToDoList 39 |
40 | """ 41 | 42 | update: (output, domEl) -> 43 | $(domEl).find('.todolist').html(output) -------------------------------------------------------------------------------- /to-do-list/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "To Do List", 3 | "description": "Display a basic todo list on screen", 4 | "author": "Rich Somerfield", 5 | "email": "rs@richsomerfield.com" 6 | } 7 | -------------------------------------------------------------------------------- /top-cpu/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/top-cpu/screenshot.png -------------------------------------------------------------------------------- /top-cpu/top-cpu.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/top-cpu/top-cpu.widget.zip -------------------------------------------------------------------------------- /top-cpu/top-cpu.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "ps axro \"%cpu,ucomm,pid\" | awk 'FNR>1' | tail +1 | head -n 3 | sed -e 's/^[ ]*\\([0-9][0-9]*\\.[0-9][0-9]*\\)\\ /\\1\\%\\,/g' -e 's/\\ \\ *\\([0-9][0-9]*$\\)/\\,\\1/g'" 2 | 3 | refreshFrequency: 2000 4 | 5 | style: """ 6 | bottom: 10px 7 | left: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | table 12 | border-collapse: collapse 13 | table-layout: fixed 14 | 15 | &:after 16 | content: 'cpu' 17 | position: absolute 18 | left: 0 19 | top: -14px 20 | font-size: 10px 21 | 22 | td 23 | border: 1px solid #fff 24 | font-size: 24px 25 | font-weight: 100 26 | width: 120px 27 | max-width: 120px 28 | overflow: hidden 29 | text-shadow: 0 0 1px rgba(#000, 0.5) 30 | 31 | .wrapper 32 | padding: 4px 6px 4px 6px 33 | position: relative 34 | 35 | .col1 36 | background: rgba(#fff, 0.2) 37 | 38 | .col2 39 | background: rgba(#fff, 0.1) 40 | 41 | p 42 | padding: 0 43 | margin: 0 44 | font-size: 11px 45 | font-weight: normal 46 | max-width: 100% 47 | color: #ddd 48 | text-overflow: ellipsis 49 | text-shadow: none 50 | 51 | .pid 52 | position: absolute 53 | top: 2px 54 | right: 2px 55 | font-size: 10px 56 | font-weight: normal 57 | 58 | """ 59 | 60 | 61 | render: -> """ 62 | 63 | 64 | 65 | 66 | 67 | 68 |
69 | """ 70 | 71 | update: (output, domEl) -> 72 | processes = output.split('\n') 73 | table = $(domEl).find('table') 74 | 75 | renderProcess = (cpu, name, id) -> 76 | "
" + 77 | "#{cpu}

#{name}

" + 78 | "
#{id}
" + 79 | "
" 80 | 81 | for process, i in processes 82 | args = process.split(',') 83 | table.find(".col#{i+1}").html renderProcess(args...) 84 | 85 | -------------------------------------------------------------------------------- /top-cpu/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Top CPU", 3 | "description": "Shows a CPU usage summary.", 4 | "author": "Felix Hageloh" 5 | } 6 | -------------------------------------------------------------------------------- /top-mem/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/top-mem/screenshot.png -------------------------------------------------------------------------------- /top-mem/top-mem.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/top-mem/top-mem.widget.zip -------------------------------------------------------------------------------- /top-mem/top-mem.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "ps axo \"rss,pid,ucomm\" | sort -nr | tail +1 | head -n3 | awk '{printf \"%8.0f MB,%s,%s\\n\", $1/1024, $3, $2}'" 2 | 3 | refreshFrequency: 5000 4 | 5 | style: """ 6 | bottom: 10px 7 | right: 10px 8 | color: #fff 9 | font-family: Helvetica Neue 10 | 11 | 12 | table 13 | border-collapse: collapse 14 | table-layout: fixed 15 | 16 | &:before 17 | content: 'mem' 18 | position: absolute 19 | right: 0 20 | top: -14px 21 | font-size: 10px 22 | 23 | td 24 | border: 1px solid #fff 25 | font-size: 24px 26 | font-weight: 100 27 | width: 120px 28 | max-width: 120px 29 | overflow: hidden 30 | text-shadow: 0 0 1px rgba(#000, 0.5) 31 | 32 | .wrapper 33 | padding: 4px 6px 4px 6px 34 | position: relative 35 | 36 | .col1 37 | background: rgba(#fff, 0.2) 38 | 39 | .col2 40 | background: rgba(#fff, 0.1) 41 | 42 | p 43 | padding: 0 44 | margin: 0 45 | font-size: 11px 46 | font-weight: normal 47 | max-width: 100% 48 | color: #ddd 49 | text-overflow: ellipsis 50 | 51 | .pid 52 | position: absolute 53 | top: 2px 54 | right: 2px 55 | font-size: 10px 56 | font-weight: normal 57 | 58 | """ 59 | 60 | 61 | render: -> 62 | """ 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | """ 71 | 72 | update: (output, domEl) -> 73 | processes = output.split('\n') 74 | table = $(domEl).find('table') 75 | 76 | renderProcess = (cpu, name, id) -> 77 | "
" + 78 | "#{cpu}

#{name}

" + 79 | "
#{id}
" + 80 | "
" 81 | 82 | for process, i in processes 83 | args = process.split(',') 84 | table.find(".col#{i+1}").html renderProcess(args...) 85 | 86 | -------------------------------------------------------------------------------- /top-mem/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Top MEM", 3 | "description": "Shows a memory usage summary.", 4 | "author": "Felix Hageloh" 5 | } 6 | -------------------------------------------------------------------------------- /wildstar-server-status/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/wildstar-server-status/screenshot.png -------------------------------------------------------------------------------- /wildstar-server-status/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wildstar Server Status", 3 | "description": "Display server status for the specified Wildstar (MMO) server. This uses http://wsstatus.com for status", 4 | "author": "Eric Miller", 5 | "email": "emiller42@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /wildstar-server-status/wildstar-server-status.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/wildstar-server-status/wildstar-server-status.widget.zip -------------------------------------------------------------------------------- /wildstar-server-status/wildstar-server-status.widget/index.coffee: -------------------------------------------------------------------------------- 1 | auth_server = 1 # 1 == NA, 2 == EU 2 | 3 | server_name = 'stormtalon' # replace with the server you care about 4 | 5 | command: "curl -s http://wsstatus.com/embed/json.php?serverid=\"#{auth_server}\" && echo \"|\" && curl -s http://wsstatus.com/embed/json.php?server=\"#{server_name}\"" 6 | 7 | style: """ 8 | background: rgba(#fff, 0) 9 | color: #FFFFFF 10 | font-family: Helvetica Neue 11 | left: 50px 12 | bottom: 50% 13 | 14 | &:after 15 | content: 'Wildstar Server Status' 16 | position: absolute 17 | left: 0 18 | top: -16px 19 | font-size: 10px 20 | 21 | table 22 | border-collapse: collapse 23 | table-layout: fixed 24 | font-size: 24px 25 | 26 | p 27 | padding: 0 28 | margin: 0px 5px 0px 5px 29 | max-width: 100% 30 | text-overflow: ellipsis 31 | text-shadow: none 32 | 33 | th 34 | text-align: right 35 | border: 1px solid #fff 36 | background: rgba(#ffff, 0.15) 37 | width: 260px 38 | max-width: 260px 39 | 40 | td 41 | text-align: left 42 | border: 1px solid #fff 43 | font-weight: 100 44 | width: 100px 45 | max-width: 100px 46 | 47 | """ 48 | 49 | refreshFrequency: 30000 50 | 51 | render: -> """ 52 | 53 | 54 | 56 | 57 | 58 | 60 | 61 |
55 |
59 |
62 | """ 63 | 64 | update: (output, domEl) -> 65 | servers = output.split('|') 66 | table = $(domEl).find('table') 67 | 68 | renderName = (name, type) -> 69 | "

#{name} (#{type})

" 70 | 71 | renderStatus = (status) -> 72 | "

#{status}" 73 | 74 | for server, i in servers 75 | data = JSON.parse(server)[0] 76 | table.find(".name#{i+1}").html renderName(data.Name, data.Type) 77 | table.find(".status#{i+1}").html renderStatus(data.Status) 78 | -------------------------------------------------------------------------------- /worldcup/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/worldcup/screenshot.png -------------------------------------------------------------------------------- /worldcup/widget.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "worldcup", 3 | "description": "Display today's worldcup matches", 4 | "author": "Michael Goldmann", 5 | "email": "gooldmann.michael@gmail.com" 6 | } 7 | -------------------------------------------------------------------------------- /worldcup/worldcup.widget.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/worldcup/worldcup.widget.zip -------------------------------------------------------------------------------- /worldcup/worldcup.widget/README.md: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | 3 | * python 4 | 5 | # Credits 6 | 7 | * Icon by AHA-SOFT (http://www.aha-soft.com) 8 | -------------------------------------------------------------------------------- /worldcup/worldcup.widget/football.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/8dd6cbec71a13f569c3ef8ed5d56089b2312ee1b/worldcup/worldcup.widget/football.ico -------------------------------------------------------------------------------- /worldcup/worldcup.widget/index.coffee: -------------------------------------------------------------------------------- 1 | command: "worldcup.widget/worldcup.py" 2 | 3 | refreshFrequency: 60000 4 | 5 | style: """ 6 | top: 260px; 7 | right: 1% 8 | color: #fff 9 | font-family: Helvetica Neue 10 | font-size: 10pt 11 | text-align: right 12 | 13 | h1 14 | font-size: 12pt 15 | .img 16 | margin-right: 10px 17 | """ 18 | 19 | render: (_) -> """ 20 |

World Cup 2014

21 |
22 |
23 | """ 24 | 25 | update: (output, domEl) -> 26 | $(domEl).find('.output').html output -------------------------------------------------------------------------------- /worldcup/worldcup.widget/worldcup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | # coding:utf-8 3 | 4 | import datetime 5 | import json 6 | import urllib2 7 | import dateutil.parser 8 | import dateutil.tz 9 | 10 | ##rest endpoint for today's matches 11 | URL = "http://worldcup.sfg.io/matches/today" 12 | 13 | try: 14 | data = json.load(urllib2.urlopen(URL)) 15 | 16 | ##Set local timezone 17 | timezone = dateutil.tz.tzlocal() 18 | 19 | ##iterate through matches 20 | for match in data: 21 | matchtime = dateutil.parser.parse(match.get("datetime")) 22 | matchtime = matchtime.astimezone(timezone) 23 | 24 | if (match.get("status") == 'future'): 25 | goals = " - " 26 | else: 27 | goals = "({0}) - ({1})".format(match.get("home_team").get("goals"), match.get("away_team").get("goals")) 28 | 29 | print """

{team1} {goals} {team2}, 30 | {start_time}

""".format(team1=match.get("home_team").get("code"), 31 | team2=match.get("away_team").get("code"), 32 | goals=goals, 33 | start_time=matchtime.strftime("%a %H:%M")) 34 | 35 | except Exception: 36 | print "n/A" --------------------------------------------------------------------------------