Concept

When consuming technology news and trends it can be tough to know what is a passing fad and what has staying power. A dragnet can be applied to see what has stood the test of time and is worth further/continued consideration.

A dragnet is any automated method of reviewing favorites, bookmarks, links, stars, saved articles, etc at high volume with a buffer of time/distance to control for hype.

Github Stars

Starting from my original guide for gathering github stars, I wanted to identify which repos I’ve starred over the past ten years which still deserve consideration today.

I have 1,895 starred Github repos as of 9/11/2021.

  • First star: Twitter Bootstrap on 8/5/2011
  • 1,605 (84.7%) were starred by me on or before 9/1/2020
  • 1,113 (58.7%) have mit (769), apache 2.0 (262), bsd-2 (23), bsd-3 (32), or isc (27) licenses
  • 790 (41.7%) have had push activity since 8/1/2021
  • 709 (37.4%) are classified as JavaScript repos

Example: JavaScript repos of note

See also: Node.js Total Cost of Ownership

Criteria

  • JavaScript as main repo language
  • Starred by me on or before 9/1/2020
  • Repo has been updated recently (between 8/1/2021 and 9/11/2021)
  • At least 1000 total stargazers
  • Friendly license type: MIT, Apache 2.0, BSD-2, BSD-3, ISC

109 Repos. Sorted by stargazer count descending.

Repo Stars
twbs/bootstrap 152844
trekhleb/javascript-algorithms 118512
airbnb/javascript 114125
d3/d3 98146
facebook/create-react-app 90168
ryanmcdermott/clean-code-javascript 56416
adam-p/markdown-here 53041
h5bp/html5-boilerplate 51458
Semantic-Org/Semantic-UI 49555
serverless/serverless 40725
nwjs/nw.js 38385
mermaid-js/mermaid 37606
iamkun/dayjs 36241
mozilla/pdf.js 36052
hexojs/hexo 33410
sahat/hackathon-starter 32247
anuraghazra/github-readme-stats 30308
lerna/lerna 29798
caolan/async 27287
date-fns/date-fns 26790
standard/standard 26043
sequelize/sequelize 24965
webtorrent/webtorrent 24626
GitbookIO/gitbook 23975
goabstract/Awesome-Design-Tools 23408
GoogleChrome/lighthouse 23371
balderdashy/sails 22029
LeCoupa/awesome-cheatsheets 21845
feathericons/feather 20629
jaredhanson/passport 19242
vercel/pkg 18733
jorgebucaran/hyperapp 18658
DIYgod/RSSHub 17243
mysqljs/mysql 16700
SBoudrias/Inquirer.js 14870
yaronn/blessed-contrib 14475
netlify/netlify-cms 14426
frappe/charts 13999
tailwindlabs/heroicons 13273
krisk/Fuse 13006
shelljs/shelljs 12687
localtunnel/localtunnel 12521
you-dont-need/You-Dont-Need-Momentjs 11804
moment/luxon 11561
ether/etherpad-lite 11448
webpack-contrib/webpack-bundle-analyzer 11250
nock/nock 10895
ccampbell/mousetrap 10818
vercel/micro 9889
NaturalNode/natural 9662
mongodb/node-mongodb-native 9148
yargs/yargs 9142
Netflix/pollyjs 9039
stylelint/stylelint 8989
mengshukeji/Luckysheet 8966
marmelab/gremlins.js 8613
klaussinani/signale 8514
exceljs/exceljs 8189
chaijs/chai 7356
es-shims/es5-shim 7040
google/lovefield 6662
expressjs/morgan 6649
leeoniya/uPlot 6571
isomorphic-git/isomorphic-git 5898
SocketCluster/socketcluster 5835
agershun/alasql 5633
substack/tape 5516
expressjs/session 5479
entropic-dev/entropic 5366
balderdashy/waterline 5307
lukeed/polka 4836
plotly/falcon 4805
istanbuljs/nyc 4763
release-it/release-it 4505
prose/prose 4479
socketio/engine.io 4300
vendia/serverless-express 4153
isaacs/node-lru-cache 3754
jsoma/tabletop 3718
sallar/github-contributions-chart 3705
vercel/ms 3614
manuelbieh/geolib 3596
grocy/grocy 3412
apple/password-manager-resources 3280
mifi/editly 2990
adaltas/node-csv 2979
axa-group/Parsr 2697
notion-enhancer/notion-enhancer 2686
posthtml/posthtml 2683
LeaVerou/bliss 2338
db-migrate/node-db-migrate 2103
pump-io/pump.io 2070
prometheus/pushgateway 1942
architect/architect 1780
ulid/javascript 1682
bbyars/mountebank 1643
ianstormtaylor/permit 1632
kantord/just-dashboard 1500
crcn/sift.js 1462
godaddy/terminus 1413
d3/d3-scale 1377
levelgraph/levelgraph 1339
nullivex/nodist 1327
motdotla/node-lambda 1290
scality/cloudserver 1247
moscajs/aedes 1151
datastax/nodejs-driver 1103
mermaidjs/mermaid.cli 1046
tristen/tablesort 1004

Methodology

You can do things like this with your own Github stars. Here is what I did to produce the list above.

for i in {1..40}      
do
  curl -H "Accept: application/vnd.github.v3.star+json" "https://api.github.com/users/tphummel/starred?page=$i" > "p$i.json"
done

rate limiting can cap what you can get in one shot when unauthenticated. You may need to authenticate or wait for the limit to expire.

for i in {41..65}      
do
  curl -H "Accept: application/vnd.github.v3.star+json" "https://api.github.com/users/tphummel/starred?page=$i" > "p$i.json"
done

combine files and filter the fields on each starred repo

cat p*.json \      
  | jq --slurp '. | flatten | .[]' \
  | jq --slurp '.[] | {name: .repo.full_name, url: .repo.html_url, lang: .repo.language, stars: .repo.stargazers_count, starred: .starred_at, license: .repo.license.key, updated: .repo.updated_at, pushed: .repo.pushed_at, archived: .repo.archived, disabled: .repo.disabled}' \
  | jq -n '[inputs]' > stars-captured.json

filter rows on criteria

cat stars-captured.json \
| jq -r '.[] | select((.stars >= 1000) and (.starred <= "2020-09-01") and (.pushed >= "2021-08-01") and (.archived == false) and (.lang == "JavaScript") and ((.license == "mit") or (.license == "apache-2.0") or (.license == "isc") or (.license == "bsd-2-clause") or (.license == "bsd-3-clause")))' \
| jq -n '[inputs]' \
| jq 'sort_by(-.stars)' \
| jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' \
> friendly-js-stars.csv

filter columns for display

cat friendly-js-stars.csv| q -H -d "," "select name, stars, url from - " > friendly-js-stars-trimmed.csv

Appendix

Why is the post not on data.tomhummel.com? The fact that I starred these repos is incidental. This is about surfacing trends, themes, and ideas.