HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
9fans
plan9port
C2016–2026
9fans / plan9port

plan9port

Plan 9 from User Space

22Distinct people
23Mentions
1Explicit recommenders
2KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Plan 9 from User Space

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Makefiles are underrated. The concept is so simple – it is basically a dependency graph with attached shell scripts – yet so powerful. Not just for building software, but also…

black_knight used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year23 dated mentions

Observed mentions: 2016-08-15 20:18:15 UTC to 2026-07-13 16:35:50 UTC.

012342016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20162017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments20212022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC404
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC404
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC101
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC110
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC110
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC404
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC303
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC202
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC110
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
This is a port of many Plan 9 libraries and programs to Unix. Installation To install, run ./INSTALL. It builds mk and then uses mk to run the rest of the installation. For more details, see install(1), at install.txt in this directory and at https://9fans.github.io/plan9port/man/man1/install.html. Documentation See https://9fans.github.io/plan9port/man/ for more documentation. (Documentation is also in this tree, but you need to run a successful install first. After that, "9 man 1 intro".) Intro(1) contains a list of man pages that describe new features or differences from Plan 9. Helping out If you'd like to help out, great! If you port this code to other architectures, please share your changes so others can benefit. Git You can use Git to keep your local copy up-to-date as we make changes and fix bugs. See the git(1) man page here ("9 man git") for details on using Git. Status Contact Mailing list: https://groups.google.com/group/plan9port-dev Issue tracker: https://github.com/9fans/plan9port/issues Submitting changes: https://github.com/9fans/plan9port/pulls Russ Cox rsc@swtch.com
Read the full README on GitHub

What Hacker News says

