{"id":13599014,"url":"https://github.com/dharmx/vile","last_synced_at":"2025-04-05T13:08:45.341Z","repository":{"id":38378584,"uuid":"431466930","full_name":"dharmx/vile","owner":"dharmx","description":"Waste of time. Smelly widgets feat. Spaghetti code. Built with eww-3.0.","archived":false,"fork":false,"pushed_at":"2024-06-29T09:17:50.000Z","size":105814,"stargazers_count":368,"open_issues_count":1,"forks_count":16,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-03-29T12:07:41.299Z","etag":null,"topics":["aesthetics","eww","linux","low-maintenance","rice","widgets"],"latest_commit_sha":null,"homepage":"https://dharmx.is-a.dev/eww-powermenu","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dharmx.png","metadata":{"files":{"readme":".github/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}},"created_at":"2021-11-24T12:00:36.000Z","updated_at":"2025-03-07T17:57:31.000Z","dependencies_parsed_at":"2024-01-14T06:04:20.750Z","dependency_job_id":"6f25e459-952f-46a5-b0f4-d460db0a32ed","html_url":"https://github.com/dharmx/vile","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dharmx%2Fvile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dharmx%2Fvile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dharmx%2Fvile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dharmx%2Fvile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dharmx","download_url":"https://codeload.github.com/dharmx/vile/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339158,"owners_count":20923014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["aesthetics","eww","linux","low-maintenance","rice","widgets"],"created_at":"2024-08-01T17:00:58.952Z","updated_at":"2025-04-05T13:08:45.316Z","avatar_url":"https://github.com/dharmx.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n\n[![banner](./readme/banner.png)](https://github.com/dharmx/vile)\n\n[![issues](https://img.shields.io/github/issues/dharmx/vile?color=%23f87070\u0026style=for-the-badge)](https://github.com/dharmx/vile/issues)\n[![size](https://img.shields.io/github/repo-size/dharmx/vile?color=70c0ba\u0026style=for-the-badge)](github.com/dharmx/vile)\n[![stars](https://img.shields.io/github/stars/dharmx/vile?color=c397d8\u0026style=for-the-badge)](https://github.com/dharmx/vile/stargazers)\n[![commits](https://img.shields.io/github/commit-activity/m/dharmx/vile?color=%2379dcaa\u0026style=for-the-badge)](https://github.com/dharmx/vile/commits)\n\n\u003c/div\u003e\n\n# 👋 Introduction\n\nGreetings, visitors. This is a repository of various useless GUI\n[widgets](https://www.merriam-webster.com/dictionary/widget) that may or, may\nnot enchance the look of your current desktop interface.\nI will walk you through each and every step of the installation process so,\nmake sure to hit that lik- follow everything in a step-by-step fashion.\n\nAnd if you are here to borrow code then you may skip this README \u003csamp\u003eObviously\u003c/samp\u003e.\n\n## 🚒 Procedure\n\nA brief explanation of explanation (explanception!). This section is optional\nbut it wouldn't hurt to gloss over it.\n\n- [Introduction, brief description and greetings.](https://github.com/dharmx/vile#-introduction)\n- [Procedure, explanception.](https://github.com/dharmx/vile#-procedure)\n- [Showcase. Brief showcase, two screenshots of the project in action.](https://github.com/dharmx/vile#-showcase)\n- [Assumptions. Conditions and constraints.](https://github.com/dharmx/vile#-assumptions)\n- [Structure. Project structure and design decisions.](https://github.com/dharmx/vile#-structure)\n- \u003csamp\u003eMAKE IT STOP!\u003c/samp\u003e\n- [Dependencies. Modules, packages, scripts and resources that are required.](https://github.com/dharmx/vile#-dependencies)\n- [Configuration. Setting things up.](https://github.com/dharmx/vile#configuration)\n- [Hacking. Advanced configuration.](https://github.com/dharmx/vile#hacking)\n- [Gallery.](https://github.com/dharmx/vile#gallery)\n- [Samples.](https://github.com/dharmx/vile#samples)\n- End Goals.\n- Not Goals.\n- Tips. Useless shit.\n- FAQ.\n- Credits. Acknowledgements.\n- TODOs.\n- License.\n\n## 🖼 Showcase\n\n![demo](./readme/demo.png)\n\n## 🤔 Assumptions\n\nList of conditions and constraints that are needed to be fulfilled.\nThis section solely to reduce some headaches.\nThis is done because I do not want to spend an extensive amount of time writing\ninstructions for several Linux distributions.\n\nI will choose Archlinux as a reference frame as I have only used Archlinux,\nManjaro and EndeavourOS in the past.\nSo, following are roughly some assumptions that I will follow:\n\n- You are using either Archlinux or, an Arch-based distro like Manjaro.\n- You already have an editor, a browser and necessary utilities installed like\n`sudo, git, etc`.\n- You have `python` installed.\n- You are using an [AUR helper](https://wiki.archlinux.org/title/AUR_helpers).\n- You are using `bspwm` as your [window manager](https://wiki.archlinux.org/title/Window_manager).\n- You are using `sxhkd` as your [keyboard daemon](https://wiki.archlinux.org/title/Keyboard_shortcuts).\n- You use pulseaudio.\n\n## 🌿 Structure\n\nThis is an important section for those who want to borrow some piece of\nfunctionality for use in their projects.\nThis section will paint a general idea of how stuff is being linked to one\nanother so, you can have a general idea\nfor handling or, understanding a bug if one appears (which it will at some point).\n\n### 🌿 General structure\n\n```txt\n├── assets\n├── src\n│   ├── scss\n│   ├── shell\n│   └── yuck\n└── themes\n```\n\n- `assets` contains images, graphics and svgs for use in the project.\n- `src.scss` contains all theming files. Theming is done using\n[SCSS](https://sass-lang.com/). So, all of the files in this directory will also\nbe SCSS.\n- `src.yuck` contains markup files, all of which are of YUCK filetype.\n- `src.shell` contains various scripts.\n- `themes` this will also contain only SCSS files.\n\u003csamp\u003eWhy not have them in src.scss then?\u003c/samp\u003e Because organization. That's it.\n\n### 🌿 `src` substructure\n\nThis structure will seem familiar to webdevs.\n\n```txt\nsrc\n├── scss\n│   ├── bolt\n│   ├── lumin\n│   └── vertigo\n└── yuck\n    ├── bolt\n    ├── lumin\n    └── vertigo\n```\n\nAs you might have guessed.\nThe **modules** in the `scss` directory, style the classes that are defined in\nthe yuck directory.\nFor instance, the module `lumin` will have `scss.lumin` which will contain\nstyling specific to widgets defined in `yuck.lumin` only.\n\n### 📚 Style Overrides\n\nThere is a `_override.scss` file which supplied for the purpose of overriding\nand testing your own stylings.\nI have made this in order to contain different designs for the same widget.\n\n### Layouts\n\nThere is a `_layout.yuck` in every widget module\n(eg: `src/yuck/lumin/_layout.yuck`) which acts like a mini-configuration.\nTweak the values if you wish to do so 😉.\n\n![transparent](./readme/trans.png)\n\nThe above is the transparent version of the bar which is different to that\nshown in the showcase.\n\n## 🔽 Dependencies\n\nThis section is divided into 2 parts:\n\n- Main Dependencies\n- Python Dependencies\n\n### 🔽 Main Dependencies\n\nExecute this in your terminal \u003csamp\u003e(if you dare.)\u003c/samp\u003e.\n\n```sh\nyay --sync base-devel rustup python python-pip eww-git  \\\n  dunst bspwm sxkhd gobject-introspection imagemagick   \\\n  mpd mpc playerctl pamixer rofi redshift zsh jq todo-bin --needed\n# NOTE: use paru or, a AUR helper of your choice or, do the dirty work yourself.\n```\n\n- [rustup](https://rustup.rs/) is needed for compiling eww.\n- For [pipewire](https://wiki.archlinux.org/title/PipeWire) users you need to\nreplace all of the matches of [`pamixer`](https://github.com/cdemoulins/pamixer)\nin\n  this repository with appropriate commands. You may use [`nvim-telescope's live-grep`](https://github.com/nvim-telescope/telescope.nvim)\n  feature to get the matches conveniently and elegantly.\n- For [dunst](dunst-project.org) you need to have have a specific configuration,\nwhich you can grab from the [**Samples**](https://github.com/dharmx/vile#samples)\nsection.\n- And it should be a given that [`bspwm`](https://wiki.archlinux.org/title/Bspwm)\nand [`sxkhd`](https://wiki.archlinux.org/title/Sxhkd) are already configured.\n\n### 🔽 Python Dependencies\n\nInspect the packages that you are about to install from [`requirements.txt`](https://github.com/dharmx/vile/blob/main/requirements.txt).\nThen run the following command in your terminal while in `vile's` root.\n\nBut, before that we need to create a `.venv` as the [PEP 0668](https://peps.python.org/pep-0668) is clinically insane.\n\n```sh\ncd ~/.config/eww\npython -m venv .venv\nsource ./.venv/bin/activate\npip install --requirement=requirements.txt\n```\n\n## Configuration\n\nStart by placing vile into `~/.config` and rename `vile` to `eww`. Or, you can use symlinks as shown below.\n\n```sh\ngit clone --depth 1 https://github.com/dharmx/vile.git ~/Downloads\nln -s ~/Downloads/vile ~/.config/eww\n## do not remove ~/Downloads/vile\n```\n\nNow, right after doing that you need to make the scripts executable.\n\n```sh\nchmod +x ~/Downloads/vile/src/shell/*\n```\n\nYou need to install the fonts that are being used in this repo. Which can\nbe found [here](https://github.com/dharmx/dots.sh/tree/main/local/share/fonts).\nLastly, do not forget to update the font caches after you do install them\n`fc-cache -frv`.\n\n```txt\nCaviar Dreams\nSagetarius\nPhosphor\nDosis\nPoiret One\nmonoMMM_5\nIosevka\nModum\nKoulen\nFeather\nLato\n```\n\nThis is a very very very important section. As the previous one, this section\nis also divided into various parts.\n\n- Environment Variables.\n- API Setups\n- JSON / Script Configurations\n- Layout Configurations\n- Dependency Configurations\n- Headless Testing / Trial Run.\n\n### Environment Variables\n\nStart by reading the [xdg-utils](https://wiki.archlinux.org/title/Xdg-utils)\nand [xdg-vars](https://wiki.archlinux.org/title/XDG_user_directories) articles\nfrom the [ArchWiki](https://wiki.archlinux.org/).\nThen you need to setup those variables by adding some lines in your\n[shellrc](https://www.tecmint.com/understanding-shell-initialization-files-and-user-profiles-linux/).\nAnyways, I will be using [ZSH](https://zsh.sourceforge.io/)\nfor this so, we will add those environment variables by editing the `~/.zshenv`\nfile first (create it if it doesn't exist).\n\nThen just append these lines to the file.\n\n```zsh\nexport XDG_CONFIG_HOME=\"$HOME/.config\"\nexport XDG_CACHE_HOME=\"$HOME/.cache\"\nexport XDG_MUSIC_DIR=\"$HOME/Music\"\nexport XDG_PICTURES_DIR=\"$HOME/Pictures\"\n```\n\nOn top of that you would need to add these as well.\n\n```zsh\n# NOTE: Add defaults of your choice as these may not be your taste.\nexport TERMINAL=st ## kitty for example\nexport BROWSER=firefox ## brave for example\nexport VISUAL=neovide ## nano for example\nexport EDITOR=nvim ## vim for example\n```\n\nSee more info on what these variables do [here](https://wiki.archlinux.org/title/Environment_variables).\n\n### API Setups\n\nStarting with the easiest. Firstly you need to go to the\n[OpenWeather](https://home.openweathermap.org/users/sign_in)\nwebsite and grab your [API key](https://rapidapi.com/blog/api-glossary/api-key/).\nDo this by creating an account and logging into the site. Then go to\nthe [`api_keys`](https://home.openweathermap.org/api_keys) tab and press the\ngenerate button after typing a name in the textfield.\nAnd if you already have a default key then use that instead.\n\nAnyways, take a note of that key value as we will need it later.\n\n### JSON and Script Configurations\n\nCopy the `ewwrc` from the [**Samples**](https://github.com/dharmx/vile#samples)\nsection and remove all of the comments. Then the first thing you'd need to do is\nadd the tokens that you noted from the\n[previous](https://github.com/dharmx/vile#-dependencies) section.\nFor example the `tokens.openweather` field.\n\n\u003e Note: You may skip this if you do not plan to use `clime and chrono` see\nthe Galley section.\n\nTake a look at the `location` key and see what method of fetching the location\nyou want to select. If you have selected manual method then you'd need to fill\nout either `latitude` and `longitude` or, `city` and `country_code` and `lang` fields.\nLearn more about these [here](https://openweathermap.org/history-bulk#parameter).\nAs for automatic, you do not need to do anything in the location field.\n\nThen customize, change and tweak the values to your liking.\n\nNow, open `src/shell/combine.bash` then edit and match the `CACHE_PATH`,\n`QUOTE_PATH`, `INTERVAL` and `DEFAULT_QUOTE` with the fields\n`notify.cache_path`, `notify.quote_path`,\n`notify.default_quote` and `notify.interval` from `ewwrc`.\n\n\u003e Note: `combine.bash` is created to be an alternative for some `logger.py\nfunctions since it is quite slow.\n\n### Layout Configurations\n\nMoving on. Copy the sample `eww.yuck` from the\n[**Samples**](https://github.com/dharmx/vile#samples) section. Create the\n`eww.yuck` file and uncomment the widgets you need. You may take a look at the\n[**Gallery**](https://github.com/dharmx/vile#gallery) section.\n\nAs explained in the [**Structure**](https://github.com/dharmx/vile#-structure)\nsection open the layout files of the modules that you enabled. For example\nif you have uncommented the vertigo module then, you would\nneed to open `src/yuck/vertigo/_layout.yuck` file and _customize_ the values\nlike icons glyphs, labels, etc.\n\nFor example in the `bolt` widget if you change the `:volume_icon`\nfield i.e. `` to a smiley face `:)` then\n\n```lisp\n;; NOTE: can be found in src/yuck/bolt/_layout.yuck\n(_boltpctl :cover {pctl_sub[\"mpris:artUrl\"]}\n           :label {pctl_sub[\"status\"]}\n           :title {pctl_sub[\"xesam:title\"]}\n           :artist {pctl_sub[\"xesam:artist\"]}\n           :volume volume_level\n           :volume_icon \"\" ;; to :volume_icon \":)\"\n           :status_cmd \"playerctl play-pause\"\n           :status_icon {pctl_sub[\"status\"] == \"Playing\" ? \"\" : \"\"})\n```\n\n![smile](./readme/smile.png)\n\n### Dependency Configurations\n\n- Make sure you have playerctl running at all times. Execute `playerctld daemon`\nin your terminal to start playerctl.\n- MPD needs to be running all times as well. Execute `mpd` in your terminal.\n- Same goes for dunst. Only caveat is that you'd need a specific configuration\nfor making it work with the `disclose` module.\n\n#### Disclose: Notification Manager\n\nThere are some very specific things that you would need to do for setting this up.\nFirstly, grab or, inspect the sample `dunstrc` from the\n[**Samples**](https://github.com/dharmx/vile#samples) section.\nTake a good look at the rulesets:\n\n```ini\n[volume]\nappname = \"volume\"\nsummary = \"*\"\nset_stack_tag = \"volume\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[firefox]\nappname = firefox\nnew_icon = firefox-default\n```\n\nThe above is an example of said ruleset. When a notification is sent by a certain\napplication like for example firefox, they will send\nsome specific metadata on top of the usual message summary and message body.\nWhich then we can use to tell apart the notifications sent from\nfirefox and other applications. This is done using the `appname` value.\n\nWe take that value and match it to these ruleset's `appname` field. And if you\nhave looked at the above snippet carefully, you will notice that there is a\nrule called `[firefox]` and within it there is a field called `appname` whose\nvalue is `firefox`.\nNow, whenever Firefox browser sends us a notification it will be redirected to\nthat ruleset.\n\nSecondly, there is another field called `new_icon` which signifies that when\nFirefox sends a notification, the notification icon will be replaced with an icon\nfrom your icon theme named `firefox-default.svg` (Yes, the extension will be truncated).\n\n![firefox card](./readme/firefox.png)\n\n### Testing\n\nThis section will describe how you would know if the script actually works.\nSince, if the scripts work then most probably the widgets will work as well.\nThese (might) be automated later in the near future with unit testing.\n\nBefore we begin I would urge you to recheck and verify if all the XDG variables\nhave been set or not. Source the `~/.zshenv` again if you are not confident.\n\nNow, go to the root of the vile repo. Then change the directory to where all of\nthe scripts are located at `cd src/shell`.\n\n- \u003csamp\u003elogger.py\u003c/samp\u003e: Run this using `./logger.py init` which will\n   initialize the[dbus](https://www.freedesktop.org/wiki/Software/dbus) eavesdropper.\n   Now, open another terminal and run `./logger.py subscribe` then open another\n   terminal and type `notfy-send hello`. Now, if something appears in the second\n   terminal then the script is working.\n\n   ```lisp\n   (box :spacing 20 :orientation 'vertical' :space-evenly false\n   (_cardimage :class 'Spotify-rectangle' :identity ':::###::::\n   XXXWWW1660034424===::' :close_action './src/shell/combine.bash\n   rmid 1660034424' :limit_body '110' :limit_summary '30' :summary\n   'Forbidden Silence' :body 'Raimu - Forbidden Silence' :close '繁'\n   :class 'Spotify-rectangle' :identity ':::###::::XXXWWW1660034279===::'\n   ...\n   ```\n\n- \u003csamp\u003ecombine.bash\u003c/samp\u003e: Run this using `./logger.py init` which will\ninitialize the [dbus](https://www.freedesktop.org/wiki/Software/dbus) eavesdropper.\n   Now, open another terminal and run `./combine.bash sub` then open another\n   terminal and type `notfy-send hello`. Now, if something appears in the\n   second terminal then the script is working. Sample should be the same as `logger.py`.\n- \u003csamp\u003ecovidstate.py\u003c/samp\u003e: This is currently not in use but you can test it regardless.\nTry running it `./covidstate.py` and see if there is any\n[JSON](https://www.json.org/json-en.html) output.\n   You may need to wait for a few seconds by the way. Following is a sample.\n\n   ```json\n   {\n     \"country\": {\n     \u003credacted\u003e: {\n       \"id\": \"81\",\n       \"country\": \u003credacted\u003e,\n       \"confirmed\": 44174650,\n       \"active\": null,\n       \"deaths\": 526772,\n       \"recovered\": null,\n   ...\n   ```\n\n- \u003csamp\u003egithub.sh\u003c/samp\u003e: This too is not being used but wouldn't hurt to test it.\nTry running it by `./github.sh repos` see if there is any JSON output. And do the\nsame for `./github.sh users` as well.\n   Following is a sample.\n\n   ```json\n   [\n     {\n       \"id\": \u003csome_number\u003e,\n       \"node_id\": \u003csome_number\u003e,\n       \"name\": \"dharmx\",\n       \"full_name\": \"dharmx/dharmx\",\n       \"private\": false,\n       \"owner\": {\n         \"login\": \"dharmx\",\n   ...\n   ```\n\n- \u003csamp\u003epollution.py\u003c/samp\u003e: Do the same as `github.sh`.  Following is a sample.\n\n   ```json\n   {\n     \"coord\": {\n     \"lon\": \u003credacted\u003e,\n     \"lat\": \u003credacted\u003e\n   },\n   \"list\": [\n     {\n       \"main\": {\n       \"aqi\": 3\n     },\n     \"components\": {\n       \"co\": 487.33,\n       \"no\": 0.13,\n       \"no2\": 21.08,\n       \"o3\": 39.34,\n       \"so2\": 31.47,\n       \"pm2_5\": 20.35,\n       \"pm10\": 24.43,\n       \"nh3\": 4.75\n   ...\n   ```\n\n- \u003csamp\u003eweather.py\u003c/samp\u003e: Do the same as `github.sh` only difference is\nthat you need to supply a flag i.e. `fetch`.\n   Following is a sample.\n\n   ```json\n   {\n     \"coord\": {\n     \"lon\": \u003credacted\u003e,\n     \"lat\": \u003credacted\u003e\n   },\n   \"weather\": [\n     {\n       \"id\": 721,\n       \"main\": \"Haze\",\n       \"description\": \"haze\",\n       \"icon\": \"50d\",\n   ...\n   ```\n\n- \u003csamp\u003eworkspaces.zsh\u003c/samp\u003e: This is [BSPWM](https://github.com/baskerville/bspwm) specific.\nTry running this by `./workspaces.zsh subscribe_desktop` then try going to any\nother workspace then return to the current one.\n   Now, see if there are any JSON values. Following is a sample.\n\n   ```json\n   [\n     {\n       \"class\": \"vertigo-button vertigo-workspace vertigo-workspace-occupied\",\n       \"tooltip\": \"workspace:  state: occupied\",\n       \"onclick\": \"bspc desktop --focus 1\",\n       \"label\": \"\"\n     },\n     {\n       \"class\": \"vertigo-button vertigo-workspace vertigo-workspace-local\",\n       \"tooltip\": \"workspace:  state: local\",\n       \"onclick\": \"bspc desktop --focus 2\",\n       \"label\": \"\"\n     },\n     {\n       \"class\": \"vertigo-button vertigo-workspace vertigo-workspace-focused\",\n       \"tooltip\": \"workspace: 北 state: focused\",\n       \"onclick\": \"bspc desktop --focus 3\",\n       \"label\": \"北\"\n     }\n   ]\n   ```\n\n- \u003csamp\u003empdaemon.py\u003c/samp\u003e: Same as `github.sh`. Also, you might need to\n   traverse through your current MPD music playlist and play some songs to be\n   completely sure.\n   While you are at it see if JSON output changes or, not as well. Sample as follows.\n\n   ```json\n   {\n     \"file\": \"/home/maker/.cache/eww/mpd/3PM Coding Session.png\",\n     \"artist\": \"Lofi Ghostie\",\n     \"albumartist\": \"Unknown\",\n     \"title\": \"3PM Coding Session\",\n     \"album\": \"Unknown\",\n     \"last-modified\": \"2021-11-14T19:55:40Z\",\n     \"format\": \"44100:24:2\",\n     \"time\": \"4948\",\n     \"duration\": \"4947.748\",\n     \"pos\": \"0\",\n     \"id\": \"1\",\n     \"status\": \"pause\",\n     \"bright\": \"#4959A5\",\n     \"dark\": \"#CC96E0\"\n   }\n   ```\n\n- \u003csamp\u003eplayerctl.py\u003c/samp\u003e: Similar to `mpdaemon.py`. Sample as follows.\n\n   ```json\n   {\n     \"mpris:artUrl\": \"/home/maker/.cache/eww/pctl/spotify/7468726565706F6F6C/4120506C6163652042656E65617468.png\",\n     \"xesam:artist\": \"threepool\",\n     \"xesam:title\": \"A Place Beneath\",\n     \"xesam:album\": \"A Place Beneath\",\n     \"status\": \"Playing\",\n     \"mpris:trackid\": \"/com/spotify/track/4m1Kg8I715SQUSOjFrvxR7\",\n     \"mpris:length\": 132679000,\n   ...\n   ```\n\n- \u003csamp\u003euptime.awk\u003c/samp\u003e: Run this by `uptime --pretty | ./uptime.awk`.\n   Output should be `2d, 4h` for uptime of `up 2 days, 4 hours, 35 minutes`.\n\n### Note\n\n- If any of these do not work then consult the Troubleshooting, FAQ and Tips sections.\n- The notification manager (disclose) depends on my custom made icon theme that\ncan be found [here](https://github.com/dharmx/dots.sh/tree/main/home/.icons/custom.bak).\n- With dunst you may need to remove its dbus service file\n`/usr/share/dbus-1/services/org.knopwob.dunst.service`. Then kill all dunst\ninstances and start again with a new instance.\n- There may be some difficulties with the `mpdaemon.py` script if your default\nmpd Music storage is not as same as `XDG_MUSIC_DIR` i.e. `~/Music`.\n\n## Hacking\n\nComing Soon...\n\n## Gallery\n\n|  Avatar  |\n|---------|\n| ![avatar](./screenie/avatar.png)  |\n| **Description**: Adaptive and dynamic music player daemon and playerctl frontends. |\n| Note that this is still incomplete. |\n\n|   Bolt   |\n|---------|\n| ![bolt](./screenie/bolt.png)  |\n| **Description**: Beautiful integrated bar mini-dashboard. |\n\n|   Disclose   |\n|---------|\n| ![disclose](./screenie/disclose.png)  |\n| **Description**: Feature-Rich and Hacky notification manager. |\n\n|   Vertigo   |\n|---------|\n| ![vertigo](./screenie/vertigo.png)  |\n| **Description**: BSPWM Specific bar. See the [**Hacking**](https://github.com/dharmx/vile#hacking) section to add support for your WM. |\n\n|  Chrono One  |  Chrono Two  |\n|---------|---------|\n| ![chrono one](./screenie/chrono-one.png)  | ![chrono two](./screenie/chrono-two.png)  |\n| **Description**: Calendar, Cool radial clock and a beautiful weather card. | **Description**: Extensive weather information and Air pollution information. |\n\n|   Lumin   |\n|---------|\n| ![lumin](./screenie/lumin.png)  |\n| **Description**: Shows time and searches stuff on [duckduckgo](duckduckgo.com). |\n\n|   Clime   |\n|---------|\n| ![clime](./screenie/clime.png)  |\n| **Description**: Minimal weather info. |\n\n|   Origin   |\n|---------|\n| ![origin](./screenie/origin.png)  |\n| **Description**: Shows current logged username and hostname. |\n\n|   Melody   |\n|---------|\n| ![melody](./screenie/melody.png)  |\n| **Description**: Shows current playing audio track with essential application icons. |\n\n|   Ocular   |\n|---------|\n| ![ocular](./screenie/ocular.png)  |\n| **Description**: A moving seconds clock with added Ram, CPU, Temperatue and Battery monitor. |\n\n## Samples\n\n\u003cdetails\u003e\n\u003csummary\u003eA sample \u003ccode\u003edunstrc\u003c/code\u003e configuration.\u003c/summary\u003e\n\n```ini\n[global]\nbackground = \"#11161b\"\nforeground = \"#d4d4d5\"\nmonitor = 0\nfollow = mouse\nwidth = 480\nheight = 380\nprogress_bar = true\nprogress_bar_height = 25\nprogress_bar_frame_width = 3\nprogress_bar_min_width = 460\nprogress_bar_max_width = 480\nhighlight = \"#79dcaa\"\ndmenu = /usr/bin/dmenu\nindicate_hidden = true\nshrink = true\ntransparency = 5\nseparator_height = 5\npadding = 10\nhorizontal_padding = 10\nframe_width = 3\nframe_color = \"#151a1f\"\nsort = true\nidle_threshold = 0\nfont = Dosis,Iosevka Nerd Font 14\nline_height = 2\nmarkup = full\norigin = \"top-right\"\noffset = \"50x50\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\nalignment = left\nshow_age_threshold = 60\nword_wrap = false\nignore_newline = true\nstack_duplicates = true\nhide_duplicate_count = true\nshow_indicators = true\nicon_position = left\nmax_icon_size = 128\nmin_icon_size = 104\nicon_theme = \"custom,Reversal-green-dark,McMuse-green,Zafiro,McMuse,Papirus\"\nenable_recursive_icon_lookup = true\nsticky_history = true\nhistory_length = 50\nbrowser = firefox\nalways_run_script = true\ntitle = Dunst\nclass = Dunst\ncorner_radius = 0\nnotification_limit = 5\nmouse_left_click = do_action\nmouse_middle_click = close_current\nmouse_right_click = context_all\nignore_dbusclose = true\nellipsize = end\n\n[urgency_low]\ntimeout = 4\nbackground = \"#11161b\"\nframe_color = \"#1f2429\"\nforeground = \"#79dcaa\"\n\n[urgency_normal]\ntimeout = 8\nbackground = \"#11161b\"\nframe_color = \"#1f2429\"\nforeground = \"#7ab0df\"\n\n[urgency_critical]\ntimeout = 30\nbackground = \"#11161b\"\nframe_color = \"#1f2429\"\nforeground = \"#f87070\"\n\n[fullscreen_show_critical]\nmsg_urgency = critical\nfullscreen = pushback\n\n[volume]\nappname = \"volume\"\nsummary = \"*\"\nset_stack_tag = \"volume\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[microphone]\nappname = \"microphone\"\nsummary = \"*\"\nset_stack_tag = \"microphone\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[audiojack]\nappname = \"audiojack\"\nsummary = \"*\"\nset_stack_tag = \"audiojack\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[brightness]\nappname = \"brightness\"\nsummary = \"*\"\nset_stack_tag = \"brightness\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[shot]\nappname = \"shot\"\nsummary = \"*\"\nset_stack_tag = \"shot\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[shot_icon]\nappname = \"shot_icon\"\nsummary = \"*\"\nset_stack_tag = \"shot_icon\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[bar]\nappname = \"bar\"\nsummary = \"*\"\nset_stack_tag = \"bar\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[nightmode]\nappname = \"nightmode\"\nsummary = \"*\"\nset_stack_tag = \"nightmode\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[sxhkd]\nappname = \"sxhkd\"\nsummary = \"*\"\nset_stack_tag = \"sxhkd\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[layouts]\nappname = \"layouts\"\nsummary = \"*\"\nset_stack_tag = \"layouts\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[bspwm]\nappname = \"bspwm\"\nsummary = \"*\"\nset_stack_tag = \"bspwm\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[todo]\nappname = \"todo\"\nsummary = \"*\"\nset_stack_tag = \"todo\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\nnew_icon = custom-to-do\nbackground = \"#161b20\"\nforeground = \"#c397d8\"\n\n[picom]\nappname = \"picom\"\nsummary = \"*\"\nset_stack_tag = \"picom\"\nformat = \"\u003cb\u003e%s\u003c/b\u003e\\n%b\"\n\n[spotify]\nappname = \"spotify\"\nsummary = \"*\"\nset_stack_tag = \"spotify\"\nformat = \"\u003cspan size='x-large' font_desc='Cooper Hewitt 12' weight='bold' foreground='#79dcaa'\u003e%s\u003c/span\u003e\\n%b\"\n\n[mpd]\nappname = \"mpd\"\nsummary = \"*\"\nset_stack_tag = \"mpd\"\nformat = \"\u003cspan size='x-large' font_desc='Cooper Hewitt 12' weight='bold' foreground='#c397d8'\u003e%s\u003c/span\u003e\\n%b\"\n\n[firefox]\nappname = firefox\nnew_icon = firefox-default\n\n[network]\nappname = network\nnew_icon = network\nsummary = \"*\"\nformat = \"\u003cspan size='x-large' weight='bold'\u003e%s\u003c/span\u003e\\n\u003cspan font_desc='Cooper Hewitt,Iosevka Nerd Font 12'\u003e%b\u003c/span\u003e\"\n\n# vim:filetype=dosini\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eA sample \u003ccode\u003eeww.yuck\u003c/code\u003e configuration.\u003c/summary\u003e\n\n```lisp\n(include \"./src/yuck/_env.yuck\")\n(include \"./src/yuck/_lib.yuck\")\n\n;; (include \"./src/yuck/vertigo/_init.yuck\")\n;; (include \"./src/yuck/disclose/_init.yuck\")\n;; (include \"./src/yuck/avatar/_init.yuck\")\n;; (include \"./src/yuck/melody/_init.yuck\")\n;; (include \"./src/yuck/lumin/_init.yuck\")\n;; (include \"./src/yuck/origin/_init.yuck\")\n;; (include \"./src/yuck/ocular/_init.yuck\")\n;; (include \"./src/yuck/clime/_init.yuck\")\n;; (include \"./src/yuck/power/_init.yuck\")\n;; (include \"./src/yuck/chrono/_init.yuck\")\n;; (include \"./src/yuck/bolt/_init.yuck\")\n\n; vim:filetype=yuck\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eA sample \u003ccode\u003eewwrc\u003c/code\u003e configuration.\u003c/summary\u003e\n\n```json\n{\n  \"player\": {\n    \"mpd_cache\": \"$XDG_CACHE_HOME/eww/mpd\",\n    \"pctl_cache\": \"$XDG_CACHE_HOME/eww/pctl\",\n    \"default_art\": \"$XDG_CONFIG_HOME/eww/assets/cover.png\"\n  },\n  \"desktops\": {\n    \"states\": {\n      \"focused\": \"北\",\n      \"occupied\": \"\",\n      \"urgent\": \"梅\",\n      \"empty\": \"\"\n    },\n    \"tags\": {\n      \"hidden\": \"\",\n      \"sticky\": \"\",\n      \"private\": \"\",\n      \"locked\": \"\",\n      \"marked\": \"\",\n      \"empty\": \"\"\n    },\n    \"layouts\": {\n      \"monocle\": \"\",\n      \"tiled\": \"\",\n      \"fullscreen\": \"\",\n      \"pseudo_tiled\": \"\",\n      \"floating\": \"\",\n      \"empty\": \"\"\n    }\n  },\n  \"network\": {\n    \"interface\": \"CURRENTLY_NOT_IN_USE\"\n  },\n  \"notify\": {\n    \"limit\": 50,\n    \"interval\": 0.5,\n    \"cache_path\": \"$XDG_CACHE_HOME/eww/dunst/notifications.txt\",\n    \"quote_path\": \"$XDG_CACHE_HOME/eww/dunst/quotes.txt\",\n    \"default_quote\": \"To fake it is to stand guard over emptiness. ── Arthur Herzog\",\n    \"timestamp\": \"%H:%M\",\n    \"excluded_appnames\": null\n  },\n  \"location\": {\n    \"method\": \"automatic\",\n    \"cache_dir\": \"$XDG_CACHE_HOME/eww/location\",\n    \"latitude\": null,\n    \"longitude\": null,\n    \"city\": null,\n    \"country_code\": null,\n    \"lang\": null,\n    \"zip\": null\n  },\n  \"tokens\": {\n    \"openweather\": \"641f54ef8b6cc337c7ea7e6d3881730d\",\n    \"gmail\": \"CURRENTLY_NOT_IN_USE\"\n  },\n  \"weather\": {\n    \"units\": \"metric\",\n    \"cache_dir\": \"$XDG_CACHE_HOME/eww/weather\",\n    \"icons\": {\n      \"01d\": \"\",\n      \"02d\": \"\",\n      \"03d\": \"\",\n      \"04d\": \"\",\n      \"09d\": \"\",\n      \"10d\": \"\",\n      \"11d\": \"\",\n      \"13d\": \"\",\n      \"50d\": \"\",\n      \"01n\": \"\",\n      \"02n\": \"\",\n      \"03n\": \"\",\n      \"04n\": \"\",\n      \"09n\": \"\",\n      \"10n\": \"\",\n      \"11n\": \"\",\n      \"13n\": \"\",\n      \"50n\": \"\",\n      \"default\": \"\"\n    },\n    \"images\": {\n      \"01d\": \"$XDG_CONFIG_HOME/eww/assets/01.jpg\",\n      \"02d\": \"$XDG_CONFIG_HOME/eww/assets/02.jpg\",\n      \"03d\": \"$XDG_CONFIG_HOME/eww/assets/03.jpg\",\n      \"04d\": \"$XDG_CONFIG_HOME/eww/assets/04.jpg\",\n      \"09d\": \"$XDG_CONFIG_HOME/eww/assets/09.jpg\",\n      \"10d\": \"$XDG_CONFIG_HOME/eww/assets/10.jpg\",\n      \"11d\": \"$XDG_CONFIG_HOME/eww/assets/11.jpg\",\n      \"13d\": \"$XDG_CONFIG_HOME/eww/assets/13.jpg\",\n      \"50d\": \"$XDG_CONFIG_HOME/eww/assets/50.jpg\",\n      \"01n\": \"$XDG_CONFIG_HOME/eww/assets/01.jpg\",\n      \"02n\": \"$XDG_CONFIG_HOME/eww/assets/02.jpg\",\n      \"03n\": \"$XDG_CONFIG_HOME/eww/assets/03.jpg\",\n      \"04n\": \"$XDG_CONFIG_HOME/eww/assets/04.jpg\",\n      \"09n\": \"$XDG_CONFIG_HOME/eww/assets/09.jpg\",\n      \"10n\": \"$XDG_CONFIG_HOME/eww/assets/10.jpg\",\n      \"11n\": \"$XDG_CONFIG_HOME/eww/assets/11.jpg\",\n      \"13n\": \"$XDG_CONFIG_HOME/eww/assets/13.jpg\",\n      \"50n\": \"$XDG_CONFIG_HOME/eww/assets/50.jpg\",\n      \"default\": \"$XDG_CONFIG_HOME/eww/assets/01.jpg\"\n    }\n  },\n  \"covid\": {\n    \"cache_dir\": \"$XDG_CACHE_HOME/eww/covid\",\n    \"icons\": {\n      \"country\": \"\",\n      \"confirmed\": \"\",\n      \"deaths\": \"\"\n    }\n  },\n  \"pollution\": {\n    \"cache_dir\": \"$XDG_CACHE_HOME/eww/pollution\",\n    \"icons\": {\n      \"good\": \"\",\n      \"fair\": \"\",\n      \"moderate\": \"\",\n      \"poor\": \"\",\n      \"very_poor\": \"\"\n    }\n  },\n  \"github\": {\n    \"cache_dir\": \"$XDG_CACHE_HOME/eww/github\",\n    \"username\": \"dharmx\"\n  },\n  \"layouts\": [\n    {\n      \"label\": \"tiled\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"monocle\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"even\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"grid\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"rgrid\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"rtall\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"rwide\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"tall\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    },\n    {\n      \"label\": \"wide\",\n      \"icon\": \"\",\n      \"command\": \"\"\n    }\n  ]\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eA sample \u003ccode\u003e_override.scss\u003c/code\u003e configuration.\u003c/summary\u003e\n\n```scss\n// exclude eww-vertigo in picom shadows exclude section\n// this is an example to override the default vertigo style\n// and make the bar transparent. Enjoy.\n\n// .vertigo-layout-box {\n//   background-color: rgb(0, 0, 0, 0.0);\n// }\n\n// .vertigo-node-button-tiled { color: $base14; }\n// .vertigo-node-button-monocle { color: $base11; }\n// .vertigo-node-button-float { color: $base13; }\n// .vertigo-node-button-pseudo { color: $base15; }\n// .vertigo-node-button-full { color: $base09; }\n// .vertigo-node-button-other { color: $base08; }\n// .vertigo-node-button:hover { opacity: 0.8; }\n\n// .vertigo-node-button-tiled,\n// .vertigo-node-button-monocle,\n// .vertigo-node-button-float,\n// .vertigo-node-button-pseudo,\n// .vertigo-node-button-full,\n// .vertigo-node-button-other {\n//   background-color: rgb(0, 0, 0, 0.0);\n// }\n\n// .vertigo-battery-button {\n//   background-color: rgb(0, 0, 0, 0.0);\n//   color: $base11;\n// }\n\n// .vertigo-time-button {\n//   background-color: rgb(0, 0, 0, 0.0);\n// }\n\n// .vertigo-volume-on { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-volume-off { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-volume-on:hover { background-color: $base13; }\n// .vertigo-volume-off:hover { background-color: $base11; }\n\n// .vertigo-nightmode-on { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-nightmode-off { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-nightmode-on:hover { background-color: $base09; color: $shade01; }\n// .vertigo-nightmode-off:hover { background-color: $base13; color: $shade01; }\n\n// .vertigo-notify-on { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-notify-off { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-notify-on:hover { background-color: $base15; color: $base02; }\n// .vertigo-notify-off:hover { background-color: $base11; color: $base02; }\n\n// .vertigo-todo-button { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-todo-button:hover { background-color: $base07; color: $base01; }\n// .vertigo-workspace-plus-button { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-workspace-plus-button:hover { background-color: $base11; color: $base02; }\n\n// .vertigo-time-button:hover { background-color: rgb(0, 0, 0, 0.0); }\n\n// .vertigo-separator {\n//   opacity: 0.0;\n// }\n\n// .vertigo-search-button {\n//   color: $base09;\n//   background-color: rgb(0, 0, 0, 0.0);\n// }\n\n// .vertigo-search-button:hover { background-color: rgb(0, 0, 0, 0.0); color: $base07; }\n// .vertigo-workspace { background-color: rgb(0, 0, 0, 0.0); }\n\n// .vertigo-workspace:hover { background-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-workspace-focused {\n//   background-color: rgb(0, 0, 0, 0.0);\n//   border-right-color: rgb(0, 0, 0, 0.0);\n// }\n\n// .vertigo-workspace-occupied:hover { border-left-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-workspace-urgent:hover { border-left-color: rgb(0, 0, 0, 0.0); }\n// .vertigo-workspace-local:hover { border-left-color: rgb(0, 0, 0, 0.0); }\n\n// vim:ft=scss\n```\n\n![transparent vertigo](./screenie/trans-vertigo.png)\n\u003c/details\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n# ⚠  UNDER CONSTRUCTION ⚠\n\n\u003cdiv\u003e\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdharmx%2Fvile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdharmx%2Fvile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdharmx%2Fvile/lists"}