⭐ Building cool software projects
How to make good programming (specially open source) projects?
I don't claim to be an expert, but I think I have accumulated a fair amound of experience.
Here I collect best practices, or at least the ones I liked.
Table of Contents
- related project
- [A] * clearly state the purpose project
- project joeyates/imap-backup: Backup GMail (or other IMAP) accounts to disk
- [A] * compare with similar projects project
- [B] * demos projectdemo
- TODO [A] VisiData in 60 Seconds | Hacker News projectdemo
- STRT [B] Getting started — Datasette documentation projectdemo
- [B] Using SQL to find my best photo of a pelican according to Apple Photos | Hacker News projectdemohpipublish
- [B] 'Example interaction' section projectdemo
- [B] ngrok - secure introspectable tunnels to localhost projectdemo
- STRT [B] Demos are important! projectdemo
- [C] cybersemics/em: 🖋A multi-hierarchical mind-mapping app for personal sensemaking. projectdemoselfhosted
- [B] * configuration projectconfigs
- [B] * documentation projectdocumentation
- [B] * collaborating project
- [C] * screencasting projectscreencast
- TODO [B] GitHub - asciinema/asciinema: Terminal session recorder 📹 /r/coolgithubprojects projectscreencastcli
- [B] screenkey program to display keypresses projectscreencast
- [C] Capture/Desktop – FFmpeg projectscreencast
- [C] Weekly /r/Orgmode Open Discussion - October 11, 2019 /r/orgmode – gif screencasting tool projectscreencastemacs
- [C] gif-screencast 1.1 is out /r/emacs projectscreencastemacs
- [C] Terminal Recorders: A Comprehensive Guide projectscreencastcli
- [C] phw/peek: Simple animated GIF screen recorder with an easy to use interface projectscreencast
- TODO [D] Input Overlay | OBS Forums https://obsproject.com/forum/resources/input-overlay.552/ projectscreencastdemo
- [D] recordmyscreen projectscreencast
- [C] * landing page project
- [C] * licensing projectlicense
- [C] * naming project
- [D] * versioning project
- ---------------------------------- project
- STRT [B] How do you stay inline with your vision on long term projects? | Lobsters project
- STRT [C] Ask HN: How do you come up with new project ideas? | Hacker News project
- project "A vague mental checklist I've been accumulating"
- TODO [C] share donation links in readme between my projects project
- [D] tools that only take stdin/stdout are a bit horrible to debug (no io to gdb) projectdebugcli
- ---------------------------------- project
- TODO [C] Open source projects should run office hours | Hacker News projectprojects
- TODO [B] Thomas Strömberg on Twitter: "An uncomfortable truth that open-source projects struggle with:👇 Improvements to your onboarding docs generate 10X the ROI vs improvements to your codebase 🔖 Great documentation creates a virtuous cycle of adoption, contributor diversity, and success.♻️" / Twitter projectprojects
¶[A] * clearly state the purpose project
¶ joeyates/imap-backup: Backup GMail (or other IMAP) accounts to disk project
Design Goals
it's good to state design goals
¶[A] * compare with similar projects project
Often there are multiple projects that do the same thing, and it's nice to know why you should prefer one over another.
¶[B] provide comparison with other similar projects project
https://fastapi.tiangolo.com/alternatives
Alternatives, Inspiration and Comparisons - FastAPI
very cool comparison page, I really like it
¶[B] * demos projectdemo
- it's nice if you can provide a web-based demo that doesn't require any installation.
- perhaps the next worst thing is something like a Docker container – you can safely try it knowing you won't mess up your OS
It also basically means 'reproducible build', and easer testing.
¶TODO [A] VisiData in 60 Seconds | Hacker News projectdemo
Wow, the project homepage has a great dynamic command-line generator that lets you specify what you are trying to do. This may exist elsewhere, but it's the first time I've seen it and I hope to see it on more projects! https://www.visidata.org/
¶STRT [B] Getting started — Datasette documentation projectdemo
Try Datasette without installing anything using Glitch Glitch is a free online tool for building web apps directly from your web browser. You can use Glitch to try out Datasette without needing to install any software on your own computer.
¶TODO [C] do for HPI projectdemohpi
¶[B] Using SQL to find my best photo of a pelican according to Apple Photos | Hacker News projectdemohpipublish
apparently people like specific demos
¶[B] 'Example interaction' section projectdemo
- like here Comparison to Other Tools - pipx
Example interaction: Install pipx with pip: pip install --user pipx
¶[B] ngrok - secure introspectable tunnels to localhost projectdemo
¶STRT [B] Demos are important! projectdemo
Link to the actual repo: https://github.com/hellojoshuatonga/react-use-fuzzy As others said, I recommend adding a GitHub pages of a demo or something. Not fun having to spin this up yourself to test what it does/looks like.
¶[C] cybersemics/em: 🖋A multi-hierarchical mind-mapping app for personal sensemaking. projectdemoselfhosted
Localhost can be tunneled to a public url for mobile testing purposes using ngrok.
need to figure out how to quickly selfhost stuff
¶[B] * configuration projectconfigs
¶[A] try to use as many reasonable defaults as possible projectconfigssoftware
Seems that people hate complicated configuration
- $HOME for configs/paths/cache (e.g. XDG-compliant, something like
appdirs
)
¶[B] "configs suck" think how malleable your config needs to be projectconfigs
¶[C] Database Configuration | InfluxData Documentation Archive projectconfigs
[admin] Controls the availability of the built-in, web-based admin interface. Note: The Admin UI is deprecated as of InfluxDB 1.2. enabled = false Set to true to enable the admin interface. Environment variable: INFLUXDB_ADMIN_ENABLED
I guess it's a good pattern?
e.g. split env variable by _ and bind to code
¶[C] JupyterLab projectconfigsui
good setting design with system defaults (readonly) and user preferences on the side
¶[B] * documentation projectdocumentation
Documentation is frustrating because it usually requires you to document what you already know, it's usually also duplicates tests, docstrings etc.
¶[B] related: literate programming projectdocumentationliterate
¶[C] High-level overview (Mu4e 1.4 user manual) projectdocumentationsoftware
+---------+ | emacs | | +------+ +----| mu4e | --> send mail (smtpmail) +------+ | A V | ---/ search, view, move mail +---------+ \ | mu | +---------+ | A V | +---------+ | Maildir | <--- receive mail (fetchmail, +---------+ offlineimap, ...)
characters (e.g. A, V) can be used for drawing
¶[C] inspiration: Create Agent - Huginn projectdocumentation
Huginn is nice, when you try to create 'agent' it shows the documentation/examples aside
¶[B] * collaborating project
How to make the project more welcome to contributions?
¶[C] * screencasting projectscreencast
I found screencasting to be pretty finicky.
Especially when you want to automate things, e.g. like I did with short demos for promnesia.
(see demos.py – it's extremely hacky and not sure how to make it generic)
¶TODO [B] GitHub - asciinema/asciinema: Terminal session recorder 📹 /r/coolgithubprojects projectscreencastcli
¶[B] screenkey program to display keypresses projectscreencast
¶[C] Capture/Desktop – FFmpeg projectscreencast
¶[C] Weekly /r/Orgmode Open Discussion - October 11, 2019 /r/orgmode – gif screencasting tool projectscreencastemacs
That looks really cool. Note that many users don't know what CFEngine is, so you might want to mention that (then again, maybe users who don't already know what it is don't matter, haha). Your demo GIF is pretty cool. You might find this interesting: after recording and tidying up demo GIFs for `helm-org-ql` several times, I wrote a shell script to make it easier. Using the `gif-screencast` package for Emacs, all I have to do is run the script, make the Emacs window active, and it does the rest.
https://github.com/alphapapa/org-ql/blob/master/images/demo-helm-org-ql.sh
¶[C] gif-screencast 1.1 is out /r/emacs projectscreencastemacs
I'm happy to announce the release gif-screencast 1.1! https://gitlab.com/ambrevar/emacs-gif-screencast It isn't much, but I know that gif-screencast has had annoying issues for a while, I figured I'd rather let the community know! - Fix off-by-one error in frame delay (thanks to /u/alphapapa for this one!) - Remove "Press ... to stop" message from resulting GIF. - New `gif-screencast-start-or-stop` command. - Log the complete command lines of all invokes commands.
¶[C] Terminal Recorders: A Comprehensive Guide projectscreencastcli
¶[C] phw/peek: Simple animated GIF screen recorder with an easy to use interface projectscreencast
Peek does not support this natively. But you could install an external tool like key-mon which is usually included in most distributions, so you can easily install with your package manager. Then start key-mon with key-mon --visible_click. The --visible_click option is for drawing small circles around mouse clicks.
- you can continue/pause recording from the console
- you can't set window id/adjust (granted, you can do it externally via xdotool which is arguably more modular)
- you can't set recording format/path from the console (and even save the video?)
that made it useless for my purposes
looked at peek for demo automation, and it doesn't quite do the trick- you can continue/pause recording from the console
¶TODO [D] Input Overlay | OBS Forums https://obsproject.com/forum/resources/input-overlay.552/ projectscreencastdemo
A small plugin for obs studio that shows keyboard, mouse and gamepad inputs on stream. Supports Windows and Linux (64bit, if you need 32bit either compile it yourself or message me)
¶[D] recordmyscreen projectscreencast
I think it dumps broken ogv file. There is some jerkiness.
When you convert it to something else with ffmpeg, it's complaining about broken frames and sometimes even segfaults
also it hasn't been updated for a decade, apparently
¶[C] * landing page project
Often "langing pages" for startups are bloated and very infromation sparse.
For open source projects it's usually better though (especially considering readme is usually enough!).
Here I'll collect the ones I liked.
¶[C] * licensing projectlicense
¶[B] Choosing a license for GoatCounter projectlicense
GPL (any version) Bad: doesn’t have the “network protection”: you don’t need to submit changes back to me if you modify the code and run it only as a SaaS.
¶TODO [C] Licenses – opensource.google.com projectlicense
GNU GPL v1, v2, v3
¶TODO [C] Licenses – opensource.google.com projectlicense
The following steps are required in order to be able to take advantage of the reduced requirements: The LGPL-licensed library must be used as a shared library (dynamically-linked). For LGPL v3 only, the user must be able to replace the shared library with a compatible library and have it work (the user must be able to swap out libraries on the device). Customers must receive either object files or source code (including any modifications) of the LGPL-licensed library.
¶[C] projectlicense
¶[C] Create LICENSE by MitchTalmadge · Pull Request #10 · kootenpv/gittyleaks projectlicense
If you are the copyright holder, it's up to you how you license your work —I think the only catch is that you can't retrospectively revoke open-source licenses for previous versions, but I think you could easily publish an updated version with a different license, or even license with two different licenses if you wanted to. Also, if others have previously contributed to the project whilst it was under a given license, you will need their permission to relicense it, unless you have a copyright-grant agreement with them (such that they assign copyright to their contributions to you).
¶[C] * naming project
It's annoying to have to come up with name when the project is ready and you are keen to release it.
- my personal strategy is thinking and having short brainstoming sessions now and then and writing down ideas
Then after some time I just pick the one I like most. - use thesaurus to find synonyms
- make sure it's unique enough, search for existing projects with the same name
¶[C] Find words containing these letters in sequence project
¶[C] Open source project name checker - OSPNC project
¶[D] * versioning project
¶[B] for end user software (i.e. not 'libraries'), calendar versioning is more useful than semantic project
¶[B] ok, definitely should keep changelog in the repository file (and then link to headings), instead of github native interface project
The reason is to avoid siloing the changelog on Github. It's fine to also copy it on "Releases" page as well, but make the CHANGELOG.md (or any other plaintext file) the primary source of truth.
¶---------------------------------- project
¶STRT [C] Ask HN: How do you come up with new project ideas? | Hacker News project
¶ "A vague mental checklist I've been accumulating" project
- Why didn't I stick with my last idea?
- Could I make that idea simpler?
- Could I reuse that idea elsewhere?
- Why am I not motivated to work on this idea (any more)?
- Could I change it around so that I am?
- What are people looking for?
- What are people NOT looking for?
- What ideas are already floating out there, that haven't been popularized, but could be done better?
- What ideas are getting too much hype and attention, so that I can filter them out?
- Is my idea trivial enough not to scare me?
¶TODO [C] share donation links in readme between my projects project
I don't need money myself, but would be nice to 'reroute' donations to the libraries I use, or tool that lets me build the projects.
¶[D] tools that only take stdin/stdout are a bit horrible to debug (no io to gdb) projectdebugcli
¶---------------------------------- project
¶TODO [C] Open source projects should run office hours | Hacker News projectprojects
¶TODO [B] Thomas Strömberg on Twitter: "An uncomfortable truth that open-source projects struggle with:👇 Improvements to your onboarding docs generate 10X the ROI vs improvements to your codebase 🔖 Great documentation creates a virtuous cycle of adoption, contributor diversity, and success.♻️" / Twitter projectprojects
An uncomfortable truth that open-source projects struggle with: Improvements to your onboarding docs generate 10X the ROI vs improvements to your codebase Great documentation creates a virtuous cycle of adoption, contributor diversity, and success.