{"id":50726396,"url":"https://github.com/sharadcodes/deskpat","last_synced_at":"2026-06-10T04:31:59.103Z","repository":{"id":360207045,"uuid":"1249139846","full_name":"sharadcodes/deskpat","owner":"sharadcodes","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-25T12:34:01.000Z","size":3286,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T14:09:47.456Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sharadcodes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2026-05-25T11:47:00.000Z","updated_at":"2026-05-25T12:34:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sharadcodes/deskpat","commit_stats":null,"previous_names":["sharadcodes/deskpat"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/sharadcodes/deskpat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharadcodes%2Fdeskpat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharadcodes%2Fdeskpat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharadcodes%2Fdeskpat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharadcodes%2Fdeskpat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sharadcodes","download_url":"https://codeload.github.com/sharadcodes/deskpat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharadcodes%2Fdeskpat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34137570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-10T04:31:59.005Z","updated_at":"2026-06-10T04:31:59.085Z","avatar_url":"https://github.com/sharadcodes.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💻 DESKPAT: Spanned Wallpaper \u0026 System Dashboard\n\nWelcome to **DESKPAT** (derived from the Hindi word **पट (Pat)**, meaning *screen, canvas, or backdrop*), a modular, spanned multi-monitor wallpaper generator and real-time developer status HUD. Turn your empty desktop workspace into an elegant, custom-rendered dashboard.\n\n![DESKPAT Showcase](deskpat_promo.png)\n\n\u003e [!NOTE]\n\u003e **OS Compatibility Support**:\n\u003e * **Windows**: Fully supported and tested.\n\u003e * **macOS \u0026 Linux**: Core telemetry queries, multi-monitor display calculations, and background setters are implemented but currently **untested/experimental**. If you run these platforms, feedback and pull requests are highly welcome!\n\n---\n\n## ✨ Features\n\n* 📐 **Display Spanning**: Dynamically queries monitor coordinates, resolutions, and scaling factors to compile a single unified wallpaper canvas spanning all screens.\n* 📊 **Live Diagnostics**: Built-in telemetry sensors track system uptime, local IP address, RAM/CPU load, and custom registered variables.\n* 📋 **Todo Checklist CLI**: Interactively append, complete, and clear tasks from your checklist directly using CLI commands.\n* 🎨 **HTML/CSS Visual Templates**: Design and render layouts using modern web technologies (compiled via headless Puppeteer).\n* 🔌 **Scriptable Fetchers**: Execute custom scripts (Node.js, Python, PowerShell, or Bash) to pull dynamic external APIs (quotes, weather, RSS feeds) into your background.\n\n---\n\n## 📂 Project Structure\n\nAll core implementation files are stored in `deskpat_src/` to keep your root directory clean:\n\n```text\ndeskpat/\n│\n├── deskpat.bat / deskpat.ps1  # Root wrappers (launchers)\n├── README.md                  # This guide\n├── deskpat_promo.png          # Promotional banner\n└── deskpat_src/\n    ├── deskpat.py             # Python orchestrator \u0026 monitor engine\n    ├── sensors.py             # System telemetry sensor plugins\n    ├── render.js              # Puppeteer HTML screenshot render engine\n    ├── config.json            # Theme \u0026 default configurations\n    ├── todo.json              # Local tasks list database\n    ├── data.json              # Standardized API payload context\n    ├── scripts/               # Custom fetchers folder\n    │   ├── sadhguru.js        # Dynamic quotes \u0026 feeds fetcher\n    │   └── template.js        # Fetcher boilerplate template\n    └── templates/             # HTML layout templates\n        ├── default/           # Glassmorphic full-stats dashboard\n        └── minimal/           # Joyful split layout (Checklist \u0026 Quotes)\n```\n\n---\n\n## ⚡ Quick Start \u0026 Setup\n\n### 1. Prerequisites\nEnsure you have the following installed on your computer:\n* **Python 3.x** (with `pip` in your system `PATH`)\n* **Node.js \u0026 npm** (with `node` in your system `PATH`)\n\n### 2. Dependency Initialization\nWhen you run the tool for the first time, it automatically installs any missing dependencies:\n* **Python**: `Pillow` (PIL) library\n* **Node.js**: `puppeteer` (headless compiler)\n\n### 3. Running the Engine\nTo fetch the latest data, build the layout canvas, and set the Span desktop wallpaper, run the launcher for your shell:\n\n```bash\n# Using Batch (Windows CMD)\n.\\deskpat.bat\n\n# Using PowerShell\n.\\deskpat.ps1\n\n# Directly via Python\npython deskpat_src/deskpat.py\n```\n\n---\n\n## ⏰ Pro-Tip: Automate Updates with Task Scheduler\n\nTo re-apply the generated wallpaper after Windows sign-in and keep system stats fresh, register two current-user tasks:\n\n* `Deskpat-AtLogon` runs once after sign-in. The 30-second delay gives Windows time to initialize the monitor layout before Deskpat generates the spanned wallpaper.\n* `Deskpat-Every15Min` refreshes the wallpaper every 15 minutes so uptime, RAM, todos, and fetched content stay current.\n\n### On Windows (via PowerShell)\nRun this command from the project root. Administrator PowerShell is not required for the current-user task:\n\n```powershell\n$taskName = \"Deskpat-AtLogon\"\n$deskpat = \"C:\\SOFTWARES\\deskpat\\deskpat.ps1\"\n\n$action = New-ScheduledTaskAction `\n  -Execute \"powershell.exe\" `\n  -Argument \"-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `\"$deskpat`\"\" `\n  -WorkingDirectory \"C:\\SOFTWARES\\deskpat\"\n\n$trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME\n$trigger.Delay = \"PT30S\"\n\n$settings = New-ScheduledTaskSettingsSet `\n  -StartWhenAvailable `\n  -AllowStartIfOnBatteries `\n  -DontStopIfGoingOnBatteries\n\nRegister-ScheduledTask `\n  -TaskName $taskName `\n  -Action $action `\n  -Trigger $trigger `\n  -Settings $settings `\n  -Description \"Run Deskpat wallpaper generator after user logon\" `\n  -Force\n```\n\nRegister the repeating refresh task:\n\n```powershell\n$taskName = \"Deskpat-Every15Min\"\n$deskpat = \"C:\\SOFTWARES\\deskpat\\deskpat.ps1\"\n\n$action = New-ScheduledTaskAction `\n  -Execute \"powershell.exe\" `\n  -Argument \"-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `\"$deskpat`\"\" `\n  -WorkingDirectory \"C:\\SOFTWARES\\deskpat\"\n\n$trigger = New-ScheduledTaskTrigger `\n  -Once `\n  -At (Get-Date).AddMinutes(1) `\n  -RepetitionInterval (New-TimeSpan -Minutes 15) `\n  -RepetitionDuration (New-TimeSpan -Days 3650)\n\n$settings = New-ScheduledTaskSettingsSet `\n  -StartWhenAvailable `\n  -AllowStartIfOnBatteries `\n  -DontStopIfGoingOnBatteries\n\nRegister-ScheduledTask `\n  -TaskName $taskName `\n  -Action $action `\n  -Trigger $trigger `\n  -Settings $settings `\n  -Description \"Update Deskpat wallpaper every 15 minutes\" `\n  -Force\n```\n\nThe refresh interval is customizable. Change `New-TimeSpan -Minutes 15` to any interval you want, such as `New-TimeSpan -Minutes 5` or `New-TimeSpan -Minutes 30`. Shorter intervals work, but each run launches Puppeteer and rewrites the wallpaper, so 15 minutes is a practical default.\n\nVerify the task without signing out:\n\n```powershell\nStart-ScheduledTask -TaskName \"Deskpat-Every15Min\"\nGet-ScheduledTaskInfo -TaskName \"Deskpat-Every15Min\" |\n  Select-Object LastRunTime, LastTaskResult\n\nschtasks /Query /TN Deskpat-Every15Min /FO LIST /V\n```\n\n`LastTaskResult` should be `0`, and `schtasks` should show `Repeat: Every: 0 Hour(s), 15 Minute(s)`. You can also confirm Windows is caching the correct spanned wallpaper dimensions:\n\n```powershell\nAdd-Type -AssemblyName System.Drawing\n$path = \"$env:APPDATA\\Microsoft\\Windows\\Themes\\TranscodedWallpaper\"\n$img = [System.Drawing.Image]::FromFile($path)\ntry {\n  [pscustomobject]@{ Width = $img.Width; Height = $img.Height }\n} finally {\n  $img.Dispose()\n}\n```\n\nFor a two-monitor layout, the cached dimensions should match the full virtual desktop canvas, not a single monitor. For example, a 2560x1440 primary plus a 1920x1080 secondary may produce a `4480x1440` spanned cache.\n\nRemove the task if needed:\n\n```powershell\nUnregister-ScheduledTask -TaskName \"Deskpat-AtLogon\" -Confirm:$false\nUnregister-ScheduledTask -TaskName \"Deskpat-Every15Min\" -Confirm:$false\n```\n\n### On macOS / Linux (via Cron)\nAdd a crontab entry to execute the orchestrator:\n```bash\n# Run crontab -e and append:\n*/15 * * * * cd /path/to/deskpat \u0026\u0026 ./deskpat.bat \u003e/dev/null 2\u003e\u00261\n```\n\n---\n\n## 🛠️ CLI Options\n\nThe orchestrator CLI accepts arguments to override default configurations:\n\n| Option | Description |\n| :--- | :--- |\n| `--script \u003cfile\u003e` | Run a custom data fetcher script from `scripts/` (e.g. `--script sadhguru.js`) |\n| `--template \u003cname\u003e` | Render a specific layout template folder (e.g. `--template default`) |\n| `--url \u003capi_url\u003e` | Fetch raw text or JSON data directly from a web URL (bypassing custom scripts) |\n| `--select` | Interactively list and pick an available template in the console |\n\n*Note: Any unrecognized arguments are automatically forwarded straight to your custom script (e.g. `deskpat --script my_script.py --city \"Seattle\"`).*\n\n---\n\n## 📋 Local Todo Subcommand\n\nDESKPAT includes a built-in command-line task checklist manager. Running these commands will modify `todo.json`, and the changes will render on your desktop checklist instantly on the next background update:\n\n| Command | Description |\n| :--- | :--- |\n| `deskpat todo list` | List all active checklist tasks |\n| `deskpat todo add \"Task\"` | Add a new task to your checklist |\n| `deskpat todo done \u003cindex\u003e` | Toggle completion status of task `\u003cindex\u003e` (e.g. `deskpat todo done 1`) |\n| `deskpat todo remove \u003cindex\u003e`| Remove task `\u003cindex\u003e` from the checklist |\n| `deskpat todo clear` | Clear all tasks |\n\n---\n\n## 🔌 Extensibility \u0026 Customization\n\n### 1. Writing Custom Data Fetchers\nYou can drop scripts into `deskpat_src/scripts/`. Fetcher scripts can be written in **Node.js (`.js`)**, **Python (`.py`)**, **PowerShell (`.ps1`)**, or **Shell (`.sh`/`.bat`)**.\n* **Requirement**: The script must output a clean JSON object to `stdout`.\n* The orchestrator automatically executes your script, parses its output, and saves it into `data.json`.\n\n### 2. Creating New Visual Layouts\nTemplates are stored under `deskpat_src/templates/`. To build your own:\n1. Create a folder (e.g., `templates/custom-dashboard/`).\n2. Add a `template.html` and `style.css`.\n3. In `template.html`, read the global context `window.wallpaperData` in JavaScript to populate your fields.\n4. Set it as default in `config.json` or call `deskpat --template custom-dashboard`.\n\n### 3. Adding New Modular OS/System Sensors\nOS-level metrics are queried via `deskpat_src/sensors.py`. To add a new system stat (e.g., free disk space, CPU temperature, or battery level):\n1. Open `sensors.py` and write a Python function.\n2. Register it using the `@sensor(\"metric_name\")` decorator.\n\n```python\n@sensor(\"disk_free_gb\")\ndef get_disk_free():\n    import shutil\n    total, used, free = shutil.disk_usage(\"/\")\n    return round(free / (1024**3), 1)\n```\n\nThis variable automatically loads into `data.json` and becomes instantly available inside your HTML templates in JavaScript at `window.wallpaperData.system.disk_free_gb`!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharadcodes%2Fdeskpat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsharadcodes%2Fdeskpat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharadcodes%2Fdeskpat/lists"}