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?
Put yourself in the shoes of your users. What does a random user visiting your repo want to know? In my case:<p>- What problem does the software solve, and - roughly - how?<p>- How does it look? If it has <i>any</i> visual component, even if it's a CLI interface that's meant for human consumption, screenshots are mandatory. Screenshots + videos/ASCIInemas preferable.<p>- If there are alternatives you know of, mention them - be honest about when an alternative is a better fit than your project.<p>- What platforms does it work on? What are the requirements?<p>- 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.<p>- How do I run it? Examples of common use cases, with exact invocations/procedures to perform.<p>- Any relevant remarks that could prevent me from installing or using the software.<p>- Links to further docs, project webpage, communities, etc.<p>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.
A suggestion: keep stuff boring.<p>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")<p>Look at manpages, emergency operation manuals, medical procedures and copy the style<p>Use the website for fancy stuff, it's what's its for<p>Personally the link you shared is perfect to me, at a glance
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)<p>I wrote much more deeply about this on my blog:
<a href="https://skerritt.blog/make-popular-open-source-projects/" rel="nofollow">https://skerritt.blog/make-popular-open-source-projects/</a>
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.<p>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<p>[1] <a href="https://github.com/konvajs/konva#quick-look" rel="nofollow">https://github.com/konvajs/konva#quick-look</a>
“The distribution should contain a file named README with a general overview of the package:<p>the name of the package;<p>the version number of the package, or refer to where in the package the version can be found;<p>a general description of what the package does;<p>a reference to the file INSTALL, which should in turn contain an explanation of the installation procedure;<p>a brief explanation of any unusual top-level directories or files, or other hints for readers to find their way around the source;<p>a reference to the file which contains the copying conditions. The GNU GPL, if used, should be in a file called COPYING. If the GNU LGPL is used, it should be in a file called COPYING.LESSER.”<p>— GNU Coding Standards, <a href="https://www.gnu.org/prep/standards/standards.html#Releases" rel="nofollow">https://www.gnu.org/prep/standards/standards.html#Releases</a> (June 12, 2020)<p>“Good things to have in the README include:<p>1. A brief description of the project.<p>2. A pointer to the project website (if it has one)<p>3. Notes on the developer's build environment and potential portability problems.<p>4. A roadmap describing important files and subdirectories.<p>5. Either build/installation instructions or a pointer to a file containing same (usually INSTALL).<p>6. Either a maintainers/credits list or a pointer to a file containing same (usually CREDITS).<p>7. Either recent project news or a pointer to a file containing same (usually NEWS).”<p>— Software Release Practice HOWTO, <a href="https://tldp.org/HOWTO/Software-Release-Practice-HOWTO/distpractice.html#readme" rel="nofollow">https://tldp.org/HOWTO/Software-Release-Practice-HOWTO/distp...</a> (Revision 4.1)
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.<p>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.<p>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.
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.<p>To illustrate, let's look at summaries of top popular projects (by number of commits, because that's what Apache shows on stats page):<p>> Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.<p>> Apache Flink® — Stateful Computations over Data Streams [here image of taking events and DB as inputs of process]<p>> Airflow is a platform created by the community to programmatically author, schedule and monitor workflows.<p>??? Why would i need them?<p>> Apache Spark™ is a unified analytics engine for large-scale data processing.
> spark.read.json("logs.json").where("age > 21").select("name.first").show()<p>> Lucene Core is a Java library providing powerful indexing and search features, as well as spellchecking, hit highlighting and advanced analysis/tokenization capabilities.<p>These tell or show what they do. Good.
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<p>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.<p>As some examples, she can’t start if:<p>Doesn’t know that the program has dependencies, and which ones those are.<p>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.<p>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.
Not directly answering your question, but something I'd appreciate in every readme:<p>- 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)<p>- What problems this repo does <i>not</i> solve and when I should <i>not</i> use it<p>- What are the alternatives and trade-offs
<a href="https://github.com/apache/incubator-age" rel="nofollow">https://github.com/apache/incubator-age</a> is the repository in question.
This is a good resource when looking for inspiration <a href="https://github.com/matiassingers/awesome-readme" rel="nofollow">https://github.com/matiassingers/awesome-readme</a>
- Include a BRIEF (fits in one screen) visual demonstration of how it's useful. I could see myself using this but it's all bloatware unless I can actually see it in action.<p>- Include a quick getting started (installation instructions, etc.), even if it's meant for those already familiar with the extension ecosystem. Just a few commands. I don't want to install it via docker, hardly ever. I have my own dockerfiles for that.<p>- Bullet points in the beginning have a LOT of repetitive content (Apache AGE enables|supports|etc) that turns those really important bullet points into a wall of text.<p>- You have three different links to docs, one of which seems to be a duplicate. Why would I need docs? For cypher? I already know cypher. For development? What about if I want to hack on the source? Where are those docs? Quick links are always appreciated since I'm almost always going to be on a time budget evaluating things like this.<p>Just to name a few.
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.<p>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.<p>An explanation of repo architecture could be useful for people wanting to hack on it. [1]<p>[1] <a href="https://matklad.github.io//2021/02/06/ARCHITECTURE.md.html" rel="nofollow">https://matklad.github.io//2021/02/06/ARCHITECTURE.md.html</a><p>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.
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.
To me a good README needs to:<p>- tell what the software does<p>- list its requirements<p>- explain how to set it up<p>It must do this only relying on local files.<p>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.<p>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.<p>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.
Some questions I have are<p>- what is this<p>- 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)")<p>- 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, ...)<p>- what are some use cases that are good for AGE vs the alternatives<p>- when do I <i>not</i> want to use this<p>- what does simple example usage look like<p>- what is the maintenance status, what does "(incubating)" mean, etc<p>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.
If you're referencing this: <a href="https://github.com/apache/incubator-age" rel="nofollow">https://github.com/apache/incubator-age</a><p>Then I honestly think it's pretty good. Maybe two changes would be:<p>- Maybe embed one or two use comparisons of some search in plain SQL, and something using age to show what you can get. This both shows the wins, as well as shows people who already know cypher the general idea of how the languages two combine.<p>- As an incubating project, maybe talk a bit about roadmap. At what point will it no longer be incubating? What's the threshold? What are the risks of using an incubating project?
There is an unmaintained repo with some examples that might serve as inspiration:<p><a href="https://github.com/matiassingers/awesome-readme" rel="nofollow">https://github.com/matiassingers/awesome-readme</a>
I'll echo what several other people are said. Your README looks really good. I can immediately figure out what your project is about. You're putting supported Postgres releases front and center, which is good.<p>Some suggestions:<p>- One thing that obviously can be added are examples, but I wouldn't litter the whole README with examples. Maybe link to an examples page if you have one?<p>- When mentioning openCypher and AgensGraph, link to the respective project pages. I should not have to use a search engine to understand those references.
What's the one thing 99% of your users will want to do with your project? Put that front and center, with a clear example of what it looks like.<p>In your case, what kind of queries will I be able to make with this extension. For example, getting a list of neighborhoods, the houses in the neighborhoods and the pets in each household. All of that in a single graph query, what does it look like? Boom selling point.
A nice and helpful thing is to include links to related or similar projects.<p>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.<p>1. What does this thing do?<p>2. How to install this thing.<p>3. Examples of using this thing along with output.<p>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.
More explosions? But really, once you explain what the project or thing is about, is it actually boring? Some of the best projects have "boring" READMEs that explain or point to various documents. This is NOT a failure. If they are useful etc are they really boring?<p>Or are you bored? Maybe that is the real issue?
Add completely unrelated emojis on every line like all the cool JS projects on Github. /s<p>But for real, nothing wrong with boring READMEs, as long as they do a good job of explaining the important things using relatively simple language. Images, videos, and demos are always a good idea too, provided they are relevant.
For my project (<a href="https://github.com/nicolaskruchten/pivottable" rel="nofollow">https://github.com/nicolaskruchten/pivottable</a>) I adopted a simple Q&A approach: What does it do? Why is it good? How do I use it? ... folks seem to like it :)
I think your README currently is fine. Maybe adding a comparison to other graph databases could be a good idea? Also, a few examples without having to open the PDF documentation would be nice.
I remember being really drawn in when README was showing the effect of software on animation embedded within the first two pages of github's readme section.
What README works for what project is going to be highly specific to the project, but here are my suggestions:<p>* 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.<p>* 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.<p>* 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.<p>* Give a brief description of the documentation and provide a link to more extensive documentation.<p>* 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<p>* 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)<p>The README is there basically as a directory to the project. The things I initially look for are, in this order:<p>* What is this project (why am here/what is it good for/why should I care)?<p>* How do I install it?<p>* How do I use it, once installed (preferably with an example)?<p>* What is the license?<p>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.<p>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.<p>And, if possible, get feedback from people who actually use it.<p>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.<p>[0] <a href="https://documentation.divio.com/" rel="nofollow">https://documentation.divio.com/</a>
I appreciate clear visual indicators for the main sections, such as<p>;;;;;;;;;;;;;;;;;;;<p>;;;;; HEADING ;;;;;<p>;;;;;;;;;;;;;;;;;;;<p>or: emoji + heading<p>plus a rare touch of ascii art for diagrams<p>EDIT all of the above does not work on HN
wanna just share the README and we can give some feedback?<p>i wouldn't care about it being boring but one thing I dislike about a lot of technical documents is I feel like there's always a simple way to translate it into simpler english.
Speak directly to, not over, the audience. Like, as if you're teaching a friend how to use what you built.<p>Throw in some humor. Avoid any unnecessary hoidy-toidy or pretentious language.
Based on my extensive experience, the very best READ.ME and NFO files are distinguished by their elaborate ANSI art.<p>I would suggest leading with a full-size artwork incorporating skulls, dragons and gothic letters.<p>First impressions last. Make a good one.