23 sources
vim/nvim are still heavy beasts. Here's a recent example which made me laugh: 2 months ago, a "shortcut" for reverse search was implemented in acme[0], a 30 years old text-editor. It's not even qualified as a "feature" yet, rather, as an "experiment"[1]. Every little decision is carefully weighted; every square inch of the software is carefully and precisely designed. Japanese wooden planes are similarly designed: they don't look like much, especially in comparison with more modern, shinier tools, but they're surprisingly well-thought. [0]: https://en.wikipedia.org/wiki/Acme_(text_editor) [1]: https://github.com/9fans/plan9port/commit/0c79c32675e83ff3d8...
In We have reached OpenBSD of Theseus
From a previous project: https://nunosempere.com/blog/2023/09/15/wc/ that was looking not at speed, but at simplicity, here is a comparison of different historical versions of wc: --- The [version of wc.c](https://git.nunosempere.com/personal/wc/src/branch/master/sr...) in this repository sits at 44 lines. It decides to read from stdin if the number of arguments fed to it is otherwise zero, and uses the standard C function getc to read character by character. It doesn't have flags, instead, there are further utilities in the src/extra/ folder for counting characters and lines, sitting at 32 and 35 lines of code, respectively. This version also has little error checking. [Here](https://github.com/dspinellis/unix-history-repo/blob/Researc...) is a version of wc from UNIX V7, at 86 lines. It allows for counting characters, words and lines. I
Read the rest
couldn't find a version in UNIX V6, so I'm guessing this is one of the earliest versions of this program. It decides to read from stdin if the number of arguments fed to it is zero, and reads character by character using the standard C getc function. The busybox version ([git.busybox.net](https://git.busybox.net/busybox/tree/coreutils/wc.c)) of wc sits at 257 lines (162 with comments stripped), while striving to be [POSIX-compliant](https://pubs.opengroup.org/onlinepubs/9699919799/), meaning it has a fair number of flags and a bit of complexity. It reads character by character by using the standard getc function, and decides to read from stdin or not using its own fopen_or_warn_stdin function. It uses two GOTOs to get around, and has some incomplete Unicode support. The [plan9](https://9p.io/sources/plan9/sys/src/cmd/wc.c) version implements some sort of table method in 331 lines. It uses plan9 rather than Unix libraries and methods, and seems to read from stdin if the number of args is 0. The plan9port version of wc ([github](https://github.com/9fans/plan9port/blob/master/src/cmd/wc.c)) also implements some sort of table method, in 352 lines. It reads from stdin if the number of args is 0, and uses the Linux read function to read character by character. The [OpenBSD](https://github.com/openbsd/src/blob/master/usr.bin/wc/wc.c) version is just *nice*. It reads from stdin by default, and uses a bit of buffering using read to speed things up. It defaults to using fstat when counting characters. It is generally pleasantly understandable, nice to read. I'm actually surprised at how pleasant it is to read. The [FreeBSD version](https://cgit.freebsd.org/src/tree/usr.bin/wc/wc.c) sits at 367 lines. It has enough new things that I can't parse all that it's doing: in lines 137-143, what is capabilities mode? what is casper?, but otherwise it decides whether to read from stdin by the number of arguments, in line 157. It uses a combination of fstat and read, depending on the type of file. Finally, the GNU utils version ([github](https://github.com/coreutils/coreutils/tree/master/src/wc.c), [savannah](http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f...)) is a bit over 1K lines of C. It does many things and checks many possible failure modes. I think it detects whether it should be reading from stdin using some very wrapped fstat, and it reads character by character using its own custom function. So this utility started out reasonably small, then started getting more and more complex. [The POSIX committee](https://pubs.opengroup.org/onlinepubs/9699919799/) ended up codifying that complexity, and now we are stuck with it because even implementations like busybox which strive to be quite small try to keep to POSIX.
In Wc2: Investigates optimizing 'wc', the Unix word count program
That code was in turn a loose port of the dial function from Plan 9 from User Space, where I added TCP_NODELAY to new connections by default in 2004 [1], with the unhelpful commit message "various tweaks". If I had known this code would eventually be of interest to so many people maybe I would have written a better commit message! I do remember why, though. At the time, I was working on a variety of RPC-based systems that ran over TCP, and I couldn't understand why they were so incredibly slow. The answer turned out to be TCP_NODELAY not being set. As John Nagle points out [2], the issue is really a bad interaction between delayed acks and Nagle's algorithm, but the only option on the FreeBSD system I was using was TCP_NODELAY, so that was the answer. In another system I built around that time I ran an RPC protocol over ssh, and I had to
Read the rest
patch ssh to set TCP_NODELAY, because at the time ssh only set it for sessions with ptys [3]. TCP_NODELAY being off is a terrible default for trying to do anything with more than one round trip. When I wrote the Go implementation of net.Dial, which I expected to be used for RPC-based systems, it seemed like a no-brainer to set TCP_NODELAY by default. I have a vague memory of discussing it with Dave Presotto (our local networking expert, my officemate at the time, and the listed reviewer of that commit) which is why we ended up with SetNoDelay as an override from the very beginning. If it had been up to me, I probably would have left SetNoDelay out entirely. As others have pointed out at length elsewhere in these comments, it's a completely reasonable default. I will just add that it makes no sense at all that git-lfs (lf = large file!) should be sending large files 50 bytes at a time. That's a huge number of system calls that could be avoided by doing larger writes. And then the larger writes would work better for the TCP stack anyway. And to answer the question in the article: > Much (all?) of Kubernetes is written Go, and how has this default affected that? I'm quite confident that this default has greatly improved the default server latency in all the various kinds of servers Kubernetes has. It was the right choice for Go, and it still is. [1] https://github.com/9fans/plan9port/commit/d51419bf4397cf13d0... [2] https://news.ycombinator.com/item?id=34180239 [3] http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TM-65...
In Golang disables Nagle's Algorithm by default
Yes. There's [acme-lsp](https://github.com/fhs/acme-lsp) for providing language server integration and things like "jump to definition", "show hover-help" and so on. I personally use `autokey` on Linux and `sxhkd` on macOS for adding a key binding for `acme-lsp`'s `Lcomp` command which performs completion. There's also [Watch](https://pkg.go.dev/9fans.net/go/acme/Watch) for monitoring a directory of files for changes and running a command in a persistent Acme window. I use that for continuously running unit tests while I edit some piece of code, or for automatically running `go generate` and such. For your REPL needs, there's the `win` command that implements a basic dumb terminal as an Acme window. This provides a few goodies like letting you edit the terminal buffer with Acme's `Edit` command and its embedded Sam command language, as we
Read the rest
ll as adding "snippets" that can be executed with one click of the middle mouse button. Acme by itself is already plenty useful (`win` is part of the "standard distribution" so to speak, in that it is part of the various Plan9 forks and of plan9port), and a lot of extra stuff can be built rather quickly by hooking into its 9p interface: For example, my tool to add commonly used tools to the tag (the blue line at the top of each text window that contains the file name and commands that act on the window) is a handful of lines of shell script that parse entries in acme's `acme/log` file and select the appropriate tools to add based on the name of newly opened files. My Git integration is a thin wrapper around `win` and `git commit --interactive` that pops open a window that allows me to author a Git commit similar to (but a lot simpler than) magit for emacs and fugitive for Vim work. Even if you're not in Plan9 (or one of the forks), I encourage you to give [plan9port](https://github.com/9fans/plan9port)'s Acme a spin. (FWIW, this post was written in an Acme window because it's a lot more intuitive to use after some getting used to than regular ol' GTK text boxes used by Firefox.)
In 9front “The Golden Age of Ballooning” Released
Plan 9 as a whole is a pretty good IDE for general development - excels at C, shell scripts, Go, and similar. Having been created explicitly to OS differs from older (POSIX/VMS era) OSes by making GUI, architecture portability, namespaces, user-level filesystems, software services, network transparency and distributed computing first-order concerns. For those unable to switch outright, I wholeheartedly recommend plan9port[0] - an almost complete set of utilities and protocols from Plan 9, ported to run in Linux, MacOS X, and OpenBSD userspace. It's being actively developed[1] by the 9fans community. plan9port comes with both sam and acme[2] programmers' text editors. -- [0] https://9fans.github.io/plan9port/ [1] https://github.com/9fans/plan9port [2] https://youtu.be/dP1xVpMPn8M
In How I Switched to Plan 9
Badly discoverable? Sure. You can vastly improve the remembering part by picking appropriate mnemonics. The Plan 9 keyboard file is a nice start, I think. It follows a set of rules so you don't have to remember a large number of sequences but can often guess the right one intuitively. ASCII digraphs for mathematical operators give the corresponding operator, e.g., <= yields ≤. Greek letters are given by an asterisk followed by a corresponding latin letter, e.g., *d yields δ. https://github.com/9fans/plan9port/blob/master/lib/keyboard https://9fans.github.io/plan9port/man/man7/keyboard.html There's a program (mklatinkbd) to convert it to a format usable with X11.
In UnicodeMath – A Nearly Plain-Text Encoding of Mathematics (2016) [pdf]

Showing the 15 most recent of 23 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.