{"id":18026361,"url":"https://github.com/toni500github/customfetch","last_synced_at":"2025-10-29T06:43:35.557Z","repository":{"id":240971523,"uuid":"796873419","full_name":"Toni500github/customfetch","owner":"Toni500github","description":"A modular information fetching (neofetch-like) tool, which its focus point is the performance and customizability.        Android widget migrated to https://github.com/Toni500github/customfetch-android-app","archived":false,"fork":false,"pushed_at":"2025-09-19T12:56:54.000Z","size":9357,"stargazers_count":42,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-19T14:58:15.429Z","etag":null,"topics":["customfetch","customizable","customization","fastfetch","gtk3","gtkmm3","gui","gui-application","linux","macos","neofetch","sysfetch"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Toni500github.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":"2024-05-06T19:27:34.000Z","updated_at":"2025-09-19T12:56:58.000Z","dependencies_parsed_at":"2024-11-06T16:31:23.841Z","dependency_job_id":"b71ed5e5-565f-482e-a627-9bd1b7c88788","html_url":"https://github.com/Toni500github/customfetch","commit_stats":null,"previous_names":["toni500github/customfetch"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/Toni500github/customfetch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Toni500github%2Fcustomfetch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Toni500github%2Fcustomfetch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Toni500github%2Fcustomfetch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Toni500github%2Fcustomfetch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Toni500github","download_url":"https://codeload.github.com/Toni500github/customfetch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Toni500github%2Fcustomfetch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281577681,"owners_count":26524886,"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","status":"online","status_checked_at":"2025-10-29T02:00:06.901Z","response_time":59,"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":["customfetch","customizable","customization","fastfetch","gtk3","gtkmm3","gui","gui-application","linux","macos","neofetch","sysfetch"],"created_at":"2024-10-30T08:06:16.631Z","updated_at":"2025-10-29T06:43:35.545Z","avatar_url":"https://github.com/Toni500github.png","language":"C++","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/icons/logo.svg\" width=\"22%\"/\u003e\n\u003c/p\u003e\n\u003ch2\u003e\u003c/h2\u003e \u003c!-- add a separating line --\u003e\n\u003cp align=\"center\"\u003e\n    A modular information fetching (neofetch-like) tool, which its focus point is the performance and \u003cb\u003ecustomizability\u003c/b\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/languages/top/Toni500github/customfetch?logo=cplusplusbuilder\u0026label=\" /\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/Toni500github/customfetch/makefile.yml\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Standard-C%2B%2B20-success\" /\u003e\n\u003c/p\u003e\n\n\u003c!--Currently supports Linux distros only. Android may be coming when stable release\n\u003c!-- Comment this because it's still in WIP for 3 weeks, no shit it won't work on some OSs\n\u003e[!NOTE]\n\u003eThe goal is to be cross-platform, so maybe Android and MacOS support will come some day\\\n\u003ebut if you're using a UNIX OS, such as FreeBSD or MINIX, or those \"obscure\" OSs\\\n\u003ethen some, if not most, query infos won't probably work.\\\n\u003eSo you may want to relay to shell commands for quering\\\n\u003eor maybe continue using neofetch/fastfetch if it still works great for you\n--\u003e\n\n\u003c!-- Looks fire on PC but ass on mobile fucking hell. too bad --\u003e\n\u003cimg align=left width=54% src=\"screenshots/nitch_catpan-style2.png\" /\u003e\n\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/2/24/Transparent_Square_Tiles_Texture.png\" width=\"45%\" height=\"14px\" align=\"left\" /\u003e\n\u003cimg align=left width=54% src=\"screenshots/modern-simple.png\"/\u003e\n\u003cp align=\"center\"\u003e\n    \u003cimg align=\"top\" width=43.20% src=\"screenshots/cbonsai.png\" /\u003e\n\u003c/p\u003e\n\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/2/24/Transparent_Square_Tiles_Texture.png\" width=\"1px\" height=\"1px\" align=\"left\" /\u003e\n\u003cimg src=\"screenshots/pipeline-style.png\" /\u003e\n\n## Key Features\n* Run customfetch as a **terminal** or **GTK3 application** or even as an [android widget](https://github.com/Toni500github/customfetch-android-app)\n* Really easy to [customize](#How-to-customize)\n* Flexible [plugin](#Plugins) system\n* Incredibly extensible information fetchings\n* Super lightweight, 3.3MB max (GTK3 application)\n\n# Dependencies\nCustomfetch requires **no mandatory** dependencies.\\\nFor building from source, only requires **C++20** but it's possible to compile with C++17 too (may not be always supported)\n\nHere I'll list some packages to install for the GTK3 app or for making customfetch faster.\nThe names of the packages can vary depending on the package manager or distro.\n\nIf you want to install the GUI app install from your package manager:\n* `gtk3`\n* `gtkmm3`\n\noptional dependencies that will make customfetch faster.\n* `dconf`: Alternative to the slow `gsettings` command\n* `libxfce4util`: Query XFCE4 version faster\n* `wayland-client`: Library for getting the Wayland compositor faster\n\n# Installation\n\n## Debian/Ubuntu and based\nDownload the latest `.deb` package in [releases](https://github.com/Toni500github/customfetch/releases/latest)\n\n## Android widget\nMoved to the new repo: https://github.com/Toni500github/customfetch-android-app\n\n## Arch and based (AUR)\n```bash\n# Terminal only\nyay -S customfetch-bin\n\n# GUI app only\nyay -S customfetch-gui-bin\n```\n\n## General Distros (Manual installation)\nDownload the latest `.tar.gz` tarball file in [releases](https://github.com/Toni500github/customfetch/releases/latest) \\\nIt contains the `/usr` directory where you'll install it in your distro. Useful for package managers too.\n\n## Arch and based (AUR) (source)\n```bash\n# Terminal only\nyay -S customfetch\n\n# GUI app only\nyay -S customfetch-gui\n```\n\n## Arch and based (unstable) (AUR) (source)\n```bash\n# Terminal only\nyay -S customfetch-git\n\n# GUI app only\nyay -S customfetch-gui-git\n```\n\n## Compile from (source) (unstable)\n```bash\n# clone the git dir\ngit clone --depth=1 https://github.com/Toni500github/customfetch\ncd customfetch\n\n# DEBUG=0 for release build\n# GUI_APP=0 or =1 for compiling either the terminal version or the GUI app\nmake install DEBUG=0 GUI_APP=0\n\n# automatically generates a config and prints the infos\ncustomfetch\n```\n\n## How to customize\n\nRead the manual `customfetch.1` or execute customfetch with the arg `-w` for knowing more about the configuration in customfetch.\\\nThis is only an explaination about tags and preview, that can be always found in the documentation.\n\nHere's an example using my config\n\n![image](screenshot.png)\n\n```toml\n[config]\n\n# The array for displaying the system infos\nlayout = [\n    \"$\u003ctitle\u003e\",\n    \"$\u003ctitle.sep\u003e\",\n    \"${auto}OS: $\u003cos.name\u003e $\u003csystem.arch\u003e\",\n    \"${auto}Host: $\u003csystem.host\u003e\",\n    \"${auto}Kernel: $\u003cos.kernel\u003e\",\n    \"${auto}Uptime: $\u003cos.uptime\u003e\",\n    \"${auto}Terminal: $\u003cuser.terminal\u003e\",\n    \"${auto}Shell: $\u003cuser.shell\u003e\",\n    \"${auto}Packages: $\u003cos.pkgs\u003e\",\n    \"${auto}Theme: $\u003ctheme.gtk.all.name\u003e\",\n    \"${auto}Icons: $\u003ctheme.gtk.all.icons\u003e\",\n    \"${auto}Font: $\u003ctheme.gtk.all.font\u003e\",\n    \"${auto}Cursor: $\u003ctheme.cursor\u003e\",\n    \"${auto}WM: $\u003cuser.wm.name\u003e $\u003cuser.wm.version\u003e\",\n    \"${auto}DE: $\u003cuser.de.name\u003e $\u003cuser.de.version\u003e\",\n    \"$\u003cauto.disk\u003e\",\n    \"${auto}Swap: $\u003cswap\u003e\",\n    \"${auto}CPU: $\u003ccpu\u003e\",\n    \"${auto}GPU: $\u003cgpu\u003e\",\n    \"${auto}RAM: $\u003cram\u003e\",\n    \"\",\n    \"$\u003ccolors\u003e\", # normal colors palette\n    \"$\u003ccolors.light\u003e\" # light colors palette\n]\n\n\n```\n\nIn the config we got an array variable called \"layout\". That's the variable where you customize how the infos should be displayed.\\\nThere are 5 tags:\n* `$\u003cinfo.module\u003e` - Used for printing the value of a module or its submembers.\n* `${color}` - Used for displaying text in a specific color after it.\n* `$(bash command)` - Used to execute bash commands and print the output.\n* `$[something,equalToSomethingElse,iftrue,ifalse]` - Conditional tag to display different outputs based on the comparison.\n* `$%n1,n2%` - Used to print the percentage and print with colors\n\nThey can be used in the ascii art text file and layout, but how to use them?\n\n* **The info tag (`$\u003c\u003e`)** will print a value of a member of a module.\\\n e.g `$\u003cuser.name\u003e` will print the username, `$\u003cos.kernel.version\u003e` will print the kernel version and so on.\\\n All the modules and their members are listed in the `--list-modules` argument\n\n* **The bash command tag (`$()`)** let's you execute bash commands and print the output\\\n e.g `$(echo \\\"hello world\\\")` will indeed echo out Hello world.\\\n you can even use pipes\\\n e.g `$(echo \\\"hello world\\\" | cut -d' ' -f2)` will only print world\n\n* **The conditional tag (`$[]`)** is used for displaying different outputs based on the comparison.\\\n  Syntax MUST be `$[something,equalToSomethingElse,iftrue,ifalse]` (**note**: putting spaces between commas can change the expected result).\\\n  Each part can have a tag or anything else.\\\n  e.g `$[$\u003cuser.name\u003e,$(echo $USER),the name is correct,the name is NOT correct]`\\\n  This is useful when on some terminal or WM the detection can be different than others,\\\n  Or maybe even on holidays for printing special texts\\\n\n* **The color tag (`${}`)** is used for printing the text in a certain color.\\\n e.g `${red}hello world` will indeed print \"hello world\" in red (or the color you set in the variable/tag).\\\n The colors can be: \u003cins\u003eblack\u003c/ins\u003e, \u003cins\u003ered\u003c/ins\u003e, \u003cins\u003egreen\u003c/ins\u003e, \u003cins\u003eblue\u003c/ins\u003e, \u003cins\u003ecyan\u003c/ins\u003e, \u003cins\u003eyellow\u003c/ins\u003e, \u003cins\u003emagenta\u003c/ins\u003e, \u003cins\u003ewhite\u003c/ins\u003e and they can be configured in the config file.\\\n **ANSI escape colors** can be used, e.g `\\e[1;31m` or `\\e[38;2;160;223;11m`.\\\n Alternatively, You can put a custom **hex color** e.g: `#ff6622`.\\\n You can also use them inside the tag, like `${!#343345}` or `${\\e[1;31m}`.\\\n It's possible to enable multiple options, put these symbols before `#`:\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;**Terminal and GUI**\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`b` - for making the color in the background\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`u` - to  underline the text\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`!` - for making the text bold\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`i` - for making the text italic\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`s` - for strikethrough text\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;**GUI Only**\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`o` - for overline\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`a(value)` - for fg alpha (either a percentage value like `50%` or a plain integer between 1 and 65536)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`L(value)` - for choosing an underline style (`none`, `single`, `double`, `low`, `error`)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`U(value)` - for choosing the underline color (hexcode color)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`B(value)` - for choosing the bg color text (hexcode color)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`S(value)` - for choosing the strikethrough color (hexcode color)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`O(value)` - for choosing the overline color (hexcode color)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`A(value)` - for choosing the bg text alpha (either a percentage value like `50%` or a plain integer between 1 and 65536)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`w(value)` - for choosing the font weight (`ultralight`, `light`, `normal`, `bold`, `ultrabold`, `heavy`, or a numeric weight)\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;**Terminal Only**\\\n \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;`l` - for blinking text\\\n \\\n To reset colors, use `${0}` for a normal reset or `${1}` for a bold reset.\\\n For auto coloring, depending on the ascii logo colors, use `${auto}`.\\\n They can be used for different colors too. So for getting the 2nd color of the ascii logo,\\\n use `${auto2}`, for the 4th one use `${auto4}` and so on.\\\n If you're using the GUI app and the source path is an image, all the auto colors will be the same colors as the distro ascii art.\n\n* **The Percentage tag (`$%%`)** is used for displaying the percentage between 2 numbers.\\\n  It **must** contain a comma for separating the 2. They can be either be taken from a tag or it put yourself.\\\n  For example: $%10,5%\n  For inverting colors of bad and great (red and green), before the first `%` a put `!`\n\nAny `$` or brackets can be escaped with a backslash `\\`. You need to escape backslashes too :(\\\n**NOTE:** For having compatibility with the GUI app, you need to escape `\u003c` (EXCEPT if you are using in a info tag, like `$\u003cos.name\u003e`) and `\u0026`\\\ne.g `the number 50 is \\\\\u003c 100 \\\\\u0026\\\\\u0026 98`\nWon't affect the printing in terminal.\n\n## Plugins\nThanks to plugins, `customfetch` is able to query way more information than just system information, unlike regular neofetch-like programs.\n\nYou can easily install community-made plugins by using `cufetchpm`, example: `cufetchpm install https://github.com/Toni500github/customfetch-plugins-github`.\nThis example installs a repository, which can have multiple plugins. read `cufetchpm --help` for more information.\n\n## Writing your own plugins\nPlugins are mostly just shared libraries, so you could easily write your own plugin! there's an [example](https://github.com/Toni500github/customfetch/blob/main/examples/mod-library.cc) with detailed comments that explain everything!\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/#Toni500github/customfetch\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=Toni500github/customfetch\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=Toni500github/customfetch\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=Toni500github/customfetch\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n# TODOs\n* release v2.0.0\n* work on the android app (later)\n\n# Thanks\nI would like to thanks:\n* my best-friend [BurntRanch](https://github.com/BurntRanch/),\\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;For helping me initialize this project and motivate me to keep going\\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;And also for making my customizability idea come true with the first prototype of the parser.\n\n* [saberr26](https://github.com/saberr26), \\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;For making the project logos\n\n* the Better C++ [discord server](https://discord.gg/uSzTjkXtAM), \\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;For helping me improving the codebase and helping me with any issues I got,\\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;And also for being patient with me XD\n\n* [fastfetch](https://github.com/fastfetch-cli/fastfetch/) and [neofetch](https://github.com/dylanaraps/neofetch),\\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;For inspiring this project\n\n* [{fmt}](https://github.com/fmtlib/fmt) and [toml++](https://github.com/marzer/tomlplusplus) libraries\\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Our favorite libraries that me and BurntRanch uses\n\n* this string switch-case [library](https://github.com/xroche/stringswitch), \\\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Really amazing, thanks for making this\n\nI hope you'll like customfetch, and also checkout [TabAUR](https://github.com/BurntRanch/TabAUR/tree/dev), our other project that was made before customfetch.\\\nDon't forgot [sdl_engine](https://github.com/BurntRanch/sdl_engine) too ;)\n\n![meme.png](screenshots/meme.png)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoni500github%2Fcustomfetch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoni500github%2Fcustomfetch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoni500github%2Fcustomfetch/lists"}