{"id":31626328,"url":"https://github.com/gavinjudd/sonder-nextup-rainmeter","last_synced_at":"2026-04-21T03:31:18.759Z","repository":{"id":317765783,"uuid":"1068751660","full_name":"gavinjudd/sonder-nextup-rainmeter","owner":"gavinjudd","description":"Rainmeter + Sonder card that shows next 4 Google Calendar events (multi-ICS)","archived":false,"fork":false,"pushed_at":"2025-10-20T04:13:46.000Z","size":1523,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-20T07:46:35.795Z","etag":null,"topics":["calendar","customization","desktop-customization","google-calendar","powershell","productivity","rainmeter","startallback","translucenttb","wallpaper-engine","windows","windows-11"],"latest_commit_sha":null,"homepage":"","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gavinjudd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-02T21:16:43.000Z","updated_at":"2025-10-20T04:10:28.000Z","dependencies_parsed_at":"2025-10-02T23:30:17.565Z","dependency_job_id":"76883d55-8e03-49d1-a38a-9945f60015f0","html_url":"https://github.com/gavinjudd/sonder-nextup-rainmeter","commit_stats":null,"previous_names":["gavinjudd/sonder-nextup-rainmeter"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/gavinjudd/sonder-nextup-rainmeter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinjudd%2Fsonder-nextup-rainmeter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinjudd%2Fsonder-nextup-rainmeter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinjudd%2Fsonder-nextup-rainmeter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinjudd%2Fsonder-nextup-rainmeter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gavinjudd","download_url":"https://codeload.github.com/gavinjudd/sonder-nextup-rainmeter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinjudd%2Fsonder-nextup-rainmeter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32075217,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T02:38:07.213Z","status":"ssl_error","status_checked_at":"2026-04-21T02:38:06.559Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","customization","desktop-customization","google-calendar","powershell","productivity","rainmeter","startallback","translucenttb","wallpaper-engine","windows","windows-11"],"created_at":"2025-10-06T19:50:34.514Z","updated_at":"2026-04-21T03:31:18.744Z","avatar_url":"https://github.com/gavinjudd.png","language":"PowerShell","funding_links":[],"categories":[],"sub_categories":[],"readme":"Here’s a drop-in **README.md** you can paste at repo root.\r\n\r\n---\r\n\r\n# sonder-nextup-rainmeter\r\n\r\nClean “UP NEXT” calendar card for Rainmeter (Sonder vibe: dark card, cyan accent).\r\nIt reads your Google Calendar via private **ICS** links, merges multiple calendars, and shows the next **4** events in a rolling **7-day** window.\r\n\r\n![Preview](screenshots/preview.png)\r\n\r\n---\r\n\r\n## What you get\r\n\r\n* **Sonder/Calendar** skin: compact card with clipped lines, thin divider, cyan date/time.\r\n* **PowerShell fetcher**: robust ICS parser (TZID, UTC “Z”, all-day `VALUE=DATE`, folded lines, RRULE, EXDATE, `RECURRENCE-ID` including `RANGE=THISANDFUTURE`).\r\n* **Multi-ICS**: primary calendar fills the list first, then secondary calendars backfill.\r\n* **No secrets in repo**: ICS URLs loaded from `secrets.ini` (ignored by git).\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n* Windows 10/11\r\n* [Rainmeter](https://www.rainmeter.net/)\r\n* (Optional) [Wallpaper Engine], [StartAllBack], [TranslucentTB] – used in screenshots.\r\n\r\n---\r\n\r\n## Install (Quick Start)\r\n\r\n1. **Get the files**\r\n\r\n   * Clone this repo or download the latest release zip and extract it.\r\n\r\n2. **Copy the skin**\r\n\r\n   * Copy the `Sonder` folder to:\r\n     `C:\\Users\\\u003cyou\u003e\\Documents\\Rainmeter\\Skins\\`\r\n\r\n3. **Add your calendars (secrets)**\r\n\r\n   * In `Sonder\\@Resources\\`, copy:\r\n\r\n     ```\r\n     secrets.example.ini → secrets.ini\r\n     ```\r\n   * Paste your private ICS URL(s). Either:\r\n\r\n     ```ini\r\n     # One line, comma or semicolon separated:\r\n     ICS_URLS=https://.../private-AAAA/basic.ics, https://.../private-BBBB/basic.ics\r\n     ```\r\n\r\n     or\r\n\r\n     ```ini\r\n     ICS_URL=https://.../private-AAAA/basic.ics\r\n     ICS_URL2=https://.../private-BBBB/basic.ics\r\n     ```\r\n\r\n4. **Fetch once (test run)**\r\n   Open PowerShell and run:\r\n\r\n   ```powershell\r\n   powershell -ExecutionPolicy Bypass -File \".\\Sonder\\@Resources\\gcal_fetch.ps1\"\r\n   ```\r\n\r\n   This writes `gcal_events.txt` and a log `gcal_log.txt` in `Sonder\\@Resources\\`.\r\n\r\n5. **Load the skin**\r\n\r\n   * In Rainmeter, load `Sonder\\Calendar\\Calendar.ini`, then **Refresh all**.\r\n\r\nYou should see up to 4 upcoming events formatted like:\r\n\r\n```\r\nFri 10/24 • 12:30 PM • Cyber Ranges x Gavin Judd bi-weekly updates\r\n```\r\n\r\n---\r\n\r\n## Auto-refresh options\r\n\r\n### A) Task Scheduler (recommended)\r\n\r\nTwo ways:\r\n\r\n* **One-command installer**\r\n\r\n  ```powershell\r\n  .\\scripts\\install_task.ps1  -TaskName \"Sonder Calendar Fetch\" -IntervalMinutes 10\r\n  ```\r\n\r\n  Runs at logon and every 10 minutes (edit the number to taste).\r\n\r\n* **Import the XML**\r\n\r\n  1. Task Scheduler → *Import Task…*\r\n  2. Pick `tools/Sonder-Calendar-Fetch.xml`.\r\n  3. Edit the **Arguments** and **WorkingDirectory** paths if your repo lives somewhere else.\r\n  4. Ensure **Run with highest privileges** is checked.\r\n\r\n### B) Rainmeter RunCommand (alternate)\r\n\r\nAdd a `RunCommand` measure in your skin to trigger every 10 minutes:\r\n\r\n```ini\r\n[MeasureFetch]\r\nMeasure=Plugin\r\nPlugin=RunCommand\r\nProgram=powershell.exe\r\nParameter=-NoProfile -ExecutionPolicy Bypass -File \"#@#\\gcal_fetch.ps1\"\r\nState=Hide\r\nUpdateDivider=600\r\n```\r\n\r\n\u003e Keep either Task Scheduler **or** RunCommand (don’t run both).\r\n\r\n---\r\n\r\n## Configuration \u0026 customization\r\n\r\n**Fetcher (PowerShell):** top of `gcal_fetch.ps1`\r\n\r\n* `\\$MaxItems = 4` – how many lines to show.\r\n* `\\$WindowDays = 7` – rolling window length.\r\n* `\\$IncludeLocation = \\$true | \\$false` – append `— Location` to titles.\r\n* Logging is written to `Sonder\\@Resources\\gcal_log.txt`.\r\n\r\n**Skin (Calendar.ini):**\r\n\r\n* Accent cyan ≈ `35,201,235` (tweak the color variables at the top).\r\n* Row spacing/width as `#RowHeight#`, `#CardWidth#`.\r\n* Date/time is cyan via `InlinePattern`; titles are white; `ClipString=1`; 12px steps; divider line.\r\n* Hides the card group if line 1 equals `No events in the next 7 days`.\r\n\r\n**Priority logic:**\r\n\r\n* The **first** ICS in `secrets.ini` is *primary*; it fills up to 4 slots first.\r\n* If slots remain, secondary calendars backfill.\r\n* Final display is always sorted chronologically.\r\n\r\n**Optional local filters (for stubborn vendor ghosts):**\r\n\r\n```ini\r\n# Hide a single day by summary + date (local)\r\nHIDE_SUMMARY_DAY=Cyber Ranges x Gavin Judd Updates|2025-10-23\r\n\r\n# Hide all occurrences from a local date forward\r\nHIDE_SUMMARY_FROM=Gavin / Alfredo Conectado|2024-03-01\r\n```\r\n\r\n\u003e These are last-resort, local-only safeguards; do not commit `secrets.ini`.\r\n\r\n---\r\n\r\n## Repo layout\r\n\r\n```\r\nsonder-nextup-rainmeter/\r\n├─ README.md\r\n├─ LICENSE                     # MIT\r\n├─ .gitignore\r\n├─ .gitattributes\r\n├─ CHANGELOG.md\r\n├─ CONTRIBUTING.md\r\n├─ SECURITY.md\r\n├─ .github/ISSUE_TEMPLATE/\r\n│  ├─ bug_report.yml\r\n│  └─ feature_request.yml\r\n├─ scripts/\r\n│  ├─ run_fetch.ps1\r\n│  └─ install_task.ps1\r\n├─ tools/\r\n│  └─ Sonder-Calendar-Fetch.xml\r\n├─ tests/\r\n│  └─ sample.ics\r\n├─ screenshots/\r\n│  └─ preview.png\r\n└─ Sonder/\r\n   ├─ Calendar/Calendar.ini\r\n   └─ @Resources/\r\n      ├─ gcal_fetch.ps1\r\n      ├─ secrets.example.ini      # users copy → secrets.ini (not tracked)\r\n      └─ (fonts/, images/ optional)\r\n```\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n* **Empty list:**\r\n\r\n  * Open `Sonder\\@Resources\\gcal_log.txt` and read the last 40 lines.\r\n  * Check `secrets.ini` is in `Sonder\\@Resources\\` and contains valid ICS URLs (not placeholders).\r\n  * Run the fetch manually again (see Quick Start step 4).\r\n  * If using Task Scheduler, confirm the task history and paths (ExecutionPolicy Bypass, correct **Start in** folder).\r\n\r\n* **Times look wrong:**\r\n\r\n  * We map `TZID=America/New_York` (and other common IANA zones) to Windows IDs.\r\n  * Ensure your Windows time zone is set correctly.\r\n\r\n* **Phantom/old recurring instances:**\r\n\r\n  * The parser handles `EXDATE`, `RECURRENCE-ID` (incl. `RANGE=THISANDFUTURE`) and adds tolerant fallbacks.\r\n  * If a stubborn item remains due to vendor caching/format quirks, add a local rule in `secrets.ini` (see **Optional local filters**).\r\n\r\n* **Rainmeter shows only 1–2 lines:**\r\n\r\n  * The fetcher only writes **up to 4** within the next 7 days. If you actually have \u003c4 upcoming events, that’s expected.\r\n  * Otherwise, open `gcal_log.txt` to see which items were filtered (canceled, outside window, or hidden).\r\n\r\n---\r\n\r\n## Privacy \u0026 security\r\n\r\n* **Do not share** your private ICS URLs.\r\n* `secrets.ini`, `gcal_events.txt`, and `gcal_log.txt` are **ignored** by git:\r\n\r\n  ```\r\n  Sonder/@Resources/secrets.ini\r\n  Sonder/@Resources/gcal_events.txt\r\n  Sonder/@Resources/gcal_log.txt\r\n  ```\r\n* If you accidentally committed a secret, rotate the ICS URL in Google Calendar immediately.\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nPRs are welcome! Please don’t include secrets or runtime files.\r\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and open a bug with the tail of `gcal_log.txt` if parsing goes sideways.\r\n\r\n---\r\n\r\n## License\r\n\r\n[MIT](LICENSE) — attribution appreciated.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgavinjudd%2Fsonder-nextup-rainmeter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgavinjudd%2Fsonder-nextup-rainmeter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgavinjudd%2Fsonder-nextup-rainmeter/lists"}