{"id":13393550,"url":"https://github.com/akavel/up","last_synced_at":"2025-05-13T20:21:12.833Z","repository":{"id":38154510,"uuid":"127666788","full_name":"akavel/up","owner":"akavel","description":"Ultimate Plumber is a tool for writing Linux pipes with instant live preview","archived":false,"fork":false,"pushed_at":"2024-09-05T21:31:37.000Z","size":856,"stargazers_count":8458,"open_issues_count":28,"forks_count":129,"subscribers_count":97,"default_branch":"master","last_synced_at":"2025-04-01T18:19:24.986Z","etag":null,"topics":["instant-preview","linux","live-programming","pipes","tui","up"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akavel.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":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-01T19:59:26.000Z","updated_at":"2025-04-01T04:43:26.000Z","dependencies_parsed_at":"2024-10-29T10:37:59.361Z","dependency_job_id":null,"html_url":"https://github.com/akavel/up","commit_stats":{"total_commits":125,"total_committers":7,"mean_commits":"17.857142857142858","dds":0.08799999999999997,"last_synced_commit":"840f23c21d3e692661d6ee574490880d7524f761"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akavel%2Fup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akavel%2Fup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akavel%2Fup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akavel%2Fup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akavel","download_url":"https://codeload.github.com/akavel/up/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247909203,"owners_count":21016479,"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":["instant-preview","linux","live-programming","pipes","tui","up"],"created_at":"2024-07-30T17:00:55.767Z","updated_at":"2025-04-08T19:20:29.360Z","avatar_url":"https://github.com/akavel.png","language":"Go","readme":"\u003cimg align=\"left\" width=\"183\" height=\"154\" src=\"logo.svg\" /\u003e\n\n# up - the Ultimate Plumber\n\n**up** is the **Ultimate Plumber**, a tool for writing Linux pipes in a\nterminal-based UI interactively, with instant live preview of command results.\n\nThe main **goal** of the Ultimate Plumber is to help **interactively and\nincrementally explore textual data** in Linux, by making it easier to quickly\nbuild complex pipelines, thanks to a **fast feedback loop**. This is achieved\nby boosting any typical **Linux text-processing utils** such as `grep`, `sort`,\n`cut`, `paste`, `awk`, `wc`, `perl`, etc., etc., by providing a quick,\n**interactive, scrollable preview** of their results.\n\n[![](up.gif)](https://asciinema.org/a/208538)\n\n## Usage\n\n**[Download *up* for Linux](https://github.com/akavel/up/releases/latest/download/up)**\n\u0026nbsp; | \u0026nbsp; [ArchLinux](https://wiki.archlinux.org/index.php/Arch_User_Repository): [`aur/up`](https://aur.archlinux.org/packages/up/)\n\u0026nbsp; | \u0026nbsp; FreeBSD: [`pkg install up`](https://www.freshports.org/textproc/up)\n\u0026nbsp; | \u0026nbsp; macOS: [`brew install up`](https://formulae.brew.sh/formula/up)\n\u0026nbsp; | \u0026nbsp; [Other OSes](https://github.com/akavel/up/releases)\n\nTo start using **up**, redirect any text-emitting command (or pipeline) into it\n— for example:\n\n    $ lshw |\u0026 ./up\n\nthen:\n\n- use ***PgUp/PgDn*** and ***Ctrl-[←]/Ctrl-[→]*** for basic browsing through\n  the command output;\n- in the input box at the top of the screen, start **writing any bash\n  pipeline**; then **press Enter to execute the command you typed**,\n  and the Ultimate Plumber will immediately show you the output of\n  the pipeline in the **scrollable window** below (replacing any\n  earlier contents)\n    - For example, you can try writing:\n      `grep network -A2 | grep : | cut -d: -f2- | paste - -`\n      — on my computer, after pressing *Enter*, the screen then shows\n      the pipeline and a scrollable preview of its output like below:\n\n             | grep network -A2 | grep : | cut -d: -f2- | paste - -\n             Wireless interface      Centrino Advanced-N 6235\n             Ethernet interface      RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller\n\n    - **WARNING: Please be careful when using it! It could be dangerous.**\n      In particular, writing \"rm\" or \"dd\" into it could be like running around\n      with a chainsaw. But you'd be careful writing \"rm\" anywhere in Linux\n      anyway, no?\n- when you are satisfied with the result, you can **press *Ctrl-X* to exit**\n  the Ultimate Plumber, and the command you built will be **written into\n  `up1.sh` file** in the current working directory (or, if it already existed,\n  `up2.sh`, etc., until 1000, based on [Shlemiel the Painter's\n  algorithm](https://www.joelonsoftware.com/2001/12/11/back-to-basics/)).\n  Alternatively, you can press ***Ctrl-C*** to quit without saving.\n- If the command you piped into *up* is long-running (in such case you will see\n  a tilde `~` indicator character in the top-left corner of the screen, meaning\n  that *up* is still waiting for more input), you may need to press\n  ***Ctrl-S*** to temporarily freeze *up*'s input buffer (a freeze will be\n  indicated by a `#` character in top-left corner), which will inject a fake\n  EOF into the pipeline; otherwise, some commands in the pipeline may not print\n  anything, waiting for full input (especially commands like `wc` or `sort`,\n  but `grep`, `perl`, etc. may also show incomplete results). To unfreeze back,\n  press ***Ctrl-Q***.\n\n## Additional Notes\n\n- The pipeline is passed verbatim to a `bash -c` command, so any bash-isms should work.\n- The input buffer of the Ultimate Plumber is currently fixed at **40 MB**. If\n  you reach this limit, a `+` character should get displayed in the top-left\n  corner of the screen. (This is intended to be changed to a\n  dynamically/manually growable buffer in a future version of *up*.)\n- **MacOSX support:** I don't have a Mac, thus I have no idea if it works on\n  one. You are welcome to try, and also to send PRs. If you're interested in\n  me providing some kind of official-like support for MacOSX, please consider\n  trying to find a way to send me some usable-enough Mac computer. Please note\n  I'm not trying to \"take advantage\" of you by this, as I'm actually not at all\n  interested in achieving a Mac otherwise. (Also, trying to commit to this kind\n  of support will be an extra burden and obligation on me. Knowing someone out\n  there cares enough to do a fancy physical gesture would really help alleviate\n  this.) If you're serious enough to consider this option, please contact me by\n  email (mailto:czapkofan@gmail.com) or keybase (https://keybase.io/akavel), so\n  that we could try to research possible ways to achieve this.\n  Thanks for understanding!\n- **Prior art:** I was surprised no one seemed to write a similar tool before,\n  that I could find. It should have been possible to write this since the dawn\n  of Unix already, or earlier! And indeed, after I announced *up*, I got enough\n  publicity that my attention was directed to one such earlier project already:\n  **[Pipecut](http://pipecut.org/index.html)**. Looks interesting! You may like\n  to check it too! (Thanks [@TronDD](https://lobste.rs/s/acpz00/up_tool_for_writing_linux_pipes_with#c_qxrgoa).)\n- **Other influences:** I don't remember the fact too well already, but I'm\n  rather sure that this must have been inspired in big part by The Bret Victor's Talk(s).\n\n## Future Ideas\n\n- I have quite a lot of ideas for further experimentation of development of\n  *up*, including but not limited to:\n    - [RIIR](https://rust-lang.org) (once I learn enough of Rust... at some\n      point in future... maybe...) — esp. to hopefully make *up* be a smaller\n      binary (and also to maybe finally learn some Rust); though I'm somewhat\n      afraid if it might ossify the codebase and make harder to develop\n      further..? ...but maybe actually converse?...\n    - Maybe it could be made into an UI-less, RPC/REST/socket/text-driven\n      service, like gocode or [Language Servers](https://langserver.org/), for\n      integration with editors/IDEs (emacs? vim? VSCode?...) I'd be especially\n      interested in eventually merging it into [Luna\n      Studio](https://luna-lang.org/); RIIR may help in this. (Before this, as\n      a simpler approach, multi-line editing may be needed, or at least\n      left\u0026right scrolling of the command editor input box. Also, some kind of\n      jumping between words in the command line; readline's *Alt-b* \u0026 *Alt-f*?)\n    - Make it possible to [capture output of already running\n      processes](https://stackoverflow.com/a/19584979/98528)! (But maybe that\n      could be better made as a separate, composable tool! In Rust?)\n    - Adding tests... (ahem; see also\n      [#1](https://github.com/akavel/up/issues/1)) ...also write `--help`...\n    - Making it work on Windows,\n      somehow[?](https://github.com/mattn/go-shellwords) Also, obviously, would\n      be nice to have some CI infrastructure enabling porting it to MacOSX,\n      BSDs, etc., etc...\n    - Integration with [fzf](https://github.com/junegunn/fzf) and other TUI\n      tools? I only have some vague thoughts and ideas about it as of now, not\n      even sure how this could look like.\n    - Adding more previews, for each `|` in the pipeline; also forking of\n      pipelines, merging, feedback loops, and other mixing and matching (though\n      I'd strongly prefer if [Luna](https://luna-lang.org) was to do it\n      eventually).\n- If you are interested in financing my R\u0026D work, contact me by email at:\n  czapkofan@gmail.com, or [on keybase.io as akavel](https://keybase.io/akavel).\n  I suppose I will probably be developing the Ultimate Plumber further anyway,\n  but at this time it's purely a hobby project, with all the fun and risks this\n  entails.\n\n— *Mateusz Czapliński*  \n*October 2018*\n\n*PS. The UP logo was conceived and generously sponsored\nby [Thoai Nguyen](https://github.com/thoaionline)\nand [GPU Exchange](https://gpu.exchange/),\nwith a helping hand from [Many Pixels](https://www.manypixels.co/).*\n","funding_links":[],"categories":["Go","Utilities","tui","Tools","Shell","\u003ca name=\"text-processing\"\u003e\u003c/a\u003eText processing"],"sub_categories":["Shell Utilities","Go","PCAP"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakavel%2Fup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakavel%2Fup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakavel%2Fup/lists"}