Ask HN: How do I improve boring README page?

73 points by flymetothemoon ↗ HN
Hello HN, As one of the managers of apache/incubator-age repository, I'm trying to figure out ways I can do to improve the README section. I think I need more images that can show what kind of project we're dealing with, but I'm not sure if that's the main priority for this case. What do you all think this README page need? What does a good README page require?

76 comments

[ 2.8 ms ] story [ 142 ms ] thread
Personally I'd like to see a quick start guide e.g. [1] shows me the bare minimum code needed to get it to work. I'm not a fan of projects that simply use one-liners like `docker run [link]` because it tells me nothing about what I (a developer) will see in my potential future workflow.

It would also be nice to see a comparison (performance, ease of use, etc.) with other frameworks on why I should use it vs whatever else comes up on Google

[1] https://github.com/konvajs/konva#quick-look

I think README's purpose isn't to be entertaining. As such, I really don't see an issue with the linked README.
A suggestion: keep stuff boring.

When one is stuck on a problem, maybe with the deadline or angry boss axe pending on her head, last thing she needs is fancy stuff, emojis, gifa or having to sort through marketing crap (not your case but I've seen plenty of those in "fancy projects")

Look at manpages, emergency operation manuals, medical procedures and copy the style

Use the website for fancy stuff, it's what's its for

Personally the link you shared is perfect to me, at a glance

Ok, but maybe not manpages as a guideline.

I seldom find less helpful readme's than manpages. Technical correct, but hard too read with too many details and no simple straight forward example.

Well, I feel like maybe READMEs and manpages have two different goals in mind. READMEs often serve multiple purposes: be a introduction, small tutorial, demos and also reference. While manpages have only one goal, to provide a interface for browsing and reading system reference manuals. So yeah, they are dry, because that's the point. They are supposed to be used as references, not as introductions to a subject.
> They are supposed to be used as references, not as introductions to a subject.

Assuming 'man' is short for 'manual', this is exactly where man-pages go wrong.

Especially as a beginner; reading man-pages is a waste of time. It's so dense and obtuse that reading man-pages almost requires reading a man-page on reading man-pages.

For example try to figure out how to extract a zip using tar by using the man-pages.

Or simply how to find a file. I gave up and used the file explorer's search function, because I did not wanted to google it. Just a simple example of the most frequent use cases. Thats allmost all I want, together with a listing of the various flags and short, but useful description .
If you check at the end of the man page, you'll see that usually an info page is mentioned.

Have an online example which illustrates all possible file finding examples you could ever need: https://www.gnu.org/software/findutils/manual/html_mono/find...

Thx, but I successfully used find before and know how to google it. That was my point, googling it is much simpler and straightforward than the manpage if you forgot the syntax.
Indeed, problem is when you don't have internet because your infrastructure is gone and you're the sysadmin. And most importantly, use what you prefer
Complaining about the manpages for `find` is maybe the worst example you could make, since `find` has surprisingly many examples on its pages. Open the pages and search for `examples` and you'll see what I mean.
Sorry I meant locate.

But as for find ... are you serious? I said simple example.

There are lots of examples, yes, but all do quite complicated stuff (and I had to scroll lots of text to get there). I mean, I can use them, sure, I studied IT. But at that moment, I just wanted to look for one file on all my hd. Not find files with readpermission flag in combination with deleting etc.

Imagine a newb. Make things simple. That means you start with the easy things.

Like in the case of find, with an example, that looks on a given path for that string.

And if I know that, I can work myself up, if I want to.

But don't bombard people with information they do not need or want. And if people manage

Yeah, 100% serious. First example from manpages on `find`:

     Simple `find|xargs` approach

       Find files named core in or below the directory /tmp and delete them.

       $ find /tmp -name core -type f -print | xargs /bin/rm -f

Pretty simple to understand what's going on here. `-name` allows you to specify what filename you're searching for, `/tmp` (first argument) is the directory to search in and `-type` helps you select what kind of thing to search for. Remove the last part as you don't care about deleting anything.

It's really that simple. In fact, unsure how it even can get easier. Just because there are complex examples doesn't mean you can understand the snippets you need and ignore the rest.

And no, manpages are not for newbies who don't know how to A) read manuals B) have no idea about unix. They are for people who are looking for specific pieces of data related to a tool they are using, manpages are reference manuals and they will stay like that.

If you need tutorials/guides, there are plenty of other tools for that. I recently found out about the `info` program that does what you're looking for as well.

" I recently found out about the `info` program that does what you're looking for as well."

No, it does not. I am looking for simple straight forward information.

Info does also not provide that in the examples I tried.

There seems a culture problem. Some people like it complicated and as information dense as possible?

Well, I don't. I know how to read very deep technical information if I have to. But I prefer it simple and structured. So I only see the information I want and not all the obscure use cases too. That cost energy filtering it out. Energy I want to use to get things done.

And btw. I was once introduced to Linux with manpages as the way to go. No wonder linux never reached the masses.

How do you think me and a bunch of *nix beards learned how to survive without Wikipedia, stack overflow, nice IRC volounteers, or functioning search engines?

Btw, assuming you meant a gzipped tar, it's tar xvfz (mnemonic: XaVier FugaZi), I can remember from memory solely because of good old RTFM and no hand-holding.

Your mileage might vary, but to put it very frankly (and obtusely): if you can't be bothered to learn why should anyone help you, for free?

> Assuming 'man' is short for 'manual', this is exactly where man-pages go wrong.

Why? Manuals come in different levels, not all of them are tutorials/guides, some of them are references. We still call them manuals.

> For example try to figure out how to extract a zip using tar by using the man-pages.

I'm not sure if you're purposefully mixing tars/zips here, I'm gonna assume you mean a "tar-file" instead of "zip" as obviously tar can't unzip a zip file.

Not sure why you're having troubles finding the instructions compared to the thousands of people who managed to find it. Just to refresh my memory (although I know the commands by heart by now), I gave it a try.

1. `man tar`

3. Read through the synopsis, realize I need to specify the archive file with `-f`.

2. Synopsis didn't mention extract, so I search for `extract` as I know I want to extract a file

3. Now I have `tar xf $archive.tar` and I run that. Notice I would like to have some output.

4. Go back to manpages, search for "output" and find the "-v" flag

5. Final command I'm happy with is `tar xfv $archive.tar`

Is that really so difficult? Has the internet ruined peoples ability to search for information themselves and playing around?

tar(1) can extract zip files.

tar xf file.zip

Works perfectly

What tar are you running? I'm running `tar (GNU tar) 1.34` and get a `This does not look like a tar archive` error when trying to extract a zip file.
both

bsdtar 3.4.3 - libarchive 3.4.3 zlib/1.2.11 liblzma/5.2.5 bz2lib/1.0.8 libzstd/1.4.5

and

bsdtar 2.8.3 - libarchive 2.8.3

seem to do the job.

I don't use GNU based tools much so I'm unsure if you need special flags for them.

Manpages give you the precise info you need.

Info manuals (mentioned in most manpages, usually triggered by info <command>) are precisely what you're looking for.

For a project like this, I'm not sure that 'boring' is a bad thing. There's a link to documentation and relatively little fluff. In my game development repo's, I have an image, because it's reasonable to judge a game by it's visuals.

If diagrams (like those produced by draw.io) could be used to better communicate how incubator-age functions and why it is important, you could use them, but I don't think you need to.

An explanation of repo architecture could be useful for people wanting to hack on it. [1]

[1] https://matklad.github.io//2021/02/06/ARCHITECTURE.md.html

Edit: Just noticed the Documentation section doesn't link to the website. If I'm getting started with your project, the getting started documentation on your website will be far more useful to me than a very long PDF.

Please make sure the first sentence clearly explains what the project is in one sentence. You can expand on this later on.
May I kindly ask any developer, who sets up a webpage, to have at least a single paragraph of an introduction, what the software is supposed to do? Admittedly, it happens very seldom, but it does: Documentation, that goes straight to the usage, without any intro as what the software is.
Hey! I have around ~15k GitHub stars and am generally known for nice READMEs. My 3 biggest tips are: 1. Show what you do (better yet: let the user use your software) 2. Show how you're better than competitors (feature comparison) 3. Network effect (thanking contribs, people, other projects etc)

I wrote much more deeply about this on my blog: https://skerritt.blog/make-popular-open-source-projects/

Telling what concrete problem you solve already place you ahead of many Apache projects. "single storage that can handle both relational and graph model data". Some short example of usage would be nice too.

To illustrate, let's look at summaries of top popular projects (by number of commits, because that's what Apache shows on stats page):

> Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.

> Apache Flink® — Stateful Computations over Data Streams [here image of taking events and DB as inputs of process]

> Airflow is a platform created by the community to programmatically author, schedule and monitor workflows.

??? Why would i need them?

> Apache Spark™ is a unified analytics engine for large-scale data processing. > spark.read.json("logs.json").where("age > 21").select("name.first").show()

> Lucene Core is a Java library providing powerful indexing and search features, as well as spellchecking, hit highlighting and advanced analysis/tokenization capabilities.

These tell or show what they do. Good.

OP, if you’re using too many adverbs, you’re going the wrong way. The more words ending in -ly I see, higher the chances I’ll just leave the docs right there to find a YouTube tutorial by an Indian dude
This is also my stance. -ly words make me groan and roll my eyes because it feels like you're trying to sell me something instead of letting it sell itself.
Not directly answering your question, but something I'd appreciate in every readme:

- What problem is this repo solving / why would I use it (ideally explained in a way that a person who uses completely different tech stack could understand; this is a tough requirement though)

- What problems this repo does not solve and when I should not use it

- What are the alternatives and trade-offs

> What problems this repo does not solve and when I should not use it

Second this, really can help if you're navigating through a few possible alternatives

Some questions I have are

- what is this

- how do I pronounce the name (note there's a popular crypto tool called "age", which is "pronounced like the Japanese 上げ (with a hard g)")

- what are the alternatives (regular postgres, dgraph, neo4j, ...), and how do they compare, along whatever dimensions you like (performance, guarantees, scale, ease of use, license, ...)

- what are some use cases that are good for AGE vs the alternatives

- when do I not want to use this

- what does simple example usage look like

- what is the maintenance status, what does "(incubating)" mean, etc

But the github readme is a first-glance place, and once I've made it to the docs I might not go back to the readme. So the docs need to contain all that information.

> - how do I pronounce the name (note there's a popular crypto tool called "age", which is "pronounced like the Japanese 上げ (with a hard g)")

It's utterly ridiculous that a non-phonetic language won out (for now) the race to global lingua franca. Oh well, I guess we're stuck with it.

> pronounced like the Japanese 上げ (with a hard g)

When mentioning pronouncing in Japanese, I would think that it would be better to use entirely kana, rather than kanji or mixed kanji/kana. (When writing actual words/sentences, I think mixed kanji/kana is better, but for writing pronounciation, I think kana alone is better.) (Note: I don't know so well understanding Japanese, but I can pronounce words written with kana, at least.)

> But the github readme is a first-glance place, and once I've made it to the docs I might not go back to the readme. So the docs need to contain all that information.

At least some of the information, yes. Any information which is relevant to the use of the project should be mentioned in the documentation, including the license, although the documentation might not need to contain screenshots, a list of alternatives, etc.

To me a good README needs to:

- tell what the software does

- list its requirements

- explain how to set it up

It must do this only relying on local files.

The README of AGE meets some of these. The description could better. I'd open with: Apache AGE is an PostgreSQL extension that implements the openCypher property graph query language.

I would remove the latest happenings from the README and keep them on the project home page which I would have a link to right after the description.

I would also I would include the source of Apache_AGE_Guide.pdf in the repository. It is fine to have a link to the already formatted PDF should some one be viewing the README on a device where building the software isn't possible. But I would not want a user to download a snapshot or the repository and then discover that they have to have further internet access to get the documentation.

Put yourself in the shoes of your users. What does a random user visiting your repo want to know? In my case:

- What problem does the software solve, and - roughly - how?

- How does it look? If it has any visual component, even if it's a CLI interface that's meant for human consumption, screenshots are mandatory. Screenshots + videos/ASCIInemas preferable.

- If there are alternatives you know of, mention them - be honest about when an alternative is a better fit than your project.

- What platforms does it work on? What are the requirements?

- How do I install it? In exact steps, for most common workflows. If that gets too long, link to a separate page containing these detailed instructions.

- How do I run it? Examples of common use cases, with exact invocations/procedures to perform.

- Any relevant remarks that could prevent me from installing or using the software.

- Links to further docs, project webpage, communities, etc.

When I evaluate a project - even briefly, skimming the repo README - these are all the points I'm on the lookout for - they're all helpful for deciding whether to look closer at the project, and possibly install and use it.

Awesome list, thanks.

Also include the first bullet point (what it is, why and maybe how) in every blog post, landing page, release note, news article, etc. It is frustrating to see an HN article about Blahblah v2.7 with Blergity and not be able to figure out what the heck Blahblah is without clicking around a dozen times.

While I have you here, would you give a quick feedback on this: https://big-mama-tech.gitlab.io/bmc/

Do you understand what it does?

> bmc is a Python wrapper for MinIO’s command line interface mc and minio. MinIO has a useful client library which unfortunately lacks administrative capabilities, such as adding users and hosts, which we need to do for the iko machine learning platform.

No. But I also do not know what MinIO is, nor mc, minio or iko.

It also does not say why it is called bmc.

>No. But I also do not know what MinIO is, nor mc, minio or iko.

MinIO is an S3 compatible-ish object storage. `mc` and `minio` are command line interfaces to administer it and launch the server. The project has a Python library that invokes the server to manipulate buckets and objects for specific credentials, but lacks the administrative capabilities that `mc` has, such as adding "S3" policies and managing "users", and cannot launch servers as `minio` does. The library is a "thin wrapper" that makes it possible to manage policies and users with Python.

>It also does not say why it is called bmc.

What does IBM stand for? Nothing. It just sounds professional /s :) [0]

Joking aside, the library is to expose a Python API to a binary named `mc`. The `b` stands for BIGmama Technology. `bmc`

- [0]: https://www.youtube.com/watch?v=Lb0sDIuEf_A

No clue here either.

My takeway is that it's an extremely specialized piece of software, only of any use to people already familiar with whatever mc and minio are, who hopefully find that explanatory enough.

I think this sort of thing is okay if you're targeting very specialized uses. But it is almost definitely too obscure if a newcomer to the field could have an use for it, without yet knowing what tools are used in that specific area.

I see it's a specialized library. Since I don't do much Python and never worked with modern ML, it's not very illuminating to me. That's fine, as long as the page quickly makes people like me realize this project is not for them, but stays informative for the target audience.

Good job on putting a code sample early, and adding ASCIInema videos; these are somewhat illuminating even for a person like me, who doesn't know anything about the ecosystem.

Here's what I would improve:

- Fill in the "Introduction" page; right now it's empty.

- Put appropriate links under first mention of "MinIO", "mc" and "micro" - to make it that much easier for people to fill the missing context.

- Is that Python 2 or Python 3 library? Or it works on both? ASCIInema below suggests Python 3, but that's too far down. I'd put the number(s) in the first sentence anyway.

- Where do I get it from and how? What dependencies does it require?

Done. Clarified a few things without going into infinite regress. Pushed the commits, the docs should auto update after the CI/CD job terminates.

Thanks for the pointers again.

Looks pretty good, as others have mentioned it's highly specialised. Seems to be a wrapper for a cli tool named MinIO.

One thing to improve it would be to link the MinIO project at the beginning. A simple hyperlink in the intro will do!

These are all fantastic suggestions, but I have one more: do a 15 minute user study.

Find someone who might be interested in the project and offer to screenshare with them as they navigate the README and try to get things set up. Note: you just watch them go through this while they describe their thinking and take notes.

I've done similar things and it never ceases to surprise me the how big the gaps are in my view of the project vs someone fresh to it.

And if it is something which is mostly intended to be used in a different system or ecosystem say it.

Some time ago one of the big data serialization formats of the apache system was discussed. I didn‘t understand the benefit of it as it looked like all the other ones. But the hn comments had discussed the main benefit: it‘s an in-memory so the different (layered) big data frameworks can directly operate on it without permanent encoding/decoding for the next layer.

Amazing perspectives to consider. I will keep them in mind
(comment deleted)
Based on my extensive experience, the very best READ.ME and NFO files are distinguished by their elaborate ANSI art.

I would suggest leading with a full-size artwork incorporating skulls, dragons and gothic letters.

First impressions last. Make a good one.

I myself appreciate READMEs that tell simply what the project does with a couple of good examples and links to the full API description. I dislike pompous and overly embellished APIs as it makes it seem that the author(s) care more about looks than the content, so I wouldn't go overboard with images and badges and whatnot.

The fact is you can't satisfy all users or all use cases so making me, the developer, not waste any of my time trying to implement something that is not possible with the library makes me really appreciate it even though I may not end up using it.

Being boring isn't necessarily bad. It's just that under- or over-communicating is a delicate balance that has to adjusted based on the project and its scope.

About badges: Though I certainly don't advise anyone adding twenty silly badges to their README, seeing a pipeline status, code coverage (and depending on the language, the code style) makes me assume that the project cares about quality and have the know-how to ensure that the quality is measured.

If the project maintainers added a GitHub stars counter, then I assume they check their starts, and I'll consider staring their project (one sec and could make the maintainers 0.1% happier). In case I see a Twitter badge, then I'd follow them.

So I see the first group as a signal about what I need to know before I pull in a dependency, and the second group as something I can do to make the maintainers day.

What README works for what project is going to be highly specific to the project, but here are my suggestions:

* Provide a graphic, if possible, either of the software in use (if appropriate) or a logo of the project. Presenting people with a wall of text is off putting, so it's nice to break it up a bit with some pictures.

* Describe what the project is as succinctly as possible. If I can't figure out what the project is through a stream of buzzwords or vague descriptions and have to go to another source online to know what a project is, this is an abject failure of the README.

* Describe how to use it, either with a short example or a 'quick start' section. This should be the third or fourth section and should be how to actually use the software. The simpler the better.

* Give a brief description of the documentation and provide a link to more extensive documentation.

* Give a brief description of how to install it or contribute to it. This is most likely not going to be a portion of the README that will be most useful to people but for those that it will be, it provides a nice entry point

* Describe the license. This should be the last thing in the README but should be there to clearly mark this is a FOSS project (or not, if that's the case)

The README is there basically as a directory to the project. The things I initially look for are, in this order:

* What is this project (why am here/what is it good for/why should I care)?

* How do I install it?

* How do I use it, once installed (preferably with an example)?

* What is the license?

All the rest is about ushering the person looking at the project to the appropriate, more detailed, portion of the project, be it documentation, issues, usage, tutorials etc.

Also realize that, as a good approximation, there are roughly four types of documentation [0]. My view is that the README should clearly fall in the reference/information oriented section. It's meant to convey information about the project in the most succinct way possible and give pointers to other areas of the project if someone wants more details.

And, if possible, get feedback from people who actually use it.

EDIT: Sorry, I just wanted to add that it's OK to be boring. Excitement is not the purpose of a README. Utility is. It's more like "fundamental infrastructure" than "a fun document to read!" Leave the fun for the tutorials, how-to guides or other resources. The README is there to be the smallest payload for the maximum utility to convey useful information.

[0] https://documentation.divio.com/

A nice and helpful thing is to include links to related or similar projects.

Provides context and helps see a bigger picture or where a particular project stands.

I just need to know what this thing is and how to get it running. Be simple and direct.

1. What does this thing do?

2. How to install this thing.

3. Examples of using this thing along with output.

Don't go overboard with images. A logo, some screen shots or whatever is plenty. Avoid fluff like cute pictures, memes, image macros, emojis or anything that clutters up the readme file in a terminal.

READMEs shouldn't be "fun". They should be boring, simple, and concise. Just tell me what I need to know so I can get to it.
As someone who is not an expert, I find that read mes spend time on the wrong stuff. I don’t care about all the buzzwords of why your program is better, if I got to it, chances are that I already know I need it. What I want is to know what it does exactly, and briefly how I get there. However, don’t assume that everyone landing to this read me is already an expert in the field. Don’t assume I know all the pre requisites

My GF is a cell biology girl dipping her toes in bio informatics because she has to. She does read docs before asking, but the problem is that the docs she finds are for people who would already had figured out how to use the program on their own.

As some examples, she can’t start if:

Doesn’t know that the program has dependencies, and which ones those are.

Doesn’t know what the slang of the field is, keep it generic. “Just Bootstrap the gradle config to the mdl Sasquatch compiler” doesn’t mean anything to someone just landing to the page and just frustrates them because they feel like they are supposed to know stuff and don’t even know where to start.

The “quick start” guide can be short if existing, but show how someone would get to the same thing in their own project. What config files must be set up and how, for example.

I appreciate clear visual indicators for the main sections, such as

;;;;;;;;;;;;;;;;;;;

;;;;; HEADING ;;;;;

;;;;;;;;;;;;;;;;;;;

or: emoji + heading

plus a rare touch of ascii art for diagrams

EDIT all of the above does not work on HN