{"id":13437707,"url":"https://github.com/rfjakob/earlyoom","last_synced_at":"2025-05-13T22:12:14.263Z","repository":{"id":13167789,"uuid":"15850784","full_name":"rfjakob/earlyoom","owner":"rfjakob","description":"earlyoom - Early OOM Daemon for Linux","archived":false,"fork":false,"pushed_at":"2024-11-02T11:39:19.000Z","size":491,"stargazers_count":3350,"open_issues_count":20,"forks_count":176,"subscribers_count":32,"default_branch":"master","last_synced_at":"2025-04-30T12:16:59.580Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rfjakob.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2014-01-12T21:03:43.000Z","updated_at":"2025-04-30T07:00:03.000Z","dependencies_parsed_at":"2023-02-19T01:45:48.877Z","dependency_job_id":"ef9ffe7a-83d3-46aa-b3e0-8533fc50e456","html_url":"https://github.com/rfjakob/earlyoom","commit_stats":{"total_commits":476,"total_committers":39,"mean_commits":"12.205128205128204","dds":0.2142857142857143,"last_synced_commit":"fabac1f3b1e2af71771f16f1e7ea81d59fbc5e98"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rfjakob%2Fearlyoom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rfjakob%2Fearlyoom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rfjakob%2Fearlyoom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rfjakob%2Fearlyoom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rfjakob","download_url":"https://codeload.github.com/rfjakob/earlyoom/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254036843,"owners_count":22003654,"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":[],"created_at":"2024-07-31T03:00:59.498Z","updated_at":"2025-05-13T22:12:13.911Z","avatar_url":"https://github.com/rfjakob.png","language":"C","readme":"earlyoom - The Early OOM Daemon\n===============================\n\n[![CI](https://github.com/rfjakob/earlyoom/actions/workflows/ci.yml/badge.svg)](https://github.com/rfjakob/earlyoom/actions/workflows/ci.yml)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Latest release](https://img.shields.io/github/release/rfjakob/earlyoom.svg)](https://github.com/rfjakob/earlyoom/releases)\n\nThe oom-killer generally has a bad reputation among Linux users. This may be\npart of the reason Linux invokes it only when it has absolutely no other choice.\nIt will swap out the desktop environment, drop the whole page cache and empty\nevery buffer before it will ultimately kill a process. At least that's what I\nthink that it will do. I have yet to be patient enough to wait for it, sitting\nin front of an unresponsive system.\n\nThis made me and other people wonder if the oom-killer could be configured to\nstep in earlier: [reddit r/linux][5], [superuser.com][2], [unix.stackexchange.com][3].\n\nAs it turns out, no, it can't. At least using the in-kernel oom-killer.\nIn the user space, however, we can do whatever we want.\n\nearlyoom wants to be simple and solid. It is written in pure C with no dependencies.\nAn extensive test suite (unit- and integration tests) is written in Go.\n\nWhat does it do\n---------------\nearlyoom checks the amount of available memory and free swap up to 10\ntimes a second (less often if there is a lot of free memory).\nBy default if both are below 10%, it will kill the largest process (highest `oom_score`).\nThe percentage value is configurable via command line\narguments.\n\nIn the `free -m` output below, the available memory is 2170 MiB and\nthe free swap is 231 MiB.\n\n                  total        used        free      shared  buff/cache   available\n    Mem:           7842        4523         137         841        3182        2170\n    Swap:          1023         792         231\n\nWhy is \"available\" memory checked as opposed to \"free\" memory?\nOn a healthy Linux system, \"free\" memory is supposed to be close to zero,\nbecause Linux uses all available physical memory to cache disk access.\nThese caches can be dropped any time the memory is needed for something\nelse.\n\nThe \"available\" memory accounts for that. It sums up all memory that\nis unused or can be freed immediately.\n\nNote that you need a recent version of\n`free` and Linux kernel 3.14+ to see the \"available\" column. If you have\na recent kernel, but an old version of `free`, you can get the value\nfrom `grep MemAvailable /proc/meminfo`.\n\nWhen both your available memory and free swap drop below 10% of the total memory available\nto userspace processes (=total-shared),\nit will send the `SIGTERM` signal to the process that uses the most memory in the opinion of\nthe kernel (`/proc/*/oom_score`).\n\n#### See also\n* [nohang](https://github.com/hakavlad/nohang), a similar project like earlyoom,\n  written in Python and with additional features and configuration options.\n* facebooks's pressure stall information (psi) [kernel patches](http://git.cmpxchg.org/cgit.cgi/linux-psi.git/)\n  and the accompanying [oomd](https://github.com/facebookincubator/oomd) userspace helper.\n  The patches are merged in Linux 4.20.\n\nWhy not trigger the kernel oom killer?\n--------------------------------------\nearlyoom does not use `echo f \u003e /proc/sysrq-trigger` because:\n\nIn some kernel versions (tested on v4.0.5), triggering the kernel\noom killer manually does not work at all.\nThat is, it may only free some graphics\nmemory (that will be allocated immediately again) and not actually kill\nany process. [Here](https://gist.github.com/rfjakob/346b7dc611fc3cdf4011) you\ncan see how this looks like on my machine (Intel integrated graphics).\n\nThis problem has been fixed\nin Linux v5.17\n([commit f530243a](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f530243a172d2ff03f88d0056f838928d6445c6d))\n.\n\nLike the Linux kernel would, earlyoom finds its victim by reading through `/proc/*/oom_score`.\n\nHow much memory does earlyoom use?\n----------------------------------\nAbout `2 MiB` (`VmRSS`), though only `220 kiB` is private memory (`RssAnon`).\nThe rest is the libc library (`RssFile`) that is shared with other processes.\nAll memory is locked using `mlockall()` to make sure earlyoom does not slow down in low memory situations.\n\nDownload and compile\n--------------------\nCompiling yourself is easy:\n\n```bash\ngit clone https://github.com/rfjakob/earlyoom.git\ncd earlyoom\nmake\n```\n\nOptional: Run the integrated self-tests:\n```bash\nmake test\n```\n\nStart earlyoom automatically by registering it as a service:\n```bash\nsudo make install              # systemd\nsudo make install-initscript   # non-systemd\n```\n_Note that for systems with SELinux disabled (Ubuntu 19.04, Debian 9 ...) chcon warnings reporting failure to set the context can be safely ignored._\n\nFor Debian 10+ and Ubuntu 18.04+, there's a [Debian package](https://packages.debian.org/search?keywords=earlyoom):\n```bash\nsudo apt install earlyoom\n```\n\nFor Fedora and RHEL 8 with EPEL, there's a [Fedora package](https://src.fedoraproject.org/rpms/earlyoom/):\n```bash\nsudo dnf install earlyoom\nsudo systemctl enable --now earlyoom\n```\n\nFor Arch Linux, there's an [Arch Linux package](https://www.archlinux.org/packages/community/x86_64/earlyoom/):\n```bash\nsudo pacman -S earlyoom\nsudo systemctl enable --now earlyoom\n```\n\nAvailability in other distributions: see [repology page](https://repology.org/project/earlyoom/versions).\n\nUse\n---\nJust start the executable you have just compiled:\n\n```bash\n./earlyoom\n```\n\nIt will inform you how much memory and swap you have, what the minimum\nis, how much memory is available and how much swap is free.\n\n```\n./earlyoom\neearlyoom v1.8\nmem total: 23890 MiB, user mem total: 21701 MiB, swap total: 8191 MiB\nsending SIGTERM when mem avail \u003c= 10.00% and swap free \u003c= 10.00%,\n        SIGKILL when mem avail \u003c=  5.00% and swap free \u003c=  5.00%\nmem avail: 20012 of 21701 MiB (92.22%), swap free: 5251 of 8191 MiB (64.11%)\nmem avail: 20031 of 21721 MiB (92.22%), swap free: 5251 of 8191 MiB (64.11%)\nmem avail: 20033 of 21723 MiB (92.22%), swap free: 5251 of 8191 MiB (64.11%)\n[...]\n```\n\nIf the values drop below the minimum, processes are killed until it\nis above the minimum again. Every action is logged to stderr. If you are\nrunning earlyoom as a systemd service, you can view the last 10 lines\nusing\n\n```bash\nsystemctl status earlyoom\n```\n\n### Testing\n\nIn order to see `earlyoom` in action, create/simulate a memory leak and let `earlyoom` do what it does: \n\n```\ntail /dev/zero\n```\n\n### Checking Logs \n\nIf you need any further actions after a process is killed by `earlyoom` (such as sending emails), you can parse the logs by:\n\n```\nsudo journalctl -u earlyoom | grep sending\n```\nExample output for above test command (`tail /dev/zero`) will look like: \n\n```\nFeb 20 10:59:34 debian earlyoom[10231]: sending SIGTERM to process 7378 uid 1000 \"tail\": oom_score 156, VmRSS 4962 MiB\n```\n\n\u003e For older versions of `earlyoom`, use: \n\u003e \n\u003e     sudo journalctl -u earlyoom | grep -iE \"(sending|killing)\"\n\u003e \n\n### Notifications\n\nSince version 1.6, earlyoom can send notifications about killed processes\nvia the system d-bus. Pass `-n` to enable them.\n\nTo actually see the notifications in your GUI session, you need to have\n[systembus-notify](https://github.com/rfjakob/systembus-notify)\nrunning as your user.\n\nAdditionally, earlyoom can execute a script for each process killed, providing\ninformation about the process via the `EARLYOOM_PID`, `EARLYOOM_UID` and\n`EARLYOOM_NAME` environment variables. Pass `-N /path/to/script` to enable.\n\nWarning: In case of dryrun mode, the script will be executed in rapid\nsuccession, ensure you have some sort of rate-limit implemented.\n\n### Preferred Processes\n\nThe command-line flag `--prefer` specifies processes to prefer killing;\nlikewise, `--avoid` specifies\nprocesses to avoid killing. See https://github.com/rfjakob/earlyoom/blob/master/MANPAGE.md#--prefer-regex for details.\n\nConfiguration file\n------------------\n\nIf you are running earlyoom as a system service (through systemd or init.d), you can adjust its configuration via the file provided in `/etc/default/earlyoom`. The file already contains some examples in the comments, which you can use to build your own set of configuration based on the supported command line options, for example:\n\n```\nEARLYOOM_ARGS=\"-m 5 -r 60 --avoid '(^|/)(init|Xorg|ssh)$' --prefer '(^|/)(java|chromium)$'\"\n```\nAfter adjusting the file, simply restart the service to apply the changes. For example, for systemd:\n\n```bash\nsystemctl restart earlyoom\n```\n\nPlease note that this configuration file has no effect on earlyoom instances outside of systemd/init.d.\n\nCommand line options\n--------------------\n```\nearlyoom v1.8\nUsage: ./earlyoom [OPTION]...\n\n  -m PERCENT[,KILL_PERCENT] set available memory minimum to PERCENT of total\n                            (default 10 %).\n                            earlyoom sends SIGTERM once below PERCENT, then\n                            SIGKILL once below KILL_PERCENT (default PERCENT/2).\n  -s PERCENT[,KILL_PERCENT] set free swap minimum to PERCENT of total (default\n                            10 %).\n                            Note: both memory and swap must be below minimum for\n                            earlyoom to act.\n  -M SIZE[,KILL_SIZE]       set available memory minimum to SIZE KiB\n  -S SIZE[,KILL_SIZE]       set free swap minimum to SIZE KiB\n  -n                        enable d-bus notifications\n  -N /PATH/TO/SCRIPT        call script after oom kill\n  -g                        kill all processes within a process group\n  -d, --debug               enable debugging messages\n  -v                        print version information and exit\n  -r INTERVAL               memory report interval in seconds (default 1), set\n                            to 0 to disable completely\n  -p                        set niceness of earlyoom to -20 and oom_score_adj to\n                            -100\n  --ignore-root-user        do not kill processes owned by root\n  --sort-by-rss             find process with the largest rss (default oom_score)\n  --prefer REGEX            prefer to kill processes matching REGEX\n  --avoid REGEX             avoid killing processes matching REGEX\n  --ignore REGEX            ignore processes matching REGEX\n  --dryrun                  dry run (do not kill any processes)\n  --syslog                  use syslog instead of std streams\n  -h, --help                this help text\n\n```\n\nSee the [man page](MANPAGE.md) for details.\n\nContribute\n----------\nBug reports and pull requests are welcome via github. In particular, I am glad to\naccept\n\n* Use case reports and feedback\n\nImplementation Notes\n--------------------\n\n* We don't use [procps/libproc2](https://man7.org/linux/man-pages/man3/procps_pids.3.html) because\n  procps_pids_select(), for some reason, always parses /proc/$pid/status.\n  This is relatively expensive, and we don't need it.\n\nChangelog\n---------\n\n* v1.8.2, 2024-05-07\n  * Fixes in `earlyoom.service` systemd unit file\n    * Add `process_mrelease` to allowed syscalls ([commit](https://github.com/rfjakob/earlyoom/commit/c171b72ba217e923551bdde7e7f00ec5a0488b54))\n    * Fix `IPAddressDeny` syntax ([commit](e6c7978813413f3ee4181b8c8b11ae088d6e92a4))\n    * Allow `-p` ([commit](b41ebb2275e59781a8d55a764863417e1e0da5f1))\n\n* v1.8.1, 2024-04-17\n  * Fix trivial test failures caused by message rewording\n    ([commit](https://github.com/rfjakob/earlyoom/commit/bfde82c001c6e5ec11dfd6e5d13dcee9a9f01229))\n\n* v1.8, 2024-04-15\n  * Introduce `user mem total` / `meminfo_t.UserMemTotal` and calculate MemAvailablePercent based on it\n    ([commit](https://github.com/rfjakob/earlyoom/commit/459d76296d3d0a0b59ee1e2e48ad2271429de916),\n    [more info in man page](https://github.com/rfjakob/earlyoom/blob/master/MANPAGE.md#-m-percentkill_percent))\n  * Use `process_mrelease` ([#266](https://github.com/rfjakob/earlyoom/issues/266))\n  * Support `NO_COLOR` (https://no-color.org/)\n  * Don't get confused by processes with a zombie main thread ([commit](https://github.com/rfjakob/earlyoom/commit/e54650f0baf7cef7fb1fed3b02cb8e689c6544ea))\n  * Add `--sort-by-rss`, thanks @RanHuang! This will select a process to kill acc. to the largest RSS\n    instead of largest oom_score.\n  * The Gitlab CI testsuite now also runs on Amazon Linux 2 and Oracle Linux 7.\n\n* v1.7, 2022-03-05\n  * Add `-N` flag to run a script every time a process is killed ([commit](https://github.com/rfjakob/earlyoom/commit/afe03606f077a1a17e6fbc238400b3ce7a9ef2be),\n    [man page section](https://github.com/rfjakob/earlyoom/blob/master/MANPAGE.md#-n-pathtoscript))\n  * Add `-g` flag to kill whole process group ([#247](https://github.com/rfjakob/earlyoom/pull/247))\n  * Remove `-i` flag (ignored for compatibility), it does\n    not work properly on Linux kernels 5.9+ ([#234](https://github.com/rfjakob/earlyoom/issues/234))\n  * Hardening: Drop ambient capabilities on startup ([#234](https://github.com/rfjakob/earlyoom/pull/228))\n\n* v1.6.2, 2020-10-14\n  * Double-check memory situation before killing victim ([commit](https://github.com/rfjakob/earlyoom/commit/e34e0fcec5d9f60eb19a48a3ec2bab175818fdd8))\n  * Never terminate ourselves ([#205](https://github.com/rfjakob/earlyoom/issues/205))\n  * Dump buffer on /proc/meminfo conversion error ([#214](https://github.com/rfjakob/earlyoom/issues/214))\n\n* 1.6.1, 2020-07-07\n  * Clean up dbus-send zombie processes ([#200](https://github.com/rfjakob/earlyoom/issues/200))\n  * Skip processes with oom_score_adj=-1000 ([210](https://github.com/rfjakob/earlyoom/issues/210))\n\n* 1.6, 2020-04-11\n  * Replace old `notify-send` GUI notification logic with\n    `dbus-send` / [systembus-notify](https://github.com/rfjakob/systembus-notify)\n    ([#183](https://github.com/rfjakob/earlyoom/issues/183))\n    * `-n`/`-N` now enables the new logic\n    * You need to have [systembus-notify](https://github.com/rfjakob/systembus-notify) running\n      in your GUI session for notifications for work\n  * Handle `/proc` mounted with\n    [hidepid](https://github.com/rfjakob/earlyoom/wiki/proc-hidepid)\n    gracefully ([issue #184](https://github.com/rfjakob/earlyoom/issues/184))\n\n* v1.5, 2020-03-22\n  * `-p`: set oom_score_adj to `-100` instead of `-1000`\n    ([#170](https://github.com/rfjakob/earlyoom/issues/170))\n  * Allow using **both** `-M` and `-m`, and `-S` and `-s`. The\n    lower value (converted to percentages) will be used.\n  * Set memory report interval in `earlyoom.default` to 1 hour\n    instead of 1 minute ([#177](https://github.com/rfjakob/earlyoom/issues/177))\n\n* v1.4, 2020-03-01\n  * Make victim selection logic 50% faster by lazy-loading process attributes\n  * Log the user id `uid` of killed processes in addition to pid and name\n  * Color debug log in light grey\n  * Code clean-up\n    * Use block-local variables where possible\n    * Introduce PATH_LEN to replace several hardcoded buffer lengths\n  * Expand testsuite (`make test`)\n  * Run `cppcheck` when available\n  * Add unit-test benchmarks (`make bench`)\n  * Drop root privileges in systemd unit file `earlyoom.service`\n\n* v1.3.1, 2020-02-27\n  * Fix spurious testsuite failure on systems with a lot of RAM\n    ([issue #156](https://github.com/rfjakob/earlyoom/issues/156))\n\n* v1.3, 2019-05-26\n  * Wait for processes to actually exit when sending a signal\n    * This fixes the problem that earlyoom sometimes kills more than\n      one process when one would be enough\n      ([issue #121](https://github.com/rfjakob/earlyoom/issues/121))\n  * Be more liberal in what limits to accepts for SIGTERM and SIGKILL\n    ([issue #97](https://github.com/rfjakob/earlyoom/issues/97))\n    * Don't exit with a fatal error if SIGTERM limit \u003c SIGKILL limit\n    * Allow zero SIGKILL limit\n  * Reformat startup output to make it clear that BOTH swap and mem must\n    be \u003c= limit\n  * Add [notify_all_users.py](contrib/notify_all_users.py)\n    helper script\n  * Add [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) (Contributor Covenant 1.4)\n    ([#102](https://github.com/rfjakob/earlyoom/issues/102))\n  * Fix possibly truncated UTF8 app names in log output\n    ([#110](https://github.com/rfjakob/earlyoom/issues/110))\n\n* v1.2, 2018-10-28\n  * Implement adaptive sleep time (= adaptive poll rate) to lower CPU\n    usage further ([issue #61](https://github.com/rfjakob/earlyoom/issues/61))\n  * Remove option to use kernel oom-killer (`-k`, now ignored for compatibility)\n    ([issue #80](https://github.com/rfjakob/earlyoom/issues/80))\n  * Gracefully handle the case of swap being added or removed after earlyoom was started\n    ([issue 62](https://github.com/rfjakob/earlyoom/issues/62),\n    [commit](https://github.com/rfjakob/earlyoom/commit/88e58903fec70b105aebba39cd584add5e1d1532))\n  * Implement staged kill: first SIGTERM, then SIGKILL, with configurable limits\n    ([issue #67](https://github.com/rfjakob/earlyoom/issues/67))\n* v1.1, 2018-07-07\n  * Fix possible shell code injection through GUI notifications\n    ([commit](https://github.com/rfjakob/earlyoom/commit/ab79aa3895077676f50120f15e2bb22915446db9))\n  * On failure to kill any process, only sleep 1 second instead of 10\n    ([issue #74](https://github.com/rfjakob/earlyoom/issues/74))\n  * Send the GUI notification *after* killing, not before\n    ([issue #73](https://github.com/rfjakob/earlyoom/issues/73))\n  * Accept `--help` in addition to `-h`\n  * Fix wrong process name in log and in kill notification\n    ([commit 1](https://github.com/rfjakob/earlyoom/commit/7634c5b66dd7e9b88c6ebf0496c8777f3c4b3cc1),\n    [commit 2](https://github.com/rfjakob/earlyoom/commit/15679a3b768ea2df9b13a7d9b0c1e30bd1a450e6),\n    [issue #52](https://github.com/rfjakob/earlyoom/issues/52),\n    [issue #65](https://github.com/rfjakob/earlyoom/issues/65),\n    [issue #194](https://github.com/rfjakob/earlyoom/issues/194))\n  * Fix possible division by zero with `-S`\n    ([commit](https://github.com/rfjakob/earlyoom/commit/a0c4b26dfef8b38ef81c7b0b907442f344a3e115))\n* v1.0, 2018-01-28\n  * Add `--prefer` and `--avoid` options (@TomJohnZ)\n  * Add support for GUI notifications, add options `-n` and `-N`\n* v0.12: Add `-M` and `-S` options (@nailgun); add man page, parameterize Makefile (@yangfl)\n* v0.11: Fix undefined behavior in get_entry_fatal (missing return, [commit](https://github.com/rfjakob/earlyoom/commit/9251d25618946723eb8a829404ebf1a65d99dbb0))\n* v0.10: Allow to override Makefile's VERSION variable to make packaging easier,\n  add `-v` command-line option\n* v0.9: If oom_score of all processes is 0, use VmRss to find a victim\n* v0.8: Use a guesstimate if the kernel does not provide MemAvailable\n* v0.7: Select victim by oom_score instead of VmRSS, add options `-i` and `-d`\n* v0.6: Add command-line options `-m`, `-s`, `-k`\n* v0.5: Add swap support\n* v0.4: Add SysV init script (thanks [@joeytwiddle](https://github.com/joeytwiddle)), use the new `MemAvailable` from `/proc/meminfo`\n  (needs Linux 3.14+, [commit][4])\n* v0.2: Add systemd unit file\n* v0.1: Initial release\n\n[1]: http://www.freelists.org/post/procps/library-properly-handle-memory-used-by-tmpfs\n[2]: http://superuser.com/questions/406101/is-it-possible-to-make-the-oom-killer-intervent-earlier\n[3]: http://unix.stackexchange.com/questions/38507/is-it-possible-to-trigger-oom-killer-on-forced-swapping\n[4]: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773\n[5]: https://www.reddit.com/r/linux/comments/56r4xj/why_are_low_memory_conditions_handled_so_badly/\n","funding_links":[],"categories":["Security Tools","HarmonyOS","C","Tools"],"sub_categories":["Windows Manager","Interfaces","Winetricks","Objective-C Tools, Libraries, and Frameworks","Mesh networks"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frfjakob%2Fearlyoom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frfjakob%2Fearlyoom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frfjakob%2Fearlyoom/lists"}