{"id":43526719,"url":"https://github.com/walles/ftop","last_synced_at":"2026-04-19T10:02:24.822Z","repository":{"id":335432915,"uuid":"1145682951","full_name":"walles/ftop","owner":"walles","description":"Finformative top for finding fiery processes","archived":false,"fork":false,"pushed_at":"2026-04-16T14:42:36.000Z","size":9522,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T16:32:21.304Z","etag":null,"topics":["cli","monitoring-tool","process-monitor","terminal-based","text-ui","top"],"latest_commit_sha":null,"homepage":"","language":"Go","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/walles.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":"2026-01-30T04:46:40.000Z","updated_at":"2026-04-16T14:42:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/walles/ftop","commit_stats":null,"previous_names":["walles/ftop"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/walles/ftop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fftop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fftop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fftop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fftop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/walles","download_url":"https://codeload.github.com/walles/ftop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fftop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32002361,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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":["cli","monitoring-tool","process-monitor","terminal-based","text-ui","top"],"created_at":"2026-02-03T15:14:00.345Z","updated_at":"2026-04-19T10:02:24.782Z","avatar_url":"https://github.com/walles.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Linux CI](https://github.com/walles/ftop/actions/workflows/linux-ci.yml/badge.svg?branch=main)](https://github.com/walles/ftop/actions/workflows/linux-ci.yml?query=branch%3Amain)\n\n# `top` for Human Beings\n\nSee below for [how to install](#installation).\n\n`ftop` is what I use when [LoadViz](https://github.com/walles/loadviz/) shows\nsomething unexpected going on.\n\n`ftop` is an evolution of [`ptop`](https://github.com/walles/ptop). `ftop`\nprovides the same helpful information but looks nicer.\n\n![ftop screenshot](screenshot.png)\n\nNotes:\n\n- CPU usage is shown as red bars, memory usage as blue bars.\n- The Commands column is smart, showing `hello.py` rather than just `python`\n  for `python hello.py`. [Smartness available for many different\n  runtimes](https://github.com/walles/ftop/blob/main/internal/processes/commandline_test.go).\n- Multiple processes sharing the same name are disambiguated with `[5]`\n  suffixes. The `[1]` process is the oldest one. Suffixes are stable within one\n  `ftop` run.\n- Note the two sections on the right showing CPU and memory usage per user and\n  per command.\n- The process list can be filtered by a search string, matching command line,\n  user name or PID.\n- Note the `IO` section, showing IO usage per device with high watermarks.\n- Sort keys are CPU usage, memory usage and the number of recently spawned child\n  processes. CPU usage is defined as CPU-time-since-`ftop`-started, making the\n  display mostly stable.\n- Binaries launched during the current `ftop` run are listed at the bottom of\n  the display.\n- Note the core counts right next to the system load number, for easy\n  comparison.\n- Note the load history graph next to the load numbers. This is a visualization\n  of the numbers you get from `uptime`.\n\n## Installation\n\n```\nbrew install walles/johan/ftop\n```\n\nOtherwise you can download binaries from\n\u003chttps://github.com/walles/ftop/releases\u003e and put them in somewhere in your\n`$PATH`, `/usr/local/bin/` comes to mind.\n\nOr do this to [install `ftop` into\n`$GOPATH/bin`](https://manpages.debian.org/testing/golang-go/go-install.1.en.html),\nmake sure `$GOPATH/bin` is in your `$PATH`:\n\n```sh\ngo install github.com/walles/ftop/cmd/ftop@latest\n```\n\n## Usage\n\nJust type `ftop`, that's a good start! If you already know what you're looking\nfor, `ftop firefox` starts with `firefox` as the active filter.\n\nTo exit `ftop`, press `q`.\n\nAlso try `ftop --help` to see what else is available.\n\nIf you run into problems, try running with the `--debug` switch, that will get\nyou debug logs after `ftop` is done.\n\n# Use Cases\n\n- Why is my fan making noises?\n  - Process top list\n- I have a CPU meter that is peaking, why?\n  - Process top list\n- I have a RAM meter that is peaking, why?\n  - Process top list\n- Why is my computer slow?\n  - Process top list\n  - Process top list by IO usage\n- `brew` is forking a lot of `curl` subprocesses, but not using much CPU. How\n  can I find `brew` in this case?\n  - Processes spawning many children during the last minute are moved up the\n    list.\n- Which processes are IO heavy?\n  - Process top list by IO usage\n- Is this specific process leaking memory?\n  - When a process is picked, replace the user top lists with a braille\n    history chart for the current process. This means we need to collect\n    historical data for each process.\n- Which new processes are being launched and why?\n  - The ftop launched-binaries tree is excellent for this\n- Is some particular service running?\n  - Filter processes by name or number\n- Which users are consuming CPU?\n  - User top list by CPU usage\n- Which users are consuming RAM?\n  - User top list by RAM usage\n- Which users are consuming IO?\n  - User top list by IO usage\n- I want to see the overall system load and resource usage\n  - System load graph for CPU.\n  - Memory pressure as measured by \"system\" CPU time. Or some number, since even\n    if it doesn't help them, this is the number people expect to see.\n  - Some IO load number.\n- I need to check if my system is under heavy I/O load\n  - Process top list by IO usage\n  - Or if that's not possible, device top list by IO usage\n- I want to see if a process is stuck or in an uninterruptible sleep state\n  - Nah, let's just not care about this until somebody explicitly asks for it\n- I need to find and kill a runaway process.\n  - Find: Process top list\n  - Kill: Pick process and provide a way for the user to request its termination\n- Why is some process running on my system?\n  - The px-for-one-process view is excellent for this\n\n# Development\n\n## Running\n\n```\ngo run ./cmd/ftop\n```\n\n## Profiling\n\n1. `go run ./cmd/ftop --profile`, this will generate profiling files\n1. After `ftop` is done, analyze the generated profile files like this:\n   - `go tool pprof -relative_percentages -web profile-cpu.out`\n   - `go tool pprof -relative_percentages -web profile-heap.out`\n\n## Benchmarking\n\nRun one named benchmark (replace with the benchmark you want):\n\n```sh\ngo test ./internal/ftop -run '^$' -bench '^BenchmarkSortProcessesForDisplay$' -cpuprofile profile-cpu.out -memprofile profile-heap.out\n```\n\nInspect the generated profiles:\n\n```sh\ngo tool pprof -relative_percentages -web profile-cpu.out\ngo tool pprof -relative_percentages -web profile-heap.out\n```\n\nYou can also inspect in the terminal with `go tool pprof -top benchmark-cpu.out`.\n\n\n\n## Screenshot\n\nScale your terminal to 90x30, `go run ./cmd/ftop` and screenshot that.\n\n## Releasing a new Version\n\n```\n./release.sh\n```\n\n## TODO\n\n- Implement the rest of the `px` process info features\n- When hovering a process, replace the two rightmost panes with info about that\n  process, note that in the Output section above\n- Test process rendering with process names with:\n  - Wide chars, as in \"multiple bytes per char\"\n  - Wide chars, as in \"takes up multiple screen columns\"\n- Verify we have all Use Cases ^ covered\n- Consider how to handle macOS in CI\n- Profile and see if there's any low-hanging fruit to fix performance-wise\n- Accept smaller window sizes\n  - Drop columns if the terminal is really narrow\n- Move macOS specific parsers into cross-platform parser files and add tests for\n  them, just like we have for the Linux specific parsers.\n- Should we remake `px`? `pf`?\n- Should we remake `pxtree`? `pftree`?\n- Make sure we are implementing the memory leak use case.\n- Offer to kill as root if we don't have permissions to kill a process. Prompt\n  for `sudo` password.\n\n## TODO `iotop` replacement\n\n- Record per process IO usage and present that in one or more columns.\n\n## TODO misc\n\n- Details: When no users were found to be logged in at process start,\n  automatically detect whether it's because we don't have history that\n  far back or whether it seems to be that nobody was actually logged in.\n  Inform the user about the outcome.\n- In the `pf` / `ftop` views, in the process owner column, maybe print other\n  non-root process owners of parent processes inside parentheses?\n\n## DONE\n\n- Don't crash on too small terminal window\n- Get the UI structure right with plain text only. Pressing ESC / q should exit.\n- Drop the two rightmost panes if the terminal is too narrow\n- Drop the launched-binaries tree if the terminal is too low\n- Be happy enough with --version output\n- Decide on the new name (`ftop`)\n- Rename\n- Ignore -E switch on Python command lines\n- Check any mention of px, ptop or pxtree is intentional\n- Update screenshot(s) ^\n- Link back to the px repo for historical context\n- Implement some crash reporting system, compare with `moor`\n- Be happy enough with --help output, compare with `ptop --help`\n- Set up CI building + testing on Linux\n- Add CI status badge to the top of this README\n- Document in this README how to make releases\n- Verify all descriptions in this file + screenshots match the actual behaviors\n  of our binaries.\n- Make a release.\n- Consider new sort orders for showing homebrew runs higher up the list. A third\n  sort parameter is now \"number of child processes launched during the last\n  minute\".\n- If we have 10 different \"claude\" processes, dedup them as \"claude[5]\" in the\n  Command column. The dedup suffixes should be stable within one `ftop` run.\n- Implement filtering, note that in the Output section above\n- Implement process picking with arrow keys, note that in the Output section\n  above\n- Implement killing the hovered process\n- Consider having our own Homebrew tap\n- When hovering a process, show its hierarchy in the launched-binaries pane\n- When hovering a process, show its start timestamp and its age in the\n  launched-binaries pane\n- Implement the process info screen. By spawning `px`? For starters I want to\n  know:\n  - full process command line (can take lots of space)\n  - process hierarchy parents and possibly children, do what `px` does\n  - process start time and age\n- When process naming fails, it must be possible to access the full command\n  line for error reporting. Consider it might be really long.\n- When hovering a process, show its nativity somewhere\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalles%2Fftop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwalles%2Fftop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalles%2Fftop/lists"}